Автор Тема: MPC Video Renderer  (Прочитано 72933 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Aleksoid1978

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 2208
MPC Video Renderer
« Ответ #150 : 01 Апрель 2018, 11:11:12 »
Если IDXGISwapChain* не поддерживается текущей системой - то ты его и не получишь. Именно так в данный момент с ID3D11VideoContext1 - если система его не поддерживает, то просто ты его не получаешь и все.
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

V0lt

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 1811
MPC Video Renderer
« Ответ #151 : 29 Апрель 2018, 11:45:21 »
Хочу добавить интерфейс IMFVideoProcessor. Не могу понять куда его добавлять: в CVideoRendererInputPin::GetService() или CMpcVideoRenderer::GetService()?
Вроде должен быть в самом фильтре, а не пине.

Aleksoid1978

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 2208
MPC Video Renderer
« Ответ #152 : 29 Апрель 2018, 11:55:50 »
Ну конечно в фильтр.
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

V0lt

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 1811
MPC Video Renderer
« Ответ #153 : 30 Апрель 2018, 05:08:54 »
В общем кое-что прикрутил, но дальше затык.

FGManager мой интерфейс находит и добавляетс в корзину m_pUnks.AddTail(pMFVP). Плеер ищет m_pGB->FindInterface(IID_PPV_ARGS(&m_pMFVP), TRUE), но обламывается на QueryInterface() в CFGManager::FindInterface().
В принципе логично. Я ведь IMFVideoProcessor сделал предком CMpcVideoRenderer, а так похоже не надо было делать.
[merge_posts_bbcode]Добавлено: 2018-04-29 16:28:01[/merge_posts_bbcode]

Типа интерфейсы полученные через от IMFGetService должны сами реализовывать QueryInterface, и не пересекаться с CMpcVideoRenderer::NonDelegatingQueryInterface().  :|

[merge_posts_bbcode]Добавлено: 2018-04-30 08:08:54[/merge_posts_bbcode]

В общем сделал регулировку яркости, контрасности и прочего (MPCVR_IMFVideoProcessor_1.diff). Но теперь вылетает CUnknown при закрытии плеера. :(

Aleksoid1978

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 2208
MPC Video Renderer
« Ответ #154 : 30 Апрель 2018, 05:15:58 »
Надо в конструктор CUnknown передавать GetOwner() от фильтра, а не NULL.
Типа так : CUnknown(L"CDX9VideoProcessor", pFilter->GetOwner())
[merge_posts_bbcode]Добавлено: 2018-04-30 15:15:58[/merge_posts_bbcode]

Ну или от CDX9VideoProcessor, сам уже проверь.
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

V0lt

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 1811
MPC Video Renderer
« Ответ #155 : 02 Май 2018, 08:01:53 »
В первом случае регулировки не работают, во втором - падает на QueryInterface.
[merge_posts_bbcode]Добавлено: 2018-05-02 06:35:41[/merge_posts_bbcode]

Сделал регулировки для DX9, CUnknown не использовал. Позже будет для DX11.

У MS для одной и той же фичи каждый раз новый способ задания параметров. :(
Спойлер
VMR9typedef struct _VMR9ProcAmpControlRange
    {
    DWORD dwSize;
    VMR9ProcAmpControlFlags dwProperty;
    float MinValue;
    float MaxValue;
    float DefaultValue;
    float StepSize;
    }     VMR9ProcAmpControlRange;
DXVA2typedef struct _DXVA2_ValueRange
    {
    DXVA2_Fixed32 MinValue;
    DXVA2_Fixed32 MaxValue;
    DXVA2_Fixed32 DefaultValue;
    DXVA2_Fixed32 StepSize;
    }     DXVA2_ValueRange;
DXVA-HDtypedef struct _DXVAHD_FILTER_RANGE_DATA
    {
    INT Minimum;
    INT Maximum;
    INT Default;
    FLOAT Multiplier;
    }     DXVAHD_FILTER_RANGE_DATA;
D3D11typedef struct D3D11_VIDEO_PROCESSOR_FILTER_RANGE
    {
    int Minimum;
    int Maximum;
    int Default;
    float Multiplier;
    }     D3D11_VIDEO_PROCESSOR_FILTER_RANGE;
[свернуть]
[merge_posts_bbcode]Добавлено: 2018-05-02 11:01:53[/merge_posts_bbcode]

В общем на DX11 при прямом вызове m_pVideoContext->VideoProcessorSetStreamFilter() может падать.
D3D11 CORRUPTION: ID3D11DeviceContext::VideoProcessorSetStreamFilter: Two threads were found to be executing functions associated with the same Device[Context] at the same time. This will cause corruption of memory. Appropriate thread synchronization needs to occur external to the Direct3D API (or through the ID3D10Multithread interface). 252 and 5580 are the implicated thread ids. [ MISCELLANEOUS CORRUPTION #28: CORRUPTED_MULTITHREADING]Мютекс не помогает. Похоже придется делать через промежуточные параметры.

Aleksoid1978

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 2208
MPC Video Renderer
« Ответ #156 : 03 Май 2018, 10:29:07 »
Значит надо не напрямую вызывать - а из кода рисования.
[merge_posts_bbcode]Добавлено: 2018-05-03 20:29:07[/merge_posts_bbcode]

К DX11 можно прикрутить вывод 3D, но нет нужного оборудования(а так понимаю там вывод во frame-packing)
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

V0lt

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 1811
MPC Video Renderer
« Ответ #157 : 05 Май 2018, 19:39:04 »
К режиму DX9 удалось прикрутить детектор частоты дисплея. Он получился намного проще, чем в EVR-CP. Основной цикл выглядит так:
   if (0L != D3DKMTWaitForVerticalBlankEvent(&we)) {
        return;
    }
    m_Ticks[0] = GetPreciseTick();
    unsigned i = 1;

    while (0L == D3DKMTWaitForVerticalBlankEvent(&we)) {
        m_Mutex.lock();
        m_Ticks[i] = GetPreciseTick();
        bool stop = m_bStop;
        m_Mutex.unlock();

        Sleep(5); // need for Windows 7 :(

        if (stop) {
            break;
        }
        i ^= 1;
    }
Есть нехороший момент с Windows 7, без принудительного Sleep(5) отображение кадров стопориться. В Windows 8.1 нормально.
В режиме DX11 еще не проверял.

V0lt

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 1811
MPC Video Renderer
« Ответ #158 : 27 Ноябрь 2018, 16:18:58 »
Вести с полей.

Добавлена поддержка медиатипов с FORMAT_VideoInfo (нужно для Generate Still Video)
Добавлена поддержка ARGB32 и RGB24 на входе (теперь не нужен системный Color Space Converter).
DX9: Если на входе RGB, то на Nvidia и AMD используется шейдерная интерполяция. При отсутствии интерполяции используется StretchRect(D3DTEXF_POINT).

Замечания.
Режим DX11 в некоторых ситуациях может работать некорректно, им некогда было заниматься.
Подсчет частоты дисплея для DX9 из-за проблем временно отключен.

Добавлено: 2018-11-27 19:18:58

В планах сделать поддержку YCbCr 4:4:4 8-бит. Я пробовал сделать поддержку AYUV через DXVA2_VideoProcSoftwareDevice, картинка есть, но интерполяция ужасна. В общем тут есть варианты.
1. Использовать DXVA2_VideoProcSoftwareDevice только для преобразования в RGB, а изменять размеры шейдерами. Но этот вариант мне не нравиться, т.к. любого нестандарта (типа YCoCg) придется добавлять корректирующий прогон шейдером.
2. Преобразование в RGB делать программно (для 4:4:4 оно не шибко тяжелое). Изменять размеры шейдерами. Способ хорош, тем что процесс перегона в RGB можно перевести на стороннюю либу.
3. Засовывать картинку как есть в X8R8G8B8. Преобразовать в нормальный RGB и изменять размеры шейдерами.

Aleksoid1978

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 2208
MPC Video Renderer
« Ответ #159 : 27 Ноябрь 2018, 23:08:23 »
По хорошему - это входящие данные в RGB 4:4:4, 8 или 10 бит в зависимости от данных. Ну и потом уже шейдерами делать что душе угодно.

Но сишный код перевода в RGB 4:4:4 будет не быстр.
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

V0lt

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 1811
MPC Video Renderer
« Ответ #160 : 28 Ноябрь 2018, 03:41:20 »
Цитата: Aleksoid1978
Но сишный код перевода в RGB 4:4:4 будет не быстр.
Перевод AYUV в XRGB производиться линейно, пиксель в пиксель и требует лишь несколько простых арифметических операций. Это не YV12 на входе, когда приходиться пиксели собирать по всему кадру и хрому восстанавливать.
Я пока планирую переводить AYUV в XRGB на шейдерах, а софтовый держу в уме как запасной и контрольный.

Добавлено: 2018-11-28 06:41:20

На работе заметил баг. Запускаю плеер (отладочная версия). Окно появляется на основном дисплее. Перетаскиваю окно на дополнительный дисплей. Запускаю воспроизведение - получаю исключение в системной dll.

Win8.1 x64, два одинаковых FullHD монитора, подключенные к одной видеокарте Nvidia.

V0lt

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 1811
MPC Video Renderer
« Ответ #161 : 28 Ноябрь 2018, 14:48:04 »
2-3 дня потерял из-за багов с ресурсами.

Баг 1. Есть баг с ресурсами из файла. Программа нормально компилируется, но функция FindResource дает ошибку.
Думал, что как-то связано с нумерацией, но нет.

Баг 2. Опять программа нормально компилируется, но вместо правильных данных функция LoadResource будет выдавать какой-то левак. Долго не мог понять почему элементарный шейдер не работает. Потом проверил, что выдает SizeofResource - размер не совпал с исходным файлом.

Даже не знаю чего и делать. Бред полный. Если только шейдеры ввести в основной проект.

Aleksoid1978

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 2208
MPC Video Renderer
« Ответ #162 : 29 Ноябрь 2018, 02:07:10 »
Ну так в MPC-BE же все работает, ты по аналогии сделал ??

P.S. Я сравнил ресурсы в собранном .ax - содержимое и размер идентично .cso файлам.
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

V0lt

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 1811
MPC Video Renderer
« Ответ #163 : 29 Ноябрь 2018, 03:20:46 »
Типа так и было, пока я test_shader.cso не добавил. И тут этот бред начался.

Aleksoid1978

  • Администратор
  • Ветеран
  • *****
  • Сообщений: 2208
MPC Video Renderer
« Ответ #164 : 29 Ноябрь 2018, 03:38:45 »
Ну значит добавил как-то не так - 100%
Давай патч/код - гляну.
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