rpicamsrc: Set outgoing buffer durations based on negotiated framerate.
authorJan Schmidt <jan@centricular.com>
Sat, 8 Oct 2016 11:12:09 +0000 (11:12 +0000)
committerTim-Philipp Müller <tim@centricular.com>
Fri, 10 Jul 2020 15:45:53 +0000 (16:45 +0100)
make sure outgoing buffers have at least some duration set,
otherwise it leads to strange situations, like qtmux writing
out a file that doesn't include the final frame inside the
playable segment, because no-duration = 0 duration there.

sys/rpicamsrc/gstrpicamsrc.c
sys/rpicamsrc/gstrpicamsrc.h

index a9cf7cd..8712c21 100644 (file)
@@ -1342,6 +1342,13 @@ gst_rpi_cam_src_set_caps (GstBaseSrc * bsrc, GstCaps * caps)
   src->capture_config.height = info.height;
   src->capture_config.fps_n = info.fps_n;
   src->capture_config.fps_d = info.fps_d;
+
+  if (info.fps_n != 0 && info.fps_d != 0)
+    src->duration = gst_util_uint64_scale_int (GST_SECOND, info.fps_d,
+                        info.fps_n);
+  else
+    src->duration = GST_CLOCK_TIME_NONE;
+
   return TRUE;
 }
 
@@ -1407,9 +1414,11 @@ gst_rpi_cam_src_create (GstPushSrc * parent, GstBuffer ** buf)
 
   /* FIXME: Use custom allocator */
   ret = raspi_capture_fill_buffer (src->capture_state, buf, clock, base_time);
-  if (*buf)
+  if (*buf) {
     GST_LOG_OBJECT (src, "Made buffer of size %" G_GSIZE_FORMAT,
         gst_buffer_get_size (*buf));
+    GST_BUFFER_DURATION (*buf) = src->duration;
+  }
 
   if (clock)
     gst_object_unref (clock);
index 6675f88..68fdc18 100644 (file)
@@ -86,6 +86,8 @@ struct _GstRpiCamSrc
 #ifdef GST_RPI_CAM_SRC_ENABLE_VIDEO_DIRECTION
   GstVideoOrientationMethod orientation;
 #endif
+
+  GstClockTime duration;
 };
 
 struct _GstRpiCamSrcClass