빈은 컨테이너 엘리먼트입니다. 사용자는 빈에 엘리먼트를 추가할 수 있습니다. 빈 자체도 엘리먼트이기 때문에, 빈도 다른 엘리먼트처럼 관리할 수 있습니다. 또한 이전 장에서 설명한 엘리먼트에 관한 모든 것이 빈에도 적용됩니다.

 

6.1. 빈이란 무엇인가

빈은 여러개의 엘리먼트를 연결하여 하나의 논리적 엘리먼트로 합치는 것을 가능하게 해줍니다. 더이상 각각의 엘리먼트를 별도로 관리할 필요가 없습니다. 그냥 빈을 사용하여 하나의 엘리먼트로 처리하면 됩니다. 파이프라인을 빈을 이용해 작은 단위로 쪼갤 수 있기 때문에 복잡한 파이프라인을 만들 때 빈의 강력함을 알 수 있습니다.

또한 빈은 빈에 포함된 엘리먼트를 관리합니다. 빈은 여러 엘리먼트의 상태를 변경과 버스 메시지를 수집/전달을 수행합니다.

GStreamer 프로그래머를 위해 단 하나의 특별한 빈을 사용가능합니다.

  • 파이프라인 : 포함하는 여러 엘리먼트의 동기화와 버스 메시지 관리를 위한 포괄적인 컨테이너. 최상위 빈은 반드시 파이프라인이어야 합니다. 모든 애플리케이션은 하나의 파이프라인을 반드시 가지고 있어야 합니다.

 

6.2. 빈 만들기

빈은 다른 엘리먼트와 같은 방법으로 만들 수 있습니다. 즉, 엘리먼트 팩토리를 사용합니다. 또한 간편한 함수도 사용 가능 합니다(gst_bin_new () and gst_pipeline_new ()). 빈에 엘리먼트를 추가 혹은 제거하기 위해 gst_bin_add ()와 gst_bin_remove () 함수를 사용합니다.  빈에 엘리먼트를 추가하면, 빈이 엘리먼트의 소유권을 가지게 된다는 점을 기억하세요. 빈을 없앨 때, 엘리먼트도 함께 언레퍼런스됩니다. 빈에서 엘리먼트를 제거하면, 자동적으로 엘리먼트가 언레퍼런스됩니다.

빈에서 엘리먼트를 검색하는데는 여러 방법이 있습니다. gst_bin_get_by_name ()와  gst_bin_get_by_interface () 함수를 가장 일반적으로 사용합니다. 또한 gst_bin_iterate_elements () 함수를 이용하면 빈에 포함된 여러 엘리먼트를 반복할 수 있습니다. GstBin API 레퍼런스(http://gstreamer.freedesktop.org/data/doc/gstreamer/stable/gstreamer/html/GstBin.html)에서 자세한 내용을 확인할 수 있습니다.

 

6.3. 커스텀 빈

애플리케이션 프로그래머는 특정한 태스크 수행을 위해 여러 엘리먼트를 포함하는 커스텀 빈을 만들 수 있습니다. 예를 들어 이러한 기능은 아래의 코드와 같이 Ogg/Vorbis 디코더를 만들 수 있습니다.

(물론 위의 예는 우스운 코드입니다. 플레이 빈 엘리먼트와 같이 이미 위의 예보다 강력하고 다양한 커스텀 빈이 존재합니다.)

커스텀 빈은 플러그인을 위해 생성할 수 있고, 애플리케이션으로 만들어 질 수 있습니다. 플러그인 작성 가이드(http://gstreamer.freedesktop.org/data/doc/gstreamer/head/pwg/html/index.html)에서 커스텀 빈을 생성하는 더 자세한 사항을 알아볼 수 있습니다.

playbin과 uridecoderbin과 같은 커스텀 빈의 예는 gst-plugins-base(http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-plugins/html/index.html)에서 확인할 수 있습니다.

 

6.4. 자식 엘리먼트의 상태를 관리하는 빈

빈은 빈에 포함된 모든 엘리먼트의 상태(state)를 관리합니다. 빈이나 파이프라인의 상태를 gst_element_set_state () 함수를 이용해 설정하면, 빈에 포함된 모든 엘리먼트의 상태도 같은 상태로 전환됩니다. 이것은 파이프라인을 시작하거나 종료하기 위해 최상위 파이프라인의 상태만 설정을 해주면 된다는 의미입니다.

빈은 싱크 엘리먼트에서 소스 엘리먼트까지 빈에 포함된 모든 엘리먼트 상태 전환을 수행합니다. 이것은 업스트림 엘리먼트의 상태가 PAUSED에서 PLAYING으로 전환할 떄 다운스트림 엘리먼트는 데이터를 수신할 준비를 한다는 것을 보장합니다. 비슷하게 종료를 할 때, 먼저 싱크 엘리먼트가 PAUSED나 NULL 상태로 설정하는 것은 업스트림 엘리먼트는 FLUSHING 에러를 수신과 엘리먼트를 PAUSED나 NULL 상태로 전환하기 전에 스트리밍 스레드를 멈춥니다.

그러나 이것을 기억하세요. 빈이나 엘리먼트가 이미 작동 중에 엘리먼트를 빈에 추가하면(예로 “pad-added” 시그널 콜백), 추가한 엘리먼트의 상태가 빈의 상태로 자동 전환되지 않습니다.대신,  이미 동작 중인 파이프라인이나 빈에 엘리먼트를 추가할 때는 gst_element_set_state ()나 gst_element_sync_state_with_parent () 함수를 이용해 당신이 추가한 엘리먼트를 원하는 상태로 변환해야 합니다.

Posted by _유부남J군_