From 83d91b6a7378269a45755793669e082892a96eb6 Mon Sep 17 00:00:00 2001 From: Li Date: Sun, 19 Mar 2023 15:37:35 +1300 Subject: [PATCH] add new code to disable dvdcss caching --- DumpDVD/Dvd/DvdRipper.cpp | 2 +- DumpDVD/Gui/DumpDVD.cpp | 34 ++++++++++++++++++++++------------ DumpDVD/Gui/DumpDVD.hpp | 1 + DumpDVD/Gui/MainWindow.cpp | 27 +++++++-------------------- DumpDVD/Gui/SDL.cpp | 22 +++++++++++++++++++++- DumpDVD/Gui/SDL.hpp | 10 ++++++++++ lib/libdvdcss.lib | Bin 290166 -> 270890 bytes libdvdcss/src/css.c | 8 ++++---- libdvdcss/src/libdvdcss.c | 14 +++++++++++--- 9 files changed, 77 insertions(+), 41 deletions(-) diff --git a/DumpDVD/Dvd/DvdRipper.cpp b/DumpDVD/Dvd/DvdRipper.cpp index a651577..73aaef8 100644 --- a/DumpDVD/Dvd/DvdRipper.cpp +++ b/DumpDVD/Dvd/DvdRipper.cpp @@ -268,7 +268,7 @@ namespace Li::Dvd { this->sectorsReadSoFar = 0; this->fileReadSoFar = 0; this->keepRunning = false; - this->ripinThread->join(); + this->ripinThread->detach(); delete this->driveIoCtl; delete this->ripinThread; diff --git a/DumpDVD/Gui/DumpDVD.cpp b/DumpDVD/Gui/DumpDVD.cpp index e42199a..bcc7a4a 100644 --- a/DumpDVD/Gui/DumpDVD.cpp +++ b/DumpDVD/Gui/DumpDVD.cpp @@ -36,18 +36,24 @@ namespace Li::Gui { } DumpDVD::~DumpDVD() { - this->keepPolling = false; - this->pollDrives->join(); + if (this->imRippinIt) { + this->endRipNow(); + std::filesystem::remove(std::string(this->outputFile)); + } + else { + this->keepPolling = false; + this->pollDrives->detach(); + delete this->pollDrives; + } + delete this->lock; - delete this->pollDrives; freeOldDriveList(); } void DumpDVD::pollDrivesThread() { while (this->keepPolling) { - if ( (this->counter % (60 * 10)) == 0) { - this->refreshDriveList(); - } + this->refreshDriveList(); + std::this_thread::sleep_for(std::chrono::seconds(10)); } } @@ -103,7 +109,7 @@ namespace Li::Gui { void DumpDVD::startRip() { if (this->GetCurrentSelectedDrive()->DiscInDrive()) { this->keepPolling = false; - this->pollDrives->join(); + this->pollDrives->detach(); delete this->pollDrives; std::vector* speeds = this->GetCurrentSelectedDrive()->SupportedSpeeds(); @@ -119,11 +125,15 @@ namespace Li::Gui { } } - void DumpDVD::endRipAndGoBackToMenu() { + void DumpDVD::endRipNow() { this->dvdRipper->EndRip(); delete this->dvdRipper; - this->imRippinIt = false; + } + + void DumpDVD::endRipAndGoBackToMenu() { + this->endRipNow(); + this->reset(); this->keepPolling = true; @@ -177,7 +187,7 @@ namespace Li::Gui { if (this->dvdRipper->Done()) { if (!this->dvdRipper->Error()) { - ImGui::Begin("Complete", &this->imRippinIt, ImGuiWindowFlags_NoCollapse); + ImGui::Begin("Complete", &this->imRippinIt, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize); ImGui::Text("ISO file was created successfully."); if (ImGui::Button("OK")) { this->endRipAndGoBackToMenu(); @@ -185,7 +195,7 @@ namespace Li::Gui { ImGui::End(); } else { - ImGui::Begin("Error", &this->imRippinIt, ImGuiWindowFlags_NoCollapse); + ImGui::Begin("Error", &this->imRippinIt, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize); ImGui::Text("Error occured when creating an ISO\n\"%s\"", this->dvdRipper->ErrorMessage().c_str()); if (ImGui::Button("OK")) { this->endRipAndGoBackToMenu(); @@ -284,7 +294,7 @@ namespace Li::Gui { ImGui::SetNextWindowPos(ImVec2(0, 0), ImGuiCond_Always); ImGui::SetNextWindowSize(ImGui::GetIO().DisplaySize, ImGuiCond_Always); - ImGui::Begin("DVD Dumper", NULL, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoMove | + ImGui::Begin("DVD Dumper", NULL, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoFocusOnAppearing); if (this->imRippinIt) diff --git a/DumpDVD/Gui/DumpDVD.hpp b/DumpDVD/Gui/DumpDVD.hpp index a92e6ba..6189c9e 100644 --- a/DumpDVD/Gui/DumpDVD.hpp +++ b/DumpDVD/Gui/DumpDVD.hpp @@ -41,6 +41,7 @@ namespace Li::Gui { void reset(); void startRip(); + void endRipNow(); void endRipAndGoBackToMenu(); void showRipMenu(); diff --git a/DumpDVD/Gui/MainWindow.cpp b/DumpDVD/Gui/MainWindow.cpp index b3452f5..fadb646 100644 --- a/DumpDVD/Gui/MainWindow.cpp +++ b/DumpDVD/Gui/MainWindow.cpp @@ -1,38 +1,25 @@ #include "MainWindow.hpp" -#ifdef _WIN32 -#include "D3D.hpp" -#include -#endif +#include "SDL.hpp" +#include "DumpDVD.hpp" -#include -#include #include #include #include -#include "SDL.hpp" -#include "DumpDVD.hpp" namespace Li::Gui { MainWindow::MainWindow() { this->sdl = new SDL("DumpDVD", 800, 400); + this->sdl->SetMaxFPS(24.0); DumpDVD* dumpDvdMenu = new DumpDVD(); - uint32_t lastRenderTime = SDL_GetTicks(); while (!this->sdl->IsExiting()) { - uint32_t curRenderTime = SDL_GetTicks(); - uint32_t delta = curRenderTime - lastRenderTime; - if (delta > 1000 / 60.0) - { - this->sdl->PollEvent(); - this->sdl->NewFrame(); + this->sdl->PollEvent(); + this->sdl->NewFrame(); - dumpDvdMenu->RenderUI(); + dumpDvdMenu->RenderUI(); - this->sdl->Render(); - - lastRenderTime = curRenderTime; - } + this->sdl->Render(); } delete dumpDvdMenu; diff --git a/DumpDVD/Gui/SDL.cpp b/DumpDVD/Gui/SDL.cpp index 9fda9b0..d5710aa 100644 --- a/DumpDVD/Gui/SDL.cpp +++ b/DumpDVD/Gui/SDL.cpp @@ -6,6 +6,9 @@ #include #endif +#include +#include + #include #include #include @@ -50,7 +53,9 @@ namespace Li::Gui { #else #error No imgui renderer backend provided for this platform #endif - isExiting = false; + this->isExiting = false; + this->SetMaxFPS(24.0); + this->lastRenderTime = SDL_GetTicks(); } bool SDL::IsExiting() { return this->isExiting; @@ -77,16 +82,31 @@ namespace Li::Gui { } } void SDL::NewFrame() { + this->curRenderTime = SDL_GetTicks(); + this->renderer->ImGuiNewFrame(); ImGui_ImplSDL2_NewFrame(); ImGui::NewFrame(); } + void SDL::SetMaxFPS(float fpsLimit) { + this->maxFps = fpsLimit; + this->limit = (1000 / this->maxFps); + } void SDL::Render() { ImGui::Render(); ImVec4 clearColor = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); this->renderer->Render(clearColor); + + this->lastRenderTime = this->curRenderTime; + this->delta = (this->curRenderTime - this->lastRenderTime); + + if (this->delta < this->limit) + { + uint32_t remain = (this->limit - this->delta); + std::this_thread::sleep_for(std::chrono::milliseconds(remain)); + } } SDL::~SDL() { diff --git a/DumpDVD/Gui/SDL.hpp b/DumpDVD/Gui/SDL.hpp index bec75d6..b6e1b9c 100644 --- a/DumpDVD/Gui/SDL.hpp +++ b/DumpDVD/Gui/SDL.hpp @@ -11,12 +11,22 @@ namespace Li::Gui { SDL_WindowFlags windowFlags; SDL_SysWMinfo wmInfo; SDL_Window* window; + + + float maxFps; + uint32_t limit; + + uint32_t lastRenderTime; + uint32_t curRenderTime; + uint32_t delta; + Renderer* renderer; bool isExiting; public: bool IsExiting(); void NewFrame(); + void SetMaxFPS(float fpsLimit); void PollEvent(); void Render(); SDL(std::string windowTitle, int windowWidth, int windowHeight); diff --git a/lib/libdvdcss.lib b/lib/libdvdcss.lib index 53a5d1e77c94f8a0a94506d12173de6e14acc791..e1e478c9bea559e2e31da9b60ab8c7508a334de9 100644 GIT binary patch delta 23251 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 bjr^p6zK`s1qZ*CF?-!|(pEJ}~Ir{$qCD%yK delta 37879 zcmd6Q2YeMp*Z1t*o15g`kOCnD2+1Xc&>1&RtTo zQ&KXLVTA?l$J{q&bbdbjrz9u!=$zi8OL|skOCmls zIkiiATG!r*E&3*RHdcl=H~zE@@uX&CWMy?vP3P!%qxD~OIpoxoq%K`j)4Fs`>5?>h zP606?Ke1&&US49$$+oxk)4KFX%g9VhpD`nEMqko343AueuqJ+S^piO6u0LOP8LhUAiZw z^-qJ@9GMS{X7&u@!+MeaIr&qk&6qH?V62gEKd9v!i4Bez;f^UKFFM-khE}b%;p?nk zrDe|^nO(9{Q&e6`Y!M$f%kU4cQ_{}4(bk}QQn%!u$vv~uGm{D?6ih~%#?~IH3Pl_vZ zWleiRi5dQyUhi*aHuKB|TYDofqUB%ZxDqoWQ~&>^=ri(zI*<8(QS6z?wd~0y54#`J z{(CQ(F)+GKQ!X+8R)J}*aNE0;9EfhBHT|!Zn#Q`yT_^wV6qtXnyflZ0+f$8(RemZN zTz7%?9~7GnjoY!48vYkbmz;Vd?<`%K#^&Tq&Ko^)a!!81mT*tldI`gPaiwx<4`=#rI`22Ncy0Uq@M61^PoLz{8 zZ@}aRMc0Ot6dat=v>u|j%M3qf4LJk)+25mA%fF6S;ctL47y`|LH0D4!c5Z`Prr=#9~v`MU^;rl|g+EUIw zutnNfyaio{t&(i)S9HNP|hnngQSekH`mUnwv82@c`@~_W|Lqz+WQ4w`C1NYh)BN&l7 ze8x=rR*SX$a>f{e+gnPBp04W86tZ6PXJNijhNyP<`O)UlzLa~{fVxm->uEgPyjsb_ z&22XAK*^&mHr6pWd~a)6^2oq4zW|r;3u#vwNmMYhz{no?i5Yy#7A@Hiz;+psm1Z;^ z^+V+lh_wfS@?&H{s}>UynwJEQF3{rRz&8p3pO)UgYifEG zN$%UXch{7Debf8o^z7F+yI7m&Z#qGl2+l2w< zl=-$gK~*g8P*EGGk9mHdR^7ijARPfl*1l>@pG2&hiO%@($`6u2aVFw$#<0&k)PUw& z7xb1@tBOt`Ze$xx{^?@Lt~=0a^cadw{K@J?;JdUd;*HEX+aC$hF8&c@(_iQMca>E z^$@DsX5n#Ag_Vl7pMbk1Xu%T5!Q@1x>sNd&IA~$Pzc)JwUb`2@T!XQMvaw@>q83mL z#mdL+pq2&LivDmv7*_O0vjU%@KZX|CciU}El8UdnA2@#2LpRW^ew}nbTDG8)KTzYi z4*oO!l8gTce&E-$LxVOg3+Dhayx9rw|pM>VR!nU;;eml z`gyT3r^E7#E3>p!%N!XC$_oEjnSQ>}h3u8mA{=_^?3JB6=)3O-S3kdU;d=T-l;Pr? z5ev%-+IhTp_Jw7$o5&!G+k_OkGBEPA(DXl0)>ikKqZo!!rVJR zXp}*&l)2qN!==U-K(i$}0Ys%!sQ4KOEi-8R3uva~bX22rB?s^#vgk#Sai@D>ArvB5#TmDYt-2Rku3k$pNq2969!sqXxUo>AAMB zpl}FOmqIbN@3mmF*J`bn$BAOHK#~(gphylOJ5-1Z(O%wH2Kr9kj}|rHUk!LL5><#F zMFZiFNHrACh^i>&l0z!vnW!WYq8*;Cf#j-zTP(Rk3@l6(!3b{@85Ps=@6Va!$(@ZP zPYXGJ`}XY+c)ci}V_HtW9P*Q1RA>a2$1-O|Zh?rjVp^LFp(#-X#bY+?Pk_5n#B1tF zG;u|S945U4#LzP-34tqfGyzO2!4UA1>A-83PM8lLXl-r^b@Sbl1Zwax8XW&MN%E5j8jF4Zd zqV1-;V#p-L$SK-|+(7z-!Ca8=0V9uG8a*^eK41&?Q0h^l$|OaKRzYP%$wsNkX-T!# zQ3z5xcvB%zv<-=}?6m?<_ie5Fw${DM9ccGk_YdFUZxcO3#P1$3)GP5Glri_>rXkLu z7N4VuBFcOd;Ksn62)8lZJh+|UPJ`PS?tO5nBjbuo&Dex!Y?zaRE!hI3<+<|a6!W{v3lO{Yxa{)Gkm8e7(ZnkH7Vb{C z7~>Nt%8DqTq97}}4)+jT7gF#exHaMKhZ_m^Q@Hf1lRuRVb8z~K&A569y2Lh%bc%Bp za*6ZI*ND4vxi-voV6F>unaqu0ZajV~Y1%1fG5G*q(H^ZK73o9^IYoEodRnN1Qw(7;hXp4wm&e=!=9XBfQ$WT>ARhy!HZt9-twP+*RS;;TeA`-UY$kuKRWWM*5@?v;F4e+~ z+DAgGKVij+lqs~maN}^UD9Ji9PV>yNiK5D&=fJH6cP`v$xW#bkLGH(?>IXuqdLZPK zBPWWxXvsMRl|_nkS;#4xGuMi_ZeGqKyN}8s75hq=ihaecU~Uz2s533O&CKm*j(%gM zdz878%$;ZMl0>K~oT4h8R|Q<%LQe5Gb5An&8gp+l7m6QM>4sa#DPowb&s-97Y0PEo zc!`v9UnV~VdQc|yK?^xW9b^$DSI5V#Oie#`SB7 z-ote!&QS3ct~2OWGv4_wJ7h-(+*+?xXP|Y)$ETx8;=d2oJ!5dIG9n?B5eYeEO`$j{ z5EX~_MIx7=7K`G7nG0pEHFNEm>&{$H=I*D~i3;RFCf6~yp1Fg}eZ|}<=6+$0+G@() zpUj0JS1FE0$yKCdEi}m`8Zz051yh*IVy-uH!n$aw423mW|> z6KpFx8e30CYCo5Jd%CCY$>raGkopY>ImJ)7DvoLk#ZkqeIDZQv*D^;bujEphql!Us zQ<T%M1P1X$6jA#w5^{+La3$mvFImVX)-kt@xiaR?GDj7>(#3at ziClu}a>X@Zt_gE5Qd?35{3?^%m@6Yx^6wqsODMm&R}K1BM`3^7B*sY#+Iny77X}94`-Q^8&{-+^5hD*6XpxF}D z02(M!U7#0$9HJ2r>3Tv%M?j@a1s%Pe4lxi&1y=-=CzTB#f9d-q5RGGm3aV?~l-yfD zDl#;XNe>fBqXV*s8!A2nQek`p^t#kI0W`C|6r?V*@}_F%Rq0IyqB2Mg!MU=V>Y*Bl zUNt*J=%BGm%IxRQGq-^$6V5aulu5eeu;Mutpdf*Yr>~g3)<_CVeB? z0$dsKm?oc=2EpVgsT}C62H6;jiCBP9RT}8j#CFPh82QzlqNzv`E)3~)3Q30{HG(!i zZ%Qt7Q$nbCd7M~ub!fOR`HooACr3wRz34Kc=f((OP#|I-jri7Zgy}&bYr4kBJ4b+j zpd%_EDB9r@5E$JM(f1db$U2BK#hc>45$-1IzSMHbFSJ6mFr9BK=00-Fs5ZyXqnRUS z=;5Bq^6q!^bvmKLI~+ZzF!}r;c;0mB7a%IZ9(57X3C|fjhLdNJ^iCBu?|8gedOT-< zZ_#C!lSWM|d51q~)RgRWK>Rd8vkT?;v4_(6wzTci+Q9T;(F@~MfmR?IWg#5CsAldO zaiyZP+8rTVBd!QJz~AW&_0B<8`X#(PjgQm#Y75QJ`0S&q)#p{lV~>{^#5>GN*{flQ zS^Jb;+e71^56eiR-HU-$HO>iQmPL|7nSL+a0Gw3K(eX6~=O{zt6)rjj_YB<2a8JT* zj^v|zN@cqL2i((e_gXx3C4Wjowj)7$6G_k)0nt4LL~R5${zOQPKM_(bdc{#muDH_{ zatUfFC@vRPl^pfg6<5gIY(kXnonj4>RGBEjwup*S?r0&W7{uH#<_ejc&D>+mJ;B^j z=1wwq&DPQz$PFgnK&hhwe%nI$#LV1YLgwK4wsx-Ghb$S&? zo!-7i?F(}}cTSuYn9MEe<`1=sKw0{@dA_fk<~O@1Nue$F}uBUnB8|P z)T^6c5B8dQXJW=<;IdvPusnQ< zXvxzTT$)zNtbJYY-lfgjh0evzwYeAHI3D=Z^rY8wre@nhA}0KD!>sqq4?Y`*9jm#0 z!l=pH*Ihi=^VEiE{y`7LUe|jMN=O*`*pxVT{1@lOoa}M9ZqL!R4ClpZNs%w!%zf*= zVGC~7e=_`!@0QN+T&i)k|D~eC^Zbuo{&nT}Uz*QyU;KV_Lz`{XgjXsZ?qlCG$d;9x zcRu3Mwoh73{b+$IWz)HwXY3)>U+ z?VmXP?JpW8UyA*8%3ysU!V!8x8%`Ha7aVpPw{BF17W0N*ue9 zRQ7R{x&AXP+gN)k#^=Y?$oIy+Oa08W0~l26blKr^35>7N^>S2Db0EB^V)~^QF`#5K zN8Z+}`p|^3O2#9XqXOu25Xw-|Xv+&Z# zQkjtVQSHJl)r3ejZ`c(?-QL0E zGovCU#6uPn##+?!r=tcl)C-`)$;@^|;9iDBmD|S_6~RJZTTCP~KUquwGsxWXpz4KE z39VvHI%vFj8Mnm*Gt<^$ypM|TsS`m*WfmH2G0~FA$r(Kv#kLZ%7%FfpGI`T-sfQsC zZ}5{XJKn(1zqy++m)h-BJkQ)si?{D#cHYArzK8ks9)`Ln<&nzCnKB6#+#L)-Uyn*Z zH2&QJ?+gz5)JcaQGgKEN{<9XLv-i?SqzQx&>bB%(Ns=6 zHRBFy4z0d%;?J74wKgOCW@LDvk`PxyPoeYa4QZ#%e8|rpYYe;|So0@~Y*|;k6W^nYAM@L^p9dn|;M5gxId|EgCoc74@+Lmwb_BFqk z`)<|EPVmk0zR*|l8sqKr>Rz%!ROS4gAtuNW(ZZL<17&_+mTNV#o3B%djV#~9rJr3Z z_w8#pPm(WLprieu7I(yFh20Eu!I#P-I(l^&*0o%Bm)*>SugCi={iBYrDfhi;C0lFg zRZO2YV06s~S2|{I*@bUo-e>G((Iit*t1X!FRQ+br;5n8SX-xJpe?wHVsHmo6dBU?9 zBj#DQzMumuv0wF$V|W;VHT4XgYbTH%Q!_^f6bFFAX!$u~6?4 zR<2viVeW>nG5kiDt&PLHLHMy7VQr>cc`^|i6=RYFM%NI$JPND!$E)Ox*Xs^*d?kD2 zqc_8B2OZ{ffJUpEVQp?$#!{eC(O4=NUGwIDWzuV`k+10tgoU*?!6}}TkvDlv?u=~oNRyMA#~CZ?*DUFAD_?Wx{Kd>EkyAc|VFs3H5mjR3yqlPW z*1|$9^ckHc({_TN|pWxQ#NdGBqlyB3y%Hz;>>AsQaD zb4KUoO`4F4)r-x|q!O*^;)XV@6y2RM8_YnP7SXD0+tzKHyXhF=%+$t;Uw2m-^Yt+A zbU2Pb8M6`ijZ>J6^|P5t z`1mgu4;MOWVL&_wkRNa1({XHxL$FSRh= z9buaIC`>bJeW}&<{Q@_8s$o6EMy-~M3eQU6ny3K&BnkjXV=rjJB?Ma4P>zQE|Xe~=j`586W_%txd^$+DkK0U z@gMP6@@X|(Tbplevek4n!e`cpJDU3`q#rtI;_Wo^65;6?nz+BS8BuDBuCyKv+n4Ag zERJ}&4#@W*OceQ`hh{$eH9aV99`31`(>LPgCce=|XKUuouaIn%j;*paaj=*97%b^Y zy*1e_boHsdziVr~0-n`Qrid%d?=ME8Mx%md^` zDpzmUM;Qr%k^X&5_xmuCYjKUiP3U7zBkpm<`BKvFw=n4(v~UgJ?<~Epz}NejWu%wZ zS2G{^R;#P`?<)iHrIenou%kNgQ+>_gEr?J_UwVRQ->Tqz`f0|<__}%xxb%d*z{U47 zH;~-?eyhtUKK(TFb9&I%`BB1Xd zpd#sp*3SdX0}#^v2U<@ZWdU2ef$DeYH&BMDj~}SCsO9&t^3%6iTokxZ2AaViz|uKz z?;z^e2AU)2zWN}gN59R$K{87E0*fQPX9mef+-gzOJ~}W+#n?93dX)Nu%{BB0se?5` zYhK$ChZpA6!KLTRY$Xk1UKsJ%ckc&QUfJ`+z!`@I^qB5h8#?oeoL81z9QMwFUELP1 z!>?mAd$rPHOMm^vwylOX#(dpJk8-v{;pB(6V!WTZ$45`Gk3qA=oHtBMF3oc2OBIjq0GsXlgmoft~)PMIH4Jjn?@1nr|oS-OR*9-M@5AC*4nzi+oD|NYv}w$UoQ| z)KyP4yQk{@=9*M}Piegry_OO(gVLciEluyDo59KOKioyfs=*B1xAgtadayL_Fn6X| z3y;j&>G}Y*tO%%PWh^<0lS_u$cozkk_HKFuPeZ(GE^!cj4?>uQ0Yu-rT;hy{oMIlj zK=YBlF0s%;PVp2_vE-h!kW-WZEs$KPg`8qP&_c-_un=Y$04tS!(E}Fe6c1V)ro1lz zL}3ZRB|tNz;0lX#iia!?lN5pKY9#lB#bLnR;+*0+i^J!7pjeIM)>)iOthYF)c+29P zLVNp%%0;EGch}Dbc~BIhe@b0RYUPIF^OAQCTOS}wdx!k0pwLd-E4iD{_FgJ#|Y0MQc zw}81N%ss)}GtAL6KpCz_&^$nbPC?mTMdo|vt}yo}a}MNiCFisdCWkZEh`B`OQkm<+ z+yII2{7x~Q$wC%|;$cc8O3X-7FZx zTq1L+%ne~Khq?Qidyu(h%ss^12If2)ncT_bUgi!lcbK_%(FA-@z7d-&LB=uJf>7x{ChE`YR@qO3TWEfx;H46OG|o^t&6;Xu zhn&$*wX#D_(MEe52*W^<50#U!scjr8r)JWOJcoFXt!xDvDSbc0b%aFdhsbFx4iP{F zlM0U3o2cMu1zMpLqz}6)V0yEYAmN}n#g@i9KrJL!%G@VF?IiaFb4P$^dZ0sm$K3Bg z6xt+*xCW>Kxe0_W1O#=w1u9wrK*~21sH^m?!M@FaRJ}))PNwu7$i5TV_aQ>Ewm6X| zYm4)Fs4cE^Fhi!HmPqYr#*_O}$I@QY^xu3v_u=VPZ9z!Y7KEJQ6t0Rx?@=PBxWe3@ z%%K}+$N)B42#wXKoL3KQMQiIa=kY?9n7? zrCXc1y3EnfO}?ltl9}wmg1wlV&K!N*R|Xd{x0E@WVXXqDyrSejVvh2P;;2Yha+DeF zQ?*40{AP+wvXE2IudFysyS9{vGDpR?GWZ~K^O;-A+$+regSme)*V2ygRUmCqt|^1* z7IKNM%#CC&mpLk9l`fUBN_Qc1OPPCtxtE#y(aU+n878lJNpXWY6sT4pRGz9pS~1s- zxeVsIG1s5D!OTr%ZiYlXDRVu=znYnGuQR%3jc#DOc;sA4p2$e3Gqc?F`MO`d1 z7&W*Zf(ku_IxyB)e$;hv2x?g> z(nKRX_D&P-+l=49qJj}jl z8C_*LKcu*dOdyc563wV7kg}J~a^2atHz9hf9AY>NPGiCQSdeN_WqLKstz)^j*!M$5 zpRn8smivi)uQJjd2w%mpD)NMSlA1s&xOhe#fs|Y}a|3{s##rWNu-rW6mayF8K#S!A zKkfDPh!>cA)k})4jP?MjfWKny7?2A1ERZsIfqi{YkE`g@ie9DbX09HP(rpQ}m>Lca z(Vo3~G8zJ;lqWJb9Y`sAfELRqS;)R7qZfgc?z_yr52SQI1X?V0_xK`w71tvycp6A4 zUt#VhkWzN~d6k2Klx_^8IG`ocbRu&ZKuVVu$S;<@gW1!Eu z@=NSn%4i4B5~+KTxo?1!?pYwEdx3pz{xbR=B!3{_5~*BIk>C=TO9xVBy0dQ|=0-6$ znb9mDWp5eFtzzF78NChUQG#VGxSPGdVe}J_lDo=sH`zDP>HQ&U04cd9Kq}G+?3>0Y z8%W8G#$bmfIDx(AFj~xlPqEw@_AO!b0m~g^xx?)H3!^J6=fq@@Wk~Z7hX@8-Dw96~ zNH)kqVt|ssdA}S_D*bVVe%s-pp%~Q$Q-di&&K0TIOi!isIg7ZWD6{nfr~KCcbvK3nERbM8|qsbE=mgvIz^b56g8M@$XrwAIx&~R9JL(OgN$LWfVo-BtznKv zwq^*~21`TrsRk#zSjZ{H0I7k<@fLE5`9RdlafwA1a*8!TD&Ut0l{Pl@8oFm8epZKE z->c9x+$%Jj5xt?sQjXeI3nY3SS0(oqkn*LsPx&SyY~@Q`Fy%`<8|C{f`@TYNmGa)g z-t;~wWqJ#gN&_Gz*Aqzjjs%)7BU8X=5u+y=z0T-;M*A#;2FEcb|HVktVcN`jT5q6D zDqZ@tuKRdsuu>I2gj5%hkW-w-RdHu6bR9IOZOr zgi;0{W%4=Z)-p%yNR-^W%>9$O-OT-qIU4v?k-5#Bj+9UwjR+D#@za>eGz+Pfb4qXw zb5sy1ZWeP7Ft>uaRm?rZ91RmH-Sy0EAf$?)Pno3BNeLcj?tA8bV~)lZl$-;7r>j?)`k9I>WWm|Y(F80N$WrE>WbRq!-em3_=00R@7jvI` zxf*huTm{_M?hRxhA+z?2`j~`?c(hPa2iIEo86DVS$2%TGUjixbIYbJOTcS*$(Q?gU z{18BxktZB6sU<#jS@-1jwlK-i@lvVnC4Gq2YdWx6p-4!rP$c9O&*Q4N7cJxzrOeR) zl#)wBRFoWjnwVbt*30^Ao7F3<2B{l39ild_qj83cCb*81s5`E=aXPR-#Opg0XcEp) zF%nm$OVUc0$~C3?8qj2%p>j~n2O&EI#c7n}c2Y)DX1)eeV@W50Y*O$PkP@T@hVpg7 zX9Dg*1r74}NjVzYp~5y)i~({Jv-zCNo9ss7FUxTy{;;_{y<8XUQIRZ_55oz>{YtqHQm=oZn3D! zHcBQ{wh?lQ?{QTeJ-Om;F-K{lxKsp-f-ml=1}&ImKiopyH+xD&6+Be#$$1UJp|9aXPREnHP0sL?wmt zoyKS$qemIN$Y>*@U5u(A)MDH@LTD=MdJmMG!M^m` zD-HVAr{s3B+U+@) zr8Y1Vij$5>rTTk%d#8s+|5X7&NEHx-)Gwnr`ehVHJubyzvXjM83srH{3sZ7!nd`_L zC7Y7#!CXG2sv>7HxtO`-%$dwl@u33Q!Q39^zGm(SbEla*%N%XBMOM)G39_J5L|Mos z>M)nUTx;f1nd{6PO-WY|LgkT);5g=JGP>fZ-=^fK-&RO<5(Z$Ie2xWoGxsrb)Lm1` z-!eyEQWQr`TNOx%gSFD&UuxTgTi+ z<~B38-^+Q#0VaR+lHv?=y4@Q=Ukf<}eGgTUZpIva8C4v88C8*?FQba1FQbYZ$J``| z@cd3OlgT+OxR|-+%)QFo8_aEG?gQqIFn5AE9StrO8D9%IMHTv5s>o_g_GH06%+dEy zB{!Nm+ALXd`OFnFhrNlUFPd!3y~y0#%y~+fJjmo%%ze+?Ddw&)_a}3-@4JdjpoN^G z26K_jwPUW6LUKb|CVR8sEao0yj)r_yAS;+#&)f#)b~3k@Ir=!EbPqFk21u5FE^&^@ zAYZRw6$_zUV6F~x-I=4&T{7(yIn0e_ZYFbcm|M);@(xVC$mFZcjq&qFX1s+kvjRa? z*s$5BwcN1T+__7y-y;j2s+K0CYH33Mez#^Nw-+)>uH61Sxgm5_pVsihfvha3CMd?4 zY_1w+tEq*V$9HJq@^7G+*LP^$G+}PorN>krBSaCTXv4W8-s1#RF8*>7PzV=IdyMxB{vY)k8t8c2d<+eN772}exT`+ zTa4>|oDR8loRV9Od({p_-QT*;UC=1J)nD_*72aYN}5iVjc@FWtlbi;wP;iW4-*I(A|_>zfCjZ~&4 zGl_)?>Zz{8d1p_Ra^_U&OL=dV^qq<8D9KT-e^PR9;YxWBn;YY5NVEgj*%Ez>>oXF4 zLG6R*B|M7jT8Vzbl}tIrZ@5whcF2v~-jJvgQll48sNBGh0&<8};6_WX7tlMBqaR5{ zi<;XilPqAg0*GEAjH0aqoFi2p1A0Irn$R|vM$xL9V-Cq#7KMi}%c50^x%v=hSIkQ> zH^J48mwtIjFSVOL736BAA?+XsDdh+9l|HCFB(OK=ezv#7qleQY#SsP?*$eA{7KS{Q$NGzP%^?5YfdCwh)CO31xR}XS6)44R(DG zSol#v{PN@g>}2HEwvETWeDB!{ZQB+`E>E^E&1kqR*>6ck(}c3Sw+SkGu!HEca(IWJ z1)oq(9x$H5xxI<^3ZE$YP-Z}9J9KIK;jQ>7#L{7hXjh}>04D~n>~Usy`W4a3yWtVG zl@BbOyfS?oc3CgOxfADJocnQ}k;c7}5yjVh3R8kMrSD(XZ`+deqd}fc>3f%?9|N;< zN&0a(WlPdeV6S$y{d)f;{Z23GchZVX01}4cl5pg#V_CnG@Vi}j7!k9)?ZtBsh`BvT zd4SqUY58H=V(G~2+A);U$3A|Jxs^VmnY%3F1$D~SU&Xfy|hu+M}?t7 za*FrfzAJ|;>vwu-+vRhQE}d;((#vn*kwO=2Elmzsn$_m4|MJuTg55m|wN&lwhJ3*nnBX<^6^F&lpGzFYO3xPJ`L`j6JD%zd^8j3Si{;`9>5`B*=m8K3^ zzVwkCl^|Or7ejSA4Jw4nDr=BLR0dM<94c~wwoAcDK%*o#7f3~62~e5zeF$i@^rg(I zqVN;Y4(Ut%OBKOCfrdyqU%dOfftoo)B|v353`j+x6;OXENS{AcaMUxDy>`!PpfvdU z;iQ8`a6{nYwU#cm67KZxkxEkJOM8N0n%rIfPe^}djY^HcyZkRpe>JdmL5L_p^Rb)X z^*1;uQWS}~HZ$v}-YAN;Wv_<&P@E{-Y}GJW)d%NjY{=fy7D!tA5oO|-u}nSE6X{vloyJ>*DOD2!zziD|PT z+KTBAO0j4uQ(&WQk;Wr_e%J(E{&B$^{0%@Xx=#(EAnBlH7KZ5%ja2F>%k-jF4z?82 z>S8ytWDiz$kpd+oomAb?C|Q`~)V5h`BsU*}=#7x&(&Q%Vl|_08c99aN5gpQ?G@`BV z(vC^^n9%cnXXZ`Dn^H2{LG2R^Z*ZS#7}8dfKa^I zJIvagpR((nnY9vlN-|1Aq#)f=V#(V$c}vM8Z{v{(T=G#U!MuM8fHWvIq(}?W@Ptr8 z$ouB3LTTbv2^7OaT3Wv+y%ciuEAczfNts3fIOyF!54SDOLl*y`5Ji+bcEOE?y9X}4 z@93NrHG-R^iK4bt{e1$0N~HsEsn3W0ND-CO_|9B30PZ(%N5lOV?l`!lNHIQ+`(n7? z!F>$w4{#}~{Ro%7R-c0VE?hK+i!Q;v0QVZ)%W!Ed_X=E3BY-~vs4Yx_9pK)Ci%u(6 zn2RDRPJG~wfa?pFzV7(LodMSccP3nl5H&jk;Vy<74EJ%k_&QYdEL^g)#=56Z8mNAX zcEPPqe=Xo6fLb6Z%hiVKKvJR~RTK&rU-ac}&W+*Hi;Gz-MGfILgG*m~;^5LqWNWyI zaNEF5h1(8pSGW{08iDKxHy3Ua+zD_~;O4h-y!MQ9rkGV&fqhwWb zFEIBqbNiV4jJXrcQFl@4QYVp+OL(Z4s7M;{Rb&+lIYl$(D4CTUO@dZ({g|Vf35ug+ zR&s^R(efC@(TJ{+qY+&o8t9^~fg;~!!B3ex$lUkL;bV+tkOp^^u8)PBf+{b?(J(I| zr=Ve8#nCXY;^qT&R^%ck53=A_%vJXBDu-FfDH<~uN2v6L|kHYV=97Q1N{NH z9++Ih-t*=5pX!t@jT|YtY0MQcN8dV?9KC2t?nQ;hBj8t=qbue9b)dyIw!H7d+K)Js~w* zPe^@KSKLzED~^gs#g#ILriI1TvJm#?W^NTBicQVP+tci~L7~@D%?&^vl|%p3hH89QZ;*8G%%ToXYA~x~p7nRnspXwy1{d1~ znA>-0H5$65w-35A<$rXM7TRMIS+^dDMmUmGgn?LPYP+>2mB`QghZmE~w|>`Kcql+x zmrsGlNONd%`l(3^``}VUK7~uonLapG`VvyF~??KYh$)Yiyb3R(H#W@duJSyb&gGU0lE=XNFc%A$D)?R7%kNo1fOTp7y9S`n)TIBtj`OW)>>i0dn zx!<6ZPl!}_{JOU?+-lwUW1i|k1UMozODMB-R4bc7a>kwIqmzdh4=oto;l`*KEBPY)>AHw8@qV^l$(_f zb$KE_VO!#f_C-q{p4ao+_xirP6m(obmt3CI?dY2SI{hX;(KSHgX$eNoBy<4V-y zTkO_$l|!A_28On)RQqVsewEZuk^5CjN^MxFIBZyHcGIwBR^T;nOypWJLNYm4!9-+?SzWg`Fo(Wss~ko5 zbLk=vul;4#eT3O(ovncGF#ouR`84Jp>V(Av3%4wv zF@4N@+itHj<&x#$#~#$Iql11qD$0S>Zz}A}(A+0FDl^l-VjRr0v6x6^x|)eT_Uc`0 zKv5SlnOX6zfcD@d#vvJcM-EhA+Taf34|mA4#ohPBm@oL)YkH`Cz6ien{Rn93LRmYz^OB{dq>Xm>IfiNRSebDJ0hRL;0)F3uXCJE>~KASUHP)Z<%Y z)r`dA0|qgOW4TN+G5+R=V0)0#ZEo`r znHg&4thYr~qe6_1fAotzQEq3x`8YhyBtHngXYM0>A8>10GD`=AUeSIW7+tfx#p;E1 zpD(xOGJT!)DD!)=R@dwZoaHSlueX~rqg-$tl9`U?I4hc`vc7zy!)_~o1m-`~L1DH@-Bp{AJv_yAaO>z@8lIcc6$?j0)vf zT~h$$uk9|^+HYx*jHPAXcG)Y%SC_*0QlJoaO*21-fbCa5GYQ*RR`XVw506Pj+t~X6 z4b8$p#3UsEF&XV|u7_kiHL&Sed~582a>=Ls726q3#Z>EJz7~Lh@HgedgHY4|NVfjv zZ)V|!pK9iYEy&^CP^+L-K}R>76>W7lyH|p(?oM+H*;-Tyw&pp_^JGibbfi|j5D)FO zwb`=O;~raC=C80->0g!rb!u$phr#wL;o)Qj$73s&{8(wrr0Cm}7Ah?#(SellE>e7u^zIK0~5`!S=8=7pNP7 zV<1jtt9~UR%8(l6Woi#FCo3@1Dw#ur?cqZPK}*NqDON}CiCNEjtzcVgXwgA3HtaZ> zQ!ryfZa&p0Di@O9X2{r?xpNQR!RBYd_L{wRSVjg*BXJH|WW>dQ*Wpv5P t%7zZExH45X?nr)1(p>0biR=1b={U3pJpb-E7 diff --git a/libdvdcss/src/css.c b/libdvdcss/src/css.c index 55cb8df..b3ca4e2 100644 --- a/libdvdcss/src/css.c +++ b/libdvdcss/src/css.c @@ -200,7 +200,7 @@ int dvdcss_title ( dvdcss_t dvdcss, int i_block ) { return 0; } - +#ifdef ENABLE_CACHE /* Check if we've already cracked this key */ p_title = dvdcss->p_titles; while( p_title != NULL @@ -253,7 +253,7 @@ int dvdcss_title ( dvdcss_t dvdcss, int i_block ) close( i_fd ); } } - +#endif /* Crack or decrypt Content Scrambling System (CSS) title key * for current Video Title Set (VTS). */ if( i_ret < 0 ) @@ -273,7 +273,7 @@ int dvdcss_title ( dvdcss_t dvdcss, int i_block ) /* We cache this anyway, so we don't need to check again. */ } } - +#ifdef ENABLE_CACHE /* Key is valid, we store it on disk. */ if( dvdcss->psz_cachefile[0] && b_cache ) { @@ -294,7 +294,6 @@ int dvdcss_title ( dvdcss_t dvdcss, int i_block ) close( i_fd ); } } - /* Find our spot in the list */ p_newtitle = NULL; p_title = dvdcss->p_titles; @@ -329,6 +328,7 @@ int dvdcss_title ( dvdcss_t dvdcss, int i_block ) p_title->p_next = p_newtitle; } +#endif memcpy( dvdcss->css.p_title_key, p_title_key, DVD_KEY_SIZE ); return 0; } diff --git a/libdvdcss/src/libdvdcss.c b/libdvdcss/src/libdvdcss.c index 627fcc6..202010c 100644 --- a/libdvdcss/src/libdvdcss.c +++ b/libdvdcss/src/libdvdcss.c @@ -91,7 +91,7 @@ * "C:\Documents and Settings\$USER\Application Data\dvdcss\" under Win32. * The special value "off" disables caching. */ - +//#define ENABLE_CACHE 1 /* * Preamble */ @@ -204,6 +204,7 @@ static int set_access_method( dvdcss_t dvdcss ) static int set_cache_directory( dvdcss_t dvdcss ) { +#ifdef ENABLE_CACHE char *psz_cache = getenv( "DVDCSS_CACHE" ); if( psz_cache && !strcmp( psz_cache, "off" ) ) @@ -299,11 +300,13 @@ static int set_cache_directory( dvdcss_t dvdcss ) print_error( dvdcss, "cache directory name is too long" ); return -1; } +#endif return 0; } static int init_cache_dir( dvdcss_t dvdcss ) { +#ifdef ENABLE_CACHE static const char psz_tag[] = "Signature: 8a477f597d28d172789f06886806bc55\r\n" "# This file is a cache directory tag created by libdvdcss.\r\n" @@ -344,11 +347,13 @@ static int init_cache_dir( dvdcss_t dvdcss ) } close( i_fd ); } +#endif return 0; } static void create_cache_subdir( dvdcss_t dvdcss ) { +#ifdef ENABLE_CACHE uint8_t p_sector[DVDCSS_BLOCK_SIZE]; char psz_key[STRING_KEY_SIZE + 1]; char *psz_title; @@ -465,10 +470,12 @@ static void create_cache_subdir( dvdcss_t dvdcss ) error: dvdcss->psz_cachefile[0] = '\0'; +#endif } static void init_cache( dvdcss_t dvdcss ) { +#ifdef ENABLE_CACHE /* Set CSS key cache directory. */ int i_ret = set_cache_directory( dvdcss ); if ( i_ret < 0 ) @@ -485,6 +492,7 @@ static void init_cache( dvdcss_t dvdcss ) /* If the cache is enabled, create a DVD-specific subdirectory. */ create_cache_subdir( dvdcss ); +#endif } LIBDVDCSS_EXPORT char* dvdcss_get_cur_disckey(dvdcss_t dvdcss) { @@ -628,9 +636,9 @@ static dvdcss_t dvdcss_open_common ( const char *psz_target, void *p_stream, print_debug( dvdcss, "could not get disc key" ); } } - +#ifdef ENABLE_CACHE init_cache( dvdcss ); - +#endif /* Seek to the beginning, just for safety. */ dvdcss->pf_seek( dvdcss, 0 );