Нечетные размеры кадра 4:2:0 и 4:2:2

Автор V0lt, 29 ноября 2024, 22:35:02

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

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

V0lt

Тема нечетных размеров кадра YUV 4:2:0 и 4:2:2 уже несколько раз поднималась. И вот опять.
Аргументом в этот раз стало "LAV Video Decoder ведь может работать с EVR с такими размерами кадра".

Хорошо. Попробуем еще раз.

Во-первых. Если у кадра YUV 4:2:0 нечетные ширина и высота или у кадра YUV 4:2:2 нечетная ширина, то эти кадры испорчены по определению. Другого варианта нет. Потому что для крайних левых и крайних нижних (для 4:2:0) пикселей будет отсутствовать цветовая компонента.

Во-вторых. Если какой-то рендерер отображает такие кадры, то это лишь потому что:
1) алгоритм преобразования довольно простой, поэтому в большинстве случаев работает без критичных ошибок;
2) алгоритм специально доработали для такого случая.
Я больше склоняюсь к первому варианту, потому что чаще софт старается игнорировать такое.

Итак, почему работает в LAV Video Decoder и EVR?
Для NV12 происходят следующие вещи:
1. При вычислении размеров плоскостей UV используется деление со стандартным округлением, т.е. в меньшую сторону. То же самое делает декодер. В итоге нет выхода за границы и падений.
2. Крайние нечетные пиксели слева игнорируются. Можете сделать скриншот и посчитать.
3. Крайние нечетные нижние пиксели остаются, но получаются без цвета (потому хромы нет). Аналогично проверяется скриншотом.

Естественно, все возможные варианты не проверял.

Можно ли сделать такое для MPC Video Decoder?
В целом да. Также придется доработать MPC Video Renderer, чтобы "правильнее" подцеплялся к декодеру. Патчи Aleksoid1978 сделал.

Но Я не хотел бы таких изменений до следующих релизов. Высока вероятность крахов. А то, что такие видео будут некорректно отображаться, итак понятно.
Также непонятно как сделать такие кривые видео из картинок-шаблонов. Современные энкодеры не дураки, кривизну не кушают.


Aleksoid1978

#1
В том то и дело - что в декодере наоборот, не надо ничего делать. Декодер должне декодировать, он (ffmpeg) это успешно делает, далее конверт из I420, он это тоже успешно делает.
Все - далее уже рулит видео-рендерер. MPC VR с этим справляется через шейдеры. EVR/EVR-CP тоже с этим успешно справляются.
Причем - если прям сильно надо, то и MPC VR можно сделать так чтобы мог через VP, но это я думаю уже лишнее ради такой "кривизны".

30 ноября 2024, 06:46:24
Проверил - 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

Ok. Уговорил. Заливай патчи. Сначала для плеера, потом для видеорендерера.