DirectShow DVD воспроизведение - PullRequest
       16

DirectShow DVD воспроизведение

1 голос
/ 21 сентября 2009

Я создал собственный распределитель / презентер, который отлично работает для воспроизведения обычных медиа-файлов. Однако, когда я пытаюсь воспроизвести 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 (). Это сводит меня с ума, поскольку я уверен, что просто забываю что-то действительно простое.

Спасибо.

Ответы [ 3 ]

1 голос
/ 25 сентября 2009

Ваш график должен выглядеть примерно так. Убедитесь, что на вашем графике нет фильтров с ошибками.

Поскольку вы используете собственный распределитель, я бы посмотрел там на проблему и установил там несколько точек останова. Код, который вы вставили, может быть неполным, так как я не вижу, как вы настраиваете VMR9 с помощью специального распределителя, и при этом я не вижу его добавления в график. Я избегаю использования DVDGraphBuilder, так как мне было слишком трудно правильно настроить RenderVolume с помощью моего VMR9 + Allocator. Я бы построил график немного больше вручную.

У меня есть собственный распределитель в моем проекте с открытым исходным кодом, вместе с DVD-плеером. Вы можете проверить это для справки, хотя там много шума из-за того, что мне нужно взломать несколько вещей для совместимости с WPF. http://wpfmediakit.codeplex.com

То, что вы видите, НЕ должно быть проблемой DRM.

альтернативный текст http://img29.imageshack.us/img29/7798/capturelu.jpg

0 голосов
/ 22 октября 2009

Благодаря коду, на который указал мне Джеремия Моррилл, мне удалось добиться, чтобы воспроизведение в основном работало. Он работает нормально, если вы не пытаетесь изменить размер 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 голосов
/ 21 сентября 2009

Может ли это быть формой защиты DRM? Декодеры на DVD-графиках обычно стараются помешать вам построить графики, которые получают доступ к несжатым данным, как вы делаете здесь. Обычно они делают это более чистым способом, таким как отказ от подключения к неавторизованным средствам визуализации, но возможно, что это может быть вызвано чем-то подобным - конечно, существуют декодеры mpeg-2, которые используют преднамеренные сбои для предотвращения обратного инжиниринга.

G

...