diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java b/library/common/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java index 4b267e0bfa..a911e939e5 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/NalUnitUtil.java @@ -292,11 +292,24 @@ public final class NalUnitUtil { } /** - * Parses a SPS NAL unit payload using the syntax defined in ITU-T Recommendation H.264 (2013) + * Parses a SPS NAL unit using the syntax defined in ITU-T Recommendation H.264 (2013) subsection + * 7.3.2.1.1. + * + * @param nalData A buffer containing escaped SPS data. + * @param nalOffset The offset of the NAL unit header in {@code nalData}. + * @param nalLimit The limit of the NAL unit in {@code nalData}. + * @return A parsed representation of the SPS data. + */ + public static SpsData parseSpsNalUnit(byte[] nalData, int nalOffset, int nalLimit) { + return parseSpsNalUnitPayload(nalData, nalOffset + 1, nalLimit); + } + + /** + * Parses a SPS NAL unit payload (excluding the NAL unit header) using the syntax defined in ITU-T Recommendation H.264 (2013) * subsection 7.3.2.1.1. * * @param nalData A buffer containing escaped SPS data. - * @param nalOffset The offset of the NAL unit in {@code nalData}. + * @param nalOffset The offset of the NAL unit payload in {@code nalData}. * @param nalLimit The limit of the NAL unit in {@code nalData}. * @return A parsed representation of the SPS data. */ @@ -426,11 +439,24 @@ public final class NalUnitUtil { } /** - * Parses a H.265 SPS NAL unit payload using the syntax defined in ITU-T Recommendation H.265 (2019) + * Parses a H.265 SPS NAL unit using the syntax defined in ITU-T Recommendation H.265 (2019) * subsection 7.3.2.2.1. * * @param nalData A buffer containing escaped SPS data. - * @param nalOffset The offset of the NAL unit in {@code nalData}. + * @param nalOffset The offset of the NAL unit header in {@code nalData}. + * @param nalLimit The limit of the NAL unit in {@code nalData}. + * @return A parsed representation of the SPS data. + */ + public static H265SpsData parseH265SpsNalUnit(byte[] nalData, int nalOffset, int nalLimit) { + return parseH265SpsNalUnitPayload(nalData, nalOffset + 1, nalLimit); + } + + /** + * Parses a H.265 SPS NAL unit payload (excluding the NAL unit header) using the syntax defined in ITU-T Recommendation H.265 (2019) + * subsection 7.3.2.2.1. + * + * @param nalData A buffer containing escaped SPS data. + * @param nalOffset The offset of the NAL unit payload in {@code nalData}. * @param nalLimit The limit of the NAL unit in {@code nalData}. * @return A parsed representation of the SPS data. */ @@ -576,11 +602,24 @@ public final class NalUnitUtil { } /** - * Parses a PPS NAL unit payload using the syntax defined in ITU-T Recommendation H.264 (2013) + * Parses a PPS NAL unit using the syntax defined in ITU-T Recommendation H.264 (2013) subsection + * 7.3.2.2. + * + * @param nalData A buffer containing escaped PPS data. + * @param nalOffset The offset of the NAL unit header in {@code nalData}. + * @param nalLimit The limit of the NAL unit in {@code nalData}. + * @return A parsed representation of the PPS data. + */ + public static PpsData parsePpsNalUnit(byte[] nalData, int nalOffset, int nalLimit) { + return parsePpsNalUnitPayload(nalData, nalOffset + 1, nalLimit); + } + + /** + * Parses a PPS NAL unit payload (excluding the NAL unit header) using the syntax defined in ITU-T Recommendation H.264 (2013) * subsection 7.3.2.2. * * @param nalData A buffer containing escaped PPS data. - * @param nalOffset The offset of the NAL unit in {@code nalData}. + * @param nalOffset The offset of the NAL unit payload in {@code nalData}. * @param nalLimit The limit of the NAL unit in {@code nalData}. * @return A parsed representation of the PPS data. */ diff --git a/library/common/src/test/java/com/google/android/exoplayer2/util/NalUnitUtilTest.java b/library/common/src/test/java/com/google/android/exoplayer2/util/NalUnitUtilTest.java index 1d202c6eb6..4d9fc89a03 100644 --- a/library/common/src/test/java/com/google/android/exoplayer2/util/NalUnitUtilTest.java +++ b/library/common/src/test/java/com/google/android/exoplayer2/util/NalUnitUtilTest.java @@ -33,7 +33,7 @@ public final class NalUnitUtilTest { createByteArray( 0x00, 0x00, 0x01, 0x67, 0x4D, 0x40, 0x16, 0xEC, 0xA0, 0x50, 0x17, 0xFC, 0xB8, 0x08, 0x80, 0x00, 0x00, 0x03, 0x00, 0x80, 0x00, 0x00, 0x0F, 0x47, 0x8B, 0x16, 0xCB); - private static final int SPS_TEST_DATA_OFFSET = 4; + private static final int SPS_TEST_DATA_OFFSET = 3; @Test public void findNalUnit() { @@ -121,10 +121,9 @@ public final class NalUnitUtilTest { } @Test - public void parseSpsNalUnitPayload() { + public void parseSpsNalUnit() { NalUnitUtil.SpsData data = - NalUnitUtil.parseSpsNalUnitPayload( - SPS_TEST_DATA, SPS_TEST_DATA_OFFSET, SPS_TEST_DATA.length); + NalUnitUtil.parseSpsNalUnit(SPS_TEST_DATA, SPS_TEST_DATA_OFFSET, SPS_TEST_DATA.length); assertThat(data.width).isEqualTo(640); assertThat(data.height).isEqualTo(360); assertThat(data.deltaPicOrderAlwaysZeroFlag).isFalse(); diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H264Reader.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H264Reader.java index 8bdc00cc65..6790747ac9 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H264Reader.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H264Reader.java @@ -200,8 +200,8 @@ public final class H264Reader implements ElementaryStreamReader { List initializationData = new ArrayList<>(); initializationData.add(Arrays.copyOf(sps.nalData, sps.nalLength)); initializationData.add(Arrays.copyOf(pps.nalData, pps.nalLength)); - NalUnitUtil.SpsData spsData = NalUnitUtil.parseSpsNalUnitPayload(sps.nalData, 4, sps.nalLength); - NalUnitUtil.PpsData ppsData = NalUnitUtil.parsePpsNalUnitPayload(pps.nalData, 4, pps.nalLength); + NalUnitUtil.SpsData spsData = NalUnitUtil.parseSpsNalUnit(sps.nalData, 3, sps.nalLength); + NalUnitUtil.PpsData ppsData = NalUnitUtil.parsePpsNalUnit(pps.nalData, 3, pps.nalLength); String codecs = CodecSpecificDataUtil.buildAvcCodecString( spsData.profileIdc, @@ -224,11 +224,11 @@ public final class H264Reader implements ElementaryStreamReader { pps.reset(); } } else if (sps.isCompleted()) { - NalUnitUtil.SpsData spsData = NalUnitUtil.parseSpsNalUnitPayload(sps.nalData, 4, sps.nalLength); + NalUnitUtil.SpsData spsData = NalUnitUtil.parseSpsNalUnit(sps.nalData, 3, sps.nalLength); sampleReader.putSps(spsData); sps.reset(); } else if (pps.isCompleted()) { - NalUnitUtil.PpsData ppsData = NalUnitUtil.parsePpsNalUnitPayload(pps.nalData, 4, pps.nalLength); + NalUnitUtil.PpsData ppsData = NalUnitUtil.parsePpsNalUnit(pps.nalData, 3, pps.nalLength); sampleReader.putPps(ppsData); pps.reset(); } diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/video/AvcConfig.java b/library/extractor/src/main/java/com/google/android/exoplayer2/video/AvcConfig.java index 8f46a4afb7..a6c5577749 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/video/AvcConfig.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/video/AvcConfig.java @@ -66,8 +66,9 @@ public final class AvcConfig { @Nullable String codecs = null; if (numSequenceParameterSets > 0) { byte[] sps = initializationData.get(0); - SpsData spsData = NalUnitUtil.parseSpsNalUnitPayload(sps, - nalUnitLengthFieldLength + 1, sps.length); + SpsData spsData = + NalUnitUtil.parseSpsNalUnit( + initializationData.get(0), nalUnitLengthFieldLength, sps.length); width = spsData.width; height = spsData.height; pixelWidthAspectRatio = spsData.pixelWidthAspectRatio; diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/video/HevcConfig.java b/library/extractor/src/main/java/com/google/android/exoplayer2/video/HevcConfig.java index a29b17fda1..87ee8fa359 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/video/HevcConfig.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/video/HevcConfig.java @@ -78,8 +78,8 @@ public final class HevcConfig { data.getData(), data.getPosition(), buffer, bufferPosition, nalUnitLength); if (nalUnitType == SPS_NAL_UNIT_TYPE && j == 0) { NalUnitUtil.H265SpsData spsData = - NalUnitUtil.parseH265SpsNalUnitPayload( - buffer, bufferPosition + 1, bufferPosition + nalUnitLength); + NalUnitUtil.parseH265SpsNalUnit( + buffer, bufferPosition, bufferPosition + nalUnitLength); width = spsData.picWidthInLumaSamples; height = spsData.picHeightInLumaSamples; pixelWidthAspectRatio = spsData.pixelWidthHeightRatio; diff --git a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaTrack.java b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaTrack.java index 5fef4ce231..2f6a3c3c01 100644 --- a/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaTrack.java +++ b/library/rtsp/src/main/java/com/google/android/exoplayer2/source/rtsp/RtspMediaTrack.java @@ -183,8 +183,8 @@ import com.google.common.collect.ImmutableMap; // Process SPS (Sequence Parameter Set). byte[] spsNalDataWithStartCode = initializationData.get(0); NalUnitUtil.SpsData spsData = - NalUnitUtil.parseSpsNalUnitPayload( - spsNalDataWithStartCode, NAL_START_CODE.length + 1, spsNalDataWithStartCode.length); + NalUnitUtil.parseSpsNalUnit( + spsNalDataWithStartCode, NAL_START_CODE.length, spsNalDataWithStartCode.length); formatBuilder.setPixelWidthHeightRatio(spsData.pixelWidthAspectRatio); formatBuilder.setHeight(spsData.height); formatBuilder.setWidth(spsData.width);