Запуск самодельного плеера DirectShow в WINE

Здравствуйте.
Есть острая необходимость запустить самодельный видеоплеер для винды в wine. Знаю, что садо-мазо, но надо!
Я знаю, что писать код за меня никто не будет, но мне это и не нужно. Вопрос в другом.
Итак, плеер написан на паскале (delphi 2007 + VCL). Версия с кодом без использования VCL тоже имеется. Проблема, собственно, в следующем. Сам плеер запускается, но при построении графа крашится на строчке
  Result :=     player.pCaptureGraphBuilder.RenderStream(nil,@mediatype_video,
                                   Player.fSource,Player.fVideoDecoder,player.fVideoRenderer);

Потом, с помощью winetricks, я поставил directx_feb2010_redist, quartz.dll и еще некоторые файлы, связанные с DirectX. После этого плеер вообще перестал запускаться, а консоль начала выдавать это:
kub@I5:~/.wine/dosdevices/c:/MYPROGS$ wine Zeratool.exe
err:module:import_dll Library msdmo.dll (which is needed by L"C:\\MYPROGS\\Zeratool.exe") not found
err:module:LdrInitializeThunk Main exe initialization for L"C:\\MYPROGS\\Zeratool.exe" failed, status c0000135

Скачал файл msdmo.dll и поместил в папку с ехе. Теперь пишет:

kub@I5:~/.wine/dosdevices/c:/MYPROGS$ wine Zeratool.exe
err:module:import_dll Library api-ms-win-core-com-l1-1-0.dll (which is needed by L"C:\\MYPROGS\\msdmo.dll") not found
err:module:import_dll Library api-ms-win-core-registry-l1-1-0.dll (which is needed by L"C:\\MYPROGS\\msdmo.dll") not found
err:module:import_dll Library api-ms-win-core-interlocked-l1-2-0.dll (which is needed by L"C:\\MYPROGS\\msdmo.dll") not found
err:module:import_dll Library api-ms-win-core-string-l1-1-0.dll (which is needed by L"C:\\MYPROGS\\msdmo.dll") not found
err:module:import_dll Library api-ms-win-core-synch-l1-2-0.dll (which is needed by L"C:\\MYPROGS\\msdmo.dll") not found
err:module:import_dll Library api-ms-win-core-debug-l1-1-1.dll (which is needed by L"C:\\MYPROGS\\msdmo.dll") not found
err:module:import_dll Library api-ms-win-core-rtlsupport-l1-2-0.dll (which is needed by L"C:\\MYPROGS\\msdmo.dll") not found
err:module:import_dll Library api-ms-win-core-profile-l1-1-0.dll (which is needed by L"C:\\MYPROGS\\msdmo.dll") not found
err:module:import_dll Library api-ms-win-core-processthreads-l1-1-1.dll (which is needed by L"C:\\MYPROGS\\msdmo.dll") not found
err:module:import_dll Library api-ms-win-core-sysinfo-l1-2-0.dll (which is needed by L"C:\\MYPROGS\\msdmo.dll") not found
err:module:import_dll Library api-ms-win-core-errorhandling-l1-1-1.dll (which is needed by L"C:\\MYPROGS\\msdmo.dll") not found
err:module:import_dll Library api-ms-win-core-string-obsolete-l1-1-0.dll (which is needed by L"C:\\MYPROGS\\msdmo.dll") not found
err:module:import_dll Library api-ms-win-core-registry-l2-1-0.dll (which is needed by L"C:\\MYPROGS\\msdmo.dll") not found
err:module:import_dll Library msdmo.dll (which is needed by L"C:\\MYPROGS\\Zeratool.exe") not found
err:module:LdrInitializeThunk Main exe initialization for L"C:\\MYPROGS\\Zeratool.exe" failed, status c0000135

Скачал все необходимые файлы. Плеер запустился. Но теперь крашится на последней строчке:
  Result := CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC_SERVER ,
                           IID_IGraphBuilder, Player.pGraphBuilder);
      case Result of
        S_OK: errorcodetext :='s_ok';
        REGDB_E_CLASSNOTREG:
        ErrorCodeText := 'REGDB_E_CLASSNOTREG';
        CLASS_E_NOAGGREGATION:
        ErrorCodeText := 'CLASS_E_NOAGGREGATION';
        E_NOINTERFACE:
        ErrorCodeText := 'E_NOINTERFACE';
        E_POINTER:
        ErrorCodeText := 'E_POINTER';
      end;
   Form1.lb1.Items.Add('create filter graph: '+errorcodetext);
  Result := CoCreateInstance(CLSID_CaptureGraphBuilder2, NIL, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2,
                         Player.pCaptureGraphBuilder);
      case Result of
        S_OK: errorcodetext :='s_ok';
        REGDB_E_CLASSNOTREG:
        ErrorCodeText := 'REGDB_E_CLASSNOTREG';
        CLASS_E_NOAGGREGATION:
        ErrorCodeText := 'CLASS_E_NOAGGREGATION';
        E_NOINTERFACE:
        ErrorCodeText := 'E_NOINTERFACE';
        E_POINTER:
        ErrorCodeText := 'E_POINTER';
      end;
   Form1.lb1.Items.Add('capture graph builder: '+errorcodetext);
  Player.pCaptureGraphBuilder.SetFiltergraph(Player.pGraphBuilder);

консоль при этом пишет:
fixme:dwmapi:DwmIsCompositionEnabled 0x33f77c
err:ole:COMPOBJ_DllList_Add couldn't load in-process dll L"C:\\windows\\system32\\qcap.dll"
err:ole:CoGetClassObject no class object {bf87b6e1-8c27-11d0-b3f0-00aa003761c5} could be created for context 0x1

Обнаружил, что файл wine\drive_c\windows\system32\qcap.dll весит около 3кб. Заменил его файлом из windows7 и предыдущие ошибки и краши исчезли. Но теперь в коде
      Result := player.pMediaPosition.get_Duration(player.MediaInfo.TrackDuration);
  case Result of
    E_NOTIMPL:
    MessageBox(0,PChar('E_NOTIMPL'),'',MB_ICONERROR);
    E_POINTER:
    MessageBox(0,PChar('E_POINTER'),'',MB_ICONERROR);
  end;

возвращает E_NOTIMPL, а консоль пишет это:
kub@I5:~/.wine/dosdevices/c:/MYPROGS/zeratool2$ wine Zeratool.exe
fixme:dwmapi:DwmIsCompositionEnabled 0x33f77c
fixme:win:EnumDisplayDevicesW ((null),0,0x33f178,0x00000000), stub!
err:d3d:context_create Failed to set pixel format 4 on device context 0xc0067.
err:d3d:context_choose_pixel_format Can't find a suitable iPixelFormat
err:d3d:context_create Failed to set pixel format 4 on device context 0x4f0033.
fixme:d3d:wined3d_get_format Can't find format WINED3DFMT_R24_UNORM_X8_TYPELESS (0x49) in the format lookup table
fixme:d3d:getDepthStencilBits Unsupported depth/stencil format WINED3DFMT_UNKNOWN.
err:d3d:context_create Failed to set pixel format 1 on device context 0x10086.
err:d3d:context_create Failed to set pixel format 4 on device context 0x20087.
err:d3d:context_choose_pixel_format Can't find a suitable iPixelFormat
err:d3d:context_create Failed to set pixel format 4 on device context 0x100a3.
fixme:ole:CoCreateInstance no instance created for interface {56a86895-0ad4-11ce-b03a-0020af0ba770} of class {51b4abf3-748f-4e3b-a276-c828330e926a}, hres is 0x80040273
fixme:ddraw:DirectDrawEnumerateExA flags 0x00000001 not handled
fixme:win:EnumDisplayDevicesW ((null),0,0x33eb18,0x00000000), stub!
fixme:win:EnumDisplayDevicesW ((null),0,0x33e648,0x00000000), stub!
fixme:win:EnumDisplayDevicesW ((null),0,0x33e648,0x00000000), stub!
fixme:ddraw:ddraw7_Initialize Ignoring guid {aeb2cdd4-6e41-43ea-941c-8361cc760781}.

то есть, не может инициализироваться DirectDraw.

0
fox4 - 12 Апрель, 2016 - 21:28
Изображение пользователя fox4.

Сразу привлекают внимание эти строки
fixme:d3d:wined3d_get_format Can't find format WINED3DFMT_R24_UNORM_X8_TYPELESS (0x49) in the format lookup table
fixme:d3d:getDepthStencilBits Unsupported depth/stencil format WINED3DFMT_UNKNOWN.

Вывод как бы намекает что в wine данные функции не поддерживаются. Или не достаёт каких то библиотек где они реализованы или они неправильно зарегистрированы в реестре wine (который эмулируется).

0
Гость - 13 Апрель, 2016 - 16:13

Чем новее Wine, тем он подобнее обращается со старыми программами как более новые выпуски Windows.

Отправить комментарий

CAPTCHA на основе изображений
Введите цифры