GStreamer pwg: ch. 17
17. Events: Seeking, Navigation and More
event는 pipeline의 downstream혹은 upstream으로 흘러감
이를 어느 한 element 가 제대로 처리하지 못할 경우 전체 pipeline이 깨지게 됨
17.1. downstream events
sink pad의 event handler로부터 받게 됨
n event handler는 pad 생성 시 gst_pad_set_event_function으로 설정됨
travel ways
n in-band
s buffer flow와 함께 serialized
n out-of-band
s pipeline을 즉각적으로 travel
s streaming thread와 동일 thread가 아님
s pipeline 내에 처리되어 있는 혹은 queue된 buffer들 을 skip
downstream event types
n SEGMENT
n CAPS
n TAG
n EOS
모두 buffer flow에 serialised
static gboolean gst_my_filter_sink_event (GstPad *pad, GstObject * parent, GstEvent * event) { GstMyFilter *filter; gboolean ret; filter = GST_MY_FILTER (parent); ... switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEGMENT: /* maybe save and/or update the current segment (e.g. for output * clipping) or convert the event into one in a different format * (e.g. BYTES to TIME) or drop it and set a flag to send a segment * event in a different format later */ ret = gst_pad_push_event (filter->src_pad, event); break; case GST_EVENT_EOS: /* end-of-stream, we should close down all stream leftovers here */ gst_my_filter_stop_processing (filter); ret = gst_pad_push_event (filter->src_pad, event); break; case GST_EVENT_FLUSH_STOP: gst_my_filter_clear_temporary_buffers (filter); ret = gst_pad_push_event (filter->src_pad, event); break; default: ret = gst_pad_event_default (pad, parent, event); break; } ... return ret; } |
chain-based element
n element가 chain-based인 경우, sink event function을 구현해야 함
n 이를 통해 segments, caps, EOS를 전달 받을 수 있음
loop-based element
n sink event를 받지 않아도 pipeline을 driving하는 것이 자신이기에,
n 미리 stream의 length 등을 알수 있으므로, 받을 필요가 없을 수 있음
s gst_pad_pull_range의 return 값으로 공지 받을 수 있음
n 일부 경우에 upstream 에서 event를 받을 수도 있음
s id3demux혹은 apedemux element를 앞에 지니고 있는 audio decoder의 경우
s custom event에 대한 추가 정보를 보내는 source로부터 데이터를 fed 받는 demuxers
- ex. DVD sources
17.2. Upstream event
upstream event 발생원
n upstream event는 pipeline 내 downstream어딘가에서 발생함
s ex. video sink는 upstream element에게 현재 mouse pointer의 위치를 알리기 위해 navigation event를 발생할 수 있음
n application에 의해 간접적으로 발생할 수도 있음
s application이 seek을 하는 경우
- seek request가 sink elemtn로 넘어가고
- 이후 upstream seek event를 생성함
가장 흔한 upstream events
seek events
QoS event
reconfigure event
upstream event 전달 방법
gst_pad_send_event로 보내짐
pad 상의 default event handler를 호출
n gst_pad_event_default
n event를 내부 linked pad의 peer로 전달
즉, upstream event는 일단 element의 src pad가 받고 default event handler에 의해 처리됨
n event handler를 override 가능
multiple sink pads를 가진 경우
n sink pad 중 어느 것이 event를 전달할지 결정해야 함
event를 locally 처리해야 하는 경우
n QoS, navigation event의 경우 upstream으로 보내기 전에 convert 하고 싶을 수 있음
event handler의 처리
event handling을 한 곳만 잘못해도 전체 pipeline이 망가짐
처리 안 할 event는 gst_pad_event_default로 처리해야함
n 여기서 forward할지 drop 할지 결정
신규 event 생성 시
n 전달 받은 event로 새로운 event를 만들 때는 기존에 전달 받은 event를 gst_event_unref 해야함
event handler의 리턴
n TRUE: event가 처리 되었음, (FALSE는 아님)
event handler는 streaming thread와 다른 thread에서 호출 되어야 함
n 적절할 locking 처리가 필요
17.3. All events together
event types
stream start
caps
segment
tag (metadata)
EOS
table of contents
Gap
flush start
flush stop
QOS
seek request
navigation
GStreamer design documentation을 참고하면 각각의 event가 다양한 환경에서 정확히 어떻게 사용되어야 하는지에 대한 내용을 확인할 수 있음
17.3.1. Stream Start
17.3.2. Caps
다가올 buffer에 대한 format description을 포함
17.3.3. Segment
downstream으로 전달됨
stream 내에서의 valid timestamps의 range를 알려줌
n running-time과 stream-time으로 어떻게 변환될 수 있는지도 알려줌
segment event는 data의 first buffer 이전 혹은 flush 이후에 보내짐
first segment event
n pipeline을 driving 하는 element에 의해 생성됨
n e.g.
s push-mode에서의 source operating
s pull-based의 demuxer/decoder
travel
n downstream으로 이동
n event는 변형 될 수 있음
s decoder의 경우 segment event를 BYTES format으로 받고,
average bitrate에 기반한 TIMES format의 segment event로 변경 가능
event 변경 유/무
element type 별로,
event는 단순 forwarding 될 수 있음 (using gst_pad_event_default)
혹은 parse 되고 변경 되어 전달 될 수 있음 (using gst_event_new_segment())
n e.g., demuxer의 경우 byte들(offset)을 시간 정보로 바꿔서 전달해야 하는 경우가 있음
n downstream element들이 시간 단위의 segment를 기대할 경우 이것이 pipeline sync에 사용됨
n 그래서 demuxer등은 단순 forward가 아닌 parsing하고 시간 단위의 segment event를 보내야 함
gst_event_parse_segment
n event를 parsing하는데 사용됨
n GstSegment API로 현재 segment를 계속 관찰하는데 사용함
s output clipping 등에 사용하는 경우
17.3.4. Tag (metadata)
tag event 생성
n gst_event_new_tag()
sink
n tag event로 bus 상의 message를 전달
tag parsing
n gst_event_parse_tag()
s event 내 taglist를 획득
17.3.5. End of Stream (EOS)
EOS 시 resource를 해제해야 하는 경우(그리고 N-to-1 elements)에만 해당 event를 신경씀
EOS 시 stream은 close 대상이 아님
EOS event는 property가 없음
gst_event_new_eos()로 생성
EOS는
n pipeline을 driving하는 element만 생성
n chain-based element인 경우
s driving element가 아님
s 단순히 chain function에서 stream의 end 시 GST_FLOW_EOS를 리턴
s upstream element가 EOS event를 보냄 (or SEGMENT_DONE message를 bus 상에 보냄)
source element 구현 시,
n EOS를 수동으로 보내면 안 됨
n create / fill 함수에서 GST_FLOW_EOS를 단순히 리턴하면 됨
s element가 GstBaseSrc 혹은 GstPushSrc로부터 derived 된 경우를 가정
17.3.6. Flush Start
push-mode
n downstream으로 전달 됨
pull-mode
n upstream으로 전달 됨
발생 경우
n pipeline 내 caching 된 buffer가 비워져야 하는 경우
element 별 대응
n Queue element
s flush event를 받으면 internal list에서 buffer들을 비움
n file sink elements
s kernel-to-disk cache를 비움
- fdatasync, fflush
n 보통의 elements
s 보통의 element들은 caching을 하지 않기에
s 단순히 forwarding 수행
- gst_pad_event_default()
side-effect
flush stop signal을 받기 전까지 streaming thread는 pad가 data를 받지 않게 함
push되는 data에 대해 FLUSHING flow가 리턴되게 됨
flush event 생성
gst_event_new_flush_start()
n flush-start event 생성
s EOS처럼 no properties
생성 주체
n pipeline을 driving 하는 element가 생성
s push-mode의 source elements
s pull-mode의 pull-range based인 demuxer/decoders
17.3.7. Flush Stop
flush stop event 생성
flush-start 이후 driving element가 생성
이로서 downstream element들에게 다시 buffer를 accept하게 함
n buffer가 통과하기 전 적어도 하나의 SEGMENT event가 전달됨
gst_event_new_flush_stop()으로 생성
n parameter
s running-time을 0으로 reset할지 말지에 대한 설정
s 보통 flusing seek 이후에 running_time은 0으로 설정됨
cache data를 keep 하는 경우
FLUSH-STOP event를 받으면 stream data를 clear 해야 함
n 혹은 chain function이 DISCONT flag가 set 된 buffer를 받을 시
17.3.8. Qualtiy Of Service (QOS)
current real-time performance에 대해 report (see CH. 19)
17.3.9. Seek Request
새로운 stream position을 요청
position의 형태
n bytes, time
n default units (video frame의 지시, channel-독립 samples)
생성
n gst_event_new_seek()
seeking은 End-of-file, start-of-file와 관련이 있음
보통 upstream direction으로 흐름
filesink 등에서 downstream에서 적절한 offset을 가진 SEGMENT event를 전달함
seek event 받을 시
filters, decoders
n 단순 전달
demuxer
n format을 변경하고 전달
file sources 혹은 pull-mode의 pipeline을 driving하는 demuxer/decoders
n file pointer나 internal stream resource의 pointer를 변경
not driving element들
n 수동적으로 SEGMENT event를 받으면 처리
pasring
n gst_event_parse_seek
17.3.10. Navigation
video sink에 의해 upstream으로 전달됨
n ex. mouse pointer, click, key press/release 등을 알리는데 사용
값 획득 API
n gst_event_get_structure
참고
navigationtest element @ gst-plugins-good
'Multimedia > GStreamer' 카테고리의 다른 글
GStreamer pwg: ch 13 part 2 (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 |
GStreamer pwg: ch. 18 clock (0) | 2021.12.22 |
댓글