이 글은 GStreamer org 의 “GStreamer Applicatino Development Manual” 을 번역한 것이다.
원본 링크: https://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/manual.pdf
이 장에서는 GStreamer의 기본 개념을 소개합니다. 이 안내서의 나머지 부분을 읽으려면 이러한 개념을 이해하는 것이 중요하며, 모두 기본 개념을 이해한다고 가정합니다.
Elements
Elements 는 GStreamer에서 가장 중요한 Object class 입니다.
일반적으로 서로 연결된 Elements 체인을 만들고 이 Elements 체인을 통해 데이터를 흐르게합니다.
Elements 에는 파일에서 데이터를 읽거나,이 데이터를 디코딩하거나,이 데이터를 사운드 카드 (또는 기타)로 출력 할 수있는 하나의 특정한 기능이 있습니다.
이러한 여러 Elements 를 연결하여 특정 작업 (예 : 미디어 재생 또는 캡처)을 수행 할 수있는 파이프 라인을 만듭니다.
GStreamer는 기본적으로 다양한 Elements 컬렉션을 제공하므로 다양한 미디어 응용 프로그램을 개발할 수 있습니다.
필요한 경우 새 Elements 를 작성할 수도 있습니다.
이 주제는 GStreamer Plugin Writer ‘s Guide에 많이 설명되어 있습니다.
Pads
Pad 는 Element 의 입력 및 출력이며 다른 Element 를 연결할 수 있습니다.
그것들은 GStreamer의 Element 들 사이의 링크와 Data flow 를 negotiation 하는 데 사용됩니다.
Pad 는 다른 Element 와 연결될 수 있는 Element 에서 “플러그”또는 “포트”로 볼 수 있으며, 이 Element 에서 데이터가 흐를 수 있습니다.
Pad 에는 특정한 데이터 처리 기능이 있습니다.
Pad 는 통과하는 데이터 타입을 제한 할 수 있습니다.
두 Pad 의 허용 된 데이터 타입 (기능) 이 호환되는 경우에만 두 Pad 간에 링크가 허용됩니다.
데이터 타입은 ‘Caps negotiation’ 이라는 프로세스를 사용하여 Pad 간에 Negotiation 됩니다. 데이터 타입은 GstCaps에 의해 설명됩니다.
이렇게 비유해보겠습니다. Pad 는 물리적 디바이스의 플러그 또는 잭과 유사합니다.
예를 들어, 오디오 앰프, DVD 플레이어 및 (자동) 비디오 프로젝터로 구성된 홈 시어터 시스템을 생각해보십시오.
두 디바이스 모두 오디오 잭이 있으므로 DVD 플레이어를 앰프에 연결하는 것이 허용되며 두 장치 모두 호환되는 비디오 잭이 있으므로 프로젝터를 DVD 플레이어에 연결할 수 있습니다.
프로젝터와 앰프의 잭 유형이 다르기 때문에 프로젝터와 앰프를 연결하지 못할 수 있습니다.
GStreamer의 Pad 는 홈 시어터 시스템의 잭과 동일한 용도로 사용됩니다.
대부분의 경우 GStreamer의 모든 데이터는 Element 간 링크를 통해 한 방향으로 흐릅니다.
데이터는 하나 이상의 소스 Pad 를 통해 하나의 Element 에서 흘러 나오고 Element 는 하나 이상의 싱크 Pad 를 통해 들어오는 데이터를 받아들입니다.
소스 및 싱크 Element 에는 각각 소스 및 싱크 Pad 만 있습니다.
데이터는 일반적으로 버퍼 (GstBuffer 객체로 설명)와 이벤트 (GstEvent 객체로 설명)를 의미합니다.
Bin 과 Pipeline
Bin 은 Element 모음을 위한 컨테이너입니다. Bin 은 Element 자체의 서브 클래스이므로 대부분 Bin 을 마치 Element 인 것처럼 제어 할 수 있으므로 응용 프로그램의 복잡성을 크게 줄일 수 있습니다. 예를 들어, Bin 자체의 상태를 변경하여 Bin 의 모든 Element 에서 상태를 변경할 수 있습니다. Bin 은 또한 포함 된 child (예 : 오류 메시지, 태그 메시지 또는 EOS 메시지)에서 버스 메시지를 전달합니다.
Pipeline 은 최상위 Bin 입니다. 응용 프로그램을 위한 버스를 제공하고 해당 child 에 대한 동기화를 관리합니다. PAUSED 또는 PLAYING 상태로 설정하면 Data flow 가 시작되고 미디어 처리가 수행됩니다. 일단 시작되면 Pipeline 은 중지하거나 데이터 스트림의 끝에 도달 할 때까지 별도의 스레드에서 실행됩니다.

Communication
GStreamer는 애플리케이션과 Pipeline 간의 통신 및 데이터 교환을 위한 여러 메커니즘을 제공합니다.
버퍼는 Pipeline 의 Element 간에 스트리밍 데이터를 전달하기위한 객체입니다. 버퍼는 항상 소스에서 싱크로 내려갑니다 (다운 스트림).
이벤트는 Element 간에 또는 응용 프로그램에서 Element 로 전송되는 객체입니다. 이벤트는 업스트림 및 다운 스트림으로 이동할 수 있습니다.
다운 스트림 이벤트는 Data flow 에 동기화 될 수 있습니다.
메시지는 Pipeline 의 메시지 버스에 Element 별로 게시 된 Object 이며, 응용 프로그램에서 수집하기 위해 유지됩니다.
메시지는 메시지를 게시하는 Element 의 스트리밍 스레드 컨텍스트에서 동기식으로 인터셉트 될 수 있지만 일반적으로 애플리케이션의 기본 스레드에서 애플리케이션이 비동기 적으로 처리합니다.
메시지는 스레드로부터 안전한 방식으로 Element 에서 애플리케이션으로 오류, 태그, 상태 변경, 버퍼링 상태, 리디렉션 등과 같은 정보를 전송하는 데 사용됩니다.
쿼리를 통해 응용 프로그램은 파이프 라인에서 지속 시간 또는 현재 재생 위치와 같은 정보를 요청할 수 있습니다.
쿼리는 항상 동기식으로 응답됩니다. Element 는 또한 쿼리를 사용하여 피어 요소 (예 : 파일 크기 또는 지속 시간)로부터 정보를 요청할 수 있습니다. Pipeline 내에서 두 가지 방식으로 모두 사용할 수 있지만 업스트림 쿼리가 더 일반적입니다.
