v4l2codecs: Detect missing M2M_HOLD_CAPTURE_BUF
authorNicolas Dufresne <nicolas.dufresne@collabora.com>
Wed, 23 Mar 2022 14:36:28 +0000 (10:36 -0400)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Fri, 25 Mar 2022 21:40:28 +0000 (21:40 +0000)
Produce an error if we try to use the feature of holding capture buffer
but it is not supported by the driver. Ingoring this can lead to stalls
as the driver will run-out of capture buffer to decode into. This
affects slice decoders but also split-field interlaced decoding.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2009>

subprojects/gst-plugins-bad/sys/v4l2codecs/gstv4l2decoder.c

index a024c9682f6822b495a611e707fabdcfe21d3867..7f7b3f98dfd62c72c2a600f0e0cf4055e33c0d8f 100644 (file)
@@ -87,6 +87,9 @@ struct _GstV4l2Decoder
   gchar *media_device;
   gchar *video_device;
   guint render_delay;
+
+  /* detected features */
+  gboolean supports_holding_capture;
 };
 
 G_DEFINE_TYPE_WITH_CODE (GstV4l2Decoder, gst_v4l2_decoder, GST_TYPE_OBJECT,
@@ -488,6 +491,13 @@ gst_v4l2_decoder_request_buffers (GstV4l2Decoder * self,
     return ret;
   }
 
+  if (direction == GST_PAD_SINK) {
+    if (reqbufs.capabilities & V4L2_BUF_CAP_SUPPORTS_M2M_HOLD_CAPTURE_BUF)
+      self->supports_holding_capture = TRUE;
+    else
+      self->supports_holding_capture = FALSE;
+  }
+
   return reqbufs.count;
 }
 
@@ -1086,6 +1096,15 @@ gst_v4l2_request_queue (GstV4l2Request * request, guint flags)
 
   GST_TRACE_OBJECT (decoder, "Queuing request %i.", request->fd);
 
+  /* this would lead to stalls if we tried to use this feature and it wasn't
+   * supported. */
+  if ((flags & V4L2_BUF_FLAG_M2M_HOLD_CAPTURE_BUF)
+      && !decoder->supports_holding_capture) {
+    GST_ERROR_OBJECT (decoder,
+        "Driver does not support holding capture buffer.");
+    return FALSE;
+  }
+
   if (!gst_v4l2_decoder_queue_sink_mem (decoder, request,
           request->bitstream, request->frame_num, flags)) {
     GST_ERROR_OBJECT (decoder, "Driver did not accept the bitstream data.");