mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-19 00:01:23 +00:00
mxfvanc: Handle empty ANC essence
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>
This commit is contained in:
parent
d9c486352c
commit
162e7bd28b
2 changed files with 33 additions and 2 deletions
|
@ -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));
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue