From 24b29705a7f959b2bd335834ec5e3b0d3a75f14d Mon Sep 17 00:00:00 2001 From: sebastian Date: Wed, 5 Aug 2026 11:32:43 -0300 Subject: [PATCH] Se eliminan efectos con shaders para dejar el ejemplo unicamente de demostracion de interoperabilidad en cuda --- .../index/glwidget.cpp.C8B78D3731FA9869.idx | Bin 0 -> 6888 bytes .../index/glwidget.h.1FDF732EFCED4BD8.idx | Bin 0 -> 2336 bytes .../index/main.cpp.1EFC64217C8EEBC3.idx | Bin 0 -> 760 bytes .../index/mainwindow.cpp.106F8539DEEA62A2.idx | Bin 0 -> 10702 bytes .../index/mainwindow.h.1CF791588B2BEEF8.idx | Bin 0 -> 3510 bytes .../videodecoder.cpp.B5F31E0C60CEA00D.idx | Bin 0 -> 7288 bytes .../index/videodecoder.h.D0CE50575247D653.idx | Bin 0 -> 3596 bytes CMakeLists.txt | 8 +- README.md | 14 +- glwidget.cpp | 49 +---- glwidget.h | 18 +- mainwindow.cpp | 184 +----------------- mainwindow.h | 24 +-- shader.frag | 73 +------ 14 files changed, 31 insertions(+), 339 deletions(-) create mode 100644 .cache/clangd/index/glwidget.cpp.C8B78D3731FA9869.idx create mode 100644 .cache/clangd/index/glwidget.h.1FDF732EFCED4BD8.idx create mode 100644 .cache/clangd/index/main.cpp.1EFC64217C8EEBC3.idx create mode 100644 .cache/clangd/index/mainwindow.cpp.106F8539DEEA62A2.idx create mode 100644 .cache/clangd/index/mainwindow.h.1CF791588B2BEEF8.idx create mode 100644 .cache/clangd/index/videodecoder.cpp.B5F31E0C60CEA00D.idx create mode 100644 .cache/clangd/index/videodecoder.h.D0CE50575247D653.idx diff --git a/.cache/clangd/index/glwidget.cpp.C8B78D3731FA9869.idx b/.cache/clangd/index/glwidget.cpp.C8B78D3731FA9869.idx new file mode 100644 index 0000000000000000000000000000000000000000..4a20677db0be405137c6930ccdfccf4652e12c3a GIT binary patch literal 6888 zcmb7|dtA)f`@rY<^qKn1bf%eVYBE!w8qc2iWDC$IjvtMQ}Ot&O9 z=ySFHec6?Y=%!&l)!A+SAs3&Rm0dkQY+_4OL%*&w=~1H=IpjNg_S{wc+2Hv(H+tyb ze_ZpiI7b(yy5PU^b;j}$iL2&c+kd#>100-^vF?=S-nKVab8El;@cLDJ-sS8oXD2Q@ zJbi0uqxQ|IiyJ?Tox6DRsbSX>1~#4kzS_(xu=Ca?TepMe&G#pdUKuiLHh-)~YyEyn zg`AbS?o~T#FJJq1Y3rd z(_i*JUgdYb@`mJ=GA>#h-6238WXY8mH7X{;vJNU|dHQhgC{O;u^e@kz8>|)EP zu~;k>TRAFaN*gjd=}-ORE7wv-Di{YWo++Q%!%-vASQGK3F>Pl}=SPfHFwR)qU*2Ei z$V+(R=>2uSF7>}~DOkbSV{s}YPi5>KT_vuzWc=w1ZzFaO${(*_yl{sQd5F6EhbVXB zTzT&c!Q+-I7!NG=m-}nGe~38#%9KaicIO=m#uba#gM2-x9D7Q7T9WCxop-|yMm@|| zFuibxY4U0I-9Kc!e_4<0`Xg0^3Py*;bLDe2j#`P^+^{%U9&F$J zLq>-=@Ma$34+m6CUo2Kj)#i>itc{qg9qw-RUC@*C8U@n_i#_F@yrW8@vLoWyg^S|W z*os7dMD#qn(WM+1#8-l*68=RTiuj{oe-yk4e`%%vW5v@B6WlS(Gi(Ua9r59w;YK2{ z1k&ypdir|oqK@&c=gy%NYnNqhEFj*EbF(3u553MFE)zM3@suY4orL~mEyPy?s-_%} znKw3G^Qi=n-vnqAI1(F>;Kb`0B9p9F(P$=3T_~}^6BmP~7zWXaOTfMa1{1axM_qNV zU#>Dm{60|b14kk-u;)J75%I@Cd0Z$z4xYz_@_MkV2OS+>5B=(4C}Hv!EBf~tA*wc+ zfA{mihDRE#Y8jw1P?MgB?*g_9tO!3_zz*=bbHkoRe9EAdAYuW;uO75oKK zgEA;DzT?g;@^#|zeiPY5OX|dR>^cGE1D6jrWM#w`0#_*H7GPVzlFD0wZKa%f_r7oE z7H=)yQaiY}!vL!5D{y~BxiRie-7&u08N0O^l+9pAW+XWSTg#9zh^3 z`(C`2{H+IGuLk^TAdpOh_&V^bqx{J{r+ovW3;N*o=CSh>WcM%cCCpuC@}M7X-T>?d zupsC9jPuZ|?LUbJU_mbQ$OR8F@y8nGr$;e?1MrFk;8p;A=nf0OrvQc%uH3sk;(mhn zNZj!za5teRnE~;Qz%^1Pc@A&QkmShL0&kiJ6;5;yz~k?L@{TaR?t$_iu9X1Gv}-#C#)go)5R~O>&M{nMc`HhocIQ;0P1C`o ziu#vlgK?)YWta!CA5HFkfW0T=XJGpbTxkF2 zz&;nsUx4ikq5LJVFNN~Az`hmoJ7C`lxf9q<%H-<79yi=OWTz!x^<}P>WQ9l&k4%v* z33pFMrrI3=%@G=rhHO3Ls8C)Fe$_C6_HP8YMq$2M&v5G*JK`-I`i$EKW-#S! zhRde%jo0~O<)s%V;rI$08a9$R;QE~8BX3lpQ*pDYsi`&5)=PfOcWhh30-R=wfh(q) zHf)0{5ppGPl|nuW+)*K)0dxjbbQ`sRYAFXvljnyNoc|n0WC4sQfXO7D4e=dR1TzTF z&>WBcEmstYHIkZ2&55Fj*Ks--jZtTNXDy{zn^-m3DdOXL#<@{ygPv{RM)cBemp0p_ zk6MDgHh>)_{o8Fc2Ta21&_vhWPR9cqzI65kHxo zEG6-R_)pkRq@=Py{A_l%lpL$tH8IX}GQV7c-J!BpX~`~6R*&Ad@c}Hw&D%h|joxCL zYxmfx%%?h0h}OjPuy>`hxx=t?XIWkVf^CACjFR=mFP4od-VYnVf2<5Z&Fh|G> z^bk&X+hpjI|6pYn_R%I_H-R}3M9#JRrfk})EGt|$SS1?EFT^J)leE-h$;xB_r6^Mb zv|71ZK3a-S;iLBqee@D;wlRjf)u=0m(I=c=R$ z*G=W7qtuJ*C6MKUXD;}V1r3=DZKDesvJKiUOfT| zl-Ge*olxEd)?GAnk`fUo#lPQuBrTG}j0J}G9%&XQRpsrz%Qp!+VuXOMD7U_dAs|_r96ewtrSw1zyd|!)qW3K9^@{<@&L)hj4QTSayH|*+i2= z#0ejLQYBV{=Xg6ZE8?}B)<|nkw2T{(7E;9_UScYd(NJ^ZoaBNb4q9hQYi-vWZzRO8 z)2{19wr+U*xDvJ#!f z-Qw6dW70x=8?bGlAlrK!+qj|1HPg_o23%_BEo*pNxztf6&cmKJd}|;sZaHtWs?|O6 z9K-(CR|EFHz8a9u);QaU#2j^*@Rf&nwMflTm#NLw)?^?~WnxbmQ2|HOaIYXr{l)!d zv?3cQ9w?&~nXlMaMk_LZvA>LzJBSYy2g+zg7Ay{yk?=-*h&V(>E3#?gX)#LpGamC;~Y590M8BiRGtj{)KwkP&Mm{Ol2@GBT38OYE-y_+!+JT5SDfU9$1; zB0ddtY4k8}-PqJQMtcmG#(X>*Z}esL{<*8HQBfUkz6;8`^ujVr$O=rTj=zAXy$$Sb zVYz)5*t?YdoW^7=kOf`FGYHH3?B^!S)lEwpaEx=N9HRbm;2bQdhj<5Gkj)cp6YQxS z619nfVmcpO@`Z1iVhApVNz^JWplzYKe9@Xe?~D%&x`NfuV7Ls%m6*%$h~YL+W>&^F zjkLG8+MP()4jR>B&l9)1el2dqGqeNSP75YO(aFA|oHlLR4b#2>zZfh#JbnT>ObzcB zzsnoEso4-rloFg0o1lMg zRk95F=T@cs_pM6!cKObrCe!10uy(gWd7C`Vf$Foqw0mc)ReY>WD7Nu;UkPBm+}FhrmSba(T{NPE;E%0UdnkO z%cC_k;tv9MP*@q{Fl-K^Bti4MsPA)!=5tT6_2Vq#oQQ3)!!6?l)CQJqU}QyR#)FD? z6aT;l*037EwUWlLX^foA{nxI|{SNIo-j2JS0mm~ifS3dEwcu1sKel!?uAPyzX50(B zmn7e$0IEc?Z?b?=!8a8IoCdyWl(Sp3+54V9ef2+AXAduL++n%9>-GOUFs-AKF^RM2 zzya6^%1+Rb{Y@HEk$$Of*2lSx2XyT9MKAB9WHZM2GEn?KYxd>| literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/glwidget.h.1FDF732EFCED4BD8.idx b/.cache/clangd/index/glwidget.h.1FDF732EFCED4BD8.idx new file mode 100644 index 0000000000000000000000000000000000000000..cbeed8a87d15dc80c75bbf2fb3f8e86aebfe80b5 GIT binary patch literal 2336 zcmZ8i3s4hR6y1Hv211r4;g<~v3J9gq5CsLLREwVgGJLeHBif<@hL0FEpaTxhD3(gq zSOiP`74VA{)Dfj(QJPXgg(y^Uv^rx&Z9ps_D&U71`gY-BB{R86&be>jefOU8vLH;O zVZ{V7J0UD%)r$1xLV_Ud@H;JCpBzXM#BYcoG7kKZ9}y*RlYZN8bNj-c`d5o@^+q2) zd8Xd(;H0j|TEs-(cOB@g?en-j=W#5neKF$?WB8X%OG5+LvRhi;pLYi*7ZiJ`o@EyI zY@70Hhk=eHO4hl|GFH;Nj!>Fz^zW{pqHlCxK9-vkpx;Ux-n74qtxOD}L=_F=4J9w! z4o%KZHC-GGue+w{crL%zr=3`T$78ntst`lOvLsbNL-H4Eb_{y{{g`!J+rchhTkNje zx@?{MqM(d(y;+6j+n%JdwPTw<-(I>fqcG1{w+saTRM}b#x&F@?#2Id-tHz_ znlNYM)|PWU75SU*nrCGWdWwEr)cUd`q;+cB+|}AljVbK4fBHu+Bz@64=T^s5R}@C+ zx7V?!4s`zIIqy>0MN_d`R6Wahh<22P_qM(9TAGyg_C{LfsyH3)UZqddeUBogvlJ=t zFYZNoh&`l)<w-nLRh#n{RCjmLeh0&SGafpiLp2M$xi_ zP$^=8b``shtS-NHZ{^GeQ<~dI6-sYD0DZJTjs85E z6UiVcrv04#Ch!61h0f=75A%p*203C{Em2GP0Q7y0!Yypa%q})7tkS(VDt^E~z06M*Sew*9#@q4An2@d8ic9#J? z^MoSz#@VV8DY6FIP3$((mN*wziwV@gNjVw=w1d!rg4G)@Jec>{=Ey1r+2g%^BtEu$ z06Jc2drb2*`*$gFhShShoCW$>Z>Y8}{86n1!uFwLA{oO60-FrKNQ%ns7OZxDF;w70GII6eSor-bUGNSZ%09IoZ74QKo1u?sLPV`ZL@4V^+C zc4(-LiRI0Ee8)&OJ#VQ|UnzK~9o0r~1TKKH13XeDH-5up>Q>^N{DuA!kan;jjx2B7 zm&O$^Sr!c0aS8DO=AyiH7*-0EES$AE*vzPn->)AYXoNZQ6Bo3y9V#Nx2LlE3;Yv8? z!Lwl|80H)Y@av2^MyGB!2*i|)$Yx~xG$mKaJwfg?&n1 zcMrfr;8S2V05>!i5F_!zgez zcS}GvTo4%MZU=xtFr$hu>6jFg*Zr<*SU)g}#k)_9yU9BA3usCuR9Qh`H02}ov4XDA zlv=2^0@3SNq%POu+Q3%?>R`0(K|Ic#3&=t&6BV8m2$w)4uBEro} Ro?JOS-h#H0h%H2x#DAo;|C;~+ literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/main.cpp.1EFC64217C8EEBC3.idx b/.cache/clangd/index/main.cpp.1EFC64217C8EEBC3.idx new file mode 100644 index 0000000000000000000000000000000000000000..932a45a6887c314051e74f7a733756a987989720 GIT binary patch literal 760 zcmWIYbaVT_#K7R3;#rZKT9U}Zz`!63#Kk2=nZAq+3^SM+7%Jw>ofPfQWGK-3yWV5w z1PKvgIgtYACZ(>2g~7K9XI{w7){pt~RnJ2~K)7-Hyp!c>#_6Xl(&uRVbAQ>hh3mHK z+G7>vCg-dVZ;!KkVgGN{o5l44hp*rBHkRlsyS^4q3VANN(?` z<}s`6jG374%q3^y>-gIBr1aXi(OHRH8CxXy1GjQd&f0oRcX!RM(>hBPf~TL`_|_-b zXai@JcG>L%uhz{p&)=aoIc(1??tMw0>zUj(Cfm+qP3t`OsEyCpYzM>K30ekin`PYJ zJX5GIdTL`ag|Y0a*6MScXFL|p; wAOmACFeK-u>S*}+(O(E+#=lK+@joKTzou|oV<(z0Jdlof&c&j literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/mainwindow.cpp.106F8539DEEA62A2.idx b/.cache/clangd/index/mainwindow.cpp.106F8539DEEA62A2.idx new file mode 100644 index 0000000000000000000000000000000000000000..694bf907bcb06e9875e55d733c840a291fb835b7 GIT binary patch literal 10702 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 Gp#FbB@K168 literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/mainwindow.h.1CF791588B2BEEF8.idx b/.cache/clangd/index/mainwindow.h.1CF791588B2BEEF8.idx new file mode 100644 index 0000000000000000000000000000000000000000..44c86b604e886c0b17e544ebedc1d827145232e1 GIT binary patch literal 3510 zcmZ8k2~-qk5}y9)X6Tuoo^Fnrk>Qvbko&$5(TLHA2`W61_;!(a$6Emdcwvxi)I?Fh z6CpqZg6@jhsH}>@MkPpaeTum5@>a!zm?&)U$P1C^R<{(c_IuO}-&cQi{eS)S6(lE2 zm~dF5P>h?Kkh64N)+}0~P}spwW>&_+U6evm4?xcT>g2@bT|wMa*F~$m^UV#>V?U;R zcUcy%37fmO_>GRp%YrVkF*1I;rlM_OVilk59z z+Az*LP`5Xr_`NgT7nA-Q-L@<*t*iUw>Qp!3-op#7r7?s1tGkZchKGH=b4J~WF8a5= zqsKRfvZ3E)`^Ecrc3-a8+^dMb@k>qr^XZ$KtnRdB-dc6HRMdXnzol^P*oGU|=&94* zu5j5`lfL0@`WgGH9eKBx8!xKwmAxl!Nl)GVyD|5j#;cjROK1NLDiaj{>$=GNb{n49 z5e4JHdl+P+uz?D~6Kk6J!Q|e5umbTU3i>D!j}mXjg>^BbgLR^Z`%L3@2R#V{2Pe)+ z!)R$OgEY0muH;xryjdXLK;NXqo0JP<$J*)8q5m(o(N7MIcN2&S98MDPByne4Syv}? zn8W#xO>R^N3B&>p)kLf&&Ww>YI-tX|xz9Ssc*TeC#2$9wC;BB_&vcdHuXA5g<9!&g@Ct9FKX-2uq25I%Coonv|nidMg4Z_zEv5vSg zPOOs=9WKo;@BL<~GM6VhSRc-XTV#VYQ+MNHMqtutpL)E5y z$G2Onc%lb7OcUlV8>F{Hj6FX;<@y1hI05a&dg*0@bifynZa;Z3sa7EFkXktr%VFmR z)-b&D7-j173774T3uGiXd`862h=tL!dPj_~o13^Oe`RumKzzX=pNRRy%;;F%2y{p^ zm6MIn=loqD{@^f3iG!4pabO+n&|#|b$Hs#-%vqlBkYXGc=PVnfOGdUVJn$^Dl_wm~ z(Ok5%Y>;krYCc!jG|(;(9|+$=i9M7%Be25o%{969uG#mm@s|W*28R|Rw!qakv*uxk zmEZ2&ZCK1+Q4)|zMs2MYWTRl^)}t7v;?5YwvJn4kJh6ogLNp;RvcU|pPed*)DyX{7 z6AjQ&nkZMwlfg_WOCqEX57ldyn zVl&jw#F~cdx8_Bj&z`0w13VF7eJB^|BpY1c(HQmVvAbUk>IenvRh&x4@ETr^bjG~- znbp<`g%7_qA?V;mD~e_~n&T#R6jo-mMW>*wQ7T!^@T5`BC{`9Rg#Q#Yy>n;dhXO_9 zAPA$jQIxD{2*1enylp!t#tg9ZN`z7BAhslM2&2FOEXf+eykgygtyLp^-Uw1RaG~7g ztef9ZCi&9`Z1Pj9ZWTBiANx4P`6)RjfDTZhXmLy^9jd~ECKO#uc=OkO|!m-WX=qV7USNpvwJ>MbN7sVu^$ z#`f@m&4nKgT_UUv9wh{klo!2w)_s$m(O{Ss$X-?^UDJ7ORy*HDPS|5&fng%a^b(X0n8hCS8M_la>!c}aE#qu|DbP1?e}|! z^2W_C-FHowzWwLDZ`>`s3y`3s^%w+Y9$-o15k`3jSkiWcQPu&LG#z1-b4XAUafGuD zx0EYe29ChJ^{4&S_$rPGp+nTDZX6RvhpF*>91}rDs8PE(CW?+yqtJ0o3>~A!>%uXk z=uv8{bk4dbYtO|`_$zt+B5;i0CitLM<4}P#rBQ-u;wS-F8XyRdPdOC4czx<=*ehj2 z+2aMA{dLiw+ke_~dg#gCWG+8x|G zP+257M$2fm_!|}sl9Of;!dM-Er5S`UY8QE3R9}_{Nvt!hl?D{9jq_XmeSPcd+i+;M zHn#B3#mfgr7HmZtROnq++3^0C)aD-W)*JO^EHbtl#FmB^dSj~rEDbG$1M45QZyVgv z|3=f`7=u?z!wbDpb0LT{xe&&F1@HeqMn%TFC9^EB2W93OgO+YKQ#e{sOB5I(Gh xy0lxEZ9@-Xe5wUsW$LXwC9781D6OoA{z8y>6}l;KG)jQ-6{>#q)#}yP{{fV?1OWg5 literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/videodecoder.cpp.B5F31E0C60CEA00D.idx b/.cache/clangd/index/videodecoder.cpp.B5F31E0C60CEA00D.idx new file mode 100644 index 0000000000000000000000000000000000000000..18e07a901b2b776ccc65be9d6fbd87c1433995c4 GIT binary patch literal 7288 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 literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/videodecoder.h.D0CE50575247D653.idx b/.cache/clangd/index/videodecoder.h.D0CE50575247D653.idx new file mode 100644 index 0000000000000000000000000000000000000000..276ee235121c351a12809458dea34853b63c93bb GIT binary patch literal 3596 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 literal 0 HcmV?d00001 diff --git a/CMakeLists.txt b/CMakeLists.txt index 3381b91..4f39cd6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.17) -project(crt_player_cuda VERSION 1.0.0 LANGUAGES CXX) +project(zero_copy_example VERSION 1.0.0 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) @@ -36,10 +36,10 @@ set(HEADERS ) # Definir ejecutable -add_executable(crt_player_cuda ${SOURCES} ${HEADERS}) +add_executable(zero_copy_example ${SOURCES} ${HEADERS}) # Enlazar librerías de Qt6, FFmpeg y CUDA -target_link_libraries(crt_player_cuda PRIVATE +target_link_libraries(zero_copy_example PRIVATE Qt6::Core Qt6::Gui Qt6::Widgets @@ -52,7 +52,7 @@ target_link_libraries(crt_player_cuda PRIVATE ${CUDART_LIBRARY} ) -target_include_directories(crt_player_cuda PRIVATE +target_include_directories(zero_copy_example PRIVATE ${AVCODEC_INCLUDE_DIRS} ${AVFORMAT_INCLUDE_DIRS} ${AVUTIL_INCLUDE_DIRS} diff --git a/README.md b/README.md index 6b0b7be..78d934f 100644 --- a/README.md +++ b/README.md @@ -76,23 +76,25 @@ cudaMemcpy2DToArray(arrayUV, 0, 0, (void*)frame->data[1], frame->linesize[1], w, cudaGraphicsUnmapResources(1, &m_cudaResourceY, 0); ``` -### Punto 4: Conversión Cromática y Filtros en el Fragment Shader +### Punto 4: Conversión Cromática en el Fragment Shader Para corregir el origen invertido entre OpenGL y CUDA, las coordenadas del Quad están configuradas con el eje vertical invertido ($V = 1.0 - V$). En el fragment shader [shader.frag](file:///home/sebastian/repos/zero_copy_video_player/shader.frag), leemos ambas texturas en paralelo y realizamos la conversión matemática de NV12 a RGB: ```glsl -float y = texture(u_texY, uv).r; -vec2 uvVal = texture(u_texUV, uv).rg; +float y = texture(u_texY, v_texCoord).r; +vec2 uvVal = texture(u_texUV, v_texCoord).rg; + +// El formato NV12 almacena U y V entrelazados. Restamos 0.5 para centrar la crominancia. float u = uvVal.r - 0.5; float v = uvVal.g - 0.5; +// Matriz estándar de conversión YUV (NV12) a RGB float r = y + 1.402 * v; float g = y - 0.344136 * u - 0.714136 * v; float b = y + 1.772 * u; -vec3 color = vec3(r, g, b); -``` -Por último, sobre esta señal de color RGB, se aplican los filtros de curvatura 3D de la lente, líneas de barrido (scanlines), aberración cromática y viñeteado. +fragColor = vec4(r, g, b, 1.0); +``` --- diff --git a/glwidget.cpp b/glwidget.cpp index ac3b3c6..8cea4b9 100644 --- a/glwidget.cpp +++ b/glwidget.cpp @@ -13,13 +13,7 @@ GLWidget::GLWidget(QWidget *parent) , m_cudaResourceUV(nullptr) , m_allocatedWidth(0) , m_allocatedHeight(0) - , m_crtEnabled(true) - , m_curvature(2.0f) - , m_scanlineDensity(400.0f) - , m_scanlineOpacity(0.35f) - , m_aberration(0.0015f) - , m_vignette(0.20f) - , m_brightness(1.10f) + { m_localFrame = av_frame_alloc(); } @@ -51,40 +45,7 @@ void GLWidget::onFrameReady() { update(); } -void GLWidget::setCrtEnabled(bool enabled) { - m_crtEnabled = enabled; - update(); -} -void GLWidget::setCurvature(float value) { - m_curvature = value; - update(); -} - -void GLWidget::setScanlineDensity(float value) { - m_scanlineDensity = value; - update(); -} - -void GLWidget::setScanlineOpacity(float value) { - m_scanlineOpacity = value; - update(); -} - -void GLWidget::setAberration(float value) { - m_aberration = value; - update(); -} - -void GLWidget::setVignette(float value) { - m_vignette = value; - update(); -} - -void GLWidget::setBrightness(float value) { - m_brightness = value; - update(); -} void GLWidget::clearVideo() { cleanupCudaGL(); @@ -227,13 +188,7 @@ void GLWidget::paintGL() { glBindTexture(GL_TEXTURE_2D, m_texUV); m_shaderProgram.setUniformValue("u_texUV", 1); - m_shaderProgram.setUniformValue("u_crtEnabled", m_crtEnabled); - m_shaderProgram.setUniformValue("u_curvature", m_curvature); - m_shaderProgram.setUniformValue("u_scanlineDensity", m_scanlineDensity); - m_shaderProgram.setUniformValue("u_scanlineOpacity", m_scanlineOpacity); - m_shaderProgram.setUniformValue("u_aberration", m_aberration); - m_shaderProgram.setUniformValue("u_vignette", m_vignette); - m_shaderProgram.setUniformValue("u_brightness", m_brightness); + glBindBuffer(GL_ARRAY_BUFFER, m_vbo); int posLocation = m_shaderProgram.attributeLocation("a_position"); diff --git a/glwidget.h b/glwidget.h index c398e4d..b521120 100644 --- a/glwidget.h +++ b/glwidget.h @@ -23,14 +23,7 @@ public: void setVideoDecoder(VideoDecoder *decoder); - // Ajustes del Shader CRT - void setCrtEnabled(bool enabled); - void setCurvature(float value); - void setScanlineDensity(float value); - void setScanlineOpacity(float value); - void setAberration(float value); - void setVignette(float value); - void setBrightness(float value); + void clearVideo(); @@ -65,14 +58,7 @@ private: int m_allocatedWidth; int m_allocatedHeight; - // Estado del Shader - bool m_crtEnabled; - float m_curvature; - float m_scanlineDensity; - float m_scanlineOpacity; - float m_aberration; - float m_vignette; - float m_brightness; + }; #endif // GLWIDGET_H diff --git a/mainwindow.cpp b/mainwindow.cpp index b5176f3..719df25 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -12,8 +12,8 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , m_updatingSeek(false) { - setWindowTitle("Retro CRT Video Player (C++/Qt6 & Native CUDA Zero-Copy)"); - resize(1200, 720); + setWindowTitle("Zero-Copy CUDA-GL Video Player"); + resize(960, 600); m_glWidget = new GLWidget(this); m_videoDecoder = new VideoDecoder(this); @@ -35,7 +35,6 @@ void MainWindow::setupUI() { this->setStyleSheet( "QMainWindow { background-color: #08080f; }" "QWidget { color: #f0f0f5; font-family: 'Outfit', 'Segoe UI', sans-serif; font-size: 13px; }" - "QFrame#sidebar { background-color: #11111d; border-left: 1px solid #22223b; border-radius: 0px; }" "QPushButton { background-color: #ff007f; color: white; border: none; padding: 8px 15px; border-radius: 6px; font-weight: bold; min-width: 60px; }" "QPushButton:hover { background-color: #ff3399; }" "QPushButton:pressed { background-color: #cc0066; }" @@ -45,22 +44,16 @@ void MainWindow::setupUI() { "QSlider::handle:horizontal { background: #ffffff; border: 1px solid #ff007f; width: 14px; height: 14px; margin: -4px 0; border-radius: 7px; }" "QSlider::handle:horizontal:hover { background: #ff007f; }" "QLabel { color: #a0a0c0; }" - "QCheckBox { spacing: 8px; }" - "QCheckBox::indicator { width: 18px; height: 18px; border: 1px solid #ff007f; border-radius: 4px; background: #1a1a2e; }" - "QCheckBox::indicator:checked { background-color: #ff007f; image: url(check.png); /* O usar un color plano */ }" - "QGroupBox { font-weight: bold; border: 1px solid #22223b; border-radius: 8px; margin-top: 15px; padding-top: 15px; color: #ff007f; }" ); QWidget *centralWidget = new QWidget(this); setCentralWidget(centralWidget); - QHBoxLayout *mainLayout = new QHBoxLayout(centralWidget); + QVBoxLayout *mainLayout = new QVBoxLayout(centralWidget); mainLayout->setContentsMargins(10, 10, 10, 10); mainLayout->setSpacing(10); - // --- COLUMNA IZQUIERDA: REPRODUCTOR --- - QVBoxLayout *playerLayout = new QVBoxLayout(); - playerLayout->addWidget(m_glWidget, 1); + mainLayout->addWidget(m_glWidget, 1); // Controles Multimedia QHBoxLayout *controlsLayout = new QHBoxLayout(); @@ -90,135 +83,7 @@ void MainWindow::setupUI() { m_timeLabel->setAlignment(Qt::AlignCenter); controlsLayout->addWidget(m_timeLabel); - playerLayout->addLayout(controlsLayout); - mainLayout->addLayout(playerLayout, 3); // 3/4 del ancho de ventana - - // --- COLUMNA DERECHA: SIDEBAR DE AJUSTES --- - QFrame *sidebar = new QFrame(this); - sidebar->setObjectName("sidebar"); - sidebar->setFixedWidth(300); - - QVBoxLayout *sidebarLayout = new QVBoxLayout(sidebar); - sidebarLayout->setContentsMargins(15, 15, 15, 15); - - QLabel *sidebarTitle = new QLabel("AJUSTES CRT RETRO", this); - sidebarTitle->setStyleSheet("font-size: 16px; font-weight: bold; color: #ff007f; margin-bottom: 10px;"); - sidebarTitle->setAlignment(Qt::AlignCenter); - sidebarLayout->addWidget(sidebarTitle); - - QScrollArea *scrollArea = new QScrollArea(this); - scrollArea->setWidgetResizable(true); - scrollArea->setFrameShape(QFrame::NoFrame); - - QWidget *scrollWidget = new QWidget(this); - QVBoxLayout *scrollLayout = new QVBoxLayout(scrollWidget); - scrollLayout->setContentsMargins(0, 0, 0, 0); - - // Activador General - m_crtCheckbox = new QCheckBox("Habilitar Efecto CRT", this); - m_crtCheckbox->setChecked(true); - m_crtCheckbox->setStyleSheet("font-weight: bold; font-size: 14px; color: #ffffff;"); - connect(m_crtCheckbox, &QCheckBox::toggled, this, &MainWindow::onCrtToggled); - scrollLayout->addWidget(m_crtCheckbox); - - // Grupo de Controles Geométricos - QGroupBox *geoGroup = new QGroupBox("Geometría y Lente", this); - QVBoxLayout *geoLayout = new QVBoxLayout(geoGroup); - - QLabel *curvLabel = new QLabel("Curvatura de Pantalla:", this); - geoLayout->addWidget(curvLabel); - QHBoxLayout *curvLayout = new QHBoxLayout(); - m_curvatureSlider = new QSlider(Qt::Horizontal, this); - m_curvatureSlider->setRange(0, 50); // 0.0 a 5.0 - m_curvatureSlider->setValue(20); - connect(m_curvatureSlider, &QSlider::valueChanged, this, &MainWindow::onCurvatureChanged); - curvLayout->addWidget(m_curvatureSlider); - m_curvatureLabel = new QLabel("2.0", this); - m_curvatureLabel->setFixedWidth(30); - curvLayout->addWidget(m_curvatureLabel); - geoLayout->addLayout(curvLayout); - scrollLayout->addWidget(geoGroup); - - // Grupo de Estilo Scanline - QGroupBox *scanlineGroup = new QGroupBox("Efecto Scanlines", this); - QVBoxLayout *scanlineLayout = new QVBoxLayout(scanlineGroup); - - QLabel *densLabel = new QLabel("Densidad de Líneas:", this); - scanlineLayout->addWidget(densLabel); - QHBoxLayout *densLayout = new QHBoxLayout(); - m_scanlineDensitySlider = new QSlider(Qt::Horizontal, this); - m_scanlineDensitySlider->setRange(100, 1000); - m_scanlineDensitySlider->setValue(400); - connect(m_scanlineDensitySlider, &QSlider::valueChanged, this, &MainWindow::onScanlineDensityChanged); - densLayout->addWidget(m_scanlineDensitySlider); - m_scanlineDensityLabel = new QLabel("400", this); - m_scanlineDensityLabel->setFixedWidth(30); - densLayout->addWidget(m_scanlineDensityLabel); - scanlineLayout->addLayout(densLayout); - - QLabel *opacLabel = new QLabel("Opacidad de Líneas:", this); - scanlineLayout->addWidget(opacLabel); - QHBoxLayout *opacLayout = new QHBoxLayout(); - m_scanlineOpacitySlider = new QSlider(Qt::Horizontal, this); - m_scanlineOpacitySlider->setRange(0, 100); // 0% a 100% - m_scanlineOpacitySlider->setValue(35); - connect(m_scanlineOpacitySlider, &QSlider::valueChanged, this, &MainWindow::onScanlineOpacityChanged); - opacLayout->addWidget(m_scanlineOpacitySlider); - m_scanlineOpacityLabel = new QLabel("0.35", this); - m_scanlineOpacityLabel->setFixedWidth(30); - opacLayout->addWidget(m_scanlineOpacityLabel); - scanlineLayout->addLayout(opacLayout); - scrollLayout->addWidget(scanlineGroup); - - // Grupo de Imperfecciones - QGroupBox *imperfGroup = new QGroupBox("Óptica y Color", this); - QVBoxLayout *imperfLayout = new QVBoxLayout(imperfGroup); - - QLabel *aberrLabel = new QLabel("Aberración Cromática (RGB split):", this); - imperfLayout->addWidget(aberrLabel); - QHBoxLayout *aberrLayout = new QHBoxLayout(); - m_aberrationSlider = new QSlider(Qt::Horizontal, this); - m_aberrationSlider->setRange(0, 100); // 0.0000 a 0.0100 - m_aberrationSlider->setValue(15); - connect(m_aberrationSlider, &QSlider::valueChanged, this, &MainWindow::onAberrationChanged); - aberrLayout->addWidget(m_aberrationSlider); - m_aberrationLabel = new QLabel("0.0015", this); - m_aberrationLabel->setFixedWidth(45); - aberrLayout->addWidget(m_aberrationLabel); - imperfLayout->addLayout(aberrLayout); - - QLabel *vigLabel = new QLabel("Viñeteado (Esquinas oscuras):", this); - imperfLayout->addWidget(vigLabel); - QHBoxLayout *vigLayout = new QHBoxLayout(); - m_vignetteSlider = new QSlider(Qt::Horizontal, this); - m_vignetteSlider->setRange(5, 50); // 0.05 a 0.50 - m_vignetteSlider->setValue(20); - connect(m_vignetteSlider, &QSlider::valueChanged, this, &MainWindow::onVignetteChanged); - vigLayout->addWidget(m_vignetteSlider); - m_vignetteLabel = new QLabel("0.20", this); - m_vignetteLabel->setFixedWidth(30); - vigLayout->addWidget(m_vignetteLabel); - imperfLayout->addLayout(vigLayout); - - QLabel *brightLabel = new QLabel("Brillo Adicional:", this); - imperfLayout->addWidget(brightLabel); - QHBoxLayout *brightLayout = new QHBoxLayout(); - m_brightnessSlider = new QSlider(Qt::Horizontal, this); - m_brightnessSlider->setRange(80, 150); // 0.80 a 1.50 - m_brightnessSlider->setValue(110); - connect(m_brightnessSlider, &QSlider::valueChanged, this, &MainWindow::onBrightnessChanged); - brightLayout->addWidget(m_brightnessSlider); - m_brightnessLabel = new QLabel("1.10", this); - m_brightnessLabel->setFixedWidth(30); - brightLayout->addWidget(m_brightnessLabel); - imperfLayout->addLayout(brightLayout); - scrollLayout->addWidget(imperfGroup); - - scrollLayout->addStretch(1); - scrollArea->setWidget(scrollWidget); - sidebarLayout->addWidget(scrollArea); - - mainLayout->addWidget(sidebar); + mainLayout->addLayout(controlsLayout); } void MainWindow::openVideoFile() { @@ -289,43 +154,4 @@ void MainWindow::onPlaybackFinished() { m_seekBar->setValue(0); } -// --- SLOTS DE PARÁMETROS DEL SHADER --- -void MainWindow::onCrtToggled(bool checked) { - m_glWidget->setCrtEnabled(checked); -} - -void MainWindow::onCurvatureChanged(int value) { - float curvatureVal = value / 10.0f; - m_curvatureLabel->setText(QString::number(curvatureVal, 'f', 1)); - m_glWidget->setCurvature(curvatureVal); -} - -void MainWindow::onScanlineDensityChanged(int value) { - m_scanlineDensityLabel->setText(QString::number(value)); - m_glWidget->setScanlineDensity(static_cast(value)); -} - -void MainWindow::onScanlineOpacityChanged(int value) { - float opacityVal = value / 100.0f; - m_scanlineOpacityLabel->setText(QString::number(opacityVal, 'f', 2)); - m_glWidget->setScanlineOpacity(opacityVal); -} - -void MainWindow::onAberrationChanged(int value) { - float aberrationVal = value / 10000.0f; - m_aberrationLabel->setText(QString::number(aberrationVal, 'f', 4)); - m_glWidget->setAberration(aberrationVal); -} - -void MainWindow::onVignetteChanged(int value) { - float vignetteVal = value / 100.0f; - m_vignetteLabel->setText(QString::number(vignetteVal, 'f', 2)); - m_glWidget->setVignette(vignetteVal); -} - -void MainWindow::onBrightnessChanged(int value) { - float brightnessVal = value / 100.0f; - m_brightnessLabel->setText(QString::number(brightnessVal, 'f', 2)); - m_glWidget->setBrightness(brightnessVal); -} diff --git a/mainwindow.h b/mainwindow.h index 06c1fbe..98f7512 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -24,14 +24,7 @@ private slots: void onPositionChanged(qint64 positionMs); void onPlaybackFinished(); - // Slots de actualización de los sliders del Shader - void onCrtToggled(bool checked); - void onCurvatureChanged(int value); - void onScanlineDensityChanged(int value); - void onScanlineOpacityChanged(int value); - void onAberrationChanged(int value); - void onVignetteChanged(int value); - void onBrightnessChanged(int value); + private: void setupUI(); @@ -46,20 +39,7 @@ private: QSlider *m_seekBar; QLabel *m_timeLabel; - // Sliders del Shader y sus etiquetas indicadoras - QCheckBox *m_crtCheckbox; - QSlider *m_curvatureSlider; - QLabel *m_curvatureLabel; - QSlider *m_scanlineDensitySlider; - QLabel *m_scanlineDensityLabel; - QSlider *m_scanlineOpacitySlider; - QLabel *m_scanlineOpacityLabel; - QSlider *m_aberrationSlider; - QLabel *m_aberrationLabel; - QSlider *m_vignetteSlider; - QLabel *m_vignetteLabel; - QSlider *m_brightnessSlider; - QLabel *m_brightnessLabel; + }; #endif // MAINWINDOW_H diff --git a/shader.frag b/shader.frag index 51d1e2e..cc03f65 100644 --- a/shader.frag +++ b/shader.frag @@ -5,76 +5,19 @@ out vec4 fragColor; uniform sampler2D u_texY; uniform sampler2D u_texUV; -uniform bool u_crtEnabled; -uniform float u_curvature; -uniform float u_scanlineDensity; -uniform float u_scanlineOpacity; -uniform float u_aberration; -uniform float u_vignette; -uniform float u_brightness; -uniform float u_time; -// Función para distorsión de barril (curvatura CRT) -vec2 curve(vec2 uv) { - if (u_curvature <= 0.0) return uv; - uv = (uv - 0.5) * 2.0; - uv.x *= 1.0 + (uv.y * uv.y) * (u_curvature * 0.05); - uv.y *= 1.0 + (uv.x * uv.x) * (u_curvature * 0.05); - uv = (uv / 2.0) + 0.5; - return uv; -} - -// Conversión NV12 (Y + UV entrelazados) a RGB -vec3 getNv12Color(vec2 uv) { - float y = texture(u_texY, uv).r; - vec2 uvVal = texture(u_texUV, uv).rg; +void main() { + float y = texture(u_texY, v_texCoord).r; + vec2 uvVal = texture(u_texUV, v_texCoord).rg; + + // El formato NV12 almacena U y V entrelazados. Restamos 0.5 para centrar la crominancia. float u = uvVal.r - 0.5; float v = uvVal.g - 0.5; + // Matriz estándar de conversión YUV (NV12) a RGB float r = y + 1.402 * v; float g = y - 0.344136 * u - 0.714136 * v; float b = y + 1.772 * u; - return vec3(r, g, b); -} - -void main() { - vec2 uv = v_texCoord; - - if (u_crtEnabled) { - uv = curve(uv); - } - - // Verificar límites para recortar esquinas curvas - if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) { - fragColor = vec4(0.0, 0.0, 0.0, 1.0); - return; - } - - vec3 color; - if (u_crtEnabled && u_aberration > 0.0) { - // Aberración Cromática (RGB split) utilizando muestreos desfasados de NV12 - float r = getNv12Color(vec2(uv.x - u_aberration, uv.y)).r; - float g = getNv12Color(uv).g; - float b = getNv12Color(vec2(uv.x + u_aberration, uv.y)).b; - color = vec3(r, g, b); - } else { - color = getNv12Color(uv); - } - - // Aplicar Brillo - color *= u_brightness; - - if (u_crtEnabled) { - // 1. Efecto Scanlines (Líneas de Barrido) - float scanline = sin(uv.y * u_scanlineDensity * 3.14159265); - scanline = mix(1.0, (scanline + 1.0) * 0.5, u_scanlineOpacity); - color *= scanline; - - // 2. Efecto Viñeteado (Esquinas oscuras) - float vignette = uv.x * uv.y * (1.0 - uv.x) * (1.0 - uv.y); - vignette = clamp(pow(16.0 * vignette, u_vignette), 0.0, 1.0); - color *= vignette; - } - - fragColor = vec4(color, 1.0); + + fragColor = vec4(r, g, b, 1.0); }