GStreamer plugin writer's guide: part 1
1. Introduction
modularity가 GStreamer framework의 virtues
audio filter plugin을 작성할 때 발생할 수 있는 대부분의 issue에 대해 다룸
fundamental design은 Oregon Graduate Institute의 video pipeline과 DirectShow의 idea에서 왔음
main advantages
pluggable component
n can be mixed and matched into arbitrary pipelines
GStreamer core function
plugins
data flow
synchronization
media type handling/negotiation
prelimimary
the basic of GOjbect
n http://developer.gnome.org/gobject/stable/pt01.html
sudo apt install libgstreamer1.0-0 libgstreamer1.0-dev gstreamer1.0-tools gstreamer1.0-doc gstreamer1.0-x gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-alsa gstreamer1.0-libav gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio libgstreamer-plugins-base1.0-dev
2. Foundations
2.1. elements and plugins
GstElement로부터 derived 된 object
다른 element와 link가능
source elements
n stream에 data 공급
filter elements
n stream 상의 data에 어떤 작업 수행
element는 plugin으로 encapsulate 해야함
plugin은 lodable block of code (shared object file or a dynamically linked library)
하나의 plugin이 여러 element들을 지닐 수 있음
filter
n data의 stream 처리 element
n source element: producers
n sink element: consumers
bin element
n 다른 element들을 포함
n types
s synchronization
- bin이 포함하고 있는 element들의 synchronization 역할
s autoplugger
- 자동으로 다른 element를 bin에 추가하고 link하여 두개의 서로다른 stream type간에 filter로 동작
plugin registry
binary registry file 내 plugin의 detail을 저장하는 registry
n why?
s 모든 plugin을 다 load 할 수 없음
s plugin은 해당 plugin에서 제공된 element가 요청 되었을 때만 load 됨
GStreamer Library Reference 에서
GstElement와 GstPlugin의 현재 구현을 살펴볼 수 있음
2.2. pads
element간의 연결을 negotiation 하고 data flow를 처리하는데 사용됨
pad는 place 혹은 port라고도 함
pad
n data handling capabilities를 지님
n pad가 data flow의 type을 제 한할 수 있음
n plug 혹은 jack과 유사
links
n 두 개 pad간의 연결을 의미
n pad의 허용가능한 data types이 맞을 경우 연결 가능함
2.3. GstMiniObject, buffers and events
stream은 chunk로 쪼개져서 한 element의 source pad에서 다른 element의 sink로 전달됨
GstMiniObject는 data의 chunk를 담는 구조체
GstMiniObject
- type 정보를 지님
- n event인지 buffer인지
- reference count
- n 몇 개의 element가 현재 reference를 지니는지에 대한 count
- n 0가 되면 miniobject는 disposed 되고 memory는 free 됨
- data transport에 있어서 다음의 2가지 types의 GstMiniObject가 정의됨
- n event(control)
- s stream의 state 정보
- s element가 해당 event를 지원하는 경우에만 보내짐
- - 그렇지 않은 경우 core가 event를 처리하게 됨
- s media type, EOS, cache의 flush 등을 표시하게 위해서 사용됨
- s types
- - subtype
- n 포함된 event의 type을 표시
- - 특정 event type에 의존적인 contents
- buffers(content)
- s A/V data의 chunk를 지님
- s buffer의 content를 describing하는 metadata도 지닐 수 있음
- s Metadata types
- - 하나 이상의 GstMemroy 객체에 대한 pointers
- n GstMemory는 특정 영역의 memory를 encapsulation
- - timestamp
- n buffer 내 content의 display timestamp를 표시
- n event(control)
2.3.1. buffer allocation
special buffers
filesrc
- n file을 address space로 map (using mmap)
- n buffer는 address range를 point
- n read-only로 생성되며 보통 filesrc가 생성
- n downstream element는 해당 buffer에 대해 unreferenced 등을 할 필요가 없음
GstBufferPool / GstAllocator
- n element가 downstream peer element의 GstBufferPool 혹은 GstAllocator에 ask
- n downstream이 이런 object를 제공가능하면, upstream은 이를 사용하여 buffer를 할당
- n element가 upstream peer를 위해서 GstBufferPool이나 GstAllocator를 생성하는 것은 보통의 일
- n ex.
- s ximagesink
- - XImage를 포함하는 buffer를 생성
- - upstream peer가 data를 buffer로 copy 하면, 이난 XImage로 바로 copy 됨
- n 이로서 ximagesink는 copy 본 없이 image를 바로 screen에 draw
- n 최초 element가 보통 다음의 두 가지로 동작 할 수 있음
- s buffer-in-place 상의 work
- s source에서 dest buffer로 copying하면서의 work
- n 최선은 위 두가지 모드를 다 구현하는 것임
- s GStreamer framework이 적절한 알고리즘을 선택
- sink elements들은 hardware로 data를 copy하는데 있어서 가속화된 method를 지님
- 혹은 hardware에 directly access
2.4. Media types and properties
type stream
the type system
- n element간의 pad의 link 시 format이 match up 되는 것을 확인
- n Caps negotiation
2.4.1. The basic types
media type | desc. | property | property type | property values | property desc. |
audio/* | all audio types | rate | integer | greater than 0 | the sample rate |
channels | integer | greater than 0 | the number of channels | ||
audio/x-raw | raw integer audio data | format | string | S8 U8 S16LE, … | |
audio/mpeg | MPEG 압축 format | mpegversion | integer | 1,2, or 4 | MPEG-version 1, 2, 2.5는 MP3 2/4는 MPEG-AAC |
framed | Boolean | 0 or 1 | 각 buffer가 하나의 frame만 지녔는지를 알려줌 | ||
layer | integer | 1, 2, 3 | 압축 scheme layer | ||
bitrate | integer | greater than 0 | VBR MPEG의 경우 average bitrate임 | ||
audio/x-vorbis | Vorbis audio data |
'Multimedia > GStreamer' 카테고리의 다른 글
GStreamer application development guide (0) | 2021.12.22 |
---|---|
GStreamer pwg ch. 3 (0) | 2021.12.22 |
GStreamer pwg ch 4~6 (0) | 2021.12.22 |
GStreamer pwg ch 7 ~ 9 (0) | 2021.12.22 |
GStreamer pwg ch 11 (0) | 2021.12.22 |
댓글