From e0857d878c4c1f519f6778c93a7d6887197c9bbc Mon Sep 17 00:00:00 2001 From: taorye Date: Mon, 16 Dec 2024 11:31:08 +0800 Subject: [PATCH 1/3] fix: ensure mjpg and yuyv both exist --- .../SG200X/overlay/etc/init.d/uvc_tool.sh | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/buildroot/board/cvitek/SG200X/overlay/etc/init.d/uvc_tool.sh b/buildroot/board/cvitek/SG200X/overlay/etc/init.d/uvc_tool.sh index 05323df2a..23f415a94 100755 --- a/buildroot/board/cvitek/SG200X/overlay/etc/init.d/uvc_tool.sh +++ b/buildroot/board/cvitek/SG200X/overlay/etc/init.d/uvc_tool.sh @@ -72,17 +72,27 @@ parse_uvc_config() { ' "$input_file") fi + # 确保至少包含 'mjpg' 和 'yuyv' 格式 / Ensure at least one 'mjpg' and 'yuyv' format exists + has_mjpg=$(echo "$parsed_data" | grep -w "mjpg") + has_yuyv=$(echo "$parsed_data" | grep -w "yuyv") + + if [ -z "$has_mjpg" ]; then + echo "Warn: No 'mjpg' config found, adding default 'mjpg 640 360'." 1>&2 + parsed_data="$parsed_data"$'\n'"mjpg 640 360" + fi + + if [ -z "$has_yuyv" ]; then + echo "Warn: No 'yuyv' config found, adding default 'yuyv 640 360'." 1>&2 + parsed_data="$parsed_data"$'\n'"yuyv 640 360" + fi + # 如果没有解析到任何数据,或者文件不可读取,则返回默认值 / If no data is parsed or file is unreadable, return default values if [ -z "$parsed_data" ]; then echo "Warn: No valid config, using default instead." 1>&2 # 输出到标准错误 / Output to stderr - parsed_data=$( - echo "mjpg 640 360" # 默认值 / Default value - echo "yuyv 640 360" # 默认值 / Default value - ) + parsed_data="mjpg 640 360"$'\n'"yuyv 640 360" fi echo "$parsed_data" # 返回解析的数据 / Return the parsed data - } From d687d7c89f3e497d18e20752f29db59e0286d56a Mon Sep 17 00:00:00 2001 From: taorye Date: Mon, 16 Dec 2024 11:32:08 +0800 Subject: [PATCH 2/3] feat: add support for streaming mjpg with 0x80 masked --- .../overlay/etc/init.d/uvc-gadget-server.elf | Bin 22504 -> 22504 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/buildroot/board/cvitek/SG200X/overlay/etc/init.d/uvc-gadget-server.elf b/buildroot/board/cvitek/SG200X/overlay/etc/init.d/uvc-gadget-server.elf index 5316261ebd3dfea488b112b34d3fa68c0853f968..c894e68fb1103610adee6d620b36d9ad25022d57 100755 GIT binary patch delta 3417 zcmaJ^4Nz3q6@KsSE)R*gAP5Kw%2E~)WKsS!792q~u_hRQVw}l@wopx5r)#S-c2Xz1 zWPhFpjX!4;C{!q+f~yJY3Tr`Fj8xDu!{Ss$N4smZ0e{A~w&*UnEIs$_E`($nW-j;M zbHDSQbM8I&yt_lq^iVT>&>D2DfD-<$6`Z+~F`Zep3POU*=pAr4IGx@O-NF0mHLz~R zX1W?q%}~+DV2)HBTE{zzTeb4;u`inXw}$E2&*7AGedynKN8D*5o$Zx2K}d+2Hp0OW zo<0eh(DgB2@($bKjwZys+FM>G-}^+HDSja^oPlSduZNm=hkCzOt{dyr6DijM%Vus< zZ~nbuxZa_Ok}Yp=$#TxQwAs25t(gs#EgyE{cudbqDTh>|lxYSjG9oge?_sIWUmJD{ zV|M2lIGxh!Te~RI%TTUW?i}kVCkQf%;aJMND~$q<{ke&CG9qMYtJurR)ER=A5m95$ zYi$PernO4oZZ(u}FC)yGHops8#m17k&RD^zMs|92MI$t*AO9fJ8rNyh+KmcVNz}-!Zm!*f%RNhwm_QcP)0*uvB{L03dn&ViFZq$=w2Q#GF?R7IBWQ>C4NkjOSh)eP4n zQRl&BXsMx+^MlP4b z{dqOuB>(U3I`l-i?U#`BDAY%#Fln`5joO|o)lYHwE{VOb%5N}DPYm`|8aX^JtS@bb zM1!wFbYmc&z{j&o19*dxyYLh=(GlR89hltwnNQmuH!8Th|A*RaFK^Ftf+Bi{UHtTENu6|mkoYv&^nC!iZgQwAHB75;D#KxpB>W8oEQ5g7>c1!oz`WCzq|7V8h;bHtE$qn8vy$9E2Kb73(?fd|QC+wi_!k&bcjH(~5C18&BnZ8X3 zWOCA)(E*RPkqz>0Ir}ffp9rm^DblcVddlP?WvPdjFY_G=Yv=8KjgTmRGyef%>rvl% zUnm+ac<02z&ApW>0Q^zB`6@IfYBPY)`#ri$8ZXN%x z-+HkPty{6lyG&O03oEuu z@NTMtvD|?@sdHz!cx$cY3i)z+rWFdFTWfovEj604U51;fidYL?Z{eN=hmI2T{kMt(HCl@zz2D?KCXIGAtewg7)D0S@`23xthYdX|;9S-l{co z4?7K;3-zl61O}`A$}fG(C*?%EHSVHc8Wvz>d}s-AeNwKF_~e0z@0^sc_2Ic-#9ttC z^%SEayfv?V5`Nkb4@GzXJ}K|=%fk_Weo}51dChW>h;RLl+~*D#gZP$7xg$WoUWk^P zj|!&Ag%y4SNvLpkQm*jH*@cKdJt?1vD;4q0;7D6YD`1XdJ*|Z8irATXO-8Qd8h+=@ z^dWLId5ut~NMLLYa9NQY8dpDcH4c8UI07QmgL7Wt>lS8Dv(ck33{#h%Y^dy(W!>VkHER~_(BT^ioS2u-ogH@ zz;T)L>qyUL`KYpaYuf12dcPm)gHx&02VlK3tKk;;ntRaewq|t{`23^RGzJ6QPEzVK9XBX6FYK=;d9+2_6}9 zxv@=t9(E;fZSE#KMK=hxOsOvnE;PSDjSHE9^ZI&aiUyY`TkM)t;qnoDk*M(f@G$dm zRC6l^aXXCF-G=}wFw4-UC&3i8z-L(*8~7FsA&G<__C;M1<-|L#x@hEd$i(|!4%Q-k z15AAJ3y{Ew8(?X{vLqfUlUHFn;E#bq4Dd^c$ksq*cGFB(4lVq=cx&}qB^kW2)U+<= zswg@(fu;szG&PE?9>ujt)wssnxz_zGhCeTePj6jNgEWAWPq=`^)AgQo1he#qA=7Sq%UY-G*fR^z-5oBKQR(j{mMn*&>6 rhUtU+kEWS&-aZ(>B&NXC4U2;OA-QsZ*_aj7Ti}hbx4^V=<8kJHbq-=k delta 2993 zcmZWr4^&g<6@Tv~;VFs%7380S2@pgiKqH{5#AB3b*NT7YoStrY4xHMZ<2kssM|ZX! z6Aa0#wG8BTN)?B*RBVP)jhL2B&<+2V$l2@yY>YaW%;i2Me$QGL zqu0_Q0+Y3{QN*s{GELFcx7(M!GZ!|+&SUgusE%FAC?CP4*aF7y248GEBm5KM<0_b1 z5Abm_p+0Ui{>ADpP)5iw!$uW zYTMv?Li`-zjGZgykmQTLVe;RKiLkUEf}!$ z5D6%pv~vvxasWDP88)efPhuhs;7+Vyl!u`tNtM;x9JJEbi8Md{p%r@?i&+EpNpCC8 zU}9E?OxDIak@oH?QgAm7fiGFT#EBMObUWH;EVr^VvF0yGUxC6LfnnTbercOV`(6-K|8FO@ ziFo+=>~2Q?1k&crRh$sqt^vm@b7Zv4Q~DvSNwLrtxRp}PxNbT&r>>_Jo#^cpJk`WG zuFQQv(-*+5KFFllpd{^)qDydV{{y=8C5pcaZlwS_(%+^p!Q=F0Ozi;VWMH#Cbgayn z#1xfYL>4|g;E{n%X0IUre9RG=B4RPVH*vikX3lG;EsksR*3ydGg1hn{q|SH# z*xk!vk7SV}vz#26udzqmwT;0N2ppEcU5kAbYD%^bt*z;HV5>bdA}D#)3bNg$`$3gG zFX=(Yfkwk_(wzd{O7?+iVrSk%`Zjno`;AEDIoZN$0pUH+ldUT%dlnY`8xmdlz7(A| zJtNVTd%~i-1m6EW6fJnl`ky&jYSKPfn=_l~a>J`RD#mmlw&$o=eLq>L5m)?o;q#na z#^r&>IkRKG75J{(SIK4Wn_MC?=ezDhvNnI-ULleFBw1zvwAsGSkPGZI=LBt!aKg{1!;@wYg1M*K~pH-!Zq75K6nA^2xO z_zR@l8`7T->V1g69@4vIfv_Bn_@4jKOLRB|;=c;%JrUORVz%5AG`JdCSQ-p49SyF8 z^tqCrjYa&WkbWYsS%|*~>+^=r5WrPI@1yMp>tw zEAPSgPw@F1F!^bWzXLM!v!?4m4`05$OMe z2pn5A0dyS>2f7*|Qm4{29YkO%*%EnhOVrqTyBCUv>X*GEQAcpQo=Y^-1>R(aExLp$ z8Th5ZlM|q?g=$?YQ+6MY>00Ol$LfV^=|!0WuXUm44DSe@pAqt=6q6_0vh5PE<<`G$;d?WJN^ zd&kaI8_)-i;+F(piEr(RcXSRqIFGsAZpUjy{=7=_5tb9bFLRN5H~hND3`0fs=?#Un z_{I9#D{G8oGFa$1z37@O@y{xn+JVx5vQ$k|6(~bEPgKMHC0U8b(`af?lC*T1%0gL* zGMMJLw`4yZ*EgT0JXtjLGLCCdB2bd&J8b&L^3^+XY3gY{P3@9Kn>1d>@xC-C>qG|e zxj2ue4x$8g4C+^+{0`;2d`IW<-%NJ6mv5mRMXT!~nC>jN_IgfaFt3I}U^Wy)zGVoc M`If=4Y{N0;zdC1$@c;k- From 3e15254fda9dd704bd14f4863ce92ab587d71d9b Mon Sep 17 00:00:00 2001 From: taorye Date: Mon, 16 Dec 2024 18:33:09 +0800 Subject: [PATCH 3/3] feat: add support for auto config formats and set resolution limit --- .../overlay/etc/init.d/uvc-gadget-server.elf | Bin 22504 -> 33456 bytes .../SG200X/overlay/etc/init.d/uvc_tool.sh | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/buildroot/board/cvitek/SG200X/overlay/etc/init.d/uvc-gadget-server.elf b/buildroot/board/cvitek/SG200X/overlay/etc/init.d/uvc-gadget-server.elf index c894e68fb1103610adee6d620b36d9ad25022d57..6e399827968025df424aea12d6c9d596d9a555a8 100755 GIT binary patch literal 33456 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 delta 8511 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 z