v4l2videodec: only set latency if the frame duration is valid
authorPhilipp Zabel <p.zabel@pengutronix.de>
Wed, 16 Mar 2016 15:24:55 +0000 (16:24 +0100)
committerNicolas Dufresne <nicolas.dufresne@collabora.com>
Wed, 5 Apr 2017 13:20:19 +0000 (09:20 -0400)
If the duration of the v4l2object is GST_CLOCK_TIME_NONE, because the
sink did not specify a framerate in the caps and the driver accepts the
framerate, the decoder element uses GST_CLOCK_TIME_NONE to calculate and
set the element latency.

While this is a bug of the capture driver, the decoder element should
not use the invalid duration to calculate a latency, but print a warning
instead.

https://bugzilla.gnome.org/show_bug.cgi?id=779466

sys/v4l2/gstv4l2videodec.c

index d148b66..8f713b6 100644 (file)
@@ -752,8 +752,14 @@ gst_v4l2_video_dec_decide_allocation (GstVideoDecoder * decoder,
     ret = GST_VIDEO_DECODER_CLASS (parent_class)->decide_allocation (decoder,
         query);
 
-  latency = self->v4l2capture->min_buffers * self->v4l2capture->duration;
-  gst_video_decoder_set_latency (decoder, latency, latency);
+  if (GST_CLOCK_TIME_IS_VALID (self->v4l2capture->duration)) {
+    GST_DEBUG_OBJECT (self, "Setting latency: %u * %llu",
+        self->v4l2capture->min_buffers, self->v4l2capture->duration);
+    latency = self->v4l2capture->min_buffers * self->v4l2capture->duration;
+    gst_video_decoder_set_latency (decoder, latency, latency);
+  } else {
+    GST_WARNING_OBJECT (self, "Duration invalid, not setting latency");
+  }
 
   return ret;
 }