2013. 7. 26. 13:52ㆍMultiMedia Framework/GStreamer
Bus는 현재의 thread context 내에서 pipeline thread에서 application으로 메시지를 전송할 때 쓰이는 단순한 시스템이다.
bus의 이점은 application이 GStreamer를 사용하기 위해 현재 동작하고 있는 Thread에 대해 전혀 알 필요가 없다는 것이다.
모든 pipeline이 기본적으로 bus를 포함하고 있으며, application은 bus를 따로 생성할 필요가 없다. application은 오직 message handler만 설정하면 된다.
mainloop가 돌 때 bus는 주기적으로 새로운 메시지를 체크하고, 메시지가 이용가능하다고 판단되면 callback을 호출한다.
Bus를 사용하여 메시지를 가져오는 방법에는 두 가지가 있다.
첫 번째는 GLib main loop를 실행시킨 후, main loop에서 bus에 새로운 메시지가 있는지를 감시하는 방법이다.
이 방법에는 gst_bus_add_watch() 나 gst_bus_add_signal_watch() 함수가 사용된다.
gst_bus_add_watch() 함수는 pipeline의 bus에 메시지 핸들러를 첨부시키는 함수이다. bus에 메시지가 들어올 때마다 이 핸들러가 호출된다.
핸들러가 유지되기 위해서는 핸들러의 리턴은 TRUE가 되어야 하고, 리턴이 FALSE면 핸들러가 제거된다.
두 번째는 버스 자기 자신이 메시지를 체크하는 것이다.
gst_bus_peek() 나 gst_bus_poll() 함수를 사용한다.
위에서와 같이 gst_bus_add_watch() 함수를 사용한 후 switch 문을 쓰는 것 이외에 gst_bus_add_signal_watch() 함수를 사용할 수도 있다.
gst_bus_add_signal_watch() 함수 사용시에는 아래와 같이 message type과 특정 callback 함수를 지정해 주어야 한다.
GstBus* bus;
bus = gst_pipeline_get_buf(GST_PIPELINE(pipeline));
gst_bus_add_signal_watch(bus);
g_signal_connect(bus, "message::error", G_CALLBACK(cb_message_error), NULL);
g_signal_connect(bus, "message::eos", G_CALLBACK(cb_message_eos), NULL);