もし本当に GStreamer の pipeline に入っているエレメントの名前が分らなかったら?
pipeline は自分が持っているエレメントを知っています。なので、pipeline に問い合わせて、持っているエレメントをイテレーターで貰うことができます。これ、pipeline の親クラスである GstBin
の機能なんです。
Ruby のように Internal Iterator (内部イテレータ)かつ、Dynamic Typing (動的型付け) であれば
と書けるのですが、C で実装されている GStreamer では、ちょっと面倒ですね。
- Pipelineから外部イテレータを貰い (
gst_bin_iterate_elements()
) - 次のエレメントをイテレーターから貰います。(
gst_iterator_next()
) - 貰ったエレメントは、実は 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