[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