본문 바로가기
MultiMedia Framework/GStreamer

Bus

by 유주원 2013. 7. 26.

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);