Permit duplicate Opus headers

This reinstates the permissive behaviour removed by
fe7e5b8181

Test file created by opening bear.opus in a hex editor and naively
duplicating the two header packets, starting at (and including) the
first `OggS` in the file and ending just before the third `OggS`.

#minor-release

Issue: google/ExoPlayer#10038
PiperOrigin-RevId: 452015662
This commit is contained in:
ibaker 2022-05-31 11:52:14 +00:00 committed by Marc Baechinger
parent acb48a2495
commit 1282175808
9 changed files with 3448 additions and 5 deletions

View File

@ -56,7 +56,9 @@
subtitle format. subtitle format.
* Extractors: * Extractors:
* Matroska: Parse `DiscardPadding` for Opus tracks. * Matroska: Parse `DiscardPadding` for Opus tracks.
* Parse bitrates from `esds` boxes. * MP4: Parse bitrates from `esds` boxes.
* Ogg: Allow duplicate Opus ID and comment headers
([#10038](https://github.com/google/ExoPlayer/issues/10038)).
* UI: * UI:
* Fix delivery of events to `OnClickListener`s set on `PlayerView` and * Fix delivery of events to `OnClickListener`s set on `PlayerView` and
`LegacyPlayerView`, in the case that `useController=false` `LegacyPlayerView`, in the case that `useController=false`

View File

@ -15,7 +15,6 @@
*/ */
package androidx.media3.extractor.ogg; package androidx.media3.extractor.ogg;
import static androidx.media3.common.util.Assertions.checkState;
import static androidx.media3.common.util.Assertions.checkStateNotNull; import static androidx.media3.common.util.Assertions.checkStateNotNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
@ -39,10 +38,20 @@ import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf;
'O', 'p', 'u', 's', 'T', 'a', 'g', 's' 'O', 'p', 'u', 's', 'T', 'a', 'g', 's'
}; };
private boolean firstCommentHeaderSeen;
public static boolean verifyBitstreamType(ParsableByteArray data) { public static boolean verifyBitstreamType(ParsableByteArray data) {
return peekPacketStartsWith(data, OPUS_ID_HEADER_SIGNATURE); return peekPacketStartsWith(data, OPUS_ID_HEADER_SIGNATURE);
} }
@Override
protected void reset(boolean headerData) {
super.reset(headerData);
if (headerData) {
firstCommentHeaderSeen = false;
}
}
@Override @Override
protected long preparePayload(ParsableByteArray packet) { protected long preparePayload(ParsableByteArray packet) {
return convertTimeToGranule(getPacketDurationUs(packet.getData())); return convertTimeToGranule(getPacketDurationUs(packet.getData()));
@ -57,9 +66,15 @@ import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf;
int channelCount = OpusUtil.getChannelCount(headerBytes); int channelCount = OpusUtil.getChannelCount(headerBytes);
List<byte[]> initializationData = OpusUtil.buildInitializationData(headerBytes); List<byte[]> initializationData = OpusUtil.buildInitializationData(headerBytes);
// The ID header must come at the start of the file: if (setupData.format != null) {
// https://datatracker.ietf.org/doc/html/rfc7845#section-3 // setupData.format being non-null indicates we've already seen an ID header. Multiple ID
checkState(setupData.format == null); // headers are not permitted by the Opus spec [1], but have been observed in real files [2],
// so we just ignore all subsequent ones.
// [1] https://datatracker.ietf.org/doc/html/rfc7845#section-3 and
// https://datatracker.ietf.org/doc/html/rfc7845#section-5
// [2] https://github.com/google/ExoPlayer/issues/10038
return true;
}
setupData.format = setupData.format =
new Format.Builder() new Format.Builder()
.setSampleMimeType(MimeTypes.AUDIO_OPUS) .setSampleMimeType(MimeTypes.AUDIO_OPUS)
@ -72,6 +87,15 @@ import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf;
// The comment header must come immediately after the ID header, so the format will already // The comment header must come immediately after the ID header, so the format will already
// be populated: https://datatracker.ietf.org/doc/html/rfc7845#section-3 // be populated: https://datatracker.ietf.org/doc/html/rfc7845#section-3
checkStateNotNull(setupData.format); checkStateNotNull(setupData.format);
if (firstCommentHeaderSeen) {
// Multiple comment headers are not permitted by the Opus spec [1], but have been observed
// in real files [2], so we just ignore all subsequent ones.
// [1] https://datatracker.ietf.org/doc/html/rfc7845#section-3 and
// https://datatracker.ietf.org/doc/html/rfc7845#section-5
// [2] https://github.com/google/ExoPlayer/issues/10038
return true;
}
firstCommentHeaderSeen = true;
packet.skipBytes(OPUS_COMMENT_HEADER_SIGNATURE.length); packet.skipBytes(OPUS_COMMENT_HEADER_SIGNATURE.length);
VorbisUtil.CommentHeader commentHeader = VorbisUtil.CommentHeader commentHeader =
VorbisUtil.readVorbisCommentHeader( VorbisUtil.readVorbisCommentHeader(

View File

@ -43,6 +43,13 @@ public final class OggExtractorParameterizedTest {
ExtractorAsserts.assertBehavior(OggExtractor::new, "media/ogg/bear.opus", simulationConfig); ExtractorAsserts.assertBehavior(OggExtractor::new, "media/ogg/bear.opus", simulationConfig);
} }
// https://github.com/google/ExoPlayer/issues/10038
@Test
public void opus_duplicateHeader() throws Exception {
ExtractorAsserts.assertBehavior(
OggExtractor::new, "media/ogg/bear_duplicate_header.opus", simulationConfig);
}
@Test @Test
public void flac() throws Exception { public void flac() throws Exception {
ExtractorAsserts.assertBehavior(OggExtractor::new, "media/ogg/bear_flac.ogg", simulationConfig); ExtractorAsserts.assertBehavior(OggExtractor::new, "media/ogg/bear_flac.ogg", simulationConfig);

View File

@ -0,0 +1,757 @@
seekMap:
isSeekable = true
duration = 2747500
getPosition(0) = [[timeUs=0, position=250]]
getPosition(1) = [[timeUs=1, position=250]]
getPosition(1373750) = [[timeUs=1373750, position=250]]
getPosition(2747500) = [[timeUs=2747500, position=250]]
numberOfTracks = 1
track 0:
total output bytes = 17031
sample count = 184
format 0:
sampleMimeType = audio/opus
channelCount = 2
sampleRate = 48000
metadata = entries=[VC: encoder=Lavf54.20.4]
initializationData:
data = length 19, hash BFE794DB
data = length 8, hash CA22068C
data = length 8, hash 79C07075
sample 0:
time = 910000
flags = 1
data = length 88, hash 9C8D5178
sample 1:
time = 920000
flags = 1
data = length 88, hash 48A0B19A
sample 2:
time = 930000
flags = 1
data = length 88, hash B62C94DD
sample 3:
time = 940000
flags = 1
data = length 92, hash 96DBDD46
sample 4:
time = 950000
flags = 1
data = length 87, hash 7B80E6F
sample 5:
time = 960000
flags = 1
data = length 86, hash 9C60225B
sample 6:
time = 970000
flags = 1
data = length 87, hash 45F7E6E8
sample 7:
time = 980000
flags = 1
data = length 87, hash DDC2D592
sample 8:
time = 990000
flags = 1
data = length 91, hash 173D3B26
sample 9:
time = 1000000
flags = 1
data = length 87, hash CF3629DF
sample 10:
time = 1010000
flags = 1
data = length 87, hash BBE2E7B3
sample 11:
time = 1020000
flags = 1
data = length 89, hash 89AFFB10
sample 12:
time = 1030000
flags = 1
data = length 88, hash 510DCC90
sample 13:
time = 1040000
flags = 1
data = length 88, hash CBA56E5F
sample 14:
time = 1050000
flags = 1
data = length 87, hash B4B1B3FF
sample 15:
time = 1060000
flags = 1
data = length 89, hash B976A537
sample 16:
time = 1070000
flags = 1
data = length 96, hash 43ECF2C1
sample 17:
time = 1080000
flags = 1
data = length 90, hash BB7ECB44
sample 18:
time = 1090000
flags = 1
data = length 89, hash B8E221A5
sample 19:
time = 1100000
flags = 1
data = length 86, hash B35BEF5B
sample 20:
time = 1110000
flags = 1
data = length 89, hash 9002F0EC
sample 21:
time = 1120000
flags = 1
data = length 85, hash F694B20
sample 22:
time = 1130000
flags = 1
data = length 87, hash D7CC386E
sample 23:
time = 1140000
flags = 1
data = length 89, hash EE9E0E79
sample 24:
time = 1150000
flags = 1
data = length 90, hash CA72C96B
sample 25:
time = 1160000
flags = 1
data = length 112, hash 4AD3D1B1
sample 26:
time = 1170000
flags = 1
data = length 87, hash FA568FAB
sample 27:
time = 1180000
flags = 1
data = length 90, hash 6E6948D2
sample 28:
time = 1190000
flags = 1
data = length 89, hash 5465A762
sample 29:
time = 1200000
flags = 1
data = length 87, hash BED19B40
sample 30:
time = 1210000
flags = 1
data = length 89, hash 5D05836A
sample 31:
time = 1220000
flags = 1
data = length 87, hash A8A3EF5A
sample 32:
time = 1230000
flags = 1
data = length 90, hash 6425A77A
sample 33:
time = 1240000
flags = 1
data = length 92, hash 7F320FA
sample 34:
time = 1250000
flags = 1
data = length 89, hash 2C7837D6
sample 35:
time = 1260000
flags = 1
data = length 86, hash 58D56685
sample 36:
time = 1270000
flags = 1
data = length 91, hash ADC5072F
sample 37:
time = 1280000
flags = 1
data = length 85, hash 53EFD93
sample 38:
time = 1290000
flags = 1
data = length 87, hash D006B535
sample 39:
time = 1300000
flags = 1
data = length 86, hash AE944625
sample 40:
time = 1310000
flags = 1
data = length 89, hash B5D3C81D
sample 41:
time = 1320000
flags = 1
data = length 86, hash 3BB1D0E7
sample 42:
time = 1330000
flags = 1
data = length 102, hash 16EEC441
sample 43:
time = 1340000
flags = 1
data = length 90, hash 1005B936
sample 44:
time = 1350000
flags = 1
data = length 85, hash 15EEBF9A
sample 45:
time = 1360000
flags = 1
data = length 87, hash 37C83AC2
sample 46:
time = 1370000
flags = 1
data = length 85, hash 2D27855D
sample 47:
time = 1380000
flags = 1
data = length 85, hash 753EB7C6
sample 48:
time = 1390000
flags = 1
data = length 91, hash C0813318
sample 49:
time = 1400000
flags = 1
data = length 89, hash 3A6468AC
sample 50:
time = 1410000
flags = 1
data = length 88, hash 3D220ABC
sample 51:
time = 1420000
flags = 1
data = length 140, hash 7949ABC7
sample 52:
time = 1430000
flags = 1
data = length 92, hash F19AFA45
sample 53:
time = 1440000
flags = 1
data = length 90, hash 3D21587C
sample 54:
time = 1450000
flags = 1
data = length 89, hash 5C12226C
sample 55:
time = 1460000
flags = 1
data = length 90, hash 22BA14FC
sample 56:
time = 1470000
flags = 1
data = length 88, hash F064B21C
sample 57:
time = 1480000
flags = 1
data = length 87, hash 6D7906B9
sample 58:
time = 1490000
flags = 1
data = length 88, hash 6756A484
sample 59:
time = 1500000
flags = 1
data = length 91, hash C95C00B6
sample 60:
time = 1510000
flags = 1
data = length 87, hash 728D8119
sample 61:
time = 1520000
flags = 1
data = length 90, hash C43DA1B4
sample 62:
time = 1530000
flags = 1
data = length 88, hash C181BB57
sample 63:
time = 1540000
flags = 1
data = length 84, hash F75B1639
sample 64:
time = 1550000
flags = 1
data = length 87, hash B6F32978
sample 65:
time = 1560000
flags = 1
data = length 90, hash 36D6E2D7
sample 66:
time = 1570000
flags = 1
data = length 87, hash 4C9657A7
sample 67:
time = 1580000
flags = 1
data = length 89, hash C3BDB9B7
sample 68:
time = 1590000
flags = 1
data = length 88, hash DB51087E
sample 69:
time = 1600000
flags = 1
data = length 86, hash 1550F998
sample 70:
time = 1610000
flags = 1
data = length 86, hash A445FAD4
sample 71:
time = 1620000
flags = 1
data = length 85, hash 60D3362C
sample 72:
time = 1630000
flags = 1
data = length 172, hash 945D63E4
sample 73:
time = 1640000
flags = 1
data = length 107, hash 585B7C04
sample 74:
time = 1650000
flags = 1
data = length 110, hash 74BECF69
sample 75:
time = 1660000
flags = 1
data = length 87, hash 63DE1D24
sample 76:
time = 1670000
flags = 1
data = length 90, hash 1C1D28DB
sample 77:
time = 1680000
flags = 1
data = length 87, hash CB382A67
sample 78:
time = 1690000
flags = 1
data = length 85, hash A227BA13
sample 79:
time = 1700000
flags = 1
data = length 86, hash EFD8B10B
sample 80:
time = 1710000
flags = 1
data = length 87, hash 47FF364A
sample 81:
time = 1720000
flags = 1
data = length 91, hash 31D4B48A
sample 82:
time = 1730000
flags = 1
data = length 91, hash DD69BD85
sample 83:
time = 1740000
flags = 1
data = length 88, hash AF1A95C6
sample 84:
time = 1750000
flags = 1
data = length 87, hash 2FB8AF74
sample 85:
time = 1760000
flags = 1
data = length 92, hash 173C707A
sample 86:
time = 1770000
flags = 1
data = length 88, hash 5F58F5E8
sample 87:
time = 1780000
flags = 1
data = length 91, hash D449785F
sample 88:
time = 1790000
flags = 1
data = length 91, hash CE2CB465
sample 89:
time = 1800000
flags = 1
data = length 93, hash ABC1C62E
sample 90:
time = 1810000
flags = 1
data = length 87, hash 83B4B9A0
sample 91:
time = 1820000
flags = 1
data = length 87, hash 3220D562
sample 92:
time = 1830000
flags = 1
data = length 86, hash 64D21AA1
sample 93:
time = 1840000
flags = 1
data = length 86, hash A1FAAF2C
sample 94:
time = 1850000
flags = 1
data = length 86, hash ECA80F7E
sample 95:
time = 1860000
flags = 1
data = length 86, hash FEB03B2C
sample 96:
time = 1870000
flags = 1
data = length 85, hash 2C2E6B2F
sample 97:
time = 1880000
flags = 1
data = length 89, hash A0D7AC3
sample 98:
time = 1890000
flags = 1
data = length 87, hash 83739547
sample 99:
time = 1900000
flags = 1
data = length 86, hash 991E531E
sample 100:
time = 1910000
flags = 1
data = length 88, hash 16B287A3
sample 101:
time = 1920000
flags = 1
data = length 86, hash FC86EED
sample 102:
time = 1930000
flags = 1
data = length 86, hash 96AF0248
sample 103:
time = 1940000
flags = 1
data = length 86, hash 288402C8
sample 104:
time = 1950000
flags = 1
data = length 87, hash 4BBA7912
sample 105:
time = 1960000
flags = 1
data = length 86, hash 4A59C719
sample 106:
time = 1970000
flags = 1
data = length 85, hash 906E8187
sample 107:
time = 1980000
flags = 1
data = length 90, hash CB8B755D
sample 108:
time = 1990000
flags = 1
data = length 87, hash C8E02C
sample 109:
time = 2000000
flags = 1
data = length 88, hash ACF4D89A
sample 110:
time = 2010000
flags = 1
data = length 86, hash 510FE048
sample 111:
time = 2020000
flags = 1
data = length 86, hash 64983E46
sample 112:
time = 2030000
flags = 1
data = length 86, hash CEA76A1E
sample 113:
time = 2040000
flags = 1
data = length 87, hash AADE498E
sample 114:
time = 2050000
flags = 1
data = length 127, hash 353A6D8C
sample 115:
time = 2060000
flags = 1
data = length 87, hash 29E18E62
sample 116:
time = 2070000
flags = 1
data = length 87, hash 2CF7B30F
sample 117:
time = 2080000
flags = 1
data = length 94, hash 758704C3
sample 118:
time = 2090000
flags = 1
data = length 88, hash C2153A4C
sample 119:
time = 2100000
flags = 1
data = length 86, hash A0A83DA5
sample 120:
time = 2110000
flags = 1
data = length 86, hash 41017D7F
sample 121:
time = 2120000
flags = 1
data = length 93, hash 686B0CA2
sample 122:
time = 2130000
flags = 1
data = length 86, hash 554D16CC
sample 123:
time = 2140000
flags = 1
data = length 88, hash 99D72771
sample 124:
time = 2150000
flags = 1
data = length 88, hash 7176DFBF
sample 125:
time = 2160000
flags = 1
data = length 86, hash BAA22669
sample 126:
time = 2170000
flags = 1
data = length 88, hash B00B0D3C
sample 127:
time = 2180000
flags = 1
data = length 89, hash 73FED83A
sample 128:
time = 2190000
flags = 1
data = length 86, hash 4A4138D3
sample 129:
time = 2200000
flags = 1
data = length 89, hash E0A860FF
sample 130:
time = 2210000
flags = 1
data = length 95, hash EE5A8AED
sample 131:
time = 2220000
flags = 1
data = length 92, hash 36DBD7FD
sample 132:
time = 2230000
flags = 1
data = length 88, hash EE47A7E4
sample 133:
time = 2240000
flags = 1
data = length 100, hash 2E1A603F
sample 134:
time = 2250000
flags = 1
data = length 89, hash 657ED4A3
sample 135:
time = 2260000
flags = 1
data = length 86, hash A833DC7B
sample 136:
time = 2270000
flags = 1
data = length 88, hash 81E80732
sample 137:
time = 2280000
flags = 1
data = length 91, hash FA256A0F
sample 138:
time = 2290000
flags = 1
data = length 88, hash A63A4DBA
sample 139:
time = 2300000
flags = 1
data = length 88, hash 67910A9F
sample 140:
time = 2310000
flags = 1
data = length 86, hash EB387DB6
sample 141:
time = 2320000
flags = 1
data = length 88, hash 5ACAAC2A
sample 142:
time = 2330000
flags = 1
data = length 86, hash 6ADF2E1F
sample 143:
time = 2340000
flags = 1
data = length 85, hash 9D064471
sample 144:
time = 2350000
flags = 1
data = length 87, hash F176C59
sample 145:
time = 2360000
flags = 1
data = length 89, hash 5CA40CE4
sample 146:
time = 2370000
flags = 1
data = length 88, hash 67B944FC
sample 147:
time = 2380000
flags = 1
data = length 86, hash B3A84EC8
sample 148:
time = 2390000
flags = 1
data = length 92, hash A6ACF94B
sample 149:
time = 2400000
flags = 1
data = length 88, hash CB0C9730
sample 150:
time = 2410000
flags = 1
data = length 88, hash C79FE804
sample 151:
time = 2420000
flags = 1
data = length 88, hash A74C7F0A
sample 152:
time = 2430000
flags = 1
data = length 91, hash 55F6F0A5
sample 153:
time = 2440000
flags = 1
data = length 93, hash 330F33E7
sample 154:
time = 2450000
flags = 1
data = length 89, hash 614AFBA0
sample 155:
time = 2460000
flags = 1
data = length 87, hash 3CE4652D
sample 156:
time = 2470000
flags = 1
data = length 87, hash 4EFD5467
sample 157:
time = 2480000
flags = 1
data = length 86, hash D81B3EB8
sample 158:
time = 2490000
flags = 1
data = length 88, hash 96CB6871
sample 159:
time = 2500000
flags = 1
data = length 88, hash E9DF2786
sample 160:
time = 2510000
flags = 1
data = length 89, hash 2CA33D96
sample 161:
time = 2520000
flags = 1
data = length 90, hash 96BDE594
sample 162:
time = 2530000
flags = 1
data = length 87, hash C261493C
sample 163:
time = 2540000
flags = 1
data = length 86, hash D037318E
sample 164:
time = 2550000
flags = 1
data = length 88, hash BC15BC88
sample 165:
time = 2560000
flags = 1
data = length 91, hash A8361A51
sample 166:
time = 2570000
flags = 1
data = length 87, hash 4AFDB5F2
sample 167:
time = 2580000
flags = 1
data = length 87, hash 6447F8CB
sample 168:
time = 2590000
flags = 1
data = length 89, hash 48305229
sample 169:
time = 2600000
flags = 1
data = length 87, hash 8741D9E7
sample 170:
time = 2610000
flags = 1
data = length 120, hash 761F020C
sample 171:
time = 2620000
flags = 1
data = length 139, hash AECE2E57
sample 172:
time = 2630000
flags = 1
data = length 166, hash 6288797A
sample 173:
time = 2640000
flags = 1
data = length 144, hash 437821A0
sample 174:
time = 2650000
flags = 1
data = length 113, hash FCCBEDF1
sample 175:
time = 2660000
flags = 1
data = length 108, hash C4040614
sample 176:
time = 2670000
flags = 1
data = length 125, hash E29064C2
sample 177:
time = 2680000
flags = 1
data = length 126, hash D42D24FF
sample 178:
time = 2690000
flags = 1
data = length 122, hash 30AF267D
sample 179:
time = 2700000
flags = 1
data = length 122, hash 45CEC1FB
sample 180:
time = 2710000
flags = 1
data = length 134, hash 59143FE2
sample 181:
time = 2720000
flags = 1
data = length 134, hash BD52A84
sample 182:
time = 2730000
flags = 1
data = length 120, hash 745C3714
sample 183:
time = 2740000
flags = 1
data = length 126, hash 505E117B
tracksEnded = true

View File

@ -0,0 +1,389 @@
seekMap:
isSeekable = true
duration = 2747500
getPosition(0) = [[timeUs=0, position=250]]
getPosition(1) = [[timeUs=1, position=250]]
getPosition(1373750) = [[timeUs=1373750, position=250]]
getPosition(2747500) = [[timeUs=2747500, position=250]]
numberOfTracks = 1
track 0:
total output bytes = 8698
sample count = 92
format 0:
sampleMimeType = audio/opus
channelCount = 2
sampleRate = 48000
metadata = entries=[VC: encoder=Lavf54.20.4]
initializationData:
data = length 19, hash BFE794DB
data = length 8, hash CA22068C
data = length 8, hash 79C07075
sample 0:
time = 1830000
flags = 1
data = length 86, hash 64D21AA1
sample 1:
time = 1840000
flags = 1
data = length 86, hash A1FAAF2C
sample 2:
time = 1850000
flags = 1
data = length 86, hash ECA80F7E
sample 3:
time = 1860000
flags = 1
data = length 86, hash FEB03B2C
sample 4:
time = 1870000
flags = 1
data = length 85, hash 2C2E6B2F
sample 5:
time = 1880000
flags = 1
data = length 89, hash A0D7AC3
sample 6:
time = 1890000
flags = 1
data = length 87, hash 83739547
sample 7:
time = 1900000
flags = 1
data = length 86, hash 991E531E
sample 8:
time = 1910000
flags = 1
data = length 88, hash 16B287A3
sample 9:
time = 1920000
flags = 1
data = length 86, hash FC86EED
sample 10:
time = 1930000
flags = 1
data = length 86, hash 96AF0248
sample 11:
time = 1940000
flags = 1
data = length 86, hash 288402C8
sample 12:
time = 1950000
flags = 1
data = length 87, hash 4BBA7912
sample 13:
time = 1960000
flags = 1
data = length 86, hash 4A59C719
sample 14:
time = 1970000
flags = 1
data = length 85, hash 906E8187
sample 15:
time = 1980000
flags = 1
data = length 90, hash CB8B755D
sample 16:
time = 1990000
flags = 1
data = length 87, hash C8E02C
sample 17:
time = 2000000
flags = 1
data = length 88, hash ACF4D89A
sample 18:
time = 2010000
flags = 1
data = length 86, hash 510FE048
sample 19:
time = 2020000
flags = 1
data = length 86, hash 64983E46
sample 20:
time = 2030000
flags = 1
data = length 86, hash CEA76A1E
sample 21:
time = 2040000
flags = 1
data = length 87, hash AADE498E
sample 22:
time = 2050000
flags = 1
data = length 127, hash 353A6D8C
sample 23:
time = 2060000
flags = 1
data = length 87, hash 29E18E62
sample 24:
time = 2070000
flags = 1
data = length 87, hash 2CF7B30F
sample 25:
time = 2080000
flags = 1
data = length 94, hash 758704C3
sample 26:
time = 2090000
flags = 1
data = length 88, hash C2153A4C
sample 27:
time = 2100000
flags = 1
data = length 86, hash A0A83DA5
sample 28:
time = 2110000
flags = 1
data = length 86, hash 41017D7F
sample 29:
time = 2120000
flags = 1
data = length 93, hash 686B0CA2
sample 30:
time = 2130000
flags = 1
data = length 86, hash 554D16CC
sample 31:
time = 2140000
flags = 1
data = length 88, hash 99D72771
sample 32:
time = 2150000
flags = 1
data = length 88, hash 7176DFBF
sample 33:
time = 2160000
flags = 1
data = length 86, hash BAA22669
sample 34:
time = 2170000
flags = 1
data = length 88, hash B00B0D3C
sample 35:
time = 2180000
flags = 1
data = length 89, hash 73FED83A
sample 36:
time = 2190000
flags = 1
data = length 86, hash 4A4138D3
sample 37:
time = 2200000
flags = 1
data = length 89, hash E0A860FF
sample 38:
time = 2210000
flags = 1
data = length 95, hash EE5A8AED
sample 39:
time = 2220000
flags = 1
data = length 92, hash 36DBD7FD
sample 40:
time = 2230000
flags = 1
data = length 88, hash EE47A7E4
sample 41:
time = 2240000
flags = 1
data = length 100, hash 2E1A603F
sample 42:
time = 2250000
flags = 1
data = length 89, hash 657ED4A3
sample 43:
time = 2260000
flags = 1
data = length 86, hash A833DC7B
sample 44:
time = 2270000
flags = 1
data = length 88, hash 81E80732
sample 45:
time = 2280000
flags = 1
data = length 91, hash FA256A0F
sample 46:
time = 2290000
flags = 1
data = length 88, hash A63A4DBA
sample 47:
time = 2300000
flags = 1
data = length 88, hash 67910A9F
sample 48:
time = 2310000
flags = 1
data = length 86, hash EB387DB6
sample 49:
time = 2320000
flags = 1
data = length 88, hash 5ACAAC2A
sample 50:
time = 2330000
flags = 1
data = length 86, hash 6ADF2E1F
sample 51:
time = 2340000
flags = 1
data = length 85, hash 9D064471
sample 52:
time = 2350000
flags = 1
data = length 87, hash F176C59
sample 53:
time = 2360000
flags = 1
data = length 89, hash 5CA40CE4
sample 54:
time = 2370000
flags = 1
data = length 88, hash 67B944FC
sample 55:
time = 2380000
flags = 1
data = length 86, hash B3A84EC8
sample 56:
time = 2390000
flags = 1
data = length 92, hash A6ACF94B
sample 57:
time = 2400000
flags = 1
data = length 88, hash CB0C9730
sample 58:
time = 2410000
flags = 1
data = length 88, hash C79FE804
sample 59:
time = 2420000
flags = 1
data = length 88, hash A74C7F0A
sample 60:
time = 2430000
flags = 1
data = length 91, hash 55F6F0A5
sample 61:
time = 2440000
flags = 1
data = length 93, hash 330F33E7
sample 62:
time = 2450000
flags = 1
data = length 89, hash 614AFBA0
sample 63:
time = 2460000
flags = 1
data = length 87, hash 3CE4652D
sample 64:
time = 2470000
flags = 1
data = length 87, hash 4EFD5467
sample 65:
time = 2480000
flags = 1
data = length 86, hash D81B3EB8
sample 66:
time = 2490000
flags = 1
data = length 88, hash 96CB6871
sample 67:
time = 2500000
flags = 1
data = length 88, hash E9DF2786
sample 68:
time = 2510000
flags = 1
data = length 89, hash 2CA33D96
sample 69:
time = 2520000
flags = 1
data = length 90, hash 96BDE594
sample 70:
time = 2530000
flags = 1
data = length 87, hash C261493C
sample 71:
time = 2540000
flags = 1
data = length 86, hash D037318E
sample 72:
time = 2550000
flags = 1
data = length 88, hash BC15BC88
sample 73:
time = 2560000
flags = 1
data = length 91, hash A8361A51
sample 74:
time = 2570000
flags = 1
data = length 87, hash 4AFDB5F2
sample 75:
time = 2580000
flags = 1
data = length 87, hash 6447F8CB
sample 76:
time = 2590000
flags = 1
data = length 89, hash 48305229
sample 77:
time = 2600000
flags = 1
data = length 87, hash 8741D9E7
sample 78:
time = 2610000
flags = 1
data = length 120, hash 761F020C
sample 79:
time = 2620000
flags = 1
data = length 139, hash AECE2E57
sample 80:
time = 2630000
flags = 1
data = length 166, hash 6288797A
sample 81:
time = 2640000
flags = 1
data = length 144, hash 437821A0
sample 82:
time = 2650000
flags = 1
data = length 113, hash FCCBEDF1
sample 83:
time = 2660000
flags = 1
data = length 108, hash C4040614
sample 84:
time = 2670000
flags = 1
data = length 125, hash E29064C2
sample 85:
time = 2680000
flags = 1
data = length 126, hash D42D24FF
sample 86:
time = 2690000
flags = 1
data = length 122, hash 30AF267D
sample 87:
time = 2700000
flags = 1
data = length 122, hash 45CEC1FB
sample 88:
time = 2710000
flags = 1
data = length 134, hash 59143FE2
sample 89:
time = 2720000
flags = 1
data = length 134, hash BD52A84
sample 90:
time = 2730000
flags = 1
data = length 120, hash 745C3714
sample 91:
time = 2740000
flags = 1
data = length 126, hash 505E117B
tracksEnded = true

View File

@ -0,0 +1,25 @@
seekMap:
isSeekable = true
duration = 2747500
getPosition(0) = [[timeUs=0, position=250]]
getPosition(1) = [[timeUs=1, position=250]]
getPosition(1373750) = [[timeUs=1373750, position=250]]
getPosition(2747500) = [[timeUs=2747500, position=250]]
numberOfTracks = 1
track 0:
total output bytes = 126
sample count = 1
format 0:
sampleMimeType = audio/opus
channelCount = 2
sampleRate = 48000
metadata = entries=[VC: encoder=Lavf54.20.4]
initializationData:
data = length 19, hash BFE794DB
data = length 8, hash CA22068C
data = length 8, hash 79C07075
sample 0:
time = 2741000
flags = 1
data = length 126, hash 505E117B
tracksEnded = true