이 가이드의 이 장에서는 GStreamer의 기본 개념을 소개합니다. 이러한 개념을 이해하면 GStreamer 확장과 관련된 문제를 파악하는 데 도움이 됩니다. 이러한 개념 중 다수는 GStreamer Application Development Manual에서 더 자세히 설명합니다. 여기에 제시된 기본 개념은 주로 기억을 되살리는 데 도움이 됩니다.
Elements and Plugins
Element는 GStreamer의 핵심입니다. 플러그인 개발의 맥락에서 element는 GstElement 클래스에서 파생된 객체입니다. Element는 다른 element와 연결될 때 어떤 종류의 기능을 제공합니다. 예를 들어, source element는 스트림에 데이터를 제공하고 filter element는 스트림의 데이터에 작용합니다. Element가 없으면 GStreamer는 연결할 것이 없는 개념적 파이프 fitting의 집합일 뿐입니다. 많은 수의 element가 GStreamer와 함께 제공되지만 추가 element를 작성할 수도 있습니다.
그러나 새 element를 작성하는 것만으로는 충분하지 않습니다. GStreamer에서 사용할 수 있도록 플러그인에 element를 캡슐화해야 합니다. 플러그인은 기본적으로 로드 가능한 코드 블록으로, 일반적으로 공유 객체 파일 또는 동적으로 연결된 라이브러리라고 합니다. 단일 플러그인에는 여러 element의 구현이 포함될 수도 있고, 단 하나의 element만 포함될 수도 있습니다. 단순화를 위해 이 가이드는 주로 하나의 element가 포함된 플러그인에 집중합니다.
필터는 데이터 스트림을 처리하는 중요한 유형의 element입니다. 데이터의 생산자와 소비자를 각각 source element와 sink element라고 합니다. Bin element에는 다른 element가 포함됩니다. 한 유형의 bin은 데이터가 원활하게 흐르도록 포함된 element의 동기화를 담당합니다. autoplugger elements라고 하는 또 다른 유형의 bin은 다른 element를 bin에 자동으로 추가하고 서로 연결하여 두 개의 임의의 스트림 유형 간의 필터 역할을 합니다.
플러그인 메커니즘은 표준 패키지만 사용하더라도 GStreamer의 모든 곳에서 사용됩니다. 몇 가지 매우 기본적인 기능은 코어 라이브러리에 있으며 다른 모든 기능은 플러그인에서 구현됩니다. 플러그인 레지스트리는 플러그인의 세부 정보를 바이너리 레지스트리 파일에 저장하는 데 사용됩니다. 이런 방식으로 GStreamer를 사용하는 프로그램은 필요한 플러그인을 결정하기 위해 모든 플러그인을 로드할 필요가 없습니다. 플러그인은 제공된 element가 요청될 때만 로드됩니다.
GstElement 및 GstPlugin의 현재 구현 세부 정보는 GStreamer 라이브러리 참조를 참조하세요.
Pads
Pad는 GStreamer의 element 간 링크와 데이터 흐름을 협상하는 데 사용됩니다. Pad는 다른 element와 링크가 만들어질 수 있는 element의 "장소" 또는 "포트"로 볼 수 있으며, 이를 통해 데이터가 해당 element로 또는 해당 element에서 흐를 수 있습니다. Pad에는 특정 데이터 처리 기능이 있습니다. Pad는 이를 통해 흐르는 데이터 유형을 제한할 수 있습니다. 두 pad 간의 링크는 두 pad의 허용된 데이터 유형이 호환되는 경우에만 허용됩니다.
여기서 비유가 도움이 될 수 있습니다. Pad는 물리적 장치의 플러그 또는 잭과 유사합니다. 예를 들어 앰프, DVD 플레이어, (무음) 비디오 프로젝터로 구성된 홈 시어터 시스템을 생각해 보세요. DVD 플레이어를 앰프에 연결하는 것은 두 장치 모두 오디오 잭이 있기 때문에 허용되고, 프로젝터를 DVD 플레이어에 연결하는 것은 두 장치 모두 호환되는 비디오 잭이 있기 때문에 허용됩니다. 프로젝터와 앰프 간의 링크는 프로젝터와 앰프의 잭 유형이 다르기 때문에 만들어지지 않을 수 있습니다. GStreamer의 pad는 홈 시어터 시스템의 잭과 동일한 목적을 제공합니다.
대부분의 경우 GStreamer의 모든 데이터는 element 간의 링크를 통해 단방향으로 흐릅니다. 데이터는 하나 이상의 source pad를 통해 한 element에서 흘러나오고, element는 하나 이상의 sink pad를 통해 들어오는 데이터를 허용합니다. Source 및 sink element는 각각 source 및 sink pad만 있습니다.
GstPad의 현재 구현 세부 정보는 GStreamer 라이브러리 참조를 참조하세요.
GstMiniObject, Buffers and Events
GStreamer의 모든 데이터 스트림은 한 element의 source pad에서 다른 element의 sink pad로 전달되는 chunk로 잘립니다. GstMiniObject는 이러한 데이터 chunk를 보관하는 데 사용되는 구조입니다.
GstMiniObject에는 다음과 같은 중요한 유형이 포함됩니다.
- 이 GstMiniObject가 어떤 유형의 데이터 (이벤트, 버퍼 등)인지를 나타내는 정확한 유형입니다.
- 현재 miniobject에 대한 참조를 보관하는 element의 수를 나타내는 참조 카운트입니다. 참조 카운트가 0으로 떨어지면 miniobject가 삭제되고 해당 메모리가 어떤 의미에서 해제됩니다 (자세한 내용은 아래 참조).
데이터 전송을 위해 두 가지 유형의 GstMiniObject가 정의되어 있습니다. 이벤트 (제어)와 버퍼 (콘텐츠)입니다.
버퍼에는 두 개의 연결된 pad가 처리하는 방법을 알고 있는 모든 종류의 데이터가 포함될 수 있습니다. 일반적으로 버퍼에는 한 element에서 다른 element로 흐르는 일종의 오디오 또는 비디오 데이터 chunk가 포함됩니다.
버퍼에는 버퍼의 콘텐츠를 설명하는 메타데이터도 포함됩니다. 일부 중요한 메타데이터 유형은 다음과 같습니다.
- 하나 이상의 GstMemory 객체에 대한 포인터. GstMemory 객체는 메모리 영역을 캡슐화하는 참조 계산된 객체입니다.
- 버퍼에 있는 콘텐츠의 기본 표시 타임스탬프를 나타내는 타임스탬프.
이벤트에는 두 개의 연결된 pad 사이를 흐르는 스트림의 상태에 대한 정보가 포함됩니다. 이벤트는 element가 명시적으로 지원하는 경우에만 전송되고, 그렇지 않으면 코어가 이벤트를 자동으로 처리하려고 시도합니다. 이벤트는 예를 들어 미디어 유형, 미디어 스트림의 끝 또는 캐시를 플러시해야 함을 나타내는 데 사용됩니다.
이벤트에는 다음 항목 중 여러 개가 포함될 수 있습니다.
- 포함된 이벤트의 유형을 나타내는 하위 유형.
- 이벤트의 다른 내용은 특정 이벤트 유형에 따라 달라집니다.
이벤트는 Events: Seeking, Navigation and More에서 자세히 설명합니다. 그때까지 사용되는 유일한 이벤트는 EOS 이벤트로, 스트림의 끝(일반적으로 파일의 끝)을 나타내는 데 사용됩니다.
GstMiniObject, GstBuffer 및 GstEvent의 현재 구현 세부 정보는 GStreamer 라이브러리 참조를 참조하세요.
Buffer Allocation
버퍼는 여러 다른 유형의 메모리 chunk를 저장할 수 있습니다. 가장 일반적인 유형의 버퍼에는 malloc()에서 할당한 메모리가 포함됩니다. 이러한 버퍼는 편리하지만 데이터를 버퍼에 특별히 복사해야 하기 때문에 항상 매우 빠르지는 않습니다.
많은 특수 element가 특수 메모리를 가리키는 버퍼를 만듭니다. 예를 들어 filesrc element는 일반적으로 파일을 애플리케이션의 주소 공간에 매핑하고 (mmap() 사용) 해당 주소 범위를 가리키는 버퍼를 만듭니다. filesrc에서 만든 이러한 버퍼는 읽기 전용이라는 점을 제외하면 일반 버퍼와 똑같이 작동합니다. 버퍼 해제 코드는 기본 메모리를 해제하는 올바른 방법을 자동으로 결정합니다. 이러한 종류의 버퍼를 수신하는 다운스트림 element는 버퍼를 처리하거나 참조 해제하기 위해 특별한 작업을 수행할 필요가 없습니다.
Element가 특수 버퍼를 얻는 또 다른 방법은 GstBufferPool 또는 GstAllocator를 통해 다운스트림 peer에 요청하는 것입니다. Element는 다운스트림 peer element에 GstBufferPool 또는 GstAllocator를 요청할 수 있습니다. 다운스트림이 이러한 객체를 제공할 수 있는 경우 업스트림은 이를 사용하여 버퍼를 할당할 수 있습니다. Memory allocation에서 자세히 알아보세요.
많은 sink element에는 하드웨어에 데이터를 복사하는 가속화된 방법이 있거나 하드웨어에 직접 액세스할 수 있습니다. 이러한 element가 업스트림 peer에 대한 GstBufferPool 또는 GstAllocator를 생성할 수 있는 것이 일반적입니다. 이러한 예 중 하나는 ximagesink입니다. 이는 XImage를 포함하는 버퍼를 생성합니다. 따라서 업스트림 peer가 버퍼에 데이터를 복사할 때 XImage에 직접 복사하여 ximagesink가 먼저 XImage에 데이터를 복사하지 않고도 이미지를 화면에 직접 그릴 수 있습니다.
필터 element는 종종 버퍼에서 제자리에서 작동하거나 source 버퍼에서 대상 버퍼로 복사하는 동안 작동할 수 있는 기회가 있습니다. GStreamer 프레임워크는 적절한 경우 가장 빠른 알고리즘을 선택할 수 있으므로 두 알고리즘을 모두 구현하는 것이 가장 좋습니다. 당연히 이는 source 및 sink pad에서 정확히 동일한 형식을 갖는 element인 엄격한 필터에만 의미가 있습니다.
Media types and Properties
GStreamer는 유형 시스템을 사용하여 element 간에 전달되는 데이터가 인식되는 형식인지 확인합니다. 유형 시스템은 element 간에 pad를 연결할 때 형식을 완전히 지정하는 데 필요한 매개변수가 올바르게 일치하는지 확인하는 데도 중요합니다. Element 간에 만들어진 각 링크에는 지정된 유형과 선택적으로 속성 집합이 있습니다. Caps negotiation에서 Caps negotiation에 대한 자세한 내용을 참조하세요.
The Basic Types
GStreamer는 이미 많은 기본 미디어 유형을 지원합니다. 다음은 GStreamer의 버퍼에 사용되는 몇 가지 기본 유형의 표입니다. 표에는 이름 ("미디어 유형")과 유형에 대한 설명, 유형과 관련된 속성 및 각 속성의 의미가 포함되어 있습니다. 지원되는 유형의 전체 목록은 정의된 유형 목록에 포함되어 있습니다.
Table of Example Types
Media Type | Description | Property | Property Type | Property Values | Property Description |
audio/* | All audio types | rate | integer | greater than 0 | The sample rate of the data, in samples (per channel) per second. |
channels | integer | greater than 0 | The number of channels of audio data. | ||
audio/x-raw | Unstructured and uncompressed raw integer audio data. | format | string | S8, U8, S16LE, S16BE, U16LE, U16BE, S24_32LE, S24_32BE, U24_32LE, U24_32BE, S32LE, S32BE, U32LE, U32BE, S24LE, S24BE, U24LE, U24BE, S20LE, S20BE, U20LE, U20BE, S18LE, S18BE, U18LE, U18BE, F32LE, F32BE, F64LE, F64BE |
The format of the sample data. |
audio/mpeg | Audio data compressed using the MPEG audio encoding scheme. | mpegversion | integer | 1, 2 or 4 | The MPEG-version used for encoding the data. The value 1 refers to MPEG-1, -2 and -2.5 layer 1, 2 or 3. The values 2 and 4 refer to the MPEG-AAC audio encoding schemes. |
framed | boolean | 0 or 1 | A true value indicates that each buffer contains exactly one frame. A false value indicates that frames and buffers do not necessarily match up. |
||
layer | integer | 1, 2, or 3 | The compression scheme layer used to compress the data (only if mpegversion=1). | ||
bitrate | integer | greater than 0 | The bitrate, in bits per second. For VBR (variable bitrate) MPEG data, this is the average bitrate. |
||
audio/x-vorbis | Vorbis audio data | There are currently no specific properties defined for this type. |
원문: Foundations (gstreamer.freedesktop.org)
Foundations
Foundations This chapter of the guide introduces the basic concepts of GStreamer. Understanding these concepts will help you grok the issues involved in extending GStreamer. Many of these concepts are explained in greater detail in the GStreamer Applicatio
gstreamer.freedesktop.org
'IT와 개발 > GStreamer Study' 카테고리의 다른 글
Specifying the pads (1) | 2024.08.30 |
---|---|
Constructing the Boilerplate (0) | 2024.08.23 |
Things to check when writing an application (0) | 2024.08.09 |
Programs (1) | 2024.08.02 |
Playback Components (0) | 2024.07.26 |