この章では、アプリケーションを手っ取り早く簡単に GStreamer-0.8 から GStreamer-0.10 に移植するには、アプリケーションにどんな変更を加える必要があるかについて簡単に説明します。必要な場合には、このアプリケーション開発マニュアルの該当箇所も示します。ここで示すリストを使えば、シンプルなアプリケーションなら、GStreamer-0.10 に移植するのに 1 日もかからないはずです。
オブジェクトまたはオブジェクトのプロパティを返すほとんどの関数は、該当するオブジェクトそれ自体が所有するものの constant な参照ではなく、関数独自の参照を返すよう変更されています。これは、まず第一にスレッドセーフにするためです。この変更による具体的な影響は、gst_element_get_pad ()、gst_pad_get_name ()、およびこれらに類似した多くの関数の戻り値については、これを解放するか、使用後に参照を解除する必要があるということです。戻り値を解放する必要があるかどうかを知るには、個々の関数の API リファレンスをチェックしてください。GstObject から派生したすべてのオブジェクトの参照および参照の解除は、(g_object_ref/unref ではなく) それぞれ gst_object_ref() と gst_object_unref() を使って行うことが重要です。
アプリケーションでは、エラー、ストリームの最後、およびその他同種のパイプラインイベントの通知を受けるために、シグナルハンドラを使う方法は推奨されなくなりました。代わりに、GstBus を使う必要があります (第7章で説明しています)。メインループのコンテキストの中でメッセージが配信されるようにするのがバスの役割です (メインループはほぼ確実にアプリケーションのメインスレッドです)。この方法の大きな利点は、アプリケーション側ではスレッド対応である必要がなくなる点です。アプリケーションは、シグナルハンドラの中で g_idle_add () を使用し、アイドルコールバックの中で実際の処理を行うといった操作を行う必要はありません。これらのことはすべて、GStreamer が内部的に処理するようになりました。
これと関連して、gst_bin_iterate () は削除されました。パイプラインは独自のスレッドで繰り返し実行されるので、アプリケーションでは GMainLoop を実行するだけです (または、gtk_main () など、アプリケーションの UI ツールキットのメインループを呼び出すだけです)。
状態変更は遅らせることができます (ASYNC)。GStreamer-0.10 は新しく完全にスレッド化されているため、状態の変更が必ずしも直ちに行われず、特に準備完了 (READY) 状態から一時停止 (PAUSED) 状態への移行を含む状態変更の場合には、その可能性が高くなります。アプリケーションの移植の観点から言うと、このことは 2 つのことを意味します。まず最初に、gst_element_set_state () を実行して、戻り値が GST_STATE_CHANGE_SUCCESS であることをチェックすることが、必ずしも可能ではなくなりました。これは、状態変更を遅らせている (ASYNC) 場合があり、その場合には関数の実行結果はもっとあとにならないとわからないからです。ただし、GST_STATE_CHANGE_FAILURE のチェックは有効です。SUCCESS ではないすべてのものが失敗であると仮定することができなくなっただけです。次に、状態変更が直ちに行われないことがあるため、コードではこの点を考慮する必要があります。gst_element_get_state () でタイムアウト間隔に GST_CLOCK_TIME_NONE を使うと、状態変更の完了まで待機することができます。
0.8 では、イベントと問い合わせは、(playbin を使う場合は別として) パイプライン内のシンクに手動で送信する必要がありました。0.10 では、その必要はありません。0.10 では、問い合わせとイベントは、トップレベルのパイプラインに送信することができ、あとはパイプラインがプログラマに代わって内部的にディスパッチを行います。これは、アプリケーションでいろいろと補佐しなければならない作業が減ることを意味します。簡単なサンプルコードについては、第11章を参照してください。これと関連して、シークはスレッドセーフになっています。動画出力は、新しい動画位置のフレームを表示しながら、そのかたわらでシークすることができ、ユーザーの操作感の向上に貢献しています。
GstThread オブジェクトは削除されました。アプリケーションでは、パイプラインに複数のエレメントを入れるだけで済み、必要ならバッファリングのためにエレメント間にいくつか "キュー" エレメントを挿入してもかまいません。スレッドの作成は GStreamer が内部的に処理します。"キュー" エレメントを使えば、パイプラインのいろいろな部分をほかの部分とは別のスレッドで実行させることもできます。詳細については、第16章を参照してください。
フィルタリングされたケイパビリティ -> capsfilter エレメント (ただし、gst-launch のパイプライン構文に変更はありません)。
libgstgconf-0.10.la は存在しません。代わりに "gconfvideosink" エレメントと "gconfaudiosink" エレメントを使ってください。これらのエレメントはライブアップデートを行い、ライブラリのリンクは必要ありません。
GstElement 上の "new-pad" シグナルと "state-change" シグナルは、"pad-added" と "state-changed" に名前が変わりました。
gst_init_get_popt_table () が削除され、代わりに GLib 2.6 に追加された新しい GOption コマンドラインオプション API を使うことになりました。gst_init_get_ptop_table () に相当する GOption ベースの関数は、gst_init_get_option_group () です。