diff --git a/RELEASENOTES.md b/RELEASENOTES.md
index 86cc960862..d4a39f7fb2 100644
--- a/RELEASENOTES.md
+++ b/RELEASENOTES.md
@@ -132,6 +132,9 @@
* Fix playback of Widevine protected content that only provides V1 PSSH atoms
on API levels 21 and 22.
* Fix playback of PlayReady content on Fire TV Stick (Gen 2).
+ * Fix playback of WAV files with trailing non-media bytes
+ ([#7129](https://github.com/google/ExoPlayer/issues/7129)).
+ * Fix playback of ADTS files with mid-stream ID3 metadata.
* DASH:
* Update the manifest URI to avoid repeated HTTP redirects
([#6907](https://github.com/google/ExoPlayer/issues/6907)).
diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/AdtsReader.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/AdtsReader.java
index c0cf8427b8..59ab6599b0 100644
--- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/AdtsReader.java
+++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/AdtsReader.java
@@ -355,42 +355,44 @@ public final class AdtsReader implements ElementaryStreamReader {
}
/**
- * Returns whether the given syncPositionCandidate is a real SYNC word.
- *
- *
SYNC word pattern can occur within AAC data, so we perform a few checks to make sure this is
- * really a SYNC word. This includes:
+ * Checks whether a candidate SYNC word position is likely to be the position of a real SYNC word.
+ * The caller must check that the first byte of the SYNC word is 0xFF before calling this method.
+ * This method performs the following checks:
*
*
- * - Checking if MPEG version of this frame matches the first detected version.
- *
- Checking if the sample rate index of this frame matches the first detected sample rate
- * index.
- *
- Checking if the bytes immediately after the current package also match a SYNC-word.
+ *
- The MPEG version of this frame must match the previously detected version.
+ *
- The sample rate index of this frame must match the previously detected sample rate index.
+ *
- The frame size must be at least 7 bytes
+ *
- The bytes following the frame must be either another SYNC word with the same MPEG
+ * version, or the start of an ID3 header.
*
*
- * If the buffer runs out of data for any check, optimistically skip that check, because
- * AdtsReader consumes each buffer as a whole. We will still run a header validity check later.
+ * With the exception of the first check, if there is insufficient data in the buffer then checks
+ * are optimistically skipped and {@code true} is returned.
+ *
+ * @param pesBuffer The buffer containing at data to check.
+ * @param syncPositionCandidate The candidate SYNC word position. May be -1 if the first byte of
+ * the candidate was the last byte of the previously consumed buffer.
+ * @return True if all checks were passed or skipped, indicating the position is likely to be the
+ * position of a real SYNC word. False otherwise.
*/
private boolean checkSyncPositionValid(ParsableByteArray pesBuffer, int syncPositionCandidate) {
- // The SYNC word contains 2 bytes, and the first byte may be in the previously consumed buffer.
- // Hence the second byte of the SYNC word may be byte 0 of this buffer, and
- // syncPositionCandidate (which indicates position of the first byte of the SYNC word) may be
- // -1.
- // Since the first byte of the SYNC word is always FF, which does not contain any informational
- // bits, we set the byte position to be the second byte in the SYNC word to ensure it's always
- // within this buffer.
pesBuffer.setPosition(syncPositionCandidate + 1);
if (!tryRead(pesBuffer, adtsScratch.data, 1)) {
return false;
}
+ // The MPEG version of this frame must match the previously detected version.
adtsScratch.setPosition(4);
int currentFrameVersion = adtsScratch.readBits(1);
if (firstFrameVersion != VERSION_UNSET && currentFrameVersion != firstFrameVersion) {
return false;
}
+ // The sample rate index of this frame must match the previously detected sample rate index.
if (firstFrameSampleRateIndex != C.INDEX_UNSET) {
if (!tryRead(pesBuffer, adtsScratch.data, 1)) {
+ // Insufficient data for further checks.
return true;
}
adtsScratch.setPosition(2);
@@ -401,24 +403,50 @@ public final class AdtsReader implements ElementaryStreamReader {
pesBuffer.setPosition(syncPositionCandidate + 2);
}
- // Optionally check the byte after this frame matches SYNC word.
-
+ // The frame size must be at least 7 bytes.
if (!tryRead(pesBuffer, adtsScratch.data, 4)) {
+ // Insufficient data for further checks.
return true;
}
adtsScratch.setPosition(14);
int frameSize = adtsScratch.readBits(13);
- if (frameSize <= 6) {
- // Not a frame.
+ if (frameSize < 7) {
return false;
}
+
+ // The bytes following the frame must be either another SYNC word with the same MPEG version, or
+ // the start of an ID3 header.
+ byte[] data = pesBuffer.data;
+ int dataLimit = pesBuffer.limit();
int nextSyncPosition = syncPositionCandidate + frameSize;
- if (nextSyncPosition + 1 >= pesBuffer.limit()) {
+ if (nextSyncPosition >= dataLimit) {
+ // Insufficient data for further checks.
return true;
}
- return (isAdtsSyncBytes(pesBuffer.data[nextSyncPosition], pesBuffer.data[nextSyncPosition + 1])
- && (firstFrameVersion == VERSION_UNSET
- || ((pesBuffer.data[nextSyncPosition + 1] & 0x8) >> 3) == currentFrameVersion));
+ if (data[nextSyncPosition] == (byte) 0xFF) {
+ if (nextSyncPosition + 1 == dataLimit) {
+ // Insufficient data for further checks.
+ return true;
+ }
+ return isAdtsSyncBytes((byte) 0xFF, data[nextSyncPosition + 1])
+ && ((data[nextSyncPosition + 1] & 0x8) >> 3) == currentFrameVersion;
+ } else {
+ if (data[nextSyncPosition] != 'I') {
+ return false;
+ }
+ if (nextSyncPosition + 1 == dataLimit) {
+ // Insufficient data for further checks.
+ return true;
+ }
+ if (data[nextSyncPosition + 1] != 'D') {
+ return false;
+ }
+ if (nextSyncPosition + 2 == dataLimit) {
+ // Insufficient data for further checks.
+ return true;
+ }
+ return data[nextSyncPosition + 2] == '3';
+ }
}
private boolean isAdtsSyncBytes(byte firstByte, byte secondByte) {
diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/AdtsExtractorTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/AdtsExtractorTest.java
index ef2e225478..a06d228553 100644
--- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/AdtsExtractorTest.java
+++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ts/AdtsExtractorTest.java
@@ -29,6 +29,11 @@ public final class AdtsExtractorTest {
ExtractorAsserts.assertBehavior(AdtsExtractor::new, "ts/sample.adts");
}
+ @Test
+ public void sample_with_id3() throws Exception {
+ ExtractorAsserts.assertBehavior(AdtsExtractor::new, "ts/sample_with_id3.adts");
+ }
+
@Test
public void sample_withSeeking() throws Exception {
ExtractorAsserts.assertBehavior(
diff --git a/testdata/src/test/assets/ts/sample_with_id3.adts b/testdata/src/test/assets/ts/sample_with_id3.adts
new file mode 100644
index 0000000000..690fe90bd0
Binary files /dev/null and b/testdata/src/test/assets/ts/sample_with_id3.adts differ
diff --git a/testdata/src/test/assets/ts/sample_with_id3.adts.0.dump b/testdata/src/test/assets/ts/sample_with_id3.adts.0.dump
new file mode 100644
index 0000000000..1f5d510b2e
--- /dev/null
+++ b/testdata/src/test/assets/ts/sample_with_id3.adts.0.dump
@@ -0,0 +1,607 @@
+seekMap:
+ isSeekable = false
+ duration = UNSET TIME
+ getPosition(0) = [[timeUs=0, position=0]]
+numberOfTracks = 2
+track 0:
+ total output bytes = 30797
+ sample count = 144
+ format 0:
+ id = 0
+ sampleMimeType = audio/mp4a-latm
+ codecs = mp4a.40.2
+ channelCount = 1
+ sampleRate = 44100
+ initializationData:
+ data = length 2, hash 5F7
+ sample 0:
+ time = 0
+ flags = 1
+ data = length 23, hash 47DE9131
+ sample 1:
+ time = 23219
+ flags = 1
+ data = length 6, hash 31CF3A46
+ sample 2:
+ time = 46438
+ flags = 1
+ data = length 6, hash 31CF3A46
+ sample 3:
+ time = 69657
+ flags = 1
+ data = length 6, hash 31CF3A46
+ sample 4:
+ time = 92876
+ flags = 1
+ data = length 6, hash 31EC5206
+ sample 5:
+ time = 116095
+ flags = 1
+ data = length 171, hash 4F6478F6
+ sample 6:
+ time = 139314
+ flags = 1
+ data = length 202, hash AF4068A3
+ sample 7:
+ time = 162533
+ flags = 1
+ data = length 210, hash E4C10618
+ sample 8:
+ time = 185752
+ flags = 1
+ data = length 217, hash 9ECCD0D9
+ sample 9:
+ time = 208971
+ flags = 1
+ data = length 212, hash 6BAC2CD9
+ sample 10:
+ time = 232190
+ flags = 1
+ data = length 223, hash 188B6010
+ sample 11:
+ time = 255409
+ flags = 1
+ data = length 222, hash C1A04D0C
+ sample 12:
+ time = 278628
+ flags = 1
+ data = length 220, hash D65F9768
+ sample 13:
+ time = 301847
+ flags = 1
+ data = length 227, hash B96C9E14
+ sample 14:
+ time = 325066
+ flags = 1
+ data = length 229, hash 9FB09972
+ sample 15:
+ time = 348285
+ flags = 1
+ data = length 220, hash 2271F053
+ sample 16:
+ time = 371504
+ flags = 1
+ data = length 226, hash 5EDD2F4F
+ sample 17:
+ time = 394723
+ flags = 1
+ data = length 239, hash 957510E0
+ sample 18:
+ time = 417942
+ flags = 1
+ data = length 224, hash 718A8F47
+ sample 19:
+ time = 441161
+ flags = 1
+ data = length 225, hash 5E11E293
+ sample 20:
+ time = 464380
+ flags = 1
+ data = length 227, hash FCE50D27
+ sample 21:
+ time = 487599
+ flags = 1
+ data = length 212, hash 77908C40
+ sample 22:
+ time = 510818
+ flags = 1
+ data = length 227, hash 34C4EB32
+ sample 23:
+ time = 534037
+ flags = 1
+ data = length 231, hash 95488307
+ sample 24:
+ time = 557256
+ flags = 1
+ data = length 226, hash 97F12D6F
+ sample 25:
+ time = 580475
+ flags = 1
+ data = length 236, hash 91A9D9A2
+ sample 26:
+ time = 603694
+ flags = 1
+ data = length 227, hash 27A608F9
+ sample 27:
+ time = 626913
+ flags = 1
+ data = length 229, hash 57DAAE4
+ sample 28:
+ time = 650132
+ flags = 1
+ data = length 235, hash ED30AC34
+ sample 29:
+ time = 673351
+ flags = 1
+ data = length 227, hash BD3D6280
+ sample 30:
+ time = 696570
+ flags = 1
+ data = length 233, hash 694B1087
+ sample 31:
+ time = 719789
+ flags = 1
+ data = length 232, hash 1EDFE047
+ sample 32:
+ time = 743008
+ flags = 1
+ data = length 228, hash E2A831F4
+ sample 33:
+ time = 766227
+ flags = 1
+ data = length 231, hash 757E6012
+ sample 34:
+ time = 789446
+ flags = 1
+ data = length 223, hash 4003D791
+ sample 35:
+ time = 812665
+ flags = 1
+ data = length 232, hash 3CF9A07C
+ sample 36:
+ time = 835884
+ flags = 1
+ data = length 228, hash 25AC3FF7
+ sample 37:
+ time = 859103
+ flags = 1
+ data = length 220, hash 2C1824CE
+ sample 38:
+ time = 882322
+ flags = 1
+ data = length 229, hash 46FDD8FB
+ sample 39:
+ time = 905541
+ flags = 1
+ data = length 237, hash F6988018
+ sample 40:
+ time = 928760
+ flags = 1
+ data = length 242, hash 60436B6B
+ sample 41:
+ time = 951979
+ flags = 1
+ data = length 275, hash 90EDFA8E
+ sample 42:
+ time = 975198
+ flags = 1
+ data = length 242, hash 5C86EFCB
+ sample 43:
+ time = 998417
+ flags = 1
+ data = length 233, hash E0A51B82
+ sample 44:
+ time = 1021636
+ flags = 1
+ data = length 235, hash 590DF14F
+ sample 45:
+ time = 1044855
+ flags = 1
+ data = length 238, hash 69AF4E6E
+ sample 46:
+ time = 1068074
+ flags = 1
+ data = length 235, hash E745AE8D
+ sample 47:
+ time = 1091293
+ flags = 1
+ data = length 223, hash 295F2A13
+ sample 48:
+ time = 1114512
+ flags = 1
+ data = length 228, hash E2F47B21
+ sample 49:
+ time = 1137731
+ flags = 1
+ data = length 229, hash 262C3CFE
+ sample 50:
+ time = 1160950
+ flags = 1
+ data = length 232, hash 4B5BF5E8
+ sample 51:
+ time = 1184169
+ flags = 1
+ data = length 233, hash F3D80836
+ sample 52:
+ time = 1207388
+ flags = 1
+ data = length 237, hash 32E0A11E
+ sample 53:
+ time = 1230607
+ flags = 1
+ data = length 228, hash E1B89F13
+ sample 54:
+ time = 1253826
+ flags = 1
+ data = length 237, hash 8BDD9E38
+ sample 55:
+ time = 1277045
+ flags = 1
+ data = length 235, hash 3C84161F
+ sample 56:
+ time = 1300264
+ flags = 1
+ data = length 227, hash A47E1789
+ sample 57:
+ time = 1323483
+ flags = 1
+ data = length 228, hash 869FDFD3
+ sample 58:
+ time = 1346702
+ flags = 1
+ data = length 233, hash 272ECE2
+ sample 59:
+ time = 1369921
+ flags = 1
+ data = length 227, hash DB6B9618
+ sample 60:
+ time = 1393140
+ flags = 1
+ data = length 212, hash 63214325
+ sample 61:
+ time = 1416359
+ flags = 1
+ data = length 221, hash 9BA588A1
+ sample 62:
+ time = 1439578
+ flags = 1
+ data = length 225, hash 21EFD50C
+ sample 63:
+ time = 1462797
+ flags = 1
+ data = length 231, hash F3AD0BF
+ sample 64:
+ time = 1486016
+ flags = 1
+ data = length 224, hash 822C9210
+ sample 65:
+ time = 1509235
+ flags = 1
+ data = length 195, hash D4EF53EE
+ sample 66:
+ time = 1532454
+ flags = 1
+ data = length 195, hash A816647A
+ sample 67:
+ time = 1555673
+ flags = 1
+ data = length 184, hash 9A2B7E6
+ sample 68:
+ time = 1578892
+ flags = 1
+ data = length 210, hash 956E3600
+ sample 69:
+ time = 1602111
+ flags = 1
+ data = length 234, hash 35CFDA0A
+ sample 70:
+ time = 1625330
+ flags = 1
+ data = length 239, hash 9E15AC1E
+ sample 71:
+ time = 1648549
+ flags = 1
+ data = length 228, hash F3B70641
+ sample 72:
+ time = 1671768
+ flags = 1
+ data = length 237, hash 124E3194
+ sample 73:
+ time = 1694987
+ flags = 1
+ data = length 231, hash 950CD7C8
+ sample 74:
+ time = 1718206
+ flags = 1
+ data = length 236, hash A12E49AF
+ sample 75:
+ time = 1741425
+ flags = 1
+ data = length 242, hash 43BC9C24
+ sample 76:
+ time = 1764644
+ flags = 1
+ data = length 241, hash DCF0B17
+ sample 77:
+ time = 1787863
+ flags = 1
+ data = length 251, hash C0B99968
+ sample 78:
+ time = 1811082
+ flags = 1
+ data = length 245, hash 9B38ED1C
+ sample 79:
+ time = 1834301
+ flags = 1
+ data = length 238, hash 1BA69079
+ sample 80:
+ time = 1857520
+ flags = 1
+ data = length 233, hash 44C8C6BF
+ sample 81:
+ time = 1880739
+ flags = 1
+ data = length 231, hash EABBEE02
+ sample 82:
+ time = 1903958
+ flags = 1
+ data = length 226, hash D09C44FB
+ sample 83:
+ time = 1927177
+ flags = 1
+ data = length 235, hash BE6A6608
+ sample 84:
+ time = 1950396
+ flags = 1
+ data = length 235, hash 2735F454
+ sample 85:
+ time = 1973615
+ flags = 1
+ data = length 238, hash B160DFE7
+ sample 86:
+ time = 1996834
+ flags = 1
+ data = length 232, hash 1B217D2E
+ sample 87:
+ time = 2020053
+ flags = 1
+ data = length 251, hash D1C14CEA
+ sample 88:
+ time = 2043272
+ flags = 1
+ data = length 256, hash 97C87F08
+ sample 89:
+ time = 2066491
+ flags = 1
+ data = length 237, hash 6645DB3
+ sample 90:
+ time = 2089710
+ flags = 1
+ data = length 235, hash 727A1C82
+ sample 91:
+ time = 2112929
+ flags = 1
+ data = length 234, hash 5015F8B5
+ sample 92:
+ time = 2136148
+ flags = 1
+ data = length 241, hash 9102144B
+ sample 93:
+ time = 2159367
+ flags = 1
+ data = length 224, hash 64E0D807
+ sample 94:
+ time = 2182586
+ flags = 1
+ data = length 228, hash 1922B852
+ sample 95:
+ time = 2205805
+ flags = 1
+ data = length 224, hash 953502D8
+ sample 96:
+ time = 2229024
+ flags = 1
+ data = length 214, hash 92B87FE7
+ sample 97:
+ time = 2252243
+ flags = 1
+ data = length 213, hash BB0C8D86
+ sample 98:
+ time = 2275462
+ flags = 1
+ data = length 206, hash 9AD21017
+ sample 99:
+ time = 2298681
+ flags = 1
+ data = length 209, hash C479FE94
+ sample 100:
+ time = 2321900
+ flags = 1
+ data = length 220, hash 3033DCE1
+ sample 101:
+ time = 2345119
+ flags = 1
+ data = length 217, hash 7D589C94
+ sample 102:
+ time = 2368338
+ flags = 1
+ data = length 216, hash AAF6C183
+ sample 103:
+ time = 2391557
+ flags = 1
+ data = length 206, hash 1EE1207F
+ sample 104:
+ time = 2414776
+ flags = 1
+ data = length 204, hash 4BEB1210
+ sample 105:
+ time = 2437995
+ flags = 1
+ data = length 213, hash 21A841C9
+ sample 106:
+ time = 2461214
+ flags = 1
+ data = length 207, hash B80B0424
+ sample 107:
+ time = 2484433
+ flags = 1
+ data = length 212, hash 4785A1C3
+ sample 108:
+ time = 2507652
+ flags = 1
+ data = length 205, hash 59BF7229
+ sample 109:
+ time = 2530871
+ flags = 1
+ data = length 208, hash FA313DDE
+ sample 110:
+ time = 2554090
+ flags = 1
+ data = length 211, hash 190D85FD
+ sample 111:
+ time = 2577309
+ flags = 1
+ data = length 211, hash BA050052
+ sample 112:
+ time = 2600528
+ flags = 1
+ data = length 211, hash F3080F10
+ sample 113:
+ time = 2623747
+ flags = 1
+ data = length 210, hash F41B7BE7
+ sample 114:
+ time = 2646966
+ flags = 1
+ data = length 207, hash 2176C97E
+ sample 115:
+ time = 2670185
+ flags = 1
+ data = length 220, hash 32087455
+ sample 116:
+ time = 2693404
+ flags = 1
+ data = length 213, hash 4E5649A8
+ sample 117:
+ time = 2716623
+ flags = 1
+ data = length 213, hash 5F12FDCF
+ sample 118:
+ time = 2739842
+ flags = 1
+ data = length 204, hash 1E895C2A
+ sample 119:
+ time = 2763061
+ flags = 1
+ data = length 219, hash 45382270
+ sample 120:
+ time = 2786280
+ flags = 1
+ data = length 205, hash D66C6A1D
+ sample 121:
+ time = 2809499
+ flags = 1
+ data = length 204, hash 467AD01F
+ sample 122:
+ time = 2832718
+ flags = 1
+ data = length 211, hash F0435574
+ sample 123:
+ time = 2855937
+ flags = 1
+ data = length 206, hash 8C96B75F
+ sample 124:
+ time = 2879156
+ flags = 1
+ data = length 200, hash 82553248
+ sample 125:
+ time = 2902375
+ flags = 1
+ data = length 180, hash 1E51E6CE
+ sample 126:
+ time = 2925594
+ flags = 1
+ data = length 196, hash 33151DC4
+ sample 127:
+ time = 2948813
+ flags = 1
+ data = length 197, hash 1E62A7D6
+ sample 128:
+ time = 2972032
+ flags = 1
+ data = length 206, hash 6A6C4CC9
+ sample 129:
+ time = 2995251
+ flags = 1
+ data = length 209, hash A72FABAA
+ sample 130:
+ time = 3018470
+ flags = 1
+ data = length 217, hash BA33B985
+ sample 131:
+ time = 3041689
+ flags = 1
+ data = length 235, hash 9919CFD9
+ sample 132:
+ time = 3064908
+ flags = 1
+ data = length 236, hash A22C7267
+ sample 133:
+ time = 3088127
+ flags = 1
+ data = length 213, hash 3D57C901
+ sample 134:
+ time = 3111346
+ flags = 1
+ data = length 205, hash 47F68FDE
+ sample 135:
+ time = 3134565
+ flags = 1
+ data = length 210, hash 9A756E9C
+ sample 136:
+ time = 3157784
+ flags = 1
+ data = length 210, hash BD45C31F
+ sample 137:
+ time = 3181003
+ flags = 1
+ data = length 207, hash 8774FF7B
+ sample 138:
+ time = 3204222
+ flags = 1
+ data = length 149, hash 4678C0E5
+ sample 139:
+ time = 3227441
+ flags = 1
+ data = length 161, hash E991035D
+ sample 140:
+ time = 3250660
+ flags = 1
+ data = length 197, hash C3013689
+ sample 141:
+ time = 3273879
+ flags = 1
+ data = length 208, hash E6C0237
+ sample 142:
+ time = 3297098
+ flags = 1
+ data = length 232, hash A330F188
+ sample 143:
+ time = 3320317
+ flags = 1
+ data = length 174, hash 2B69C34E
+track 1:
+ total output bytes = 141
+ sample count = 2
+ format 0:
+ id = 1
+ sampleMimeType = application/id3
+ sample 0:
+ time = 0
+ flags = 1
+ data = length 55, hash A7EB51A0
+ sample 1:
+ time = 23219
+ flags = 1
+ data = length 86, hash 3FA72D40
+tracksEnded = true
diff --git a/testdata/src/test/assets/ts/sample_with_id3.adts.unknown_length.dump b/testdata/src/test/assets/ts/sample_with_id3.adts.unknown_length.dump
new file mode 100644
index 0000000000..1f5d510b2e
--- /dev/null
+++ b/testdata/src/test/assets/ts/sample_with_id3.adts.unknown_length.dump
@@ -0,0 +1,607 @@
+seekMap:
+ isSeekable = false
+ duration = UNSET TIME
+ getPosition(0) = [[timeUs=0, position=0]]
+numberOfTracks = 2
+track 0:
+ total output bytes = 30797
+ sample count = 144
+ format 0:
+ id = 0
+ sampleMimeType = audio/mp4a-latm
+ codecs = mp4a.40.2
+ channelCount = 1
+ sampleRate = 44100
+ initializationData:
+ data = length 2, hash 5F7
+ sample 0:
+ time = 0
+ flags = 1
+ data = length 23, hash 47DE9131
+ sample 1:
+ time = 23219
+ flags = 1
+ data = length 6, hash 31CF3A46
+ sample 2:
+ time = 46438
+ flags = 1
+ data = length 6, hash 31CF3A46
+ sample 3:
+ time = 69657
+ flags = 1
+ data = length 6, hash 31CF3A46
+ sample 4:
+ time = 92876
+ flags = 1
+ data = length 6, hash 31EC5206
+ sample 5:
+ time = 116095
+ flags = 1
+ data = length 171, hash 4F6478F6
+ sample 6:
+ time = 139314
+ flags = 1
+ data = length 202, hash AF4068A3
+ sample 7:
+ time = 162533
+ flags = 1
+ data = length 210, hash E4C10618
+ sample 8:
+ time = 185752
+ flags = 1
+ data = length 217, hash 9ECCD0D9
+ sample 9:
+ time = 208971
+ flags = 1
+ data = length 212, hash 6BAC2CD9
+ sample 10:
+ time = 232190
+ flags = 1
+ data = length 223, hash 188B6010
+ sample 11:
+ time = 255409
+ flags = 1
+ data = length 222, hash C1A04D0C
+ sample 12:
+ time = 278628
+ flags = 1
+ data = length 220, hash D65F9768
+ sample 13:
+ time = 301847
+ flags = 1
+ data = length 227, hash B96C9E14
+ sample 14:
+ time = 325066
+ flags = 1
+ data = length 229, hash 9FB09972
+ sample 15:
+ time = 348285
+ flags = 1
+ data = length 220, hash 2271F053
+ sample 16:
+ time = 371504
+ flags = 1
+ data = length 226, hash 5EDD2F4F
+ sample 17:
+ time = 394723
+ flags = 1
+ data = length 239, hash 957510E0
+ sample 18:
+ time = 417942
+ flags = 1
+ data = length 224, hash 718A8F47
+ sample 19:
+ time = 441161
+ flags = 1
+ data = length 225, hash 5E11E293
+ sample 20:
+ time = 464380
+ flags = 1
+ data = length 227, hash FCE50D27
+ sample 21:
+ time = 487599
+ flags = 1
+ data = length 212, hash 77908C40
+ sample 22:
+ time = 510818
+ flags = 1
+ data = length 227, hash 34C4EB32
+ sample 23:
+ time = 534037
+ flags = 1
+ data = length 231, hash 95488307
+ sample 24:
+ time = 557256
+ flags = 1
+ data = length 226, hash 97F12D6F
+ sample 25:
+ time = 580475
+ flags = 1
+ data = length 236, hash 91A9D9A2
+ sample 26:
+ time = 603694
+ flags = 1
+ data = length 227, hash 27A608F9
+ sample 27:
+ time = 626913
+ flags = 1
+ data = length 229, hash 57DAAE4
+ sample 28:
+ time = 650132
+ flags = 1
+ data = length 235, hash ED30AC34
+ sample 29:
+ time = 673351
+ flags = 1
+ data = length 227, hash BD3D6280
+ sample 30:
+ time = 696570
+ flags = 1
+ data = length 233, hash 694B1087
+ sample 31:
+ time = 719789
+ flags = 1
+ data = length 232, hash 1EDFE047
+ sample 32:
+ time = 743008
+ flags = 1
+ data = length 228, hash E2A831F4
+ sample 33:
+ time = 766227
+ flags = 1
+ data = length 231, hash 757E6012
+ sample 34:
+ time = 789446
+ flags = 1
+ data = length 223, hash 4003D791
+ sample 35:
+ time = 812665
+ flags = 1
+ data = length 232, hash 3CF9A07C
+ sample 36:
+ time = 835884
+ flags = 1
+ data = length 228, hash 25AC3FF7
+ sample 37:
+ time = 859103
+ flags = 1
+ data = length 220, hash 2C1824CE
+ sample 38:
+ time = 882322
+ flags = 1
+ data = length 229, hash 46FDD8FB
+ sample 39:
+ time = 905541
+ flags = 1
+ data = length 237, hash F6988018
+ sample 40:
+ time = 928760
+ flags = 1
+ data = length 242, hash 60436B6B
+ sample 41:
+ time = 951979
+ flags = 1
+ data = length 275, hash 90EDFA8E
+ sample 42:
+ time = 975198
+ flags = 1
+ data = length 242, hash 5C86EFCB
+ sample 43:
+ time = 998417
+ flags = 1
+ data = length 233, hash E0A51B82
+ sample 44:
+ time = 1021636
+ flags = 1
+ data = length 235, hash 590DF14F
+ sample 45:
+ time = 1044855
+ flags = 1
+ data = length 238, hash 69AF4E6E
+ sample 46:
+ time = 1068074
+ flags = 1
+ data = length 235, hash E745AE8D
+ sample 47:
+ time = 1091293
+ flags = 1
+ data = length 223, hash 295F2A13
+ sample 48:
+ time = 1114512
+ flags = 1
+ data = length 228, hash E2F47B21
+ sample 49:
+ time = 1137731
+ flags = 1
+ data = length 229, hash 262C3CFE
+ sample 50:
+ time = 1160950
+ flags = 1
+ data = length 232, hash 4B5BF5E8
+ sample 51:
+ time = 1184169
+ flags = 1
+ data = length 233, hash F3D80836
+ sample 52:
+ time = 1207388
+ flags = 1
+ data = length 237, hash 32E0A11E
+ sample 53:
+ time = 1230607
+ flags = 1
+ data = length 228, hash E1B89F13
+ sample 54:
+ time = 1253826
+ flags = 1
+ data = length 237, hash 8BDD9E38
+ sample 55:
+ time = 1277045
+ flags = 1
+ data = length 235, hash 3C84161F
+ sample 56:
+ time = 1300264
+ flags = 1
+ data = length 227, hash A47E1789
+ sample 57:
+ time = 1323483
+ flags = 1
+ data = length 228, hash 869FDFD3
+ sample 58:
+ time = 1346702
+ flags = 1
+ data = length 233, hash 272ECE2
+ sample 59:
+ time = 1369921
+ flags = 1
+ data = length 227, hash DB6B9618
+ sample 60:
+ time = 1393140
+ flags = 1
+ data = length 212, hash 63214325
+ sample 61:
+ time = 1416359
+ flags = 1
+ data = length 221, hash 9BA588A1
+ sample 62:
+ time = 1439578
+ flags = 1
+ data = length 225, hash 21EFD50C
+ sample 63:
+ time = 1462797
+ flags = 1
+ data = length 231, hash F3AD0BF
+ sample 64:
+ time = 1486016
+ flags = 1
+ data = length 224, hash 822C9210
+ sample 65:
+ time = 1509235
+ flags = 1
+ data = length 195, hash D4EF53EE
+ sample 66:
+ time = 1532454
+ flags = 1
+ data = length 195, hash A816647A
+ sample 67:
+ time = 1555673
+ flags = 1
+ data = length 184, hash 9A2B7E6
+ sample 68:
+ time = 1578892
+ flags = 1
+ data = length 210, hash 956E3600
+ sample 69:
+ time = 1602111
+ flags = 1
+ data = length 234, hash 35CFDA0A
+ sample 70:
+ time = 1625330
+ flags = 1
+ data = length 239, hash 9E15AC1E
+ sample 71:
+ time = 1648549
+ flags = 1
+ data = length 228, hash F3B70641
+ sample 72:
+ time = 1671768
+ flags = 1
+ data = length 237, hash 124E3194
+ sample 73:
+ time = 1694987
+ flags = 1
+ data = length 231, hash 950CD7C8
+ sample 74:
+ time = 1718206
+ flags = 1
+ data = length 236, hash A12E49AF
+ sample 75:
+ time = 1741425
+ flags = 1
+ data = length 242, hash 43BC9C24
+ sample 76:
+ time = 1764644
+ flags = 1
+ data = length 241, hash DCF0B17
+ sample 77:
+ time = 1787863
+ flags = 1
+ data = length 251, hash C0B99968
+ sample 78:
+ time = 1811082
+ flags = 1
+ data = length 245, hash 9B38ED1C
+ sample 79:
+ time = 1834301
+ flags = 1
+ data = length 238, hash 1BA69079
+ sample 80:
+ time = 1857520
+ flags = 1
+ data = length 233, hash 44C8C6BF
+ sample 81:
+ time = 1880739
+ flags = 1
+ data = length 231, hash EABBEE02
+ sample 82:
+ time = 1903958
+ flags = 1
+ data = length 226, hash D09C44FB
+ sample 83:
+ time = 1927177
+ flags = 1
+ data = length 235, hash BE6A6608
+ sample 84:
+ time = 1950396
+ flags = 1
+ data = length 235, hash 2735F454
+ sample 85:
+ time = 1973615
+ flags = 1
+ data = length 238, hash B160DFE7
+ sample 86:
+ time = 1996834
+ flags = 1
+ data = length 232, hash 1B217D2E
+ sample 87:
+ time = 2020053
+ flags = 1
+ data = length 251, hash D1C14CEA
+ sample 88:
+ time = 2043272
+ flags = 1
+ data = length 256, hash 97C87F08
+ sample 89:
+ time = 2066491
+ flags = 1
+ data = length 237, hash 6645DB3
+ sample 90:
+ time = 2089710
+ flags = 1
+ data = length 235, hash 727A1C82
+ sample 91:
+ time = 2112929
+ flags = 1
+ data = length 234, hash 5015F8B5
+ sample 92:
+ time = 2136148
+ flags = 1
+ data = length 241, hash 9102144B
+ sample 93:
+ time = 2159367
+ flags = 1
+ data = length 224, hash 64E0D807
+ sample 94:
+ time = 2182586
+ flags = 1
+ data = length 228, hash 1922B852
+ sample 95:
+ time = 2205805
+ flags = 1
+ data = length 224, hash 953502D8
+ sample 96:
+ time = 2229024
+ flags = 1
+ data = length 214, hash 92B87FE7
+ sample 97:
+ time = 2252243
+ flags = 1
+ data = length 213, hash BB0C8D86
+ sample 98:
+ time = 2275462
+ flags = 1
+ data = length 206, hash 9AD21017
+ sample 99:
+ time = 2298681
+ flags = 1
+ data = length 209, hash C479FE94
+ sample 100:
+ time = 2321900
+ flags = 1
+ data = length 220, hash 3033DCE1
+ sample 101:
+ time = 2345119
+ flags = 1
+ data = length 217, hash 7D589C94
+ sample 102:
+ time = 2368338
+ flags = 1
+ data = length 216, hash AAF6C183
+ sample 103:
+ time = 2391557
+ flags = 1
+ data = length 206, hash 1EE1207F
+ sample 104:
+ time = 2414776
+ flags = 1
+ data = length 204, hash 4BEB1210
+ sample 105:
+ time = 2437995
+ flags = 1
+ data = length 213, hash 21A841C9
+ sample 106:
+ time = 2461214
+ flags = 1
+ data = length 207, hash B80B0424
+ sample 107:
+ time = 2484433
+ flags = 1
+ data = length 212, hash 4785A1C3
+ sample 108:
+ time = 2507652
+ flags = 1
+ data = length 205, hash 59BF7229
+ sample 109:
+ time = 2530871
+ flags = 1
+ data = length 208, hash FA313DDE
+ sample 110:
+ time = 2554090
+ flags = 1
+ data = length 211, hash 190D85FD
+ sample 111:
+ time = 2577309
+ flags = 1
+ data = length 211, hash BA050052
+ sample 112:
+ time = 2600528
+ flags = 1
+ data = length 211, hash F3080F10
+ sample 113:
+ time = 2623747
+ flags = 1
+ data = length 210, hash F41B7BE7
+ sample 114:
+ time = 2646966
+ flags = 1
+ data = length 207, hash 2176C97E
+ sample 115:
+ time = 2670185
+ flags = 1
+ data = length 220, hash 32087455
+ sample 116:
+ time = 2693404
+ flags = 1
+ data = length 213, hash 4E5649A8
+ sample 117:
+ time = 2716623
+ flags = 1
+ data = length 213, hash 5F12FDCF
+ sample 118:
+ time = 2739842
+ flags = 1
+ data = length 204, hash 1E895C2A
+ sample 119:
+ time = 2763061
+ flags = 1
+ data = length 219, hash 45382270
+ sample 120:
+ time = 2786280
+ flags = 1
+ data = length 205, hash D66C6A1D
+ sample 121:
+ time = 2809499
+ flags = 1
+ data = length 204, hash 467AD01F
+ sample 122:
+ time = 2832718
+ flags = 1
+ data = length 211, hash F0435574
+ sample 123:
+ time = 2855937
+ flags = 1
+ data = length 206, hash 8C96B75F
+ sample 124:
+ time = 2879156
+ flags = 1
+ data = length 200, hash 82553248
+ sample 125:
+ time = 2902375
+ flags = 1
+ data = length 180, hash 1E51E6CE
+ sample 126:
+ time = 2925594
+ flags = 1
+ data = length 196, hash 33151DC4
+ sample 127:
+ time = 2948813
+ flags = 1
+ data = length 197, hash 1E62A7D6
+ sample 128:
+ time = 2972032
+ flags = 1
+ data = length 206, hash 6A6C4CC9
+ sample 129:
+ time = 2995251
+ flags = 1
+ data = length 209, hash A72FABAA
+ sample 130:
+ time = 3018470
+ flags = 1
+ data = length 217, hash BA33B985
+ sample 131:
+ time = 3041689
+ flags = 1
+ data = length 235, hash 9919CFD9
+ sample 132:
+ time = 3064908
+ flags = 1
+ data = length 236, hash A22C7267
+ sample 133:
+ time = 3088127
+ flags = 1
+ data = length 213, hash 3D57C901
+ sample 134:
+ time = 3111346
+ flags = 1
+ data = length 205, hash 47F68FDE
+ sample 135:
+ time = 3134565
+ flags = 1
+ data = length 210, hash 9A756E9C
+ sample 136:
+ time = 3157784
+ flags = 1
+ data = length 210, hash BD45C31F
+ sample 137:
+ time = 3181003
+ flags = 1
+ data = length 207, hash 8774FF7B
+ sample 138:
+ time = 3204222
+ flags = 1
+ data = length 149, hash 4678C0E5
+ sample 139:
+ time = 3227441
+ flags = 1
+ data = length 161, hash E991035D
+ sample 140:
+ time = 3250660
+ flags = 1
+ data = length 197, hash C3013689
+ sample 141:
+ time = 3273879
+ flags = 1
+ data = length 208, hash E6C0237
+ sample 142:
+ time = 3297098
+ flags = 1
+ data = length 232, hash A330F188
+ sample 143:
+ time = 3320317
+ flags = 1
+ data = length 174, hash 2B69C34E
+track 1:
+ total output bytes = 141
+ sample count = 2
+ format 0:
+ id = 1
+ sampleMimeType = application/id3
+ sample 0:
+ time = 0
+ flags = 1
+ data = length 55, hash A7EB51A0
+ sample 1:
+ time = 23219
+ flags = 1
+ data = length 86, hash 3FA72D40
+tracksEnded = true