h264parse: Require codec_data when receiving stream-format=avc or avc3

It's not really possible to safely interpret the content afterwards if
it's missing.

Even for AVC3, the codec_data doesn't need to contain a SPS/PPS, but
it still needs to be present to tell downstream elements about the size
of the nal unit length field.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8955>
This commit is contained in:
Olivier Crête 2025-05-08 19:20:13 -04:00
parent ffed473992
commit f13c757696

View File

@ -3692,8 +3692,9 @@ gst_h264_parse_set_caps (GstBaseParse * parse, GstCaps * caps)
} }
/* avc caps sanity checks */ /* avc caps sanity checks */
if (format == GST_H264_PARSE_FORMAT_AVC) { if (format == GST_H264_PARSE_FORMAT_AVC ||
/* AVC requires codec_data, AVC3 might have one and/or SPS/PPS inline */ format == GST_H264_PARSE_FORMAT_AVC3) {
/* AVC and AVC3 requires codec_data */
if (codec_data_value == NULL) if (codec_data_value == NULL)
goto avc_caps_codec_data_missing; goto avc_caps_codec_data_missing;
@ -3711,7 +3712,7 @@ gst_h264_parse_set_caps (GstBaseParse * parse, GstCaps * caps)
goto bytestream_caps_with_codec_data; goto bytestream_caps_with_codec_data;
} }
/* packetized video has codec_data (required for AVC, optional for AVC3) */ /* packetized video has codec_data (required for AVC and AVC3) */
if (codec_data_value != NULL) { if (codec_data_value != NULL) {
GstMapInfo map; GstMapInfo map;
guint i; guint i;
@ -3772,7 +3773,8 @@ gst_h264_parse_set_caps (GstBaseParse * parse, GstCaps * caps)
/* we have 4 sync bytes */ /* we have 4 sync bytes */
h264parse->nal_length_size = 4; h264parse->nal_length_size = 4;
} else { } else {
/* probably AVC3 without codec_data field, anything to do here? */ /* probably avc1 or avc3 without codec_data field, its invalid */
goto codec_data_missing;
} }
{ {
@ -3834,6 +3836,12 @@ avcC_failed:
GST_DEBUG_OBJECT (h264parse, "Failed to parse avcC data"); GST_DEBUG_OBJECT (h264parse, "Failed to parse avcC data");
goto refuse_caps; goto refuse_caps;
} }
codec_data_missing:
{
GST_WARNING_OBJECT (h264parse, "Is not bytestream and lacks codec_data,"
" invalid caps: %" GST_PTR_FORMAT, caps);
goto refuse_caps;
}
refuse_caps: refuse_caps:
{ {
GST_WARNING_OBJECT (h264parse, "refused caps %" GST_PTR_FORMAT, caps); GST_WARNING_OBJECT (h264parse, "refused caps %" GST_PTR_FORMAT, caps);