エレメントは、作成された後も、実際にはまだ何も処理を行いません。エレメントに何か処理をさせるには、エレメントの状態を変更する必要があります。GStreamer によって認識されるエレメントの状態は 4 つあり、それぞれの特定の意味を持っています。具体的には、次の 4 つの状態があります。
GST_STATE_NULL: デフォルトの状態です。この状態では、エレメントによって保持されているすべてのリソースの割り当てが解除されます。
GST_STATE_READY: 準備完了状態です。この状態では、エレメントはグローバルリソース、すなわちストリーム内に保持できるリソースのすべての割り当てを終えています。デバイスのオープン、バッファの割り当てなどが済んだ状態と考えるとよいでしょう。ただし、この状態ではまだストリームはオープンされておらず、ストリームの位置は自動的にゼロになります。以前にストリームがすでにオープンされていた場合、この状態ではストリームをクローズし、ストリームの位置、プロパティなどをリセットする必要があります。
GST_STATE_PAUSED: 一時停止状態です。この状態では、エレメントはストリームをすでにオープンしていますが、ストリームのアクティブな処理は行っていません。エレメントはストリームの位置の変更、データの読み取りや処理などを行って、状態が再生中 (PLAYING) に変わると同時に再生を開始するための準備を行うことができますが、クロックを動作させることになるデータの再生を行うことは許可されていません。簡単に言えば、一時停止 (PAUSED) は、クロックが動作していない点を除いて、再生中 (PLAYING) と同じです。
一時停止 (PAUSED) 状態に移行するエレメントは、可能な限り速やかに再生中 (PLAYING) 状態に移行できるように準備しておく必要があります。たとえば、動画出力や音声出力では、データの到着を待ってこれをキューに入れ、状態が変更されると同時に再生できるようにします。また、動画シンクでは最初のフレームを再生することができます (最初のフレームを再生してもクロックには影響しないためです)。オートプラッガでは、この状態移行を利用して、パイプラインをつなぐ作業に入ることもできます。ただし、コーデックやフィルタなどのその他のほとんどのエレメントは、この状態で何かを明示的に行う必要はありません。
GST_STATE_PLAYING: 再生中状態です。この状態では、エレメントは一時停止 (PAUSED) 状態とまったく同じ処理を行いますが、今度はクロックが動作する点が異なります。
エレメントの状態は、関数 gst_element_set_state () を使って変更できます。エレメントを別の状態にすると、GStreamer は内部的にその間のすべての状態を経由することになります。たとえば、あるエレメントを NULL から再生中 (PLAYING) にすると、GStreamer はその間、該当するエレメントを内部的に準備完了 (READY) 状態と一時停止 (PAUSED) 状態を経由させた後、再生中 (PLAYING) 状態に移行させます。
GST_STATE_PLAYING に移行すると、パイプラインはデータを自動的に処理します。パイプラインを何らかの形で繰り返す必要はありません。内部的には、GStreamer はこのタスクを任せるためのスレッドを開始します。また、GStreamer は、GstBus を使って、パイプラインのスレッドからのメッセージをアプリケーションの独自のスレッドに振り分ける処理も行います。詳細については、第7章を参照してください。