GStreamer pwg: ch 13 part 2
13.3. Providing random access
pull mode on sink pad
n 이전 section에서 sink pad 상에서 pull mode로 동작 시 task를 만들어 data flow의 제어를 수행하는 것을 봤음
n 이 pad와 link되는 모든 pad들은 pull mode (앞단은 pull slave mode)로 동작해야 함
n pull mode로 동작하는 source pad는 반드시 _get_range 함수를 구현해야 함
s 이는 gst_pad_set_getrange_function으로 설정됨
s 이 get_range 함수는 peer pad가 gst_pad_pull_range로 data를 요청하면 호출됨
s 여기서 right offset을 seek 하고 data를 제공
random access를 구현해야 하는 elements
data sources
n ex. file source w/ reasonable low latency
filters
n 전체 pipeline에 대해 pull mode scheduling을 제공하고자 하는 filters
parsers
n 추가 연산 없이 getrange 요청을 forwarding 하는 parser
n ex.
s tag reader (e.g., ID3)
s single output parser such as a WAVE parser
_get_range 함수 example
#include "filter.h" static GstFlowReturn gst_my_filter_get_range (GstPad * pad, GstObject * parent, guint64 offset, guint length, GstBuffer ** buf); G_DEFINE_TYPE (GstMyFilter, gst_my_filter, GST_TYPE_ELEMENT); GST_ELEMENT_REGISTER_DEFINE(my_filter, "my-filter", GST_RANK_NONE, GST_TYPE_MY_FILTER); static void gst_my_filter_init (GstMyFilter * filter) { [..] gst_pad_set_getrange_function (filter->srcpad, gst_my_filter_get_range); [..] } static GstFlowReturn gst_my_filter_get_range (GstPad * pad, GstObject * parent, guint64 offset, guint length, GstBuffer ** buf) { GstMyFilter *filter = GST_MY_FILTER (parent); [.. here, you would fill *buf ..] return GST_FLOW_OK; } |
실제로 많은 random access를 수행하는 element들은 push-mode로 활성화 됨
왜냐하면, downstream에 task를 시작하는 element가 없기 때문임
즉, 실제로 element들은 둘 다 구현해야 함
_get_range와
_chain
n for filters and parsers
혹은 _get_range와 _activate_를 통해 task를 시작하는 구현
'Multimedia > GStreamer' 카테고리의 다른 글
GStreamer pwg: ch 13 (0) | 2021.12.22 |
---|---|
GStreamer pwg: ch. 13 part 1 (0) | 2021.12.22 |
GStreamer pwg: ch. 14 (0) | 2021.12.22 |
GStreamer pwg: ch. 15 (0) | 2021.12.22 |
GStreamer pwg: ch. 16 (0) | 2021.12.22 |
댓글