Развенчание устойчивого мифа о некорректности обработки цвета при кодировании в MPEG-2
(клиппирование/растяжка диапазона и т.д.)

Сама тема возникла из многочисленных обсуждений на ixbt, когда в результате некорректных измерений получали клиппирование или сжатие/растяжку диапазона при кодировании в MPEG-2 и из этого делали вывод о невозможности корректной передачи уровней в MPEG-2.

Тестирование будет делаться из двух вариантов исходников

 Итак, поехали.

Вариант 1

В фотошопе сгенерен файл basic.tif
Левая половина - уровень 16, на который наложен квадрат с уровнем 1
Правая половина - уровень 235, на который наложен квадрат с уровнем 254

С помощью скрипта получаем YUV

ImageSource("basic.tif", fps=25, end =25)
ConvertToYUY2(matrix = "PC.601")

Добавляем строку ColorYUV(analyze=true) и проверяем уровни

ОК, уровни правильные. Убираем ColorYUV и добавляем

ConvertToYV12()
Histogram ("levels")

Получаем следующее:

Все правильно - на гистограмме видны большие пики, соответствующие 16 и 235 и пики поменьше, которые соответствуют 1 и 254. ОК.

Теперь скармливаем этот AVS прямо Canopus Procoder - он его прекрасно понимает и генерим MPEG-2.

Делаем контрольный скрипт (тут возникла проблемка - почему-то через directshowsource на рабочем компе mpeg открываться отказался, пришлось через dgindex):

LoadPlugin("DGDecode.dll")
MPEG2Source("basic.d2v")

Проверяем, что формат компонентный, для чего добавляем Info()

Все ок. Проверяем уровни ColorYUV(analyze=true)

В общем выглядит нормально - уровни не изменились (minimum = 0 не в счет - ошибка на единицу при DCT нормальное явление).

Проверяем гистограмму Histogram ("levels")

Хм, что называется - найдите отличия. Для окончательного сравнения сделаем еще то же самое в CCE и разместим результаты рядом:

Оригинальная гистограмма Гистограмма MPEG-2 файла
сгенерированного
Canopus Procoder
Гистограмма MPEG-2 файла
сгенерированного
CCE

Очевидно, что НИКАКИХ изменениях в уровнях (растяжка/сжатие, клиппинг и т.д.) не произошло (мелкие выбросы на гистограмме не в счет).

Вариант 2

С помощью программы в Matlab сгенерирован AVI файл c YUV внутри. Архив с m-файлами и заготовкой AVI - здесь - в заготовке ничего менять нельзя - запись идёт по адресам без парсинга AVI.

На картинке - 4 прямоугольника:

Всё остальное залито уровнем 50%

Далее с помощью VirtualDub в режиме DirectStreamCopy меняем fps на 25 (в заготовке AVI - ошибка, а переделывать лень). Результат - непожатый AVI с YUV внутри - лежит здесь

Проверяем уровни и гистограмму (увеличена в два раза для лучшей видимости):

Всё прекрасно - четыре черточки внизу - это как раз 4 квадратика, жирная черта посередине - 50%.

Открываем эту AVI'шку в Rhozet Carbon Coder 3.17 (извините, прокодера у меня давно нет) и конвертим ее в DV AVI стандартным пресетом Microsoft DV PAL. Результат - здесь.

Для удобства размножаю кадр в VirtualDub и делаю AVI'шку длиной 10 секунд. Лежит здесь.

Проверяем уровни в ней.

Первая неожиданная неприятность - при открытии AVI'шки через avisource - получаем обрезанные уровни сверху/снизу:

Пробую открыть через directshowsource. Всё прекрасно:

Следовательно - проблема не в самом файле, а именно в декодере, который использует avisource. Разбираюсь, оказывается avisource отдаёт RGB и, соответственно, гадит картинку:

Ну ладно, теперь открываю во всё том же Rhozet Carbon Coder 3.17 полученную 10-ти секундную AVI'шку и кодирую её в MPEG-2. Пресет: MPEG2 - DVD - PAL (mastering quality). Делаю program stream, поток 8000, остальное не трогаю. Результат здесь (из m2p переименован в mpg).

Ровно так же, как и в предыдущем случае, через MPEG2Source скармливаю его в avisynth и смотрю уровни:

Что называется - найдите отличия. Таким образом можно считать доказанным, что при конвертации DV AVI в MPEG никаких изменений в уровнях - не происходит.

Пообщаться со мной при желании можно на конференции forum.ixbt.com

Последнее обновление 2011-05-25

Hosted by uCoz