Streaming thread をトリガーとして pipeline を操作(再生/停止などを)したい場合は、 Message を使って Application thread へ伝え、Application thread から pipeline を操作するのがベター
GST_MESSAGE_ELEMENT
を使った場合の実装がこのコードです。
ちなみに、Streaming thread から gst_element_set_state()
や
gst_element_seek()
などの pipeline を操作する関数を呼ぶとデッドロックが発生します。
pipeline に対する操作は、基本的に Application thread から行なうべき。
キレイな実装ではないですが、同様のことは signal を使っても実装可能です。
[Application thread]
|
| application <----- kill(SIGUSR1) ---+
| | |
| v |
| signal_handler () |
| | |
| | gst_element_seek () |
| | |
`------------------------- | ----------------------------- | --------
[Streaming thread] | |
| v |
| Pipeline |
| `- filesrc ! filter ! fakesink |
| | |
| v |
| fakesink_handoff ()
|
`--------------------------------------------------------------------