From 270888abb12b2181ff84071f2c2685bd196de6fe Mon Sep 17 00:00:00 2001 From: Marcus Wichelmann Date: Thu, 15 Feb 2024 07:10:23 +0100 Subject: [PATCH] fix: set array_completeness in HEVCDecoderConfigurationRecord correctly (#975) ISO/IEC 14496-15 says about the `HEVCDecoderConfigurationRecord`: > **array_completeness** when equal to 1 indicates that all NAL units of > the given type are in the following array and none are in the stream; > when equal to 0 indicates that additional NAL units of the indicated type > may be in the stream; the default and permitted values are constrained > by the sample entry name; This PR sets `array_completeness` to 0 if parameter NAL units may appear in the stream when they are not stripped by `--strip_parameter_set_nalus`. This should increase player-compatibiltity for streams with mid-stream SAR changes. --------- Co-authored-by: Cosmin Stejerean --- .../codecs/h265_byte_to_unit_stream_converter.cc | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packager/media/codecs/h265_byte_to_unit_stream_converter.cc b/packager/media/codecs/h265_byte_to_unit_stream_converter.cc index 1c177a8d5e9..3235b0a0cae 100644 --- a/packager/media/codecs/h265_byte_to_unit_stream_converter.cc +++ b/packager/media/codecs/h265_byte_to_unit_stream_converter.cc @@ -74,21 +74,24 @@ bool H265ByteToUnitStreamConverter::GetDecoderConfigurationRecord( buffer.AppendInt(static_cast(kUnitStreamNaluLengthSize - 1)); buffer.AppendInt(static_cast(3) /* numOfArrays */); + // More parameter set NALUs may follow when strip_parameter_set_nalus is + // disabled. + const uint8_t array_completeness = strip_parameter_set_nalus() ? 0x80 : 0; + // VPS - const uint8_t kArrayCompleteness = 0x80; - buffer.AppendInt(static_cast(kArrayCompleteness | Nalu::H265_VPS)); + buffer.AppendInt(static_cast(array_completeness | Nalu::H265_VPS)); buffer.AppendInt(static_cast(1) /* numNalus */); buffer.AppendInt(static_cast(last_vps_.size())); buffer.AppendVector(last_vps_); // SPS - buffer.AppendInt(static_cast(kArrayCompleteness | Nalu::H265_SPS)); + buffer.AppendInt(static_cast(array_completeness | Nalu::H265_SPS)); buffer.AppendInt(static_cast(1) /* numNalus */); buffer.AppendInt(static_cast(last_sps_.size())); buffer.AppendVector(last_sps_); // PPS - buffer.AppendInt(static_cast(kArrayCompleteness | Nalu::H265_PPS)); + buffer.AppendInt(static_cast(array_completeness | Nalu::H265_PPS)); buffer.AppendInt(static_cast(1) /* numNalus */); buffer.AppendInt(static_cast(last_pps_.size())); buffer.AppendVector(last_pps_);