From 5a6cffcf6fd7923d6ab3f43ee49f2242a872fc9c Mon Sep 17 00:00:00 2001 From: kimvde Date: Mon, 27 Jan 2020 13:19:20 +0000 Subject: [PATCH] Justify MP3 ConstantBitrateSeeker frame size + add tests PiperOrigin-RevId: 291702471 --- .../extractor/mp3/ConstantBitrateSeeker.java | 3 + ...-cbr-constant-frame-size-no-seek-table.mp3 | Bin 0 -> 44736 bytes ...-cbr-variable-frame-size-no-seek-table.mp3 | Bin 0 -> 45379 bytes ...riable-frame-size-no-seek-table.mp3.0.dump | 463 ++++++++++++++++++ ...riable-frame-size-no-seek-table.mp3.1.dump | 319 ++++++++++++ ...riable-frame-size-no-seek-table.mp3.2.dump | 175 +++++++ ...riable-frame-size-no-seek-table.mp3.3.dump | 31 ++ ...e-frame-size-no-seek-table.mp3.unklen.dump | 463 ++++++++++++++++++ .../mp3/{bear.mp3 => bear-xing-header.mp3} | Bin ...mp3.0.dump => bear-xing-header.mp3.0.dump} | 0 ...mp3.1.dump => bear-xing-header.mp3.1.dump} | 0 ...mp3.2.dump => bear-xing-header.mp3.2.dump} | 0 ...mp3.3.dump => bear-xing-header.mp3.3.dump} | 0 .../extractor/FlacMetadataReaderTest.java | 4 +- .../mp3/ConstantBitrateSeekerTest.java | 213 ++++++++ .../extractor/mp3/Mp3ExtractorTest.java | 10 +- 16 files changed, 1677 insertions(+), 4 deletions(-) create mode 100644 library/extractor/src/test/assets/mp3/bear-cbr-constant-frame-size-no-seek-table.mp3 create mode 100644 library/extractor/src/test/assets/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3 create mode 100644 library/extractor/src/test/assets/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.0.dump create mode 100644 library/extractor/src/test/assets/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.1.dump create mode 100644 library/extractor/src/test/assets/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.2.dump create mode 100644 library/extractor/src/test/assets/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.3.dump create mode 100644 library/extractor/src/test/assets/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.unklen.dump rename library/extractor/src/test/assets/mp3/{bear.mp3 => bear-xing-header.mp3} (100%) rename library/extractor/src/test/assets/mp3/{bear.mp3.0.dump => bear-xing-header.mp3.0.dump} (100%) rename library/extractor/src/test/assets/mp3/{bear.mp3.1.dump => bear-xing-header.mp3.1.dump} (100%) rename library/extractor/src/test/assets/mp3/{bear.mp3.2.dump => bear-xing-header.mp3.2.dump} (100%) rename library/extractor/src/test/assets/mp3/{bear.mp3.3.dump => bear-xing-header.mp3.3.dump} (100%) create mode 100644 library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp3/ConstantBitrateSeekerTest.java diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp3/ConstantBitrateSeeker.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp3/ConstantBitrateSeeker.java index 73389a034b..f74c3fbc33 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp3/ConstantBitrateSeeker.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp3/ConstantBitrateSeeker.java @@ -31,6 +31,9 @@ import com.google.android.exoplayer2.extractor.ConstantBitrateSeekMap; */ public ConstantBitrateSeeker( long inputLength, long firstFramePosition, MpegAudioUtil.Header mpegAudioHeader) { + // Set the seeker frame size to the size of the first frame (even though some constant bitrate + // streams have variable frame sizes) to avoid the need to re-synchronize for constant frame + // size streams. super(inputLength, firstFramePosition, mpegAudioHeader.bitrate, mpegAudioHeader.frameSize); } diff --git a/library/extractor/src/test/assets/mp3/bear-cbr-constant-frame-size-no-seek-table.mp3 b/library/extractor/src/test/assets/mp3/bear-cbr-constant-frame-size-no-seek-table.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..ce318ca308d2217c144f9c84178fe8225e489f5a GIT binary patch literal 44736 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≦2u2P|WapmOSt`;I;_>&4G*H zum;euTQqOpAfHsaQ%w?8ygL(Jj73Yt9@aaQ-~v;LY}eaxf8xm^G^9S{wu90;;;Ej% ziqzjn$CP~{1^=j@OfClpDE}TQ%ozt9DR1E2rC&F3@=zat`GOxVu~h+8jAKHZ=&db9xBd2WF2}R|J0B( ziwFI&RW>z8ZSej(CBh8)FN6BeHT3uTd*1?4@Sio*5fqpOa;szvWM;W#i;X`Lxb{xL zp>Jk+0cy(tzzQfcr{{g+I%#1d%IvDte3)LqK{}{CN2#?*_&rJq4;`s@78xu8)Z)YP zU-$-3rY~9z(G+#WWyl8S6snn^|GNrmvYdQ`K&oW#ifRmUZs1hkQoh;LI^Runay!af9*)1V{Y1Wb&f$Sk7H%0KVFql8&1;LYn zLLAZPPTX?ggIE7l=>u1?{@l2OyCU$seTk|j{8M66!|4fJO9%oHjD>8xxS9s>gECK{ zi-7iqfTN#dfai%u!GL>rc5r9mK+SLvlJ*NiGrc5Zjw)xBjqr3EY4?sd92@8chhj2f>C>OZS`vV#40F#qHGJeE@98R|%bJeWsd zu6_Xkv+s}eXR1|N)WWEYdPB-)-?`u_(y?D8V;xY>=qN_xN7`N|YsL+}BVKJ)uS%ElArIc7{h30AJkq5Vg< z*h_REP_JI^4mM2WyxIK7lMqjc4bgLaORv1;9+{!^HW-32tmpvSaj%2Q8@j0}C>oG{ zq-oma-&2Ea4pYT#DeMo*UwwNg+}Jgwxgfqx_VelaCCf&Q%)(gx3swAxGiRP8bK&c% zAm^W3+Um67fh~uB;-)~u>$Ln@$(6gg1G!^qruPJ(Wd}MlMo>-a`f7h12K!low^J4o zAAeE&+1)_Q4J%EzgYFXsMK7~j88o)j-d&Bs{--VM z*+%S%qys)gkwvwb3D!uMj;lJ4etu_uh<^y`Tba=^eCti-)&KN=)-a@4LH&*R|M<7E zV^sl_hPpMDa?TTTSDs3%BNZLzLbXp5pLUZ)5xL(fVCelc+TYFXLxUidSq9yhgY^Fk zKmW(Y-@()7JOEKYaeB}jPDsmKK@Q|vx9Nt$%boN7}^albxi))d-s zXVveo664rYMBg;7-YOD|*`{gI9CAR7!#DKxoRcj?jVKq%ihb1T)|AkmI@yckF#mA( zLRBfjXwgS8Oy#OM5ZZt!Gg=Z*$m)8uf2-M$yl!2_0{00pp$ROk_^>^-L5agjk%yps zT*bkW;h|@YzoI$g{h2C&q*cy-)2*_5Gk`x(nr31@dwFiaDQDufZfBNn%a7-h`%)nTlS8k>e%X8Xj|cy){p(NfANl6$4bum_ah4PqIK;rl&1f9Sh-~Q z28l_qP+#S6^xEM)>^>Gk;AD&V+Y z6|dX+ZhL}OPj{4jkZ ze`G|RFUO9#y!oLim8kkmtp*`q-=KeQ-Ex)4Wak*28WD^s`>CyXkSuIg~cfE5wBOvXBzdJF1caFBA zY(>EBkI9SP6@Tl>2wklKA|bVWla@j5?ZAZi7q?kpF zMDuxAZQ^->4kXPvH*s`)megrF@n3G1nwE6-wz~_~|qjXx~@) zkM}37)Sd9yG9TBpP9?>{`}RE!3Xun_Jb;d=sO_btYW4fQlYYb$QI&Lh+#a5vS%C@lV<=Y z+&}r?Q5;7j9sxz3So2=vi>D>IO^hZ+6r`nIw<&1`#f){;T#Eh-d+#M9^s(1!h2J{; z*3U9tI`fFKG#mb6xv@pIaD3ATs)tiqxBoRn$DqFxMwgQ|Vr6UxzU1)cBR_=(O9A`( zXBCYtUC6#6)*IAX(ClM&v}c514kN(JnKV)D|HY+vY(Z_-*a@n_B*~-UL?;5)4g8Xl5x z`L_>vrLdeZD|vw9%YFX04?;PXR9^%2XSi1>Bp{3soB?bK9N18BQ}udwB57lDsd81C z^1>;e{IuiN@YrqS_88Zu?}V-4H@^(mjNdh$db&&Nn!=|dUmPzI3cZ>P|x{39A%=_z2C!M*|UnCu- zv8k!Z^cAT=d(E-Yv2>=B8-i1WTI=omn74f5`*TupW{wV15%_N+#yVfcKaFz_jug)5 z+(!$e?&A2m+bgR8)9VdL3~>df3czuLcmC~*wo~VJdw^F%D+Sh3ocEw7 zt_aC5X4H-@3^WoV%Qci-MimI<^k||LXRVk;(}VtiE);ptR!&uh%3T)6Q61#}t8RTn z-yer=ik_% zXWdDyzk$aKfi~E#O$9stH~+etZ!I*=(fy|pJ&|3d0*V48a4cIjUUs3y*d|650t^=H z5n)Id_E1S=$({dT;obG4MTcE$lp7I^kD$@a<~NE=V|kky2$_=+m2wbsp(6WJo!N3H z@w))q6W$WaJgHeT17QF6VbLq_xOwL zpe6KrjIFFZeF_$u=EnZJz~$YF&#T!pi@ABpTF+*S+(`52l6TeV9~BH_MM#rJ6{6#0 zN&D#j;*oJt(;*>(kbdR|BGWu8UuYTSljCgrrIV28_shHiA0J^7$fyY%?%&k7-Z-m1 zb*ne87+W0hI;gnR7x6X7lgE-HH7sOf$Vsw%j}!gmiMYQjw9{Rg6FkzNR4(1Gf7c+S zBkLaR9AZzogEtaj{4twi(Z7e5576?io)IKBUd0^yt=u`R47Z=Hh%(%~^ZVU!?H_n~ zEg7Sr*1}LrnxCU%GgS82Dk4eDhpn5wS53R;5g|GeQdcw)HAHYB2(^Y~t51F0mcobk z_s8})ovb6+D*x4xogWZbv9h~#OMKtvI;wAawbNTV5x3(tUF5nm@?Ki)`Id}K)v7kK zbx2Q|IvQPuFchMHlEtxozU_byTm>|PS6raz+7GPg_g7Xd^q%{bs`Y!93c~CZn=%VM z#3G?2qHJ0sU40Qhg-fI%*!t8bdvGB^;}X}WD4*Evx7nqD1OUYX0R92DE4LOvV4%Oe z|Lus``}3Zu=Yp5os4w|3o3-YRhf1SUeB!=GZ(P7(Oxoya0wOfB&+Vbg7|~=rXb>Js z8pKd&l@X&f1cMKa#q-WRFcmOwpGXBZfyzVu_{+T8_5>nO6D7_*U3>3fG`i2=QPW3X zt1x;@ZI8hR{68LwENUamhs5bAgglQai~)l5>66aY zt!Ld{dn#a*83)xLD3!1lzmIWLdbF-X_4ha;NWU2`|mU+>qf9FX@hzfKPK_fAs zG`4IpG4x3CX-H{abP%)_+HyS;y+y_w6VM&k3V0uQI7g!}-9A_AFCo9A z=^^)1B>%cG!k8_lNul9y$j1*faa@5V>S*}noqxq;-oOkC;KJ^q)X@>1O{h?as<7Jb zps(N1yHjv;5>S8Y)@o7y!2iq%B6(~pnJ8!Du5u8`4X%G|nph+bF#c{ebUdK{ zDc{WazIpW5q*`vX!Tdh)9N3tygmI#}$5ekDwb8JR>W{oqVqy-2>6;vSBbnkHt>Ww^ z9n?M)Ma;0R;NvwEJxrFlrN%a*D0`9V?$d^(5I+8lGs)1I%fr{(6K&UlcY)xp_|#a6 zNGdMt|JdGOuw8sK>ymG@_jzIRh?(Qp6Q?tHl#MGQ!bYivVS_Bwn9hKPEet1TZ8f7) z3rZLf;@+8?{U)3-44M*xF0_OTmQWZq`+C2;5-JpclfP~EHk)RFXV-VulfbTld5e^R z%`>5$xa}CGp z^r=+I{aqn^cDjO2Fmz?6@3r&PaKq3%~tAztem?R&Kqu2 zRyXygSWG3DYsWdS04`A;LypP>FCGwEjjW&-r-XxBiNoHG*}T`rbA2L2P2q|Rqmi)cK*@JU;%Yn zoN30_GsAaEHfT6d5t_{QCN&Q1Cge|G#_rp5|0i75eNcT N)Bl~X{r~Sv{s-ey!YTj& literal 0 HcmV?d00001 diff --git a/library/extractor/src/test/assets/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3 b/library/extractor/src/test/assets/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..a329a497951d1123cfaafa40346e16256185fd65 GIT binary patch literal 45379 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

l-HHkdUoQgS;Lq#xzLjV89#TlJc;;@=w} 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 literal 0 HcmV?d00001 diff --git a/library/extractor/src/test/assets/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.0.dump b/library/extractor/src/test/assets/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.0.dump new file mode 100644 index 0000000000..eeeb46ece7 --- /dev/null +++ b/library/extractor/src/test/assets/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.0.dump @@ -0,0 +1,463 @@ +seekMap: + isSeekable = true + duration = 2821187 + getPosition(0) = [[timeUs=0, position=240]] +numberOfTracks = 1 +track 0: + format: + bitrate = -1 + id = null + containerMimeType = null + sampleMimeType = audio/mpeg + maxInputSize = 4096 + width = -1 + height = -1 + frameRate = -1.0 + rotationDegrees = 0 + pixelWidthHeightRatio = 1.0 + channelCount = 2 + sampleRate = 44100 + pcmEncoding = -1 + encoderDelay = 0 + encoderPadding = 0 + subsampleOffsetUs = 9223372036854775807 + selectionFlags = 0 + language = null + drmInitData = - + metadata = null + initializationData: + total output bytes = 45139 + sample count = 108 + sample 0: + time = 0 + flags = 1 + data = length 417, hash C4565176 + sample 1: + time = 26122 + flags = 1 + data = length 418, hash 70AEC448 + sample 2: + time = 52244 + flags = 1 + data = length 418, hash 835A8FB9 + sample 3: + time = 78367 + flags = 1 + data = length 418, hash 3A9672BF + sample 4: + time = 104489 + flags = 1 + data = length 418, hash 8DBE60F9 + sample 5: + time = 130612 + flags = 1 + data = length 418, hash 23D0867B + sample 6: + time = 156734 + flags = 1 + data = length 418, hash 7780AAB9 + sample 7: + time = 182857 + flags = 1 + data = length 418, hash 3F63B2D1 + sample 8: + time = 208979 + flags = 1 + data = length 418, hash 7A33CEBD + sample 9: + time = 235102 + flags = 1 + data = length 418, hash DF31D514 + sample 10: + time = 261224 + flags = 1 + data = length 418, hash 26FA2C86 + sample 11: + time = 287346 + flags = 1 + data = length 418, hash D9C7FB1 + sample 12: + time = 313469 + flags = 1 + data = length 418, hash B1C40DC8 + sample 13: + time = 339591 + flags = 1 + data = length 418, hash 1C953BEE + sample 14: + time = 365714 + flags = 1 + data = length 418, hash A6053C6 + sample 15: + time = 391836 + flags = 1 + data = length 418, hash 2D90325A + sample 16: + time = 417959 + flags = 1 + data = length 418, hash 11A84918 + sample 17: + time = 444081 + flags = 1 + data = length 418, hash 30F1A19A + sample 18: + time = 470204 + flags = 1 + data = length 418, hash 70EC67FF + sample 19: + time = 496326 + flags = 1 + data = length 418, hash 7BAF5828 + sample 20: + time = 522448 + flags = 1 + data = length 418, hash 8E43B85E + sample 21: + time = 548571 + flags = 1 + data = length 418, hash E9A5EE78 + sample 22: + time = 574693 + flags = 1 + data = length 418, hash F79931F8 + sample 23: + time = 600816 + flags = 1 + data = length 418, hash C0308B40 + sample 24: + time = 626938 + flags = 1 + data = length 418, hash 3D2E55B + sample 25: + time = 653061 + flags = 1 + data = length 417, hash D74A61AF + sample 26: + time = 679183 + flags = 1 + data = length 418, hash 96F104B1 + sample 27: + time = 705306 + flags = 1 + data = length 418, hash CE12216 + sample 28: + time = 731428 + flags = 1 + data = length 418, hash 899EA46D + sample 29: + time = 757551 + flags = 1 + data = length 418, hash 1208BBC5 + sample 30: + time = 783673 + flags = 1 + data = length 418, hash 49F22D4D + sample 31: + time = 809795 + flags = 1 + data = length 418, hash 56D959B0 + sample 32: + time = 835918 + flags = 1 + data = length 418, hash 5EC6FF8C + sample 33: + time = 862040 + flags = 1 + data = length 418, hash 380B6E00 + sample 34: + time = 888163 + flags = 1 + data = length 418, hash 19494E6B + sample 35: + time = 914285 + flags = 1 + data = length 418, hash C751B033 + sample 36: + time = 940408 + flags = 1 + data = length 418, hash 5F7C6DBA + sample 37: + time = 966530 + flags = 1 + data = length 418, hash D77E6530 + sample 38: + time = 992653 + flags = 1 + data = length 418, hash 48A694AB + sample 39: + time = 1018775 + flags = 1 + data = length 418, hash A979850E + sample 40: + time = 1044897 + flags = 1 + data = length 418, hash 7688E4B1 + sample 41: + time = 1071020 + flags = 1 + data = length 418, hash 255AF933 + sample 42: + time = 1097142 + flags = 1 + data = length 418, hash D58AC838 + sample 43: + time = 1123265 + flags = 1 + data = length 418, hash A38DC7B + sample 44: + time = 1149387 + flags = 1 + data = length 418, hash EA0CA21 + sample 45: + time = 1175510 + flags = 1 + data = length 418, hash DF99B54B + sample 46: + time = 1201632 + flags = 1 + data = length 418, hash A1532134 + sample 47: + time = 1227755 + flags = 1 + data = length 418, hash 520EC187 + sample 48: + time = 1253877 + flags = 1 + data = length 418, hash 5E38E4F + sample 49: + time = 1280000 + flags = 1 + data = length 417, hash 4D3526FB + sample 50: + time = 1306122 + flags = 1 + data = length 418, hash D99092CA + sample 51: + time = 1332244 + flags = 1 + data = length 418, hash EDB10D8E + sample 52: + time = 1358367 + flags = 1 + data = length 418, hash 5B5F6439 + sample 53: + time = 1384489 + flags = 1 + data = length 418, hash 947E2739 + sample 54: + time = 1410612 + flags = 1 + data = length 418, hash 8C1FF29C + sample 55: + time = 1436734 + flags = 1 + data = length 418, hash FEADC9C3 + sample 56: + time = 1462857 + flags = 1 + data = length 418, hash BB82E0C8 + sample 57: + time = 1488979 + flags = 1 + data = length 418, hash 8D1494AF + sample 58: + time = 1515102 + flags = 1 + data = length 418, hash E8C4265C + sample 59: + time = 1541224 + flags = 1 + data = length 418, hash BC8F59AE + sample 60: + time = 1567346 + flags = 1 + data = length 418, hash C8C5DCBD + sample 61: + time = 1593469 + flags = 1 + data = length 418, hash 43C3D85B + sample 62: + time = 1619591 + flags = 1 + data = length 418, hash 238C1AFE + sample 63: + time = 1645714 + flags = 1 + data = length 418, hash F6099191 + sample 64: + time = 1671836 + flags = 1 + data = length 418, hash D236BB0E + sample 65: + time = 1697959 + flags = 1 + data = length 418, hash 58B5B714 + sample 66: + time = 1724081 + flags = 1 + data = length 418, hash A9DDDD52 + sample 67: + time = 1750204 + flags = 1 + data = length 418, hash 85E7D11E + sample 68: + time = 1776326 + flags = 1 + data = length 418, hash 9E9D8FF4 + sample 69: + time = 1802448 + flags = 1 + data = length 418, hash 6FF9060D + sample 70: + time = 1828571 + flags = 1 + data = length 418, hash 4F1FC4F5 + sample 71: + time = 1854693 + flags = 1 + data = length 418, hash EF9885AA + sample 72: + time = 1880816 + flags = 1 + data = length 418, hash 7872C242 + sample 73: + time = 1906938 + flags = 1 + data = length 418, hash EB6FEAED + sample 74: + time = 1933061 + flags = 1 + data = length 417, hash B02D8CF0 + sample 75: + time = 1959183 + flags = 1 + data = length 418, hash EFB6C2DD + sample 76: + time = 1985306 + flags = 1 + data = length 418, hash B733E449 + sample 77: + time = 2011428 + flags = 1 + data = length 418, hash 617B155E + sample 78: + time = 2037551 + flags = 1 + data = length 418, hash AE626B2E + sample 79: + time = 2063673 + flags = 1 + data = length 418, hash F5E232C + sample 80: + time = 2089795 + flags = 1 + data = length 418, hash B5F4DC29 + sample 81: + time = 2115918 + flags = 1 + data = length 418, hash C791E3B5 + sample 82: + time = 2142040 + flags = 1 + data = length 418, hash F42A6BDB + sample 83: + time = 2168163 + flags = 1 + data = length 418, hash FDAEEFE6 + sample 84: + time = 2194285 + flags = 1 + data = length 418, hash 62AC2513 + sample 85: + time = 2220408 + flags = 1 + data = length 418, hash A4B46783 + sample 86: + time = 2246530 + flags = 1 + data = length 418, hash 9B7DFEFE + sample 87: + time = 2272653 + flags = 1 + data = length 418, hash 4010F89A + sample 88: + time = 2298775 + flags = 1 + data = length 418, hash 33467FC1 + sample 89: + time = 2324897 + flags = 1 + data = length 418, hash 1DFAE1E9 + sample 90: + time = 2351020 + flags = 1 + data = length 418, hash C208D375 + sample 91: + time = 2377142 + flags = 1 + data = length 418, hash CD430C30 + sample 92: + time = 2403265 + flags = 1 + data = length 418, hash 5A6F8065 + sample 93: + time = 2429387 + flags = 1 + data = length 418, hash 7177BD8B + sample 94: + time = 2455510 + flags = 1 + data = length 418, hash 51C1F29B + sample 95: + time = 2481632 + flags = 1 + data = length 418, hash 868A0084 + sample 96: + time = 2507755 + flags = 1 + data = length 418, hash 1E9C03E1 + sample 97: + time = 2533877 + flags = 1 + data = length 418, hash 10069B68 + sample 98: + time = 2560000 + flags = 1 + data = length 417, hash CC5B751D + sample 99: + time = 2586122 + flags = 1 + data = length 418, hash 837D650 + sample 100: + time = 2612244 + flags = 1 + data = length 418, hash 43B75632 + sample 101: + time = 2638367 + flags = 1 + data = length 418, hash 86E0652 + sample 102: + time = 2664489 + flags = 1 + data = length 418, hash 4DEC63E7 + sample 103: + time = 2690612 + flags = 1 + data = length 418, hash F094F330 + sample 104: + time = 2716734 + flags = 1 + data = length 418, hash 2C9CAA4 + sample 105: + time = 2742857 + flags = 1 + data = length 418, hash 1E903FFE + sample 106: + time = 2768979 + flags = 1 + data = length 418, hash F276CF72 + sample 107: + time = 2795102 + flags = 1 + data = length 418, hash 1C081463 +tracksEnded = true diff --git a/library/extractor/src/test/assets/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.1.dump b/library/extractor/src/test/assets/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.1.dump new file mode 100644 index 0000000000..a640a86764 --- /dev/null +++ b/library/extractor/src/test/assets/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.1.dump @@ -0,0 +1,319 @@ +seekMap: + isSeekable = true + duration = 2821187 + getPosition(0) = [[timeUs=0, position=240]] +numberOfTracks = 1 +track 0: + format: + bitrate = -1 + id = null + containerMimeType = null + sampleMimeType = audio/mpeg + maxInputSize = 4096 + width = -1 + height = -1 + frameRate = -1.0 + rotationDegrees = 0 + pixelWidthHeightRatio = 1.0 + channelCount = 2 + sampleRate = 44100 + pcmEncoding = -1 + encoderDelay = 0 + encoderPadding = 0 + subsampleOffsetUs = 9223372036854775807 + selectionFlags = 0 + language = null + drmInitData = - + metadata = null + initializationData: + total output bytes = 30093 + sample count = 72 + sample 0: + time = 940375 + flags = 1 + data = length 418, hash 5F7C6DBA + sample 1: + time = 966497 + flags = 1 + data = length 418, hash D77E6530 + sample 2: + time = 992619 + flags = 1 + data = length 418, hash 48A694AB + sample 3: + time = 1018742 + flags = 1 + data = length 418, hash A979850E + sample 4: + time = 1044864 + flags = 1 + data = length 418, hash 7688E4B1 + sample 5: + time = 1070987 + flags = 1 + data = length 418, hash 255AF933 + sample 6: + time = 1097109 + flags = 1 + data = length 418, hash D58AC838 + sample 7: + time = 1123232 + flags = 1 + data = length 418, hash A38DC7B + sample 8: + time = 1149354 + flags = 1 + data = length 418, hash EA0CA21 + sample 9: + time = 1175477 + flags = 1 + data = length 418, hash DF99B54B + sample 10: + time = 1201599 + flags = 1 + data = length 418, hash A1532134 + sample 11: + time = 1227721 + flags = 1 + data = length 418, hash 520EC187 + sample 12: + time = 1253844 + flags = 1 + data = length 418, hash 5E38E4F + sample 13: + time = 1279966 + flags = 1 + data = length 417, hash 4D3526FB + sample 14: + time = 1306089 + flags = 1 + data = length 418, hash D99092CA + sample 15: + time = 1332211 + flags = 1 + data = length 418, hash EDB10D8E + sample 16: + time = 1358334 + flags = 1 + data = length 418, hash 5B5F6439 + sample 17: + time = 1384456 + flags = 1 + data = length 418, hash 947E2739 + sample 18: + time = 1410579 + flags = 1 + data = length 418, hash 8C1FF29C + sample 19: + time = 1436701 + flags = 1 + data = length 418, hash FEADC9C3 + sample 20: + time = 1462823 + flags = 1 + data = length 418, hash BB82E0C8 + sample 21: + time = 1488946 + flags = 1 + data = length 418, hash 8D1494AF + sample 22: + time = 1515068 + flags = 1 + data = length 418, hash E8C4265C + sample 23: + time = 1541191 + flags = 1 + data = length 418, hash BC8F59AE + sample 24: + time = 1567313 + flags = 1 + data = length 418, hash C8C5DCBD + sample 25: + time = 1593436 + flags = 1 + data = length 418, hash 43C3D85B + sample 26: + time = 1619558 + flags = 1 + data = length 418, hash 238C1AFE + sample 27: + time = 1645681 + flags = 1 + data = length 418, hash F6099191 + sample 28: + time = 1671803 + flags = 1 + data = length 418, hash D236BB0E + sample 29: + time = 1697926 + flags = 1 + data = length 418, hash 58B5B714 + sample 30: + time = 1724048 + flags = 1 + data = length 418, hash A9DDDD52 + sample 31: + time = 1750170 + flags = 1 + data = length 418, hash 85E7D11E + sample 32: + time = 1776293 + flags = 1 + data = length 418, hash 9E9D8FF4 + sample 33: + time = 1802415 + flags = 1 + data = length 418, hash 6FF9060D + sample 34: + time = 1828538 + flags = 1 + data = length 418, hash 4F1FC4F5 + sample 35: + time = 1854660 + flags = 1 + data = length 418, hash EF9885AA + sample 36: + time = 1880783 + flags = 1 + data = length 418, hash 7872C242 + sample 37: + time = 1906905 + flags = 1 + data = length 418, hash EB6FEAED + sample 38: + time = 1933028 + flags = 1 + data = length 417, hash B02D8CF0 + sample 39: + time = 1959150 + flags = 1 + data = length 418, hash EFB6C2DD + sample 40: + time = 1985272 + flags = 1 + data = length 418, hash B733E449 + sample 41: + time = 2011395 + flags = 1 + data = length 418, hash 617B155E + sample 42: + time = 2037517 + flags = 1 + data = length 418, hash AE626B2E + sample 43: + time = 2063640 + flags = 1 + data = length 418, hash F5E232C + sample 44: + time = 2089762 + flags = 1 + data = length 418, hash B5F4DC29 + sample 45: + time = 2115885 + flags = 1 + data = length 418, hash C791E3B5 + sample 46: + time = 2142007 + flags = 1 + data = length 418, hash F42A6BDB + sample 47: + time = 2168130 + flags = 1 + data = length 418, hash FDAEEFE6 + sample 48: + time = 2194252 + flags = 1 + data = length 418, hash 62AC2513 + sample 49: + time = 2220375 + flags = 1 + data = length 418, hash A4B46783 + sample 50: + time = 2246497 + flags = 1 + data = length 418, hash 9B7DFEFE + sample 51: + time = 2272619 + flags = 1 + data = length 418, hash 4010F89A + sample 52: + time = 2298742 + flags = 1 + data = length 418, hash 33467FC1 + sample 53: + time = 2324864 + flags = 1 + data = length 418, hash 1DFAE1E9 + sample 54: + time = 2350987 + flags = 1 + data = length 418, hash C208D375 + sample 55: + time = 2377109 + flags = 1 + data = length 418, hash CD430C30 + sample 56: + time = 2403232 + flags = 1 + data = length 418, hash 5A6F8065 + sample 57: + time = 2429354 + flags = 1 + data = length 418, hash 7177BD8B + sample 58: + time = 2455477 + flags = 1 + data = length 418, hash 51C1F29B + sample 59: + time = 2481599 + flags = 1 + data = length 418, hash 868A0084 + sample 60: + time = 2507721 + flags = 1 + data = length 418, hash 1E9C03E1 + sample 61: + time = 2533844 + flags = 1 + data = length 418, hash 10069B68 + sample 62: + time = 2559966 + flags = 1 + data = length 417, hash CC5B751D + sample 63: + time = 2586089 + flags = 1 + data = length 418, hash 837D650 + sample 64: + time = 2612211 + flags = 1 + data = length 418, hash 43B75632 + sample 65: + time = 2638334 + flags = 1 + data = length 418, hash 86E0652 + sample 66: + time = 2664456 + flags = 1 + data = length 418, hash 4DEC63E7 + sample 67: + time = 2690579 + flags = 1 + data = length 418, hash F094F330 + sample 68: + time = 2716701 + flags = 1 + data = length 418, hash 2C9CAA4 + sample 69: + time = 2742823 + flags = 1 + data = length 418, hash 1E903FFE + sample 70: + time = 2768946 + flags = 1 + data = length 418, hash F276CF72 + sample 71: + time = 2795068 + flags = 1 + data = length 418, hash 1C081463 +tracksEnded = true diff --git a/library/extractor/src/test/assets/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.2.dump b/library/extractor/src/test/assets/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.2.dump new file mode 100644 index 0000000000..f07851e296 --- /dev/null +++ b/library/extractor/src/test/assets/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.2.dump @@ -0,0 +1,175 @@ +seekMap: + isSeekable = true + duration = 2821187 + getPosition(0) = [[timeUs=0, position=240]] +numberOfTracks = 1 +track 0: + format: + bitrate = -1 + id = null + containerMimeType = null + sampleMimeType = audio/mpeg + maxInputSize = 4096 + width = -1 + height = -1 + frameRate = -1.0 + rotationDegrees = 0 + pixelWidthHeightRatio = 1.0 + channelCount = 2 + sampleRate = 44100 + pcmEncoding = -1 + encoderDelay = 0 + encoderPadding = 0 + subsampleOffsetUs = 9223372036854775807 + selectionFlags = 0 + language = null + drmInitData = - + metadata = null + initializationData: + total output bytes = 15046 + sample count = 36 + sample 0: + time = 1880812 + flags = 1 + data = length 418, hash 7872C242 + sample 1: + time = 1906934 + flags = 1 + data = length 418, hash EB6FEAED + sample 2: + time = 1933056 + flags = 1 + data = length 417, hash B02D8CF0 + sample 3: + time = 1959179 + flags = 1 + data = length 418, hash EFB6C2DD + sample 4: + time = 1985301 + flags = 1 + data = length 418, hash B733E449 + sample 5: + time = 2011424 + flags = 1 + data = length 418, hash 617B155E + sample 6: + time = 2037546 + flags = 1 + data = length 418, hash AE626B2E + sample 7: + time = 2063669 + flags = 1 + data = length 418, hash F5E232C + sample 8: + time = 2089791 + flags = 1 + data = length 418, hash B5F4DC29 + sample 9: + time = 2115914 + flags = 1 + data = length 418, hash C791E3B5 + sample 10: + time = 2142036 + flags = 1 + data = length 418, hash F42A6BDB + sample 11: + time = 2168158 + flags = 1 + data = length 418, hash FDAEEFE6 + sample 12: + time = 2194281 + flags = 1 + data = length 418, hash 62AC2513 + sample 13: + time = 2220403 + flags = 1 + data = length 418, hash A4B46783 + sample 14: + time = 2246526 + flags = 1 + data = length 418, hash 9B7DFEFE + sample 15: + time = 2272648 + flags = 1 + data = length 418, hash 4010F89A + sample 16: + time = 2298771 + flags = 1 + data = length 418, hash 33467FC1 + sample 17: + time = 2324893 + flags = 1 + data = length 418, hash 1DFAE1E9 + sample 18: + time = 2351016 + flags = 1 + data = length 418, hash C208D375 + sample 19: + time = 2377138 + flags = 1 + data = length 418, hash CD430C30 + sample 20: + time = 2403260 + flags = 1 + data = length 418, hash 5A6F8065 + sample 21: + time = 2429383 + flags = 1 + data = length 418, hash 7177BD8B + sample 22: + time = 2455505 + flags = 1 + data = length 418, hash 51C1F29B + sample 23: + time = 2481628 + flags = 1 + data = length 418, hash 868A0084 + sample 24: + time = 2507750 + flags = 1 + data = length 418, hash 1E9C03E1 + sample 25: + time = 2533873 + flags = 1 + data = length 418, hash 10069B68 + sample 26: + time = 2559995 + flags = 1 + data = length 417, hash CC5B751D + sample 27: + time = 2586118 + flags = 1 + data = length 418, hash 837D650 + sample 28: + time = 2612240 + flags = 1 + data = length 418, hash 43B75632 + sample 29: + time = 2638363 + flags = 1 + data = length 418, hash 86E0652 + sample 30: + time = 2664485 + flags = 1 + data = length 418, hash 4DEC63E7 + sample 31: + time = 2690607 + flags = 1 + data = length 418, hash F094F330 + sample 32: + time = 2716730 + flags = 1 + data = length 418, hash 2C9CAA4 + sample 33: + time = 2742852 + flags = 1 + data = length 418, hash 1E903FFE + sample 34: + time = 2768975 + flags = 1 + data = length 418, hash F276CF72 + sample 35: + time = 2795097 + flags = 1 + data = length 418, hash 1C081463 +tracksEnded = true diff --git a/library/extractor/src/test/assets/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.3.dump b/library/extractor/src/test/assets/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.3.dump new file mode 100644 index 0000000000..e0e06e54e3 --- /dev/null +++ b/library/extractor/src/test/assets/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.3.dump @@ -0,0 +1,31 @@ +seekMap: + isSeekable = true + duration = 2821187 + getPosition(0) = [[timeUs=0, position=240]] +numberOfTracks = 1 +track 0: + format: + bitrate = -1 + id = null + containerMimeType = null + sampleMimeType = audio/mpeg + maxInputSize = 4096 + width = -1 + height = -1 + frameRate = -1.0 + rotationDegrees = 0 + pixelWidthHeightRatio = 1.0 + channelCount = 2 + sampleRate = 44100 + pcmEncoding = -1 + encoderDelay = 0 + encoderPadding = 0 + subsampleOffsetUs = 9223372036854775807 + selectionFlags = 0 + language = null + drmInitData = - + metadata = null + initializationData: + total output bytes = 0 + sample count = 0 +tracksEnded = true diff --git a/library/extractor/src/test/assets/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.unklen.dump b/library/extractor/src/test/assets/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.unklen.dump new file mode 100644 index 0000000000..3bc2757c4b --- /dev/null +++ b/library/extractor/src/test/assets/mp3/bear-cbr-variable-frame-size-no-seek-table.mp3.unklen.dump @@ -0,0 +1,463 @@ +seekMap: + isSeekable = false + duration = UNSET TIME + getPosition(0) = [[timeUs=0, position=240]] +numberOfTracks = 1 +track 0: + format: + bitrate = -1 + id = null + containerMimeType = null + sampleMimeType = audio/mpeg + maxInputSize = 4096 + width = -1 + height = -1 + frameRate = -1.0 + rotationDegrees = 0 + pixelWidthHeightRatio = 1.0 + channelCount = 2 + sampleRate = 44100 + pcmEncoding = -1 + encoderDelay = 0 + encoderPadding = 0 + subsampleOffsetUs = 9223372036854775807 + selectionFlags = 0 + language = null + drmInitData = - + metadata = null + initializationData: + total output bytes = 45139 + sample count = 108 + sample 0: + time = 0 + flags = 1 + data = length 417, hash C4565176 + sample 1: + time = 26122 + flags = 1 + data = length 418, hash 70AEC448 + sample 2: + time = 52244 + flags = 1 + data = length 418, hash 835A8FB9 + sample 3: + time = 78367 + flags = 1 + data = length 418, hash 3A9672BF + sample 4: + time = 104489 + flags = 1 + data = length 418, hash 8DBE60F9 + sample 5: + time = 130612 + flags = 1 + data = length 418, hash 23D0867B + sample 6: + time = 156734 + flags = 1 + data = length 418, hash 7780AAB9 + sample 7: + time = 182857 + flags = 1 + data = length 418, hash 3F63B2D1 + sample 8: + time = 208979 + flags = 1 + data = length 418, hash 7A33CEBD + sample 9: + time = 235102 + flags = 1 + data = length 418, hash DF31D514 + sample 10: + time = 261224 + flags = 1 + data = length 418, hash 26FA2C86 + sample 11: + time = 287346 + flags = 1 + data = length 418, hash D9C7FB1 + sample 12: + time = 313469 + flags = 1 + data = length 418, hash B1C40DC8 + sample 13: + time = 339591 + flags = 1 + data = length 418, hash 1C953BEE + sample 14: + time = 365714 + flags = 1 + data = length 418, hash A6053C6 + sample 15: + time = 391836 + flags = 1 + data = length 418, hash 2D90325A + sample 16: + time = 417959 + flags = 1 + data = length 418, hash 11A84918 + sample 17: + time = 444081 + flags = 1 + data = length 418, hash 30F1A19A + sample 18: + time = 470204 + flags = 1 + data = length 418, hash 70EC67FF + sample 19: + time = 496326 + flags = 1 + data = length 418, hash 7BAF5828 + sample 20: + time = 522448 + flags = 1 + data = length 418, hash 8E43B85E + sample 21: + time = 548571 + flags = 1 + data = length 418, hash E9A5EE78 + sample 22: + time = 574693 + flags = 1 + data = length 418, hash F79931F8 + sample 23: + time = 600816 + flags = 1 + data = length 418, hash C0308B40 + sample 24: + time = 626938 + flags = 1 + data = length 418, hash 3D2E55B + sample 25: + time = 653061 + flags = 1 + data = length 417, hash D74A61AF + sample 26: + time = 679183 + flags = 1 + data = length 418, hash 96F104B1 + sample 27: + time = 705306 + flags = 1 + data = length 418, hash CE12216 + sample 28: + time = 731428 + flags = 1 + data = length 418, hash 899EA46D + sample 29: + time = 757551 + flags = 1 + data = length 418, hash 1208BBC5 + sample 30: + time = 783673 + flags = 1 + data = length 418, hash 49F22D4D + sample 31: + time = 809795 + flags = 1 + data = length 418, hash 56D959B0 + sample 32: + time = 835918 + flags = 1 + data = length 418, hash 5EC6FF8C + sample 33: + time = 862040 + flags = 1 + data = length 418, hash 380B6E00 + sample 34: + time = 888163 + flags = 1 + data = length 418, hash 19494E6B + sample 35: + time = 914285 + flags = 1 + data = length 418, hash C751B033 + sample 36: + time = 940408 + flags = 1 + data = length 418, hash 5F7C6DBA + sample 37: + time = 966530 + flags = 1 + data = length 418, hash D77E6530 + sample 38: + time = 992653 + flags = 1 + data = length 418, hash 48A694AB + sample 39: + time = 1018775 + flags = 1 + data = length 418, hash A979850E + sample 40: + time = 1044897 + flags = 1 + data = length 418, hash 7688E4B1 + sample 41: + time = 1071020 + flags = 1 + data = length 418, hash 255AF933 + sample 42: + time = 1097142 + flags = 1 + data = length 418, hash D58AC838 + sample 43: + time = 1123265 + flags = 1 + data = length 418, hash A38DC7B + sample 44: + time = 1149387 + flags = 1 + data = length 418, hash EA0CA21 + sample 45: + time = 1175510 + flags = 1 + data = length 418, hash DF99B54B + sample 46: + time = 1201632 + flags = 1 + data = length 418, hash A1532134 + sample 47: + time = 1227755 + flags = 1 + data = length 418, hash 520EC187 + sample 48: + time = 1253877 + flags = 1 + data = length 418, hash 5E38E4F + sample 49: + time = 1280000 + flags = 1 + data = length 417, hash 4D3526FB + sample 50: + time = 1306122 + flags = 1 + data = length 418, hash D99092CA + sample 51: + time = 1332244 + flags = 1 + data = length 418, hash EDB10D8E + sample 52: + time = 1358367 + flags = 1 + data = length 418, hash 5B5F6439 + sample 53: + time = 1384489 + flags = 1 + data = length 418, hash 947E2739 + sample 54: + time = 1410612 + flags = 1 + data = length 418, hash 8C1FF29C + sample 55: + time = 1436734 + flags = 1 + data = length 418, hash FEADC9C3 + sample 56: + time = 1462857 + flags = 1 + data = length 418, hash BB82E0C8 + sample 57: + time = 1488979 + flags = 1 + data = length 418, hash 8D1494AF + sample 58: + time = 1515102 + flags = 1 + data = length 418, hash E8C4265C + sample 59: + time = 1541224 + flags = 1 + data = length 418, hash BC8F59AE + sample 60: + time = 1567346 + flags = 1 + data = length 418, hash C8C5DCBD + sample 61: + time = 1593469 + flags = 1 + data = length 418, hash 43C3D85B + sample 62: + time = 1619591 + flags = 1 + data = length 418, hash 238C1AFE + sample 63: + time = 1645714 + flags = 1 + data = length 418, hash F6099191 + sample 64: + time = 1671836 + flags = 1 + data = length 418, hash D236BB0E + sample 65: + time = 1697959 + flags = 1 + data = length 418, hash 58B5B714 + sample 66: + time = 1724081 + flags = 1 + data = length 418, hash A9DDDD52 + sample 67: + time = 1750204 + flags = 1 + data = length 418, hash 85E7D11E + sample 68: + time = 1776326 + flags = 1 + data = length 418, hash 9E9D8FF4 + sample 69: + time = 1802448 + flags = 1 + data = length 418, hash 6FF9060D + sample 70: + time = 1828571 + flags = 1 + data = length 418, hash 4F1FC4F5 + sample 71: + time = 1854693 + flags = 1 + data = length 418, hash EF9885AA + sample 72: + time = 1880816 + flags = 1 + data = length 418, hash 7872C242 + sample 73: + time = 1906938 + flags = 1 + data = length 418, hash EB6FEAED + sample 74: + time = 1933061 + flags = 1 + data = length 417, hash B02D8CF0 + sample 75: + time = 1959183 + flags = 1 + data = length 418, hash EFB6C2DD + sample 76: + time = 1985306 + flags = 1 + data = length 418, hash B733E449 + sample 77: + time = 2011428 + flags = 1 + data = length 418, hash 617B155E + sample 78: + time = 2037551 + flags = 1 + data = length 418, hash AE626B2E + sample 79: + time = 2063673 + flags = 1 + data = length 418, hash F5E232C + sample 80: + time = 2089795 + flags = 1 + data = length 418, hash B5F4DC29 + sample 81: + time = 2115918 + flags = 1 + data = length 418, hash C791E3B5 + sample 82: + time = 2142040 + flags = 1 + data = length 418, hash F42A6BDB + sample 83: + time = 2168163 + flags = 1 + data = length 418, hash FDAEEFE6 + sample 84: + time = 2194285 + flags = 1 + data = length 418, hash 62AC2513 + sample 85: + time = 2220408 + flags = 1 + data = length 418, hash A4B46783 + sample 86: + time = 2246530 + flags = 1 + data = length 418, hash 9B7DFEFE + sample 87: + time = 2272653 + flags = 1 + data = length 418, hash 4010F89A + sample 88: + time = 2298775 + flags = 1 + data = length 418, hash 33467FC1 + sample 89: + time = 2324897 + flags = 1 + data = length 418, hash 1DFAE1E9 + sample 90: + time = 2351020 + flags = 1 + data = length 418, hash C208D375 + sample 91: + time = 2377142 + flags = 1 + data = length 418, hash CD430C30 + sample 92: + time = 2403265 + flags = 1 + data = length 418, hash 5A6F8065 + sample 93: + time = 2429387 + flags = 1 + data = length 418, hash 7177BD8B + sample 94: + time = 2455510 + flags = 1 + data = length 418, hash 51C1F29B + sample 95: + time = 2481632 + flags = 1 + data = length 418, hash 868A0084 + sample 96: + time = 2507755 + flags = 1 + data = length 418, hash 1E9C03E1 + sample 97: + time = 2533877 + flags = 1 + data = length 418, hash 10069B68 + sample 98: + time = 2560000 + flags = 1 + data = length 417, hash CC5B751D + sample 99: + time = 2586122 + flags = 1 + data = length 418, hash 837D650 + sample 100: + time = 2612244 + flags = 1 + data = length 418, hash 43B75632 + sample 101: + time = 2638367 + flags = 1 + data = length 418, hash 86E0652 + sample 102: + time = 2664489 + flags = 1 + data = length 418, hash 4DEC63E7 + sample 103: + time = 2690612 + flags = 1 + data = length 418, hash F094F330 + sample 104: + time = 2716734 + flags = 1 + data = length 418, hash 2C9CAA4 + sample 105: + time = 2742857 + flags = 1 + data = length 418, hash 1E903FFE + sample 106: + time = 2768979 + flags = 1 + data = length 418, hash F276CF72 + sample 107: + time = 2795102 + flags = 1 + data = length 418, hash 1C081463 +tracksEnded = true diff --git a/library/extractor/src/test/assets/mp3/bear.mp3 b/library/extractor/src/test/assets/mp3/bear-xing-header.mp3 similarity index 100% rename from library/extractor/src/test/assets/mp3/bear.mp3 rename to library/extractor/src/test/assets/mp3/bear-xing-header.mp3 diff --git a/library/extractor/src/test/assets/mp3/bear.mp3.0.dump b/library/extractor/src/test/assets/mp3/bear-xing-header.mp3.0.dump similarity index 100% rename from library/extractor/src/test/assets/mp3/bear.mp3.0.dump rename to library/extractor/src/test/assets/mp3/bear-xing-header.mp3.0.dump diff --git a/library/extractor/src/test/assets/mp3/bear.mp3.1.dump b/library/extractor/src/test/assets/mp3/bear-xing-header.mp3.1.dump similarity index 100% rename from library/extractor/src/test/assets/mp3/bear.mp3.1.dump rename to library/extractor/src/test/assets/mp3/bear-xing-header.mp3.1.dump diff --git a/library/extractor/src/test/assets/mp3/bear.mp3.2.dump b/library/extractor/src/test/assets/mp3/bear-xing-header.mp3.2.dump similarity index 100% rename from library/extractor/src/test/assets/mp3/bear.mp3.2.dump rename to library/extractor/src/test/assets/mp3/bear-xing-header.mp3.2.dump diff --git a/library/extractor/src/test/assets/mp3/bear.mp3.3.dump b/library/extractor/src/test/assets/mp3/bear-xing-header.mp3.3.dump similarity index 100% rename from library/extractor/src/test/assets/mp3/bear.mp3.3.dump rename to library/extractor/src/test/assets/mp3/bear-xing-header.mp3.3.dump diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/FlacMetadataReaderTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/FlacMetadataReaderTest.java index fb53cb290a..a2c51a39c7 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/FlacMetadataReaderTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/FlacMetadataReaderTest.java @@ -103,7 +103,7 @@ public class FlacMetadataReaderTest { @Test public void checkAndPeekStreamMarker_invalidData_isFalse() throws Exception { - ExtractorInput input = buildExtractorInput("mp3/bear.mp3"); + ExtractorInput input = buildExtractorInput("mp3/bear-xing-header.mp3"); boolean result = FlacMetadataReader.checkAndPeekStreamMarker(input); @@ -163,7 +163,7 @@ public class FlacMetadataReaderTest { @Test public void readStreamMarker_invalidData_throwsException() throws Exception { - ExtractorInput input = buildExtractorInput("mp3/bear.mp3"); + ExtractorInput input = buildExtractorInput("mp3/bear-xing-header.mp3"); assertThrows(ParserException.class, () -> FlacMetadataReader.readStreamMarker(input)); } diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp3/ConstantBitrateSeekerTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp3/ConstantBitrateSeekerTest.java new file mode 100644 index 0000000000..a51fa60cab --- /dev/null +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp3/ConstantBitrateSeekerTest.java @@ -0,0 +1,213 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2.extractor.mp3; + +import static com.google.common.truth.Truth.assertThat; + +import android.net.Uri; +import androidx.test.core.app.ApplicationProvider; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.extractor.SeekMap; +import com.google.android.exoplayer2.testutil.FakeExtractorOutput; +import com.google.android.exoplayer2.testutil.FakeTrackOutput; +import com.google.android.exoplayer2.testutil.TestUtil; +import com.google.android.exoplayer2.upstream.DefaultDataSource; +import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; +import com.google.android.exoplayer2.util.Util; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** Tests for {@link ConstantBitrateSeeker}. */ +@RunWith(AndroidJUnit4.class) +public class ConstantBitrateSeekerTest { + private static final String CONSTANT_FRAME_SIZE_TEST_FILE = + "mp3/bear-cbr-constant-frame-size-no-seek-table.mp3"; + private static final String VARIABLE_FRAME_SIZE_TEST_FILE = + "mp3/bear-cbr-variable-frame-size-no-seek-table.mp3"; + + private Mp3Extractor extractor; + private FakeExtractorOutput extractorOutput; + private DefaultDataSource dataSource; + + @Before + public void setUp() throws Exception { + extractor = new Mp3Extractor(); + extractorOutput = new FakeExtractorOutput(); + dataSource = + new DefaultDataSourceFactory(ApplicationProvider.getApplicationContext(), "UserAgent") + .createDataSource(); + } + + @Test + public void mp3ExtractorReads_returnSeekableCbrSeeker() throws IOException, InterruptedException { + Uri fileUri = TestUtil.buildAssetUri(CONSTANT_FRAME_SIZE_TEST_FILE); + + SeekMap seekMap = TestUtil.extractSeekMap(extractor, extractorOutput, dataSource, fileUri); + + assertThat(seekMap.getClass()).isEqualTo(ConstantBitrateSeeker.class); + assertThat(seekMap.getDurationUs()).isEqualTo(2_784_000); + assertThat(seekMap.isSeekable()).isTrue(); + } + + @Test + public void seeking_handlesSeekToZero() throws IOException, InterruptedException { + String fileName = CONSTANT_FRAME_SIZE_TEST_FILE; + Uri fileUri = TestUtil.buildAssetUri(fileName); + SeekMap seekMap = TestUtil.extractSeekMap(extractor, extractorOutput, dataSource, fileUri); + FakeTrackOutput trackOutput = extractorOutput.trackOutputs.get(0); + + long targetSeekTimeUs = 0; + int extractedFrameIndex = + TestUtil.seekToTimeUs( + extractor, seekMap, targetSeekTimeUs, dataSource, trackOutput, fileUri); + + assertThat(extractedFrameIndex).isNotEqualTo(C.INDEX_UNSET); + assertFirstFrameAfterSeekIsExactFrame( + fileName, trackOutput, targetSeekTimeUs, extractedFrameIndex); + } + + @Test + public void seeking_handlesSeekToEoF() throws IOException, InterruptedException { + String fileName = CONSTANT_FRAME_SIZE_TEST_FILE; + Uri fileUri = TestUtil.buildAssetUri(fileName); + SeekMap seekMap = TestUtil.extractSeekMap(extractor, extractorOutput, dataSource, fileUri); + FakeTrackOutput trackOutput = extractorOutput.trackOutputs.get(0); + + long targetSeekTimeUs = seekMap.getDurationUs(); + int extractedFrameIndex = + TestUtil.seekToTimeUs( + extractor, seekMap, targetSeekTimeUs, dataSource, trackOutput, fileUri); + + assertThat(extractedFrameIndex).isNotEqualTo(C.INDEX_UNSET); + assertFirstFrameAfterSeekIsExactFrame( + fileName, trackOutput, targetSeekTimeUs, extractedFrameIndex); + } + + @Test + public void seeking_handlesSeekingBackward() throws IOException, InterruptedException { + String fileName = CONSTANT_FRAME_SIZE_TEST_FILE; + Uri fileUri = TestUtil.buildAssetUri(fileName); + SeekMap seekMap = TestUtil.extractSeekMap(extractor, extractorOutput, dataSource, fileUri); + FakeTrackOutput trackOutput = extractorOutput.trackOutputs.get(0); + + long firstSeekTimeUs = 1_234_000; + TestUtil.seekToTimeUs(extractor, seekMap, firstSeekTimeUs, dataSource, trackOutput, fileUri); + long targetSeekTimeUs = 987_000; + int extractedFrameIndex = + TestUtil.seekToTimeUs( + extractor, seekMap, targetSeekTimeUs, dataSource, trackOutput, fileUri); + + assertThat(extractedFrameIndex).isNotEqualTo(C.INDEX_UNSET); + assertFirstFrameAfterSeekIsExactFrame( + fileName, trackOutput, targetSeekTimeUs, extractedFrameIndex); + } + + @Test + public void seeking_handlesSeekingForward() throws IOException, InterruptedException { + String fileName = CONSTANT_FRAME_SIZE_TEST_FILE; + Uri fileUri = TestUtil.buildAssetUri(fileName); + SeekMap seekMap = TestUtil.extractSeekMap(extractor, extractorOutput, dataSource, fileUri); + FakeTrackOutput trackOutput = extractorOutput.trackOutputs.get(0); + + long firstSeekTimeUs = 987_000; + TestUtil.seekToTimeUs(extractor, seekMap, firstSeekTimeUs, dataSource, trackOutput, fileUri); + long targetSeekTimeUs = 1_234_000; + int extractedFrameIndex = + TestUtil.seekToTimeUs( + extractor, seekMap, targetSeekTimeUs, dataSource, trackOutput, fileUri); + + assertThat(extractedFrameIndex).isNotEqualTo(C.INDEX_UNSET); + assertFirstFrameAfterSeekIsExactFrame( + fileName, trackOutput, targetSeekTimeUs, extractedFrameIndex); + } + + @Test + public void seeking_variableFrameSize_seeksNearlyExactlyToCorrectFrame() + throws IOException, InterruptedException { + String fileName = VARIABLE_FRAME_SIZE_TEST_FILE; + Uri fileUri = TestUtil.buildAssetUri(fileName); + SeekMap seekMap = TestUtil.extractSeekMap(extractor, extractorOutput, dataSource, fileUri); + FakeTrackOutput trackOutput = extractorOutput.trackOutputs.get(0); + + long targetSeekTimeUs = 1_234_000; + int extractedFrameIndex = + TestUtil.seekToTimeUs( + extractor, seekMap, targetSeekTimeUs, dataSource, trackOutput, fileUri); + + assertThat(extractedFrameIndex).isNotEqualTo(C.INDEX_UNSET); + assertFirstFrameAfterSeekIsWithin1FrameOfExactFrame( + fileName, trackOutput, targetSeekTimeUs, extractedFrameIndex); + } + + private static void assertFirstFrameAfterSeekIsExactFrame( + String fileName, + FakeTrackOutput trackOutput, + long targetSeekTimeUs, + int firstFrameIndexAfterSeek) + throws IOException, InterruptedException { + FakeTrackOutput expectedTrackOutput = getExpectedTrackOutput(fileName); + int exactFrameIndex = getFrameIndex(expectedTrackOutput, targetSeekTimeUs); + + assertThat(trackOutput.getSampleData(firstFrameIndexAfterSeek)) + .isEqualTo(expectedTrackOutput.getSampleData(exactFrameIndex)); + } + + private static void assertFirstFrameAfterSeekIsWithin1FrameOfExactFrame( + String fileName, + FakeTrackOutput trackOutput, + long targetSeekTimeUs, + int firstFrameIndexAfterSeek) + throws IOException, InterruptedException { + FakeTrackOutput expectedTrackOutput = getExpectedTrackOutput(fileName); + int exactFrameIndex = getFrameIndex(expectedTrackOutput, targetSeekTimeUs); + + boolean foundPreviousFrame = + exactFrameIndex != 0 + && Arrays.equals( + trackOutput.getSampleData(firstFrameIndexAfterSeek), + expectedTrackOutput.getSampleData(exactFrameIndex - 1)); + boolean foundExactFrame = + Arrays.equals( + trackOutput.getSampleData(firstFrameIndexAfterSeek), + expectedTrackOutput.getSampleData(exactFrameIndex)); + boolean foundNextFrame = + exactFrameIndex != expectedTrackOutput.getSampleCount() - 1 + && Arrays.equals( + trackOutput.getSampleData(firstFrameIndexAfterSeek), + expectedTrackOutput.getSampleData(exactFrameIndex + 1)); + + assertThat(foundPreviousFrame || foundExactFrame || foundNextFrame).isTrue(); + } + + private static FakeTrackOutput getExpectedTrackOutput(String fileName) + throws IOException, InterruptedException { + return TestUtil.extractAllSamplesFromFile( + new Mp3Extractor(), ApplicationProvider.getApplicationContext(), fileName) + .trackOutputs + .get(0); + } + + private static int getFrameIndex(FakeTrackOutput trackOutput, long targetSeekTimeUs) { + List frameTimes = trackOutput.getSampleTimesUs(); + return Util.binarySearchFloor( + frameTimes, targetSeekTimeUs, /* inclusive= */ true, /* stayInBounds= */ false); + } +} diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp3/Mp3ExtractorTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp3/Mp3ExtractorTest.java index 670296cc13..727af17401 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp3/Mp3ExtractorTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mp3/Mp3ExtractorTest.java @@ -25,8 +25,14 @@ import org.junit.runner.RunWith; public final class Mp3ExtractorTest { @Test - public void testMp3Sample() throws Exception { - ExtractorAsserts.assertBehavior(Mp3Extractor::new, "mp3/bear.mp3"); + public void testMp3SampleWithXingHeader() throws Exception { + ExtractorAsserts.assertBehavior(Mp3Extractor::new, "mp3/bear-xing-header.mp3"); + } + + @Test + public void testMp3SampleWithCbrSeeker() throws Exception { + ExtractorAsserts.assertBehavior( + Mp3Extractor::new, "mp3/bear-cbr-variable-frame-size-no-seek-table.mp3"); } @Test