151

Re: MPC Video Renderer

Если 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

152

Re: MPC Video Renderer

Хочу добавить интерфейс IMFVideoProcessor. Не могу понять куда его добавлять: в CVideoRendererInputPin::GetService() или CMpcVideoRenderer::GetService()?
Вроде должен быть в самом фильтре, а не пине.

153

Re: MPC Video Renderer

Ну конечно в фильтр.

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

154

Re: MPC Video Renderer

В общем кое-что прикрутил, но дальше затык.

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

Добавлено: 2018-04-29 16:28:01

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

Добавлено: 2018-04-30 08:08:54

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

155

Re: MPC Video Renderer

Надо в конструктор CUnknown передавать GetOwner() от фильтра, а не NULL.
Типа так : CUnknown(L"CDX9VideoProcessor", pFilter->GetOwner())

Добавлено: 2018-04-30 15:15:58

Ну или от 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

156

Re: MPC Video Renderer

В первом случае регулировки не работают, во втором - падает на QueryInterface.

Добавлено: 2018-05-02 06:35:41

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

У MS для одной и той же фичи каждый раз новый способ задания параметров. sad

Spoiler

VMR9

typedef struct _VMR9ProcAmpControlRange
    {
    DWORD dwSize;
    VMR9ProcAmpControlFlags dwProperty;
    float MinValue;
    float MaxValue;
    float DefaultValue;
    float StepSize;
    }     VMR9ProcAmpControlRange;

DXVA2

typedef struct _DXVA2_ValueRange
    {
    DXVA2_Fixed32 MinValue;
    DXVA2_Fixed32 MaxValue;
    DXVA2_Fixed32 DefaultValue;
    DXVA2_Fixed32 StepSize;
    }     DXVA2_ValueRange;

DXVA-HD

typedef struct _DXVAHD_FILTER_RANGE_DATA
    {
    INT Minimum;
    INT Maximum;
    INT Default;
    FLOAT Multiplier;
    }     DXVAHD_FILTER_RANGE_DATA;

D3D11

typedef struct D3D11_VIDEO_PROCESSOR_FILTER_RANGE
    {
    int Minimum;
    int Maximum;
    int Default;
    float Multiplier;
    }     D3D11_VIDEO_PROCESSOR_FILTER_RANGE;

Добавлено: 2018-05-02 11:01:53

В общем на 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]

Мютекс не помогает. Похоже придется делать через промежуточные параметры.

157

Re: MPC Video Renderer

Значит надо не напрямую вызывать - а из кода рисования.

Добавлено: 2018-05-03 20:29:07

К 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

158

Re: MPC Video Renderer

К режиму 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 еще не проверял.

159

Re: MPC Video Renderer

Вести с полей.

Добавлена поддержка медиатипов с 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 и изменять размеры шейдерами.

160

Re: MPC Video Renderer

По хорошему - это входящие данные в 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

161

Re: MPC Video Renderer

Aleksoid1978 пишет:

Но сишный код перевода в RGB 4:4:4 будет не быстр.

Перевод AYUV в XRGB производиться линейно, пиксель в пиксель и требует лишь несколько простых арифметических операций. Это не YV12 на входе, когда приходиться пиксели собирать по всему кадру и хрому восстанавливать.
Я пока планирую переводить AYUV в XRGB на шейдерах, а софтовый держу в уме как запасной и контрольный.

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

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

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

162

Re: MPC Video Renderer

2-3 дня потерял из-за багов с ресурсами.

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

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

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

163

Re: MPC Video Renderer

Ну так в 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

164

Re: MPC Video Renderer

Типа так и было, пока я test_shader.cso не добавил. И тут этот бред начался.

165

Re: MPC Video Renderer

Ну значит добавил как-то не так - 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

166

Re: MPC Video Renderer

Идеи.
1. Собирать все шейдеры батником, который засунуть предварительный этап сборки MpcVideoRenderer.
2. Так же через батник на предварительном этапе генерировать заголовочные файлы, а не объекты. Суть в том, что мы уходим от глючного компилятора ресурсов.

Добавлено: 2018-11-29 06:45:50

Патч дать не смогу, т.к. в очередной раз отменил все изменения. Вечером сделаю.
И нету там ничего такого, что было бы не так. Добавленный код для нового шейдера вообще ничем особенным не выделяется и написан был полностью с нуля раз 5.

167

Re: MPC Video Renderer

Патч после которого вылезает Баг 1 - https://yadi.sk/d/nVinwq1_-sTCZA
Ошибка проявляется при вызове FindResourceW для resid равным 790.

HRSRC hrsrc = FindResourceW(nullptr, MAKEINTRESOURCEW(resid), L"SHADER");
if (!hrsrc) {
    return E_INVALIDARG;
}

Баг 2 можно получить, если начать менять цифры в #define IDF_SHADER_*.
В данном случае SizeofResource начнет выдавать значения, не соответствующие размерам файлов .CSO.

На неизмененной ревизии от 29.11.2018 багов нет.

168

Re: MPC Video Renderer

В общем так.
Функции FindResource, LoadResource, SizeofResource при задании первого параметра nullptr загружают ресурсы приложения, а не текущего модуля.
Как сделать по другому - непонятно. MFC подключать не буду.

169

Re: MPC Video Renderer

Да все понятно, надо просто поискать хорошо smile

HRESULT CDX9VideoProcessor::CreateShaderFromResource(IDirect3DPixelShader9** ppPixelShader, UINT resid)
{
    if (!m_pD3DDevEx || !ppPixelShader) {
        return E_POINTER;
    }

    static const HMODULE hModule = (HMODULE)&__ImageBase;

    HRSRC hrsrc = FindResourceW(hModule, MAKEINTRESOURCEW(resid), L"SHADER");
    if (!hrsrc) {
        return E_INVALIDARG;
    }
    HGLOBAL hGlobal = LoadResource(hModule, hrsrc);
    if (!hGlobal) {
        return E_FAIL;
    }
    DWORD size = SizeofResource(hModule, hrsrc);
    if (size < 4) {
        return E_FAIL;
    }

    return m_pD3DDevEx->CreatePixelShader((const DWORD*)LockResource(hGlobal), ppPixelShader);
}
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

170

Re: MPC Video Renderer

Спасибо. Поправил. :-)
Решение не документировано в MSDN. "Спасибо" MS. mad

Тут была подстава в том, что идентификаторы уже добавленных шейдеров совпадали с аналогичными ресурсами MPC-BE (так проще перетягивать наработки). И соотвественно работало нормально. А вот что-то новое добавить и приехали. Реально не понимаешь, что вообще происходит. Все ведь по документации.

171

Re: MPC Video Renderer

Aleksoid1978
Есть вопрос по работе RGB32.
Когда мы создаем обычный медиатип с положительной высотой, то для RGB это означает обратный порядок строк (снизу вверх). Эта дичь прёт со времен появления формате BMP. Но в видеокарте нормальный порядок строк (сверху вниз). Для обхода этой проблемы есть разные решения

1. Рендерер сам переворачивает строки при копировании в видеопамять. Сейчас так сделано в экспериментальном видеорендерере. Наш декодер в этом случае тоже делает переворот на последней стадии преобразования. Все это не очень оптимально по скорости (хотя явных тормозов нет, наш код этого не допускает).

2. Рендерер соединятся с декодером и модифицирует медиатип. Высота становиться отрицательной, декодер это учитывает. Так сделано в EVR-ах. Лишних изменений порядка строк больше нет.
Вопрос: Как такое сделать в нашем рендерере?

3. Можно модифицировать сам декодер, чтобы тот создавал для RGB32 медиатип, у которого по умолчанию высота отрицательная.
Вопрос: Можно такое провернуть с нашем декодером? Мне для тестов нужно.

172

Re: MPC Video Renderer

Добавил поддержку DVD-Video совместно с декодером Mpeg2DecFilter и LAV Video Decoder.
Деинтерлейс не работает, меню не переключает (ходить только через навигацию в плеере или в свойствах DVD Navigator), но картинка есть. :-)
Microsoft DTV-DVD Video Decoder виснет.
DVD в формате PAL роняют Mpeg2DecFilter. smile

173

Re: MPC Video Renderer

Спасибо Aleksoid1978, работа с DVD более менее налажена.

Осталась проблема с Microsoft DTV-DVD Video Decoder. Как оказалась она вылазит и на обычных файлах.
Kubo-001.mkv

174

Re: MPC Video Renderer

Я предлагаю убрать поддержку декодирования DXVA2 (временно?) при использовании видеопроцессора D3D11.
Причина: очень костыльный код, с которым тяжело работать.

Убрана в d52a699 (19.01.2019).

175

Re: MPC Video Renderer

Тормоза при воспроизведении DVD лечатся, если заменить предка CBaseRenderer на CBaseVideoRenderer.
Но в этом случае у нас 2 статистики. smile