[gst-devel] Flow of EOS

Wes Miller wmiller at sdr.com
Fri Jul 16 22:48:11 CEST 2010


This is a continuation of a previous question 
http://gstreamer-devel.966125.n4.nabble.com/Change-File-Locations-for-Container-Formats-that-Have-Headers-tp2283747p2283747.html
Change File Locations for Container Formats that Have Headers  .

My pipeline has grown more complicated and I have a new quirk that needs to
be solved.  So, 

The Pipe:

   Reads from a live source.  Writes to a filesink and an appsink.


      souphttpsrc ->  multipartdemux ->  queue2   ->  tee  --,->  queue   
-->  matroskamux  --> filesink
                                                          name=q0               
|   name=q1
                                                                                       
|
                                                                                       
'->  queue   --> appsink
                                                                                           
name=q2         :
                                                                                                                  
:.... (appsink handler)

The appsink handler is essentially:

     while ( true )
          while ( appsink is not EOS )
               sip from stream
               print "tick" every 25th pass 
          end while
    end while


Expected Operation:

     Every 4 seconds a timer tells the src pad of q0 to block.
     Q0Blocked callback sends EOS to sinkpads of q1 and q2.
     EOS passes down both legs of the pipe
     Either or both of filesink and appsink post EOS to bus
     bus_callback 
       -  sets all elements from tee to appsink and to filesink to
GST_STATE_NULL
       -  change output file location of the filesink
       -  sends unblock to src pad of q0
     Q0UnBlocked handler 
       -  sets all elements from tee to appsink and to filesink to
GST_STATE_PLAYING
     Operation iterates.

Well, of course, this isn't what happens 

  -  Eveerything goes as expected through the first pass.
  -  Debug confirms that both sinks go to EOS
  -  The bus_callback is called.  
        -  EOS is detected.  
        -  filesink set to GST_STATE_NULL - rc = 1
        -  Unblock goes to q0:src.
  -  Q0UnBlock is called-back.  
        -  Filesink set back to GST_STATE_PLAYING
        -  Printf's show all elements are in PLAYING state, 
        -  filesink is async waiting
  -  Debug output says src is getting and passing data to demux and then to
q0.  
  -  Finally, At the end of the second buffer we see this:

     basesrc gstbasesrc.c:2473:gst_base_src_loop:            <my_src>
pausing task, reason unexpected
    GST_PADS gstpad.c:5250:gst_pad_pause_task:           <my_src:src> pause
task
        task gsttask.c:608:gst_task_set_state:<task3> Changing task
0xa2069d0 to state 2
   GST_EVENT gstevent.c:269:gst_event_new: creating new event 0xa159450 eos
86
   GST_EVENT gstpad.c:5020:gst_pad_send_event:         <my_demux:sink> have
event type eos
    GST_PADS gstpad.c:3517:gst_pad_event_default:       <my_demux:sink>
pausing task because of eos
    GST_PADS gstpad.c:5250:gst_pad_pause_task:          <my_demux:sink>
pause task
    GST_PADS gstpad.c:5268:gst_pad_pause_task:          <my_demux:sink> pad
has no task
    GST_PADS gstpad.c:3417:gst_pad_event_default_dispatch:       
<my_demux:sink> Sending event 0xa159450 (eos) to all internally linked pads
    GST_PADS
gstpad.c:3213:gst_pad_iterate_internal_links_default:<my_demux:sink> Making
iterator
   GST_EVENT gstpad.c:5020:gst_pad_send_event:<capsfilter0:sink> have event
type eos
   GST_EVENT gstpad.c:5020:gst_pad_send_event:       <my_queue0:sink> have
event type eos
    GST_PADS gstpad.c:5048:gst_pad_send_event:       <my_queue0:sink> sent
event, result 1
    GST_PADS gstpad.c:5048:gst_pad_send_event:<capsfilter0:sink> sent event,
result 1
    GST_PADS gstpad.c:5048:gst_pad_send_event:       <my_demux:sink> sent
event, result 1

Many, many of these lines:
     appsink gstappsink.c:976:gst_app_sink_is_eos:      <my_appsink> we are
EOS and the queue is empty

   GST_EVENT gstpad.c:5020:gst_pad_send_event:      <my_tee:sink> have event
type eos
    GST_PADS gstpad.c:3517:gst_pad_event_default:    <my_tee:sink> pausing
task because of eos
    GST_PADS gstpad.c:5250:gst_pad_pause_task:       <my_tee:sink> pause
task
    GST_PADS gstpad.c:5268:gst_pad_pause_task:       <my_tee:sink> pad has
no task
    GST_PADS gstpad.c:3417:gst_pad_event_default_dispatch:       
<my_tee:sink> Sending event 0xa159450 (eos) to all internally linked pads
    GST_PADS
gstpad.c:3213:gst_pad_iterate_internal_links_default:<my_tee:sink> Making
iterator
   GST_EVENT gstpad.c:5020:gst_pad_send_event:      <my_queue2:sink> have
event type eos
      queue2 gstqueue2.c:1304:gst_queue2_handle_sink_event:      
<my_queue2> refusing event, we are flushing
    GST_PADS gstpad.c:5048:gst_pad_send_event:       <my_queue2:sink> sent
event, result 0
   GST_EVENT gstpad.c:5020:gst_pad_send_event:      <my_queue1:sink> have
event type eos
      queue2 gstqueue2.c:1304:gst_queue2_handle_sink_event:      
<my_queue1> refusing event, we are flushing
    GST_PADS gstpad.c:5048:gst_pad_send_event:       <my_queue1:sink> sent
event, result 0
    GST_PADS gstpad.c:5048:gst_pad_send_event:       <my_tee:sink> sent
event, result 0
    GST_PADS gstpad.c:5250:gst_pad_pause_task:       <my_queue0:src> pause
task
        task gsttask.c:608:gst_task_set_state:<task2> Changing task
0xa206948 to state 2
     appsink gstappsink.c:976:gst_app_sink_is_eos:      <my_appsink> we are
EOS and the queue is empty

And THOUSANDS of these lines...
     appsink gstappsink.c:976:gst_app_sink_is_eos:      <my_appsink> we are
EOS and the queue is empty
     appsink gstappsink.c:976:gst_app_sink_is_eos:      <my_appsink> we are
EOS and the queue is empty


Any help greatly appreciated.

Wes


   
-- 
View this message in context: http://gstreamer-devel.966125.n4.nabble.com/Flow-of-EOS-tp2291933p2291933.html
Sent from the GStreamer-devel mailing list archive at Nabble.com.




More information about the gstreamer-devel mailing list