tsdemux: Allow access unit parsing failures
* Refactor the various Access Unit extraction calls into a single function * Allow the access unit parsing to fail, but emit a warning Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/9246>
This commit is contained in:
parent
a8d9bfdcf2
commit
bc0324f862
@ -3595,6 +3595,46 @@ error:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Extract Access Unit content in the format used by GStreamer */
|
||||||
|
static GstBuffer *
|
||||||
|
parse_access_unit (GstTSDemux * demux, TSDemuxStream * stream,
|
||||||
|
GstBufferList ** ret_buffer_list)
|
||||||
|
{
|
||||||
|
MpegTSBaseStream *bs = (MpegTSBaseStream *) stream;
|
||||||
|
GstBuffer *buffer = NULL;
|
||||||
|
GstBufferList *buffer_list = NULL;
|
||||||
|
|
||||||
|
if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_PRIVATE_PES_PACKETS &&
|
||||||
|
bs->registration_id == DRF_ID_OPUS) {
|
||||||
|
buffer_list = parse_opus_access_unit (stream);
|
||||||
|
} else if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_VIDEO_JP2K) {
|
||||||
|
buffer = parse_jp2k_access_unit (stream);
|
||||||
|
} else if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_AUDIO_AAC_ADTS) {
|
||||||
|
buffer = parse_aac_adts_frame (stream);
|
||||||
|
} else if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_METADATA_PES_PACKETS
|
||||||
|
&& bs->registration_id == DRF_ID_KLVA) {
|
||||||
|
buffer_list = parse_pes_metadata_frame (stream);
|
||||||
|
} else if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_VIDEO_JPEG_XS) {
|
||||||
|
buffer = parse_jpegxs_access_unit (stream);
|
||||||
|
} else {
|
||||||
|
buffer = gst_buffer_new_wrapped (stream->data, stream->current_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buffer_list != NULL && gst_buffer_list_length (buffer_list) == 1) {
|
||||||
|
buffer = gst_buffer_ref (gst_buffer_list_get (buffer_list, 0));
|
||||||
|
gst_buffer_list_unref (buffer_list);
|
||||||
|
buffer_list = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buffer == NULL && buffer_list == NULL) {
|
||||||
|
GST_WARNING_OBJECT (stream->pad, "Failed to extract access unit");
|
||||||
|
}
|
||||||
|
|
||||||
|
*ret_buffer_list = buffer_list;
|
||||||
|
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream,
|
gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream,
|
||||||
MpegTSBaseProgram * target_program)
|
MpegTSBaseProgram * target_program)
|
||||||
@ -3640,22 +3680,8 @@ gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream,
|
|||||||
"Got Keyframe, ready to go at %" GST_TIME_FORMAT,
|
"Got Keyframe, ready to go at %" GST_TIME_FORMAT,
|
||||||
GST_TIME_ARGS (stream->pts));
|
GST_TIME_ARGS (stream->pts));
|
||||||
|
|
||||||
if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_PRIVATE_PES_PACKETS &&
|
buffer = parse_access_unit (demux, stream, &buffer_list);
|
||||||
bs->registration_id == DRF_ID_OPUS) {
|
|
||||||
buffer_list = parse_opus_access_unit (stream);
|
|
||||||
} else if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_VIDEO_JP2K) {
|
|
||||||
buffer = parse_jp2k_access_unit (stream);
|
|
||||||
} else if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_METADATA_PES_PACKETS
|
|
||||||
&& bs->registration_id == DRF_ID_KLVA) {
|
|
||||||
buffer_list = parse_pes_metadata_frame (stream);
|
|
||||||
} else if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_VIDEO_JPEG_XS) {
|
|
||||||
buffer = parse_jpegxs_access_unit (stream);
|
|
||||||
} else {
|
|
||||||
buffer = gst_buffer_new_wrapped (stream->data, stream->current_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (buffer == NULL && buffer_list == NULL) {
|
if (buffer == NULL && buffer_list == NULL) {
|
||||||
res = GST_FLOW_ERROR;
|
|
||||||
goto beach;
|
goto beach;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3690,23 +3716,9 @@ gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream,
|
|||||||
goto beach;
|
goto beach;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_PRIVATE_PES_PACKETS &&
|
buffer = parse_access_unit (demux, stream, &buffer_list);
|
||||||
bs->registration_id == DRF_ID_OPUS) {
|
|
||||||
buffer_list = parse_opus_access_unit (stream);
|
|
||||||
} else if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_VIDEO_JP2K) {
|
|
||||||
buffer = parse_jp2k_access_unit (stream);
|
|
||||||
} else if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_AUDIO_AAC_ADTS) {
|
|
||||||
buffer = parse_aac_adts_frame (stream);
|
|
||||||
} else if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_METADATA_PES_PACKETS
|
|
||||||
&& bs->registration_id == DRF_ID_KLVA) {
|
|
||||||
buffer_list = parse_pes_metadata_frame (stream);
|
|
||||||
} else if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_VIDEO_JPEG_XS) {
|
|
||||||
buffer = parse_jpegxs_access_unit (stream);
|
|
||||||
} else {
|
|
||||||
buffer = gst_buffer_new_wrapped (stream->data, stream->current_size);
|
|
||||||
}
|
|
||||||
if (buffer == NULL && buffer_list == NULL) {
|
if (buffer == NULL && buffer_list == NULL) {
|
||||||
res = GST_FLOW_ERROR;
|
|
||||||
goto beach;
|
goto beach;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3738,13 +3750,6 @@ gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (buffer_list != NULL && gst_buffer_list_length (buffer_list) == 1) {
|
|
||||||
buffer = gst_buffer_ref (gst_buffer_list_get (buffer_list, 0));
|
|
||||||
gst_buffer_list_unref (buffer_list);
|
|
||||||
buffer_list = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (G_UNLIKELY (stream->need_newsegment))
|
if (G_UNLIKELY (stream->need_newsegment))
|
||||||
calculate_and_push_newsegment (demux, stream, target_program);
|
calculate_and_push_newsegment (demux, stream, target_program);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user