Multimedia/GStreamer

GStreamer pwg: ch. 17

Roien 2021. 12. 22.
반응형

 

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

댓글