gstreamer/gst/multifile
Xavier Claessens fb835c100a splitmuxsink: Fix occasional deadlock when ending file with subtitle
Deadlock occurs when splitting files if one stream received no buffer during
the first GOP of the next file. That can happen in that scenario for example:
 1) The first GOP of video is collected, it has a duration of 10s.
    max_in_running_time is set to 10s.
 2) Other streams catchup and we receive the first subtitle buffer at ts=0 and
    has a duration of 1min.
 3) We receive the 2nd subtitle buffer with a ts=1min. in_running_time is set to
    1min. That buffer is blocked in handle_mq_input() because
    max_in_running_time is still 10s.
 4) Since all in_running_time are now > 10s, max_out_running_time is now set to
    10s. That first GOP gets recorded into the file. The muxer pop buffers out
    of the mq, when it tries to pop a 2nd subtitle buffer it blocks because the
    GstDataQueue is empty.
 5) A 2nd GOP of video is collected and has a duration of 10s as well.
    max_in_running_time is now 20s. Since subtitle's in_running_time is already
    1min, that GOP is already complete.
 6) But let's say we overran the max file size, we thus set state to
    SPLITMUX_STATE_ENDING_FILE now. As soon as a buffer with ts > 10s (end of
    previous GOP) arrives in handle_mq_output(), EOS event is sent downstream
    instead. But since the subtitle queue is empty, that's never going to
    happen. Pipeline is now deadlocked.

To fix this situation we have to:
 - Send a dummy event through the queue to wakeup output thread.
 - Update out_running_time to at least max_out_running_time so it sends EOS.
 - Respect time order, so we set out_running_tim=max_in_running_time because
   that's bigger than previous buffer and smaller than next.

https://bugzilla.gnome.org/show_bug.cgi?id=763711
2016-04-01 00:48:05 +11:00
..
gstmultifile.c splitmux: Implement new elements for splitting files at mux level. 2015-02-06 04:26:59 +11:00
gstmultifilesink.c good: use new gst_element_class_add_static_pad_template() 2016-03-24 14:32:20 +02:00
gstmultifilesink.h multifilesink: Add a new max-duration file switching mode 2015-05-20 15:50:07 +02:00
gstmultifilesrc.c good: use new gst_element_class_add_static_pad_template() 2016-03-24 14:32:20 +02:00
gstmultifilesrc.h multifilesrc: Implement seeking in case of multiple images 2013-11-22 18:52:54 -03:00
gstsplitfilesrc.c good: use new gst_element_class_add_static_pad_template() 2016-03-24 14:32:20 +02:00
gstsplitfilesrc.h Fix FSF address 2012-11-04 00:07:18 +00:00
gstsplitmuxpartreader.c splitmuxsrc: print potentially negative offset with a sign 2016-01-25 15:36:29 +01:00
gstsplitmuxpartreader.h splitmuxsrc: Use a separate lock to delay typefind. 2015-07-29 23:03:18 +10:00
gstsplitmuxsink.c splitmuxsink: Fix occasional deadlock when ending file with subtitle 2016-04-01 00:48:05 +11:00
gstsplitmuxsink.h splitmuxsink: post messages when fragments are being opened and closed 2015-10-03 00:52:23 +10:00
gstsplitmuxsrc.c good: use new gst_element_class_add_static_pad_template() 2016-03-24 14:32:20 +02:00
gstsplitmuxsrc.h splitmux: Implement new elements for splitting files at mux level. 2015-02-06 04:26:59 +11:00
gstsplitutils.c splitmux: Implement new elements for splitting files at mux level. 2015-02-06 04:26:59 +11:00
gstsplitutils.h splitmux: Implement new elements for splitting files at mux level. 2015-02-06 04:26:59 +11:00
Makefile.am Remove obsolete Android build cruft 2015-04-26 17:55:07 +01:00
multifile.vproj Revive multifile[src|sink]. 2006-11-10 18:51:10 +00:00
patternspec.c Fix FSF address 2012-11-04 00:07:18 +00:00
patternspec.h Fix FSF address 2012-11-04 00:07:18 +00:00
test-splitmuxpartreader.c splitmux: Implement new elements for splitting files at mux level. 2015-02-06 04:26:59 +11:00