Bin은 컨테이너 element입니다. Bin에 element를 추가할 수 있습니다. Bin은 element 자체이므로 다른 element와 동일한 방식으로 bin을 처리할 수 있습니다. 따라서 이전 챕터 (Elements) 전체가 bin에도 적용됩니다.
Bin이란?
Bin을 사용하면 연결된 element 그룹을 하나의 논리적 element로 결합할 수 있습니다. 더 이상 개별 element를 처리하지 않고 단지 하나의 element인 bin만 처리합니다. 파이프라인을 더 작은 덩어리로 나눌 수 있기 때문에 복잡한 파이프라인을 구성할 때 이것이 매우 강력하다는 것을 알게 될 것입니다.
Bin은 그 안에 포함된 element도 관리합니다. Element의 상태 변경을 수행하고 bus message를 수집 및 전달합니다.
GStreamer 프로그래머가 사용할 수 있는 특수한 유형의 bin이 있습니다:
- Pipeline: 포함된 element의 동기화 및 bus message를 관리하는 일반 컨테이너입니다. 최상위 bin은 파이프라인이어야 하므로 모든 애플리케이션에는 이들 중 적어도 하나가 필요합니다.
Bin 생성
Bin은 다른 element가 생성되는 것과 동일한 방식, 즉 element factory를 사용하여 생성됩니다. 또한 사용 가능한 편의 함수(gst_bin_new() 및 gst_pipeline_new())도 있습니다. Bin에 element를 추가하거나 bin에서 element를 제거하려면 gst_bin_add() 및 gst_bin_remove()를 사용할 수 있습니다. Element가 추가된 bin은 해당 element의 소유권을 갖게 됩니다. Bin을 삭제하면 해당 element도 함께 소멸 (dereference)됩니다. Bin에서 element를 제거하면 해당 element는 자동으로 소멸 (dereference)됩니다.
#include <gst/gst.h>
int
main (int argc,
char *argv[])
{
GstElement *bin, *pipeline, *source, *sink;
/* init */
gst_init (&argc, &argv);
/* create */
pipeline = gst_pipeline_new ("my_pipeline");
bin = gst_bin_new ("my_bin");
source = gst_element_factory_make ("fakesrc", "source");
sink = gst_element_factory_make ("fakesink", "sink");
/* First add the elements to the bin */
gst_bin_add_many (GST_BIN (bin), source, sink, NULL);
/* add the bin to the pipeline */
gst_bin_add (GST_BIN (pipeline), bin);
/* link the elements */
gst_element_link (source, sink);
[..]
}
Bin에 포함된 element를 조회하는 다양한 함수들 있습니다. 가장 일반적으로 사용되는 것은 gst_bin_get_by_name() 및 gst_bin_get_by_interface()입니다. gst_bin_iterate_elements() 함수를 사용하여 bin에 포함된 모든 element를 순회할 수도 있습니다. 자세한 내용은 GstBin의 API 참조를 참조하세요.
사용자 정의 Bin
애플리케이션 개발자는 특정 작업을 수행하기 위해 element가 포함된 사용자 정의 bin을 만들 수 있습니다. 이를 통해, 예를 들어 다음 코드만으로 Ogg/Vorbis decoder를 작성할 수 있습니다.
int
main (int argc,
char *argv[])
{
GstElement *player;
/* init */
gst_init (&argc, &argv);
/* create player */
player = gst_element_factory_make ("oggvorbisplayer", "player");
/* set the source audio file */
g_object_set (player, "location", "helloworld.ogg", NULL);
/* start playback */
gst_element_set_state (GST_ELEMENT (player), GST_STATE_PLAYING);
[..]
}
(물론 이는 설명을 위한 예제일 뿐입니다. Playbin element와 같이 훨씬 더 강력하고 다양한 사용자 정의 bin이 이미 존재합니다.)
플러그인이나 애플리케이션을 사용하여 사용자 정의 bin을 생성할 수 있습니다. Plugin Writer's Guide에서 사용자 정의 bin 생성에 대한 자세한 정보를 찾을 수 있습니다.
이러한 사용자 정의 bin의 예로는 gst-plugins-base의 playbin 및 uridecodebin element가 있습니다.
Bin의 element 상태 관리
Bin은 포함된 모든 element의 상태를 관리합니다. gst_element_set_state()를 사용하여 bin (또는 특별한 최상위 유형의 bin인 파이프라인)을 특정 대상 상태로 설정하면 그 안에 포함된 모든 element도 이 상태로 설정됩니다. 즉, 일반적으로 파이프라인을 시작하거나 종료하려면 최상위 파이프라인의 상태만 설정하면 됩니다.
Bin은 sink element에서 source element까지 모든 자식의 상태 변경을 수행합니다. 이렇게 하면 upstream element가 PAUSED 또는 PLAYING 상태가 될 때 downstream element가 데이터를 수신할 준비가 됩니다. 마찬가지로 종료할 때 sink element는 먼저 READY 또는 NULL로 설정됩니다. 이로 인해 upstream element는 FLUSHING error를 수신하고 element가 READY 또는 NULL 상태로 설정되기 전에 스트리밍 스레드를 중지합니다.
그러나 이미 실행 중인 bin이나 파이프라인에 element가 추가되는 경우에는 주의가 필요합니다. "pad-added" signal callback 내에서 추가된 element의 상태는 element가 추가된 bin 또는 파이프라인의 현재 상태나 대상 상태에 맞춰 자동으로 가져오지 않습니다. 대신, 이미 실행 중인 파이프라인에 element를 추가할 때 gst_element_set_state() 또는 gst_element_sync_state_with_parent()를 사용하여 직접 원하는 대상 상태로 설정해야 합니다.
원문: Bins (gstreamer.freedesktop.org)
'IT와 개발 > GStreamer Study' 카테고리의 다른 글
Pads and capabilities (1) | 2024.04.26 |
---|---|
Bus (1) | 2024.04.19 |
Elements (0) | 2024.04.05 |
GStreamer 초기화 (0) | 2024.03.29 |
Application Development Manual: Foundations (1) | 2024.03.22 |