From 350b394596ec2da11108696b131fd837dcf8d1b4 Mon Sep 17 00:00:00 2001 From: huangdarwin Date: Mon, 21 Aug 2023 17:32:41 +0100 Subject: [PATCH] Compositor: Add tests for 1, 3, and 5 inputs. With this, Compositor now handles an arbitrary number of inputs! PiperOrigin-RevId: 558813361 --- .../media3/effect/DefaultVideoCompositor.java | 9 +- .../output_0s_1s_0s.png | Bin 0 -> 14779 bytes .../output_1s_1s_0s.png | Bin 0 -> 13981 bytes .../output_2s_1s_2s.png | Bin 0 -> 14705 bytes .../output_grayscale_opaque_1s.png | Bin 0 -> 7042 bytes .../output_grayscale_opaque_2s.png | Bin 0 -> 7684 bytes .../DefaultVideoCompositorPixelTest.java | 106 ++++++++++++++++-- 7 files changed, 100 insertions(+), 15 deletions(-) create mode 100644 libraries/test_data/src/test/assets/media/bitmap/CompositorTestTimestamps/output_0s_1s_0s.png create mode 100644 libraries/test_data/src/test/assets/media/bitmap/CompositorTestTimestamps/output_1s_1s_0s.png create mode 100644 libraries/test_data/src/test/assets/media/bitmap/CompositorTestTimestamps/output_2s_1s_2s.png create mode 100644 libraries/test_data/src/test/assets/media/bitmap/CompositorTestTimestamps/output_grayscale_opaque_1s.png create mode 100644 libraries/test_data/src/test/assets/media/bitmap/CompositorTestTimestamps/output_grayscale_opaque_2s.png diff --git a/libraries/effect/src/main/java/androidx/media3/effect/DefaultVideoCompositor.java b/libraries/effect/src/main/java/androidx/media3/effect/DefaultVideoCompositor.java index 3755c08468..b041abf15a 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/DefaultVideoCompositor.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/DefaultVideoCompositor.java @@ -61,8 +61,6 @@ public final class DefaultVideoCompositor implements VideoCompositor { // * Use a lock to synchronize inputFrameInfos more narrowly, to reduce blocking. // * If the primary stream ends, consider setting the secondary stream as the new primary stream, // so that secondary stream frames aren't dropped. - // * Consider adding info about the timestamps for each input frame used to composite an output - // frame, to aid debugging and testing. private static final String THREAD_NAME = "Effect:DefaultVideoCompositor:GlThread"; private static final String TAG = "DefaultVideoCompositor"; @@ -133,6 +131,9 @@ public final class DefaultVideoCompositor implements VideoCompositor { *

The input source must be able to have at least two {@linkplain #queueInputTexture queued * textures} before one texture is {@linkplain * DefaultVideoFrameProcessor.ReleaseOutputTextureCallback released}. + * + *

When composited, textures are drawn in the reverse order of their registration order, so + * that the first registered source is on the very top. */ @Override public synchronized int registerInputSource() { @@ -269,9 +270,7 @@ public final class DefaultVideoCompositor implements VideoCompositor { ensureGlProgramConfigured(); - // TODO: b/262694346 - - // * Support an arbitrary number of inputs. - // * Allow different input frame dimensions. + // TODO: b/262694346 - Allow different input frame dimensions. InputFrameInfo primaryInputFrame = framesToComposite.get(PRIMARY_INPUT_ID); GlTextureInfo primaryInputTexture = primaryInputFrame.texture; outputTexturePool.ensureConfigured( diff --git a/libraries/test_data/src/test/assets/media/bitmap/CompositorTestTimestamps/output_0s_1s_0s.png b/libraries/test_data/src/test/assets/media/bitmap/CompositorTestTimestamps/output_0s_1s_0s.png new file mode 100644 index 0000000000000000000000000000000000000000..2a3525e510bf7f5ba3d467fcc27f5dea8620662d GIT binary patch literal 14779 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 Vt*QKc*$n^y002ovPDHLkV1m^8TU7u6 literal 0 HcmV?d00001 diff --git a/libraries/test_data/src/test/assets/media/bitmap/CompositorTestTimestamps/output_1s_1s_0s.png b/libraries/test_data/src/test/assets/media/bitmap/CompositorTestTimestamps/output_1s_1s_0s.png new file mode 100644 index 0000000000000000000000000000000000000000..eb6a1284dc96d409bc37083d50830d390ba4a096 GIT binary patch literal 13981 zcmV;OHe$(%P)Px#1am@3R0s$N2z&@+hyVZ}07*naRCt{2y~%SN$)4x;agR0k6(B%>Bv@pTELOeO zZPS`L^o*HgCLMItVg82qXN{Sz(p6?NW@EZcOS9>9x4o)YMY4)JvFE-;WX9sILneS+ zfdr7OVv+d5V38S%ho?uxH-5W|KmF-Xnj75USAbFq$8kPd`-8y%Ddk6N{|28P%-^~L zp9_Q#D{W8f-{*VfWE_64{lCEwf)(G-e4P8?l)wbHj#k-l{zE2}cV%q;&tI>UBL27U@2s#j_-pfjUuk>)?jMKC8wu-CR%&T6&F>o;%6X0v>C|315W zdz4C7Gd(D+KN&lo{)GDSso{peeoqi$Qj9tIKD~aA10h{f=OnCXVZ37zTIm z-lf;;(P-3hU6*{mKp2L+{N)!)r4qMq-=@>+(x}x*rBk?t0>0<-`t|FXcJJN0M>dPa zoXut_m&>Q&7oO+w?%lf!kMq2t(Y@F0UFv+MX-#~uHyWdL5#f|$Wn$bqT?)m*aNK_W znZaOo+%|4)u)e-Vx7)?5*OAhoSS*rECE4HGo3Ynf=H%nqY}8NJP50$X#f=2^JHw#g zr@U6?`Lkzet;px|bUR&M{_+b)M@Kw;`jkv2!}I6QQE^PMRHW1H@binG>Gito?Ceam z_vrB>27^A&pFbxE0}6#A$H&J!fBu|@4<-c>er3VGvL#7S0{Fot+&l+v3^t=QNuwilq|ST$a7PU7kOCMkbSCYin!j znEULEo%i0(&dj%vcA5~&o6%F>C>nD^wUqL z$K1bvpEqxZ63~;!kNM%Re;uAGZkn+}_-zR4P%ad?1xf606Ipt-p-M%(N^t&~CLkK0clZqbQY1^alfK^%~zi`G)U* z`2O_V>+9?M{PXO%B@zi zDV=tkqob8ZJN@qQTS;JI!T$}GfDrKZ&6z5;`{4tIads&)>GUai4Y%)NNCOzEU?;e} zb({VD10Fwqd`eyb`}+sDt~=Mm!SF)v@fOwH7eCA&tJSCnM$#K>lVNK{PWVsFN>|)x7pv{ zACB9Iya4tO4o)S+X`A5w{yqSmPG>?@eE0SZT4{>K5}i)x-1FYp@n`XCNMK@YxhzR( z&Yppr%Ql61H~RRxckkcNY#$8z6H9<#Fbp=1<9NmZU8z(6X6!Qk{^Een-M!sYY2l&^ zeP?T%bS91O_o>xtw1XCYzmHPtf+H70Yt8!F8kI_gN~JQP3SI?^e#0QR{J52hMLf?V zm(86WGh(DyuU=lOpIpbSkjV)G=vzv-!)ptD%PP2RiJ`6 z(1DJL6=&pia#!Dw*#bmSbo#m1?apjJd3%q$<9of~enA-U_1Cj@n?|EStyU+O%h77J zM(c)NJ>S1xWO_1{qS0uwx3`DVY9*2QwQ7~a{e7N1c|xyO<=OM+eD~dV{B=xHTm?=X z17Q&G^~0}cwl^9LYW3R0xH+y%CY|Bg^Jm<QG8} z|87=d8^?G8_Q?ZzT>_I*()ax#d94`FpFii@Z@=R3@CeWME7R_dp7tf!aZhP|hF&cRB{Q1iJ`nh9O1a?YVmW7ea+s?h*9VcNYMHAAek}wD`GW6$B;#Y1tUXqLawyQ;uz0BIzWD z8!r)bH@)u(p(UN9Q7D&_VY!^}8jZoAUiU{tHm+uV*|@?e6beN;oi3?VYUyKg`4a*= zU+251I~tAcI^=VC(&;p*athnFQA%M*Nf?ILBCwBD{Q#g)EYRt8E;VjjTU!W*hJK~g zgcIhw@BYAx7tc>s`cEB;#&*>eESAA_2uv{K99bw@Zn>OJIF5bl3R^{anejG+5ZJaY zto3y_%;oHEt>%aI`ia%|MjE?{1U7mAwblqBX3|w2J$}UD!6EH-`|Oy+=*2YWgm<^^ zaBy_ERCl5Nm}a{{r8<(hk1SZ*wAQ%hFHTuX$Eo3 zKt%*9CK@?hOewLYfg?>E!@!XOLx2_^pVY2OU;>biE6k0JR4S86TC1*yweZA3U^$M= zZ*Hc%blUD69rf`2h#P6_(r7m76pIC3zI@4d-+jmH*RSwAA0Y%!pMJys{yul^Z1dxf zXYov(P6yX@dGX87eD~dV{P@=&fnltf<1BB9KT*BHXcQ)~0wexO%GCY)_v!bC(%VIG zV~cR&%`BBl93CDbI3ub?y-7ZwKO47Kukn0uIBwrO9gf@f9e(`j$J6$Tr6R|bW26w= zy?d9+NR=$)^W?Hw4)*t1zqL-IF`F;Cwzf{Ca(vns;G-J-r2s87UZAK2K8O7Vbs99) zP(rk(vK3AcMnh9|UZyEhV8bm?vJ)h2i4Y&B%U2;V0my95a5grwsd1_6*TM-|rm|Vf zcHM0I@UR;s$BP#~v%bDY5KPu}d;9h+ zfB54cc>eY|FJ8Rh&Ye40mc?=9m|~$oE}Ns(Ze4ipQ{q}7%B2!+5b)u{2cXZ_4S zc|DQ_AKtr%Gz=Q`2G5^AC!fzxc#^04QmGvC^NSawzIbzq?z)fyOz9B&2LDibO;tD0 zrUp3@9OM~sok*VJf{SIE2qEa{0iHPGLvV=j1Z!rI^^Ln&ejC5jTq%)VmcRr8Su9$K zTeosa(=>jw;M0?Vvus-ywze`Y)AYh>%?JHulGqi0@lQYf#8+Q^#rB#}x{N z0#BYiq1kHk%P+GrNE#c6N4f zUCpzfo)O3KmD<_c-{YGnPiQn7_`Xk}SU4pxI2*S++uJl6O)Aw2`Fx%yPoB_fHu>e{ zBylzx4WcOGnrEx5WuQu~I{pQMu>@ox<5Xe%=O5D1YPa1~& zBqHa95JL|$bW1(8DQg1Y9D>qiI*rvGZx6Q}&^4;LqfoUY@@AipaKObgL*w)ZcH703ItBKR! z$1#1(#FCTm;Q1DReyRED_HEXaO}dwqCWrUlun(sM_UFI-Th0k76xpm{Z{H~-_l)J# z#=MokRHvq)6mfDHca zO53~tAO6qf&y8TcaF2A&!VMPKB3B*JF-Op<96-wSN%mi}`_n&N?v;3dIDV%DcFw`V zafP|DnN1r@lGnAM!3$#QUPL%mNg&pmPCufUn(qYxFbqTFHa60Y!64SYAL^ku_lv+F z74h0W##aNjQYAKe*_E`b%4_uR-KTA*XmkfO8XXS8uP9}<$+&x1#;jU;gHIENlx!Bi zCVd!T#oD34-VmP~JKq&x54wZ`JaK6`{_Ohb1VNRJ#T;Q9m>SvCimHI7>f zZ&0Cid_=u*i1~00%p$$OBI67&rc#C zCrh>V0Pp_4!u#r95wAZ0jD>A3BC_f7Gs`@KN(qj`P44{d|8gmN?RgTIuxyNSIg|KU zvmI*<-F{5NkBCL>#>=r)9-tTb{FBkCJMH&)9Zx&)u^f~gEsMkHF|>-Q9KNyOxOV_ zr;aJlk9PlDu~xiC`Y^(r5}`&md$fjN;}PB5Ei?j5=;v?aX3C_hyU^O3X>(c{J5QCo zh?F!#5^I{^}R?OZ~2MRmf7wOebz_vj_UKMS#0Mgm(FC;JWpjZ^#s#f=K}!;6EE7m|}@W8`v4 zchxCEL8Pg40uDRjT=Ftvg>l8;!+A*La;|XQ#d7dxj(`wfdi0EtzJ?@_7Xn*L`bNZF zBxt4!3y&AJg<+Z)S|O&As|7J=jmAK)Bp2xV=!Umx_KL_b0cM2l_A%@}LYsuW47F~7 zSS5e!ZvJYp42v~+`_$WbRu}GUIs6aNVm=)x1fHFux%~&i+ux#%p+#xB;^=g}t9kXW zmRYtt0lCNj2Ft$qIxQkFk85#O+p#d6z7o7RQ1q_P3U2=uMlYc zQO%@FqZee5%0?Lj)^atri_h3Dy~R$p!3>F&BvPv_1@!4caI5eY=D}>7)%5Iq%RmW9 zJ6)o8|6dZ9?{i`w8$W!J^tG&XcC!AsCE5D!f4ZK-SHWstQcYnlaX&VA1;X(3d97 z(l-8A|AIJs=D=BG#6J&<2u&$PnAssyxO49Da|tY&lIFF;CNyZ@CqCFmRVolEL>Q5% zHORIaSYwH+uI~-&b?C|CQ5x5~d_dem)N>2#6cUFsC*XI0OhMld+>#E8q+DMqU{wF*#BW|Hq&aBlS_iB_i@aCR}r$%`DVo z7q9OiViO%E@Ix1`?^4XTFETn;!q-KMY*2m}#QTrVkiRS4oWloFION0idg z4>R-z2|PcE8Kh};HIBJP!alsXvEMBO<UFPWuGX!Q@NXIcR zS7t{kl;@%Ab-0YpYKg&&5{U`d?p0yhwt?eF27}N0)q4Swsi61Z!M&6!m)UyofQskw zm2H#x$N2=LzbT*}Y=BxvltaEQDc-%a3I27NfqsHCGw3kJl^Y<^{Pg^w<7+aO@!OO~ zu6o;a`zg|TpIfWgHfhu5F8REE)$5gFkCjA34qi9S5f4b( z1C$o@2Mz|3NXA%3aB)MwW0cZsi0Uxp<%FCrGU87|3XSxR3FkbhS}UwU6%t7#kW)Qm z_kdu~8$H{aMi^oii{wj1%n$qM{?L}aC@tx{^rVibDBONb_1!-+Errb`uw~Ro9fqi8 z6T0oC?o%N&33u2t$yrJ} z$k+vJeYpuyrXP6&O*~lKM&z|9Sq)^^CFs@XS`;Itr~=8m+obaY?9gP*$I_A zhQZGEHgB81pra!U`3^w`kZ4SVMq9@9^5+LZK)GBdlbQ5vxsJo&oU|u^r2T=7w5A@r z^aBg@FqOzKeX+VYv_dt{pBM84UKHUA zN&4$YB-?Go!SdBhPNX!ESYt?6lhX6dFEtD)7fN7S4?`kWIQ^4rLNA)HQi@37Hk;Uv zjU5IA=JgC0!WdHM=gMME+u#wmCe{@zDT<_s%>Oc6F)~|-ZkO~w{nK&{dmiF1e?dHZ zhMUXb8U`QM{$B)VZ)h#H2qP0Il}@|YlXI^+i_i&@_Aag)6RRXq>>_1^X>>n(&m(|q zC!jZ&v2875vKikcLLw6d2(CAQ@oC#a(1}8NsU*3_k1>yqFq+M!UUM24XbU%0rr(<+ zzZq#uo})hMFhs8)E^8b@Xrw&nXXs%lMXFXO(`jL-tKWpz2@Sac5Cl-Ez~SKpc>!pV zLI{mx1*)7~{e%;jhsKaS9IJ+9w7v-P0!Z5#LVv!5Ic^6#`JY%nwSUJfVJ9w5)So_1 zpYxb0t!YFN&9!yZ!-p_7d--(rit*(jh)L$xX3jP%Yo7Cne>CZ3nN)Sa)jqC}3^V#J zucG`G6K{Sg5W0aQ9o7p?TRLA>vh=3{3AlC=5e5ir7(Q{45&t|4kffbF_=_ueD9fSm zBnb_P)EcQZ;W>e)CkR!{F_74~PtNyXclTVARKFjP&6Q!QD8>wdDYaPGl%`3XNWu!G zFs%hDK7UjVN0TgTEJrh}2XZwiy+k#{8(axOAAvq1ll)-z;?Fon;gg2I5H{9S&dGVC zwTRdpVlq*Uu(SAO6x%MXWadnixPpA(MNW;U*En0DWec zJ0-Ax^L}WMTkAXOmVZt?`#46oJE&HR^O8^!_Qjqa4GaQFxF9u67~tf<){6C~ql%wq z8dB>QwmlD>N>zFGP={`W*Q?n-jiy>{QNM!~Pn*&Z|04j2RF%fV^0nJLuFfC7_l>9Y ztkT?V-P{(Yd^f+r&1-jw=>8q*?}rT;=4w5Sf8SrN>7=L@^>3Mosafp&uV4Ymfk|Bt z<_A^H!&tyoa#N$FA{Vz&tpij%7%DsS4inJMCRw^-=tXhPVTfBQlJj~<&zoCY>^nQb zx1*u?cca5*B(UhBn$3oRC>Al&X;h;zvWYD>;ISGiaYBI75JZ9nb9n;b7BqHZbq}(N zR#fiwGr*!^bju!lB?O&5p(ikG3;7Z1%zfby8nim89x}D@yo)y4Rup~W-Z5dn0~f`k z8y2xxZMcjdM&wH+^r&ppOccK~nKs+c+(bd3BE3v_gl!|&*O9k25cb7k4oVBWfuPqH zbo;~4=aCmc=!@0GLTYpz1Yd?FcL|&qIC$A(mx2ysdWRi?ZiI?%uER%ySonomy=-D> z@m27eWOVU7mB6Tw(rO_Y>U4{OTlJi^GZI)3C>6&_n{tT=QXvq@B*Jyk-7czL2fg6l zoUSyn1fm`c9Ep>m?a78^ujUU zrZuz_hXIBZWNa5>2{+mA5K4eBE>LSOlFGCu&47n?NJBduh6ZyDFB;OmM>CnZpd8c1 zkU+sSagUBrgTdTxNhy&*f21d$9XmH<*Y|@UnQ|{*V$-ycr81;5(CdSLQvYEN1Xvj` zZH-?)rzq8mWTwFLgU`E?j?w|$L5LS?A~|{$Yeg*8FnW2gXqvTHDZE~fX0wUsc?^Pp zd1eG5C5~;APNx~j0m)=?Nr_B@R)7)+OQ4lTg`mdr$WER+r6hxag>8qJW=wLy+bak{ zJkP+kV^XOzK2}Q8_ccTYmW**tiy)5hLj%)@Nm}Z2B`^RfL&7k`vKKtQi;SOBkA^@| z6h6{Q@P05~%925!g4Xn1mrxo=rIBbnV@c}JkhLw`P8VbE)kN2(jrdYZbl>B`Tu6X! zHwcPFl@!aUk@Mg<7?~`(=MUA&XfpiYNP?Tum?L*@loEssgf?RZSwv{`px6DZGk9Zy zD8i3p0@ET9StLz?lrcdR&{LY8AvnuoKDn^5QgqsFD%C2!@6RQ!6KJLA_xlWjfS&3N z(|ywEh!V6SO*D%OM5#rS=&mG*$AdaFq>a?$4 zoB9)mB2q)Ms?Y|uG)XxC2CfP81HyQymkno9IT`9+w@am3#p^8}CZLs~*Xs^*3=M-+ zDtUoADZtJqFmKs-`vwSsnV5Vs+*r|W_laYHZAWA>7LIfNt9(41{03+=k?!JT$_$#l zNlIBslK=n~J4r-ARLN>yT*3tr8^^JWcR`Hi*vW?w=RdB7kQ5Dxxwkh_@bsc?r5uZ> zSw&3Q*yl=MN}=1Get*riQ}ec820|K$Tpp21ksdS=@oZGDVL@t5+wH!NKH~gsp8yPOLt;cRfe7(qz&CJA1Iw^UI|8AG1lBxFZVQ5dW~+toPv*M` zDX~lwH<3U}NgT)Y`+dUTOo-J=)9dzV*-dQQ#A@7ib;CTemYhiuhJ*zfhjfF zj7buU^NJ)IeULuLc(^o7-1iqx!}Yl%(tVtq#o(lB_9BuJQ=ez{ku;YjuO%RXoMn-y zHJ~yKj$O7}0!YgM<+o?1*`1%ZuA$W&_{Bn;G|VMygIxe&S_rd@jxx}%gPMG3Oh=Ph z)2C7S(zw3l1)!DI{YInzdE380Vi^`mQ==nABm%lx-~|E$6GwuyVKVlr*Xz;kc4ySa zL?S_{SRC5841+k1>2Mbo z!g3WTKnq187cnCyEK(I0tk*D_YkZA5Wimo!Khvz?CY0D%Vc<5KJX0|QUEg>a# zw??Exrq8rc!5#Ef+;01;Nkt#)mM~pNZ-9FXgf+bxX=+?zhn`2*rBEnPC=`&! z6l8fJ z=de#cGkifKtTFv*OaD^56M-WJaokpa$ zz%HKGjcY;0vGS@l@0zn3{7w+7m_eurW0Rzvpp;BdbZpW9X!-&Mr*}XQ1Plg)8R;vT zNRUdWF{TXjhGCFSr%5Cx=aAG&GZ+jAP7Se_80)wn682(Hf@Bg>X@}(d zJ3=gAppMC|U0g-td}!9qka<@_3czpVmWs}0j(%UojYfC1Nnqm;2ExrldJD|iX_>AIuhHzqz1|lfeSt#h5HA?e zjzYQv0EulHIF>+a&~n@b9fTp_oKy(gwz2K`&c8+5f-s!0k1YiqDS}=|92ppnCY^RM zE)n1=r9cQxtRNUw-BU{A_amYUTxXv#Vl=T(B-TcxF_VvT&i@pW4A^l(9H~#s+_+M6 z-w8-CeZ4g~Ip9eOZuNRt&tE{Zb=vN{ZYP_O*GR#!!U_Of?xLgyg!~bna@lj za=~(ZKOrS~?-)8&#DeVdr7V5DP8=N{x7!;V`J6bfWa~;G5q1`BCSlNqu*un=NwCxB zAFj3T93Qu%PW#K4KYk1n%W%mhV}dXqNm>Fa4IFcTGB~+Uw4Na^7~U|`2Zyq17$A7xKWdD@r3p-Hs2us8A*C#q($@}fT@C_a*hA7vTwH*#SFd+_M~7dC*YO(A znt5Y%9no4dx5>pYT?=#2C-Mz~F4RW>W>GBATHv~B#^w1%U^Vw{j3zb|Ui_N1`+vj1 z&(|;TXqXngfyw*b-i0a3)02tJO9&WWKaH)Fr2kL<4NH4-jrS+Gl;KnFi zpHq7JSBKWRTdj4v2M0akFT&~gQSqx>SYa9183#KRV^|8MhgB|3Lz7BsvRMbqT1~AM zOG+Fw#xVr)Q%~exorNY8n#ha^6R%jiJywNRjQx+k+W>k&(5f_0BEc{F0dJ3nqXS}{|O`PAoTgl)Pw{kmbkWB!_i^iiy|GbuV=HyZ=Bh$Vx>CA$L)T# zGPsev&ViWuuuwZ&>fT#;hhE~&H5?PeGSG31JMz^VhQzdH4Q=>hRB$|uM883mRntV5N;?}<6 zWgqsdl#<;KA85^a0RQ;MKLYUT^=o?FNr^d?PV?ZauK@V|`|qzj4xb_vLm#vR-qdQ` zEf&d_%QUOiQ}P04mcJHC&Yjar4N)AU z;uzC3$!4=Wc<>O{O-voL#+^HNNhXsBF)U9bgdmYfu(frY&CSU<#SBBD(MV&|mpk+O zauH0+WH{ygdHqMKJKHM5UEELGG{8j?GA?~q6&(4$y1(=;iTitOy{ z%P3wl8(=!6e;6Z&JSZa@6+0|47wTNFzr9CyA4zg#XOq{R0;KJ4zEmY3N{XSjWP z6U(yL+PclFvC<*MVi6&rR;#nOw+Cn}%VK-`4w+1va=A>e=h1Gr#`;oYdwbLu=W1nX zx3{;k9fvrM*+1N+Uayl(CRtls8%ETRy?xL-PH)raP91=9TaLrbWVyU!H zqOe8*l9g(e{+L?VYBjMei`%z1NhBugxW9e-mRv4JrE)fNMHq&>dGnelPo7}gHsx~Z zl)%o~Jijj&A(a|BQtI{kjOuuj^B9jgGfpDv7eQ-1jJTh=$xXw=Tr%i=Z+~xsaCUch zNhXpATTq-Lu($8tk;~;cK02EnIt)Wzzkba(Po7}eHsx~phQKZX1^5g}Oa%eY4iDKb z6j;yasUII-KBx7PkW#X?R-jgU!~gRSed(rg^FVg(Y)q^s2`K`?8441&P~d5xppZc{FoXVgv@M$BIomStg#60h5> z*($h}Wnr4;1Yv2d3B!;$j!%yrM;ym@>%_5- z(jNL8Z{vmSuCR|w<5M82tKvi|$`=YG5(zxtr`PSGt5rbLZqJg%c{mZ>FH=e8(wOtc zux%U5vKR~|2{#A=f*>G~m?hMc8e-Eht>p=99{Phm4$fTCTm=7g+*Ug~^p}JHh=srb zBBgj)so)w08|5;0%@p0BN2}91S1LabhGCFRXURBe-W~mg|Nh_qGoIHZj{7LpM>9a5 z6J@^)euv4fzb$t6_6VbhLOzeODuZ5+p;*XvD4ou22>?RK$89@Z1YaZJ12o*^)SAmJviMPOkt4E!25 zCZ|#<9z1+_;juTxTd#+hp)_Uyt`LNAOut&?_WKw!X|j>sz;F#B5z-F_czusJjtQq` z5;~Fi6HWrxcCfTf+>hxu`n0?@|NQfRLhEouT*0-Zu5sKD*cEVec*xPw5t($FY%WK_ zb;+0(sZ@$&GD)RU(y5)>U6r~3wer#BIpec4-Zeb4QCTd z(dl$1!am|SKDC#nQYoYyMrL<99h%MN%-h&;oYVcTijz4E$B8r=J5Mxc+AV}Q^{n3D z`iOxZUlC zVJc%Bx6yYiny%$Lt%aREkU{L%m*~AdkUd!13`hjx$v2 z;y7k77|irh2tg*3A(2d6OMpy_?0@6!5BhzyQV1z|_wF6Nso1h}$8C;OW{p*n{fP0_ zzk8fWWOOvz1Z`@BIV3A(C?Xj#5QEw4Ju0E9)rho|Mn@VE35XbZ7*~%Q0=p!>{q|d= z5bPfuoEbY$JebWU*=%;ko)v}xj^mKah-2{ycMC_>5y<;q#P2?_`_>i z7P(xG!C)|>O2%8)-qv(FO~9;uEeONmxaH@J+o(?1 zcpsHgNGa!*y)Ku}l9`jqB%LW+rF-KHn1liX5P<**N@#=u3Jns3Jc|(!h|$FBqa4Q= zga)BLzIuQ2Dw@JYLmq}9LP~Dkx<#Q_JYAniBv@Np1BSESkK-gQBcIQcPM?)iyLay% zuIm!V@j@@U15QW`WG4c@$YLu1Nwno6ZuTU#T&>zzu(!ugX0dpkBzBNkMVKKWY2P8cXoDg6A4rtb9{U@Zo!BE3xxu?+}SzS z*48MFU8`cTII+E0EOP7C;#|Tn9tuRvh|m~L*Xe=q1i}-;&;8*xg3-Rel4gG+fsOF= z>C@qdG43f?~_iaab1`D z_wN(O5mFjRDNsstd|a7G75e6zry!~m^DKVz^cw)4{q$_<-&87u1nG1d!!T&ITJ(Coh3cY|l0+ggY-0`FgnMZtx{!i<_wJo$Bgm1o+HSRGV%7Hd z_D;ubXJ=;^-Z82gtCixoQaSZT0@Uht5{aQh;qJYAs5k~8Fh=oim1>o8xr}9+XWJRt z13z~B(+xfjZU}4ybB-77blq42ce~x@&6_uDY;52r5~rTJI0)(YeU6Wh>2_x;Q@nch zitX)fQmG+XD5dbcfNHfubE^7-WtmLRnRyj2pEa5ruzNvbt`LG`GKu3j_`W}!CM^g~ zAL^4@__l46NF;C^hi>v})i*x8pUj1f!iZM8#oObzbN7Gs>J@jkw@Ic_!*nmD==(m^ zN@YfxY}D%rAt;y2=u`@67^pa=+wF32c!=+LL}5s=RKl{X(@A?foeuj42RwT8=#x(Z zzriGK2yBFt1m5wmhts6qsen??^LYLG^@OxmxWEV>$1(5Ty}LwTYNXO*efi7f6O5J8 zNJHQ_%h`8M=6+14)2C7Qa3*~%BW+ES$~4-YHto)wSh)rK97hpv-@ctS%r6M?t=DSQ z>vdY@{9C(HsZgoRuTJ{IXO_hMCE&&ec7l0jmQTJfdT>vU`9#a>3HhZ~= zPQ@rp!8Fa&yvb$o(F&f9kM%|4{fS}8*t^{`8138bl7JdGNad>pZ-Me?OEbG*U zbY3}~RUnhi(Cw|ZxZ@3Oun1o+flbW1DNfh*y4}foP-ELpzyC^a_+GbnCDri+opy&e zuV1sVu|X;oBc=T4F;KsDEvXxP*_b4-Px;5F=zrCwtwe5);^Zq9Z@uxri=~Jey8>|?qRI2yj z!Gn)BE#9kFuX?>+?^l|3?*?BwZjAUhxWNs6xA^}7)BpEaI)3ZZ00000NkvXXu0mjf DkxLk7 literal 0 HcmV?d00001 diff --git a/libraries/test_data/src/test/assets/media/bitmap/CompositorTestTimestamps/output_2s_1s_2s.png b/libraries/test_data/src/test/assets/media/bitmap/CompositorTestTimestamps/output_2s_1s_2s.png new file mode 100644 index 0000000000000000000000000000000000000000..7c0990f0c06c479faf555e4e381ea915a548fb5f GIT binary patch literal 14705 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 literal 0 HcmV?d00001 diff --git a/libraries/test_data/src/test/assets/media/bitmap/CompositorTestTimestamps/output_grayscale_opaque_1s.png b/libraries/test_data/src/test/assets/media/bitmap/CompositorTestTimestamps/output_grayscale_opaque_1s.png new file mode 100644 index 0000000000000000000000000000000000000000..7e8196a62b0ac9de8b01a8297ac6fb20d0f46125 GIT binary patch literal 7042 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 literal 0 HcmV?d00001 diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/DefaultVideoCompositorPixelTest.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/DefaultVideoCompositorPixelTest.java index 45177e5996..05bd10ab6a 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/DefaultVideoCompositorPixelTest.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/DefaultVideoCompositorPixelTest.java @@ -82,6 +82,8 @@ import org.junit.runners.Parameterized; /** Pixel test for {@link DefaultVideoCompositor} compositing 2 input frames into 1 output frame. */ @RunWith(Parameterized.class) public final class DefaultVideoCompositorPixelTest { + // TODO: b/262694346 - Have CompositorTestRunner queueBitmapToInput queue bitmaps at specified + // timestamps instead of frame rates. @Parameterized.Parameters(name = "useSharedExecutor={0}") public static ImmutableList useSharedExecutor() { return ImmutableList.of(true, false); @@ -89,7 +91,7 @@ public final class DefaultVideoCompositorPixelTest { // Golden images were generated on an API 33 emulator. API 26 emulators have a different text // rendering implementation that leads to a larger pixel difference. - public static final float MAXIMUM_AVERAGE_PIXEL_ABSOLUTE_DIFFERENCE_WITH_OVERLAY = + public static final float MAXIMUM_AVERAGE_PIXEL_ABSOLUTE_DIFFERENCE_WITH_TEXT_OVERLAY = (Ascii.toLowerCase(Util.DEVICE).contains("emulator") || Ascii.toLowerCase(Util.DEVICE).contains("generic")) && SDK_INT <= 26 @@ -214,7 +216,7 @@ public final class DefaultVideoCompositorPixelTest { @Test @RequiresNonNull("testId") - public void compositeTwoInputs_withSecondaryAlphaZero_differentTimestamp_matchesExpectedBitmap() + public void compositeTwoInputs_withSecondaryTransparent_differentTimestamp_matchesExpectedBitmap() throws Exception { ImmutableList> inputEffects = ImmutableList.of( @@ -498,17 +500,101 @@ public final class DefaultVideoCompositorPixelTest { assertThat(compositorTestRunner.getCompositedTimestamps()).hasSize(numberOfFramesToQueue); } + @Test + @RequiresNonNull("testId") + public void compositeFiveInputs_withFiveFramesFromEach_matchesExpectedFrameCount() + throws Exception { + compositorTestRunner = + new VideoCompositorTestRunner( + testId, + useSharedExecutor, + /* inputEffectLists= */ ImmutableList.of( + ImmutableList.of(), + ImmutableList.of(), + ImmutableList.of(), + ImmutableList.of(), + ImmutableList.of())); + int numberOfFramesToQueue = 5; + + compositorTestRunner.queueBitmapToAllInputs(/* durationSec= */ numberOfFramesToQueue); + compositorTestRunner.endCompositing(); + + assertThat(compositorTestRunner.getCompositedTimestamps()).hasSize(numberOfFramesToQueue); + } + + @Test + @RequiresNonNull("testId") + public void compositeOneInput_matchesExpectedBitmap() throws Exception { + compositorTestRunner = + new VideoCompositorTestRunner( + testId, + useSharedExecutor, + ImmutableList.of( + ImmutableList.of(RgbFilter.createGrayscaleFilter(), new AlphaScale(100f)))); + + compositorTestRunner.queueBitmapToAllInputs(/* durationSec= */ 3); + compositorTestRunner.endCompositing(); + + ImmutableList primaryTimestamps = + ImmutableList.of(0 * C.MICROS_PER_SECOND, 1 * C.MICROS_PER_SECOND, 2 * C.MICROS_PER_SECOND); + assertThat(compositorTestRunner.inputBitmapReaders.get(0).getOutputTimestamps()) + .containsExactlyElementsIn(primaryTimestamps) + .inOrder(); + compositorTestRunner.saveAndAssertCompositedBitmapsMatchExpected( + ImmutableList.of("grayscale_opaque_0s", "grayscale_opaque_1s", "grayscale_opaque_2s")); + } + + @Test + @RequiresNonNull("testId") + public void compositeThreeInputs_matchesExpectedBitmap() throws Exception { + compositorTestRunner = + new VideoCompositorTestRunner( + testId, + useSharedExecutor, + ImmutableList.of( + ImmutableList.of(RgbFilter.createInvertedFilter(), new AlphaScale(0.4f)), + ImmutableList.of(RgbFilter.createGrayscaleFilter(), new AlphaScale(0.7f)), + ImmutableList.of( + new ScaleAndRotateTransformation.Builder().setRotationDegrees(180).build()))); + + compositorTestRunner.queueBitmapToInput( + /* inputId= */ 0, /* durationSec= */ 3, /* offsetToAddSec= */ 0, /* frameRate= */ 1); + compositorTestRunner.queueBitmapToInput( + /* inputId= */ 1, /* durationSec= */ 1, /* offsetToAddSec= */ 1, /* frameRate= */ 1); + compositorTestRunner.queueBitmapToInput( + /* inputId= */ 2, /* durationSec= */ 3, /* offsetToAddSec= */ 0, /* frameRate= */ 0.5f); + compositorTestRunner.endCompositing(); + + ImmutableList primaryTimestamps = + ImmutableList.of(0 * C.MICROS_PER_SECOND, 1 * C.MICROS_PER_SECOND, 2 * C.MICROS_PER_SECOND); + ImmutableList secondary1Timestamps = ImmutableList.of(1 * C.MICROS_PER_SECOND); + ImmutableList secondary2Timestamps = + ImmutableList.of(0 * C.MICROS_PER_SECOND, 2 * C.MICROS_PER_SECOND); + assertThat(compositorTestRunner.inputBitmapReaders.get(0).getOutputTimestamps()) + .containsExactlyElementsIn(primaryTimestamps) + .inOrder(); + assertThat(compositorTestRunner.inputBitmapReaders.get(1).getOutputTimestamps()) + .containsExactlyElementsIn(secondary1Timestamps) + .inOrder(); + assertThat(compositorTestRunner.inputBitmapReaders.get(2).getOutputTimestamps()) + .containsExactlyElementsIn(secondary2Timestamps) + .inOrder(); + assertThat(compositorTestRunner.getCompositedTimestamps()) + .containsExactlyElementsIn(primaryTimestamps) + .inOrder(); + compositorTestRunner.saveAndAssertCompositedBitmapsMatchExpected( + ImmutableList.of("0s_1s_0s", "1s_1s_0s", "2s_1s_2s")); + } + /** * A test runner for {@link DefaultVideoCompositor} tests. * *

Composites input bitmaps from two input sources. */ private static final class VideoCompositorTestRunner { - // Compositor tests rely on 2 VideoFrameProcessor instances, plus the compositor. - private static final int COMPOSITOR_TIMEOUT_MS = 2 * VIDEO_FRAME_PROCESSING_WAIT_MS; - private static final int COMPOSITOR_INPUT_SIZE = 2; public final List inputBitmapReaders; + private final int timeoutMs; private final LinkedHashMap outputTimestampsToBitmaps; private final List inputVideoFrameProcessorTestRunners; private final VideoCompositor videoCompositor; @@ -534,6 +620,7 @@ public final class DefaultVideoCompositorPixelTest { ImmutableList> inputEffectLists) throws GlUtil.GlException, VideoFrameProcessingException { this.testId = testId; + timeoutMs = inputEffectLists.size() * VIDEO_FRAME_PROCESSING_WAIT_MS; sharedExecutorService = useSharedExecutor ? Util.newSingleThreadExecutor("Effect:Shared:GlThread") : null; EGLContext sharedEglContext = AndroidTestUtil.createOpenGlObjects(); @@ -578,7 +665,6 @@ public final class DefaultVideoCompositorPixelTest { /* textureOutputCapacity= */ 1); inputBitmapReaders = new ArrayList<>(); inputVideoFrameProcessorTestRunners = new ArrayList<>(); - assertThat(inputEffectLists).hasSize(COMPOSITOR_INPUT_SIZE); for (int i = 0; i < inputEffectLists.size(); i++) { TextureBitmapReader textureBitmapReader = new TextureBitmapReader(); inputBitmapReaders.add(textureBitmapReader); @@ -629,11 +715,11 @@ public final class DefaultVideoCompositorPixelTest { inputVideoFrameProcessorTestRunners.get(i).signalEndOfInput(); } for (int i = 0; i < inputVideoFrameProcessorTestRunners.size(); i++) { - inputVideoFrameProcessorTestRunners.get(i).awaitFrameProcessingEnd(COMPOSITOR_TIMEOUT_MS); + inputVideoFrameProcessorTestRunners.get(i).awaitFrameProcessingEnd(timeoutMs); } @Nullable Exception endCompositingException = null; try { - if (!compositorEnded.await(COMPOSITOR_TIMEOUT_MS, MILLISECONDS)) { + if (!compositorEnded.await(timeoutMs, MILLISECONDS)) { endCompositingException = new IllegalStateException("Compositing timed out."); } } catch (InterruptedException e) { @@ -685,7 +771,7 @@ public final class DefaultVideoCompositorPixelTest { if (sharedExecutorService != null) { try { sharedExecutorService.shutdown(); - if (!sharedExecutorService.awaitTermination(COMPOSITOR_TIMEOUT_MS, MILLISECONDS)) { + if (!sharedExecutorService.awaitTermination(timeoutMs, MILLISECONDS)) { throw new IllegalStateException("Missed shutdown timeout."); } } catch (InterruptedException unexpected) { @@ -806,6 +892,6 @@ public final class DefaultVideoCompositorPixelTest { readBitmapUnpremultipliedAlpha(expectedBitmapAssetPath), actualBitmap, testId); assertWithMessage("Pixel difference for bitmapLabel = " + actualBitmapLabel) .that(averagePixelAbsoluteDifference) - .isAtMost(MAXIMUM_AVERAGE_PIXEL_ABSOLUTE_DIFFERENCE_WITH_OVERLAY); + .isAtMost(MAXIMUM_AVERAGE_PIXEL_ABSOLUTE_DIFFERENCE_WITH_TEXT_OVERLAY); } }