# TDeint

## Общая информация

Автор: tritical
Версия: v1.0 RC7
Загрузка: http://bengal.missouri.edu/~kes25c/
Категория: Удаление чересстрочности и Устранение прореженности кадров
Требования: Цветовые пространства YV12 и YUY2
Лицензия: GPL

## Описание

TDeint - это двунаправленый, компенсированный по движению (резкостный) удалитель чересстрочности (деинтерлейсер). Он также может адаптивно выбирать между использованием адаптации к движению по целым полям и по пикселам. Может использовать кубическую интерполяцию, ядерную (матричную) интерполяцию (с переключением временнОго направления), или одну из двух форм модифицированой краевой адаптивной (ELA) интерполяции, которая помогает уменьшить "зубчатые" края в движущихся областях, где интерполяция должна использоваться. TDeint также поддерживает ручную коррекцию пользователем через специальный входной файл и может работать как интеллектуальный преобразователь полей в полноформатный кадр (bobber) или удалитель черестрочности с сохранением исходной частоты кадров, а также как пост-обработчик обратного преобразования телекино (IVTC).

### Синтаксис

`TDeint` (видеоклип, int "mode", int "order", int "field", int "mthreshL", int "mthreshC", int "map", string "ovr", int "ovrDefault", int "type", bool "debug", int "mtnmode", bool "sharp", bool "hints", PClip "clip2", bool "full", int "cthresh", bool "chroma", int "MI", bool "tryWeave", int "link", bool "denoise", int "AP", int "blockx", int "blocky", int "APType", PClip "edeint", PClip "emask", float "blim", int "metric", int "opt")

### ПАРАМЕТРЫ

mode:

Устанавливает режим работы. Режимы mode=-2 и -1 требуют прогрессивного входного сигнала.

-2 - двойная высота с использованием модифицированной краевой адаптации (ELA)
-1 - двойная высота с использованием модифицированной краевой адаптации-2 (ELA-2)
0 - та же скорость вывода
1 - удвоенная скорость вывода (bobbing)
2 - та же скорость вывода (смешивает кадры потока с удаленной методом удвоения полей (bobbed) чересстрочностью)

по умолчанию - 0 (int)

order:
Устанавливает порядок полей для видео.

-1 - использовать четность из AviSynth
0 - нечетное (нижнее) поле первое (bff)
1 - четное (верхнее) поле первое (tff)

по умолчанию - -1 (int)

field:

В режиме mode=0 и 2 это указывает, что полe будет интерполироваться (т.е. другое поле сохраняется как есть, а это поле будет воссоздано). В режиме 1 этот параметр не делает ничего.
-1 - установит поле на 1, если hints = false (ложь) или 0, если hints = true (истина)
0 - интерполировать верхнее поле (сохранить нижнее поле)
1 - интерполировать нижнее поле (сохранить верхнее поле)

по умолчанию - -1 (int)

mthreshL/mthreshC:

Пороги движения для яркости и цветности (mthreshL для яркости, mthreshC для цветности). Если разница между двумя пикселами меньше этого значения, они объявляются статическими. Меньшие значения уменьшат остаточную гребенчатость, большие значения уменьшат мерцание и увеличат точность создания поля в статических областях. Пространственно совпадающие части уровней яркости и цветности связаны (если связь ! = 0), так что mthreshC и mthreshL могут быть отчасти сцеплены. Установка обеих величин в 0 или ниже заблокирует компенсацию движения (т.е. каждый пиксел будет объявлен движущимся), разрешая деинтерлейс удвоением полей (dumb bob).

по умолчанию - mthreshL - 6 (int)
mthreshC - 6

map:

Показывает карту вывода вместо деинтерлейсного кадра. Есть три возможных параметра. **Прим.: карты не будут показаны если у текущего кадра не удаляется чересстрочность из-за ручной коррекции, hints, full=false, или tryWeave=true.

**пост-обработка с порогом защиты артефактов (AP) сейчас не принимается во внимание при использовании map = 1 или 2.

0 - без карты
1 - карта значений (бинарная). Это выдаст кадр в котором все пикселы имеют одно из следующих значений (указывая, как будет построен кадр):
0 (использовать пиксел из текущего кадра)
51 (использовать пиксел из предыдущего кадра)
102 (использовать пиксел из следующего кадра)
153 (использовать среднее из текущ./след.)
204 (использовать среднее из текущ./пред.)
255 (интерполировать пиксел)
2 - объединенная карта. Это даст кадр в котором все статические части кадра (значения 0, 51, 102, 153, и 204 от map=1) будут построены так, как они появились бы в кадре с удаленной чересстрочностью, а пикселы, которые должны будут интерполироваться, закрасятся белым.

по умолчанию - 0 (int)

ovr:

Устанавливает имя и путь к файлу ручной коррекции. Когда mode=0 файл коррекции может использоваться чтобы управлять значениями mthreshL, mthreshC, поля, порядка и типа отдельных кадров или диапазонов кадров, а также управлять тем, какие кадры являются деинтерлейсными. Когда mode=1, файл коррекции может использоваться чтобы управлять значениями mthreshL, mthreshC и типом определенных кадров или диапазонов кадров.

Параметры файла ручной коррекции:

+ = пометить кадр, у которого должна удаляться чересстрочность (полезен лишь если ovrDefault = 1)
- = пометить кадр, у которого не должна удаляться чересстрочность
f = поле
o = порядок
l = mthreshL
c = mthreshC
t = тип

*Параметры c,f,o,l,t также требуют, чтобы при их использовании было указано измененное значение (смотри синтаксис ручной коррекции, чтобы увидеть как это сделать)

Синтаксис ручной коррекции:

[] = не требуется для +,- параметров

коррекция единичного кадра:

номер_кадра параметр [измененное_значение]

примеры:

    245 f 1
    345 +
    400 -
    450 c -1

коррекция диапазона кадров:

начальный_номер_кадра,конечный_номер_кадра параметр [измененное_значение]

примеры:

    100,200 +
    346,352 f 0
    900,1200 l 5

* диапазон является включающим, означая, что обрабатываются как начальный, так и конечный кадры

основанная на шаблоне ручная коррекция диапазона кадров (лишь для +,- параметров):

примеры:

    100,300 +-+++--+++
    400,456 ---+---++

* будет использовать данный шаблон в указанном диапазоне кадров

Что нужно помнить (ключевые правила):

1. Диапазоны являются включающими.
2. Когда mode = 1 (bobbing-деинтерлейс) все ручные корректировки, за исключением mthreshL/mthreshC и корректировок типа, игнорируются. Также, номера кадров соответствуют входному клипу, а не выходному клипу, так что один кадр станет двумя кадрами на выходе.
3. Измененное значение всегда устанавливается обратно в свое исходное значение после того как коррекция выходит за пределы указанного диапазона. (т.e. если вы указываете коррекцию mthresh для кадров от 600 до 700, то после кадра 700 mthresh устанавливается снова в свое первоначальное значение автоматически, вы не должны устанавливать ее обратно в файле коррекции!) Исходное значение - это то, которое установлено при загрузке (т.е. или значение по умолчанию, или то, которое вы устанавливаете в вашем avisynth-сценарии).
4. Номера кадров должны быть в пределах диапазона данного файла.
5. Номера кадров для определенных параметров должны возрастать (если нет, то приоритетным будет последнее значение в файле, напр. если вы задаете 300 400 c 10, затем 350 450 c 12, то кадры с 350 по 400 будут использовать 12, не 10).
6. Номера кадров для (+,-) параметров не могут перекрываться (т.е. не пишите 300 400 -, а затем позже в файле 350 500 +, иначе произойдет непредсказуемое. Другие параметры не должны удовлетворять этому требованию, поскольку они все влияют на разные вещи.
7. параметры (+, -) не требуют никакого измененного значения.
8. Пробелы важны! Просто посмотрите на примеры.
9. Только +, - параметры могут использоваться в определениях шаблонов.
10. Вы можете менять множественные параметры в пределах одного и того же диапазона кадров до тех пор, пока вы следуете вышеуказанным правилам (например +, - номера кадров по возрастанию).
11. Вы можете закомментировать строку (т.е. она будет игнорироваться), добавляя '#' или ';' в начало строки.
12. 0 в качестве конечного_кадра (end_frame) для диапазона кадров принимается за последний кадр данного видео-ряда.

Пример файла ручной коррекции:

Пример синтаксиса => TDeint(order=1,ovr="c:\path\myoverridesfile.txt")

    100,300 o 0
    100,300 f 1
    90,250 c 3
    40,500 -
    505 -
    300,700 l -1
    #700,3000 f 1 <- комментарий, будет проигнорирован
    800,1000 -++-
    500,1000 c 13

по умолчанию - "" (string)

ovrDefault:

При использовании файла коррекции для mode 0, это определяет действие по умолчанию для всех кадров видео-ряда. Используя ovrDefault=1 можно легко удалить чересстрочность лишь у нескольких единичных кадров видео. Когда mode = 1 этот параметр не делает ничего.

0 - у всех кадров, не указанных как '-' в файле коррекции, чересстрочность удаляется
1 - все кадры, не указанные как '+' в файле коррекции, сохраняют чересстрочность и просто возвращаются как есть

по умолчанию - 0 (int)

type:

Устанавливает тип используемой интерполяции. Кубическая самая быстрая, модифицированные краевой адаптации ELA и ELA2 дадут более гладкие, менее "зубчатые" края и являются самыми медленными (ELA2 быстрее), а ядерная интерполяция обусловит значительно меньше мерцания чем кубическая или ELA в случае использования интерполяции в почти статических областях. Модифицированные ELA/ELA2 работают лучше всего с анимацией/мультипликацией... они не так хороши с реальным видео из жизни (иногда и хороши, попробуйте сами).

0 - кубическая интерполяция
1 - модифицированная ELA интерполяция
2 - ядерная интерполяция (может быть нормальной или резкой, управляется параметром резкости)
3 - модифицированная ELA-2 интерполяция

по умолчанию - 2 (int)

debug:

Выводит отладочную информацию, в которой для каждого кадра будут указаны значения порядка, поля, mthreshL, mthreshC и типа, если у кадра удаляется чересстрочность. Если у кадра чересстрочность сохраняется (из-за коррекции пользователя, подсказок или full=false), то будет просто указано, что у кадра чересстрочность не удаляется и приведена причина. Если выходной кадр горизонтально нестабилен, то в отладочной информации укажется , с каким полем текущее поле было соединено (ПРЕДЫД. или СЛЕДУЮЩ.).

по умолчанию - false (bool)

mtnmode:

Определяет используется ли контроль движения по 4 полям или по 5 полям. 5 полей предотвратят больше артефактов и могут работать со сдвоенными интерлейсными кадрами, однако это действительно медленнее чем контроль движения по 4 полям. Режимы 2 и 3 подобны 0 и 1 за исключением того, что в режимах 0 или 1 в областях, где использовалось бы среднее предыд. и следующ. полей, используется вместо этого вес пиксела (вычисленный по разнице полей) наиболее сходного поля (т.е. никакие средние не используются).

0 - контроль по 4 полям
1 - контроль по 5 полям
2 - контроль по 4 полям (без средних, замена на наиболее сходное поле)
3 - контроль по 5 полям (без средних, замена на наиболее сходное поле)

по умолчанию - 1 (int)

sharp:

Определяет, используется ли резкая или нормальная матрица при использовании ядерной интерполяции (type = 2). Резкая матрица включает больше пиксел и дает более резкий результат, но - немного медленнее.

true (истина) - использовать резкую матрицу
false (ложь) - использовать нормальную матрицу

по умолчанию - true (bool)

hints:

Читает подсказки от телецида (telecide) или определителя полей (tfm) показывая, какие кадры интерлейсные и какие - нет, если подсказки присутствуют в видео потоке. Чтобы заставить это работать, вы должны установить post=1 в телециде
или PP=1 в tfm и поместить TDeint сразу же после этого. TDeint не будет оказывать влияние на подсказки (до тех пор, пока ваше видео имеет ширину по крайней мере 64 пиксела) в случае, если какие-либо фильтры впоследствии нуждаются в их считывании. Если hints установлены в true, но никаких подсказок от Telecide или определителя полей (tfm) не обнаружено в видео потоке, тогда на всех кадрах будет удалена чересстрочность (TDeint будет работать как будто hints=false).
Если вы явно не определяете значение для hints, то TDeint будет проверять, есть ли подсказки в потоке при загрузке и установит hints в true, если они есть, или в false, если их нет (т.е. это устанавливается автоматически).

*ПРИМ.: для постобработки обратного преобразования телекино (IVTC) при чтении подсказок рекомендуется использовать TDeint в следующем режиме, задействуя параметр clip2.

    orig = last
    fieldmatcher()
    TDeint(clip2 = last)

true - читать подсказки, если есть
false - не читать подсказки

по умолчанию - определяется автоматически при загрузке (bool)

clip2:

При использовании tdeint как постпроцессора для Telecide или определителя полей (tfm) посредством параметра hints (или любого обнаружителя совпадений полей), неправильное удаление чересстрочности может произойти из-за того, что Telecide изменяет порядок полей в исходном потоке (ведь он - обнаружитель совпадений полей в конце концов). Это может вызвать в некоторых случаях проблемы, поскольку TDeint действительно нуждается в исходном потоке. Чтобы обойти это, вы может определить для TDeint второй клип "clip2", чтобы делать фактическое удаление чересстрочности из него.

Вот как это бы работало в сценарии:

    mpeg2source("c:\mysource.d2v")
    orig = last
    telecide(guide=1, order=1, hints=true, post=1)
    tdeint(order=1, clip2=orig)

Итак, TDeint читает выходной клип из Telecide как обычно. Когда подсказки указывают, что кадр интерлейсный, он делает деинтерлейсинг данного кадра, используя clip2. Этот метод также сохраняет подсказки в выходном потоке, так что любые другие фильтры, которые нуждаются в них впоследствии, будут по-прежнему работать.

Добавив full=false, можно по-другому использовать TDeint как постпроцессор, заставив его использовать свое собственное обнаружение кадров с эффектом "гребенки", следующим образом (это также позволяет ему работать с любым обнаружителем совпадений полей, не только Telecide или tfm):

    mpeg2source("c:\mysource.d2v")
    orig = last
    fieldmatcherofchoice()
    tdeint(order=1, full=false, clip2=orig)

по умолчанию - NULL (PClip)

full:

Если full установлено в true (истина), то все кадры обрабываются как обычно. Если full=false, все кадры сначала проверяются есть ли у них гребенка. Если кадр без гребенки, он возвращается как есть. Если кадр имеет гребенку, тогда он обрабывается как обычно. Параметры, которые влияют на обнаружение кадров с гребенкой, это cthresh, chroma, blockx, blocky и MI. Full=false разрешает TDeint быть постпроцессором обратного преобразования телекино (IVTC) без потребности в подсказках.

true - нормальная обработка
false - сначала проверить все входные кадры на эффект "гребенки"

по умолчанию - true (bool)

cthresh:

Порог области с гребенкой, используемый для обнаружения кадров с эффектом "гребенки". Он похож на dthresh или dthreshold в telecide () и fielddeinterlace (). Это существенным образом определяет насколько "сильной" или "видимой" должна быть гребенка, чтобы ее обнаружили. Хорошие значение - от 6 до 12; если вы знаете, что ваш источник имеет много кадров с гребенкой, установите это значение пониже (6-7), если вы знаете, что ваш источник имеет совсем мало кадров с гребенкой, установите его повыше (10-12). Значения намного ниже 5-6 или намного выше 12 не рекомендуются.

по умолчанию - 6 (int)

blockx -

Устанавливает размер по оси X блока, используемого для обнаружения кадров с гребенкой. Это имеет отношение к размеру области, в которой должно быть найдено количество MI пикселов с гребенкой, чтобы кадр был объявлен как имеющий гребенку. См. описание параметра MI для дальнейшего объяснения. Возможные значения - любое число, которое является степенью числа 2, начиная с 4 и до 2048 (т.е. 4, 8, 16, 32... 2048).

по умолчанию: 16 (int)

blocky -

Устанавливает размер по оси Y блока, используемого для обнаружения кадров с гребенкой. Это имеет отношение к размеру области, в которой должно быть найдено количество MI пикселов с гребенкой, чтобы кадр был объявлен как имеющий гребенку. См. описание параметра MI для дальнейшего объяснения. Возможные значения - любое число, которое является степенью числа 2, начиная с 4 и до 2048 (т.е. 4, 8, 16, 32... 2048).

по умолчанию: 16 (int)

chroma:

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

true - использовать гребенку по цветности
false - не использовать

по умолчанию - false (bool)

MI:

количество пикселов с гребенкой в кадре для любого блока размером blockx на blocky, чтобы этот кадр был определен как имеющий гребенку. В то время как cthresh контролирует насколько "видимой" или "сильной" должна быть гребенка, этот параметр определяет насколько много "гребенчатости" должно быть в любой определенной области (блок размером blockx на blocky) кадра. Миним. значение = 0, максимальное = blockx на blocky (точка, в которой никакие кадры уже не будут никогда определяться как имеющие гребенку).

по умолчанию - 64 (int)

tryWeave:

Если установлено в true (истина), то когда TDeint удаляет чересстрочность в кадре, он сначала вычислит какое поле (ПРЕДЫДУЩ. или СЛЕД.) наиболее подобно текущему полю. Затем он присоединит это поле (weave), чтобы создать новый кадр и проверить этот новый кадр на наличие гребенки. Если новый кадр - без гребенки, тогда его он и возвратит. Если кадр - с гребенкой, то у кадра удаляется чересстрочность с использованием обычной компенсации движения по пикселам. В основном, этот параметр позволяет TDeint попробовать использовать компенсацию движения по полям, а не по пикселам там, где это возможно.

по умолчанию - false (bool)

link:

Контролирует во время создания карты гребенки (comb map), как связаны три плоскости (YUV). Возможные значения:

0 - не связаны
1 - полное сцепление (каждая плоскость с любой другой)
2 - Y с UV (яркость с цветностью)
3 - UV с Y (цветность с яркостью)

по умолчанию - 2 (int)

denoise:

Контролирует, удаляется ли шум из карты гребенки или нет. True включает удаление шума, false - отключает.

по умолчанию - true (bool)

AP:

Порог защиты артефактов. Если AP установлен в значение большее или равное 0, то перед выводом кадра с удаленной чересстрочностью TDeint просканирует все объединенные пикселы, чтобы увидеть, порождает ли какой из них значение, большее чем AP. Любые пикселы, которые дают такое значение, будут интерполированы. Используйте это для помощи в предотвращении очень очевидных артефактов, порожденных компенсацией движения, рекомендуются большие значения (25+, или такие, какие удаляют артефакты, видимые во время проигрывания на полной скорости), поскольку меньшие значения уничтожат выгоды от компенсации движения в статических, богатых деталями областях. Система измерения AP та же, что и для cthresh, так что диапазон - 0-255... при ноле всё, кроме полностью плоских областей будет выявлено как имеющее гребенку, при 255 - ничего не будет выявлено. Использование AP замедлит обработку. Чтобы отключить AP, установите его значение в меньше 0 или больше 254.

по умолчанию - -1 (отключено) (int)

APType:

Когда используется AP-постобработка (AP >= 0 и < 255), APType контролирует должно ли приниматься во внимание движение окружающих пикселов. Есть 3 возможных значения:

0 = Не принимать во внимание близлежащее движение. Если объединенный пиксел дает величину, которая превышает AP-порог, тогда он будет интерполирован.

1 = Если объединенный пиксел дает величину, которая превышает AP-порог, и по крайней мере половина пикселов в блоке 5x5 с этим пикселом в центре определяются как движущиеся, тогда этот пиксел будет интерполирован.

2 = Точно как 1, за исключением того, что вместо 1/2 лишь 1/3 пикселов в окружающем блоке 5x5 должны определяться как движущиеся.

Режимы 1 и 2 предоставляют способ для того, чтобы "прихватить" больше артефактов (низкие значения AP) без полного принесения в жертву статических областей.

по умолчанию - 1 (int)

edeint:

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

по умолчанию - NULL (PClip)

emask:

Позволяет указать внешний клип, чтобы брать оттуда маску движения, вместо того, чтобы TDeint строил маску сам. Использование этой опции делает следующие параметры TDeint не оказывающими никаго влияния: mthreshL, mthreshC, mtnmode, denoise, link. Возможные значения, которые могут присутствовать в кадрах маски движения, определены так:

10 - Использовать пиксел из текущего кадра
20 - Использовать пиксел из предыдущего кадра
30 - Использовать пиксел из следующего кадра
40 - Использовать среднее пикселов из текущего и следующего
50 - Использовать среднее пикселов из текущего и предыдущего
60 - Интерполировать
70 - Использовать [1 2 1] смесь пикселов из пред/текущ/следующ
Поведение для других значений неопределено, хотя другие значения должны отсекаться, рассматриваясь внутренне так, как если бы они были равны 60.

по умолчанию - NULL (PClip)

blim:

Задает величину максимальной разности для режима 2. Если обе разности (иточник-предыдущ. и источник-следующ.) выше этой величины, тогда источник возвращается как есть. Иначе источник смешивается либо с предыдущ. либо со следующ., в зависимости от того, что из них наиболее подобно источнику. Эта величина находится в пределах от 0.0 до 100.0, базируясь на различии канала яркости. Используйте debug=true, чтобы увидеть значения порожденных различий и предельную величину. Отладочные выходные данные будут выглядеть так:

    [5776] TDeint:  frame 0:  d1 = 0  d2 = 0  lim = 1513728

d1 - это разность иточник-предыдущ., а d2 - разность иточник-следующ. lim - это максимальное значение, преобразованное из плавающего числа в длинное целое без знака. Установите blim в отрицательную величину для отключения сопоставления (источник всегда будет смешиваться или с предыдущ. или со следующ.).

по умолчанию - -2.0 (float)

metric:

Задает, какая пространственная система измерения гребенчатой фильтрации (combing metric) используется для обнаружения пикселов с гребенкой. Возможные значения:

Предположим, 5 соседних пикселов (a,b,c,d,e) размещены вертикально.

a
b
c
d
e

                0:  d1 = c - b;
                    d2 = c - d;
                    если ((d1 > cthresh && d2 > cthresh) || (d1 < -cthresh && d2 < -cthresh))
                    {
                       если (abs(a+4*c+e-3*(b+d)) > cthresh*6) значит с гребенкой;
                    }

                1:  val = (b - c) * (d - c);
                    если (val > cthresh*cthresh) значит с гребенкой;

Система измерения 0 - это та, которую tdeint всегда использовал до v1.0 RC7. Система измерения 1 - это система измерения гребенчатой фильтрации применяемая в функциях FieldDeinterlace()/IsCombed() Дональда Графта в decomb.dll.

по умолчанию: 0 (int)

opt:

Определяет, какой тип оптимизации ЦПУ используется. Возможные значения:

0 - использовать C функции
1 - использовать mmx функции
2 - использовать isse функции
3 - использовать sse2 функции
4 - автоопределение

по умолчанию - 4 (int)

## История

04/10/2006 v1.0 RC7
+ оптимизированы функции обнаружения кадров с гребенкой (теперь соответствуют tivtc)
+ добавлена вторая система пространственного измерения гребенчатой фильтрации и параметр "metric" (такой же, как tfm и is/showcombeditvtc)
+ оптимизированы функции удаления шума
+ улучшена функция сравнения полей (теперь одинакова со slow=0 в tfm)
+ режим 2 использует функцию сравнения полей вместо вычитания полного кадра при определении наиболее совпадающего кадра (точнее)
- напрямую назначаются кадры из клипа emask (нет необходимости копировать)
- значение blim по умолчанию изменено на -2.0 (выключено)
- вызывается setcachehints для клипов emask/edeint, в случае использования

Изменения более ранних версий см. в английском оригинале документации

`$English Date: 2006/09/18 19:02:03 $
Русский перевод: 22.09.2006-03.10.2006 Soroka (lyakh (at) iname com)`