From 11ca78761e268044abc85e591fb5a8c2be4d2fe1 Mon Sep 17 00:00:00 2001 From: Googler Date: Mon, 15 Jul 2024 04:46:00 -0700 Subject: [PATCH] Add support for 3gpp amr-nb audio codec. To support AMR audio codec(audio/3gpp) add `0x81FF` mode to create damrBox. Add unit test and an Android end to end test. PiperOrigin-RevId: 652438693 --- ...MuxerEndToEndParameterizedAndroidTest.java | 2 + .../java/androidx/media3/muxer/Boxes.java | 6 +- .../java/androidx/media3/muxer/BoxesTest.java | 21 + .../mp4/bbb_mono_8kHz_12.2kbps_amrnb.3gp | Bin 0 -> 5450 bytes .../audio_sample_entry_box_samr.dump | 2 + .../bbb_mono_8kHz_12.2kbps_amrnb.3gp.dump | 624 ++++++++++++++++++ 6 files changed, 654 insertions(+), 1 deletion(-) create mode 100644 libraries/test_data/src/test/assets/media/mp4/bbb_mono_8kHz_12.2kbps_amrnb.3gp create mode 100644 libraries/test_data/src/test/assets/muxerdumps/audio_sample_entry_box_samr.dump create mode 100644 libraries/test_data/src/test/assets/muxerdumps/bbb_mono_8kHz_12.2kbps_amrnb.3gp.dump diff --git a/libraries/muxer/src/androidTest/java/androidx/media3/muxer/Mp4MuxerEndToEndParameterizedAndroidTest.java b/libraries/muxer/src/androidTest/java/androidx/media3/muxer/Mp4MuxerEndToEndParameterizedAndroidTest.java index 6ef69d9ec0..47256c06a1 100644 --- a/libraries/muxer/src/androidTest/java/androidx/media3/muxer/Mp4MuxerEndToEndParameterizedAndroidTest.java +++ b/libraries/muxer/src/androidTest/java/androidx/media3/muxer/Mp4MuxerEndToEndParameterizedAndroidTest.java @@ -51,6 +51,7 @@ public class Mp4MuxerEndToEndParameterizedAndroidTest { private static final String H265_HDR10_MP4 = "hdr10-720p.mp4"; private static final String H265_WITH_METADATA_TRACK_MP4 = "h265_with_metadata_track.mp4"; private static final String AV1_MP4 = "sample_av1.mp4"; + private static final String AMR_NB = "bbb_mono_8kHz_12.2kbps_amrnb.3gp"; private static final String AMR_WB = "bbb_mono_16kHz_23.05kbps_amrwb.3gp"; private static final String MPEG4_MP4 = "bbb_176x144_192kbps_15fps_mpeg4.mp4"; @@ -63,6 +64,7 @@ public class Mp4MuxerEndToEndParameterizedAndroidTest { H265_HDR10_MP4, H265_WITH_METADATA_TRACK_MP4, AV1_MP4, + AMR_NB, AMR_WB, MPEG4_MP4); } diff --git a/libraries/muxer/src/main/java/androidx/media3/muxer/Boxes.java b/libraries/muxer/src/main/java/androidx/media3/muxer/Boxes.java index fe570c41a2..43420ed066 100644 --- a/libraries/muxer/src/main/java/androidx/media3/muxer/Boxes.java +++ b/libraries/muxer/src/main/java/androidx/media3/muxer/Boxes.java @@ -544,8 +544,10 @@ import java.util.List; case MimeTypes.AUDIO_AAC: case MimeTypes.VIDEO_MP4V: return esdsBox(format); + case MimeTypes.AUDIO_AMR_NB: + return damrBox(/* mode= */ (short) 0x81FF); // mode set: all enabled for AMR-NB case MimeTypes.AUDIO_AMR_WB: - return damrBox(/* mode= */ (short) 0x83FF); // mode set: all enabled + return damrBox(/* mode= */ (short) 0x83FF); // mode set: all enabled for AMR-WB case MimeTypes.VIDEO_H264: return avcCBox(format); case MimeTypes.VIDEO_H265: @@ -1322,6 +1324,8 @@ import java.util.List; switch (mimeType) { case MimeTypes.AUDIO_AAC: return "mp4a"; + case MimeTypes.AUDIO_AMR_NB: + return "samr"; case MimeTypes.AUDIO_AMR_WB: return "sawb"; case MimeTypes.VIDEO_H264: diff --git a/libraries/muxer/src/test/java/androidx/media3/muxer/BoxesTest.java b/libraries/muxer/src/test/java/androidx/media3/muxer/BoxesTest.java index 7c8ce48960..a5902031bc 100644 --- a/libraries/muxer/src/test/java/androidx/media3/muxer/BoxesTest.java +++ b/libraries/muxer/src/test/java/androidx/media3/muxer/BoxesTest.java @@ -254,6 +254,27 @@ public class BoxesTest { context, dumpableBox, getExpectedDumpFilePath("audio_sample_entry_box_mp4a")); } + @Test + public void createAudioSampleEntryBox_forSamr_matchesExpected() throws Exception { + Format format = + new Format.Builder() + .setPeakBitrate(128000) + .setSampleRate(48000) + .setId(3) + .setSampleMimeType(MimeTypes.AUDIO_AMR_NB) + .setChannelCount(2) + .setAverageBitrate(128000) + .setLanguage("```") + .setMaxInputSize(502) + .build(); + + ByteBuffer audioSampleEntryBox = Boxes.audioSampleEntry(format); + + DumpableMp4Box dumpableBox = new DumpableMp4Box(audioSampleEntryBox); + DumpFileAsserts.assertOutput( + context, dumpableBox, getExpectedDumpFilePath("audio_sample_entry_box_samr")); + } + @Test public void createAudioSampleEntryBox_forSawb_matchesExpected() throws Exception { Format format = diff --git a/libraries/test_data/src/test/assets/media/mp4/bbb_mono_8kHz_12.2kbps_amrnb.3gp b/libraries/test_data/src/test/assets/media/mp4/bbb_mono_8kHz_12.2kbps_amrnb.3gp new file mode 100644 index 0000000000000000000000000000000000000000..a450b919afaf5c8a3b45c461b504eae349edfd80 GIT binary patch literal 5450 zcmaht2{@G9_cOL8JIOLJGnTTOAxrdU@%GVh?tPWJ|UVg7#qwl zJeUF%jlcRZgm;*i7Yru6NFkFV01nAhC${gr>bp3s^jSSb5C#)9NB7Q4!eHUS>Ats1 zfkTum4J~@sot0XUjsPP|Z) zIC;)qPw7E1m1ot@|Isze&qS%BGsOO4LxA5_+Ux@xr*L1&@m2o$Jsl`kft_qtwG$`T zo5K~hIDlW<&dHHOn#v+sqqec7bRhF1cwsc?mj2JqV@DX|FUicw`;s}mb4 zN%BGUOO@AQX@PMid@0CMKvXu)!fQ=LaDE`pi8So$U&~h*w2dauDz~Xyh~?M<2qXE+ z5rUb1;VDt~KRmB@nTUCzyka`TeR`;M2;H~}NXj`$xhcW~zqy{Zds67F(JWGW*NAY? zJMyr0x_UJYKpOk!f#3LSm-8k!tW7-Pu`_cQ;&V0luRgmiKy{%5BIt-yjXj*}cZ%xe z&Ug?LR#KlOpDx@G)#^M|SY8PO5HcS47E=T19sRq!lgUM966K#x#n$mpbam-H{u8|l zyo=V5-6E%jtf)1-T96L0HtI27qcr+U1P`)*&`}%!xByujFv4?gN}w{Uj!RWt3H{(+ zwcc35q*-u-Wq=?s6XSmjMDv^8xp($*UNY)+%2oQ}%nyRMVfEqzY&9f*g#%_F@N|YH zpv?BBH~x(A;vZP&MOXIul*-PzKWYHFR;VdBo2&71;N|*}_Az^Mm+ILrRf7@ddESEj zBOw64k(@k;8l&zcRu<_jWC!F&G?`59^(Ejl%KsUk(F)wA` zZMkrKOIW2d#ZHRwWac_?DY{wR4Ktqvhy&hfV1xeLRQ&L;npuu$7ogvYz*;<SNoCEUfsCuY351DwIO|S25nQ=?Ym%GMm?7OEN7@ z{-`v4P2>i)06y?mMi4**`j~;JjrpcDl>nDB9lvH9xGvSKQ54;(Gj{}LYXB}CKeN-< z#l!mI9oN*&rS3QI_j;S&SZp^wtFqX|P6y~ZgvX#*I*FBC|0CU-Ba zQsI3*V`bW`^BT>i4$?p3Xlwx}#e-iS?rUDZy|K=Hqt@%z*E?>Lp=ERpum<4Q3bg^z z@8LU%S%2)mAmDwW))SjA2fnhGICGSj4+ik-B;Eqi0pcDpWVR6vvDcRRgA(X`$Nc3%ivsG-uv{PtoN?ZS?>zL+czl;(n^sBRE(MTHL3bHq zm%c=$DY*O?h&OS9pM0*qb}D3b=M*+Ghz{^KljT7v)SanO)1cQRLF&vlZRImc^8Ph5 zg?(ZUf&krpZ}FCw5mUC{w2+o$MT_le0|}(bPKqy_cOkl#2p}6{Pi_U#n6gRAVTD(p z*U9)cho#GrTR#+BkgH{C--Zz>1N_l&EXVeM>+8BaS zRqiT{R$+z!GF(cPVVRFKP2xQ*`RVHapoUsE*U~o}K5^*_bY6w%?-?jFi2}|(N!&kf zgu&UiW*(OIJ#*v|a(uJsRtD`a?0OUwU-%AFBi~6s-mnfW4UrPe-DpsyJ=hw*M1%Za z6bq6JnKFr&@O6r&Ct|ja#Cl8Ct2OkNWKYrw7Q z=w^+G)8~e4juc@@>pIWer;ergeO)nMSKc0>Sk;d~aX?l;pao_!R9-?V7IoG|iDq=RnGWfiCB| z$L#lqtHA#9+HtG1L(}kHv6Cem*Monie52TPshIWBbG7zL4FHG-SI5(%ac(f`3Ewj@ z0$!A`H#avNXJR_iSLC7#ApRLgJ`Q{pcY|Nd-145?u3fj$d4QQ-U(bw(xkMa<{Qp|> zVBU{&RAu%8 z(bLUq^AVD7fk=Dzb;$oQ#`4U%#uH5dne6qNDCRf}0m;#@60}W>t^yDt#s&pF6c&=-5UpuR`=( zs)X5OH`pi6H<#t`t()eB&OW4d8P&dJOO7eXKi@xkn_LFlEF3*Nk~^1|Qd_IA5H+ov zADJZ2CK5vgFmd&=!^u1eaP-=brzzmqD6Ly>Y{q3`6>hsI*WM8XkQDyjMqW6>H1DvH zDp903N_z4>6h?F8(ax>o)SzaZnEknjX3F9l>W z_+PNn^Yu(#8xi`S;{VV-Lat$o2q#>=J|5A!DF|rh0E!IjeIwQ0biU6)^tTq{!5SMd z{*T%(vCjt=q5Z`RmFk=pWXh5xb7X%cPm&B`2`bv3t8d;Qmf$l&0F(SjicOow8HMe{ zZ&~A-XLdSA65h4_I_)|XzUPBiJAl6bq)gi0Sv!-g+Fq-iQo;F(oaZp9)Yy(rz4m85 z4Zu)@v|e68>6sks_fSj!`s722n}6}h1RBGxBwc)S70@k1yh+Q4pSRx^X=cBTftRG& z%$7Ptnpg{KWm;#`0O|5z&eJ!`XiDyUu5`!_k2Qhd*F|X^L7=5(YV2L z6k$OC)8e!O9^3K=q5vcd6a*t8%@F z+t21@JXM>jv9C7f4&=Z38crbE+IB_d#we`z*M9r7fMbcj9AQV_-hlhZ4FE{@a~Yt9 z->Vj1`Qj@X&yZHk&Bk}62M83^n?qUN5EygUup#6rKIwab_-x%uLzX`r`sr9G!ujo) z zm*miq;2Bh}j+Em$5iWwk0rXI}Y*5pn+CJv`JxeeaE~s*IOsYJk{<^(jm25!>pwKN} zy`^cZohfsO)z>?h7HSn;UN>DSlF!s%WSfNIqgOy4xNDzG#FOtHsoLBJ+dO&ik{&sE zJqT+51oT*GFT=hR>3(#H2HlQ32iPc@b98>4! z-IT(M{+7tyb;Zuv+K3GYa2>WY110uC`BP&2V!3)DiF+vZy^~|~F&6x#;WHe77>IZV zo)~-8g86a&v8C4@2djtL`5_w|&YXBArU$xTfj~59uKFcB>FaQ$dB@IOj|0fI+pabh z<4tZauI=V;?kk|VD0Sx*ukXcjov%UP5eVZr|Mo&@^Y7_%ApnBlYX+K6l9+=NlSTv2 z1#V2tG+McMpmmY89m20mq5O^F1Zo!CiB+nA66 zYMFMKJV(l{^%jG zDqZ4o-zvaGpg{RshF1%fCz>cbWNm4~9*IGEn4d;p?kx|if#}I-5H(cBN+!rz+jVyf zJk9j%J;l)F7fW5B^sP`Ps8mKxMUFJO@kmJB3 zSKfaE;xBU!4Wb38thA{j={FQv4cXw7n=haCIKza_5%3`Zzom~2XpwH(l71q(OhRAW z#A<FEUWs8Cr+lib?izOy2J)tTc+i4}!q zBloY7IOzQt4(0Ew#viD`hFS|#RGg7|*plf|>zI^Pn_Uj%pIV_}AS#;rQ)!8-Fl5eb z)AG4$m9FkLaoC@dd6QFP1(wVslGD(D5j9na~`3ndmBZ-Zoy;S^}?&x0hLzHfNd1?lH55WSXb6sQ?} z&oeck*e-!LFk$c0n#`-i`tS(Op;mrqe|iK7X6aM>&(!KiDD7gruYi+%-wNMelRp^u zr&y5wWkMqvS{d+PN&)`Q44VumE`BNa;jrS(q}Pbt-wWwqFEN~{wK}ju4fK$(4t~Yg zuqk@^BX+GJxwKX&7P8L=1jv6P%6?)i&l$F;@SFG1jcOuF;l_(DTQ~(s{*uu9i;w%o zuWaqZNm2oo!>Gzur)1dWdr5CzR^V^|ZzEA26n7`BWcH~QUH^>MmBK!~l}~)@wpBGn zJKNL32Uc z%xhgfa#kv5T6+u>znh@^p7a*a!mP;z3+Y)di4EM!%{uz714WxJs-1~ zp9YQlNDM~s%`mzc1>6l9ytnEa$lY#JUyk?FXa+xP08xX)NQNQ&1;fSb+G->rN**)P z>kr>Lcho)!A*~I`$ITrDiqfQ6rFAk16M2}j5IRLGi>$C}vTmS|2<4|PQc)nWL3%}L zDl+aPv%`FSbhcGh5#ilz@;njxzJj?IDF(&gvdw|=SDHc5GtF1CKAbwjp_nJnZ-|HN zpMEwA51WPKB?bdb_C3i<%x?F=?8jZgIHW^=Szm_e*^YK z7>uV428Zqb{ssThfzbceH~iPk|Et9Y5%ffakpiH>vk?Kmd9wf8#J^XA`2GvvzmfmN z=l|g==S7YPhnA4^3Jj0yxs z1H*o|puh0o$e@4PyR{wEC!Zh%kpsPc&-qUA3-X5Wg5i|^SX7Su7haMa=CwP%3%f_+ zjSLIK{N1h%kMIbD+NR+V;r}ROcaBy#iSo||cKd$;8w~m&34`r!6#^kLH0StnD_a<&Uwhvh@16e_z5Xh200V&VzayReJfEd_tqBGA}*sJ#mqsO;h)oM$jp K@51g}mH!0@-#$nH literal 0 HcmV?d00001 diff --git a/libraries/test_data/src/test/assets/muxerdumps/audio_sample_entry_box_samr.dump b/libraries/test_data/src/test/assets/muxerdumps/audio_sample_entry_box_samr.dump new file mode 100644 index 0000000000..2d271a947b --- /dev/null +++ b/libraries/test_data/src/test/assets/muxerdumps/audio_sample_entry_box_samr.dump @@ -0,0 +1,2 @@ +samr (53 bytes): + Data = length 45, hash 7F055BB3 diff --git a/libraries/test_data/src/test/assets/muxerdumps/bbb_mono_8kHz_12.2kbps_amrnb.3gp.dump b/libraries/test_data/src/test/assets/muxerdumps/bbb_mono_8kHz_12.2kbps_amrnb.3gp.dump new file mode 100644 index 0000000000..c73ebb42f7 --- /dev/null +++ b/libraries/test_data/src/test/assets/muxerdumps/bbb_mono_8kHz_12.2kbps_amrnb.3gp.dump @@ -0,0 +1,624 @@ +seekMap: + isSeekable = true + duration = 3000000 + getPosition(0) = [[timeUs=0, position=400052]] + getPosition(1) = [[timeUs=1, position=400052]] + getPosition(1500000) = [[timeUs=1500000, position=402452]] + getPosition(3000000) = [[timeUs=3000000, position=404852]] +numberOfTracks = 1 +track 0: + total output bytes = 4832 + sample count = 151 + format 0: + id = 1 + sampleMimeType = audio/3gpp + maxInputSize = 62 + channelCount = 1 + sampleRate = 8000 + language = und + metadata = entries=[Mp4Timestamp: creation time=100000000, modification time=500000000, timescale=10000] + sample 0: + time = 0 + flags = 1 + data = length 32, hash 53582FC7 + sample 1: + time = 20000 + flags = 1 + data = length 32, hash 5685F9D6 + sample 2: + time = 40000 + flags = 1 + data = length 32, hash 979442D3 + sample 3: + time = 60000 + flags = 1 + data = length 32, hash D6C2D2B3 + sample 4: + time = 80000 + flags = 1 + data = length 32, hash 4D7A467C + sample 5: + time = 100000 + flags = 1 + data = length 32, hash D24FBF21 + sample 6: + time = 120000 + flags = 1 + data = length 32, hash 39A010D0 + sample 7: + time = 140000 + flags = 1 + data = length 32, hash 238FB065 + sample 8: + time = 160000 + flags = 1 + data = length 32, hash 7F460D8F + sample 9: + time = 180000 + flags = 1 + data = length 32, hash 4144D57A + sample 10: + time = 200000 + flags = 1 + data = length 32, hash 17FAFC32 + sample 11: + time = 220000 + flags = 1 + data = length 32, hash BBB92AF1 + sample 12: + time = 240000 + flags = 1 + data = length 32, hash 8662DF11 + sample 13: + time = 260000 + flags = 1 + data = length 32, hash ADE12517 + sample 14: + time = 280000 + flags = 1 + data = length 32, hash 42A2F90 + sample 15: + time = 300000 + flags = 1 + data = length 32, hash BA4736EE + sample 16: + time = 320000 + flags = 1 + data = length 32, hash DC3899EE + sample 17: + time = 340000 + flags = 1 + data = length 32, hash 9680E057 + sample 18: + time = 360000 + flags = 1 + data = length 32, hash 9DD4439A + sample 19: + time = 380000 + flags = 1 + data = length 32, hash A187A2E8 + sample 20: + time = 400000 + flags = 1 + data = length 32, hash 2181AFA7 + sample 21: + time = 420000 + flags = 1 + data = length 32, hash 2C46A44 + sample 22: + time = 440000 + flags = 1 + data = length 32, hash 45492E08 + sample 23: + time = 460000 + flags = 1 + data = length 32, hash 7E8B40BC + sample 24: + time = 480000 + flags = 1 + data = length 32, hash 8A572FB6 + sample 25: + time = 500000 + flags = 1 + data = length 32, hash 271382F7 + sample 26: + time = 520000 + flags = 1 + data = length 32, hash 31B52A2C + sample 27: + time = 540000 + flags = 1 + data = length 32, hash 1C0C6ACD + sample 28: + time = 560000 + flags = 1 + data = length 32, hash 12AF988B + sample 29: + time = 580000 + flags = 1 + data = length 32, hash 1EC318A2 + sample 30: + time = 600000 + flags = 1 + data = length 32, hash F0082E10 + sample 31: + time = 620000 + flags = 1 + data = length 32, hash 6F21FBC4 + sample 32: + time = 640000 + flags = 1 + data = length 32, hash A52D353D + sample 33: + time = 660000 + flags = 1 + data = length 32, hash C1B9C8E2 + sample 34: + time = 680000 + flags = 1 + data = length 32, hash 3BC2F23F + sample 35: + time = 700000 + flags = 1 + data = length 32, hash 7ACFCF02 + sample 36: + time = 720000 + flags = 1 + data = length 32, hash 296A9084 + sample 37: + time = 740000 + flags = 1 + data = length 32, hash 87B5C8E2 + sample 38: + time = 760000 + flags = 1 + data = length 32, hash C1C5851 + sample 39: + time = 780000 + flags = 1 + data = length 32, hash AD17B487 + sample 40: + time = 800000 + flags = 1 + data = length 32, hash E6806069 + sample 41: + time = 820000 + flags = 1 + data = length 32, hash AB5007B5 + sample 42: + time = 840000 + flags = 1 + data = length 32, hash 29DA3044 + sample 43: + time = 860000 + flags = 1 + data = length 32, hash 680DE283 + sample 44: + time = 880000 + flags = 1 + data = length 32, hash E5BB6CEF + sample 45: + time = 900000 + flags = 1 + data = length 32, hash 654EFBD4 + sample 46: + time = 920000 + flags = 1 + data = length 32, hash 3BFBC4E5 + sample 47: + time = 940000 + flags = 1 + data = length 32, hash 10F1217A + sample 48: + time = 960000 + flags = 1 + data = length 32, hash E37EF991 + sample 49: + time = 980000 + flags = 1 + data = length 32, hash 42723B2D + sample 50: + time = 1000000 + flags = 1 + data = length 32, hash 2D52F18B + sample 51: + time = 1020000 + flags = 1 + data = length 32, hash 6F62245B + sample 52: + time = 1040000 + flags = 1 + data = length 32, hash BA89ADED + sample 53: + time = 1060000 + flags = 1 + data = length 32, hash FCF8C5E2 + sample 54: + time = 1080000 + flags = 1 + data = length 32, hash F9AEEE3D + sample 55: + time = 1100000 + flags = 1 + data = length 32, hash 2E465113 + sample 56: + time = 1120000 + flags = 1 + data = length 32, hash 59CF2666 + sample 57: + time = 1140000 + flags = 1 + data = length 32, hash 3AB7A8D9 + sample 58: + time = 1160000 + flags = 1 + data = length 32, hash EB9D3A8E + sample 59: + time = 1180000 + flags = 1 + data = length 32, hash 6539E15F + sample 60: + time = 1200000 + flags = 1 + data = length 32, hash 2CAB1170 + sample 61: + time = 1220000 + flags = 1 + data = length 32, hash D0CA4456 + sample 62: + time = 1240000 + flags = 1 + data = length 32, hash DB3DBEE6 + sample 63: + time = 1260000 + flags = 1 + data = length 32, hash 6D094AC4 + sample 64: + time = 1280000 + flags = 1 + data = length 32, hash 2D6471B + sample 65: + time = 1300000 + flags = 1 + data = length 32, hash 86D257FB + sample 66: + time = 1320000 + flags = 1 + data = length 32, hash D8733063 + sample 67: + time = 1340000 + flags = 1 + data = length 32, hash C975C837 + sample 68: + time = 1360000 + flags = 1 + data = length 32, hash 2D548A68 + sample 69: + time = 1380000 + flags = 1 + data = length 32, hash 7A4907BA + sample 70: + time = 1400000 + flags = 1 + data = length 32, hash 6BDFDEB5 + sample 71: + time = 1420000 + flags = 1 + data = length 32, hash 272D422E + sample 72: + time = 1440000 + flags = 1 + data = length 32, hash BBFDCD7B + sample 73: + time = 1460000 + flags = 1 + data = length 32, hash 81F7CBF2 + sample 74: + time = 1480000 + flags = 1 + data = length 32, hash C18523A + sample 75: + time = 1500000 + flags = 1 + data = length 32, hash E062FDDB + sample 76: + time = 1520000 + flags = 1 + data = length 32, hash A756C4C8 + sample 77: + time = 1540000 + flags = 1 + data = length 32, hash A4FA6865 + sample 78: + time = 1560000 + flags = 1 + data = length 32, hash 6BC22B + sample 79: + time = 1580000 + flags = 1 + data = length 32, hash 37041F06 + sample 80: + time = 1600000 + flags = 1 + data = length 32, hash A9049020 + sample 81: + time = 1620000 + flags = 1 + data = length 32, hash E3C9552A + sample 82: + time = 1640000 + flags = 1 + data = length 32, hash 6EB2559 + sample 83: + time = 1660000 + flags = 1 + data = length 32, hash 988FD295 + sample 84: + time = 1680000 + flags = 1 + data = length 32, hash 6E0FFFA8 + sample 85: + time = 1700000 + flags = 1 + data = length 32, hash 4A16A2E5 + sample 86: + time = 1720000 + flags = 1 + data = length 32, hash 8526E110 + sample 87: + time = 1740000 + flags = 1 + data = length 32, hash 9C0F881C + sample 88: + time = 1760000 + flags = 1 + data = length 32, hash 68DF67F7 + sample 89: + time = 1780000 + flags = 1 + data = length 32, hash A789F088 + sample 90: + time = 1800000 + flags = 1 + data = length 32, hash B9CF3A20 + sample 91: + time = 1820000 + flags = 1 + data = length 32, hash 2AFD3C01 + sample 92: + time = 1840000 + flags = 1 + data = length 32, hash 3F61D3F4 + sample 93: + time = 1860000 + flags = 1 + data = length 32, hash 2D210ECA + sample 94: + time = 1880000 + flags = 1 + data = length 32, hash B8143A84 + sample 95: + time = 1900000 + flags = 1 + data = length 32, hash FE8EBC16 + sample 96: + time = 1920000 + flags = 1 + data = length 32, hash 85A9EE5D + sample 97: + time = 1940000 + flags = 1 + data = length 32, hash 3BDF48D1 + sample 98: + time = 1960000 + flags = 1 + data = length 32, hash 8EBCE992 + sample 99: + time = 1980000 + flags = 1 + data = length 32, hash B22AFFF + sample 100: + time = 2000000 + flags = 1 + data = length 32, hash 5F01BAC9 + sample 101: + time = 2020000 + flags = 1 + data = length 32, hash C6B7BD37 + sample 102: + time = 2040000 + flags = 1 + data = length 32, hash 5102216 + sample 103: + time = 2060000 + flags = 1 + data = length 32, hash 8FE06144 + sample 104: + time = 2080000 + flags = 1 + data = length 32, hash ED90D421 + sample 105: + time = 2100000 + flags = 1 + data = length 32, hash 15971BF0 + sample 106: + time = 2120000 + flags = 1 + data = length 32, hash 1B2D1ADE + sample 107: + time = 2140000 + flags = 1 + data = length 32, hash A8A54AD2 + sample 108: + time = 2160000 + flags = 1 + data = length 32, hash 270646A2 + sample 109: + time = 2180000 + flags = 1 + data = length 32, hash 27DB772F + sample 110: + time = 2200000 + flags = 1 + data = length 32, hash FBD3938 + sample 111: + time = 2220000 + flags = 1 + data = length 32, hash FA27CAFB + sample 112: + time = 2240000 + flags = 1 + data = length 32, hash 828AB2A4 + sample 113: + time = 2260000 + flags = 1 + data = length 32, hash 5788D8F1 + sample 114: + time = 2280000 + flags = 1 + data = length 32, hash B7A5AEB0 + sample 115: + time = 2300000 + flags = 1 + data = length 32, hash 272DC4BC + sample 116: + time = 2320000 + flags = 1 + data = length 32, hash 56C2540E + sample 117: + time = 2340000 + flags = 1 + data = length 32, hash 3236D8C + sample 118: + time = 2360000 + flags = 1 + data = length 32, hash 6C0650B + sample 119: + time = 2380000 + flags = 1 + data = length 32, hash 1EA3E6C3 + sample 120: + time = 2400000 + flags = 1 + data = length 32, hash 6512496C + sample 121: + time = 2420000 + flags = 1 + data = length 32, hash 82CD3C74 + sample 122: + time = 2440000 + flags = 1 + data = length 32, hash 7EDFB3A4 + sample 123: + time = 2460000 + flags = 1 + data = length 32, hash AAFD22AB + sample 124: + time = 2480000 + flags = 1 + data = length 32, hash 8577D9D1 + sample 125: + time = 2500000 + flags = 1 + data = length 32, hash B8A22921 + sample 126: + time = 2520000 + flags = 1 + data = length 32, hash 5E4EFC87 + sample 127: + time = 2540000 + flags = 1 + data = length 32, hash 35A5463F + sample 128: + time = 2560000 + flags = 1 + data = length 32, hash 3EBC0376 + sample 129: + time = 2580000 + flags = 1 + data = length 32, hash F515CB86 + sample 130: + time = 2600000 + flags = 1 + data = length 32, hash B113F72C + sample 131: + time = 2620000 + flags = 1 + data = length 32, hash 420AE0 + sample 132: + time = 2640000 + flags = 1 + data = length 32, hash 86D53F0F + sample 133: + time = 2660000 + flags = 1 + data = length 32, hash 5600867C + sample 134: + time = 2680000 + flags = 1 + data = length 32, hash EB4D89B6 + sample 135: + time = 2700000 + flags = 1 + data = length 32, hash 9BCD0B44 + sample 136: + time = 2720000 + flags = 1 + data = length 32, hash 4629F424 + sample 137: + time = 2740000 + flags = 1 + data = length 32, hash DFAA65F7 + sample 138: + time = 2760000 + flags = 1 + data = length 32, hash 9CF2BD6A + sample 139: + time = 2780000 + flags = 1 + data = length 32, hash 7A36CAB4 + sample 140: + time = 2800000 + flags = 1 + data = length 32, hash 1B9BCD43 + sample 141: + time = 2820000 + flags = 1 + data = length 32, hash 409B739C + sample 142: + time = 2840000 + flags = 1 + data = length 32, hash 126CAB5A + sample 143: + time = 2860000 + flags = 1 + data = length 32, hash 58173930 + sample 144: + time = 2880000 + flags = 1 + data = length 32, hash 32F281F + sample 145: + time = 2900000 + flags = 1 + data = length 32, hash D3F26DE + sample 146: + time = 2920000 + flags = 1 + data = length 32, hash C13BE9A7 + sample 147: + time = 2940000 + flags = 1 + data = length 32, hash 854B6181 + sample 148: + time = 2960000 + flags = 1 + data = length 32, hash 1E217D84 + sample 149: + time = 2980000 + flags = 1 + data = length 32, hash B121F36A + sample 150: + time = 3000000 + flags = 536870913 + data = length 32, hash 67FBC502 +tracksEnded = true