From ae0d9b135992bdff28b0acb2b1b924414415c5a8 Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 30 Sep 2020 16:15:31 +0100 Subject: [PATCH] Preserve limit when resetting ParsableByteArray in OggPacket#populate When I moved ParsableByteArray#data behind a getter I replaced some assignments with calls to reset(byte[]): https://github.com/google/ExoPlayer/commit/ce2e6e2fd625db787b1f400614adcd7458144bbd reset(byte[]) deliberately sets `limit` to `data.length`, in order to handle cases that were reassigning `data` but not updating `limit`. However OggPacket was already using `limit` to track where to write 'new' data into the array, so changing `limit` to `data.length` caused us to try and write new data beyond the end of the array. I looked at other uses of reset(byte[]) in https://github.com/google/ExoPlayer/commit/ce2e6e2fd625db787b1f400614adcd7458144bbd and condluded the only other usage in MatroskaExtractor is legit and shouldn't be updated like this (because MatroskaExtractor previously *wasn't* correctly updating/maintaining `limit`). Issue: #7992 PiperOrigin-RevId: 334601586 --- RELEASENOTES.md | 2 + .../exoplayer2/extractor/ogg/OggPacket.java | 7 +- .../ogg/OggExtractorParameterizedTest.java | 20 +- ...bear_vorbis_with_large_metadata.ogg.0.dump | 740 ++++++++++++++++++ ...bear_vorbis_with_large_metadata.ogg.1.dump | 456 +++++++++++ ...bear_vorbis_with_large_metadata.ogg.2.dump | 216 +++++ ...bear_vorbis_with_large_metadata.ogg.3.dump | 20 + ...ith_large_metadata.ogg.unknown_length.dump | 737 +++++++++++++++++ .../ogg/bear_vorbis_with_large_metadata.ogg | Bin 0 -> 111383 bytes 9 files changed, 2194 insertions(+), 4 deletions(-) create mode 100644 testdata/src/test/assets/extractordumps/ogg/bear_vorbis_with_large_metadata.ogg.0.dump create mode 100644 testdata/src/test/assets/extractordumps/ogg/bear_vorbis_with_large_metadata.ogg.1.dump create mode 100644 testdata/src/test/assets/extractordumps/ogg/bear_vorbis_with_large_metadata.ogg.2.dump create mode 100644 testdata/src/test/assets/extractordumps/ogg/bear_vorbis_with_large_metadata.ogg.3.dump create mode 100644 testdata/src/test/assets/extractordumps/ogg/bear_vorbis_with_large_metadata.ogg.unknown_length.dump create mode 100644 testdata/src/test/assets/media/ogg/bear_vorbis_with_large_metadata.ogg diff --git a/RELEASENOTES.md b/RELEASENOTES.md index f32120b675..c04ea1114d 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -30,6 +30,8 @@ ([#7967](https://github.com/google/ExoPlayer/issues/7967)). * Use TLEN ID3 tag to compute the duration in Mp3Extractor ([#7949](https://github.com/google/ExoPlayer/issues/7949)). + * Fix regression for Ogg files with packets that span multiple pages + ([#7992](https://github.com/google/ExoPlayer/issues/7992)). * UI * Add the option to sort tracks by `Format` in `TrackSelectionView` and `TrackSelectionDialogBuilder` diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ogg/OggPacket.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ogg/OggPacket.java index 450bff4a36..c7718e7fa9 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ogg/OggPacket.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ogg/OggPacket.java @@ -88,7 +88,9 @@ import java.util.Arrays; int segmentIndex = currentSegmentIndex + segmentCount; if (size > 0) { if (packetArray.capacity() < packetArray.limit() + size) { - packetArray.reset(Arrays.copyOf(packetArray.getData(), packetArray.limit() + size)); + packetArray.reset( + Arrays.copyOf(packetArray.getData(), packetArray.limit() + size), + /* limit= */ packetArray.limit()); } input.readFully(packetArray.getData(), packetArray.limit(), size); packetArray.setLimit(packetArray.limit() + size); @@ -131,7 +133,8 @@ import java.util.Arrays; } packetArray.reset( Arrays.copyOf( - packetArray.getData(), max(OggPageHeader.MAX_PAGE_PAYLOAD, packetArray.limit()))); + packetArray.getData(), max(OggPageHeader.MAX_PAGE_PAYLOAD, packetArray.limit())), + /* limit= */ packetArray.limit()); } /** diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ogg/OggExtractorParameterizedTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ogg/OggExtractorParameterizedTest.java index cc78d59bf4..0731cfd95e 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ogg/OggExtractorParameterizedTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/ogg/OggExtractorParameterizedTest.java @@ -60,11 +60,27 @@ public final class OggExtractorParameterizedTest { OggExtractor::new, "media/ogg/bear_vorbis.ogg", simulationConfig); } - // Ensure the extractor can handle non-contiguous pages by using a file with 10 bytes of garbage - // data before the start of the second page. + /** + * Ensure the extractor can handle non-contiguous pages by using a file with 10 bytes of garbage + * data before the start of the second page. + * + *

https://github.com/google/ExoPlayer/issues/7230 + */ @Test public void vorbisWithGapBeforeSecondPage() throws Exception { ExtractorAsserts.assertBehavior( OggExtractor::new, "media/ogg/bear_vorbis_gap.ogg", simulationConfig); } + + /** + * Use some very large Vorbis Comment metadata to create a packet that is larger than a single Ogg + * page. + * + *

https://github.com/google/ExoPlayer/issues/7992 + */ + @Test + public void vorbisWithPacketSpanningBetweenPages() throws Exception { + ExtractorAsserts.assertBehavior( + OggExtractor::new, "media/ogg/bear_vorbis_with_large_metadata.ogg", simulationConfig); + } } diff --git a/testdata/src/test/assets/extractordumps/ogg/bear_vorbis_with_large_metadata.ogg.0.dump b/testdata/src/test/assets/extractordumps/ogg/bear_vorbis_with_large_metadata.ogg.0.dump new file mode 100644 index 0000000000..92aec373b5 --- /dev/null +++ b/testdata/src/test/assets/extractordumps/ogg/bear_vorbis_with_large_metadata.ogg.0.dump @@ -0,0 +1,740 @@ +seekMap: + isSeekable = true + duration = 2741000 + getPosition(0) = [[timeUs=0, position=84969]] + getPosition(1) = [[timeUs=1, position=84969]] + getPosition(1370500) = [[timeUs=1370500, position=84969]] + getPosition(2741000) = [[timeUs=2741000, position=84969]] +numberOfTracks = 1 +track 0: + total output bytes = 26873 + sample count = 180 + format 0: + averageBitrate = 112000 + sampleMimeType = audio/vorbis + channelCount = 2 + sampleRate = 48000 + initializationData: + data = length 30, hash 9A8FF207 + data = length 3832, hash 8A406249 + sample 0: + time = 0 + flags = 1 + data = length 49, hash 2FFF94F0 + sample 1: + time = 0 + flags = 1 + data = length 44, hash 3946418A + sample 2: + time = 2666 + flags = 1 + data = length 55, hash 2A0B878E + sample 3: + time = 5333 + flags = 1 + data = length 53, hash CC3B6879 + sample 4: + time = 8000 + flags = 1 + data = length 215, hash 106AE950 + sample 5: + time = 20000 + flags = 1 + data = length 192, hash 2B219F53 + sample 6: + time = 41333 + flags = 1 + data = length 197, hash FBC39422 + sample 7: + time = 62666 + flags = 1 + data = length 209, hash 386E8979 + sample 8: + time = 84000 + flags = 1 + data = length 42, hash E81162C1 + sample 9: + time = 96000 + flags = 1 + data = length 41, hash F15BEE36 + sample 10: + time = 98666 + flags = 1 + data = length 42, hash D67EB19 + sample 11: + time = 101333 + flags = 1 + data = length 42, hash F4DE4792 + sample 12: + time = 104000 + flags = 1 + data = length 53, hash 80F66AC3 + sample 13: + time = 106666 + flags = 1 + data = length 56, hash DCB9DFC4 + sample 14: + time = 109333 + flags = 1 + data = length 55, hash 4E0C4E9D + sample 15: + time = 112000 + flags = 1 + data = length 203, hash 176B6862 + sample 16: + time = 124000 + flags = 1 + data = length 193, hash AB13CB10 + sample 17: + time = 145333 + flags = 1 + data = length 203, hash DE63DE9F + sample 18: + time = 166666 + flags = 1 + data = length 194, hash 4A9508A2 + sample 19: + time = 188000 + flags = 1 + data = length 210, hash 196899B3 + sample 20: + time = 209333 + flags = 1 + data = length 195, hash B68407F1 + sample 21: + time = 230666 + flags = 1 + data = length 193, hash A1FA86E3 + sample 22: + time = 252000 + flags = 1 + data = length 194, hash 5C0B9343 + sample 23: + time = 273333 + flags = 1 + data = length 198, hash 789914B2 + sample 24: + time = 294666 + flags = 1 + data = length 183, hash 1B82D11F + sample 25: + time = 316000 + flags = 1 + data = length 199, hash D5B848F4 + sample 26: + time = 337333 + flags = 1 + data = length 192, hash B34427EA + sample 27: + time = 358666 + flags = 1 + data = length 199, hash C2599BB5 + sample 28: + time = 380000 + flags = 1 + data = length 195, hash BFD83194 + sample 29: + time = 401333 + flags = 1 + data = length 199, hash C9A7F7CA + sample 30: + time = 422666 + flags = 1 + data = length 44, hash 5D76EAD6 + sample 31: + time = 434666 + flags = 1 + data = length 43, hash 8619C423 + sample 32: + time = 437333 + flags = 1 + data = length 43, hash E490BBE + sample 33: + time = 440000 + flags = 1 + data = length 53, hash 8A557CAE + sample 34: + time = 442666 + flags = 1 + data = length 56, hash 81007BBA + sample 35: + time = 445333 + flags = 1 + data = length 56, hash 4E4DD67F + sample 36: + time = 448000 + flags = 1 + data = length 222, hash 414188AB + sample 37: + time = 460000 + flags = 1 + data = length 202, hash 67A07D30 + sample 38: + time = 481333 + flags = 1 + data = length 200, hash E357D853 + sample 39: + time = 502666 + flags = 1 + data = length 203, hash 4653DC90 + sample 40: + time = 524000 + flags = 1 + data = length 192, hash A65E6C09 + sample 41: + time = 545333 + flags = 1 + data = length 202, hash FBEAC508 + sample 42: + time = 566666 + flags = 1 + data = length 202, hash E9B7B59F + sample 43: + time = 588000 + flags = 1 + data = length 204, hash E24AA78E + sample 44: + time = 609333 + flags = 1 + data = length 41, hash 3FBC5216 + sample 45: + time = 621333 + flags = 1 + data = length 47, hash 153FBC55 + sample 46: + time = 624000 + flags = 1 + data = length 42, hash 2B493D6C + sample 47: + time = 626666 + flags = 1 + data = length 42, hash 8303BEE3 + sample 48: + time = 629333 + flags = 1 + data = length 62, hash 71AEE50B + sample 49: + time = 632000 + flags = 1 + data = length 54, hash 52F61908 + sample 50: + time = 634666 + flags = 1 + data = length 45, hash 7BD3E3A1 + sample 51: + time = 637333 + flags = 1 + data = length 41, hash E0F65472 + sample 52: + time = 640000 + flags = 1 + data = length 45, hash 41838675 + sample 53: + time = 642666 + flags = 1 + data = length 44, hash FCBC2147 + sample 54: + time = 645333 + flags = 1 + data = length 45, hash 1A5987E3 + sample 55: + time = 648000 + flags = 1 + data = length 43, hash 99074864 + sample 56: + time = 650666 + flags = 1 + data = length 57, hash D4A9B60A + sample 57: + time = 653333 + flags = 1 + data = length 52, hash 302129DA + sample 58: + time = 656000 + flags = 1 + data = length 57, hash D8DD99C0 + sample 59: + time = 658666 + flags = 1 + data = length 206, hash F4B9EF26 + sample 60: + time = 670666 + flags = 1 + data = length 197, hash 7B8ACC8A + sample 61: + time = 692000 + flags = 1 + data = length 186, hash 161027CB + sample 62: + time = 713333 + flags = 1 + data = length 186, hash 1D6871B6 + sample 63: + time = 734666 + flags = 1 + data = length 201, hash 536E9FDB + sample 64: + time = 756000 + flags = 1 + data = length 192, hash D38EFAC5 + sample 65: + time = 777333 + flags = 1 + data = length 194, hash 4B394EF3 + sample 66: + time = 798666 + flags = 1 + data = length 206, hash 1B31BA99 + sample 67: + time = 820000 + flags = 1 + data = length 212, hash AD061F43 + sample 68: + time = 841333 + flags = 1 + data = length 180, hash 6D1F7481 + sample 69: + time = 862666 + flags = 1 + data = length 195, hash D80B21F + sample 70: + time = 884000 + flags = 1 + data = length 186, hash D367882 + sample 71: + time = 905333 + flags = 1 + data = length 195, hash 2722159A + sample 72: + time = 926666 + flags = 1 + data = length 199, hash 10CEE97A + sample 73: + time = 948000 + flags = 1 + data = length 191, hash 2CF9FB3F + sample 74: + time = 969333 + flags = 1 + data = length 197, hash A725DA0 + sample 75: + time = 990666 + flags = 1 + data = length 211, hash D4E5DB9E + sample 76: + time = 1012000 + flags = 1 + data = length 189, hash 1A90F496 + sample 77: + time = 1033333 + flags = 1 + data = length 187, hash 44DB2689 + sample 78: + time = 1054666 + flags = 1 + data = length 197, hash 6D3E5117 + sample 79: + time = 1076000 + flags = 1 + data = length 208, hash 5B57B288 + sample 80: + time = 1097333 + flags = 1 + data = length 198, hash D5FC05 + sample 81: + time = 1118666 + flags = 1 + data = length 192, hash 350BBA45 + sample 82: + time = 1140000 + flags = 1 + data = length 195, hash 5F96F2A8 + sample 83: + time = 1161333 + flags = 1 + data = length 202, hash 61D7CC33 + sample 84: + time = 1182666 + flags = 1 + data = length 202, hash 49D335F2 + sample 85: + time = 1204000 + flags = 1 + data = length 192, hash 2FE9CB1A + sample 86: + time = 1225333 + flags = 1 + data = length 201, hash BF0763B2 + sample 87: + time = 1246666 + flags = 1 + data = length 184, hash AD047421 + sample 88: + time = 1268000 + flags = 1 + data = length 196, hash F9088F14 + sample 89: + time = 1289333 + flags = 1 + data = length 190, hash AC6D38FD + sample 90: + time = 1310666 + flags = 1 + data = length 195, hash 8D1A66D2 + sample 91: + time = 1332000 + flags = 1 + data = length 197, hash B46BFB6B + sample 92: + time = 1353333 + flags = 1 + data = length 195, hash D9761F23 + sample 93: + time = 1374666 + flags = 1 + data = length 204, hash 3391B617 + sample 94: + time = 1396000 + flags = 1 + data = length 42, hash 33A1FB52 + sample 95: + time = 1408000 + flags = 1 + data = length 44, hash 408B146E + sample 96: + time = 1410666 + flags = 1 + data = length 44, hash 171C7E0D + sample 97: + time = 1413333 + flags = 1 + data = length 54, hash 6307E16C + sample 98: + time = 1416000 + flags = 1 + data = length 53, hash 4A319572 + sample 99: + time = 1418666 + flags = 1 + data = length 215, hash BA9C445C + sample 100: + time = 1430666 + flags = 1 + data = length 201, hash 3120D234 + sample 101: + time = 1452000 + flags = 1 + data = length 187, hash DB44993C + sample 102: + time = 1473333 + flags = 1 + data = length 196, hash CF2002D7 + sample 103: + time = 1494666 + flags = 1 + data = length 185, hash E03B5D7 + sample 104: + time = 1516000 + flags = 1 + data = length 187, hash DA399A2C + sample 105: + time = 1537333 + flags = 1 + data = length 191, hash 292AA0DB + sample 106: + time = 1558666 + flags = 1 + data = length 201, hash 221910E0 + sample 107: + time = 1580000 + flags = 1 + data = length 194, hash F4ED7821 + sample 108: + time = 1601333 + flags = 1 + data = length 43, hash FDDA515E + sample 109: + time = 1613333 + flags = 1 + data = length 42, hash F3571C0A + sample 110: + time = 1616000 + flags = 1 + data = length 38, hash 39F910B3 + sample 111: + time = 1618666 + flags = 1 + data = length 41, hash 2D189531 + sample 112: + time = 1621333 + flags = 1 + data = length 43, hash 1F7574DB + sample 113: + time = 1624000 + flags = 1 + data = length 43, hash 644D15E5 + sample 114: + time = 1626666 + flags = 1 + data = length 49, hash E8A0878 + sample 115: + time = 1629333 + flags = 1 + data = length 55, hash DFF2046D + sample 116: + time = 1632000 + flags = 1 + data = length 49, hash 9FB8A23 + sample 117: + time = 1634666 + flags = 1 + data = length 41, hash E3E15E3B + sample 118: + time = 1637333 + flags = 1 + data = length 42, hash E5D17A32 + sample 119: + time = 1640000 + flags = 1 + data = length 42, hash F308B653 + sample 120: + time = 1642666 + flags = 1 + data = length 55, hash BB750D76 + sample 121: + time = 1645333 + flags = 1 + data = length 51, hash 96772ABF + sample 122: + time = 1648000 + flags = 1 + data = length 197, hash E4524346 + sample 123: + time = 1660000 + flags = 1 + data = length 188, hash AC3E1BB5 + sample 124: + time = 1681333 + flags = 1 + data = length 195, hash F56DB8A5 + sample 125: + time = 1702666 + flags = 1 + data = length 198, hash C8970FF7 + sample 126: + time = 1724000 + flags = 1 + data = length 202, hash AF425C68 + sample 127: + time = 1745333 + flags = 1 + data = length 196, hash 4215D839 + sample 128: + time = 1766666 + flags = 1 + data = length 204, hash DB9BE8E3 + sample 129: + time = 1788000 + flags = 1 + data = length 206, hash E5B20AB8 + sample 130: + time = 1809333 + flags = 1 + data = length 209, hash D7F47B95 + sample 131: + time = 1830666 + flags = 1 + data = length 193, hash FB54FB05 + sample 132: + time = 1852000 + flags = 1 + data = length 199, hash D99C3106 + sample 133: + time = 1873333 + flags = 1 + data = length 206, hash 253885B9 + sample 134: + time = 1894666 + flags = 1 + data = length 191, hash FBDD8162 + sample 135: + time = 1916000 + flags = 1 + data = length 183, hash 7290332F + sample 136: + time = 1937333 + flags = 1 + data = length 189, hash 1A9DC3DE + sample 137: + time = 1958666 + flags = 1 + data = length 201, hash 5D936764 + sample 138: + time = 1980000 + flags = 1 + data = length 193, hash 6B03E75E + sample 139: + time = 2001333 + flags = 1 + data = length 199, hash 8A21BA83 + sample 140: + time = 2022666 + flags = 1 + data = length 41, hash E6362210 + sample 141: + time = 2034666 + flags = 1 + data = length 43, hash 36A57B44 + sample 142: + time = 2037333 + flags = 1 + data = length 43, hash E51797D5 + sample 143: + time = 2040000 + flags = 1 + data = length 43, hash 1F336C72 + sample 144: + time = 2042666 + flags = 1 + data = length 42, hash 201AD367 + sample 145: + time = 2045333 + flags = 1 + data = length 50, hash 606CCD6 + sample 146: + time = 2048000 + flags = 1 + data = length 56, hash B15EBD7A + sample 147: + time = 2050666 + flags = 1 + data = length 212, hash 273B8D22 + sample 148: + time = 2062666 + flags = 1 + data = length 194, hash 44F9CE1 + sample 149: + time = 2084000 + flags = 1 + data = length 195, hash EDF9EBA1 + sample 150: + time = 2105333 + flags = 1 + data = length 194, hash CE9F2D26 + sample 151: + time = 2126666 + flags = 1 + data = length 192, hash 204F8A23 + sample 152: + time = 2148000 + flags = 1 + data = length 206, hash DFA57E67 + sample 153: + time = 2169333 + flags = 1 + data = length 196, hash 3CF084AB + sample 154: + time = 2190666 + flags = 1 + data = length 202, hash 2AF75C08 + sample 155: + time = 2212000 + flags = 1 + data = length 203, hash 748EAF7 + sample 156: + time = 2233333 + flags = 1 + data = length 205, hash ED82379D + sample 157: + time = 2254666 + flags = 1 + data = length 193, hash 61F26F22 + sample 158: + time = 2276000 + flags = 1 + data = length 189, hash 85EF1D20 + sample 159: + time = 2297333 + flags = 1 + data = length 187, hash 25E41FBF + sample 160: + time = 2318666 + flags = 1 + data = length 199, hash F365808 + sample 161: + time = 2340000 + flags = 1 + data = length 197, hash 94205329 + sample 162: + time = 2361333 + flags = 1 + data = length 201, hash FA2B2055 + sample 163: + time = 2382666 + flags = 1 + data = length 194, hash AF95381F + sample 164: + time = 2404000 + flags = 1 + data = length 201, hash 923D3534 + sample 165: + time = 2425333 + flags = 1 + data = length 198, hash 35F84C2E + sample 166: + time = 2446666 + flags = 1 + data = length 204, hash 6642CA40 + sample 167: + time = 2468000 + flags = 1 + data = length 183, hash 3E2DC6BE + sample 168: + time = 2489333 + flags = 1 + data = length 197, hash B1E458CE + sample 169: + time = 2510666 + flags = 1 + data = length 193, hash E9218C84 + sample 170: + time = 2532000 + flags = 1 + data = length 192, hash FEF08D4B + sample 171: + time = 2553333 + flags = 1 + data = length 201, hash FC411147 + sample 172: + time = 2574666 + flags = 1 + data = length 218, hash 86893464 + sample 173: + time = 2596000 + flags = 1 + data = length 226, hash 31C5320 + sample 174: + time = 2617333 + flags = 1 + data = length 233, hash 9432BEE5 + sample 175: + time = 2638666 + flags = 1 + data = length 213, hash B3FCC53E + sample 176: + time = 2660000 + flags = 1 + data = length 204, hash D70DD5A2 + sample 177: + time = 2681333 + flags = 1 + data = length 212, hash A4EF1B69 + sample 178: + time = 2702666 + flags = 1 + data = length 203, hash 8B0748B5 + sample 179: + time = 2724000 + flags = 1 + data = length 149, hash E455335B +tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/ogg/bear_vorbis_with_large_metadata.ogg.1.dump b/testdata/src/test/assets/extractordumps/ogg/bear_vorbis_with_large_metadata.ogg.1.dump new file mode 100644 index 0000000000..1a71ebbb10 --- /dev/null +++ b/testdata/src/test/assets/extractordumps/ogg/bear_vorbis_with_large_metadata.ogg.1.dump @@ -0,0 +1,456 @@ +seekMap: + isSeekable = true + duration = 2741000 + getPosition(0) = [[timeUs=0, position=84969]] + getPosition(1) = [[timeUs=1, position=84969]] + getPosition(1370500) = [[timeUs=1370500, position=84969]] + getPosition(2741000) = [[timeUs=2741000, position=84969]] +numberOfTracks = 1 +track 0: + total output bytes = 17598 + sample count = 109 + format 0: + averageBitrate = 112000 + sampleMimeType = audio/vorbis + channelCount = 2 + sampleRate = 48000 + initializationData: + data = length 30, hash 9A8FF207 + data = length 3832, hash 8A406249 + sample 0: + time = 905333 + flags = 1 + data = length 195, hash 2722159A + sample 1: + time = 926666 + flags = 1 + data = length 199, hash 10CEE97A + sample 2: + time = 948000 + flags = 1 + data = length 191, hash 2CF9FB3F + sample 3: + time = 969333 + flags = 1 + data = length 197, hash A725DA0 + sample 4: + time = 990666 + flags = 1 + data = length 211, hash D4E5DB9E + sample 5: + time = 1012000 + flags = 1 + data = length 189, hash 1A90F496 + sample 6: + time = 1033333 + flags = 1 + data = length 187, hash 44DB2689 + sample 7: + time = 1054666 + flags = 1 + data = length 197, hash 6D3E5117 + sample 8: + time = 1076000 + flags = 1 + data = length 208, hash 5B57B288 + sample 9: + time = 1097333 + flags = 1 + data = length 198, hash D5FC05 + sample 10: + time = 1118666 + flags = 1 + data = length 192, hash 350BBA45 + sample 11: + time = 1140000 + flags = 1 + data = length 195, hash 5F96F2A8 + sample 12: + time = 1161333 + flags = 1 + data = length 202, hash 61D7CC33 + sample 13: + time = 1182666 + flags = 1 + data = length 202, hash 49D335F2 + sample 14: + time = 1204000 + flags = 1 + data = length 192, hash 2FE9CB1A + sample 15: + time = 1225333 + flags = 1 + data = length 201, hash BF0763B2 + sample 16: + time = 1246666 + flags = 1 + data = length 184, hash AD047421 + sample 17: + time = 1268000 + flags = 1 + data = length 196, hash F9088F14 + sample 18: + time = 1289333 + flags = 1 + data = length 190, hash AC6D38FD + sample 19: + time = 1310666 + flags = 1 + data = length 195, hash 8D1A66D2 + sample 20: + time = 1332000 + flags = 1 + data = length 197, hash B46BFB6B + sample 21: + time = 1353333 + flags = 1 + data = length 195, hash D9761F23 + sample 22: + time = 1374666 + flags = 1 + data = length 204, hash 3391B617 + sample 23: + time = 1396000 + flags = 1 + data = length 42, hash 33A1FB52 + sample 24: + time = 1408000 + flags = 1 + data = length 44, hash 408B146E + sample 25: + time = 1410666 + flags = 1 + data = length 44, hash 171C7E0D + sample 26: + time = 1413333 + flags = 1 + data = length 54, hash 6307E16C + sample 27: + time = 1416000 + flags = 1 + data = length 53, hash 4A319572 + sample 28: + time = 1418666 + flags = 1 + data = length 215, hash BA9C445C + sample 29: + time = 1430666 + flags = 1 + data = length 201, hash 3120D234 + sample 30: + time = 1452000 + flags = 1 + data = length 187, hash DB44993C + sample 31: + time = 1473333 + flags = 1 + data = length 196, hash CF2002D7 + sample 32: + time = 1494666 + flags = 1 + data = length 185, hash E03B5D7 + sample 33: + time = 1516000 + flags = 1 + data = length 187, hash DA399A2C + sample 34: + time = 1537333 + flags = 1 + data = length 191, hash 292AA0DB + sample 35: + time = 1558666 + flags = 1 + data = length 201, hash 221910E0 + sample 36: + time = 1580000 + flags = 1 + data = length 194, hash F4ED7821 + sample 37: + time = 1601333 + flags = 1 + data = length 43, hash FDDA515E + sample 38: + time = 1613333 + flags = 1 + data = length 42, hash F3571C0A + sample 39: + time = 1616000 + flags = 1 + data = length 38, hash 39F910B3 + sample 40: + time = 1618666 + flags = 1 + data = length 41, hash 2D189531 + sample 41: + time = 1621333 + flags = 1 + data = length 43, hash 1F7574DB + sample 42: + time = 1624000 + flags = 1 + data = length 43, hash 644D15E5 + sample 43: + time = 1626666 + flags = 1 + data = length 49, hash E8A0878 + sample 44: + time = 1629333 + flags = 1 + data = length 55, hash DFF2046D + sample 45: + time = 1632000 + flags = 1 + data = length 49, hash 9FB8A23 + sample 46: + time = 1634666 + flags = 1 + data = length 41, hash E3E15E3B + sample 47: + time = 1637333 + flags = 1 + data = length 42, hash E5D17A32 + sample 48: + time = 1640000 + flags = 1 + data = length 42, hash F308B653 + sample 49: + time = 1642666 + flags = 1 + data = length 55, hash BB750D76 + sample 50: + time = 1645333 + flags = 1 + data = length 51, hash 96772ABF + sample 51: + time = 1648000 + flags = 1 + data = length 197, hash E4524346 + sample 52: + time = 1660000 + flags = 1 + data = length 188, hash AC3E1BB5 + sample 53: + time = 1681333 + flags = 1 + data = length 195, hash F56DB8A5 + sample 54: + time = 1702666 + flags = 1 + data = length 198, hash C8970FF7 + sample 55: + time = 1724000 + flags = 1 + data = length 202, hash AF425C68 + sample 56: + time = 1745333 + flags = 1 + data = length 196, hash 4215D839 + sample 57: + time = 1766666 + flags = 1 + data = length 204, hash DB9BE8E3 + sample 58: + time = 1788000 + flags = 1 + data = length 206, hash E5B20AB8 + sample 59: + time = 1809333 + flags = 1 + data = length 209, hash D7F47B95 + sample 60: + time = 1830666 + flags = 1 + data = length 193, hash FB54FB05 + sample 61: + time = 1852000 + flags = 1 + data = length 199, hash D99C3106 + sample 62: + time = 1873333 + flags = 1 + data = length 206, hash 253885B9 + sample 63: + time = 1894666 + flags = 1 + data = length 191, hash FBDD8162 + sample 64: + time = 1916000 + flags = 1 + data = length 183, hash 7290332F + sample 65: + time = 1937333 + flags = 1 + data = length 189, hash 1A9DC3DE + sample 66: + time = 1958666 + flags = 1 + data = length 201, hash 5D936764 + sample 67: + time = 1980000 + flags = 1 + data = length 193, hash 6B03E75E + sample 68: + time = 2001333 + flags = 1 + data = length 199, hash 8A21BA83 + sample 69: + time = 2022666 + flags = 1 + data = length 41, hash E6362210 + sample 70: + time = 2034666 + flags = 1 + data = length 43, hash 36A57B44 + sample 71: + time = 2037333 + flags = 1 + data = length 43, hash E51797D5 + sample 72: + time = 2040000 + flags = 1 + data = length 43, hash 1F336C72 + sample 73: + time = 2042666 + flags = 1 + data = length 42, hash 201AD367 + sample 74: + time = 2045333 + flags = 1 + data = length 50, hash 606CCD6 + sample 75: + time = 2048000 + flags = 1 + data = length 56, hash B15EBD7A + sample 76: + time = 2050666 + flags = 1 + data = length 212, hash 273B8D22 + sample 77: + time = 2062666 + flags = 1 + data = length 194, hash 44F9CE1 + sample 78: + time = 2084000 + flags = 1 + data = length 195, hash EDF9EBA1 + sample 79: + time = 2105333 + flags = 1 + data = length 194, hash CE9F2D26 + sample 80: + time = 2126666 + flags = 1 + data = length 192, hash 204F8A23 + sample 81: + time = 2148000 + flags = 1 + data = length 206, hash DFA57E67 + sample 82: + time = 2169333 + flags = 1 + data = length 196, hash 3CF084AB + sample 83: + time = 2190666 + flags = 1 + data = length 202, hash 2AF75C08 + sample 84: + time = 2212000 + flags = 1 + data = length 203, hash 748EAF7 + sample 85: + time = 2233333 + flags = 1 + data = length 205, hash ED82379D + sample 86: + time = 2254666 + flags = 1 + data = length 193, hash 61F26F22 + sample 87: + time = 2276000 + flags = 1 + data = length 189, hash 85EF1D20 + sample 88: + time = 2297333 + flags = 1 + data = length 187, hash 25E41FBF + sample 89: + time = 2318666 + flags = 1 + data = length 199, hash F365808 + sample 90: + time = 2340000 + flags = 1 + data = length 197, hash 94205329 + sample 91: + time = 2361333 + flags = 1 + data = length 201, hash FA2B2055 + sample 92: + time = 2382666 + flags = 1 + data = length 194, hash AF95381F + sample 93: + time = 2404000 + flags = 1 + data = length 201, hash 923D3534 + sample 94: + time = 2425333 + flags = 1 + data = length 198, hash 35F84C2E + sample 95: + time = 2446666 + flags = 1 + data = length 204, hash 6642CA40 + sample 96: + time = 2468000 + flags = 1 + data = length 183, hash 3E2DC6BE + sample 97: + time = 2489333 + flags = 1 + data = length 197, hash B1E458CE + sample 98: + time = 2510666 + flags = 1 + data = length 193, hash E9218C84 + sample 99: + time = 2532000 + flags = 1 + data = length 192, hash FEF08D4B + sample 100: + time = 2553333 + flags = 1 + data = length 201, hash FC411147 + sample 101: + time = 2574666 + flags = 1 + data = length 218, hash 86893464 + sample 102: + time = 2596000 + flags = 1 + data = length 226, hash 31C5320 + sample 103: + time = 2617333 + flags = 1 + data = length 233, hash 9432BEE5 + sample 104: + time = 2638666 + flags = 1 + data = length 213, hash B3FCC53E + sample 105: + time = 2660000 + flags = 1 + data = length 204, hash D70DD5A2 + sample 106: + time = 2681333 + flags = 1 + data = length 212, hash A4EF1B69 + sample 107: + time = 2702666 + flags = 1 + data = length 203, hash 8B0748B5 + sample 108: + time = 2724000 + flags = 1 + data = length 149, hash E455335B +tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/ogg/bear_vorbis_with_large_metadata.ogg.2.dump b/testdata/src/test/assets/extractordumps/ogg/bear_vorbis_with_large_metadata.ogg.2.dump new file mode 100644 index 0000000000..50b21ade22 --- /dev/null +++ b/testdata/src/test/assets/extractordumps/ogg/bear_vorbis_with_large_metadata.ogg.2.dump @@ -0,0 +1,216 @@ +seekMap: + isSeekable = true + duration = 2741000 + getPosition(0) = [[timeUs=0, position=84969]] + getPosition(1) = [[timeUs=1, position=84969]] + getPosition(1370500) = [[timeUs=1370500, position=84969]] + getPosition(2741000) = [[timeUs=2741000, position=84969]] +numberOfTracks = 1 +track 0: + total output bytes = 8658 + sample count = 49 + format 0: + averageBitrate = 112000 + sampleMimeType = audio/vorbis + channelCount = 2 + sampleRate = 48000 + initializationData: + data = length 30, hash 9A8FF207 + data = length 3832, hash 8A406249 + sample 0: + time = 1821333 + flags = 1 + data = length 193, hash FB54FB05 + sample 1: + time = 1842666 + flags = 1 + data = length 199, hash D99C3106 + sample 2: + time = 1864000 + flags = 1 + data = length 206, hash 253885B9 + sample 3: + time = 1885333 + flags = 1 + data = length 191, hash FBDD8162 + sample 4: + time = 1906666 + flags = 1 + data = length 183, hash 7290332F + sample 5: + time = 1928000 + flags = 1 + data = length 189, hash 1A9DC3DE + sample 6: + time = 1949333 + flags = 1 + data = length 201, hash 5D936764 + sample 7: + time = 1970666 + flags = 1 + data = length 193, hash 6B03E75E + sample 8: + time = 1992000 + flags = 1 + data = length 199, hash 8A21BA83 + sample 9: + time = 2013333 + flags = 1 + data = length 41, hash E6362210 + sample 10: + time = 2025333 + flags = 1 + data = length 43, hash 36A57B44 + sample 11: + time = 2028000 + flags = 1 + data = length 43, hash E51797D5 + sample 12: + time = 2030666 + flags = 1 + data = length 43, hash 1F336C72 + sample 13: + time = 2033333 + flags = 1 + data = length 42, hash 201AD367 + sample 14: + time = 2036000 + flags = 1 + data = length 50, hash 606CCD6 + sample 15: + time = 2038666 + flags = 1 + data = length 56, hash B15EBD7A + sample 16: + time = 2041333 + flags = 1 + data = length 212, hash 273B8D22 + sample 17: + time = 2053333 + flags = 1 + data = length 194, hash 44F9CE1 + sample 18: + time = 2074666 + flags = 1 + data = length 195, hash EDF9EBA1 + sample 19: + time = 2096000 + flags = 1 + data = length 194, hash CE9F2D26 + sample 20: + time = 2117333 + flags = 1 + data = length 192, hash 204F8A23 + sample 21: + time = 2138666 + flags = 1 + data = length 206, hash DFA57E67 + sample 22: + time = 2160000 + flags = 1 + data = length 196, hash 3CF084AB + sample 23: + time = 2181333 + flags = 1 + data = length 202, hash 2AF75C08 + sample 24: + time = 2202666 + flags = 1 + data = length 203, hash 748EAF7 + sample 25: + time = 2224000 + flags = 1 + data = length 205, hash ED82379D + sample 26: + time = 2245333 + flags = 1 + data = length 193, hash 61F26F22 + sample 27: + time = 2266666 + flags = 1 + data = length 189, hash 85EF1D20 + sample 28: + time = 2288000 + flags = 1 + data = length 187, hash 25E41FBF + sample 29: + time = 2309333 + flags = 1 + data = length 199, hash F365808 + sample 30: + time = 2330666 + flags = 1 + data = length 197, hash 94205329 + sample 31: + time = 2352000 + flags = 1 + data = length 201, hash FA2B2055 + sample 32: + time = 2373333 + flags = 1 + data = length 194, hash AF95381F + sample 33: + time = 2394666 + flags = 1 + data = length 201, hash 923D3534 + sample 34: + time = 2416000 + flags = 1 + data = length 198, hash 35F84C2E + sample 35: + time = 2437333 + flags = 1 + data = length 204, hash 6642CA40 + sample 36: + time = 2458666 + flags = 1 + data = length 183, hash 3E2DC6BE + sample 37: + time = 2480000 + flags = 1 + data = length 197, hash B1E458CE + sample 38: + time = 2501333 + flags = 1 + data = length 193, hash E9218C84 + sample 39: + time = 2522666 + flags = 1 + data = length 192, hash FEF08D4B + sample 40: + time = 2544000 + flags = 1 + data = length 201, hash FC411147 + sample 41: + time = 2565333 + flags = 1 + data = length 218, hash 86893464 + sample 42: + time = 2586666 + flags = 1 + data = length 226, hash 31C5320 + sample 43: + time = 2608000 + flags = 1 + data = length 233, hash 9432BEE5 + sample 44: + time = 2629333 + flags = 1 + data = length 213, hash B3FCC53E + sample 45: + time = 2650666 + flags = 1 + data = length 204, hash D70DD5A2 + sample 46: + time = 2672000 + flags = 1 + data = length 212, hash A4EF1B69 + sample 47: + time = 2693333 + flags = 1 + data = length 203, hash 8B0748B5 + sample 48: + time = 2714666 + flags = 1 + data = length 149, hash E455335B +tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/ogg/bear_vorbis_with_large_metadata.ogg.3.dump b/testdata/src/test/assets/extractordumps/ogg/bear_vorbis_with_large_metadata.ogg.3.dump new file mode 100644 index 0000000000..1d76d892d3 --- /dev/null +++ b/testdata/src/test/assets/extractordumps/ogg/bear_vorbis_with_large_metadata.ogg.3.dump @@ -0,0 +1,20 @@ +seekMap: + isSeekable = true + duration = 2741000 + getPosition(0) = [[timeUs=0, position=84969]] + getPosition(1) = [[timeUs=1, position=84969]] + getPosition(1370500) = [[timeUs=1370500, position=84969]] + getPosition(2741000) = [[timeUs=2741000, position=84969]] +numberOfTracks = 1 +track 0: + total output bytes = 0 + sample count = 0 + format 0: + averageBitrate = 112000 + sampleMimeType = audio/vorbis + channelCount = 2 + sampleRate = 48000 + initializationData: + data = length 30, hash 9A8FF207 + data = length 3832, hash 8A406249 +tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/ogg/bear_vorbis_with_large_metadata.ogg.unknown_length.dump b/testdata/src/test/assets/extractordumps/ogg/bear_vorbis_with_large_metadata.ogg.unknown_length.dump new file mode 100644 index 0000000000..9830a08357 --- /dev/null +++ b/testdata/src/test/assets/extractordumps/ogg/bear_vorbis_with_large_metadata.ogg.unknown_length.dump @@ -0,0 +1,737 @@ +seekMap: + isSeekable = false + duration = UNSET TIME + getPosition(0) = [[timeUs=0, position=0]] +numberOfTracks = 1 +track 0: + total output bytes = 26873 + sample count = 180 + format 0: + averageBitrate = 112000 + sampleMimeType = audio/vorbis + channelCount = 2 + sampleRate = 48000 + initializationData: + data = length 30, hash 9A8FF207 + data = length 3832, hash 8A406249 + sample 0: + time = 0 + flags = 1 + data = length 49, hash 2FFF94F0 + sample 1: + time = 0 + flags = 1 + data = length 44, hash 3946418A + sample 2: + time = 2666 + flags = 1 + data = length 55, hash 2A0B878E + sample 3: + time = 5333 + flags = 1 + data = length 53, hash CC3B6879 + sample 4: + time = 8000 + flags = 1 + data = length 215, hash 106AE950 + sample 5: + time = 20000 + flags = 1 + data = length 192, hash 2B219F53 + sample 6: + time = 41333 + flags = 1 + data = length 197, hash FBC39422 + sample 7: + time = 62666 + flags = 1 + data = length 209, hash 386E8979 + sample 8: + time = 84000 + flags = 1 + data = length 42, hash E81162C1 + sample 9: + time = 96000 + flags = 1 + data = length 41, hash F15BEE36 + sample 10: + time = 98666 + flags = 1 + data = length 42, hash D67EB19 + sample 11: + time = 101333 + flags = 1 + data = length 42, hash F4DE4792 + sample 12: + time = 104000 + flags = 1 + data = length 53, hash 80F66AC3 + sample 13: + time = 106666 + flags = 1 + data = length 56, hash DCB9DFC4 + sample 14: + time = 109333 + flags = 1 + data = length 55, hash 4E0C4E9D + sample 15: + time = 112000 + flags = 1 + data = length 203, hash 176B6862 + sample 16: + time = 124000 + flags = 1 + data = length 193, hash AB13CB10 + sample 17: + time = 145333 + flags = 1 + data = length 203, hash DE63DE9F + sample 18: + time = 166666 + flags = 1 + data = length 194, hash 4A9508A2 + sample 19: + time = 188000 + flags = 1 + data = length 210, hash 196899B3 + sample 20: + time = 209333 + flags = 1 + data = length 195, hash B68407F1 + sample 21: + time = 230666 + flags = 1 + data = length 193, hash A1FA86E3 + sample 22: + time = 252000 + flags = 1 + data = length 194, hash 5C0B9343 + sample 23: + time = 273333 + flags = 1 + data = length 198, hash 789914B2 + sample 24: + time = 294666 + flags = 1 + data = length 183, hash 1B82D11F + sample 25: + time = 316000 + flags = 1 + data = length 199, hash D5B848F4 + sample 26: + time = 337333 + flags = 1 + data = length 192, hash B34427EA + sample 27: + time = 358666 + flags = 1 + data = length 199, hash C2599BB5 + sample 28: + time = 380000 + flags = 1 + data = length 195, hash BFD83194 + sample 29: + time = 401333 + flags = 1 + data = length 199, hash C9A7F7CA + sample 30: + time = 422666 + flags = 1 + data = length 44, hash 5D76EAD6 + sample 31: + time = 434666 + flags = 1 + data = length 43, hash 8619C423 + sample 32: + time = 437333 + flags = 1 + data = length 43, hash E490BBE + sample 33: + time = 440000 + flags = 1 + data = length 53, hash 8A557CAE + sample 34: + time = 442666 + flags = 1 + data = length 56, hash 81007BBA + sample 35: + time = 445333 + flags = 1 + data = length 56, hash 4E4DD67F + sample 36: + time = 448000 + flags = 1 + data = length 222, hash 414188AB + sample 37: + time = 460000 + flags = 1 + data = length 202, hash 67A07D30 + sample 38: + time = 481333 + flags = 1 + data = length 200, hash E357D853 + sample 39: + time = 502666 + flags = 1 + data = length 203, hash 4653DC90 + sample 40: + time = 524000 + flags = 1 + data = length 192, hash A65E6C09 + sample 41: + time = 545333 + flags = 1 + data = length 202, hash FBEAC508 + sample 42: + time = 566666 + flags = 1 + data = length 202, hash E9B7B59F + sample 43: + time = 588000 + flags = 1 + data = length 204, hash E24AA78E + sample 44: + time = 609333 + flags = 1 + data = length 41, hash 3FBC5216 + sample 45: + time = 621333 + flags = 1 + data = length 47, hash 153FBC55 + sample 46: + time = 624000 + flags = 1 + data = length 42, hash 2B493D6C + sample 47: + time = 626666 + flags = 1 + data = length 42, hash 8303BEE3 + sample 48: + time = 629333 + flags = 1 + data = length 62, hash 71AEE50B + sample 49: + time = 632000 + flags = 1 + data = length 54, hash 52F61908 + sample 50: + time = 634666 + flags = 1 + data = length 45, hash 7BD3E3A1 + sample 51: + time = 637333 + flags = 1 + data = length 41, hash E0F65472 + sample 52: + time = 640000 + flags = 1 + data = length 45, hash 41838675 + sample 53: + time = 642666 + flags = 1 + data = length 44, hash FCBC2147 + sample 54: + time = 645333 + flags = 1 + data = length 45, hash 1A5987E3 + sample 55: + time = 648000 + flags = 1 + data = length 43, hash 99074864 + sample 56: + time = 650666 + flags = 1 + data = length 57, hash D4A9B60A + sample 57: + time = 653333 + flags = 1 + data = length 52, hash 302129DA + sample 58: + time = 656000 + flags = 1 + data = length 57, hash D8DD99C0 + sample 59: + time = 658666 + flags = 1 + data = length 206, hash F4B9EF26 + sample 60: + time = 670666 + flags = 1 + data = length 197, hash 7B8ACC8A + sample 61: + time = 692000 + flags = 1 + data = length 186, hash 161027CB + sample 62: + time = 713333 + flags = 1 + data = length 186, hash 1D6871B6 + sample 63: + time = 734666 + flags = 1 + data = length 201, hash 536E9FDB + sample 64: + time = 756000 + flags = 1 + data = length 192, hash D38EFAC5 + sample 65: + time = 777333 + flags = 1 + data = length 194, hash 4B394EF3 + sample 66: + time = 798666 + flags = 1 + data = length 206, hash 1B31BA99 + sample 67: + time = 820000 + flags = 1 + data = length 212, hash AD061F43 + sample 68: + time = 841333 + flags = 1 + data = length 180, hash 6D1F7481 + sample 69: + time = 862666 + flags = 1 + data = length 195, hash D80B21F + sample 70: + time = 884000 + flags = 1 + data = length 186, hash D367882 + sample 71: + time = 905333 + flags = 1 + data = length 195, hash 2722159A + sample 72: + time = 926666 + flags = 1 + data = length 199, hash 10CEE97A + sample 73: + time = 948000 + flags = 1 + data = length 191, hash 2CF9FB3F + sample 74: + time = 969333 + flags = 1 + data = length 197, hash A725DA0 + sample 75: + time = 990666 + flags = 1 + data = length 211, hash D4E5DB9E + sample 76: + time = 1012000 + flags = 1 + data = length 189, hash 1A90F496 + sample 77: + time = 1033333 + flags = 1 + data = length 187, hash 44DB2689 + sample 78: + time = 1054666 + flags = 1 + data = length 197, hash 6D3E5117 + sample 79: + time = 1076000 + flags = 1 + data = length 208, hash 5B57B288 + sample 80: + time = 1097333 + flags = 1 + data = length 198, hash D5FC05 + sample 81: + time = 1118666 + flags = 1 + data = length 192, hash 350BBA45 + sample 82: + time = 1140000 + flags = 1 + data = length 195, hash 5F96F2A8 + sample 83: + time = 1161333 + flags = 1 + data = length 202, hash 61D7CC33 + sample 84: + time = 1182666 + flags = 1 + data = length 202, hash 49D335F2 + sample 85: + time = 1204000 + flags = 1 + data = length 192, hash 2FE9CB1A + sample 86: + time = 1225333 + flags = 1 + data = length 201, hash BF0763B2 + sample 87: + time = 1246666 + flags = 1 + data = length 184, hash AD047421 + sample 88: + time = 1268000 + flags = 1 + data = length 196, hash F9088F14 + sample 89: + time = 1289333 + flags = 1 + data = length 190, hash AC6D38FD + sample 90: + time = 1310666 + flags = 1 + data = length 195, hash 8D1A66D2 + sample 91: + time = 1332000 + flags = 1 + data = length 197, hash B46BFB6B + sample 92: + time = 1353333 + flags = 1 + data = length 195, hash D9761F23 + sample 93: + time = 1374666 + flags = 1 + data = length 204, hash 3391B617 + sample 94: + time = 1396000 + flags = 1 + data = length 42, hash 33A1FB52 + sample 95: + time = 1408000 + flags = 1 + data = length 44, hash 408B146E + sample 96: + time = 1410666 + flags = 1 + data = length 44, hash 171C7E0D + sample 97: + time = 1413333 + flags = 1 + data = length 54, hash 6307E16C + sample 98: + time = 1416000 + flags = 1 + data = length 53, hash 4A319572 + sample 99: + time = 1418666 + flags = 1 + data = length 215, hash BA9C445C + sample 100: + time = 1430666 + flags = 1 + data = length 201, hash 3120D234 + sample 101: + time = 1452000 + flags = 1 + data = length 187, hash DB44993C + sample 102: + time = 1473333 + flags = 1 + data = length 196, hash CF2002D7 + sample 103: + time = 1494666 + flags = 1 + data = length 185, hash E03B5D7 + sample 104: + time = 1516000 + flags = 1 + data = length 187, hash DA399A2C + sample 105: + time = 1537333 + flags = 1 + data = length 191, hash 292AA0DB + sample 106: + time = 1558666 + flags = 1 + data = length 201, hash 221910E0 + sample 107: + time = 1580000 + flags = 1 + data = length 194, hash F4ED7821 + sample 108: + time = 1601333 + flags = 1 + data = length 43, hash FDDA515E + sample 109: + time = 1613333 + flags = 1 + data = length 42, hash F3571C0A + sample 110: + time = 1616000 + flags = 1 + data = length 38, hash 39F910B3 + sample 111: + time = 1618666 + flags = 1 + data = length 41, hash 2D189531 + sample 112: + time = 1621333 + flags = 1 + data = length 43, hash 1F7574DB + sample 113: + time = 1624000 + flags = 1 + data = length 43, hash 644D15E5 + sample 114: + time = 1626666 + flags = 1 + data = length 49, hash E8A0878 + sample 115: + time = 1629333 + flags = 1 + data = length 55, hash DFF2046D + sample 116: + time = 1632000 + flags = 1 + data = length 49, hash 9FB8A23 + sample 117: + time = 1634666 + flags = 1 + data = length 41, hash E3E15E3B + sample 118: + time = 1637333 + flags = 1 + data = length 42, hash E5D17A32 + sample 119: + time = 1640000 + flags = 1 + data = length 42, hash F308B653 + sample 120: + time = 1642666 + flags = 1 + data = length 55, hash BB750D76 + sample 121: + time = 1645333 + flags = 1 + data = length 51, hash 96772ABF + sample 122: + time = 1648000 + flags = 1 + data = length 197, hash E4524346 + sample 123: + time = 1660000 + flags = 1 + data = length 188, hash AC3E1BB5 + sample 124: + time = 1681333 + flags = 1 + data = length 195, hash F56DB8A5 + sample 125: + time = 1702666 + flags = 1 + data = length 198, hash C8970FF7 + sample 126: + time = 1724000 + flags = 1 + data = length 202, hash AF425C68 + sample 127: + time = 1745333 + flags = 1 + data = length 196, hash 4215D839 + sample 128: + time = 1766666 + flags = 1 + data = length 204, hash DB9BE8E3 + sample 129: + time = 1788000 + flags = 1 + data = length 206, hash E5B20AB8 + sample 130: + time = 1809333 + flags = 1 + data = length 209, hash D7F47B95 + sample 131: + time = 1830666 + flags = 1 + data = length 193, hash FB54FB05 + sample 132: + time = 1852000 + flags = 1 + data = length 199, hash D99C3106 + sample 133: + time = 1873333 + flags = 1 + data = length 206, hash 253885B9 + sample 134: + time = 1894666 + flags = 1 + data = length 191, hash FBDD8162 + sample 135: + time = 1916000 + flags = 1 + data = length 183, hash 7290332F + sample 136: + time = 1937333 + flags = 1 + data = length 189, hash 1A9DC3DE + sample 137: + time = 1958666 + flags = 1 + data = length 201, hash 5D936764 + sample 138: + time = 1980000 + flags = 1 + data = length 193, hash 6B03E75E + sample 139: + time = 2001333 + flags = 1 + data = length 199, hash 8A21BA83 + sample 140: + time = 2022666 + flags = 1 + data = length 41, hash E6362210 + sample 141: + time = 2034666 + flags = 1 + data = length 43, hash 36A57B44 + sample 142: + time = 2037333 + flags = 1 + data = length 43, hash E51797D5 + sample 143: + time = 2040000 + flags = 1 + data = length 43, hash 1F336C72 + sample 144: + time = 2042666 + flags = 1 + data = length 42, hash 201AD367 + sample 145: + time = 2045333 + flags = 1 + data = length 50, hash 606CCD6 + sample 146: + time = 2048000 + flags = 1 + data = length 56, hash B15EBD7A + sample 147: + time = 2050666 + flags = 1 + data = length 212, hash 273B8D22 + sample 148: + time = 2062666 + flags = 1 + data = length 194, hash 44F9CE1 + sample 149: + time = 2084000 + flags = 1 + data = length 195, hash EDF9EBA1 + sample 150: + time = 2105333 + flags = 1 + data = length 194, hash CE9F2D26 + sample 151: + time = 2126666 + flags = 1 + data = length 192, hash 204F8A23 + sample 152: + time = 2148000 + flags = 1 + data = length 206, hash DFA57E67 + sample 153: + time = 2169333 + flags = 1 + data = length 196, hash 3CF084AB + sample 154: + time = 2190666 + flags = 1 + data = length 202, hash 2AF75C08 + sample 155: + time = 2212000 + flags = 1 + data = length 203, hash 748EAF7 + sample 156: + time = 2233333 + flags = 1 + data = length 205, hash ED82379D + sample 157: + time = 2254666 + flags = 1 + data = length 193, hash 61F26F22 + sample 158: + time = 2276000 + flags = 1 + data = length 189, hash 85EF1D20 + sample 159: + time = 2297333 + flags = 1 + data = length 187, hash 25E41FBF + sample 160: + time = 2318666 + flags = 1 + data = length 199, hash F365808 + sample 161: + time = 2340000 + flags = 1 + data = length 197, hash 94205329 + sample 162: + time = 2361333 + flags = 1 + data = length 201, hash FA2B2055 + sample 163: + time = 2382666 + flags = 1 + data = length 194, hash AF95381F + sample 164: + time = 2404000 + flags = 1 + data = length 201, hash 923D3534 + sample 165: + time = 2425333 + flags = 1 + data = length 198, hash 35F84C2E + sample 166: + time = 2446666 + flags = 1 + data = length 204, hash 6642CA40 + sample 167: + time = 2468000 + flags = 1 + data = length 183, hash 3E2DC6BE + sample 168: + time = 2489333 + flags = 1 + data = length 197, hash B1E458CE + sample 169: + time = 2510666 + flags = 1 + data = length 193, hash E9218C84 + sample 170: + time = 2532000 + flags = 1 + data = length 192, hash FEF08D4B + sample 171: + time = 2553333 + flags = 1 + data = length 201, hash FC411147 + sample 172: + time = 2574666 + flags = 1 + data = length 218, hash 86893464 + sample 173: + time = 2596000 + flags = 1 + data = length 226, hash 31C5320 + sample 174: + time = 2617333 + flags = 1 + data = length 233, hash 9432BEE5 + sample 175: + time = 2638666 + flags = 1 + data = length 213, hash B3FCC53E + sample 176: + time = 2660000 + flags = 1 + data = length 204, hash D70DD5A2 + sample 177: + time = 2681333 + flags = 1 + data = length 212, hash A4EF1B69 + sample 178: + time = 2702666 + flags = 1 + data = length 203, hash 8B0748B5 + sample 179: + time = 2724000 + flags = 1 + data = length 149, hash E455335B +tracksEnded = true diff --git a/testdata/src/test/assets/media/ogg/bear_vorbis_with_large_metadata.ogg b/testdata/src/test/assets/media/ogg/bear_vorbis_with_large_metadata.ogg new file mode 100644 index 0000000000000000000000000000000000000000..1dab9e5258f29ca10e11aaf115fd06b5616e4ab0 GIT binary patch literal 111383 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 OCUj~chimUR=>GxJczsv^ literal 0 HcmV?d00001