rodrigo2
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Bladru Цитата: Важен не только выходной диапазон, но и входной | Да, безусловно. Цитата: Наиболее надёжный способ избежать проблем с цветовыми пространствами и левелами — использовать ffdshow для преобразования в RGB или Haali renderer. | Я пользуюсь встроенными декодерами МРС-НС, иногда подключаю декодер Cyberlink H264 - вроде как в данных декодерах не происходит искажения цвета? Или же другие рендереры, доступные из МРС-НС, грешат в конверте YCbCr -> RGB ? Насчет ffdshow - это мощный и опасный инструмент. Мне не хочется подключать этот фильтр, потому что из-за него не будет DXVA. А если и подключить его, пожертвовав DXVA, - надо знать, как его настраивать. Я не понимаю, что произойдет, если ffdshow поручить преобразование YCbCr в RGB. Как он затем будет стыковаться с любым рендерером? Разве рендерер не ждет в качестве входного YCbCr-поток? Насчет Haali Renderer. В чем его преимущества в сравнении с, допустим, VMR9 renderless? Смогу ли я отображать сабы? Не сломается ли DXVA? Цитата: Не значит. Какая разница, что на входе: 0-1, 16-235 или 0-255 — всё равно на выходе получим тот же диапазон. | Нет, не понимаю. Даже если не вдаваться в физ. смысл, видно, что выходной результат шейдера определяется коэфф-тами. А если коэфф-ты подобраны именно исходя из предположения, что входной цвет - суть ЦЕЛОЕ число в базисе 16-235, значит, текущая реализация шейдера заточена именно на данный формат. А это никак не вяжется со структурой шейдеров перевода "16-235 <-> 0-255", вкоторые на вход подается вещественный цвет 0..1. Апдейт. Да, Вы правы, с матем. точки зрения разницы нет. Я пересчитал по правильным коэфф-там, на выходе получится одно и тоже: Было: Код: // RGB [16,235] to YUV: 601 mode (128 is not added to Cb and Cr) float y=0.299*c0[0] + 0.587*c0[1] + 0.114*c0[2]; float Cb=-0.172*c0[0] -0.339*c0[1] +0.511*c0[2]; float Cr=0.511*c0[0] -0.428*c0[1] -0.083*c0[2]; // YUV to RGB [16,235]: 709 mode (Cb and Cr are 128 less) float r=y+1.540*Cr; float g=y-0.459*Cr-0.183*Cb; float b=y+1.816*Cb; | Мой вариант: Код: // RGB to YUV: 601 mode float y=0.299*c0[0] + 0.587*c0[1] + 0.114*c0[2]; float Pb=-0.168736*c0[0] -0.331264*c0[1] +0.5*c0[2]; float Pr=0.5*c0[0] -0.418687589*c0[1] -0.081312411*c0[2]; // YUV to RGB: 709 mode float r=y+1.5748*Pr; float g=y-0.468124273*Pr-0.187324273*Pb; float b=y+1.8556*Pb; | Другое дело, что значения коэф-тов и коменты типа "RGB [16,235] to YUV" в тексте шейдера сбивают с толку. | Всего записей: 39 | Зарегистр. 10-12-2006 | Отправлено: 23:40 11-11-2009 | Исправлено: rodrigo2, 02:52 12-11-2009 |
|