videodecoder: Avoid pushing buffers before segment start
authorEdward Hervey <edward@centricular.com>
Thu, 3 Dec 2015 15:38:45 +0000 (16:38 +0100)
committerEdward Hervey <bilboed@bilboed.com>
Thu, 3 Dec 2015 15:42:50 +0000 (16:42 +0100)
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

gst-libs/gst/video/gstvideodecoder.c

index 8a74efe..623b307 100644 (file)
@@ -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;