MPC Video Renderer

Автор V0lt, 24 февраля 2018, 19:10:59

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

V0lt

Исходный код: https://github.com/Aleksoid1978/VideoRenderer
История коммитов
История изменений (history.txt)
Релиз 0.8.5.2268

Ночные сборки:
GitHub automated builds

Тестовые сборки.
Тестовые сборки от Evgeniy_1990.

Минимальные системные требования:
Windows 7 и новее
Видеокарта с поддержкой DirectX 9

Рекомендуемые системные требования (для использования D3D11 API):
Windows 8.1 и новее
Видеокарта с поддержкой DirectX 10/11

Рекомендуемые системные требования для вывода HDR
Windows 10 и новее
Видеокарта с поддержкой DirectX 11 и выводом HDMI 2.0b или новее.
Дисплей c поддержкой HDR10.

Основные возможности:
- Видеопроцессор на шейдерах для NV12, YV12, YUY2, YV16, P010, P016, YV24, AYUV, P210, P216, Y410, Y416, RGB24/32/48/64, b48r, b64a, Y8, Y16.
- Умеет работать с аппаратным декодером DXVA2 для всех режимов.
- Поддерживает вывод субтитров в связке с MPC-BE 1.5.4+.
- Поддерживает видео HDR (HDR10, HLG и частично Dolby Vision).
- Автоматическое преобразование HDR в SDR.
- Поворот кадра (поддерживается MPC-BE).
- Дизеринг при финальном уменьшении глубины цвета с 10/16 бит до 8 бит.

Дополнительные возможности режима DirectX 9:
- DXVA2 Video Processor с аппаратным деинтерлейсом для YV12, NV12, YUY2, P010 (+ хак для RGB для Intel).

Дополнительные возможности режима DirectX 11:
- Direct3D11 Video Processor с аппаратным деинтерлейсом для NV12, YUY2, P010 (+ RGB для Intel и AMD).
- Умеет работать с аппаратным декодером D3D11.
- Умеет передавать данные HDR10 на дисплей (требуется Windows 10 и дисплей с поддержкой HDR10)

Aleksoid1978

#1
Скриншот окна настроек:


Описание настроек

Use Direct3D11
Видеорендерер будет по возможности использовать Direct3D 11, а не Direct3D9. Требуется Windows 7 SP1, рекомендуется Windows 8.1 или новее.

Texture format
Формат текстуры, который будет использоваться для хранения промежуточных результатов обработки.
PS: Формат 16-bit Floating Point увеличивает потребление видеопамяти.

Show statistics
Поверх кадра будет нарисована статистика с различной информацией. Рекомендуется ее включать, чтобы сделать скриншот при наличии каких-либо проблем.


----- DXVA2 and D3D11 video processor -----

Use for: NV12, P010/P016, YUY2, Other supported formats
Указаны форматы для которых при возможности будет использоваться видеопроцессор DXVA2 или D3D11.  Видеопроцессоры DXVA2 и D3D11 как правило работают быстрее, чем шейдеры, а так же умеют делать деинтерлейс.
PS: Интерлейсные кадры обычно бывают в формате NV12 или YUY2.

Double the frame rate when deinterlacing
При работе деинтерлейса выходная частота будет удваиваться.

Use for resizing
Видеопроцессор DXVA2 или D3D11 будет использоваться для изменения размера кадра.
Работает быстро, но может быть некачественной. Например, на видеокартах Nvidia используется билинейная интерполяция (плохо), на графике Intel - бикубическая (хорошо).

Request Super Resolution
Рендерер сделает запрос на использование Super Resolution. Поддержка зависит от типа графического адаптера и драйверов.
Должно работать на Intel Gen10+ и RTX 30/40 со свежими драйверами.


----- Shader video processor -----

Chroma scaling
Алгоритм увеличения цветовой составляющей с 4:2:0 и 4:2:2 до 4:4:4.

Upscaling
Алгоритм интерполяции, который используется для увеличения кадра.

Downscaling
Алгоритм свертки, который используется для уменьшения кадра.

Use the "Upscaling" method to reducing the frame to 50%
Алгоритм интерполяции будет использован также для уменьшения кадра до 50%.

Use dithering
Позволяет использовать дизеринг при финальном уменьшении глубины цвета с 10/16 бит до 8 бит. Дизеринг может улучшить отображение плавных переходов. На небольших дисплеях эффект скорее всего не будет заметен.

Use Blend deinterlacing for YUV 4:2:0
Для кадров помеченных как интерлейсные будет применен простой деинтерлейс Blend.


----- HDR -----

Prefer Dolby Vision over PQ and HLG
Опция используется для совместимых форматов Dolby Vision. По умолчанию выключена, т.к. картинка почти не меняется, но заметно возрастает нагрузка на видеокарту.

Passthrough to display
Позволяет передавать метаданные HDR-видео на дисплей.
Требования: Windows 10; дисплей с поддержкой HDR10; видеокарта с поддержкой HDMI 2.0b или DisplayPort 1.4.

Convert to SDR
Позволяет преобразовать видео HDR в SDR и корректно отображать на обычных дисплеях.

Windows HDR
Автоматически переключает дисплей в режим HDR.
Требования: Windows 10; дисплей с поддержкой HDR10; видеокарта с поддержкой HDMI 2.0b или DisplayPort 1.4

Subtitle and OSD brightness
Изменяет яркость субтитров для видео HDR, когда активен Passthrough to display.


----- ----- -----

Swap effect
Способ отображения кадра на рабочий стол. Как правило режим Discard стабильнее, но режим Flip может оказаться быстрее.

Use exclusive fullscreen
Может решить проблему неплавного воспроизведения на дополнительном дисплее.

Wait for V-Blank before Present
Позволяет более точно определять время вывода кадра, что может улучшить плавность воспроизведения. Благодаря этой опции график SyncOffset более точно отображает неравномерность вывода кадров.

Reinitialize D3D device when changing display
Если переместить окно на другой дисплей, то произойдет сброс и повторная инициализация устройства Direct3D. Это позволяет решить некоторые проблемы мультимониторых конфигураций.
AMD Ryzen 5 3600 /GIGABYTE B450 Gaming X /AMD Radeon R9 16Gb@3200 /Kingston 500Gb M.2 /GTX 1650 /Samsung U28R550UQI /OLED Philips 55OLED707 /Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

V0lt

#2
Известные проблемы:
1. Вызывает падение Mpeg2DecFilter при открытии DVD-Video в формате PAL.
Исправлено в 2ed2b74.
2. Шейдерная интерполяция в режиме D3D11 работает некорректно. Остаются остатки кадра при уменьшении области кадра, есть артефакты в виде лесенки при зуммировании.
Исправлено в f894845 и cfd2448.
3. Рендерер по непонятным причинам несовместим с "Microsoft DTV-DVD Video Decoder".
Исправлено в 6156c3f.
4. На паузе после сворачивания и последующего разворачивания вместо текущего кадра виден черный экран.
Исправлено в 29d96a0 + MPC-BE 1.5.4.4589.
5. Если имеется второй адаптер, к которому подключен дополнительный дисплей, то в режиме DX11 не работают аппаратные декодеры DXVA2 и D3D11.
Исправлено в MPC-BE 1.5.4.4581.
6. При активном окне настроек переключение на другое видео ломает воспроизведение.
Исправлено в MPC-BE 1.5.4.4611.
7. При повороте кадра без масштабирования, когда он перестает помещаться по высоте в окно, искажаются пропорции.
Исправлено в b5fae7b.



Планы (без сроков естественно):
1. Доработать шейдер конвертации цвета. Сейчас, например, есть проблема с HLG, и не учитываются некоторые параметры.
Сделано в 0.5.1.1594
2. Добавить возможность использовать эксклюзивный полный экран.
Сделано в 0.4.6.1323 - 0.4.8.1407
В перспективе это даст более плавное воспроизведение на дополнительном дисплее и возможность вывода в формате 10-бит.
3. Улучшить вывод текста статистики, чтобы одинаково хорошо отображалось на светлом и темном фоне.
Сделано в 0.4.8.1359_git2020.06.22-bf8a50c
4. Сделать какой-нибудь график в статистики для большей наглядности.
Сделано в 0.4.6.1267_git2020.05.01-61ed451
5. Реализовать интерфейс для рендеринга субтитров на текстуре D3D11.
Сделано в 208ac10.
6. Реализовать очередь входных кадров. Нужен как минимум 1 кадр из будущего для улучшения деинтерлейса и возможной поддержки увеличения частоты видео (D3D11).
7. Реализовать очередь выходных кадров. Это позволит решить некоторые проблемы с плавностью. Например после увеличения частоты видео после деинтерлейса.

2021
8. Попытаться разделить инициализацию медиатипа и ресурсов DXVA/Direct3D.
9. Реализовать поддержку внутренних и внешних шейдеров до изменения размера кадра.
10. Реализовать возможность получения картинок в формате 16-бит на канал.
11. Добавить коррекцию субтитров и OSD при выводе в режиме HDR.
Сделано в fa49343.

Aleksoid1978

#3
Получение отладочного лога

1. Установить отладочную (Debug) версию MPC Video Renderer.
2. Скачать, распаковать и запустить DebugView.
3. Выбрать в плеере MPC Video Renderer и запустить воспроизведение.
4. В окне DebugView будут появляться отладочные сообщения, можно воспроизводить проблемную ситуацию.
5. Когда необходимая информация собрана, сохранить отладочные сообщения в LOG-файл (DebugView > File > Save As...).
AMD Ryzen 5 3600 /GIGABYTE B450 Gaming X /AMD Radeon R9 16Gb@3200 /Kingston 500Gb M.2 /GTX 1650 /Samsung U28R550UQI /OLED Philips 55OLED707 /Yamaha RX-V471 + NS-555 + NS-C444 + NS-333 + YST-SW215

V0lt

Два вопроса:

1. Ты сможешь запустить DXVA-HD Sample?
У меня какие-то тупые ошибки выдает.

Разобрался. Там было /WX включено и предупреждения работали как ошибки.

2. Может откажемся от Precompiled Headers в основном проекте?
А то сейчас невозможно сторонний код в отдельную папку "thirdparty" закинуть.
[merge_posts_bbcode]Добавлено: 2018-03-03 10:39:56[/merge_posts_bbcode]

Могу попробовать добавить DXVA2-VideoProc, чтобы на AMD экспериментировать.

PS: Пока интерполяция DXVA-HD неправильно работает.

Evgeniy1990

Цитата: V0ltМогу попробовать добавить DXVA2-VideoProc, чтобы на AMD экспериментировать.
Добавьте пожалуйста "DXVA2-VideoProc", очень хочется прогнать/потестировать новый видео-рендерер на AMD-видеокарте.

Кстати, очень даже шикарная идея реализовать свой собственный видео-рендерер. Круто! ;)
Motherboards: ASUS P5Q/GIGABYTE EP35C-DS3R, CPU: Core 2 Duo E8300/E8400, Memory: DDR2/DDR3, Video: MSI GTX 465/ASUS EAH5770/GTX 650 Ti, Audio: ASUS Xonar DG 5.1/Creative SB 5.1. VX/X-Fi Xtreme Gamer.

V0lt

Evgeniy1990
Рендерер еще ничего не умеет, а то что умеет - делает не очень. Доведение до ума будет долгим.

Evgeniy1990

Цитата: V0ltРендерер еще ничего не умеет, а то что умеет - делает не очень. Доведение до ума будет долгим.
Я понимаю, что пока он ничего не умеет, ведь проект только что недавно появился. Естественно потребуется немало времени, чтобы довести его до ума. Но вы - молодцы! ;)

Если наш проект "MPC-BE" получит свой собственный видео-рендерер, да еще и полнофункциональный, со временем,
то это будет самый настоящий шедевр. :)
Motherboards: ASUS P5Q/GIGABYTE EP35C-DS3R, CPU: Core 2 Duo E8300/E8400, Memory: DDR2/DDR3, Video: MSI GTX 465/ASUS EAH5770/GTX 650 Ti, Audio: ASUS Xonar DG 5.1/Creative SB 5.1. VX/X-Fi Xtreme Gamer.

V0lt

В общем DXVA2-VideoProc добавлен и включен по умолчанию.
Есть проблема с программным декодированием, его посмотрю попозже.

Evgeniy1990

Цитата: V0ltВ общем DXVA2-VideoProc добавлен и включен по умолчанию.
Есть проблема с программным декодированием, его посмотрю попозже.
Огромное вам спасибо за ваши труды! Превосходно! ;)
У меня наконец-то появилось изображение, при использовании данного видео-рендерера на "AMD Radeon HD 5770", но пока только в аппаратном режиме. В софтовом режиме пока зеленый экран. В общем, как вы и сказали, с программным декодированием есть проблемы.

Отличное начало! ;)
Motherboards: ASUS P5Q/GIGABYTE EP35C-DS3R, CPU: Core 2 Duo E8300/E8400, Memory: DDR2/DDR3, Video: MSI GTX 465/ASUS EAH5770/GTX 650 Ti, Audio: ASUS Xonar DG 5.1/Creative SB 5.1. VX/X-Fi Xtreme Gamer.

V0lt

В общем YUY2 и RGB32 сейчас показывают нормально, NV12, YV12 и P010 - зелень. Надо разбираться...

Позже сравню уменьшение RGB32 на Nvidia и Intel. Если все правильно работает, то на Intel картинка будет выглядеть лучше.

Evgeniy1990

Цитата: V0ltВ общем YUY2 и RGB32 сейчас показывают нормально, NV12, YV12 и P010 - зелень. Надо разбираться...
На AMD-видеокарте на любом выходном формате присутствует зелень в программном режиме.
На RGB32 видно движение кадров, хотя скорее помех внутри зелени.
Motherboards: ASUS P5Q/GIGABYTE EP35C-DS3R, CPU: Core 2 Duo E8300/E8400, Memory: DDR2/DDR3, Video: MSI GTX 465/ASUS EAH5770/GTX 650 Ti, Audio: ASUS Xonar DG 5.1/Creative SB 5.1. VX/X-Fi Xtreme Gamer.

V0lt

Вывод NV12, P010 исправлен, YV12 выводится почти правильно.

Evgeniy1990
Странно что у тебя YUY2 некорректно выводит. Надо будет делать специальную сборку с отладочным логом. :(

Evgeniy1990

Цитата: V0ltВывод NV12, P010 исправлен, YV12 выводится почти правильно.

Evgeniy1990
Странно что у тебя YUY2 некорректно выводит. Надо будет делать специальную сборку с отладочным логом. :(
Я и сам удивился, что YUY2 выводит с зеленью.

Собрал последний, на данный момент, commit 6e82636. Проверил выходной формат YUY2 - теперь зелени нет, но зато вообще полный ступор, изображение не движется, кадры не воспроизводятся.

Сделайте лучше специальную сборку с отладочным логом. Я обязательно проверю и выложу вам лог-файл.
Думаю, что по нему, вам будет понятно что не так.
[merge_posts_bbcode]Добавлено: 2018-03-03 22:34:30[/merge_posts_bbcode]

V0lt
Заметил такую странность:

Если мы меняем выходной формат в видео декодере еще до открытия самих видео файлов, то все они работают нормально.

А если мы меняем выходные форматы уже во время воспроизведения видео файлов, то могут быть проблемы.
Например, в моем случае, я переключаю выходные форматы по порядку, т.е. вот так:

NV12 -> YV12 -> YUY2 -> RGB32 -> P010

Так вот, при смене с NV12 на YV12 - переключение нормальное, а вот дальше уже начинаются проблемы.

1. Если во время воспроизведения некоего видео файла отключить в видео декодере выходные форматы NV12 и YV12, то при переключении на выходной формат YUY2, изображение просто стоит на месте.

2. Далее - отключаю YUY2, во время воспроизведения некоего видео файла, в видео декодере, включается RGB32.

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

3. Далее - отключаю RGB32, во время воспроизведения некоего видео файла, в видео декодере, включается P010.

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

В общем, все эти проблемы возникают при условии переключения выходных форматов в видео декодере, уже во время воспроизведения неких видео файлов. Вот именно с этим и необходимо разобраться, устранить их.
Motherboards: ASUS P5Q/GIGABYTE EP35C-DS3R, CPU: Core 2 Duo E8300/E8400, Memory: DDR2/DDR3, Video: MSI GTX 465/ASUS EAH5770/GTX 650 Ti, Audio: ASUS Xonar DG 5.1/Creative SB 5.1. VX/X-Fi Xtreme Gamer.

V0lt

Цитата: Evgeniy1990А если мы меняем выходные форматы уже во время воспроизведения видео файлов, то могут быть проблемы.
Не надо так делать. В коде это пока не предусмотрено.