Fix H265Reader to correctly output SEI and AUD NAL units

Issue: #7113
PiperOrigin-RevId: 307380133
This commit is contained in:
olly 2020-04-20 13:25:43 +01:00 committed by Oliver Woodman
parent 9a7290000c
commit cb51a1bfe6
7 changed files with 97 additions and 96 deletions

View File

@ -118,6 +118,8 @@
costly on large files. costly on large files.
* MP4: Store the Android capture frame rate only in `Format.metadata`. * MP4: Store the Android capture frame rate only in `Format.metadata`.
`Format.frameRate` now stores the calculated frame rate. `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 * Testing
* Add `TestExoPlayer`, a utility class with APIs to create * Add `TestExoPlayer`, a utility class with APIs to create
`SimpleExoPlayer` instances with fake components for testing. `SimpleExoPlayer` instances with fake components for testing.

View File

@ -47,6 +47,7 @@ public final class H265Reader implements ElementaryStreamReader {
private static final int VPS_NUT = 32; private static final int VPS_NUT = 32;
private static final int SPS_NUT = 33; private static final int SPS_NUT = 33;
private static final int PPS_NUT = 34; 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 PREFIX_SEI_NUT = 39;
private static final int SUFFIX_SEI_NUT = 40; private static final int SUFFIX_SEI_NUT = 40;
@ -472,7 +473,7 @@ public final class H265Reader implements ElementaryStreamReader {
} }
} }
// 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); nalUnitHasKeyframeData = (nalUnitType >= BLA_W_LP && nalUnitType <= CRA_NUT);
lookingForFirstSliceFlag = nalUnitHasKeyframeData || nalUnitType <= RASL_R; lookingForFirstSliceFlag = nalUnitHasKeyframeData || nalUnitType <= RASL_R;
} }
@ -516,14 +517,12 @@ public final class H265Reader implements ElementaryStreamReader {
/** Returns whether a NAL unit type is one that occurs before any VCL NAL units in a sample. */ /** Returns whether a NAL unit type is one that occurs before any VCL NAL units in a sample. */
private static boolean isPrefixNalUnit(int nalUnitType) { private static boolean isPrefixNalUnit(int nalUnitType) {
// TODO: Include AUD_NUT and PREFIX_SEI_NUT return (VPS_NUT <= nalUnitType && nalUnitType <= AUD_NUT) || nalUnitType == PREFIX_SEI_NUT;
return VPS_NUT <= nalUnitType && nalUnitType <= PPS_NUT;
} }
/** Returns whether a NAL unit type is one that occurs in the VLC body of a sample. */ /** Returns whether a NAL unit type is one that occurs in the VLC body of a sample. */
private static boolean isVclBodyNalUnit(int nalUnitType) { private static boolean isVclBodyNalUnit(int nalUnitType) {
// TODO: Include SUFFIX_SEI_NUT return nalUnitType < VPS_NUT || nalUnitType == SUFFIX_SEI_NUT;
return nalUnitType < VPS_NUT;
} }
} }
} }

View File

@ -19,119 +19,119 @@ track 256:
sample 0: sample 0:
time = 66666 time = 66666
flags = 1 flags = 1
data = length 2510, hash 796A98BE data = length 2517, hash 85352308
sample 1: sample 1:
time = 100000 time = 100000
flags = 0 flags = 0
data = length 1219, hash 131AA4E4 data = length 1226, hash 11D564DA
sample 2: sample 2:
time = 266666 time = 266666
flags = 0 flags = 0
data = length 7810, hash 3F881DB9 data = length 7817, hash 50D15703
sample 3: sample 3:
time = 200000 time = 200000
flags = 0 flags = 0
data = length 2306, hash 9A77959C data = length 2313, hash ECA5AEE6
sample 4: sample 4:
time = 133333 time = 133333
flags = 0 flags = 0
data = length 1058, hash B887F7EF data = length 1065, hash 8720A939
sample 5: sample 5:
time = 166666 time = 166666
flags = 0 flags = 0
data = length 98, hash D95BF6E3 data = length 105, hash 3A3A582D
sample 6: sample 6:
time = 233333 time = 233333
flags = 0 flags = 0
data = length 61, hash 574C41C3 data = length 68, hash FC241239
sample 7: sample 7:
time = 433333 time = 433333
flags = 0 flags = 0
data = length 296, hash E92DB288 data = length 303, hash 41B28452
sample 8: sample 8:
time = 366666 time = 366666
flags = 0 flags = 0
data = length 137, hash 586DADD6 data = length 144, hash 60BBCD4C
sample 9: sample 9:
time = 300000 time = 300000
flags = 0 flags = 0
data = length 218, hash 91E82C9F data = length 225, hash E0FAD7E9
sample 10: sample 10:
time = 333333 time = 333333
flags = 0 flags = 0
data = length 177, hash 4A4FEEC0 data = length 184, hash A3A6E036
sample 11: sample 11:
time = 400000 time = 400000
flags = 0 flags = 0
data = length 82, hash 2E2ADD8 data = length 89, hash 43B0E322
sample 12: sample 12:
time = 533333 time = 533333
flags = 0 flags = 0
data = length 290, hash 63CF7D90 data = length 297, hash 6D9FEEDA
sample 13: sample 13:
time = 500000 time = 500000
flags = 0 flags = 0
data = length 268, hash E8CBAC11 data = length 275, hash 27430DB
sample 14: sample 14:
time = 466666 time = 466666
flags = 0 flags = 0
data = length 178, hash C5B1613E data = length 185, hash 97389E88
sample 15: sample 15:
time = 566666 time = 566666
flags = 0 flags = 0
data = length 271, hash 76652FC5 data = length 278, hash 5819FEBB
sample 16: sample 16:
time = 733333 time = 733333
flags = 0 flags = 0
data = length 257, hash 960B5DF4 data = length 264, hash 8545F36A
sample 17: sample 17:
time = 666666 time = 666666
flags = 0 flags = 0
data = length 206, hash 87358D00 data = length 213, hash 52C7574A
sample 18: sample 18:
time = 600000 time = 600000
flags = 0 flags = 0
data = length 130, hash 4D7A038D data = length 137, hash D4F0BCD7
sample 19: sample 19:
time = 633333 time = 633333
flags = 0 flags = 0
data = length 114, hash 2B3C616E data = length 121, hash BE52EEB8
sample 20: sample 20:
time = 700000 time = 700000
flags = 0 flags = 0
data = length 95, hash 37D79559 data = length 102, hash 6AA3C84F
sample 21: sample 21:
time = 900000 time = 900000
flags = 0 flags = 0
data = length 233, hash 80308C9E data = length 240, hash 8E3CA414
sample 22: sample 22:
time = 833333 time = 833333
flags = 0 flags = 0
data = length 203, hash E70BA5F2 data = length 210, hash 5D050FE8
sample 23: sample 23:
time = 766666 time = 766666
flags = 0 flags = 0
data = length 95, hash BA6FA2D3 data = length 102, hash ED3BD5C9
sample 24: sample 24:
time = 800000 time = 800000
flags = 0 flags = 0
data = length 103, hash 51291041 data = length 110, hash CF65ED37
sample 25: sample 25:
time = 866666 time = 866666
flags = 0 flags = 0
data = length 111, hash EE9DCFC9 data = length 118, hash BA0156BF
sample 26: sample 26:
time = 1033333 time = 1033333
flags = 0 flags = 0
data = length 253, hash D0CEFBA7 data = length 260, hash ED6ABC1D
sample 27: sample 27:
time = 966666 time = 966666
flags = 0 flags = 0
data = length 134, hash 8802EEF0 data = length 141, hash 9787F33A
sample 28: sample 28:
time = 933333 time = 933333
flags = 0 flags = 0
data = length 80, hash C635D9C2 data = length 87, hash EEC4D98C
track 8448: track 8448:
total output bytes = 0 total output bytes = 0
sample count = 0 sample count = 0

View File

@ -19,83 +19,83 @@ track 256:
sample 0: sample 0:
time = 300000 time = 300000
flags = 0 flags = 0
data = length 218, hash 91E82C9F data = length 225, hash E0FAD7E9
sample 1: sample 1:
time = 333333 time = 333333
flags = 0 flags = 0
data = length 177, hash 4A4FEEC0 data = length 184, hash A3A6E036
sample 2: sample 2:
time = 400000 time = 400000
flags = 0 flags = 0
data = length 82, hash 2E2ADD8 data = length 89, hash 43B0E322
sample 3: sample 3:
time = 533333 time = 533333
flags = 0 flags = 0
data = length 290, hash 63CF7D90 data = length 297, hash 6D9FEEDA
sample 4: sample 4:
time = 500000 time = 500000
flags = 0 flags = 0
data = length 268, hash E8CBAC11 data = length 275, hash 27430DB
sample 5: sample 5:
time = 466666 time = 466666
flags = 0 flags = 0
data = length 178, hash C5B1613E data = length 185, hash 97389E88
sample 6: sample 6:
time = 566666 time = 566666
flags = 0 flags = 0
data = length 271, hash 76652FC5 data = length 278, hash 5819FEBB
sample 7: sample 7:
time = 733333 time = 733333
flags = 0 flags = 0
data = length 257, hash 960B5DF4 data = length 264, hash 8545F36A
sample 8: sample 8:
time = 666666 time = 666666
flags = 0 flags = 0
data = length 206, hash 87358D00 data = length 213, hash 52C7574A
sample 9: sample 9:
time = 600000 time = 600000
flags = 0 flags = 0
data = length 130, hash 4D7A038D data = length 137, hash D4F0BCD7
sample 10: sample 10:
time = 633333 time = 633333
flags = 0 flags = 0
data = length 114, hash 2B3C616E data = length 121, hash BE52EEB8
sample 11: sample 11:
time = 700000 time = 700000
flags = 0 flags = 0
data = length 95, hash 37D79559 data = length 102, hash 6AA3C84F
sample 12: sample 12:
time = 900000 time = 900000
flags = 0 flags = 0
data = length 233, hash 80308C9E data = length 240, hash 8E3CA414
sample 13: sample 13:
time = 833333 time = 833333
flags = 0 flags = 0
data = length 203, hash E70BA5F2 data = length 210, hash 5D050FE8
sample 14: sample 14:
time = 766666 time = 766666
flags = 0 flags = 0
data = length 95, hash BA6FA2D3 data = length 102, hash ED3BD5C9
sample 15: sample 15:
time = 800000 time = 800000
flags = 0 flags = 0
data = length 103, hash 51291041 data = length 110, hash CF65ED37
sample 16: sample 16:
time = 866666 time = 866666
flags = 0 flags = 0
data = length 111, hash EE9DCFC9 data = length 118, hash BA0156BF
sample 17: sample 17:
time = 1033333 time = 1033333
flags = 0 flags = 0
data = length 253, hash D0CEFBA7 data = length 260, hash ED6ABC1D
sample 18: sample 18:
time = 966666 time = 966666
flags = 0 flags = 0
data = length 134, hash 8802EEF0 data = length 141, hash 9787F33A
sample 19: sample 19:
time = 933333 time = 933333
flags = 0 flags = 0
data = length 80, hash C635D9C2 data = length 87, hash EEC4D98C
track 8448: track 8448:
total output bytes = 0 total output bytes = 0
sample count = 0 sample count = 0

View File

@ -19,47 +19,47 @@ track 256:
sample 0: sample 0:
time = 600000 time = 600000
flags = 0 flags = 0
data = length 130, hash 4D7A038D data = length 137, hash D4F0BCD7
sample 1: sample 1:
time = 633333 time = 633333
flags = 0 flags = 0
data = length 114, hash 2B3C616E data = length 121, hash BE52EEB8
sample 2: sample 2:
time = 700000 time = 700000
flags = 0 flags = 0
data = length 95, hash 37D79559 data = length 102, hash 6AA3C84F
sample 3: sample 3:
time = 900000 time = 900000
flags = 0 flags = 0
data = length 233, hash 80308C9E data = length 240, hash 8E3CA414
sample 4: sample 4:
time = 833333 time = 833333
flags = 0 flags = 0
data = length 203, hash E70BA5F2 data = length 210, hash 5D050FE8
sample 5: sample 5:
time = 766666 time = 766666
flags = 0 flags = 0
data = length 95, hash BA6FA2D3 data = length 102, hash ED3BD5C9
sample 6: sample 6:
time = 800000 time = 800000
flags = 0 flags = 0
data = length 103, hash 51291041 data = length 110, hash CF65ED37
sample 7: sample 7:
time = 866666 time = 866666
flags = 0 flags = 0
data = length 111, hash EE9DCFC9 data = length 118, hash BA0156BF
sample 8: sample 8:
time = 1033333 time = 1033333
flags = 0 flags = 0
data = length 253, hash D0CEFBA7 data = length 260, hash ED6ABC1D
sample 9: sample 9:
time = 966666 time = 966666
flags = 0 flags = 0
data = length 134, hash 8802EEF0 data = length 141, hash 9787F33A
sample 10: sample 10:
time = 933333 time = 933333
flags = 0 flags = 0
data = length 80, hash C635D9C2 data = length 87, hash EEC4D98C
track 8448: track 8448:
total output bytes = 0 total output bytes = 0
sample count = 0 sample count = 0

View File

@ -19,11 +19,11 @@ track 256:
sample 0: sample 0:
time = 966666 time = 966666
flags = 0 flags = 0
data = length 134, hash 8802EEF0 data = length 141, hash 9787F33A
sample 1: sample 1:
time = 933333 time = 933333
flags = 0 flags = 0
data = length 80, hash C635D9C2 data = length 87, hash EEC4D98C
track 8448: track 8448:
total output bytes = 0 total output bytes = 0
sample count = 0 sample count = 0

View File

@ -16,119 +16,119 @@ track 256:
sample 0: sample 0:
time = 66666 time = 66666
flags = 1 flags = 1
data = length 2510, hash 796A98BE data = length 2517, hash 85352308
sample 1: sample 1:
time = 100000 time = 100000
flags = 0 flags = 0
data = length 1219, hash 131AA4E4 data = length 1226, hash 11D564DA
sample 2: sample 2:
time = 266666 time = 266666
flags = 0 flags = 0
data = length 7810, hash 3F881DB9 data = length 7817, hash 50D15703
sample 3: sample 3:
time = 200000 time = 200000
flags = 0 flags = 0
data = length 2306, hash 9A77959C data = length 2313, hash ECA5AEE6
sample 4: sample 4:
time = 133333 time = 133333
flags = 0 flags = 0
data = length 1058, hash B887F7EF data = length 1065, hash 8720A939
sample 5: sample 5:
time = 166666 time = 166666
flags = 0 flags = 0
data = length 98, hash D95BF6E3 data = length 105, hash 3A3A582D
sample 6: sample 6:
time = 233333 time = 233333
flags = 0 flags = 0
data = length 61, hash 574C41C3 data = length 68, hash FC241239
sample 7: sample 7:
time = 433333 time = 433333
flags = 0 flags = 0
data = length 296, hash E92DB288 data = length 303, hash 41B28452
sample 8: sample 8:
time = 366666 time = 366666
flags = 0 flags = 0
data = length 137, hash 586DADD6 data = length 144, hash 60BBCD4C
sample 9: sample 9:
time = 300000 time = 300000
flags = 0 flags = 0
data = length 218, hash 91E82C9F data = length 225, hash E0FAD7E9
sample 10: sample 10:
time = 333333 time = 333333
flags = 0 flags = 0
data = length 177, hash 4A4FEEC0 data = length 184, hash A3A6E036
sample 11: sample 11:
time = 400000 time = 400000
flags = 0 flags = 0
data = length 82, hash 2E2ADD8 data = length 89, hash 43B0E322
sample 12: sample 12:
time = 533333 time = 533333
flags = 0 flags = 0
data = length 290, hash 63CF7D90 data = length 297, hash 6D9FEEDA
sample 13: sample 13:
time = 500000 time = 500000
flags = 0 flags = 0
data = length 268, hash E8CBAC11 data = length 275, hash 27430DB
sample 14: sample 14:
time = 466666 time = 466666
flags = 0 flags = 0
data = length 178, hash C5B1613E data = length 185, hash 97389E88
sample 15: sample 15:
time = 566666 time = 566666
flags = 0 flags = 0
data = length 271, hash 76652FC5 data = length 278, hash 5819FEBB
sample 16: sample 16:
time = 733333 time = 733333
flags = 0 flags = 0
data = length 257, hash 960B5DF4 data = length 264, hash 8545F36A
sample 17: sample 17:
time = 666666 time = 666666
flags = 0 flags = 0
data = length 206, hash 87358D00 data = length 213, hash 52C7574A
sample 18: sample 18:
time = 600000 time = 600000
flags = 0 flags = 0
data = length 130, hash 4D7A038D data = length 137, hash D4F0BCD7
sample 19: sample 19:
time = 633333 time = 633333
flags = 0 flags = 0
data = length 114, hash 2B3C616E data = length 121, hash BE52EEB8
sample 20: sample 20:
time = 700000 time = 700000
flags = 0 flags = 0
data = length 95, hash 37D79559 data = length 102, hash 6AA3C84F
sample 21: sample 21:
time = 900000 time = 900000
flags = 0 flags = 0
data = length 233, hash 80308C9E data = length 240, hash 8E3CA414
sample 22: sample 22:
time = 833333 time = 833333
flags = 0 flags = 0
data = length 203, hash E70BA5F2 data = length 210, hash 5D050FE8
sample 23: sample 23:
time = 766666 time = 766666
flags = 0 flags = 0
data = length 95, hash BA6FA2D3 data = length 102, hash ED3BD5C9
sample 24: sample 24:
time = 800000 time = 800000
flags = 0 flags = 0
data = length 103, hash 51291041 data = length 110, hash CF65ED37
sample 25: sample 25:
time = 866666 time = 866666
flags = 0 flags = 0
data = length 111, hash EE9DCFC9 data = length 118, hash BA0156BF
sample 26: sample 26:
time = 1033333 time = 1033333
flags = 0 flags = 0
data = length 253, hash D0CEFBA7 data = length 260, hash ED6ABC1D
sample 27: sample 27:
time = 966666 time = 966666
flags = 0 flags = 0
data = length 134, hash 8802EEF0 data = length 141, hash 9787F33A
sample 28: sample 28:
time = 933333 time = 933333
flags = 0 flags = 0
data = length 80, hash C635D9C2 data = length 87, hash EEC4D98C
track 8448: track 8448:
total output bytes = 0 total output bytes = 0
sample count = 0 sample count = 0