26

Re: MPC Video Renderer

Необходимо реализовать поддержку ресайза на паузе. А для этого надо хранить послдений кадр. И если с софтовым декодированием все более-менее просто(у нас последние данные есть в m_pSrcSurface и можно на паузе спокойно выводить их), то с DXVA2 сложнее - тут надо данные из pSample как-то вытаскивать в туже m_pSrcSurface.

I7 2600K@4.2 / Asrock P67 Extreme 4 Gen 3 / Kingston HyperX 8Gb 1866 (4x2) Kit / GIGABYTE GTX 960 / BenQ EW2430 / LG 47LM620T / Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

27

Re: MPC Video Renderer

Aleksoid1978
Тут вот какое дело. Если мы будет прикручивать деинтерлейс, то скорее всего у нас появиться очередь и тогда вопрос с паузой решиться сам с собой. smile

28

Re: MPC Video Renderer

В любом случае, для начала - надо научиться вытаскивать данные из surface для DXVA2 режима.

I7 2600K@4.2 / Asrock P67 Extreme 4 Gen 3 / Kingston HyperX 8Gb 1866 (4x2) Kit / GIGABYTE GTX 960 / BenQ EW2430 / LG 47LM620T / Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

29

Re: MPC Video Renderer

Исправил вывод YV12.

Добавлено: 2018-03-04 14:25:08

Aleksoid1978, тебе вопрос.
В коде ниже кто рулит буфером в виде pSurface? Декодер?

    if (CComQIPtr<IMFGetService> pService = pSample) {
        CComPtr<IDirect3DSurface9> pSurface;
        if (SUCCEEDED(pService->GetService(MR_BUFFER_SERVICE, IID_PPV_ARGS(&pSurface)))) {


        }
    }

Добавлено: 2018-03-04 14:49:27

Про деинтерлейс в DXVA2-VP.
Сейчас мы используем ProgressiveDevice. Но если понадобиться, то можно использовать BobDevice. Он стандартный, использует фичу BOBVerticalStretch и вроде как удваивает частоту.

Есть еще "девайсы" от вендеров.
Nvidia {6CB69578-7617-4637-91E5-1C02DB810285}, который использует PixelAdaptive.
Intel {BF752EF6-8CC4-457A-BE1B-08BD1CAEEE9F}, который использует EdgeFiltering, InverseTelecine и требует 1 BackwardRefSamples.

30

Re: MPC Video Renderer

В случае DXVA2 - тем pSurface рулит DXVA2 декодер, тот который в Direct3D9(не путать с видео-декодером).
Поэтому чтобы получить данные от DXVA2 декодера - нам и нужно вот таким образом получить указатель на поверхность, которая содержит сами данные. Вот их и надо научиться сохранять.

I7 2600K@4.2 / Asrock P67 Extreme 4 Gen 3 / Kingston HyperX 8Gb 1866 (4x2) Kit / GIGABYTE GTX 960 / BenQ EW2430 / LG 47LM620T / Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

31

Re: MPC Video Renderer

1. Есть метод IDirect3DDevice9::UpdateSurface, который не работает для нашего случая.
2. Есть еще функция D3DXLoadSurfaceFromSurface, но придется тянуть d3dx9_43.dll.

Добавлено: 2018-03-05 06:21:40

3. Рендерим кадр два раза, сначала в промежуточную поверхность, потом в выводимую.

32

Re: MPC Video Renderer

Ну тогда надо - временную поверхность создавать размером видео-кадра, рендерить в нее. А потом по необходимости уже ресайзить "на экран".

Добавлено: 2018-03-05 19:15:54

Проверил - копирование данных между поверхностями работает(в нашем случае) с помощью IDirect3DDevice9::StretchRect(). Замерил скорость выполнения(проверял в Debug варианте) - на кадре 1920х1080 NV12 и 3840х2160 P010, менее 1мс, даже быстрее чем наш код CopyFrameData().

Так что никакой потери по быстродействию тут и не пахнет.

Добавлено: 2018-03-05 23:04:54

По поводу деинтерлейса - использовать BobDevice это уже "последнее" дело. По хорошему надо пытаться использовать "девайсы" от вендеров, дабы получить доступ к PixelAdaptive и т.д. В инете даже помню были примеры, там перебором ищется нужный "процессор" для деинтерлейса.

Но вот тут интересный момент - получается что для каждого кадра придется проверять типа(прогрессив/интерлейс) и по необходимости пересоздавать DXVA2-VP.

I7 2600K@4.2 / Asrock P67 Extreme 4 Gen 3 / Kingston HyperX 8Gb 1866 (4x2) Kit / GIGABYTE GTX 960 / BenQ EW2430 / LG 47LM620T / Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

33

Re: MPC Video Renderer

IDirect3DDevice9::StretchRect делает все в видеокарте, поэтому и быстрый.

Aleksoid1978 пишет:

Но вот тут интересный момент - получается что для каждого кадра придется проверять типа(прогрессив/интерлейс) и по необходимости пересоздавать DXVA2-VP.

Врядли. Думаю "девайс" от вендера без проблем переварит прогрессивный кадр. Надо попробовать.

Добавлено: 2018-03-06 18:02:50

Прикрутил заготовку окна настроек и информации. Если не видите, то попробуйте заново зарегистрировать фильтр.

Хотел закинуть в нее небольшую статистику, но похоже придеться MFC прикручивать, которая ошибками сыплет. Пока отложил.

34

Re: MPC Video Renderer

Если нужен MFC - надо просто переделать немного регистрацию фильтра. А вообще, можно обойтись и без MFC, чисто виндовый апи юзать.

I7 2600K@4.2 / Asrock P67 Extreme 4 Gen 3 / Kingston HyperX 8Gb 1866 (4x2) Kit / GIGABYTE GTX 960 / BenQ EW2430 / LG 47LM620T / Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

35

Re: MPC Video Renderer

Не могу понять почему этот патч падает при вызове m_pVideoRenderer->get_FrameInfo().

36

Re: MPC Video Renderer

Гляну. Ну наверное что-то не учел ))

P.S. Ну хз, почему то при вызове вылетает на деструкторе самого фильтра ...

Добавлено: 2018-03-08 21:23:59

Предлагаю вообще убрать DXVA-HD, тогда бы я попробовал заняться внедрением деинтерлейса.

I7 2600K@4.2 / Asrock P67 Extreme 4 Gen 3 / Kingston HyperX 8Gb 1866 (4x2) Kit / GIGABYTE GTX 960 / BenQ EW2430 / LG 47LM620T / Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

37

Re: MPC Video Renderer

Хорошо, сделаю...

Я сам планировал убрать DXVA-HD для всего кроме прогрессивного RGB32 на Intel. А на AMD и Nvidia реализовать на шейдерах.

Добавлено: 2018-03-08 15:06:20

DXVA-HD больше не работает. Небольшую часть кода оставил и отключил.

Добавлено: 2018-03-08 22:52:39

Деинтерлейс с NumBackwardRefSamples = 0 работает.

Я допер до того, как передавать кадры для деинтерлейса с NumBackwardRefSamples > 0, но проблема в том, что придется много чего переделывать, чтобы было все правильно и красиво.

Деинтерлейс с NumForwardRefSamples > 0 реализовать можно, но он будет не совсем правильный, т.к. сейчас мы выводит кадры без задержек и коррекции времени.

38

Re: MPC Video Renderer

Aleksoid1978
Скоро будет полноценный деинтерлейс.

Здесь ты сделал неправильно. Должно быть Progressive, т.к. DestFormat.

39

Re: MPC Video Renderer

По поводу деинтерлейса и прогрессива - по хорошему надо всегда пытаться создавать видео-ппроцессор с деинтерлейсом. А дальше уже по факту входящих сэмплов проставлять формат.

Само создание видео-процессора надо бы тоже перенести, в инициализацию директ3д. И убрать проверку на каждый сэмпл.

По поводу последнего коммита - ну бывает.

Добавлено: 2018-03-09 13:33:18

По хорошему и выбор видео-процессора надо переделать, надо выбирать наилучший, если такого нет то выбирать bob.

I7 2600K@4.2 / Asrock P67 Extreme 4 Gen 3 / Kingston HyperX 8Gb 1866 (4x2) Kit / GIGABYTE GTX 960 / BenQ EW2430 / LG 47LM620T / Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

40

Re: MPC Video Renderer

Bob всегда идет последним, поэтому с ним проблем не будет.

41

Re: MPC Video Renderer

Не в этом дело, я про сам выбор. Надо сперва искать с поддержкой PixelAdaptive, если такого нет то Bob, ну и если все фейл - то юзать прогрессив.

Добавлено: 2018-03-09 14:11:25

Если что, я позже сделаю.

I7 2600K@4.2 / Asrock P67 Extreme 4 Gen 3 / Kingston HyperX 8Gb 1866 (4x2) Kit / GIGABYTE GTX 960 / BenQ EW2430 / LG 47LM620T / Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

42

Re: MPC Video Renderer

Интерлейс PixelAdaptive всегда идет раньше Bob-а. smile
Bob всегда присутствует по факту и по спецификации.

43

Re: MPC Video Renderer

Ну, возможно из-за дров, PixelAdaptive может и не быть, мало ли.

Добавлено: 2018-03-09 14:42:45

Я так понимаю с Backward/Forward уже работает ??

I7 2600K@4.2 / Asrock P67 Extreme 4 Gen 3 / Kingston HyperX 8Gb 1866 (4x2) Kit / GIGABYTE GTX 960 / BenQ EW2430 / LG 47LM620T / Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

44

Re: MPC Video Renderer

Да, вроде работает. Но мне непонятно как удваиваются кадры, если вообще удваиваются. smile

45

Re: MPC Video Renderer

А почему мы игнорируем fps и тупо проставляем 60 ??

А понять удваивается или нет, ставишь fraps и смотришь частоту для окна.

I7 2600K@4.2 / Asrock P67 Extreme 4 Gen 3 / Kingston HyperX 8Gb 1866 (4x2) Kit / GIGABYTE GTX 960 / BenQ EW2430 / LG 47LM620T / Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

46

Re: MPC Video Renderer

Aleksoid1978 пишет:

А почему мы игнорируем fps и тупо проставляем 60 ??

Пока это неважно. Но если мы начнем все это учитывать, то у нас начнутся проблемы.

Указание времени ладно, но идея задания fps мне вообще не нравиться. Будет видео или DVD, в котором fps поменяется и приехали.

47

Re: MPC Video Renderer

Проверил наш рендерер - не удваивает кадры. Если что - проверял с помощью Fraps. EVR/EVR CP - удваиваются.

И вот тут даже мыслей нет - как это дело разрулить ))

I7 2600K@4.2 / Asrock P67 Extreme 4 Gen 3 / Kingston HyperX 8Gb 1866 (4x2) Kit / GIGABYTE GTX 960 / BenQ EW2430 / LG 47LM620T / Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

48

Re: MPC Video Renderer

Доработал выбор подходящего метода для деинтерлейса (анализировал инфу из DXVAChecker для AMD).

Добавлено: 2018-03-09 13:56:45

Вопрос. Если мы будем писать реальный fps (для типового видео), то он будет обновляться для DVD-Video?
DVD-Video может иметь разную частоту для меню и роликов. Например, меню 25p (pull-down 2:2), а клип 50i.

49

Re: MPC Video Renderer

По поводу работы видео-рендерера в целом и DXVA2-VP в частности - необходимо при проверке входных медиатипов добавить проверку на способность DXVA2-VP работать с ними. Как пример - Radeon и YV12, данный тип просто не поддерживается. Так же и P010 - на Win7 я так понимаю тоже не поддерживается.

V0lt - сделаешь или я ??

I7 2600K@4.2 / Asrock P67 Extreme 4 Gen 3 / Kingston HyperX 8Gb 1866 (4x2) Kit / GIGABYTE GTX 960 / BenQ EW2430 / LG 47LM620T / Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

50

Re: MPC Video Renderer

В общем пробуем продвинутый метод. Если не подошел, то BobDevice. Если тоже не подошел (RGB на входе), то ProgressiveDevice.

Добавлено: 2018-03-09 14:04:00

Проверка форматов давно имеется.
Для совсем тупых адаптеров есть YUY2 и ProgressiveDevice, который поддерживается всем.