diff options
author | Jan Schmidt <jan@centricular.com> | 2015-09-27 13:07:19 +1000 |
---|---|---|
committer | Jan Schmidt <jan@centricular.com> | 2015-09-27 13:08:27 +1000 |
commit | 0e18ae586b10a26409ec2fb14fc65903a5d6fe2d (patch) | |
tree | 87a1358c89a62fb24ac0873e3a1847c5deeab3f5 /ext | |
parent | 7d27dc7e23e2a6cb18dcda8bdeed7ad49679b125 (diff) | |
download | gstreamer-plugins-bad-0e18ae586b10a26409ec2fb14fc65903a5d6fe2d.tar.gz |
resindvd: Send gap updates to the segment stop during stills
Ignore the normal gap threshold for laggy streams and
immediately catch all streams up to the end of the segment
when processing gap updates for a segment during a
still frame sequence.
https://bugzilla.gnome.org/show_bug.cgi?id=755680
Diffstat (limited to 'ext')
-rw-r--r-- | ext/resindvd/gstmpegdemux.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/ext/resindvd/gstmpegdemux.c b/ext/resindvd/gstmpegdemux.c index 48002ba0f..a35a6a411 100644 --- a/ext/resindvd/gstmpegdemux.c +++ b/ext/resindvd/gstmpegdemux.c @@ -127,7 +127,7 @@ static GstStateChangeReturn gst_flups_demux_change_state (GstElement * element, GstStateChange transition); static inline void gst_flups_demux_send_gap_updates (GstFluPSDemux * demux, - GstClockTime new_time); + GstClockTime new_time, gboolean no_threshold); static inline void gst_flups_demux_clear_times (GstFluPSDemux * demux); static void gst_flups_demux_reset_psm (GstFluPSDemux * demux); @@ -865,7 +865,8 @@ gst_flups_demux_clear_times (GstFluPSDemux * demux) } static inline void -gst_flups_demux_send_gap_updates (GstFluPSDemux * demux, GstClockTime new_time) +gst_flups_demux_send_gap_updates (GstFluPSDemux * demux, GstClockTime new_time, + gboolean no_threshold) { gint i, count = demux->found_count; GstEvent *event = NULL; @@ -879,11 +880,12 @@ gst_flups_demux_send_gap_updates (GstFluPSDemux * demux, GstClockTime new_time) GstFluPSStream *stream = demux->streams_found[i]; if (stream) { + GstClockTime gap_threshold = no_threshold ? 0 : stream->segment_thresh; + if (stream->last_ts == GST_CLOCK_TIME_NONE || stream->last_ts < demux->src_segment.start) stream->last_ts = demux->src_segment.start; - if (stream->last_ts + stream->segment_thresh < new_time) { - + if (stream->last_ts + gap_threshold < new_time) { GST_LOG_OBJECT (demux, "Sending gap update to pad %s time %" GST_TIME_FORMAT " to %" GST_TIME_FORMAT, GST_PAD_NAME (stream->pad), @@ -985,15 +987,18 @@ gst_flups_demux_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) GST_TIME_ARGS (MPEGTIME_TO_GSTTIME (demux->scr_adjust))); #endif - if (demux->in_still && stop != -1) { - /* Generate gap buffers, due to closing segment from a still-frame */ - gst_flups_demux_send_gap_updates (demux, stop); - } - gst_event_unref (event); event = gst_event_new_segment (&demux->src_segment); gst_flups_demux_send_event (demux, event); + if (demux->in_still && stop != -1) { + /* Generate gap buffers, due to closing segment from a still-frame. + * Do this in the new segment with stop time. */ + GST_DEBUG_OBJECT (demux, "Advancing all streams to stop time %" + GST_TIME_FORMAT, GST_TIME_ARGS (stop)); + gst_flups_demux_send_gap_updates (demux, stop, TRUE); + } + break; } case GST_EVENT_EOS: @@ -1503,7 +1508,7 @@ gst_flups_demux_parse_pack_start (GstFluPSDemux * demux) if (new_time != GST_CLOCK_TIME_NONE) { // g_print ("SCR now %" GST_TIME_FORMAT "\n", GST_TIME_ARGS (new_time)); gst_segment_set_position (&demux->src_segment, GST_FORMAT_TIME, new_time); - gst_flups_demux_send_gap_updates (demux, new_time); + gst_flups_demux_send_gap_updates (demux, new_time, FALSE); } /* Reset the bytes_since_scr value to count the data remaining in the |