mxfvanc: Handle empty ANC essence
authorEdward Hervey <edward@centricular.com>
Mon, 21 Jun 2021 11:23:13 +0000 (13:23 +0200)
committerEdward Hervey <bilboed@bilboed.com>
Thu, 1 Jul 2021 09:04:03 +0000 (11:04 +0200)
Not having any *actual* ANC is totally fine and common usage with several MXF
variants.

In order to properly advance the streams, the essence handler returns an empty
GAP buffer which gets converted to a GST_EVENT_GAP.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2345>

gst/mxf/mxfdemux.c
gst/mxf/mxfvanc.c

index e5b6ed4..209887d 100644 (file)
@@ -2017,7 +2017,20 @@ gst_mxf_demux_handle_generic_container_essence_element (GstMXFDemux * demux,
       pad->discont = FALSE;
     }
 
-    ret = gst_pad_push (GST_PAD_CAST (pad), outbuf);
+    /* Handlers can provide empty GAP buffers to indicate that the parsed
+     * content was valid but that nothing meaningful needs to be outputted. In
+     * such cases we send out a GAP event instead */
+    if (GST_BUFFER_FLAG_IS_SET (outbuf, GST_BUFFER_FLAG_GAP) &&
+        gst_buffer_get_size (outbuf) == 0) {
+      GstEvent *gap = gst_event_new_gap (GST_BUFFER_DTS (outbuf),
+          GST_BUFFER_DURATION (outbuf));
+      gst_buffer_unref (outbuf);
+      GST_DEBUG_OBJECT (pad,
+          "Replacing empty gap buffer with gap event %" GST_PTR_FORMAT, gap);
+      gst_pad_push_event (GST_PAD_CAST (pad), gap);
+    } else {
+      ret = gst_pad_push (GST_PAD_CAST (pad), outbuf);
+    }
     outbuf = NULL;
     ret = gst_flow_combiner_update_flow (demux->flowcombiner, ret);
     GST_LOG_OBJECT (demux, "combined return %s", gst_flow_get_name (ret));
index 62a83d5..f934246 100644 (file)
@@ -116,7 +116,7 @@ mxf_vanc_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
     return GST_FLOW_ERROR;
   }
 
-  if (gst_buffer_get_size (buffer) < 18) {
+  if (gst_buffer_get_size (buffer) < 2) {
     GST_ERROR ("Invalid VANC essence element size");
     gst_buffer_unref (buffer);
     return GST_FLOW_ERROR;
@@ -126,6 +126,24 @@ mxf_vanc_handle_essence_element (const MXFUL * key, GstBuffer * buffer,
   gst_byte_reader_init (&reader, map.data, map.size);
 
   num_packets = gst_byte_reader_get_uint16_be_unchecked (&reader);
+  if (num_packets == 0) {
+    /* SMPTE 436-1:2013 5.5 The Number of VI Lines or ANC Packets Property
+     *
+     * One of the properties in the VI Element is the “Number of Lines” which is
+     * the number of the VI lines contained in this VI Element. This number can
+     * be zero if the current VI Element does not have any VI lines in the
+     * payload space. This capability can be used so every Content Package in a
+     * file can have a VI Element even if the video stream does not have VI
+     * lines with every frame (or field.)
+     *
+     * The same scheme can be used for ANC packets.
+     */
+
+    *outbuf = gst_buffer_new ();
+    GST_BUFFER_FLAG_SET (*outbuf, GST_BUFFER_FLAG_GAP);
+    ret = GST_FLOW_OK;
+    goto out;
+  }
   for (i = 0; i < num_packets; i++) {
     G_GNUC_UNUSED guint16 line_num;
     G_GNUC_UNUSED guint8 wrapping_type;