From eb65f5e20a106c3e7a781bcf540416be5000ecac Mon Sep 17 00:00:00 2001 From: olly Date: Wed, 1 Apr 2020 15:57:01 +0100 Subject: [PATCH] Fix ADTS extraction with mid-stream ID3 PiperOrigin-RevId: 304184650 --- RELEASENOTES.md | 3 + .../exoplayer2/extractor/ts/AdtsReader.java | 78 ++- .../extractor/ts/AdtsExtractorTest.java | 5 + .../src/test/assets/ts/sample_with_id3.adts | Bin 0 -> 31946 bytes .../assets/ts/sample_with_id3.adts.0.dump | 607 ++++++++++++++++++ .../sample_with_id3.adts.unknown_length.dump | 607 ++++++++++++++++++ 6 files changed, 1275 insertions(+), 25 deletions(-) create mode 100644 testdata/src/test/assets/ts/sample_with_id3.adts create mode 100644 testdata/src/test/assets/ts/sample_with_id3.adts.0.dump create mode 100644 testdata/src/test/assets/ts/sample_with_id3.adts.unknown_length.dump 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: * *

* - * 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 0000000000000000000000000000000000000000..690fe90bd0ab0e2bd8849ad95a44a1341523a08a GIT binary patch literal 31946 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 SC+zUM>slez68ut literal 0 HcmV?d00001 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