Aleksoid1978 / VideoRenderer

Внешний видео-рендерер
GNU General Public License v3.0
1.04k stars 116 forks source link

DVD playback #8

Closed clsid2 closed 4 years ago

clsid2 commented 4 years ago

I get copyprotect fail error.

I think using CMacrovisionKicker code like the other renderers do should help solve it.

v0lt commented 4 years ago

My DVD-Video is playing fine. Show the error message. Which DVD are you trying to open?

clsid2 commented 4 years ago

"DVD: Copy-protection fail" in status bar.

Any protected commercial DVD should trigger it I think. Ripped DVD not.

v0lt commented 4 years ago

The code "MacrovisionKicker" is available in MPC VR. It is the same as in the EVR-CP. Added in 089f3bf05f22a625cef708280402492aa8397cab. MFC is required for the code to work (see 33161787266f1bb951f94dc310486a055e914b08). I don’t know why.

PS: If I use DAEMON Tools Lite 4.41.3.0173, then on some ISO files I get this message: DVD: Incompatible Disc And Decoder Regions (0≠1) If I use Virtual CloneDrive 5.5.0.0, then all my ISO files open without problems. Windows 7 SP1 x64.

clsid2 commented 4 years ago

I did some debugging and CMpcVideoRenderer::Set is called three times. First two times with Id AM_PROPERTY_COPY_MACROVISION and then AM_PROPERTY_COPY_DIGITAL_CP.

http://forum.doom9.net/showthread.php?s=151333341d59e3ec1dd15949576e0b21&p=1599257#post1599257

clsid2 commented 4 years ago

@madshi Any tips for us?

v0lt commented 4 years ago

Please check. https://yadi.sk/d/X0EVMKP4TcmnHQ/Test/DVD-Video

madshi commented 4 years ago

No time atm to check your/my code. But if it works with EVR, why would it not work with your new renderer? Must be something else, I guess? I've no idea...

clsid2 commented 4 years ago

In case of EVR it only intercepts/modifies the macrovision call, and just passes on all other calls to the standard EVR implementation. MPCVR needs to implement everything itself.

v0lt, this makes it work:

diff --git a/Source/VideoRenderer.cpp b/Source/VideoRenderer.cpp
index be96f79..9c51ef3 100644
--- a/Source/VideoRenderer.cpp
+++ b/Source/VideoRenderer.cpp
@@ -585,7 +585,7 @@ STDMETHODIMP CMpcVideoRenderer::Set(REFGUID PropSet, ULONG Id, LPVOID pInstanceD
    DLog(L"IKsPropertySet::Set(%s, %u, ...)", CStringFromGUID(PropSet), Id);

    if (PropSet == AM_KSPROPSETID_CopyProt) {
-       if (Id == AM_PROPERTY_COPY_MACROVISION) {
+       if (Id == AM_PROPERTY_COPY_MACROVISION || Id == AM_PROPERTY_COPY_DIGITAL_CP) {
            DLog(L"Oops, no-no-no, no macrovision please");
            return S_OK;
        }
@@ -610,7 +610,16 @@ STDMETHODIMP CMpcVideoRenderer::Get(REFGUID PropSet, ULONG Id, LPVOID pInstanceD
 {
    DLog(L"IKsPropertySet::Get(%s, %u, ...)", CStringFromGUID(PropSet), Id);

-   return E_PROP_SET_UNSUPPORTED;
+   if (PropSet == AM_KSPROPSETID_CopyProt) {
+       if (Id == AM_PROPERTY_COPY_ANALOG_COMPONENT) {
+           return S_FALSE;
+       }
+   }
+   else {
+       return E_PROP_SET_UNSUPPORTED;
+   }
+
+   return E_PROP_ID_UNSUPPORTED;
 }

 STDMETHODIMP CMpcVideoRenderer::QuerySupported(REFGUID PropSet, ULONG Id, ULONG* pTypeSupport)
@@ -618,7 +627,7 @@ STDMETHODIMP CMpcVideoRenderer::QuerySupported(REFGUID PropSet, ULONG Id, ULONG*
    DLog(L"IKsPropertySet::QuerySupported(%s, %u, ...)", CStringFromGUID(PropSet), Id);

    if (PropSet == AM_KSPROPSETID_CopyProt) {
-       if (Id == AM_PROPERTY_COPY_MACROVISION) {
+       if (Id == AM_PROPERTY_COPY_MACROVISION || Id == AM_PROPERTY_COPY_DIGITAL_CP) {
            *pTypeSupport = KSPROPERTY_SUPPORT_SET;
            return S_OK;
        }
v0lt commented 4 years ago

@clsid2 Thank. I added your patch to b520f1d.

v0lt commented 4 years ago

@clsid2 Problem solved?

clsid2 commented 4 years ago

Yes