v4l2bufferpool: Drop truncated frames
authorNicolas Dufresne <nicolas.dufresne@collabora.com>
Mon, 28 May 2018 19:19:52 +0000 (15:19 -0400)
committerNicolas Dufresne <nicolas.dufresne@collabora.com>
Thu, 7 Jun 2018 19:26:32 +0000 (15:26 -0400)
Drop truncated frames regardless if they have the ERROR flag or not.
Truncated frame causes video frame map failure in many elements
including cluttersink, glupload etc.

sys/v4l2/gstv4l2bufferpool.c

index c3a243b..a572293 100644 (file)
@@ -1747,6 +1747,10 @@ gst_v4l2_buffer_pool_process (GstV4l2BufferPool * pool, GstBuffer ** buf)
                 goto eos;
             }
 
+            if (GST_VIDEO_INFO_FORMAT (&pool->caps_info) !=
+                GST_VIDEO_FORMAT_ENCODED && size < pool->size)
+              goto buffer_truncated;
+
             num_queued = g_atomic_int_get (&pool->num_queued);
             GST_TRACE_OBJECT (pool, "Only %i buffer left in the capture queue.",
                 num_queued);
@@ -1984,6 +1988,14 @@ buffer_corrupted:
     *buf = NULL;
     return GST_V4L2_FLOW_CORRUPTED_BUFFER;
   }
+buffer_truncated:
+  {
+    GST_WARNING_OBJECT (pool,
+        "Dropping truncated buffer, this is likely a driver bug.");
+    gst_buffer_unref (*buf);
+    *buf = NULL;
+    return GST_V4L2_FLOW_CORRUPTED_BUFFER;
+  }
 eos:
   {
     GST_DEBUG_OBJECT (pool, "end of stream reached");