5.5. エレメントのリンク

ソースエレメントを 0 個以上のフィルタライクなエレメントとリンクし、最後に 1 つのシンクエレメントをリンクすると、メディアパイプラインがセットアップされます。データはこれらのエレメントに沿って流れることになります。これが GStreamer におけるメディア処理の基本コンセプトです。

図 5-5. リンクされた 3 つのエレメント

上の図では、3 つのエレメントをリンクすることにより、非常にシンプルなエレメントのチェインを作成しています。このチェインでは、ソースエレメント ("element1") の出力が、フィルタライクなエレメント ("element2") の入力として使われ、フィルタライクなエレメントはデータに何らかの加工をほどこして、その結果を最後のシンクエレメント ("element3") に送ります。

上の図をシンプルな Ogg/Vorbis オーディオデコーダとして考えてみましょう。ソースはディスクソースで、これはディスクからファイルを読み取ります。2 番目のエレメントは、Ogg/Vorbis オーディオデコーダです。シンクエレメントはサウンドカードで、これはデコードされたオーディオデータを再生します。このマニュアルのあとの方では、このシンプルな図をもとに実際に Ogg/Vorbis プレーヤーを作成します。

上の図をコードで記述すると、次のようになります。


#include <gst/gst.h>

int
main (int   argc,
      char *argv[])
{
  GstElement *pipeline;
  GstElement *source, *filter, *sink;

  /* init */
  gst_init (&argc, &argv);

  /* create pipeline */
  pipeline = gst_pipeline_new ("my-pipeline");

  /* create elements */
  source = gst_element_factory_make ("fakesrc", "source");
  filter = gst_element_factory_make ("identity", "filter");
  sink = gst_element_factory_make ("fakesink", "sink");

  /* must add elements to pipeline before linking them */
  gst_bin_add_many (GST_BIN (pipeline), source, filter, sink, NULL);

  /* link */
  if (!gst_element_link_many (source, filter, sink, NULL)) {
    g_warning ("Failed to link elements!");
  }

[..]

}
    

もっと細かく動作を指定するための関数として、gst_element_link ()gst_element_link_pads () もあります。また、gst_pad_link_* () 関数群を使って、個々のパッドへの参照を取得したり、パッドをリンクしたりすることもできます。詳細については、API リファレンスを参照してください。

重要: エレメントをリンクするには、その前にエレメントをビンまたはパイプラインに追加しておく必要があります。なぜなら、エレメントをビンに追加すると、それまでに存在していたリンクはすべて切断されるからです。また、同一のビンまたはパイプラインに含まれていないエレメントを直接リンクすることはできません。所属する階層レベルが異なるエレメントまたはパッドをリンクするには、ゴーストパッドを使用する必要があります (ゴーストパッドについては、あとで詳しく取り上げます)。