From: Edward Hervey Date: Thu, 3 Dec 2015 15:38:45 +0000 (+0100) Subject: videodecoder: Avoid pushing buffers before segment start X-Git-Tag: 1.19.3~511^2~3181 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d34aaf9e9b9c1a520f496812bf8a5ca54672a6d3;p=platform%2Fupstream%2Fgstreamer.git videodecoder: Avoid pushing buffers before segment start In the case where the stream doesn't have a framerate set and the frames don't have a duration set, we still want to use the clipping path to make sure we don't push buffers outside of the segment. The problem was the previous iteration was setting a duration of 2s, which meant that any buffer which was less than 2s before the segment start would end up getting pushed. Instead, use a saner 40ms (25fps single frame duration) to figure out whether the frame could be within the segment or not --- diff --git a/gst-libs/gst/video/gstvideodecoder.c b/gst-libs/gst/video/gstvideodecoder.c index 8a74efe..623b307 100644 --- a/gst-libs/gst/video/gstvideodecoder.c +++ b/gst-libs/gst/video/gstvideodecoder.c @@ -3128,16 +3128,16 @@ gst_video_decoder_clip_and_push_buf (GstVideoDecoder * decoder, GstBuffer * buf) stop = start + duration; } else if (GST_CLOCK_TIME_IS_VALID (start) && !GST_CLOCK_TIME_IS_VALID (duration)) { - /* 2 second frame duration is rather unlikely... but if we don't clip - * away buffers that far before the segment we can cause the pipeline to - * lockup. This can happen if audio is properly clipped, and thus the - * audio sink does not preroll yet but the video sink prerolls because - * we already outputted a buffer here... and then queues run full. + /* If we don't clip away buffers that far before the segment we + * can cause the pipeline to lockup. This can happen if audio is + * properly clipped, and thus the audio sink does not preroll yet + * but the video sink prerolls because we already outputted a + * buffer here... and then queues run full. * * In the worst case we will clip one buffer too many here now if no * framerate is given, no buffer duration is given and the actual - * framerate is less than 0.5fps */ - stop = start + 2 * GST_SECOND; + * framerate is lower than 25fps */ + stop = start + 40 * GST_MSECOND; } segment = &decoder->output_segment;