Автор не претендует на истину в последней инстанции и НЕ СЧИТАЕТ, что данный текст охватывает ВСЁ многообразие ситуаций и причин возникновения описанного в нём дефекта изображения.
Данный текст СЛЕДУЕТ читать:
Данный текст предназначен для ответа на следующий вопрос:
Берём хороший по качеству NTSC DVD, в котором нет ни одного
сбоя порядка следования полей. Применяем правильный Inverse Telecine
фильтр. И получаем редкие, но явные бледные артефакты чересстрочной
развёртки, ОСОБЕННО - на двух подряд кадрах при смене сцены. Почему?
Другая формулировка этого же вопроса:
Почему на смене сцены в некоторых (не во всех) случаях наблюдается
полосатая "тень" от предыдущего кадра на следующем (ключевом), И ОДНОВРЕМЕННО
от следующего - на предыдущем? Это что - ошибка кодека? И какой кодек
делает всё правильно? Или это ошибка Decomb (Xmpeg, VirtualDub,...)
при Inverse Telecine?
Напоминаю схему, по которой происходит прямое и обратное преобразование Telecine:
хорошо видно, что прогрессивный кадр 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)
Так как Inverse Telecine фильтр при порче кадра C проявил излишний интеллект - Вы можете попробовать применить более простые преобразования Inverse Telecine, или же подстроить параметры Decomb, дабы добиться нужного результата.
Если Вы создаёте DVD-Rip с большой степенью сжатия - правильным решением будет применение фильтров:
SpatialSoften(4,6,10) TemporalSoften(4,4,8,15,2)
Данная комбинация при незначительном влиянии на качество картинки в целом практически уничтожает следы описанного в данной статье типа, срабатывая как тривиальный фильтр шума. Поскольку эти дефекты достаточно бледные - у них есть хороший шанс исчезнуть. Параметры сглаживания, конечно, стоит подбирать под конкретный фильм.
Если же порядок следования полей в потоке нарушается - то наблюдаемый в результате эффект практически идентичен описанному в этой статье, с той лишь разницей, что внимательно рассматривая кадры - можно увидеть в некоторых из них характерные для сбитого порядка полей рывки картинки на строку вверх и вниз, что особенно легко увидеть на плавно двигающихся по вертикали титрах.
При этом стоит вспомнить о том, что в алгоритме MPEG2 предусмотрена возможность ПРАВИЛЬНОЙ упаковки чересстрочного потока. Однако многие кодеры MPEG2 в случае сбоя порядка top-bottom ошибаются и порождают дополнительные искажения картинки.
Причины же сбоя в порядке полей встречаются как минимум следующие:

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