Сама тема возникла из многочисленных обсуждений на ixbt, когда в результате некорректных измерений получали клиппирование или сжатие/растяжку диапазона при кодировании в MPEG-2 и из этого делали вывод о невозможности корректной передачи уровней в MPEG-2.
Тестирование будет делаться из двух вариантов исходников
Итак, поехали.
В фотошопе сгенерен файл 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 |
Очевидно, что НИКАКИХ изменениях в уровнях (растяжка/сжатие, клиппинг и т.д.) не произошло (мелкие выбросы на гистограмме не в счет).
С помощью программы в 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