GStreamer는 스트리밍 미디어 애플리케이션을 개발을 위한 프레임워크로 Deepstream은 GStreamer를 기반으로 한 SDK이기 때문에 GStreamer의 기본 개념을 우선적으로 정리한다.
gstreamer 프레임워크는 모든 형태의 스트리밍 미디어 애플리케이션을 개발할 수 있다. 오디오나 비디오 한가지 타입만 가능한 것이 아니라 두가지 타입 모두를 다룰 수 있도록 개발이 되었다. 또한 어떤 종류의 데이터 흐름도 구성할 수 있는 파이프라인 구조로 되어있다.
[gstreamer plugins]
- protocols handling
- sources: for audio and video
- formats: parsers, formaters, muxers, demuxers, metadata, subtitles
- codecs: coders and decoders
- filters: converters, mixers, effects …
- sinks: for audio and video
기본 개념
Element
element는 Gstreamer 의 객체들 중 가장 중요한 클래스이다. 각각의 element들을 연결시키고 이를 통해 데이터가 흘러가도록 한다.
각각의 element는 하나씩 기능을 가지고 있는데, 이러한 element들을 연결시켜서 특정한 task를 위한 pipeline을 만들수 있다.
필요한 경우에는 사용자가 직접 새로운 기능의 element를 생성할수도 있다.
Pads
pad는 element의 입출력을 담당하고 있다. element들을 연결하기 위해서 각각의 입력과 출력 pad를 연결시킨다. pad는 element간의 연결의 조정과 data 흐름도 맡고있다. 서로 연결된 element에서의 데이터들이 pad를 통해서 다른element로 흘러가기 때문이다. 각각의 pad는 각각 조작할 수 있는 데이터 capabilities가 있다. element 연결 시에도 해당 pad간의 capabilities를 비교하여 일치하는 것이 있는 경우에 해당 타입을 capabilities로 pad가 연결된다. 또한 이를통해서 pipeline을 흐르는 데이터 타입을 제한할 수도 있다.
GStreamer에서 데이터 흐름은 주로 한방향으로만 흘러간다. element의 source pad로부터 그 다음 element의 sink pad 방향으로 흘러간다.
Bins and pipelines
Bin은 element들의 집합을 담고있는 컨테이너이다. bin은 element의 subclass이기 때문에 bin을 element처럼 간단하게다룰 수 있다. 이를 통해서 element들을 특정 bin에 포함시켜서 상태를 한번에 변경하거나 특정한 이벤트를 주는 등, 다수의 element들을 간단하게 조작할 수 있다.
pipeline은 가장 최상위 bin이다. pipeline은 application의 bus를 제공하고 포함하고 있는 요소들에 대한 동기화를 관리한다. pipeline의 상태를 PAUSED나 PLAYING 등으로 조작하여서 pipeline이 동작하고 데이터 흘러가도록 할 수있다.
Communication
Gstreamer는 application과 pipeline 간의 데이터 통신에 대한 몇가지 기능을 제공한다.
1) buffers
buffer는 pipeline의 element간의 streaming data를 이동하는데 사용되는 객체이다. 항상 source에서 sink로 이동한다. (downstream)
2) events
event는 element간 또는 application과 element 간의 통신하는 객체이다. event는 upstream과 downstream 모두통신 가능하다. downstream event는 data 흐름과 동기화가 가능하다.
3) messages
message는 pipeline의 message bus의 element에 의해서 전송된다. 메시지는 메시지를 전송한 elemtn의streaming thread context에서 동기적으로 intercept가 가능하지만 보통은 application의 main thread에서 비동기적으로조작된다.
메시지는 주로 error, tags, state changes, buffering state, redirects 등의 정보를 element에서 application으로 전달한다.
4) queries
queries는 application이 pipeline에게 duration, playback position 등의 정보를 요청하도록 한다. queries는 항상동기적으로 응답한다. element 또한 queries를 사용할 수 있는데, file size나 duration 등의 정보를 요청한다. queries는upstream과 downstream 모두 사용할 수 있지만 주로 upstream queries가 많이 사용된다.
[reference]
'Tech > DeepStream' 카테고리의 다른 글
[Deepstream] Gst-nvdsanalytics (0) | 2021.08.18 |
---|---|
[Deepstream] Gst-nvinfer (0) | 2021.08.18 |
[Deepstream] Gst-nvstreammux (0) | 2021.08.16 |