Проявление "Белого квадрата", при открытии файлов [Исправлено]

Автор Evgeniy1990, 15 ноября 2015, 17:49:20

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

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

Evgeniy1990

В последних SVN-билдах был обнаружен баг, когда при открытии широкоформатных видео файлов в программном режиме, проявлялся так называемый "Белый квадрат", в верхнем левом углу окна проигрывателя.

Согласно многочисленным тестам, удалось выяснить, при каких условиях проявляется данный баг:

1. При открытии широкоформатных видео файлов с субтитрами, например MKV + встроенные субтитры
2. При наличии опции "Автомасштаб = 100%"
3. При использовании видео-рендерера"VMR-7 WL, без режима VMR Mixer + VSFilter
4. При наличии выходного формата NV12 в софте
5. При наличии широкоформатных видео файлов в программном режиме без субтитров

Удалось установить, что причиной проявления данного бага стало изменение под номером r592.
После данного изменения, при наличии вывода изображения через выходной формат NV12 в софте, стал проявляться так называемый белый квадрат.

Главным условием проявления данного бага является вывод изображения через выходной формат NV12 в софте.

После проверок различных вариантов с выходными форматами, было обнаружено, что баг пропадает только если отключить выходной формат NV12, при этом оставить все остальные форматы.
Отсюда следует, что наличие присутствия и проявления "Белого квадрата" зависит только от одного единственного выходного формата NV12.
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

Я в тикете #68 примерно написал как поставить брейкпоинт и запустить в отладочном режиме. Просьба проверять на текущей версии.
[merge_posts_bbcode]Добавлено: 2015-11-16 18:41:31[/merge_posts_bbcode]

Доработай MPCVideoDec.cpp следующим образом

добавь log.h
#include "stdafx.h"
#include
#include
#include "../../../DSUtil/ff_log.h"
#include "../../../DSUtil/log.h"
и вызов LOG2FILE.
       if (m_FormatConverter.GetOutPixFormat() == PixFmt_RGB32) { // RGB output
            dxvaExtFormat.value = 0;
            LOG2FILE(L"dxvaExtFormat set 0\\n");
        } else {
            dxvaExtFormat = GetDXVA2ExtendedFormat(m_pAVCtx, m_pFrame);
            LOG2FILE(L"dxvaExtFormat set for YUV\\n");
        }
Собери и запусти на XP.

[merge_posts_bbcode]Добавлено: 2015-11-17 06:35:28[/merge_posts_bbcode]

Или вот готовый файл. Собирай, запускай и ищи лог на рабочем столе.

Aleksoid1978

Фиг знает - по идее(и по логике) не должен этот код
if (m_FormatConverter.GetOutPixFormat() == PixFmt_RGB32)отрабатывать если вывод NV12, да и к тому же каким образом отсутствие dxvaExtFormat должно мешать прорисовке ...

Короче народ - забейте да и все. Пора забывать про WinXP и ее поддержку. Работает - ну и ладно, поломалось - ну ничего не поделать. Вон ребята из MPC-HC - ради перехода на VS2015 вычистили VMR7r вывод(не стали как я париться с копированием нужного кода для DX7).
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

Evgeniy1990

Цитата: V0ltЯ в тикете #68 примерно написал как поставить брейкпоинт и запустить в отладочном режиме. Просьба проверять на текущей версии.
[merge_posts_bbcode]Добавлено: 2015-11-16 18:41:31[/merge_posts_bbcode]

Доработай MPCVideoDec.cpp следующим образом

добавь log.h
#include "stdafx.h"
#include
#include
#include "../../../DSUtil/ff_log.h"
#include "../../../DSUtil/log.h"
и вызов LOG2FILE.
       if (m_FormatConverter.GetOutPixFormat() == PixFmt_RGB32) { // RGB output
            dxvaExtFormat.value = 0;
            LOG2FILE(L"dxvaExtFormat set 0\\n");
        } else {
            dxvaExtFormat = GetDXVA2ExtendedFormat(m_pAVCtx, m_pFrame);
            LOG2FILE(L"dxvaExtFormat set for YUV\\n");
        }
Собери и запусти на XP.

[merge_posts_bbcode]Добавлено: 2015-11-17 06:35:28[/merge_posts_bbcode]

Или вот готовый файл. Собирай, запускай и ищи лог на рабочем столе.

V0lt, я добавил ваши строки в проектный файл MPCVideoDec.cpp
#include "../../../DSUtil/log.h
LOG2FILE(L"dxvaExtFormat set 0\\n");
LOG2FILE(L"dxvaExtFormat set for YUV\\n");
1. Собрал ведущий (HEAD)-билд r942 и запустил его на XP.
2. Воспроизвел баг, закрыл плеер.
3. После закрытия плеера, на рабочем столе был создан лог-файл "mpc-be.log"

Прилагаю для вас данный лог-файл: https://yadi.sk/i/ei1hSab0kWHZi
[merge_posts_bbcode]Добавлено: 2015-11-17 07:47:37[/merge_posts_bbcode]

Цитата: Aleksoid1978Фиг знает - по идее(и по логике) не должен этот код
if (m_FormatConverter.GetOutPixFormat() == PixFmt_RGB32)отрабатывать если вывод NV12, да и к тому же каким образом отсутствие dxvaExtFormat должно мешать прорисовке ...

Короче народ - забейте да и все. Пора забывать про WinXP и ее поддержку. Работает - ну и ладно, поломалось - ну ничего не поделать. Вон ребята из MPC-HC - ради перехода на VS2015 вычистили VMR7r вывод(не стали как я париться с копированием нужного кода для DX7).
Вот поэтому и надо разобраться с данным кодом. К тому же я выложил лог, так что рано сдаваться.
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.

Aleksoid1978

Ну и как я говорил, проверка на RGB32 не срабатывает(судя по логу).
Значит - это не зависит от этого изменения :)

А попробуй вот что, вообще убрать заполнение dxvaExtFormat, строчку:
if (FAILED(hr = GetDeliveryBuffer(m_pAVCtx->width, m_pAVCtx->height, &pOut, GetFrameDuration(), &dxvaExtFormat)) || FAILED(hr = pOut->GetPointer(&pDataOut))) {
замени на:
if (FAILED(hr = GetDeliveryBuffer(m_pAVCtx->width, m_pAVCtx->height, &pOut, GetFrameDuration())) || FAILED(hr = pOut->GetPointer(&pDataOut))) {

Собери и проверь на WinXP.
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

Evgeniy1990

Цитата: Aleksoid1978Ну и как я говорил, проверка на RGB32 не срабатывает(судя по логу).
Значит - это не зависит от этого изменения :)

А попробуй вот что, вообще убрать заполнение dxvaExtFormat, строчку:
if (FAILED(hr = GetDeliveryBuffer(m_pAVCtx->width, m_pAVCtx->height, &pOut, GetFrameDuration(), &dxvaExtFormat)) || FAILED(hr = pOut->GetPointer(&pDataOut))) {
замени на:
if (FAILED(hr = GetDeliveryBuffer(m_pAVCtx->width, m_pAVCtx->height, &pOut, GetFrameDuration())) || FAILED(hr = pOut->GetPointer(&pDataOut))) {

Собери и проверь на WinXP.
Убрал "&dxvaExtFormat", отредактировал строку, собрал билд и проверил его на WinXP.
В результате, ваше изменение помогло, т.е. при наличии вывода через NV12 в софте, данного бага больше нет, он не проявляется.

Получается, что проблема в заполнении DXVAExtFormat, т.е. когда NV12 в программном режиме, этот формат активируется, хотя не должен, поскольку это софт-режим, следовательно никакого DXVA быть не должно и не может.
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.

Aleksoid1978

Цитата: Evgeniy1990Получается, что проблема в заполнении DXVAExtFormat, т.е. когда NV12 в программном режиме, этот формат активируется, хотя не должен, поскольку это софт-режим, следовательно никакого DXVA быть не должно и не может.

Этот флаг не имеет никакого отношения к DXVA декодированию, он относиться к DXVA-процессору в EVR. Почему он выстреливает на WinXP + VSFilter - видимо не нравиться вызываемый reconnect(который вызывается из-за измененного DXVAExtFormat).

По идее можно на WinXP вырубить - но есть же еще 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

Evgeniy1990

Цитата: Aleksoid1978
Цитата: Evgeniy1990Получается, что проблема в заполнении DXVAExtFormat, т.е. когда NV12 в программном режиме, этот формат активируется, хотя не должен, поскольку это софт-режим, следовательно никакого DXVA быть не должно и не может.

Этот флаг не имеет никакого отношения к DXVA декодированию, он относиться к DXVA-процессору в EVR. Почему он выстреливает на WinXP + VSFilter - видимо не нравиться вызываемый reconnect(который вызывается из-за измененного DXVAExtFormat).

По идее можно на WinXP вырубить - но есть же еще madVR. Посмотрим что можно сделать.
Выстреливает не только при наличии VSFilter. Данный баг проявляется даже если просто запустить, например, AVI-шку с настройками по умолчанию, т.е. через NV12 в софте.
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Я предлагаю вам просто включить режим VMR Mixer по умолчанию для Windows XP, поскольку с ним данного бага вообще нет,
Ну у меня на 7-ке при выборе VMR-7w и нажатии кнопки "По умолчанию" включается галка как на "Режим VMR Mixer", так и на "YUV Mixing".

Evgeniy1990

Цитата: V0lt
Цитата: Evgeniy1990Я предлагаю вам просто включить режим VMR Mixer по умолчанию для Windows XP, поскольку с ним данного бага вообще нет,
Ну у меня на 7-ке при выборе VMR-7w и нажатии кнопки "По умолчанию" включается галка как на "Режим VMR Mixer", так и на "YUV Mixing".
Галочка VMR Mixer по умолчанию активна (включена) только для Windows 7 и выше.
Для Windows XP она неактивна (выключена) по умолчанию.
[merge_posts_bbcode]Добавлено: 2015-11-20 22:31:16[/merge_posts_bbcode]

V0lt

Aleksoid1978 сказал, что посмотрит, что можно сделать, так что способ исправить данный баг все же есть. Это касается реконнекта, после измененного DXVAExtFormat. В любом случае, подождем его решения.

[merge_posts_bbcode]Добавлено: 2015-11-20 22:53:58[/merge_posts_bbcode]

Цитата: Aleksoid1978
Цитата: Evgeniy1990Получается, что проблема в заполнении DXVAExtFormat, т.е. когда NV12 в программном режиме, этот формат активируется, хотя не должен, поскольку это софт-режим, следовательно никакого DXVA быть не должно и не может.

Этот флаг не имеет никакого отношения к DXVA декодированию, он относиться к DXVA-процессору в EVR. Почему он выстреливает на WinXP + VSFilter - видимо не нравиться вызываемый reconnect(который вызывается из-за измененного DXVAExtFormat).

По идее можно на WinXP вырубить - но есть же еще madVR. Посмотрим что можно сделать.
Я считаю, что проще всего выключить заполнение DXVAExtFormat для Windows XP тем более, что данной системе он вообще не нужен. Но я не понял причем тут madVR? Или его отключение как-то повлияет на madVR на WinXP?
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
Через параметр dwControlFlags структуры VIDEOINFOHEADER2 передаются структура DXVA_ExtendedFormat, в которой записаны различные параметры для последующих преобразований в видеорендерере. Эти параметры используют EVR и madVR.

Проблема не в наличии DXVA_ExtendedFormat. Если рендерер такое не понимает, он просто игнорирует этот параметр и работает дальше. Проблема в том, что DXVA_ExtendedFormat меняется во время воспроизведения, происходит реконнект, от которого VMR-7w становиться плохо.

Мне лично нравится решение включить "Режим VMR Mixer" по умолчанию, но хорошо бы сначала вспомнить почему он сейчас отключен.

Evgeniy1990

V0lt
Опция "Режим VMR Mixer" для WinXP была отключена по умолчанию, поскольку на видеокартах от ATI (AMD) во время воспроизведения наблюдалось "пиксельное" изображение. Также, на архитектуре Kepler был замечен очень сильный тиринг изображения.

Поэтому это тоже не лучший вариант, тем более, что это просто обход бага, а не его устранение, все-таки лучшим решением является отключение использования DXVAExtFormat для Windows XP.

А еще лучше сделать таким образом, чтобы он работал только если используется madVR.
VMR-рендереры, особенно на WinXP, не умеют с ним работать. Поэтому им становится плохо.
Вообще, WinXP в некоторых случаях просто не любит реконнект, а точнее не умеет с ним работать.
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.

Aleksoid1978

Так - если DXVA_ExtendedFormat формат поддерживает ТОЛЬКО EVR/MadVR, ну так просто и надо оставить только для них.

А где есть инфа по этому поводу, по использованию DXVA_ExtendedFormat в видео-рендерерах ??
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А где есть инфа по этому поводу, по использованию DXVA_ExtendedFormat в видео-рендерерах ??
Вот тут например - Extended Color Information.

Aleksoid1978

Да видел. Правда там явно не указано что "только" EVR. Но если так - то уберем поддержку VMR7/9
[merge_posts_bbcode]Добавлено: 2015-11-23 10:04:32[/merge_posts_bbcode]

Проверяем 968 ревизию.
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