Wednesday, December 9, 2015

GStreamer でプログラミング 4 (Bin と Iterator)

もし本当に GStreamer の pipeline に入っているエレメントの名前が分らなかったら?

pipeline は自分が持っているエレメントを知っています。なので、pipeline に問い合わせて、持っているエレメントをイテレーターで貰うことができます。これ、pipeline の親クラスである GstBin の機能なんです。

Ruby のように Internal Iterator (内部イテレータ)かつ、Dynamic Typing (動的型付け) であれば

と書けるのですが、C で実装されている GStreamer では、ちょっと面倒ですね。

  1. Pipelineから外部イテレータを貰い ( gst_bin_iterate_elements() )
  2. 次のエレメントをイテレーターから貰います。( gst_iterator_next() )
  3. 貰ったエレメントは、実は GValue という「なんでも内包できる構造体」なので、これから実際のエレメントを取り出します。 ( g_value_get_object() )

gst_iterator_foreach() もあるのですが Lambda が使えない C では、関数を指定する必要があります。

GValue は、なんでも入れることができるという点で、「void*」のようなものですが、型情報を持っている点が異なります。型が必須なので必ず使う前に G_VALUE_INIT または g_value_init() で初期化してください。

GValue や GstElement は、Dynamic Typing を持っていない C のために実装された Glib Dynamic Type System を使っています。 GObject が基本クラスです。Ruby C API で言うところの、 VALUE ですね。

他のエレメントを内包できるエレメントは、イテレーターが使えることが多いので、一度やり方を覚えると便利です。お試しあれ。

No comments:

Post a Comment