В последних SVN-билдах был обнаружен баг, когда при открытии широкоформатных видео файлов в программном режиме, проявлялся так называемый "Белый квадрат", в верхнем левом углу окна проигрывателя.
Согласно многочисленным тестам, удалось выяснить, при каких условиях проявляется данный баг:
1. При открытии широкоформатных видео файлов с субтитрами, например MKV + встроенные субтитры
2. При наличии опции "Автомасштаб = 100%"
3. При использовании видео-рендерера"VMR-7 WL, без режима VMR Mixer + VSFilter
4. При наличии выходного формата NV12 в софте
5. При наличии широкоформатных видео файлов в программном режиме без субтитров
Удалось установить, что причиной проявления данного бага стало изменение под номером r592.
После данного изменения, при наличии вывода изображения через выходной формат NV12 в софте, стал проявляться так называемый белый квадрат.
Главным условием проявления данного бага является вывод изображения через выходной формат NV12 в софте.
После проверок различных вариантов с выходными форматами, было обнаружено, что баг пропадает только если отключить выходной формат NV12, при этом оставить все остальные форматы.
Отсюда следует, что наличие присутствия и проявления "Белого квадрата" зависит только от одного единственного выходного формата NV12.
Я в тикете #68 (https://sourceforge.net/p/mpcbe/tickets/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]
Или вот готовый файл (https://yadi.sk/d/rBmpY0hpkWGGG). Собирай, запускай и ищи лог на рабочем столе.
Фиг знает - по идее(и по логике) не должен этот код
if (m_FormatConverter.GetOutPixFormat() == PixFmt_RGB32)
отрабатывать если вывод NV12, да и к тому же каким образом отсутствие dxvaExtFormat должно мешать прорисовке ...
Короче народ - забейте да и все. Пора забывать про WinXP и ее поддержку. Работает - ну и ладно, поломалось - ну ничего не поделать. Вон ребята из MPC-HC - ради перехода на VS2015 вычистили VMR7r вывод(не стали как я париться с копированием нужного кода для DX7).
Цитата: 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).
Вот поэтому и надо разобраться с данным кодом. К тому же я выложил лог, так что рано сдаваться.
Ну и как я говорил, проверка на 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.
Цитата: 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 быть не должно и не может.
Цитата: Evgeniy1990Получается, что проблема в заполнении DXVAExtFormat, т.е. когда NV12 в программном режиме, этот формат активируется, хотя не должен, поскольку это софт-режим, следовательно никакого DXVA быть не должно и не может.
Этот флаг не имеет никакого отношения к DXVA декодированию, он относиться к DXVA-процессору в EVR. Почему он выстреливает на WinXP + VSFilter - видимо не нравиться вызываемый reconnect(который вызывается из-за измененного DXVAExtFormat).
По идее можно на WinXP вырубить - но есть же еще madVR. Посмотрим что можно сделать.
Цитата: Aleksoid1978Цитата: Evgeniy1990Получается, что проблема в заполнении DXVAExtFormat, т.е. когда NV12 в программном режиме, этот формат активируется, хотя не должен, поскольку это софт-режим, следовательно никакого DXVA быть не должно и не может.
Этот флаг не имеет никакого отношения к DXVA декодированию, он относиться к DXVA-процессору в EVR. Почему он выстреливает на WinXP + VSFilter - видимо не нравиться вызываемый reconnect(который вызывается из-за измененного DXVAExtFormat).
По идее можно на WinXP вырубить - но есть же еще madVR. Посмотрим что можно сделать.
Выстреливает не только при наличии VSFilter. Данный баг проявляется даже если просто запустить, например, AVI-шку с настройками по умолчанию, т.е. через NV12 в софте.
Цитата: Evgeniy1990Я предлагаю вам просто включить режим VMR Mixer по умолчанию для Windows XP, поскольку с ним данного бага вообще нет,
Ну у меня на 7-ке при выборе VMR-7w и нажатии кнопки "По умолчанию" включается галка как на "Режим VMR Mixer", так и на "YUV Mixing".
Цитата: 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]
V0ltAleksoid1978 сказал, что посмотрит, что можно сделать, так что способ исправить данный баг все же есть. Это касается реконнекта, после измененного 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?
Evgeniy1990
Через параметр dwControlFlags структуры VIDEOINFOHEADER2 передаются структура DXVA_ExtendedFormat, в которой записаны различные параметры для последующих преобразований в видеорендерере. Эти параметры используют EVR и madVR.
Проблема не в наличии DXVA_ExtendedFormat. Если рендерер такое не понимает, он просто игнорирует этот параметр и работает дальше. Проблема в том, что DXVA_ExtendedFormat меняется во время воспроизведения, происходит реконнект, от которого VMR-7w становиться плохо.
Мне лично нравится решение включить "Режим VMR Mixer" по умолчанию, но хорошо бы сначала вспомнить почему он сейчас отключен.
V0lt
Опция "Режим VMR Mixer" для WinXP была отключена по умолчанию, поскольку на видеокартах от ATI (AMD) во время воспроизведения наблюдалось "пиксельное" изображение. Также, на архитектуре Kepler был замечен очень сильный тиринг изображения.
Поэтому это тоже не лучший вариант, тем более, что это просто обход бага, а не его устранение, все-таки лучшим решением является отключение использования DXVAExtFormat для Windows XP.
А еще лучше сделать таким образом, чтобы он работал только если используется madVR.
VMR-рендереры, особенно на WinXP, не умеют с ним работать. Поэтому им становится плохо.
Вообще, WinXP в некоторых случаях просто не любит реконнект, а точнее не умеет с ним работать.
Так - если DXVA_ExtendedFormat формат поддерживает ТОЛЬКО EVR/MadVR, ну так просто и надо оставить только для них.
А где есть инфа по этому поводу, по использованию DXVA_ExtendedFormat в видео-рендерерах ??
Цитата: Aleksoid1978А где есть инфа по этому поводу, по использованию DXVA_ExtendedFormat в видео-рендерерах ??
Вот тут например -
Extended Color Information.
Да видел. Правда там явно не указано что "только" EVR. Но если так - то уберем поддержку VMR7/9
[merge_posts_bbcode]Добавлено: 2015-11-23 10:04:32[/merge_posts_bbcode]
Проверяем 968 ревизию.
Цитата: Aleksoid1978Проверяем 968 ревизию.
Собрал и проверил билд r968 на Windows XP. При открытии широкоформатных видео файлов, а также и SD-файлов, при использовании выходного формата NV12 в софте, больше не проявляется "Белый квадрат". При многоразовом открытии одного и того же файла, а также и различных видео файлов, при данных условиях, "Белый квадрат" аналогично больше не проявлялся. В общем, проблема устранена.
Цитата: Aleksoid1978Да видел. Правда там явно не указано что "только" EVR. Но если так - то уберем поддержку VMR7/9
В r968 ты запретил не VMR7/9 а все, кроме EVR и madVR.
А вообще правильнее выдавать правильный параметр сразу, чтобы реконнектов в принципе не было.
Цитата: V0ltЦитата: Aleksoid1978Да видел. Правда там явно не указано что "только" EVR. Но если так - то уберем поддержку VMR7/9
В r968 ты запретил не VMR7/9 а все, кроме EVR и madVR.
А вообще правильнее выдавать правильный параметр сразу, чтобы реконнектов в принципе не было.
Ну все верно - кроме EVR/madVR никто и не умеет с этим форматом работать. А по поводу задавать сразу - это физически невозможно. Выходной медиа-тип создается еще на стадии коннекта, в этот момент еще ничего не известно о том с какими данными приходиться работать.
P.S. Хотя - надо будет попробовать, есть одна мысль :)
[merge_posts_bbcode]Добавлено: 2015-11-23 14:47:14[/merge_posts_bbcode]
Так - вот здесь лежит тестовый билд + патч
https://yadi.sk/d/elLkhIA9kexzKСмысл в чем - пытаемся заполнить DXVA2_ExtendedFormat еще на моменте открытия. Такое возможно только если сам формат такое позволяет(заполнены данные extradata нужными значениями). Если данных нет - то reconnect будет после декодирования первого кадра.
Так же - мы не знаем к чему коннектимся, поэтому в случае madVR все равно может произойдет reconnect(там свои нюансы). Ну и так же reconnect будет если выбран вывод RGB32(т.к. для него мы уже убираем заполнение данной структуры).
Aleksoid1978
Был обнаружен еще один случай проявления "белого квадрата", на этот раз - при открытии анаморфных видео файлов.
Итак, условия его проявления:
1. Выключена опция "Автомасштаб = 100%"
2. В видео декодере стоит "Среднее" или состояние "Включено" (Checked - галочка)
При данных условиях, при открытии анаморфных видео файлов, проявляется этот "белый квадрат".
Если опция "Автомасштаб =100%" - включена, то "белый квадрат" не проявляется.
Насколько я понял, тут его проявление зависит от выбранного состояния в самом видео декодере.
Так как, при автомасштабе = 100%, можно заметить, что открытие таких видео файлов происходит образно в три этапа, не считая главного окна самого плеера, т.е. само масштабирование соотношения сторон, то можно сказать, что здесь есть нечто вроде реконнекта, особенно в "среднем состоянии".
Т.е. есть некое действие, не знаю только что это, реконнект, или что-то еще, которое вызывает проявление "белого квадрата".
Если выключить автомасштаб =100% и включить состояние "Включено", то также можно обнаружить проявление "белого квадрата".
Отсюда следует вывод: "белый квадрат" проявляется, когда соотношение сторон считывается из видео потока.