MPC Video Renderer

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

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

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

V0lt

Цитата: Aleksoid1978Хотя - как декодер узнает что сменился дисплей/адаптер. Тут видео-рендерер должен реконнект делать.
Я сразу запускаю на доп. мониторе, не перемещаю.
[merge_posts_bbcode]Добавлено: 2018-03-21 06:26:26[/merge_posts_bbcode]

Я предлагаю основными режимами для DX11 считать программный и D3D11 декод. Декод DXVA2 считать нетипичным для него и не обращать на скорость его работы.
Почему? Просто гнать все в RGB с помощью StretchRect - это как подготавливать цех для производства костылей.

Aleksoid1978

Цитата: V0ltПо поводу StretchRect на доп. дисплее.
Как оказалось декодировало на Nvidia, а обрабатывало и выводило на Intel. Отсюда облом StretchRect.
Почему декодер так себя ведет - непонятно. Я думал декодер цепляется к адаптеру текущего окна. Баг декодера?

Вроде бы нашел причину и устранил. Проверяем и отписываемся.
[merge_posts_bbcode]Добавлено: 2018-03-21 18:50:34[/merge_posts_bbcode]

Вот интересно - а мы можем в нашем рендерере(это же не класс на основе окна) каким либо образом получать сообщения от клавиатуры. Почему спросил - ну вот как-то же madVr ловит нажатия клавиш и обрабатывает.
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

Не надо нашему VR ловить клавиатуру в принципе.
[merge_posts_bbcode]Добавлено: 2018-03-21 18:58:04[/merge_posts_bbcode]

Цитата: Aleksoid1978Вроде бы нашел причину и устранил. Проверяем и отписываемся.
Ситуация со статусами как будто не поменялась, но теперь воспроизведение не начинается.

[merge_posts_bbcode]Добавлено: 2018-03-21 22:09:35[/merge_posts_bbcode]

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

Aleksoid1978

Хм, странно. Ну попробую разобраться что сейчас не так.
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

Сделал деинтерлейс с удвоением частоты кадров для DX9. Но на текущий момент хорошая плавность не гарантируется.
[merge_posts_bbcode]Добавлено: 2018-03-24 14:47:13[/merge_posts_bbcode]

Захотел Я что-нибудь нарисовать на кадре. На DX11 вроде можно рисовать сразу на поверхности с помощью Direct2D.

А вот с DX9 засада. Чтобы нормально рисовать, придется использовать функции D3DX c соответствующей привязкой к d3dx9_43.dll.
Второй вариант - использовать SubStream в DXVA2-VP.

Aleksoid1978

Можешь рисовать с помощью GDI на поверхности, могу дать пример кода. Я в свое время хотел переделать вывод текста в EVR-CP.
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

GDI для EVR не годится из-за тормознутости, оно только для вывода статистики обновляемой не более 2 раз в секунду.
Напомни, каким образом там происходит наложение на кадр? Через AlphaBlt?

Aleksoid1978

Кстати по поводу Direct2D - тоже все не просто. Я так и не смог найти простой пример как на DX11 вывести текст.
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

ID2D1RenderTarget::DrawText не получилось завести?
У меня затык в CreateDxgiSurfaceRenderTarget на таком коде:
   if (filterState == State_Running) {
        hr = ProcessDX11(pBackBuffer, false);
    }

    {
        IDXGISurface* pDxgiSurface = nullptr;
        hr = pBackBuffer->QueryInterface(&pDxgiSurface);

        // Create the DXGI Surface Render Target.
        FLOAT dpiX;
        FLOAT dpiY;
        m_pD2dFactory->GetDesktopDpi(&dpiX, &dpiY);
        D2D1_RENDER_TARGET_PROPERTIES props = D2D1::RenderTargetProperties(D2D1_RENDER_TARGET_TYPE_DEFAULT, D2D1::PixelFormat(DXGI_FORMAT_UNKNOWN, D2D1_ALPHA_MODE_PREMULTIPLIED), dpiX, dpiY);

        CComPtr pD2dRT;
        hr = m_pD2dFactory->CreateDxgiSurfaceRenderTarget(pDxgiSurface, &props, &pD2dRT);
        if (S_OK == hr) {
            ID2D1SolidColorBrush* pD2dBrush = nullptr;
            hr = pD2dRT->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::Yellow), &pD2dBrush);
            if (S_OK == hr) {
                pD2dRT->BeginDraw();
                pD2dRT->DrawLine(D2D1::Point2F(0, 0), D2D1::Point2F(100, 100), pD2dBrush, 0.5f);
                pD2dRT->EndDraw();
            }
        }
    }

    hr = m_pDXGISwapChain1->Present(0, 0);
[merge_posts_bbcode]Добавлено: 2018-03-26 21:07:29[/merge_posts_bbcode]

Я тут ради эксперимента убрал ручную загрузку dxva2.dll. Теперь она загружается сразу при запуске рендерера (либо используется загруженная декодером/плеером). Если надо загружать только при первом обращении, то можно прописать в /DELAYLOAD (такое у нас используется в плеере для gdiplus.dll). Тоже самое можно без проблем проделать с d3d9.dll.

Aleksoid1978

Надо вместо
IDXGISurface* pDxgiSurface = nullptr;
hr = pBackBuffer->QueryInterface(&pDxgiSurface);
делать
hr = m_pDXGISwapChain1->GetBuffer(0, IID_PPV_ARGS(&pDxgiSurface));
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

Сделал, но ничего не поменялось.

Aleksoid1978

Вот патч. С ним все работает.
https://yadi.sk/d/Gdubwr783Tneht

В нем ессно все локально(по быстрому накидал) :)
[merge_posts_bbcode]Добавлено: 2018-03-27 17:52:06[/merge_posts_bbcode]

А вот с выводом текста - https://yadi.sk/d/51Q2Dg233To32d
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

Хорошо посмотрю.
PS: Как же бесит этот git, банальный патч не может применить. Каждый раз руками переношу. :mad:
 
Для режима DX9 мне удалось вывести текст на полупрозрачном фоне через GDI+.
[merge_posts_bbcode]Добавлено: 2018-03-27 22:41:27[/merge_posts_bbcode]

Aleksoid1978
Твой код для DX11 у меня почему-то не работает. Обновись и проверь сам.

Если починим, то завтра буду писать метод для включения-выключения OSD.

[merge_posts_bbcode]Добавлено: 2018-04-01 08:48:31[/merge_posts_bbcode]

Включение-выключение OSD сделано через опцию. Надо подумать чем ее наполнить.

Случайно наткнулся на описание IDXGISwapChain4::SetHDRMetaData, поддерживает HDR10.

С поддержкой тоже интересно:
IDXGISwapChain1 - Win8
IDXGISwapChain2 - Win8.1
IDXGISwapChain3 - Win10
IDXGISwapChain4 - Win10+
Как с этим зоопарком нормально работать? :)
Есть только игнорировать Win8, чтобы полегче было. :|
[merge_posts_bbcode]Добавлено: 2018-04-01 08:54:09[/merge_posts_bbcode]

Типа
DX9 - Win7 и новее.
DX11 - Win8.1 и новее.

Aleksoid1978

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

Если создать IDXGISwapChain4, то после можно без проблем использовать методы предков и кастовать до предков, если потребуется. Но это не будет работать ни на чем, кроме свежей 10-ки (возможно даже LTSB 1607 в пролете).

Если у нас IDXGISwapChain1, мы сможем кастонуть его до потомка?