From f6d89c7267a638f77be43ba33754b6d3a1098f37 Mon Sep 17 00:00:00 2001 From: "Yan, Shaobo" Date: Sat, 13 Jan 2024 04:56:28 +0800 Subject: [PATCH] Update video files to improve external_texture* related cts coverage (#3245) * Update video files to improve external_texture* related cts coverage This PR updated video files by referring webgl related cases here: https://github.com/KhronosGroup/WebGL/blob/main/sdk/tests/conformance/textures/misc/video-rotation.html#L112 The PR changes: - README.md with latest cmds to generate test video files. - Rotated video content. - Update video expected pixels values based on new test video files. - Related cts logic changes, including removing magic numbers. Fix:#3232 * fix lint issue and address comments * Update video files, test cases and comments to describe transformation applies order. * reduce video size by encoding less frames --- src/resources/README.md | 72 ++++- .../four-colors-h264-bt601-rotate-180.mp4 | Bin 16261 -> 3113 bytes .../four-colors-h264-bt601-rotate-270.mp4 | Bin 16261 -> 3211 bytes .../four-colors-h264-bt601-rotate-90.mp4 | Bin 16261 -> 3204 bytes src/resources/four-colors-h264-bt601.mp4 | Bin 16261 -> 3174 bytes src/resources/four-colors-theora-bt601.ogv | Bin 44488 -> 8014 bytes src/resources/four-colors-vp8-bt601.webm | Bin 17910 -> 2421 bytes .../four-colors-vp9-bt601-rotate-180.mp4 | Bin 0 -> 2079 bytes .../four-colors-vp9-bt601-rotate-270.mp4 | Bin 0 -> 2016 bytes .../four-colors-vp9-bt601-rotate-90.mp4 | Bin 0 -> 2079 bytes src/resources/four-colors-vp9-bt601.mp4 | Bin 0 -> 2077 bytes src/resources/four-colors-vp9-bt601.webm | Bin 13116 -> 1847 bytes src/resources/four-colors-vp9-bt709.webm | Bin 12584 -> 1789 bytes .../web_platform/copyToTexture/video.spec.ts | 23 +- .../external_texture/video.spec.ts | 81 +++-- src/webgpu/web_platform/util.ts | 302 ++++++++++++------ 16 files changed, 330 insertions(+), 148 deletions(-) create mode 100644 src/resources/four-colors-vp9-bt601-rotate-180.mp4 create mode 100644 src/resources/four-colors-vp9-bt601-rotate-270.mp4 create mode 100644 src/resources/four-colors-vp9-bt601-rotate-90.mp4 create mode 100644 src/resources/four-colors-vp9-bt601.mp4 diff --git a/src/resources/README.md b/src/resources/README.md index 824f82b998f2..daa51765baa0 100644 --- a/src/resources/README.md +++ b/src/resources/README.md @@ -2,14 +2,64 @@ Always use `getResourcePath()` to get the appropriate path to these resources de on the context (WPT, standalone, worker, etc.) -The test video files were generated with the ffmpeg cmds below: -ffmpeg.exe -loop 1 -i .\four-colors.png -c:v libvpx -pix_fmt yuv420p -frames 500 -colorspace smpte170m -color_primaries smpte170m -color_trc smpte170m -color_range tv four-colors-vp8-bt601.webm -ffmpeg.exe -loop 1 -i .\four-colors.png -c:v libtheora -pix_fmt yuv420p -frames 500 -colorspace smpte170m -color_primaries smpte170m -color_trc smpte170m -color_range tv four-colors-theora-bt601.ogv -ffmpeg.exe -loop 1 -i .\four-colors.png -c:v libx264 -pix_fmt yuv420p -frames 500 -colorspace smpte170m -color_primaries smpte170m -color_trc smpte170m -color_range tv four-colors-h264-bt601.mp4 -ffmpeg.exe -loop 1 -i .\four-colors.png -c:v libvpx-vp9 -pix_fmt yuv420p -frames 500 -colorspace smpte170m -color_primaries smpte170m -color_trc smpte170m -color_range tv four-colors-vp9-bt601.webm -ffmpeg.exe -loop 1 -i .\four-colors.png -c:v libvpx-vp9 -pix_fmt yuv420p -frames 500 -colorspace bt709 -color_primaries bt709 -color_trc bt709 -color_range tv -vf scale=out_color_matrix=bt709:out_range=tv four-colors-vp9-bt709.webm - -These rotation test files are copies of four-colors-h264-bt601.mp4 with metadata changes. -ffmpeg.exe -i .\four-colors-h264-bt601.mp4 -c copy -metadata:s:v rotate=90 four-colors-h264-bt601-rotate-90.mp4 -ffmpeg.exe -i .\four-colors-h264-bt601.mp4 -c copy -metadata:s:v rotate=180 four-colors-h264-bt601-rotate-180.mp4 -ffmpeg.exe -i .\four-colors-h264-bt601.mp4 -c copy -metadata:s:v rotate=270 four-colors-h264-bt601-rotate-270.mp4 \ No newline at end of file +The test video files were generated with by ffmpeg cmds below: +``` +// Generate four-colors-vp8-bt601.webm, mimeType: 'video/webm; codecs=vp8' +ffmpeg.exe -loop 1 -i .\four-colors.png -c:v libvpx -pix_fmt yuv420p -frames 50 -colorspace smpte170m -color_primaries smpte170m -color_trc smpte170m -color_range tv four-colors-vp8-bt601.webm + +// Generate four-colors-theora-bt601.ogv, mimeType: 'video/ogg; codecs=theora' +ffmpeg.exe -loop 1 -i .\four-colors.png -c:v libtheora -pix_fmt yuv420p -frames 50 -colorspace smpte170m -color_primaries smpte170m -color_trc smpte170m -color_range tv four-colors-theora-bt601.ogv + +// Generate four-colors-h264-bt601.mp4, mimeType: 'video/mp4; codecs=h264' +ffmpeg.exe -loop 1 -i .\four-colors.png -c:v libx264 -pix_fmt yuv420p -frames 50 -colorspace smpte170m -color_primaries smpte170m -color_trc smpte170m -color_range tv four-colors-h264-bt601.mp4 + +// Generate four-colors-vp9-bt601.webm, mimeType: 'video/webm; codecs=vp9' +ffmpeg.exe -loop 1 -i .\four-colors.png -c:v libvpx-vp9 -pix_fmt yuv420p -frames 50 -colorspace smpte170m -color_primaries smpte170m -color_trc smpte170m -color_range tv four-colors-vp9-bt601.webm + +// Generate four-colors-vp9-bt709.webm, mimeType: 'video/webm; codecs=vp9' +ffmpeg.exe -loop 1 -i .\four-colors.png -c:v libvpx-vp9 -pix_fmt yuv420p -frames 50 -colorspace bt709 -color_primaries bt709 -color_trc bt709 -color_range tv -vf scale=out_color_matrix=bt709:out_range=tv four-colors-vp9-bt709.webm + +// Generate four-colors-vp9-bt601.mp4, mimeType: 'video/mp4; codecs=vp9' +ffmpeg.exe -loop 1 -i .\four-colors.png -c:v libvpx-vp9 -pix_fmt yuv420p -frames 50 -colorspace smpte170m -color_primaries smpte170m -color_trc smpte170m -color_range tv four-colors-vp9-bt601.mp4 +``` + +Generate video files to test rotation behaviour. +Use ffmepg to rotate video content x degrees in cw direction (by using `transpose`) and update transform matrix in metadata through `display_rotation` to x degrees to apply ccw direction rotation. + +H264 rotated video files are generated by ffmpeg cmds below: +``` +// Generate four-colors-h264-bt601-rotate-90.mp4, mimeType: 'video/mp4; codecs=h264' +ffmpeg.exe -loop 1 -i .\four-colors.png -c:v libx264 -pix_fmt yuv420p -frames 50 -colorspace smpte170m -color_primaries smpte170m -color_trc smpte170m -color_range tv -vf transpose=2 temp.mp4 +ffmpeg -display_rotation 270 -i temp.mp4 -c copy four-colors-h264-bt601-rotate-90.mp4 +rm temp.mp4 + +// Generate four-colors-h264-bt601-rotate-180.mp4, mimeType: 'video/mp4; codecs=h264' +ffmpeg.exe -loop 1 -i .\four-colors.png -c:v libx264 -pix_fmt yuv420p -frames 50 -colorspace smpte170m -color_primaries smpte170m -color_trc smpte170m -color_range tv -vf transpose=2,transpose=2 temp.mp4 +ffmpeg -display_rotation 180 -i temp.mp4 -c copy four-colors-h264-bt601-rotate-180.mp4 +rm temp.mp4 + +// Generate four-colors-h264-bt601-rotate-270.mp4, mimeType: 'video/mp4; codecs=h264' +ffmpeg.exe -loop 1 -i .\four-colors.png -c:v libx264 -pix_fmt yuv420p -frames 50 -colorspace smpte170m -color_primaries smpte170m -color_trc smpte170m -color_range tv -vf transpose=1 temp.mp4 +ffmpeg -display_rotation 90 -i temp.mp4 -c copy four-colors-h264-bt601-rotate-270.mp4 +rm temp.mp4 + +``` + +Vp9 rotated video files are generated by ffmpeg cmds below: +``` +// Generate four-colors-h264-bt601-rotate-90.mp4, mimeType: 'video/mp4; codecs=vp9' +ffmpeg.exe -loop 1 -i .\four-colors.png -c:v libvpx-vp9 -pix_fmt yuv420p -frames 50 -colorspace smpte170m -color_primaries smpte170m -color_trc smpte170m -color_range tv -vf transpose=2 temp.mp4 +ffmpeg -display_rotation 270 -i temp.mp4 -c copy four-colors-vp9-bt601-rotate-90.mp4 +rm temp.mp4 + +// Generate four-colors-h264-bt601-rotate-180.mp4, mimeType: 'video/mp4; codecs=vp9' +ffmpeg.exe -loop 1 -i .\four-colors.png -c:v libvpx-vp9 -pix_fmt yuv420p -frames 50 -colorspace smpte170m -color_primaries smpte170m -color_trc smpte170m -color_range tv -vf transpose=2,transpose=2 temp.mp4 +ffmpeg -display_rotation 180 -i temp.mp4 -c copy four-colors-vp9-bt601-rotate-180.mp4 +rm temp.mp4 + +// Generate four-colors-h264-bt601-rotate-270.mp4, mimeType: 'video/mp4; codecs=vp9' +ffmpeg.exe -loop 1 -i .\four-colors.png -c:v libvpx-vp9 -pix_fmt yuv420p -frames 50 -colorspace smpte170m -color_primaries smpte170m -color_trc smpte170m -color_range tv -vf transpose=1 temp.mp4 +ffmpeg -display_rotation 90 -i temp.mp4 -c copy four-colors-vp9-bt601-rotate-270.mp4 +rm temp.mp4 + +``` \ No newline at end of file diff --git a/src/resources/four-colors-h264-bt601-rotate-180.mp4 b/src/resources/four-colors-h264-bt601-rotate-180.mp4 index 1f0e9094a5287a1b59de74269f99b844c0a25578..6665ea900dabeae1e985259504c4fc69b7c0f52a 100644 GIT binary patch delta 1361 zcmZpzUnwy`i-|3AqK-bdp}CPlvSG5NrLp0}G+jpHjZ?yy>h=Hsd#(59G@rHLgnvxa zcbUXK-ght5;%JIp^q!0MTCY_WOP-4Ge!uRTt;FZRF4H8=piPWN3z@%H?{o8+q%x;IAOdegp}EnRb~ zZYcu;1CQe@l^m!4|9UnsFlPbzoR0IHD*FF3Fzy9$80RIHxcz5f(t~i4vp^huAVNrT7C;f`%h%cefP>y~Vp`f#bQEE#)|c2#4S!QnxG^R)c^Lx-?;{Dnhe2 z8H(gWoo7oY<#JE|t?h#sj~rUGYs1`kxI@={^l>`U*ud3tvT3WF08zW1U$B5v`NsKD zoQHx%VW?2|!&}x?*jFbCWi-aDW=!G&`guBw~J^z&W}m11)|A&!ued9kOOfE~Z0ExvH&8Pzmzm zdY3Kr#$?m5Bp1>$u*kI~Ed>xz(Ux$Xge@7W1I&uYtX_y~iWq^oq(~O-MLZVQBnQ7l zvsJHOJ*w88bmLHFT52lRZdy=EGA(G@q4ol{7@5b@Xw1-3kmMX$O{sF1D>m?$Ok2V% zwN)nx&22e0(Oq0_%c5*2I3o^x#odC07^x5QTqo{~$cGytYGGh6l+t430?2S&)e;*x z&4NJ!fq*dtEU6R5ACD&L2MOM+u6qD|BR4*_^}x7UtvC$ zd1l(1r~W?q(VK^do5p{hetYD>`|ShCU;XH{=kBdqcGJqzO%EM8`ta*l_mn>Q&d!?Q zwtZ&#dpGPU*?!H5qBn|KmOjD%e$voegU3E|J2vL_ulw+=7pCvv|2lnn6iA&C9hj}R z?it^*0U>h~GRmTvh3VBfgzmo&r$QOYUAPCK=le-YUg4#1Sw(ap`Mr^7^3lbY_T&h_ zOORb2&8%sgHn%PS@f3lefSU;f1_X$00HFsUMhV1gZB=;?ALLPSEDz#%0R*8UJ2f97 zTN|VzTNi{FY$$*rRAg^0fanZTk#+JQ(ghHdiVZ$QKXj}tl--#}#V!JYIa3iG++6@c zsrZWzK^U0*B#(;Ic@Y0BfFM+4uJ$1a6&W!Ik@d>L`+{4ep8uT-~|ek3nmx-x|6Lhkhf@L>rU96;58}T zk1)AlauLd$y-#Iw@%hNb^yuJk=?-yuZoH`lO<4rMThw){P|3>iqhp_z8STH@(cHWA z)Jww$?I+$pxOVx>)!$q-wky6wcyq^$8^_9S7yN)N^+hpv+mgGcg!g{`lr5zybu1S(p5@a(@VwCXbEnzjpMqlP7WW z3fa`{l&q&wsrQ4d%Pq;VAjHIBUkP`TDCegRA%s1e>A2pgKor*r{Rdy4Bl!*m-43TNzrw05L5Wk$ICwRj6!Q|n~JRfGjTz&>T zo99f9zsz#X^l-lX;&~k$Pn@oFT-k&WJNV`!9(=q@aU}@vFjOyuDEeyfBn3`iY{|0l kVaJ54)yQ$p^;=vM1J=O5&tnh_ir`2ifsZui;UkUz0vy9n&j0`b diff --git a/src/resources/four-colors-h264-bt601-rotate-270.mp4 b/src/resources/four-colors-h264-bt601-rotate-270.mp4 index e0480ceff2f81e094e8a6c002db31d2242cbf918..b1e32bc83a53e0764d7b25d818844cb1328d7741 100644 GIT binary patch delta 622 zcmZpz@0OgP#m}}oHzl!zfq`i~8|(l7t0!72aT}T&DI^;vTUr_$PE6BfG@dx+CzGMU z=03)7#`@E#9W4yj|NlK+{X^tNKuC$tQH_7CTax|Hi%ie?By`w;;c2u$udA&qgWjB5 zXZ0^x{8{$jb9dsb3gwLvf$uv#ZrZ%(t(p6Pb;5^boGeNjriYzY=sad)`>IzEa?ifK zHtWjnZw4>lSQQG*R1v#+{NC&r`=VSI2K}%({@GsO)#>|UzCrnK428d*(zbb_)4QpH z%||RvVW-jznH~E#ERPM@aFON6jmu`|4!yClI9k0^k8 z+q5aq*e3m*CDYTsr@?S@FLNRjXa4_x%Uc*2?ln&4=dgnF8Yb(D%TBgu5fT=1ob|zT zg=5Z4ACCC{|9UnsFlSG$Wz!cIa-3}l6%YUa&%%L$*Mot9b;abfDsoKh7bd?|31VWo zG}%#A3B*%W6;b>Dp8*0Gp)?ZZ0Ahb&U|@8ZJYQ9YkNpAz0}GG`5@qq4d{R}Gi6Le3 z3sn;)=C70G)a;m;w@!{zGf`mp!05mLv=)p(iWxXWQVdcJ1RyJnfYA?Pixig>BZ~v&7#AcX)EaFrSMOt-%xf+o l2hs!9dk3he3Zxkdfa1(eleMikPyT0D#|d4YvF-U(+F%@(em7)CuLG$|E+r4n_ z5r#73*l}j}Wp8)CyZgECe)qe3yWia)gt&y;YiW*YAXJ2K2tFcp%YtDw2neCe6Sk@% zGEB7rX!6FTrDS?w#o?*wd?ssi#U~U zTqwnP$XF7F0(IZJwe4HA4P10ZE0k1J88TW;t5;VOE*IhX`q~H|i2yO_x>j>tT~AL> zxLZ?HQ71)-iZR57WhIj1WQv4x!F^g>m5#%x6t!aP)h2WMz$Rf%Cl0cyl-Db=ou zLL(<9ZPSoqP*vbuTh(>VfmlcjS#gkuop^cv2hU)99Ol( z22Qh}lRzP$4*^T+g#O39iTXi0` z{i~}t*4+R0@E^ACkDi*b_s)vt#rM8^Q`Jj{koZ*k%N3(&NAaUmk3QPEcqGQ7>Q`5p zk7u5q@%ov+Pkro`;o+w7pQPU$dFTQAQ1a)uzw+z*s#e^*x^&CK$BsYp>a{(kzj$kR z&2ZZRv;3VK_m%9t?o`ohMJ>yppST^Ha|buP|HkiT?&AMCb7d4*ofaLK ztGDhO-?j-Ma})?=(ahrX+8ja;+>cYCjN~rfhtO~PNlISjrEp$FbRhZdk!bR7L9D(3A+=# zCZ+okrWZ^vLYedTsZ1|E9le+t9ekGV5Lf2Ln_AGcB>=ol-LM9gtR6o;_Hmif{@kwS z-sNXr7(Q%2`R?KMD`&6$+M2OF@nyp6yJp=qR(9jS=u2L4W8^SNul%VT;hv*Oxil_Fc7a-Zy`C{j9gQe|*g*`R4tHss_(& zk)G*)Y07~czW&E~ch;FUZoaK!-qEQK zt=_n~s&D9yk&-8X+5g$-fu|KPfly`YhtwoSk5M3B*yw>P0R%OA(0S_8j2@H=YV@EG z7c+X0_xeT;nxaMz0&!8J2dzYn9)t_u=s_Va?c+lMFU{ydD^a5d<$@YLa30uAE@t!~ zl|DtI2L(J|FM^ZIC@|;gMZP7A8a*)UOfQ0Fs4UZqb9PoXUrfk?=|#Z)&h&!m1^IHY z@5p(^bMj4P^97qPs3y?EHl`P_(q!`mn=k&4`w=rYzV$(b{(-knaLhGvI8VnWJ)Ebh z$@i%~1TF*+6NmG((gpXaV6pJ`sj=Mnk9VTt4uWujvo?ws*p5tU^SFAiVVd25q#NBy z1;T(Ueixx-910=)ch2P{fLxGnIahMBSP?>Vj=`N4%>7+%hxg9nKtYNI@14xi+#H;< z7P=N7gz)1ec({3`Dy{=zwW>RC0n2kx8{?Kxp6A?SD4GO0oS_u9J%SK4{|7I6^=gxf zZhJ9!;Hy=B9EU6LRjVaZO3_tZX3iCG*(L#z%5K90r7Yv3Xs$x?suj4=<537Jg^}T*vPajBxJ_r7+bLO3qf+k&q$@4Su^`0EVP6S%lBndT4_Dr6**<I{l()t*q=CE>A129A$IW1M?Cm=m*Pqg-eIU-2vPLK;7JOc pzSxpw;lqvzSF4fZnlEj0O$=BA|2~gFFeri}jRZc@Sb&c-{tHmqP0|1W diff --git a/src/resources/four-colors-h264-bt601-rotate-90.mp4 b/src/resources/four-colors-h264-bt601-rotate-90.mp4 index 9a6261056e91dcfc66d4f15d5b6888df90ae8a3a..66a98d0ed021436b44d546ea4859ae744d129914 100644 GIT binary patch delta 611 zcmZpzZ;_m!#m}}SHzl!zfq`i~8|(l7t0!72aT}T&DI^;vTUr_$PE6BfG@dx+CzGMU z=03)7#`+_v9W4yj|NlK+{X^v9`i1Aqmjs%x|B~!~USxXCC!xa*jI2vdR!l0<`{!Rc z@76rF?81G9ekz|>K1b{Eo-N1|lsdP+gVDc8qu_e!s{IXua*PaI!p1C(c@FpQ*{Xkg z{pWr)*UxQ-O=k-yA7h*#m@i#ZCLrb*IPKM?E!js5x11_>6P`Wu!>7O*%VS)cvNB^e zW=>r;ncJdTHm^~uBc9ZzdIr5YRxwfse;Y+$My>S?Js$%DI3FHeeg`o z?->VJJsUUoGAA-|=Kue|}cuAz>lMSsy%CIOfds;fVkL zuV(`TbN1v~Hhpm+$JvHZ@$mouEF2hkJs22RS4=*uBFDsjVe(s*ASRYelO0u+Ks-fN z(aC(O>~jDAGhhG*kjMuH21bX;^HpW|*e@_JumE`=Q5LVsCsk#c7*Zy`P&Hv<{yJGs z&5ntA>*P2!69tA3j1CMyE5R6~m{HUxu`JolK+o7v&(OeV@+LJMX6Hk*CqGmRaFW`< zzyQJw62&DY#URx{0J6de80R3iNO4IqvN%wVaX~Udt8~lKf)1lHw0|IIuHU!sZP+`) zP-YxE&b)Vd`+k4+`@Zk{zWd(yy�RgxhOrj%grNgm4HxB6Z7xVKoQ{q01AtsvXBMS-)`gjmlhYFszv4pC_4n|V%3NqVoN zihR1hnNJHsJ!hz5QcZJCR~%vsIm_vVrtpl}iYSD6Xao<=(9)_B!-xX3h}lxAT@{5! zPEOjUA;qAnz`3@n>zV_xrgW1cyAY8(4Uq>DB&E+xsbWN!F9=*ha@?5ZbZ8c?K>#|f zn3+g8sw>t;I5%lS3kRstO|wHvLL%np37n&AGSK2@@LbCF-XUv-SOEN!XI1I>4-W%<6@>ric-UONwOSUc_T@O>*!{ zG+Xuh)uU?dNjDB`j*&voL?h+#){PAd_evsg;>V^l=S99ZI+fP>>J~H4gJ!Fk@u6)a%D>v(>Di&7% z>gtU(_rE>-hwb~Lr)KQEvtoJiy)WNX_0l0EK9&A*#VFcQ{OHu9kG3uziSelV)m7%> znWtyGe&+8}AG>9ExM}<+={H9ndcZ!E{Q2##{QADC6*sRg-SY6URrFd>%kn4r-%lBOWAMZ$ZpY@_!42=f@w=J3_`l9v83j_OMF-~U zt^3BeZ9>Q#g^aRjW^sCL4xtC`$Ei?8au@GI=(qhOC9m>QxU3>Nko@*YH2K)l%X@MJ z;04Gok7m}j&6r;ofcPbWpnzKm1O^0%9RQ&RAVvwqD{WPI5bxztaUu`mWB~-BB0D`F zB3m1zB3l=P7;GqjAXH?(UjWe=q$2C&L8J>HC>5K0h<@l;Stz?ZkBU760&}J!I=Ht0 zf>QApAA&G2`%xYhXY(NbSpY$($Xx3~5Gpca5F+!9AjH7j0tiAyX0Z=JsJN(H1P7H; zv917u$puU^G9pYan7+WeGt2Y^e2AF7DEy`}xxfn)CKpUD{B*8Ie(wZ;+2pN$?^t$+!H3R6F%CNX-9LiUA?9=H)eP@@OcQBWm;@RQN^@3UO&49}0MBMi1JE8a*f#)aZfBz;1FeqX%j9 zDH=T};Q4Y9R5GJLoF^CgmMm)Yz@#&|2%4d?OfJsZS((0=;02S5fc>4x1(OT%zw=#dRR8R&@t1V0jK&VcZf*^PGDOMU$X}GnB%lcOvxSFMFaeNJo z6nf9u9y6PuR%=K>({e}AHSG}YI1-JX4Xr9KFYgByAb8BV>_?RcL#Q-)V(j4cqo15U zjhk1gJ4huM;Zxyq_F@WY5W&p!A;Tt diff --git a/src/resources/four-colors-h264-bt601.mp4 b/src/resources/four-colors-h264-bt601.mp4 index 81a5ade4354cfb328af4127a5579e87900d2965e..5317bbf7c682c3f67c97c90d7c1833f52f87d948 100644 GIT binary patch delta 323 zcmZpze+x@LvtgAWW!`jOJl={X}XNY8>d9Ea_0a4x4eac;a=lpehw=* zuVJ#jxa?$m79n9F$5|gdS2*U(^x=sA|F35Q19SG|S~h)gA;;Nx zSXWFwt0Kq5eqr)kl^`aTOOqW{l~~v>FfdI1uOc^@S5;*4OjRX5kN^t<10w?vuy{>A zsVd9FkTUs&stFVG*U55fc1+A$C&#IIbDA0G85`;u8W>I9q*m`FWx>Dz!VD6{B_+im zy+8mm!-#=_3B(pDE-6M92g)%nNJgkN+FY*Q$2ghSTtW(@2dwuFP)`*|GZYw2wm08C P`JY`K$Z|t7pydVtPlr=- literal 16261 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 delta 2735 zcmZwH3rtgI6u|MyL#Az^K8A>hAOaJxLMyNOpaWZQrNa&k#7V3{U=A|~n`{IP5@)g* zi4V-8#uy(YCThaev24qtTZk_(s5lsC)Py+{aV)ScEE_XBr{7ubNp@~R&UgFouaDdB z(!J`&1HbTs%F05WpN@`k$A-ta9Q@8;IS_6$;Q16dpXiP2IpB?qOU*P}(#c5@E8mylYDE@c?L@!N&cUPMD7S+gxbiKpqIQF{iuH$9<3LbiQw*vrkp0 z_$*vjz359L&q@#!*QOnx3x1mBUx8(A%*0Fbtl;uY{kL|(8#F&1mP6ksm5^rzUCY}c z`vebH0uTKB2t3xvc=D_mq5N8XaGl_1qEe|%R`RUiOJ(04-zE50Q7dnPxnN?r zgFGuUpm=MC(*z%eT6uiK$)o+d$+I#GN{o4AOz`tiD?b~i>z(I+k!J-z%Es`zM8QX* zRz4Kw^F1jW$g?sBN>#?yCxVYgtvr6 zZT#VD@~q&c7%k7aFZg6gaNz!32(vL|%toG-7$`YcV+?|~qE;R+*o}@32YFUvp=6C+ z?h||(YUSf#Zix>2i99QKDfRb^a|NG?TKU&tIz}@S$+NN;%G0h}!-8LdT6w(SPYi?2 zLyx{9&q^wk zhEsVz3;s>i%Ht27R2LXYo|SYc1v~#v5WEMq@)&kAk@_vVr=!55)c-Ujnv z$w)hSR+dAlca8)Iz8JOgxM5m*u>uxCf@Bfb%A6F#@=Ca`Te-nI}?@2zt z8kY5+da~&KS;4KCXB%BC_zKNCVcB1`=LmULa-nPwD;*O27R}>^{k`>^hde85pzPNj z3l;oU&A$Q5bqG-vCQki{`K1nK26~2OdWHrD;f}pNiDhYUzDs9^!+Zw@5D*Jl zmwj~|Bbd$LbG?zV_-MzhrysXWTJ|)4vI?V9{h#9E1<3~*(of8CUEJ>K=j`v|8syTB zYF=^iwd4cc$q1e4Cl(^Bo&vNz8ECt)A<#8O3OSicWd#*rH61RYL5?Aw{(dg)lMM{4 wK*&hX00tQ3omsY(x|eN!#aPBJCKJ3nd*bf?&5aD(yS_Iver#gg{GpK<04z6K)Bpeg literal 17910 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 diff --git a/src/resources/four-colors-vp9-bt601-rotate-180.mp4 b/src/resources/four-colors-vp9-bt601-rotate-180.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..fc712becd78e3271acb71ff721d76af6da61e1bf GIT binary patch literal 2079 zcmdT_O=uHQ5T5*)7O|SPK_f(n5Q_&}lPbkhs8NyD;_pGlAf=nU4PCn1U3Rxi^`Ov- z=NbeNJ?KHC=tV(2h#IIxiyk8AK@eIHp@`O=yp;N!c}d$Oipiq!%_g!vi z&YOjXD4aNR`>Ja!GEx77^Iv!Uob!*h?{~iScV5597rs9Je2kC2ntkA#K=15B@4gqA zFVj7DnxNyt>s!yif#*%<^kmDxqw!6di5kwo=Qbd~#wUp>&KIxMt$7v+)B_xBzwzPH z=Dph&PA9rp-(`qrZo+Xau<1TP@0H0J$eWJNfG1pH!JsnBk$Ab~&zNd(dcyz4$zq9> zVyKPPs)uq_>Z{tCE8$SCYI?5*r_y|?t$DTTS?xJjnol+LRK73#8qI0C?%Et_Tf?f7bd2F<$5?`Zpcr7lF;WKvTwuiK z^NDBIrWIKgw#JmMnu95I7<}S|ZoeT}1|=wPAZeS0`T7IsMuwnei`kG=@aQhC#|jfPMDPv|>e@R1;U2DuTr;Xh}bMM}pWh^W^c$jKpQODGeXEF`M1 qwRrb%Uros{Xg!vxS;;T>wsBi0z%BUaP9OvdxCCijf>;|aLG(9nIl|BY literal 0 HcmV?d00001 diff --git a/src/resources/four-colors-vp9-bt601-rotate-270.mp4 b/src/resources/four-colors-vp9-bt601-rotate-270.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..a83558f53cd5a45f95d15749093207dfa376629d GIT binary patch literal 2016 zcmdT_PiWI%6n|@_jv;fp9&)JA;S>Zr+Rhb4m_;vhPN$-RB5rAtc45g9k~B_-Fs4i| zf`}l3GOsd4VcTgJCxV_-#s)=%&5H<%6j79BIA1$LUCy_<)Le7iH#>Iv#q7lO*5Qea(6aTlN=e_bqe6JKVcbee>ZXf#K4&r>phCh4x5SBjxE8G=uU_h&j%0_ z^3W1S%_sdk)LnFSv=Dv;c{B2+|D3TGf`&B^QLQ_X6KT=naXq6-Y()_oif0e!)!=oV i#$$;>a(=+KJ+L%#xCQ^6$q6|H9D*bcK_rGl5dH(??XlJX literal 0 HcmV?d00001 diff --git a/src/resources/four-colors-vp9-bt601-rotate-90.mp4 b/src/resources/four-colors-vp9-bt601-rotate-90.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..73a03795ba39bab8797ce3bfc12b992c43a2fed4 GIT binary patch literal 2079 zcmdT_O=uHQ5S}EGYN@5PQFDk8F^UJ1CRK`mg`glc{z9!{DcVhT(=OfZZg#gzEvTg_ zYQaOuNs5PF6vYaH#fxY?2>u}0g9i~0JqQZb5-;@+TxVXkZJHL7Q^83lZ}yvc-$1aZzO=sh+MmfhZkgKr z+_LUB?K@)~etFxS9<7WGJUn;2`ufez*H=bo(=CAs>(7t3L&KMTzG-Xk7=JZ=a;oC$ zx6`$uY*nDXe#CR(-q^(%SKnobW^cd=OmOQMz}ai5kC2CsO@Yh52*IEt%IVm+DVB`INpd{2I;3 zieloAgCv_>Jgx=e`V3Gp2@at5f-HJKxac{$5V@S?#528y#&x5!-RNd#x(WhqHavGZ zvAveH)EOlxhv_f_0s?R7i1-9aH^_y8yKP>^At8TNuO|8Pw&S;M z#3i&J>4rXcAry1hRKvS*B`M_0BRMR)8BJ0WhxZ6)CK|(`9g$EZ+~AkQxT*F9O?8d} zysU{HQ%xLTbe=)C+s*b?CPhJFSY1Mqw4Q|22X6L4ca6&FDji^}CvIqVe``GGMg^~K zu->D|;;@-`?bs45iSC4CZodz)L>`*QsQKjofWCg)M+@Ou)H>AK|6H*b2?c8)p<1`2 z#(Q~#!?jHo*or1>Dx5u>SB+Cu8jpDiiunQGa>r1Ja3lV?6A6(54nY!!Akv6K5dI66 CYp>G) literal 0 HcmV?d00001 diff --git a/src/resources/four-colors-vp9-bt601.mp4 b/src/resources/four-colors-vp9-bt601.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..0d8d4f829caa3039e05f548dd9229249e30dd4a5 GIT binary patch literal 2077 zcmdT_O=uHQ5T2wOHCBlxhky|x)}CxhT8Wh^1Qo2cY86xvf4a%rq)T_Z%kFlmf=VL@ zRS#(|^&m*SiBfuyf_N#~P`r5&L_HMopsmz`P*J1n%uCXyv6!3+PBOfCGxNUrd9%9! z5J;GpG|5mE04LCj+@NT?!T_)~p^GBGs`UyJ%+%rQ`#ZdI8|R^^Cg5)cM>P3*<_$c% z(y@VMhJU@X`?fHEWTa>A{g2tU`Q|a-!01H(!R(i>eeLcSS6gbuWf+uz#XIwLnnp6nhzd1CZpdglJ)sdc?0 zo&opZr1n9*?OJ{BQ~Cx(2k$~VrdRt2;KD#=3UaDrQ&1ILqCuw;&CzJ7=5L=$a9V@^ z#u>*H%lS|lE0qt$DpyyfIhVtsSe4XX2~N5GRGRZj<+IX#F4vz*@+p5`_!!M9s%qh@ zK~}6zeB6tv>Lb9Km*4>UFVd0?s!R6KMbG6VC&u)fy3mEjb7mKhSykkiN5iV*4}_>2B#+Y$+}J^>v;^YB!;ih zMLLapwMFP=vPeG8W<}~wpy0C<4qBXc4a?aAOc%+Ai0supx*W{Oj-Q4ZlTm(Zm`343 z$mgM@h4$b|RE(KZM6v7^6p4u({x-piM?&?D;rei>At*~ROY5z(v;qY9Z5#c3mKHz2 z;e08V%f-*S6Ot%%oj0z^dUssz1sDIJ*`o=DMgj8diCdGAr=e%MUB zb_|9k(VY+#&IeEzx4)O@nPL)+!NjTX|Uk-f;9|8vG(#8s?;h-%%59P44Gfa_UB ut$6luUUfm!Xgn6EPRb4Vjt8bnfLrm?P9OvdI0OkCf^Yu&Qe@RLfVL+CZ8tUqy2eN$Co`$6phCB-z%u>BLf6F|E}=n=A)fwz zF71;I46H!NNY4NYI1Cu%owt>`8gG8jXv{kKgAt3+#NGXy8yU8DeQ#v^*u=QwLnAW) Dfpu4= literal 13116 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 CM~$Qa diff --git a/src/resources/four-colors-vp9-bt709.webm b/src/resources/four-colors-vp9-bt709.webm index 189e422035c7769e74bdbd46c546bc4876d0b0d9..a9e069ee1ca6e26d030f8ff164e5ec4dff9f9805 100644 GIT binary patch delta 252 zcmZ3H^p|&n9uwQyi3YYzY}+U1mpYgk=oy;n85$UbJNEh{mZib@E}b0?^BovKKrCck z_SJQaU^au#^+v|xqaC5V5>LJu2q{fgVRWuDYEJrK--gnwi_D)U1Ow>lbKXjP@!8^V3~emq3hxfm(U=`5Kn(U zm-fj9238)CUCU|%D#NGXy8yU8DeQ#v^*u=QwLnAW) Dp9ENd literal 12584 zcmd6ue@v8h9LJwK4mf@vU=GdATcy%3c48%1Yv&0KOzbJhmnGSmuezT<|)-Vum96Vay)m~n`YHeBh zy0Ugm)6(*F!@z-tneW>;_+FyB)9TV-by+si#ryoTTXr_L-oLZCv~lo6c~`WoZr#e- z%C*&H?Qi&eE3Dtez9Qe$FT+^4>Z2WxUmP`!F8=}3Fv5|_wtzoBo_)h8xobheYQqt1 zD%!TTa{r1OVc+rkr1V9b#vMNzMq_?k>nH6`9`;uZ-@ffo-mc893oEaDHM(r>);U-2 z`)$u(m-k(~JiNH}`pM1v|7=_O!K;tfJT`yHiS2)ET>Q@RQwx`#y-@qZX#aQKd%vl^ zapubn19z8HJapox(#@Ch<}C_-zI}z!^`>bQ8hZ`@;bTV7FkFj!4CAST@mSXp(|SFr zSC1G;-Wj=d#-1q0lw9Qp_aN<#ld~NKq}$|FZkLCg?JA+& zAtmF!T~XTIYsvaqx`s)2vY}+mom@z}gG$D;Om3y!F(qT})r@BdZs*jwVT2H&fO2&PscGK=5OV(Saj+1V;SIL;$T|v8>m5gWU z?xfuVO2*voG18spA!nzR(C&~W>n+oww7Zv{JxsdO4JBjl^g`MlBxk3$((ag&ao_2K zv^#FeddrLg(w*T~GUm=`qTL-z#CQ2f zjJb0PX?KvEozqIYW0tJ9%o(KJadNh&fOLEOO2*utCfeOW&+en$BTB}7=ekLEuFsP7 zmbvw`JFH~Po!d>jhm?$GnLAFp^SnyN+<6tWyP2Gw*GanvELm@vH%7YiJ>=~C651V7 zGUm>Y>h1}ozcd=j@3m>!Aiql@Tu;-o{R9xam7V}vXUf47K#cA*IAfpgWNjd>WZay@ z^msLKOz*!brq{0ziRm%7#Ppb3VtTy8ob)|2!Sr@ZoXs)4-cn-vS+nVTW}4|Sx5V@~ zn`3&rCGMMJdcCE@^q5;>ddw{`J?7?^UO!8Y>GhT=edL{%GD6;$64PUDiRp1C9Mjt^ zao-%%>n$aw$J`RrV{VD*F*nEb`dM;JueVGaCeL!3=`pv&^q5;>`dPE-_wRK2{hMQY zy`{wTm|J3c%q=lJUMC#W>u1R^z1}jDe*d0kddw{`J?55}e%5UI{dOmDZueRE8&x0IM3b4yH* zJCT?kb8}3upC!lidP|AvF*nEbOG1fEj}1tszq!xL?I(cPt@H$t@FM}90H%H>;N~Qz z$9+jmKWjF9&p4*;8N5DKS0fmY5!MOH4m&HqAV4ufkf~H^=mP zONr?*x5V_ATVi_5%`v@xmK@XTEhVPM+!E7cZtin>JvYbnwj1}&F}>bWVtULiF+J`? zVtUNYF}=PMj_LK564PUDiRm$SmcaBln`3&rCGMMJdcCE@^q5;>ddw{`J?7?^UO!8Y z>GhTp(_?Ol=`pv&^f;Sidb=g=n`3&trNs1@TVi_5Eipaj=9peTOOEOFmjBB1FOEhY z_9QYrHjtPe8yKzRXE{cU{9MjRfa~ec%k3wC_$~AVkcjk&PXN>Z_6GMQF+J|fAuv78 z=9u2TKJZHAm|nj=B&NsQ64PUDiRm#n$MpJLz%jkv(p5rUpRN#jeM(G^xh1B@op4NV zx5RyOOs}_;m>zRWOpm!GrpMeI)9Yu+F}>bWVtULiF+JwyKBw1nb4+i$ao-%%>n$aw z$J`Rr<4z=|$J`v#>pS6?UT-NeJ?55}9&<}fkFzDKS0fmY5!MOH7ZmIi|N;;=Vbi*IP%2@qX)nH~bQD noQs=D{T*i`bEcH6gK@LiRtl$-d7-!&vXw`sltmB3%~$^cEg%?b diff --git a/src/webgpu/web_platform/copyToTexture/video.spec.ts b/src/webgpu/web_platform/copyToTexture/video.spec.ts index ef3860633150..f59644008c9e 100644 --- a/src/webgpu/web_platform/copyToTexture/video.spec.ts +++ b/src/webgpu/web_platform/copyToTexture/video.spec.ts @@ -17,6 +17,7 @@ import { kPredefinedColorSpace, kVideoNames, kVideoInfo, + kVideoExpectedColors, } from '../../web_platform/util.js'; const kFormat = 'rgba8unorm'; @@ -93,29 +94,33 @@ It creates HTMLVideoElement with videos under Resource folder. { width, height, depthOrArrayLayers: 1 } ); - const expect = kVideoInfo[videoName].presentColors[dstColorSpace]; + const srcColorSpace = kVideoInfo[videoName].colorSpace; + const presentColors = kVideoExpectedColors[srcColorSpace][dstColorSpace]; + + // visible rect is whole frame, no clipping. + const expect = kVideoInfo[videoName].display; if (srcDoFlipYDuringCopy) { t.expectSinglePixelComparisonsAreOkInTexture({ texture: dstTexture }, [ // Flipped top-left. { coord: { x: width * 0.25, y: height * 0.25 }, - exp: convertToUnorm8(expect.bottomLeftColor), + exp: convertToUnorm8(presentColors[expect.bottomLeftColor]), }, // Flipped top-right. { coord: { x: width * 0.75, y: height * 0.25 }, - exp: convertToUnorm8(expect.bottomRightColor), + exp: convertToUnorm8(presentColors[expect.bottomRightColor]), }, // Flipped bottom-left. { coord: { x: width * 0.25, y: height * 0.75 }, - exp: convertToUnorm8(expect.topLeftColor), + exp: convertToUnorm8(presentColors[expect.topLeftColor]), }, // Flipped bottom-right. { coord: { x: width * 0.75, y: height * 0.75 }, - exp: convertToUnorm8(expect.topRightColor), + exp: convertToUnorm8(presentColors[expect.topRightColor]), }, ]); } else { @@ -123,22 +128,22 @@ It creates HTMLVideoElement with videos under Resource folder. // Top-left. { coord: { x: width * 0.25, y: height * 0.25 }, - exp: convertToUnorm8(expect.topLeftColor), + exp: convertToUnorm8(presentColors[expect.topLeftColor]), }, // Top-right. { coord: { x: width * 0.75, y: height * 0.25 }, - exp: convertToUnorm8(expect.topRightColor), + exp: convertToUnorm8(presentColors[expect.topRightColor]), }, // Bottom-left. { coord: { x: width * 0.25, y: height * 0.75 }, - exp: convertToUnorm8(expect.bottomLeftColor), + exp: convertToUnorm8(presentColors[expect.bottomLeftColor]), }, // Bottom-right. { coord: { x: width * 0.75, y: height * 0.75 }, - exp: convertToUnorm8(expect.bottomRightColor), + exp: convertToUnorm8(presentColors[expect.bottomRightColor]), }, ]); } diff --git a/src/webgpu/web_platform/external_texture/video.spec.ts b/src/webgpu/web_platform/external_texture/video.spec.ts index 5bee668bf2ea..2b5e0bdb40a9 100644 --- a/src/webgpu/web_platform/external_texture/video.spec.ts +++ b/src/webgpu/web_platform/external_texture/video.spec.ts @@ -18,6 +18,7 @@ import { kPredefinedColorSpace, kVideoNames, kVideoInfo, + kVideoExpectedColors, } from '../../web_platform/util.js'; const kHeight = 16; @@ -194,7 +195,11 @@ for several combinations of video format, video color spaces and dst color space passEncoder.end(); t.device.queue.submit([commandEncoder.finish()]); - const expect = kVideoInfo[videoName].presentColors[dstColorSpace]; + const srcColorSpace = kVideoInfo[videoName].colorSpace; + const presentColors = kVideoExpectedColors[srcColorSpace][dstColorSpace]; + + // visible rect is whole frame, no clipping. + const expect = kVideoInfo[videoName].display; // For validation, we sample a few pixels away from the edges to avoid compression // artifacts. @@ -202,22 +207,22 @@ for several combinations of video format, video color spaces and dst color space // Top-left. { coord: { x: kWidth * 0.25, y: kHeight * 0.25 }, - exp: convertToUnorm8(expect.topLeftColor), + exp: convertToUnorm8(presentColors[expect.topLeftColor]), }, // Top-right. { coord: { x: kWidth * 0.75, y: kHeight * 0.25 }, - exp: convertToUnorm8(expect.topRightColor), + exp: convertToUnorm8(presentColors[expect.topRightColor]), }, // Bottom-left. { coord: { x: kWidth * 0.25, y: kHeight * 0.75 }, - exp: convertToUnorm8(expect.bottomLeftColor), + exp: convertToUnorm8(presentColors[expect.bottomLeftColor]), }, // Bottom-right. { coord: { x: kWidth * 0.75, y: kHeight * 0.75 }, - exp: convertToUnorm8(expect.bottomRightColor), + exp: convertToUnorm8(presentColors[expect.bottomRightColor]), }, ]); }); @@ -247,16 +252,22 @@ parameters are present. // All tested videos are derived from an image showing yellow, red, blue or green in each // quadrant. In this test we crop the video to each quadrant and check that desired color // is sampled from each corner of the cropped image. - const srcVideoHeight = 240; - const srcVideoWidth = 320; + // visible rect clip applies on raw decoded frame, which defines based on video frame coded size. + const srcVideoHeight = source.codedHeight; + const srcVideoWidth = source.codedWidth; + + const srcColorSpace = kVideoInfo[videoName].colorSpace; + const presentColors = kVideoExpectedColors[srcColorSpace][dstColorSpace]; - const expect = kVideoInfo[videoName].presentColors[dstColorSpace]; + // The test crops raw decoded videos first and then apply transform. Expectation should + // use coded colors as reference. + const expect = kVideoInfo[videoName].coded; const cropParams = [ // Top left { subRect: { x: 0, y: 0, width: srcVideoWidth / 2, height: srcVideoHeight / 2 }, - color: convertToUnorm8(expect.topLeftColor), + color: convertToUnorm8(presentColors[expect.topLeftColor]), }, // Top right { @@ -266,7 +277,7 @@ parameters are present. width: srcVideoWidth / 2, height: srcVideoHeight / 2, }, - color: convertToUnorm8(expect.topRightColor), + color: convertToUnorm8(presentColors[expect.topRightColor]), }, // Bottom left { @@ -276,7 +287,7 @@ parameters are present. width: srcVideoWidth / 2, height: srcVideoHeight / 2, }, - color: convertToUnorm8(expect.bottomLeftColor), + color: convertToUnorm8(presentColors[expect.bottomLeftColor]), }, // Bottom right { @@ -286,7 +297,7 @@ parameters are present. width: srcVideoWidth / 2, height: srcVideoHeight / 2, }, - color: convertToUnorm8(expect.bottomRightColor), + color: convertToUnorm8(presentColors[expect.bottomRightColor]), }, ]; @@ -381,29 +392,51 @@ compute shader, for several combinations of video format, video color spaces and usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.STORAGE_BINDING, }); + // Use display size of VideoFrame and video size of HTMLVideoElement as frame size. These sizes are presenting size which + // apply transformation in video metadata if any. + const pipeline = t.device.createComputePipeline({ layout: 'auto', compute: { - // Shader loads 4 pixels near each corner, and then store them in a storage texture. + // Shader loads 4 pixels, and then store them in a storage texture. module: t.device.createShaderModule({ code: ` + override frameWidth : i32 = 0; + override frameHeight : i32 = 0; @group(0) @binding(0) var t : texture_external; @group(0) @binding(1) var outImage : texture_storage_2d; @compute @workgroup_size(1) fn main() { - var yellow : vec4 = textureLoad(t, vec2(80, 60)); + let coordTopLeft = vec2(frameWidth / 4, frameHeight / 4); + let coordTopRight = vec2(frameWidth / 4 * 3, frameHeight / 4); + let coordBottomLeft = vec2(frameWidth / 4, frameHeight / 4 * 3); + let coordBottomRight = vec2(frameWidth / 4 * 3, frameHeight / 4 * 3); + var yellow : vec4 = textureLoad(t, coordTopLeft); textureStore(outImage, vec2(0, 0), yellow); - var red : vec4 = textureLoad(t, vec2(240, 60)); + var red : vec4 = textureLoad(t, coordTopRight); textureStore(outImage, vec2(0, 1), red); - var blue : vec4 = textureLoad(t, vec2(80, 180)); + var blue : vec4 = textureLoad(t, coordBottomLeft); textureStore(outImage, vec2(1, 0), blue); - var green : vec4 = textureLoad(t, vec2(240, 180)); + var green : vec4 = textureLoad(t, coordBottomRight); textureStore(outImage, vec2(1, 1), green); return; } `, }), entryPoint: 'main', + + // Use display size of VideoFrame and video size of HTMLVideoElement as frame size. These sizes are presenting size which + // apply transformation in video metadata if any. + constants: { + frameWidth: + sourceType === 'VideoFrame' + ? (source as VideoFrame).displayWidth + : (source as HTMLVideoElement).videoWidth, + frameHeight: + sourceType === 'VideoFrame' + ? (source as VideoFrame).displayHeight + : (source as HTMLVideoElement).videoHeight, + }, }, }); @@ -423,17 +456,21 @@ compute shader, for several combinations of video format, video color spaces and pass.end(); t.device.queue.submit([encoder.finish()]); - const expect = kVideoInfo[videoName].presentColors[dstColorSpace]; + const srcColorSpace = kVideoInfo[videoName].colorSpace; + const presentColors = kVideoExpectedColors[srcColorSpace][dstColorSpace]; + + // visible rect is whole frame, no clipping. + const expect = kVideoInfo[videoName].display; t.expectSinglePixelComparisonsAreOkInTexture({ texture: outputTexture }, [ // Top-left. - { coord: { x: 0, y: 0 }, exp: convertToUnorm8(expect.topLeftColor) }, + { coord: { x: 0, y: 0 }, exp: convertToUnorm8(presentColors[expect.topLeftColor]) }, // Top-right. - { coord: { x: 0, y: 1 }, exp: convertToUnorm8(expect.topRightColor) }, + { coord: { x: 0, y: 1 }, exp: convertToUnorm8(presentColors[expect.topRightColor]) }, // Bottom-left. - { coord: { x: 1, y: 0 }, exp: convertToUnorm8(expect.bottomLeftColor) }, + { coord: { x: 1, y: 0 }, exp: convertToUnorm8(presentColors[expect.bottomLeftColor]) }, // Bottom-right. - { coord: { x: 1, y: 1 }, exp: convertToUnorm8(expect.bottomRightColor) }, + { coord: { x: 1, y: 1 }, exp: convertToUnorm8(presentColors[expect.bottomRightColor]) }, ]); }); }); diff --git a/src/webgpu/web_platform/util.ts b/src/webgpu/web_platform/util.ts index dd2031891cd7..358272a37927 100644 --- a/src/webgpu/web_platform/util.ts +++ b/src/webgpu/web_platform/util.ts @@ -51,7 +51,7 @@ const kBt709PixelValue = { }, } as const; -function videoTable({ +function makeTable
({ table, }: { table: Table; @@ -66,143 +66,233 @@ function videoTable
({ ) as any; } +// Video expected pixel value table. Finding expected pixel value +// with video color space and dst color space. +export const kVideoExpectedColors = makeTable({ + table: { + bt601: { + 'display-p3': { + yellow: srgbToDisplayP3(kBt601PixelValue.srgb.yellow), + red: srgbToDisplayP3(kBt601PixelValue.srgb.red), + blue: srgbToDisplayP3(kBt601PixelValue.srgb.blue), + green: srgbToDisplayP3(kBt601PixelValue.srgb.green), + }, + srgb: { + yellow: kBt601PixelValue.srgb.yellow, + red: kBt601PixelValue.srgb.red, + blue: kBt601PixelValue.srgb.blue, + green: kBt601PixelValue.srgb.green, + }, + }, + bt709: { + 'display-p3': { + yellow: srgbToDisplayP3(kBt709PixelValue.srgb.yellow), + red: srgbToDisplayP3(kBt709PixelValue.srgb.red), + blue: srgbToDisplayP3(kBt709PixelValue.srgb.blue), + green: srgbToDisplayP3(kBt709PixelValue.srgb.green), + }, + srgb: { + yellow: kBt709PixelValue.srgb.yellow, + red: kBt709PixelValue.srgb.red, + blue: kBt709PixelValue.srgb.blue, + green: kBt709PixelValue.srgb.green, + }, + }, + }, +} as const); + // MAINTENANCE_TODO: Add BT.2020 video in table. -export const kVideoInfo = videoTable({ +// Video container and codec defines several transform ops to apply to raw decoded frame to display. +// Our test cases covers 'visible rect' and 'rotation'. +// 'visible rect' is associated with the +// video bitstream and should apply to the raw decoded frames before any transformation. +// 'rotation' is associated with the track or presentation and should transform +// the whole visible rect (e.g. 90-degree rotate makes visible rect of vertical video to horizontal) +// The order to apply these transformations is below: + +// [raw decoded frame] ----visible rect clipping ---->[visible frame] ---rotation ---> present +// ^ ^ +// | | +// coded size display size +// The table holds test videos meta infos, including mimeType to check browser compatibility +// video color space, raw frame content layout and the frame displayed layout. +export const kVideoInfo = makeTable({ table: { 'four-colors-vp8-bt601.webm': { mimeType: 'video/webm; codecs=vp8', - presentColors: { - 'display-p3': { - topLeftColor: srgbToDisplayP3(kBt601PixelValue.srgb.yellow), - topRightColor: srgbToDisplayP3(kBt601PixelValue.srgb.red), - bottomLeftColor: srgbToDisplayP3(kBt601PixelValue.srgb.blue), - bottomRightColor: srgbToDisplayP3(kBt601PixelValue.srgb.green), - }, - srgb: { - topLeftColor: kBt601PixelValue.srgb.yellow, - topRightColor: kBt601PixelValue.srgb.red, - bottomLeftColor: kBt601PixelValue.srgb.blue, - bottomRightColor: kBt601PixelValue.srgb.green, - }, + colorSpace: 'bt601', + coded: { + topLeftColor: 'yellow', + topRightColor: 'red', + bottomLeftColor: 'blue', + bottomRightColor: 'green', + }, + display: { + topLeftColor: 'yellow', + topRightColor: 'red', + bottomLeftColor: 'blue', + bottomRightColor: 'green', }, }, 'four-colors-theora-bt601.ogv': { mimeType: 'video/ogg; codecs=theora', - presentColors: { - 'display-p3': { - topLeftColor: srgbToDisplayP3(kBt601PixelValue.srgb.yellow), - topRightColor: srgbToDisplayP3(kBt601PixelValue.srgb.red), - bottomLeftColor: srgbToDisplayP3(kBt601PixelValue.srgb.blue), - bottomRightColor: srgbToDisplayP3(kBt601PixelValue.srgb.green), - }, - srgb: { - topLeftColor: kBt601PixelValue.srgb.yellow, - topRightColor: kBt601PixelValue.srgb.red, - bottomLeftColor: kBt601PixelValue.srgb.blue, - bottomRightColor: kBt601PixelValue.srgb.green, - }, + colorSpace: 'bt601', + coded: { + topLeftColor: 'yellow', + topRightColor: 'red', + bottomLeftColor: 'blue', + bottomRightColor: 'green', + }, + display: { + topLeftColor: 'yellow', + topRightColor: 'red', + bottomLeftColor: 'blue', + bottomRightColor: 'green', }, }, 'four-colors-h264-bt601.mp4': { mimeType: 'video/mp4; codecs=avc1.4d400c', - presentColors: { - 'display-p3': { - topLeftColor: srgbToDisplayP3(kBt601PixelValue.srgb.yellow), - topRightColor: srgbToDisplayP3(kBt601PixelValue.srgb.red), - bottomLeftColor: srgbToDisplayP3(kBt601PixelValue.srgb.blue), - bottomRightColor: srgbToDisplayP3(kBt601PixelValue.srgb.green), - }, - srgb: { - topLeftColor: kBt601PixelValue.srgb.yellow, - topRightColor: kBt601PixelValue.srgb.red, - bottomLeftColor: kBt601PixelValue.srgb.blue, - bottomRightColor: kBt601PixelValue.srgb.green, - }, + colorSpace: 'bt601', + coded: { + topLeftColor: 'yellow', + topRightColor: 'red', + bottomLeftColor: 'blue', + bottomRightColor: 'green', + }, + display: { + topLeftColor: 'yellow', + topRightColor: 'red', + bottomLeftColor: 'blue', + bottomRightColor: 'green', }, }, 'four-colors-vp9-bt601.webm': { mimeType: 'video/webm; codecs=vp9', - presentColors: { - 'display-p3': { - topLeftColor: srgbToDisplayP3(kBt601PixelValue.srgb.yellow), - topRightColor: srgbToDisplayP3(kBt601PixelValue.srgb.red), - bottomLeftColor: srgbToDisplayP3(kBt601PixelValue.srgb.blue), - bottomRightColor: srgbToDisplayP3(kBt601PixelValue.srgb.green), - }, - srgb: { - topLeftColor: kBt601PixelValue.srgb.yellow, - topRightColor: kBt601PixelValue.srgb.red, - bottomLeftColor: kBt601PixelValue.srgb.blue, - bottomRightColor: kBt601PixelValue.srgb.green, - }, + colorSpace: 'bt601', + coded: { + topLeftColor: 'yellow', + topRightColor: 'red', + bottomLeftColor: 'blue', + bottomRightColor: 'green', + }, + display: { + topLeftColor: 'yellow', + topRightColor: 'red', + bottomLeftColor: 'blue', + bottomRightColor: 'green', }, }, 'four-colors-vp9-bt709.webm': { mimeType: 'video/webm; codecs=vp9', - presentColors: { - 'display-p3': { - topLeftColor: srgbToDisplayP3(kBt709PixelValue.srgb.yellow), - topRightColor: srgbToDisplayP3(kBt709PixelValue.srgb.red), - bottomLeftColor: srgbToDisplayP3(kBt709PixelValue.srgb.blue), - bottomRightColor: srgbToDisplayP3(kBt709PixelValue.srgb.green), - }, - srgb: { - topLeftColor: kBt709PixelValue.srgb.yellow, - topRightColor: kBt709PixelValue.srgb.red, - bottomLeftColor: kBt709PixelValue.srgb.blue, - bottomRightColor: kBt709PixelValue.srgb.green, - }, + colorSpace: 'bt709', + coded: { + topLeftColor: 'yellow', + topRightColor: 'red', + bottomLeftColor: 'blue', + bottomRightColor: 'green', + }, + display: { + topLeftColor: 'yellow', + topRightColor: 'red', + bottomLeftColor: 'blue', + bottomRightColor: 'green', }, }, + // video coded content has been rotate 'four-colors-h264-bt601-rotate-90.mp4': { mimeType: 'video/mp4; codecs=avc1.4d400c', - presentColors: { - 'display-p3': { - topLeftColor: srgbToDisplayP3(kBt601PixelValue.srgb.red), - topRightColor: srgbToDisplayP3(kBt601PixelValue.srgb.green), - bottomLeftColor: srgbToDisplayP3(kBt601PixelValue.srgb.yellow), - bottomRightColor: srgbToDisplayP3(kBt601PixelValue.srgb.blue), - }, - srgb: { - topLeftColor: kBt601PixelValue.srgb.red, - topRightColor: kBt601PixelValue.srgb.green, - bottomLeftColor: kBt601PixelValue.srgb.yellow, - bottomRightColor: kBt601PixelValue.srgb.blue, - }, + colorSpace: 'bt601', + coded: { + topLeftColor: 'red', + topRightColor: 'green', + bottomLeftColor: 'yellow', + bottomRightColor: 'blue', + }, + display: { + topLeftColor: 'yellow', + topRightColor: 'red', + bottomLeftColor: 'blue', + bottomRightColor: 'green', }, }, 'four-colors-h264-bt601-rotate-180.mp4': { mimeType: 'video/mp4; codecs=avc1.4d400c', - presentColors: { - 'display-p3': { - topLeftColor: srgbToDisplayP3(kBt601PixelValue.srgb.green), - topRightColor: srgbToDisplayP3(kBt601PixelValue.srgb.blue), - bottomLeftColor: srgbToDisplayP3(kBt601PixelValue.srgb.red), - bottomRightColor: srgbToDisplayP3(kBt601PixelValue.srgb.yellow), - }, - srgb: { - topLeftColor: kBt601PixelValue.srgb.green, - topRightColor: kBt601PixelValue.srgb.blue, - bottomLeftColor: kBt601PixelValue.srgb.red, - bottomRightColor: kBt601PixelValue.srgb.yellow, - }, + colorSpace: 'bt601', + coded: { + topLeftColor: 'green', + topRightColor: 'blue', + bottomLeftColor: 'red', + bottomRightColor: 'yellow', + }, + display: { + topLeftColor: 'yellow', + topRightColor: 'red', + bottomLeftColor: 'blue', + bottomRightColor: 'green', }, }, 'four-colors-h264-bt601-rotate-270.mp4': { mimeType: 'video/mp4; codecs=avc1.4d400c', - presentColors: { - 'display-p3': { - topLeftColor: srgbToDisplayP3(kBt601PixelValue.srgb.blue), - topRightColor: srgbToDisplayP3(kBt601PixelValue.srgb.yellow), - bottomLeftColor: srgbToDisplayP3(kBt601PixelValue.srgb.green), - bottomRightColor: srgbToDisplayP3(kBt601PixelValue.srgb.red), - }, - srgb: { - topLeftColor: kBt601PixelValue.srgb.blue, - topRightColor: kBt601PixelValue.srgb.yellow, - bottomLeftColor: kBt601PixelValue.srgb.green, - bottomRightColor: kBt601PixelValue.srgb.red, - }, + colorSpace: 'bt601', + coded: { + topLeftColor: 'blue', + topRightColor: 'yellow', + bottomLeftColor: 'green', + bottomRightColor: 'red', + }, + display: { + topLeftColor: 'yellow', + topRightColor: 'red', + bottomLeftColor: 'blue', + bottomRightColor: 'green', + }, + }, + 'four-colors-vp9-bt601-rotate-90.mp4': { + mimeType: 'video/mp4; codecs=vp09.00.10.08', + colorSpace: 'bt601', + coded: { + topLeftColor: 'red', + topRightColor: 'green', + bottomLeftColor: 'yellow', + bottomRightColor: 'blue', + }, + display: { + topLeftColor: 'yellow', + topRightColor: 'red', + bottomLeftColor: 'blue', + bottomRightColor: 'green', + }, + }, + 'four-colors-vp9-bt601-rotate-180.mp4': { + mimeType: 'video/mp4; codecs=vp09.00.10.08', + colorSpace: 'bt601', + coded: { + topLeftColor: 'green', + topRightColor: 'blue', + bottomLeftColor: 'red', + bottomRightColor: 'yellow', + }, + display: { + topLeftColor: 'yellow', + topRightColor: 'red', + bottomLeftColor: 'blue', + bottomRightColor: 'green', + }, + }, + 'four-colors-vp9-bt601-rotate-270.mp4': { + mimeType: 'video/mp4; codecs=vp09.00.10.08', + colorSpace: 'bt601', + coded: { + topLeftColor: 'blue', + topRightColor: 'yellow', + bottomLeftColor: 'green', + bottomRightColor: 'red', + }, + display: { + topLeftColor: 'yellow', + topRightColor: 'red', + bottomLeftColor: 'blue', + bottomRightColor: 'green', }, }, },