diff --git a/RELEASENOTES.md b/RELEASENOTES.md index bdd493a9ef3..7a7eaaba555 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -118,6 +118,8 @@ costly on large files. * MP4: Store the Android capture frame rate only in `Format.metadata`. `Format.frameRate` now stores the calculated frame rate. +* MPEG-TS: Fix issue where SEI NAL units were incorrectly dropped from H.265 + samples ([#7113](https://github.com/google/ExoPlayer/issues/7113)). * Testing * Add `TestExoPlayer`, a utility class with APIs to create `SimpleExoPlayer` instances with fake components for testing. diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H265Reader.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H265Reader.java index 11938ed3949..c356b1c9871 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H265Reader.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/H265Reader.java @@ -47,6 +47,7 @@ public final class H265Reader implements ElementaryStreamReader { private static final int VPS_NUT = 32; private static final int SPS_NUT = 33; private static final int PPS_NUT = 34; + private static final int AUD_NUT = 35; private static final int PREFIX_SEI_NUT = 39; private static final int SUFFIX_SEI_NUT = 40; @@ -472,7 +473,7 @@ public void startNalUnit( } } - // Look for the flag if this NAL unit contains a slice_segment_layer_rbsp. + // Look for the first slice flag if this NAL unit contains a slice_segment_layer_rbsp. nalUnitHasKeyframeData = (nalUnitType >= BLA_W_LP && nalUnitType <= CRA_NUT); lookingForFirstSliceFlag = nalUnitHasKeyframeData || nalUnitType <= RASL_R; } @@ -516,14 +517,12 @@ private void outputSample(int offset) { /** Returns whether a NAL unit type is one that occurs before any VCL NAL units in a sample. */ private static boolean isPrefixNalUnit(int nalUnitType) { - // TODO: Include AUD_NUT and PREFIX_SEI_NUT - return VPS_NUT <= nalUnitType && nalUnitType <= PPS_NUT; + return (VPS_NUT <= nalUnitType && nalUnitType <= AUD_NUT) || nalUnitType == PREFIX_SEI_NUT; } /** Returns whether a NAL unit type is one that occurs in the VLC body of a sample. */ private static boolean isVclBodyNalUnit(int nalUnitType) { - // TODO: Include SUFFIX_SEI_NUT - return nalUnitType < VPS_NUT; + return nalUnitType < VPS_NUT || nalUnitType == SUFFIX_SEI_NUT; } } } diff --git a/testdata/src/test/assets/ts/sample_h265.ts.0.dump b/testdata/src/test/assets/ts/sample_h265.ts.0.dump index 1c06207b750..cee71dd25a8 100644 --- a/testdata/src/test/assets/ts/sample_h265.ts.0.dump +++ b/testdata/src/test/assets/ts/sample_h265.ts.0.dump @@ -19,119 +19,119 @@ track 256: sample 0: time = 66666 flags = 1 - data = length 2510, hash 796A98BE + data = length 2517, hash 85352308 sample 1: time = 100000 flags = 0 - data = length 1219, hash 131AA4E4 + data = length 1226, hash 11D564DA sample 2: time = 266666 flags = 0 - data = length 7810, hash 3F881DB9 + data = length 7817, hash 50D15703 sample 3: time = 200000 flags = 0 - data = length 2306, hash 9A77959C + data = length 2313, hash ECA5AEE6 sample 4: time = 133333 flags = 0 - data = length 1058, hash B887F7EF + data = length 1065, hash 8720A939 sample 5: time = 166666 flags = 0 - data = length 98, hash D95BF6E3 + data = length 105, hash 3A3A582D sample 6: time = 233333 flags = 0 - data = length 61, hash 574C41C3 + data = length 68, hash FC241239 sample 7: time = 433333 flags = 0 - data = length 296, hash E92DB288 + data = length 303, hash 41B28452 sample 8: time = 366666 flags = 0 - data = length 137, hash 586DADD6 + data = length 144, hash 60BBCD4C sample 9: time = 300000 flags = 0 - data = length 218, hash 91E82C9F + data = length 225, hash E0FAD7E9 sample 10: time = 333333 flags = 0 - data = length 177, hash 4A4FEEC0 + data = length 184, hash A3A6E036 sample 11: time = 400000 flags = 0 - data = length 82, hash 2E2ADD8 + data = length 89, hash 43B0E322 sample 12: time = 533333 flags = 0 - data = length 290, hash 63CF7D90 + data = length 297, hash 6D9FEEDA sample 13: time = 500000 flags = 0 - data = length 268, hash E8CBAC11 + data = length 275, hash 27430DB sample 14: time = 466666 flags = 0 - data = length 178, hash C5B1613E + data = length 185, hash 97389E88 sample 15: time = 566666 flags = 0 - data = length 271, hash 76652FC5 + data = length 278, hash 5819FEBB sample 16: time = 733333 flags = 0 - data = length 257, hash 960B5DF4 + data = length 264, hash 8545F36A sample 17: time = 666666 flags = 0 - data = length 206, hash 87358D00 + data = length 213, hash 52C7574A sample 18: time = 600000 flags = 0 - data = length 130, hash 4D7A038D + data = length 137, hash D4F0BCD7 sample 19: time = 633333 flags = 0 - data = length 114, hash 2B3C616E + data = length 121, hash BE52EEB8 sample 20: time = 700000 flags = 0 - data = length 95, hash 37D79559 + data = length 102, hash 6AA3C84F sample 21: time = 900000 flags = 0 - data = length 233, hash 80308C9E + data = length 240, hash 8E3CA414 sample 22: time = 833333 flags = 0 - data = length 203, hash E70BA5F2 + data = length 210, hash 5D050FE8 sample 23: time = 766666 flags = 0 - data = length 95, hash BA6FA2D3 + data = length 102, hash ED3BD5C9 sample 24: time = 800000 flags = 0 - data = length 103, hash 51291041 + data = length 110, hash CF65ED37 sample 25: time = 866666 flags = 0 - data = length 111, hash EE9DCFC9 + data = length 118, hash BA0156BF sample 26: time = 1033333 flags = 0 - data = length 253, hash D0CEFBA7 + data = length 260, hash ED6ABC1D sample 27: time = 966666 flags = 0 - data = length 134, hash 8802EEF0 + data = length 141, hash 9787F33A sample 28: time = 933333 flags = 0 - data = length 80, hash C635D9C2 + data = length 87, hash EEC4D98C track 8448: total output bytes = 0 sample count = 0 diff --git a/testdata/src/test/assets/ts/sample_h265.ts.1.dump b/testdata/src/test/assets/ts/sample_h265.ts.1.dump index 95d8d9b73dc..a9db2afd146 100644 --- a/testdata/src/test/assets/ts/sample_h265.ts.1.dump +++ b/testdata/src/test/assets/ts/sample_h265.ts.1.dump @@ -19,83 +19,83 @@ track 256: sample 0: time = 300000 flags = 0 - data = length 218, hash 91E82C9F + data = length 225, hash E0FAD7E9 sample 1: time = 333333 flags = 0 - data = length 177, hash 4A4FEEC0 + data = length 184, hash A3A6E036 sample 2: time = 400000 flags = 0 - data = length 82, hash 2E2ADD8 + data = length 89, hash 43B0E322 sample 3: time = 533333 flags = 0 - data = length 290, hash 63CF7D90 + data = length 297, hash 6D9FEEDA sample 4: time = 500000 flags = 0 - data = length 268, hash E8CBAC11 + data = length 275, hash 27430DB sample 5: time = 466666 flags = 0 - data = length 178, hash C5B1613E + data = length 185, hash 97389E88 sample 6: time = 566666 flags = 0 - data = length 271, hash 76652FC5 + data = length 278, hash 5819FEBB sample 7: time = 733333 flags = 0 - data = length 257, hash 960B5DF4 + data = length 264, hash 8545F36A sample 8: time = 666666 flags = 0 - data = length 206, hash 87358D00 + data = length 213, hash 52C7574A sample 9: time = 600000 flags = 0 - data = length 130, hash 4D7A038D + data = length 137, hash D4F0BCD7 sample 10: time = 633333 flags = 0 - data = length 114, hash 2B3C616E + data = length 121, hash BE52EEB8 sample 11: time = 700000 flags = 0 - data = length 95, hash 37D79559 + data = length 102, hash 6AA3C84F sample 12: time = 900000 flags = 0 - data = length 233, hash 80308C9E + data = length 240, hash 8E3CA414 sample 13: time = 833333 flags = 0 - data = length 203, hash E70BA5F2 + data = length 210, hash 5D050FE8 sample 14: time = 766666 flags = 0 - data = length 95, hash BA6FA2D3 + data = length 102, hash ED3BD5C9 sample 15: time = 800000 flags = 0 - data = length 103, hash 51291041 + data = length 110, hash CF65ED37 sample 16: time = 866666 flags = 0 - data = length 111, hash EE9DCFC9 + data = length 118, hash BA0156BF sample 17: time = 1033333 flags = 0 - data = length 253, hash D0CEFBA7 + data = length 260, hash ED6ABC1D sample 18: time = 966666 flags = 0 - data = length 134, hash 8802EEF0 + data = length 141, hash 9787F33A sample 19: time = 933333 flags = 0 - data = length 80, hash C635D9C2 + data = length 87, hash EEC4D98C track 8448: total output bytes = 0 sample count = 0 diff --git a/testdata/src/test/assets/ts/sample_h265.ts.2.dump b/testdata/src/test/assets/ts/sample_h265.ts.2.dump index 9080f5c17fa..7f694a374cc 100644 --- a/testdata/src/test/assets/ts/sample_h265.ts.2.dump +++ b/testdata/src/test/assets/ts/sample_h265.ts.2.dump @@ -19,47 +19,47 @@ track 256: sample 0: time = 600000 flags = 0 - data = length 130, hash 4D7A038D + data = length 137, hash D4F0BCD7 sample 1: time = 633333 flags = 0 - data = length 114, hash 2B3C616E + data = length 121, hash BE52EEB8 sample 2: time = 700000 flags = 0 - data = length 95, hash 37D79559 + data = length 102, hash 6AA3C84F sample 3: time = 900000 flags = 0 - data = length 233, hash 80308C9E + data = length 240, hash 8E3CA414 sample 4: time = 833333 flags = 0 - data = length 203, hash E70BA5F2 + data = length 210, hash 5D050FE8 sample 5: time = 766666 flags = 0 - data = length 95, hash BA6FA2D3 + data = length 102, hash ED3BD5C9 sample 6: time = 800000 flags = 0 - data = length 103, hash 51291041 + data = length 110, hash CF65ED37 sample 7: time = 866666 flags = 0 - data = length 111, hash EE9DCFC9 + data = length 118, hash BA0156BF sample 8: time = 1033333 flags = 0 - data = length 253, hash D0CEFBA7 + data = length 260, hash ED6ABC1D sample 9: time = 966666 flags = 0 - data = length 134, hash 8802EEF0 + data = length 141, hash 9787F33A sample 10: time = 933333 flags = 0 - data = length 80, hash C635D9C2 + data = length 87, hash EEC4D98C track 8448: total output bytes = 0 sample count = 0 diff --git a/testdata/src/test/assets/ts/sample_h265.ts.3.dump b/testdata/src/test/assets/ts/sample_h265.ts.3.dump index 5fe7bcede41..79268508077 100644 --- a/testdata/src/test/assets/ts/sample_h265.ts.3.dump +++ b/testdata/src/test/assets/ts/sample_h265.ts.3.dump @@ -19,11 +19,11 @@ track 256: sample 0: time = 966666 flags = 0 - data = length 134, hash 8802EEF0 + data = length 141, hash 9787F33A sample 1: time = 933333 flags = 0 - data = length 80, hash C635D9C2 + data = length 87, hash EEC4D98C track 8448: total output bytes = 0 sample count = 0 diff --git a/testdata/src/test/assets/ts/sample_h265.ts.unknown_length.dump b/testdata/src/test/assets/ts/sample_h265.ts.unknown_length.dump index 733be6f01eb..2df0a73c3aa 100644 --- a/testdata/src/test/assets/ts/sample_h265.ts.unknown_length.dump +++ b/testdata/src/test/assets/ts/sample_h265.ts.unknown_length.dump @@ -16,119 +16,119 @@ track 256: sample 0: time = 66666 flags = 1 - data = length 2510, hash 796A98BE + data = length 2517, hash 85352308 sample 1: time = 100000 flags = 0 - data = length 1219, hash 131AA4E4 + data = length 1226, hash 11D564DA sample 2: time = 266666 flags = 0 - data = length 7810, hash 3F881DB9 + data = length 7817, hash 50D15703 sample 3: time = 200000 flags = 0 - data = length 2306, hash 9A77959C + data = length 2313, hash ECA5AEE6 sample 4: time = 133333 flags = 0 - data = length 1058, hash B887F7EF + data = length 1065, hash 8720A939 sample 5: time = 166666 flags = 0 - data = length 98, hash D95BF6E3 + data = length 105, hash 3A3A582D sample 6: time = 233333 flags = 0 - data = length 61, hash 574C41C3 + data = length 68, hash FC241239 sample 7: time = 433333 flags = 0 - data = length 296, hash E92DB288 + data = length 303, hash 41B28452 sample 8: time = 366666 flags = 0 - data = length 137, hash 586DADD6 + data = length 144, hash 60BBCD4C sample 9: time = 300000 flags = 0 - data = length 218, hash 91E82C9F + data = length 225, hash E0FAD7E9 sample 10: time = 333333 flags = 0 - data = length 177, hash 4A4FEEC0 + data = length 184, hash A3A6E036 sample 11: time = 400000 flags = 0 - data = length 82, hash 2E2ADD8 + data = length 89, hash 43B0E322 sample 12: time = 533333 flags = 0 - data = length 290, hash 63CF7D90 + data = length 297, hash 6D9FEEDA sample 13: time = 500000 flags = 0 - data = length 268, hash E8CBAC11 + data = length 275, hash 27430DB sample 14: time = 466666 flags = 0 - data = length 178, hash C5B1613E + data = length 185, hash 97389E88 sample 15: time = 566666 flags = 0 - data = length 271, hash 76652FC5 + data = length 278, hash 5819FEBB sample 16: time = 733333 flags = 0 - data = length 257, hash 960B5DF4 + data = length 264, hash 8545F36A sample 17: time = 666666 flags = 0 - data = length 206, hash 87358D00 + data = length 213, hash 52C7574A sample 18: time = 600000 flags = 0 - data = length 130, hash 4D7A038D + data = length 137, hash D4F0BCD7 sample 19: time = 633333 flags = 0 - data = length 114, hash 2B3C616E + data = length 121, hash BE52EEB8 sample 20: time = 700000 flags = 0 - data = length 95, hash 37D79559 + data = length 102, hash 6AA3C84F sample 21: time = 900000 flags = 0 - data = length 233, hash 80308C9E + data = length 240, hash 8E3CA414 sample 22: time = 833333 flags = 0 - data = length 203, hash E70BA5F2 + data = length 210, hash 5D050FE8 sample 23: time = 766666 flags = 0 - data = length 95, hash BA6FA2D3 + data = length 102, hash ED3BD5C9 sample 24: time = 800000 flags = 0 - data = length 103, hash 51291041 + data = length 110, hash CF65ED37 sample 25: time = 866666 flags = 0 - data = length 111, hash EE9DCFC9 + data = length 118, hash BA0156BF sample 26: time = 1033333 flags = 0 - data = length 253, hash D0CEFBA7 + data = length 260, hash ED6ABC1D sample 27: time = 966666 flags = 0 - data = length 134, hash 8802EEF0 + data = length 141, hash 9787F33A sample 28: time = 933333 flags = 0 - data = length 80, hash C635D9C2 + data = length 87, hash EEC4D98C track 8448: total output bytes = 0 sample count = 0