diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/codecs/gsth265decoder.c b/subprojects/gst-plugins-bad/gst-libs/gst/codecs/gsth265decoder.c index 201cc6b8c5..6b5e28839e 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/codecs/gsth265decoder.c +++ b/subprojects/gst-plugins-bad/gst-libs/gst/codecs/gsth265decoder.c @@ -1002,80 +1002,66 @@ gst_h265_decoder_parse_codec_data (GstH265Decoder * self, const guint8 * data, gsize size) { GstH265DecoderPrivate *priv = self->priv; - guint num_nal_arrays; - guint off; - guint num_nals, i, j; + GstH265Parser *parser = priv->parser; GstH265ParserResult pres; - GstH265NalUnit nalu; + GstFlowReturn ret = GST_FLOW_ERROR; GstH265VPS vps; GstH265SPS sps; GstH265PPS pps; + GstH265DecoderConfigRecord *config = NULL; + guint i, j; - /* parse the hvcC data */ - if (size < 23) { - GST_WARNING_OBJECT (self, "hvcC too small"); + pres = gst_h265_parser_parse_decoder_config_record (parser, + data, size, &config); + if (pres != GST_H265_PARSER_OK) { + GST_WARNING_OBJECT (self, "Failed to parse hvcC data"); return GST_FLOW_ERROR; } - /* wrong hvcC version */ - if (data[0] != 0 && data[0] != 1) { - return GST_FLOW_ERROR; - } - - priv->nal_length_size = (data[21] & 0x03) + 1; + priv->nal_length_size = config->length_size_minus_one + 1; GST_DEBUG_OBJECT (self, "nal length size %u", priv->nal_length_size); - num_nal_arrays = data[22]; - off = 23; + for (i = 0; i < config->nalu_array->len; i++) { + GstH265DecoderConfigRecordNalUnitArray *array = + &g_array_index (config->nalu_array, + GstH265DecoderConfigRecordNalUnitArray, i); - for (i = 0; i < num_nal_arrays; i++) { - if (off + 3 >= size) { - GST_WARNING_OBJECT (self, "hvcC too small"); - return GST_FLOW_ERROR; - } + for (j = 0; j < array->nalu->len; j++) { + GstH265NalUnit *nalu = &g_array_index (array->nalu, GstH265NalUnit, j); - num_nals = GST_READ_UINT16_BE (data + off + 1); - off += 3; - for (j = 0; j < num_nals; j++) { - pres = gst_h265_parser_identify_nalu_hevc (priv->parser, - data, off, size, 2, &nalu); - - if (pres != GST_H265_PARSER_OK) { - GST_WARNING_OBJECT (self, "hvcC too small"); - return GST_FLOW_ERROR; - } - - switch (nalu.type) { + switch (nalu->type) { case GST_H265_NAL_VPS: - pres = gst_h265_parser_parse_vps (priv->parser, &nalu, &vps); + pres = gst_h265_parser_parse_vps (parser, nalu, &vps); if (pres != GST_H265_PARSER_OK) { GST_WARNING_OBJECT (self, "Failed to parse VPS"); - return GST_FLOW_ERROR; + goto out; } break; case GST_H265_NAL_SPS: - pres = gst_h265_parser_parse_sps (priv->parser, &nalu, &sps, TRUE); + pres = gst_h265_parser_parse_sps (parser, nalu, &sps, TRUE); if (pres != GST_H265_PARSER_OK) { GST_WARNING_OBJECT (self, "Failed to parse SPS"); - return GST_FLOW_ERROR; + goto out; } break; case GST_H265_NAL_PPS: - pres = gst_h265_parser_parse_pps (priv->parser, &nalu, &pps); + pres = gst_h265_parser_parse_pps (parser, nalu, &pps); if (pres != GST_H265_PARSER_OK) { GST_WARNING_OBJECT (self, "Failed to parse PPS"); - return GST_FLOW_ERROR; + goto out; } break; default: break; } - - off = nalu.offset + nalu.size; } } - return GST_FLOW_OK; + ret = GST_FLOW_OK; + +out: + gst_h265_decoder_config_record_free (config); + return ret; } static gboolean