From da18ceeb24d2c2f9207f9510cf5d6e16cb19d909 Mon Sep 17 00:00:00 2001 From: Vanilagy <1696106+Vanilagy@users.noreply.github.com> Date: Sat, 29 Aug 2026 20:08:57 +0200 Subject: [PATCH] Add smpte170m vp9 test for CI stability, add missing VP9 color spaces in parser --- src/codec-data.ts | 34 +++++++++++++------------------ test/browser/color-space.test.ts | 18 ++++++++++++---- test/public/vp9-smpte170m.webm | Bin 0 -> 10178 bytes 3 files changed, 28 insertions(+), 24 deletions(-) create mode 100644 test/public/vp9-smpte170m.webm diff --git a/src/codec-data.ts b/src/codec-data.ts index 9afcab2..acb5988 100644 --- a/src/codec-data.ts +++ b/src/codec-data.ts @@ -1726,6 +1726,16 @@ export type Vp9CodecInfo = { matrixCoefficients: number; }; +// The color spaces from section 7.2.2 of the VP9 spec The matrix column is taken from FFmpeg's libavcodec/vp9.c +const VP9_COLOR_SPACE_TABLE = { + 1: { colourPrimaries: 5, transferCharacteristics: 6, matrixCoefficients: 5 }, // CS_BT_601 + 2: { colourPrimaries: 1, transferCharacteristics: 1, matrixCoefficients: 1 }, // CS_BT_709 + 3: { colourPrimaries: 6, transferCharacteristics: 6, matrixCoefficients: 6 }, // CS_SMPTE_170 + 4: { colourPrimaries: 7, transferCharacteristics: 7, matrixCoefficients: 7 }, // CS_SMPTE_240 + 5: { colourPrimaries: 9, transferCharacteristics: 14, matrixCoefficients: 9 }, // CS_BT_2020 + 7: { colourPrimaries: 1, transferCharacteristics: 13, matrixCoefficients: 0 }, // CS_RGB (sRGB) +}; + export const extractVp9CodecInfoFromPacket = ( packet: Uint8Array, ): Vp9CodecInfo | null => { @@ -1834,26 +1844,10 @@ export const extractVp9CodecInfoFromPacket = ( } } - // Map color_space to standard values - const matrixCoefficients = colorSpace === 7 - ? 0 - : colorSpace === 2 - ? 1 - : colorSpace === 1 - ? 6 - : 2; - - const colourPrimaries = colorSpace === 2 - ? 1 - : colorSpace === 1 - ? 6 - : 2; - - const transferCharacteristics = colorSpace === 2 - ? 1 - : colorSpace === 1 - ? 6 - : 2; + const colorSpaceValues = VP9_COLOR_SPACE_TABLE[colorSpace as keyof typeof VP9_COLOR_SPACE_TABLE]; + const colourPrimaries = colorSpaceValues?.colourPrimaries ?? 2; + const transferCharacteristics = colorSpaceValues?.transferCharacteristics ?? 2; + const matrixCoefficients = colorSpaceValues?.matrixCoefficients ?? 2; return { profile, diff --git a/test/browser/color-space.test.ts b/test/browser/color-space.test.ts index 880d4fd..c54046d 100644 --- a/test/browser/color-space.test.ts +++ b/test/browser/color-space.test.ts @@ -36,10 +36,15 @@ test('Color space extraction, HEVC in MP4', async () => { }); test('Color space extraction, VP9 in MP4', async () => { - const source = await encodePackets('vp9', 'vp09.00.10.08'); + const source = await readPackets('/vp9-smpte170m.webm'); const buffer = await remuxWithoutColorSpace(new Mp4OutputFormat(), source); - await expectCompleteColorSpace(new BufferSource(buffer)); + await expectColorSpace(new BufferSource(buffer), { + primaries: 'smpte170m', + transfer: 'smpte170m', + matrix: 'smpte170m', + fullRange: false, + }); }); test('Color space extraction, AV1 in MP4', async () => { @@ -75,10 +80,15 @@ test('Color space extraction, HEVC in Matroska', async () => { }); test('Color space extraction, VP9 in Matroska', async () => { - const source = await encodePackets('vp9', 'vp09.00.10.08'); + const source = await readPackets('/vp9-smpte170m.webm'); const buffer = await remuxWithoutColorSpace(new MkvOutputFormat(), source); - await expectCompleteColorSpace(new BufferSource(buffer)); + await expectColorSpace(new BufferSource(buffer), { + primaries: 'smpte170m', + transfer: 'smpte170m', + matrix: 'smpte170m', + fullRange: false, + }); }); test('Color space extraction, AV1 in Matroska', async () => { diff --git a/test/public/vp9-smpte170m.webm b/test/public/vp9-smpte170m.webm new file mode 100644 index 0000000000000000000000000000000000000000..06c83ef0c617f2f85de9d450bc1bb23f9355a0f5 GIT binary patch literal 10178 zcmcI~^-mpK)9pF9JH?A@DemrW2P^Jc+`VvccXxM6p+M1tySuwn+@1Tp@AD=1et*E7 z%J=e9hO` z%J~%t6ln!tW`dzKe#L9Fg5fmk{)x7Kq6G~6j}#&SE-v||T>+LunUY0el1k#r5|XMC zVgH+ri_3~>SCr}heb;iR>=XNrWY_u<-rYnb=tV#{i__O>X9pLolG|n+g~J2ndu75;MZSM7xLLp(4f?10VzZ z*Pn&r4xQdU;x0%YA?tU-X$NN>-yb)t7M|l2ul(`)-!_SEUzKN%A+&pYo3wA}!_R)) zeXqI9^S*Jz*M68(6Gu<)ZSQTfohu%OHNHX>7anD_uV{^DeCH1v?@HdMrso}HI>#Fi zl|CCef2+z`?{oOK@09gtJ0w@`bC_4$)-Pr|Oo6#BW{z>wf4#ZF?;z#TRZrfiXPo}1 zW-+p&KcAyEm)^;6zl$OoR#5@`dovc|x`@TAcU0XkYN~42I}pe}4R%En_O95G3Z49d zVxs7xMSAsVr2uONd47beozrp6+7{~cp6fT}t<&h$v>TJFA>9-)#MCS4yGl~$tLA2A zU%sa$8$H&KE7{hS(1sSo8gN}t597|S`0~7U8*InGFA=p{T zQln~q7*l^@Pze+ypq@XTyz01nA3WSDOc_~KO0${Ct5*Uluo=?}wdu(cb=*|5wW`y} z72_6IJloX&N_)|B`cwBOOvlBU&bTYSxerO^YX)w3a|JA`qKGy1%3P|Y`mP?%Lr0yP zF81?}lVCF|9CuxVLoW|uN_JHZ{YpNMs;|f{M;J!#dEKtIwCP>fnGV-|lUWZL6J&Rj zX~AbkI3BI6aIIZHLh%6Cb=4QTD@EReGWr>OLkzfaDkp`%&GF6i@nxoHUIi=pkW#f! zTPfK7FeHeCvt=*4C=t}LYA1wrDwuk1mHX7Ga-G_x3^+uditB|g!4Ve*%U_5?9Px3G zq}9$_`}fy_GPbLP%FYa-72i9}&(Z2_S{AIIH3b|B{BziQ zIYQe@^z7#o=veDf7zU`Y=WfF#ds*Gj{tMvII7}FVN2?!$@7+gRVoAbqBa!eV);n)t zFqHI#8)D!NI>$s1QW;s~LsQ7H+HuTO*9I`^MZTn|IdU#65KpQ6DuHinMhONW$qZ zlD>rd1ZvQFYRg)uN~zts5})g^-ywbigx2bvjOUHSh;@= zK{RxwAt|Ms!uUbex7$6VsMj~bWtITE%9PHm^uK*>87RIweOR zpn-{gQISEty3|GClDYU)KtJ#J?jlc1JpMd;%D@}B5!>{ef*73t3rlSSE zQuv6OdEJ16f@Vdv^5anegQDI;SGN|#*%p46E?M2wy2tp70slLFeWt$1@Jg3zRDik6@vi6utl!WKe2Fdo?+e8>e^r zW|Q9L8be+M< z7yT~sb$6G2ap@8thnl0!A-=vsDQ-9diDqoRN)%g{7=i;YS~smT0GPf6p~srG`%f?a zXVOe`ZQgFRvGjan=&N>5q3;K1XVt8&coAL7-`7hItchfA(4b#$fAd+#smO9|gc;LI z44D+in>8*x(t%t6Z&ZHYcva=OKgVslVEZ>ljh7!Muo?o zTElG@YV&E1CJBt`%K61*$RF52{Zvb82V#WxA3la(6?b_9WKk|c%sf1}&h}o2l(6Xl z1z+@XDA4gM#km$z>kdvUy_on})DBL_f9pU3vWf)EgA4P|P}UP0W>@)mKE&50kWxYz z7La!n91=~4((HvQzjKZM)MOy_Yy!{d0^ce~I2RKADT^e70JH5}ML?SaLn(eK}PC-nh5c5Sgns$pq`?0h)b(@svAP;!?`U>f*@+sE!LT8 z!l-*2bM~O$?|>hI5lJURn?YvX7BKU8mDfRow=N;FyhB+c!tW5W4$h)C-AqPHVtq=~ zVrrQ+kR&YUGh8<$%N#dVagE3Fq7r2+u(rAM z6Yj<-mUoD(y4K6UHZx{!O)H6g%;%1ZJC4DF&ygnHB}8|k1TDoyC>@}HocY|w7T
F@A;OY(bGZ-N%}oPG-u|)8+@5|9qMb2eQIFlBq8SyKg`!1FiZCsEAb!CjS_BY|WBNv|-%2_}!D zY^qj$XfE?HoQo8R3Mt>pOH%yWMcx|387@LJ2KcF#FUlh4!(y?|86sdO4f+H4Wr~P< z7BhIf6%Zp-T&$9>RtT@7bZx?~>YqbXe%*X2%w>_YOT4;5pChuEt(&WW^tt7IW#dD{ zRcKdsP#}N#A-fa9>a4I$Rw+ytm8g;?jIdRmpU}{H`?qe4yww7f>DDb>Uuyoqi+-MI z12Nw0dp_hbyiZr$Xxp(`zt$fA`{e)tU&VENO*Z!VRzo{I9Mp=%pAVm%A`qA(yIm5A zc`Y2gwR*CdVm1HC!B9{=HD%XDGScxT?=xK4 z>X-QAaMuk;V3T!}NS}YOS3^E}-tvGp#uMy)#CFh4c*|?8bxg4nL+t z!H5yBL`(M&#sP#c*z2-=>EB8b58Vf)wDt|*g5*HLb8;cH(2$t z7|^9qJ~$*_!^75|QfzuGE@#8Un^pNcK|UdW5PX*Sx>j2M+dKU+ zv70zbh){kQ=i)3N_3P4cI5XIsy?uMOYN6Z2X{H$sH5f%sKO|~F_OIEl;KF{f=B2+s zff%OJ2+u(4CPqj6y_eCbTq3JE!7GU{K&}Mg{2X@)LI9T+Y9-AjT>JU_0QwtUkny4D zMS$3x*>WgzPKi@r#>PHZex;A15f9Q;b0<9jWQ+>eU*8r8AZghw8cd zlmbQA*$`!X*YK4mipm6!->g^%BlPUc*pPs7z8Q9QP70ZJEfPBzCvu?0`^zE(VYp{~ zku=La_;W`4F1DO<@$aBcH50thc#MI|9}bG^&^5**KnVA-Y-SIlDcMhr3}$+`3z2RE zFDww1BD64tCGNEP`|WnCOS6H(f-;8J$8%h1=7%$f=34o0ALsA(@xMlTX?1%-l)n7@ zonG%66%8?&t(ig&+OYFO)JPtpr~g%vfp5@soq0RM?pyS=RoTZh`rNKsw$RXzs>@D1 zxrAs|_)u_A&NL%isL{BoKq~kt0dO^jPA4`5p`imOh^Q_Yr@igJ+Pv={ zk8i~4s7GuJ@QhxTr@gMDB2))vAVnIBj?T=dLVxXa)A#gz)ff`oh6^^+0mOM;LsWCJl^lnX(TXfj6>kP?u@G?phMM3 z87Xns3^x!A z5P1qCd}7@4v0KpIInt?mjIU1tAD7lwFDu%u?pkl@&kGFkU=K|J@%mlLqhKIWk8-6J z*hsRr(MSA~hplLZld)emuauiUJTgXP4gI~0U`w!WL*Pk);RW3HIWpqvHCqZ)Xd779 z=M8Rp7O9`&6TTz!8BYX9x?-bNvZ=%#tm3Zr=D^;c>520(MB!K2YxK->!bVU_hf>g! zYxLT5se5NzJ->HG)b{@JoB9}eG_&E9fwdkLI^ox{^;w1>6 zXl0%RcW2)2RYnM+?bbT#)z0up~J#N7)#=oC9F!DmR=}~RPFlY<6(bC zBdvlPsA3d|qb$fF`>4QFqH|DMX;oZIZcyP8iBEKyx!ozdECJTC`AOJ4wsaqpDSyp~qow5;C+IlSXpAdMBdwf^1*L;gH^+Xj^$ z$J2#pPtRVgYh6E}E4so2hOPPqI-0;#Z8=~R!QC?Tf7uY@I&V;-AIFkV^d zyQNUfbr_P<)$S}C%n|sF2sp<4oe4+Vemz_RrQiZdm1O5l?$%!UN_j}s(87#aCeKn- zTgx(a&kYP$`FBhps8}1tR`pIzh8N$gsSxBak z0tn~2nUG%B@4%_*B$75x)GS`D1*RA_5i3{IsiIW73}JDvtcZ>%7!AKX`VbYQDF-dy zIa)1ekBDL4Mt$h|n*@nlBu6DWAhX8@*V;M@hh%WIss3~$a*XS~Z3tSt-KxGIvt*x= z6b8(Xal3twBMqt^)98{BdR^dKNGl1TSTT`N-$F`v8T!oMQJAuFoh=cKgw@>HB*pM{ zBU-INOKe36Y9WwMf{=S{X?X2%=rIF}X5g`MY3k0_Sw07)a1}3c5PfN=DrH7(*!f-m znWA}x@l&Uo|J6s@x8ZW>96r4fOcTQ3D2^G%=DTsel8%m8pG#F$_0nG~(!*&kcRUfB zr+-n;;T%lO+LhViw#HEfclX3}P z-q{ODynVqv&}0s;;N)IR6Nl;;pvMIudd2&$ndu= zGw%H;7ntO{18slDMRr{@^zO}u$7^)!M z&swhw_)rVsJHx6vZ;~LYzxr!IR4HzsN0AS)lRgf944P#s5}7$h6$ zG|1dfW_jO!^H+#ZGmx0FKboV>r(THsR3Rdffb3T@$OqDxo<&;bu(shPOi{yrW%I-n z%_T_dk%&)F6{hw4Wad%^eR~w#RXwG>=-96>-~Qf-STt7K8!=9bUtEa4{)p*F;650! z+b~kZoDSd^uz_$)LVj^{!ug&AM`AzfvmU5lKqI64D3VaCDdIKlH)+oZFap_A!|}{A@~>yrd|1p4@$Pnaewd*MN0k3?tgQ|5@5ZC(s9 z9pxx7=;wByglK#rUG2TQNTF z)_ka)p>>25oSH&pp+$3#b{U!RELX}ClRJGwT*wky*N(BN^E!JVDB(I?7l936PPzYM z1sju9g}<4?U5r1&bNvdexyAVX`eOLgK>^6FlI`Ox@T}-|a=r)(wGxY}?I{Ekhjfu| zBtwdy2U{SDhZ?DaBn>Gk>?gX3>jZ>cd6wYuMC~pakyF^bEev7EyR4|Bwv)fEW}7`b zeybzjtz7jyuRyI?Qb_#Rvk1fciuRH%q)@=mzW58qDBxTe0n2YdXFrTq=AwrGA%3`ztR4b8%^>prdeq0Ng5E~%( zjZ}#HT4(?1F)@#mek^!*<5~R5w*ycleFp}R1402JiI<|(06@I|;M4wto5UH3ccHAA zi|}jS=5_87wJJzY+9=Zx_VvfWDjC54!icY6*|F132z!95kj{m~XRX&JB=N8Z-^N$u z5EL%*8K3Vl^Se-iGL7CpBVj6N6tfWH7jJn*P8N&wN3zt=U7oN#pdj>Ip^bIy*rU0w z6LU-C%XUAHPVKigwlZPLn9(x7ru}x7{3pStpJ+LOM$(!#GYuHUKOG?~=8_Q6NBM=S8q_yW{hvWB@`nGjg3mYdzJlQ2V(M)nKdSRzq0c z*UAKc5?X8H2a5*~Tf|sXPbAoIWAD}sakHh;L$?3kd5xmwM6*QrYur6=TtEkgA`wr4 zQEpN!Mn4kMkSfo_;&LE{Vk_{??~xk~yxX@sE#_|c^)hGk;Y}I}M$?6(ED7n`T4=fB zyenL#k{C%^0KrM+Ex){?7nS(1u;+{t@BA}x@>A@F7~Z3-$*Z0a)=0Q%>68Yvff!x` zhi(}eCbx$6*FqjP-vz60nOQ;e~H8*v0}i?fVlha2=y62PMR`g4`ftP2F5KRT(Ri!Z_?jzJY}av6Ypum?S}r$5YMAzUT2ZqXtc%U z1OmZHtm6+C_$2RrAX}1dvH(XZA+*`=u))`-CZjO!#qORXouDaPV@UQvK9^>KO@MZ^ zrx;J8X*B_Q;q>r!YE7wwrP)SG8;$pPtGaNR${OHl>q(b z3VZS+D#_UeQ+)mWk^-;vVk0GtQi5SU!MxLgh<0hEhP|tVt`5E))+3T5QlYtZ)5G2j z^zE!osvXsJ9%h2T6tVJAPrkija45PRyr*Y(;9!Sz*g{OsXj}NDk71(hsjNI9X*aP^ z0HyS;Z+4Nc2O)?&Dl-k&*^#?l6dxn@aTzV=8Z_d}|xXQ>q^-axh}fIWE&u6JEl-$MiaX z>#rp{e-wJ25;F49xxg)AxmFI#V*U^-g`c(xp5gI82f1xZ_2NTrorbCc7G`RTIAQzz zrZ*lzecM9}GL501e9Oe2)sZbhvaR3v7S>tfF3#$z#Id=>g~?yGh%f7?ppaD@$|zG? z2WY!Q6p#lZtpuVIo?Ym}zP1a$(}e^NB9(diF!@v%NIj&M!y6}oKa=-5IhPS8em3%2 z%un6BzMSrG%YoG}SvHQ|3FbSp0~Z2oZBYX0$!ql=SdC&eNmrU*7Dmd5klknYZouATQr1##J7ehk{>XAY96GIJ zyQr5F-K7xyxgI{|kIk}90t%+pt<5elGVW1y75CR$NgmcM1IDZcw&T}$7Gn*|$t8c4at)V@g%f`dr zyv`LN>t}qmY14DCDAoM+sJA^E!C@EOMU?pBIw^UZz*TSUFd02}G-vb44u z1i~eG+w3Nx-Ht*}!9O)5L}E^tB6O`B2?Scr$vs~2mdiZ?ezn@#_5t0gEPwON^L{GiUJxe5*1>+T;Vo^L?4dv0Y{buZ z5(+0J>OWdI&gh+}Ij?9k^>ojah-6|TZh$~ft7HTEIv@AIhe)c+dU?FTkjDsiUQw;` zP=zXqBTKcZDEjlKl7?`mKT^k)ksRsIV%}-T3*VY=qg~aQSa?C5Q!f2##~(M)>X#&9 z{H>%GeGsI?i!hLl6&Wd1Q5Gs=tS#ZqbWc2e-w08;Kqxk9w;D-bk*K6zgJ5HQ@ugW?-ii z=m;hX1%eP*1tW!@kY|1i{&GQP(qiBQTEuMEvM^niY_CgKIqhOyuTQo;@QXk^zfleb>~XR29p#tAzbM zANZ&(PSA4Utc5BjZ(u|}#T4L-PjuC)aC*2O%>MmR+eQEYv3sa4K$aTt;|Lt-K!MAG7y!nNc2Apysf~T@<+z3Y=9fKGN&olb zhYA{;OITOzxurYkk&F6opEGOT>0$S;qc@_dl~ z-WQr*S6Ay1OOzUs>ODn)Duer4;J;s6n{#Ynda#Z?&u zpnLH#OJ1zzq%t zMmG9LSkWbb8k7TE7Y};uNp(!~b~P7S%|EJ2f&n4_syb}~0N^;{HUt2E9EUl7n?uwl zH4rL?5kXRbAE521D;*#z>TPMIl2mKiCPJU5&`$v?k4X@H=*++4Z%#Gt6+6o!0`STW zgUVVh+;=z(Okom2ZPb29f&Gj(Y{2&^zoFw|i68WZKg|lpor%LUB2H3! zcvR@5zxXHRT|dXnlB#YF&fl5i{+)q-?sp;=mk0BlbA8_5>{wt*?Ii9m`H~VB`-ipD z$`zlhdRtCWuM{9_plkl71K@EKWO)kIjlwyYY+m{^z@KVhol^(V`t0y~vuzu5%_ z$qbehz0SjGNNseOWUU$cNSDKOK;}hR9y}c&e7z2w$iuYxL3|N&g zyNFPS*yKPFVHWKC!(jSyR}8K@sqT>T932a34Sn9fhoq|kNr+~;?Hg?snsC6q zQMIiwRl0Ttb>NU3qE4EvoZ^R43O7inUQmBvIa{acl-hSmN(x8-u0RD)U5*EX4H>o{9R=xFkj^;%On##+`y2IDE=+$bg1 zHD_IaZwXi6DX6-metliyZ|EkCE$XQsfyBVd?^sIWaFzaNsNF?aK&-zl*p&gMdKAir z3QI;Sb>W(j6L|xWO$C)O_P$I;Q+DJ9Meg5?dT;%*lP`10^4>^+TR2SYmGPA`7_;J> zdK_yvQZKP!DwZu4gHj2YzXYrs(jrb>>n$_*os1`*pF2$6&$Qu+LvXL8AAx4Q{bze* ca_c`^bO~*7zrlb%k^gM#T?GQ0FTv3N2hqrg@c;k- literal 0 HcmV?d00001