Минус на минус
Sep. 16th, 2010 05:54 pmНедавно обнаружил в своей программе, что при отображении в окошке текущего обрабатываемого видео иногда цвета не совсем такие, как надо. Это было видно, если исходное видео в формате YV12, а в процессе преобразуется в RGB32. Причем в получающемся файле все нормально, проблема только в отображении на экране в процессе. И на многих видео проблема была не заметна, а заметна лишь чуть-чуть на некоторых видеофайлах. Стал разбираться, и выяснилось, что в коде преобразования цветов из цветового пространства YUV в RGB было две грубых ошибки: сначала перепутаны местами цветовые плоскости U и V, а потом перепутаны позиции красного и синего цветов в четверке RGBA. В результате две этих ошибки друг друга почти компенсировали:

Слева - что получалось при таком двойном путании компонент, а справа - правильная картинка.

Слева - что получалось при таком двойном путании компонент, а справа - правильная картинка.
no subject
Date: 2010-09-16 10:57 am (UTC)офигенная ошибка =)
Date: 2010-09-16 11:41 am (UTC)тут результат как раз очень и очень правдоподобен =)
Re: офигенная ошибка =)
Date: 2010-09-16 05:10 pm (UTC)Re: офигенная ошибка =)
Date: 2010-09-16 05:38 pm (UTC)Скажете эта ошибка не так появилась? Слишком красиво для двух независимых ошибок.
Да и вообще я повзрослел, поумнел и сто лет так не делаю! Чессснослово
Re: офигенная ошибка =)
Date: 2010-09-16 06:09 pm (UTC)Есть входные данные в формате YV12, состоящем из трех последовательных плоскостей разного размера - Y, U и V (первая ошибка - в YV12, в отличие от IYUV, сначала V, потом U). И есть формулы для перевода YUV-RGB, где в ходе редактирования и оптимизаций оказались перепутаны индексы.
no subject
Date: 2010-09-16 07:11 pm (UTC)Помню когда делал инструмент для снятия скриншотов с Wii, мальца поебался его декодировать: там фторой фреймбуфер (который ближе к телеку) как раз YUV, а именно Y'UV422.
Это, в числе прочих факторов, приводит к тому, что на современных high definition TFT телеках при внимательном разглядывании low definition картинки, выдаваемой Wii, возникают неуместные ассоциации с NES a.k.a. Dendy.
ЧСХ, первый фреймбуфер, который ближе к процу и дальше от телека, нормальный RGB по байту на компоненту на пиксель.
Скриншоты можно вынимать из обоих.
Угадай, какой из 2 фреймбуферов использовался для изготовления рекламных материалов? :-)
no subject
Date: 2010-09-20 08:38 am (UTC)Это точно, там даже порой использование "стандартных" решений приводит к неприятным сюрпризам:
http://www.infognition.com/blog/2010/yv12_conversion.html