From: Benjamin Gaignard Date: Wed, 8 Jun 2022 13:44:26 +0000 (+0200) Subject: codecs: h265: Make sure that sps is processed just before decoding X-Git-Tag: 1.22.0~1231 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8ec0dca73bf785d068a522e68c21cca3e2c489da;p=platform%2Fupstream%2Fgstreamer.git codecs: h265: Make sure that sps is processed just before decoding It may happens that bitstream doesn't provided SPS in decoding order (like in VPSSPSPPS_A_MainConcept_1 conformance test file). To be sure that the decoder got the correct SPS parameters process SPS just before start decoding the frame. Part-of: --- 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 28337cf..1514d22 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/codecs/gsth265decoder.c +++ b/subprojects/gst-plugins-bad/gst-libs/gst/codecs/gsth265decoder.c @@ -757,6 +757,15 @@ gst_h265_decoder_process_slice (GstH265Decoder * self, GstH265Slice * slice) if (ret != GST_FLOW_OK) return ret; + /* The used SPS may not be the latest parsed one, make + * sure we have updated it before decode the frame */ + ret = gst_h265_decoder_process_sps (self, + priv->current_slice.header.pps->sps); + if (ret != GST_FLOW_OK) { + GST_WARNING_OBJECT (self, "Failed to process sps"); + return ret; + } + priv->active_pps = priv->current_slice.header.pps; priv->active_sps = priv->active_pps->sps; @@ -932,10 +941,10 @@ static GstFlowReturn gst_h265_decoder_decode_nalu (GstH265Decoder * self, GstH265DecoderNalUnit * nalu) { - if (!nalu->is_slice) - return gst_h265_decoder_process_sps (self, &nalu->unit.sps); + if (nalu->is_slice) + return gst_h265_decoder_process_slice (self, &nalu->unit.slice); - return gst_h265_decoder_process_slice (self, &nalu->unit.slice); + return GST_FLOW_OK; } static void @@ -991,7 +1000,6 @@ gst_h265_decoder_parse_codec_data (GstH265Decoder * self, const guint8 * data, guint num_nals, i, j; GstH265ParserResult pres; GstH265NalUnit nalu; - GstFlowReturn ret = GST_FLOW_OK; GstH265VPS vps; GstH265SPS sps; GstH265PPS pps; @@ -1044,12 +1052,6 @@ gst_h265_decoder_parse_codec_data (GstH265Decoder * self, const guint8 * data, GST_WARNING_OBJECT (self, "Failed to parse SPS"); return GST_FLOW_ERROR; } - - ret = gst_h265_decoder_process_sps (self, &sps); - if (ret != GST_FLOW_OK) { - GST_WARNING_OBJECT (self, "Failed to process SPS"); - return ret; - } break; case GST_H265_NAL_PPS: pres = gst_h265_parser_parse_pps (priv->parser, &nalu, &pps);