XviD.Ru Inverse Telecine Error. Ошибка Inverse Telecine


Яндекс.Метрика Рейтинг@Mail.ru правильный HTML5 правильный CSS
В рисунках детей - неиссякаемое добро, любовь и свет!

Автор не претендует на истину в последней инстанции и НЕ СЧИТАЕТ, что данный текст охватывает ВСЁ многообразие ситуаций и причин возникновения описанного в нём дефекта изображения.

Что это и зачем?

Данный текст СЛЕДУЕТ читать:

Данный текст предназначен для ответа на следующий вопрос:
Берём хороший по качеству NTSC DVD, в котором нет ни одного сбоя порядка следования полей. Применяем правильный Inverse Telecine фильтр. И получаем редкие, но явные бледные артефакты чересстрочной развёртки, ОСОБЕННО - на двух подряд кадрах при смене сцены. Почему?

Другая формулировка этого же вопроса:
Почему на смене сцены в некоторых (не во всех) случаях наблюдается полосатая "тень" от предыдущего кадра на следующем (ключевом), И ОДНОВРЕМЕННО от следующего - на предыдущем? Это что - ошибка кодека? И какой кодек делает всё правильно? Или это ошибка Decomb (Xmpeg, VirtualDub,...) при Inverse Telecine?

Краткий ответ

  1. Вина за испорченный 1 из 4-х кадров лежит на создателях NTSC DVD, которые применили различные фильтры обработки и (в дальнейшем) алгоритм сжатия с потерями MPEG2 к чересстрочному NTSC видеопотоку. Если обработка и сжатие применяется к Progressive Frames - данная ошибка заведомо отсутствует.
  2. Вина за то, что испорчено два кадра подряд, а не один, в ДАННОМ случае лежит на риппере, который бездумно применяет фильтр Автоматического преобразования (например, Decomb), повышенный интеллект которого с его адаптивной подстройкой порой выбирает не то поле для сборки кадра, который в NTSC потоке присутствует в нормальном виде.

Демонстрация глюков

Напоминаю схему, по которой происходит прямое и обратное преобразование Telecine:

PullDown scheme

хорошо видно, что прогрессивный кадр B не присутствует в NTSC потоке как единое целое, а вынужден собираться из двух полей, переплетённых с кадрами A и C. К чему это приводит? Для демонстрации результатов мной был написан скрипт для AviSynth:



# IvtcError.avs
#
# (C) 2003
# Ivtc Error Clip by Sergej Qkowlew.
#
# Created to represent some artifacts  Создан для демонстрации некоторых арте-
# of Telecine-Inverse Telecine proce-  фактов процесса интерлейса-деинтерлейса.
# dures.
#
# Any MPEG1/MPEG2/MPEG4 stream coding  Любой MPEG1/2/4 поток закодирован с по-
# is  loss-quality process. So - when  терей качества. В том случае, если  ему
# such  algorythm  takes   INTERLACED  достался входной поток с чересстрочнмыи
# frame for encoding  and  treates it  кадрами, а кодек рассматривает его  как
# as progressive - fields from neigh-  прогрессивный, содержимое  полей  после
# bour frames are interefered.         кодирования-декодирования интерферирует.
#
# If  you  receive  MPEG  stream with  Если Вы получили   так   закодированный
# such error  -  there  is  NO way to  поток или файл - нет  НИКАКОГО  способа
# correct "intereferred frames"!       восстановить отдельные кадры.
#
# In this demo Blur/Sharpen filter is  Имитирует процесс кодирования-декодиро-
# used to simulate "packing-unpacking" вания фильтр Blur/Sharpen.
# process.
#
loadplugin("C:\Program Files\AviSynth 2.5\plugins\decomb.dll")

BlankClip(4, 540, 160, "YUY2", 24, 1, 11025, false, true, $808080) 
KillAudio()

Subtitle("A", text_color=$F3F3A0, size=120, x=0, y=80, first_frame=0, last_frame=0, halo_color=$808080)
Subtitle("B", text_color=$A0F3A0, size=120, x=0, y=80, first_frame=1, last_frame=1, halo_color=$808080)
Subtitle("C", text_color=$A0A0F3, size=120, x=0, y=80, first_frame=2, last_frame=2, halo_color=$808080)
Subtitle("D", text_color=$F3A0A0, size=120, x=0, y=80, first_frame=3, last_frame=3, halo_color=$808080)

AssumeFrameBased
# divide frames to fields
SeparateFields()

# marks to show field
Subtitle("A top", text_color=$F3F3A0, size=20, x=0, y=48, first_frame=0, last_frame=0)
Subtitle("B top", text_color=$A0F3A0, size=20, x=0, y=48, first_frame=2, last_frame=2)
Subtitle("C top", text_color=$A0A0F3, size=20, x=0, y=48, first_frame=4, last_frame=4)
Subtitle("D top", text_color=$F3A0A0, size=20, x=0, y=48, first_frame=6, last_frame=6)

Subtitle("A bottom", text_color=$F3F3A0, size=20, x=0, y=60, first_frame=1, last_frame=1)
Subtitle("B bottom", text_color=$A0F3A0, size=20, x=0, y=60, first_frame=3, last_frame=3)
Subtitle("C bottom", text_color=$A0A0F3, size=20, x=0, y=60, first_frame=5, last_frame=5)
Subtitle("D bottom", text_color=$F3A0A0, size=20, x=0, y=60, first_frame=7, last_frame=7)

# Splice fields to frames back
Weave()

Showframenumber(true)
#Keep FILM original
ClipStart=trim(0,3)

# Make NTSC 3:2 pulldown stream from our film

AssumeFrameBased
# divide frames to fields
SeparateFields()
# Build NTSC sequence
SelectEvery(8, 0,1,0, 3,2, 5,4,5, 6,7)
# Splice fields to NTSC frames
Weave()

# Simulate "pack-depack" our NTSC clip

Blur(1.5)
Sharpen(1)

# IVTC it with Decomb (y0,y1 cause Decomb not to look at fields marks)
Telecide(post=false, guide=1,blend=false, show=false, chroma=true, y0=96, y1=120, firstlast=true)
Decimate(cycle=5) 
ClipDecomb = trim(0,3)

# Second part - "Simple" algorythm

ClipStart
AssumeFrameBased
SeparateFields()
# Build NTSC sequence
SelectEvery(8, 0,1,0, 3,2, 5,4,5, 6,7)
# Splice fields to NTSC frames
Weave()

# Simulate "pack-depack" our NTSC clip

Blur(0.3)
Sharpen(1)

# Simple IVTC algorythm apply
SeparateFields()
SelectEvery(10, 0,1, 4,3, 6,7, 8,9)
Weave()

ClipSimple = trim(0,3)

ClipSimple + ClipDecomb

# Place result and original together.
Stackvertical(ClipStart + ClipStart)

Subtitle("_______________________", 0,126,font="Courier", text_color=$FFFFFF, size=14)

Subtitle("Telecine: SelectEvery(8, 0,1,0, 3,2, 5,4,5, 6,7)", text_color=$000000, size=16, x=0, y=280, halo_color=$808080)
Subtitle("IVTC: SelectEvery(10, 0,1, 4,3, 6,7, 8,9)", text_color=$000000, size=16, x=0, y=295, halo_color=$808080)
Subtitle("Ivtc Error clip made by Sergej Qkowlew (C)2003", text_color=$FFFFFF, size=16, x=0, y=310)

# Documentation:
Subtitle("Here  you  can  see,  Здесь Вы  можете ви-", 84,20,0,0, "Courier", text_color=$FFFFFF, size=18)
Subtitle("that even if Inverse  деть, что  даже если", 84,40,0,0, "Courier", text_color=$FFFFFF, size=18)
Subtitle("Telecine  filter  is  фильтр IVTC  идеален", 84,60,0,0, "Courier", text_color=$FFFFFF, size=18)
Subtitle("perfect - some arti-  - итоговая  картинка", 84,80,0,0, "Courier", text_color=$FFFFFF, size=18)
Subtitle("facts  appear.  They  содержит  артефакты,", 84,100,0,0, "Courier", text_color=$FFFFFF, size=18)
Subtitle("are created by MPEG*  порождённые  упаков-", 84,120,0,0, "Courier", text_color=$FFFFFF, size=18)
Subtitle("algorythm from Inte-  кой MPEG потока  при", 84,140,0,0, "Courier", text_color=$FFFFFF, size=18)
Subtitle("rlaced original.      Interlaced оригинале", 84,160,0,0, "Courier", text_color=$FFFFFF, size=18)
Subtitle("Packing-depacking is  Упаковка-распаковка", 84,180,0,0, "Courier", text_color=$FFFFFF, size=18)
Subtitle("Simulated by Blur &   смоделированы Blur и", 84,200,0,0, "Courier", text_color=$FFFFFF, size=18)
Subtitle("Sharpness filters.    Sharpness фильтрами.", 84,220,0,0, "Courier", text_color=$FFFFFF, size=18)
Subtitle("           Blur(0.3) Sharpen(1)           ", 84,246,0,0, "Courier", text_color=$FFFFFF, size=18)

Subtitle("This frame B is con-  Этот фрейм B  собран", 84,20,1,1, "Courier", text_color=$FFFFFF, size=18)
Subtitle("structed from fields  из полей, которые  в", 84,40,1,1, "Courier", text_color=$FFFFFF, size=18)
Subtitle("placed with A  and C  NTSC потоке  находи-", 84,60,1,1, "Courier", text_color=$FFFFFF, size=18)
Subtitle("subfields  in   NTSC  лись вместе с полями", 84,80,1,1, "Courier", text_color=$FFFFFF, size=18)
Subtitle("stream. So - you can  от  соседних кадров.", 84,100,1,1, "Courier", text_color=$FFFFFF, size=18)
Subtitle("see shades of neigh-  В результате  Вы ви-", 84,120,1,1, "Courier", text_color=$FFFFFF, size=18)
Subtitle("bour frames (000 and  дите тени от  кадров", 84,140,1,1, "Courier", text_color=$FFFFFF, size=18)
Subtitle("002 to the  right, A  A и C, наложенные на", 84,160,1,1, "Courier", text_color=$FFFFFF, size=18)
Subtitle("and C overlapping to  B слева и числа 000,", 84,180,1,1, "Courier", text_color=$FFFFFF, size=18)
Subtitle("the  left.  There is  002 справа. НЕТ спо-", 84,200,1,1, "Courier", text_color=$FFFFFF, size=18)
Subtitle("NO method to correct  соба исправить кадр,", 84,220,1,1, "Courier", text_color=$FFFFFF, size=18)
Subtitle("frame noised in such  искажённый таким об-", 84,240,1,1, "Courier", text_color=$FFFFFF, size=18)
Subtitle("way. :-(              разом.              ", 84,260,1,1, "Courier", text_color=$FFFFFF, size=18)

#ubtitle("SEE NEXT FRAMES -->", 84,80,0,0, text_color=$FFFFFF, size=36)

Subtitle("For DECOMB results", 84,40,2,2, text_color=$FFFFFF, size=36)
Subtitle("SEE FRAMES 4-7 -->", 84,80,2,2, text_color=$FFFFFF, size=36)
Subtitle("For DECOMB results", 84,40,3,3, text_color=$FFFFFF, size=36)
Subtitle("SEE FRAMES 4-7 -->", 84,80,3,3, text_color=$FFFFFF, size=36)

Subtitle("Here  you  can  see,  Здесь Вы  можете ви-", 84,20,4,4, "Courier", text_color=$FFFFFF, size=18)
Subtitle("how  DECOMB  treates  деть, как  интерпре-", 84,40,4,4, "Courier", text_color=$FFFFFF, size=18)
Subtitle("such blurred stream.  тирует это DECOMB.  ", 84,60,4,4, "Courier", text_color=$FFFFFF, size=18)

Subtitle("B frame is crashed,   Кадр B повреждён так", 84,40,5,5, "Courier", text_color=$FFFFFF, size=18)
Subtitle("as in simple IVTC     же как и при простом", 84,60,5,5, "Courier", text_color=$FFFFFF, size=18)
Subtitle("process.              процессе IVTC.      ", 84,80,5,5, "Courier", text_color=$FFFFFF, size=18)


Subtitle("Note, that  NOT ONLY  ЗАМЕТЬТЕ!  Повреждён", 84,20,6,6, "Courier", text_color=$FFFFFF, size=18)
Subtitle("frame B  is crashed!  НЕ ТОЛЬКО кадр B!  В", 84,40,6,6, "Courier", text_color=$FFFFFF, size=18)
Subtitle("DECOMB checks frames  данном случае DECOMB", 84,60,6,6, "Courier", text_color=$FFFFFF, size=18)
Subtitle("by difference,   and  сделал  неправильный", 84,80,6,6, "Courier", text_color=$FFFFFF, size=18)
Subtitle("sometimes   keyframe  выбор поля C bottom.", 84,100,6,6, "Courier", text_color=$FFFFFF, size=18)
Subtitle("and  it`s  neighbour  Именно так он  порой", 84,120,6,6, "Courier", text_color=$FFFFFF, size=18)
Subtitle("are shaded  in  each  портит   KeyFrame  и", 84,140,6,6, "Courier", text_color=$FFFFFF, size=18)
Subtitle("other by wrong deci-  предыдущий кадр.    ", 84,160,6,6, "Courier", text_color=$FFFFFF, size=18)
Subtitle("sion.      Blur(1.5) Sharpen(1)           ", 84,186,6,6, "Courier", text_color=$FFFFFF, size=18)



скачать скрипт для AVISYNTH (8к).
скачать AVI результат оного скрипта (450к).

Как предотвратить? (советы тому, кто делает NTSC)

  1. Создавая MPEG2 поток, НЕ делать его NTSC ;-)
  2. Обрабатывая (изменяя размер, фильтруя шум) NTSC поток - ВСЕГДА сначала все его части преобразовывать в FILM, прогрессивной развёртки.
  3. Создавая DVD - запаковывать MPEG2 и записывать на него Progressive Frames 24(23.976)fps, прописывая правильную Interlace Map для NTSC.

Как исправить уже содеянное другими? (советы рипперу)

Дефект кадра B неустраним - если картинка испорчена таким образом, то для кадра B просто не осталось "исходника". Если этот кадр попал на смену сцены - следы будут, и это приходится терпеть.

Так как Inverse Telecine фильтр при порче кадра C проявил излишний интеллект - Вы можете попробовать применить более простые преобразования Inverse Telecine, или же подстроить параметры Decomb, дабы добиться нужного результата.

Если Вы создаёте DVD-Rip с большой степенью сжатия - правильным решением будет применение фильтров:

SpatialSoften(4,6,10)
TemporalSoften(4,4,8,15,2)

Данная комбинация при незначительном влиянии на качество картинки в целом практически уничтожает следы описанного в данной статье типа, срабатывая как тривиальный фильтр шума. Поскольку эти дефекты достаточно бледные - у них есть хороший шанс исчезнуть. Параметры сглаживания, конечно, стоит подбирать под конкретный фильм.

Важное уточнение

Все предыдущие рассуждения касались только той ситуации, когда порядок следования полей "top-bottom" НЕ НАРУШАЕТСЯ.

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

При этом стоит вспомнить о том, что в алгоритме MPEG2 предусмотрена возможность ПРАВИЛЬНОЙ упаковки чересстрочного потока. Однако многие кодеры MPEG2 в случае сбоя порядка top-bottom ошибаются и порождают дополнительные искажения картинки.

Причины же сбоя в порядке полей встречаются как минимум следующие:

  1. Потеря синхронизации или незначительный сдвиг частоты на видаке, приведшая к неправильному числу полей, переданному на карточку видеозахвата в какой-то момент времени. Характерным признаком этого варианта является то, что на плавно двигающихся по вертикали титрах часть кадров совершенно нормальная - а на части из-за смены полей текст "расчёсан", и смена этих состояний происходит раз в несколько секунд или реже (При повышении интеллекта IVTC фильтра при этом вместо "расчёски" может получиться подёргивание - замирание движения на 1 кадр):
  2. Упрощённый Inverse Telecine фильтр, выкидывающий каждое ПЯТОЕ ПОЛЕ из NTSC потока. Иными словами - Telecine преобразование было (pulldown 2:3):
    SelectEvery(8, 0,1, 2,3,2, 5,4, 7,6,7)
    и вместо правильного обратного преобразования:
    SelectEvery(10, 0,1, 3,2, 6,5, 7,8)
    происходит циничное:
    SelectEvery(10, 0,1, 2,3, 5,6, 7,8)
    тем самым итоговый порядок полей становится:
    Atop Abottom Bbottom Btop Cbottom` Ctop` Dtop` Dbottom
    (штрихом в данном случае обозначены поля, пересекавшиеся НЕ со своим полем в интерлейс потоке).

    Особенные же извращения получаются, если после применения такого упрощённого фильтра полученный искажённый FILM-поток записывается на NTSC диск...

ЗАМЕТИМ, что в этих случаях риппер, получивший такой материал, бессилен исправить ошибку.
© 1999 схема NTSC Pulldown 3:2 взята отсюда
Благодарности за корректорскую работу и бета-тестирование - Takuto
За важное уточнение - спасибо Андрею Суворову.
© 2003 Sergej Qkowlew. Разрешается использование текста, используемых в нём графических файлов, яваскриптов, файлов с табличными данными и элементов оформления полностью или частично в любых целях, КРОМЕ как для дезинформации кого-либо относительно материалов, произведений искусства, проектов, лиц, организаций, событий. Ссылку на источник давать разрешается.