2009-09-20 3 views
1

일반 미디어 파일을 재생할 때 제대로 작동하는 사용자 지정 할당 자/발표자를 만들었습니다. 그러나 다음 코드를 사용하여 DVD를 재생하려고하면 스택 오버플로 예외로 인해 실패합니다.DirectShow DVD 재생

vmr9_ap = new vmr9ap(); 

HMONITOR monitor = MonitorFromWindow(hwnd, NULL); 

IGraphBuilder *graph; 
IBaseFilter *filter; 

IDvdGraphBuilder *builder; 

CoCreateInstance(CLSID_DvdGraphBuilder, NULL, CLSCTX_INPROC_SERVER, IID_IDvdGraphBuilder, reinterpret_cast<void**>(&builder)); 

CoCreateInstance(::CLSID_VideoMixingRenderer9, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, reinterpret_cast<void**>(&filter)); 


builder->GetDvdInterface(IID_IVMRFilterConfig9, (void**)&vmr9_config); 

vmr9_ap->Initialize(g_pd3dDevice, monitor, vmr9_config); 

HRESULT hr = builder->RenderDvdVideoVolume(L"G:\\VIDEO_TS", AM_DVD_SWDEC_PREFER | AM_DVD_VMR9_ONLY, &status); 

builder->GetFiltergraph(&graph); 

IDvdControl2 *dvdControl; 

builder->GetDvdInterface(::IID_IDvdControl2, (void**)&dvdControl); 

graph->QueryInterface(::IID_IMediaControl, (void**)&control); 

HRESULT h = control->Run(); 

스택 오버플로는 control-> Run()을 호출 한 직후에 발생합니다. 그것은 내가 정말로 정말로 단순한 것을 잊고 있다고 확신하기 때문에 견과를 몰고 간다.

감사합니다.

답변

1

그래프는 다음과 같아야합니다. 그래프에 버그 필터가 없는지 확인하십시오.

사용자 지정 할당자를 사용 중이므로 문제가 있는지 살펴보고 거기에 몇 가지 중단 점을 설정합니다. 사용자 지정 할당자를 사용하여 VMR9를 구성하는 것을 보지 못하거나 그래프에 추가되는 것을 볼 수 없으므로 붙여 넣은 코드가 불완전 할 수 있습니다. 내가 VMR9 + Allocator로 RenderVolume을 올바르게 가져 오는 데 너무 어려웠던 것처럼 DVDGraphBuilder 사용을 피했습니다. 나는 그래프를 좀 더 수동으로 만들 것이다.

저는 오픈 소스 프로젝트에 DVD 플레이어가있는 사용자 정의 할당기를 보유하고 있습니다. WPF 호환성을 위해 거기에 몇 가지 것들을 해킹해야하기 때문에 거기에 많은 코드 노이즈가 있지만 참조를 위해 확인할 수 있습니다. http://wpfmediakit.codeplex.com

보고있는 내용이 DRM 문제가 아니어야합니다. 코드 예레미야 모릴에

alt text http://img29.imageshack.us/img29/7798/capturelu.jpg

+0

감사합니다. 매우 도움이됩니다. :) 나는 방금 끝난 코드를 게시했다. 디버거가 부착 된 상태에서 재생이 여전히 작동하지 않지만 DRM과 같지 않다는 것에 동의합니다. 안티 리버스 엔지니어링 전술 일 수 있습니다. 그것이 바로 Google이 생각하는 것입니다. 나를 위해 – Alex

0

DRM 보호의 형태 일 수 있습니까? DVD 그래프의 디코더는 일반적으로 여기서 한 것처럼 압축되지 않은 데이터에 액세스 할 수있는 그래프를 작성하지 못하도록합니다. 일반적으로 승인되지 않은 렌더러에 연결하는 것을 거부하는 등의 더 깨끗한 방법으로 처리하지만 일반적으로 리버스 엔지니어링을 방지하기 위해 고의적 인 충돌을 사용하는 mpeg-2 디코더가 있습니다.

g

0

감사합니다 날에, 나는 재생 주로 작업을 얻을 수 있었다 지적했다. D3DImage가 재생되는 크기를 조정하지 않는 한 정상적으로 작동합니다. 자세한 내용은 악마의 것 같습니다.

모든 해답 덕택입니다. DVD 재생은 디버거가 부착 된 상태에서는 작동하지 않습니다. Google에 따르면 이는 DRM이 아니지만 반대로 리버스 엔지니어링 조치입니다. 내가 사용하고있는 DVD 코덱에만 국한 될 수 있습니다.

extern "C" __declspec(dllexport) LPDIRECT3DSURFACE9 InitializeDvd(HWND hWnd) 
{ 
    CoInitialize(NULL); 

    IPin *dvdVideoOut; 
    IPin *vmr9VideoIn; 

    HRESULT hr = S_OK; 

    hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, 
      IID_IGraphBuilder, (void **)&graph); 

    if(graph) 
    { 
     hr = CoCreateInstance(CLSID_DVDNavigator, NULL, CLSCTX_INPROC_SERVER, 
       IID_IBaseFilter, (void **)&dvdNavigator); 

     if(dvdNavigator) 
     { 
      hr = graph->AddFilter(dvdNavigator, L"DVD Navigator"); 

      if(SUCCEEDED(hr)) 
      { 
       hr = CoCreateInstance(CLSID_VideoMixingRenderer9, NULL, CLSCTX_INPROC_SERVER, 
         IID_IBaseFilter, (void **)&vmr9); 

       if(vmr9) 
       { 
        hr = vmr9->QueryInterface(IID_IVMRFilterConfig9, reinterpret_cast<void**>(&p_fConfig)); 

        p_Ap = new VMR9AllocatorPresenter(); 
        p_Dh = new DeviceHandler(); 
        p_device = p_Dh->Initialize(hWnd); 
        p_fConfig->SetRenderingMode(VMR9Mode_Renderless); 
        p_fConfig->SetNumberOfStreams(1); 

        p_Ap->Initialize(hWnd, p_device, p_fConfig); 

        if(SUCCEEDED(hr)) 
        { 
         hr = graph->AddFilter(vmr9, L"Video Mixing Renderer 9"); 

         if(p_fConfig) 
         { 
          dvdNavigator->FindPin(L"Video", &dvdVideoOut); 
          if(dvdVideoOut) 
          { 
           hr = graph->Render(dvdVideoOut); 
          } 
          hr = graph->QueryInterface(IID_IMediaControl, reinterpret_cast<void**>(&control)); 

          if(control) 
          { 
           control->Run(); 
          } 
         } 
        } 
       } 
      } 
     } 
    } 

    return p_Dh->g_surface9; 
} 
+0

DVD 샘플 응용 프로그램과 함께 SDDK에서, DVD 재생이 디버그 모드에서 작동, 그것은 정말로 pixelated 및 육포. – rogerdpack