# MVTools

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

Авторы:Manao и Fizick
Версия: 1.4.11
Загрузка: http://avisynth.org.ru/
Категория: плагины разного назначения (Misc Plugins)
Требования: YV12, YUY2 цветовые форматы (Colorspace)

## Содержание:

- I) О MVTools
- II) Описания функций
- III) Примеры
- IV) Отказ (от гарантий, Disclaimer) (не игнорируйте эту часть, хоть мы и не настаиваем на ее изучении)
- V) Ревизии

## I) О MVTools

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

Плагин содержит серверную функцию оценки движения MVAnalyse (сервер) для нахождения векторов движения и несколько клиентских функций компенсации движения (MVDenoise, MVCompensate, MVMask и других), которые используют эти векторы.

Плагин использует метод сличения блоков (block-matching) для оценки движения (подобные методы используются в MPEG2, MPEG4 и т.д). На стадии анализа плагин разделяет кадры на малые блоки и пробует найти для каждого блока в текущем кадре наиболее подобный (соответствующий) блок во втором кадре (предыдущем или последующем). Относительное смещение этих блоков и есть вектор движения. Основной мерой подобия блоков является сумма абсолютных разностей (SAD) всех пикселов этих двух сравниваемых блоков. SAD это величина, показывающая, насколько хороша оценка движения.

Выходом функции MVAnalyse является специальный клип с информацией о векторах движения в некотором формате.

На стадии компенсации клиентские функции плагина читают вектора движения и используют их, чтобы передвинуть блоки и сформировать кадр с компенсированным движением (или реализуют какую-либо другую функцию полной или частичной компенсации или интерполяции). Каждый объект (блок) в этом (полностью) скомпенсированном кадре помещен в ту же позицию, как этот объект в текущем кадре. Таким образом, мы можем (например) использовать сильное временное понижение шума даже для достаточно быстро движущихся объектов без производства раздражающих артефактов и призраков (особенности и края объектов совпадают, если компенсация совершенна). Плагин может создать компенсированные соседние кадры для каждого текущего кадра и снизить его шума с помощью внутренней функции MVDenoise. Альтернативно, вы можете использовать использовать компенсированные кадры, чтобы создать клип с их чередованием, понизить его шум с использованием любого внешнего фильтра, и выбрать для выхода центральные очищенные кадры (смотри примеры).

Конечно, оценка компенсация движения не идеальна и не точна. В некоторых сложных случаях (видео с затуханием, сверх-быстрым движением, периодическими структурами) оценка движения может быть полностью неверна, и компенсированный кадр будет блочным и (или) уродливым. Трудности также представляют заслонение одного объекта другим или наоборот, открытие. Сложные AviSynth скрипты со многими функциями компенсации движения могут съесть огромное количество памяти и привести к очень медленной обработке. Это не простой, а достаточно сложный плагин. Используйте его только для подходящих случаев, и попытайтесь настроить его параметры. Есть много обсуждений по поводу использования компенсации движения на (англоязычном) форуме doom9 по AviSynth. В частности ветка MVTools. Попробуйте почитать сообщения как дополнения к данной документации и спрашивайте там поддержку. Если вы действительно заинтересовались вопросами оценки и компенсации движения, вы легко найдете многочисленные научные публикации (используйте WWW поиск).

Замечания. Данный плагин еще в стадии разработки. Текущая версия имеет некоторые ограничения. Поддерживается только прогрессивное видео цветового формата YV12, YUY2. Используйте преобразование цветовых форматов и попробуйте использовать (разумный) BOB-деинтерлейс для чересстрочного видео.

## II)Описания функций

### Общие параметры

Фильтры, использующие вектора движения (MV), имеют ряд общих параметров. Это пороги детектирования сцен и флаги использования mmx/isse. Кроме того фильтры используют один или несколько потоков векторов.

int thSCD1: порог определения, изменился ли блок в текущем кадре относительно предыдущего. Если блок изменился, для меня это значит, что предварительный прогноз движения для него в целом некорректен. Это происходит, например, при смене сцен. То есть это один из порогов, используемых для отладки механизма детектирования смены сцен. Его увеличение уменьшит количество блоков, определяемых как измененные. Это может быть полезно для шумного или мерцающего видео. Порог сравнивается со значением SAD (Sum of Absolute Differences - суммой абсолютных различий, значение, говорящее о качестве рассчитываемого прогноза движения). Предположим мы имеем два сравниваемых блока 8х8 с каждым из пикселов отличающихся на 5. В этом случае SAD будет 8x8x5 = 320 (блок будет зарегистрирован как неизменившийся при thSCD1=400). Если используются блоки 4x4, величина SAD будет 320/4. Если используются блоки 16x16, величина SAD будет 320/4. На самом деле этот параметр масштабируется внутренне, и Вы должны всегда использовать величину, приведенную к размерам блока 8x8. По умолчанию задано 400 (с версии 1.4.1).

int thSCD2: порог, задающий количество блоков, которые должны измениться, чтобы принять решение о смене сцен. Его диапазон 0...255, 0 соответствует 0 %, 255 - 100 %. По умолчанию задано 130 (что соответствует 51 %).

bool isse : флаг, установка в false позволяющий отключить ISSE и MMX оптимизацию для отладки. По умолчанию: true. Если Ваш процессор не поддерживает mmx оптимизацию, она все равно будет отключена (и активировать ее не удастся)

bool mmx : флаг, позволяющий отключить mmx оптимизацию. По умолчанию: true. Данный параметр игнорируется в текущей и всех (?) предыдущий версиях.

### MVAnalyse

`MVAnalyse` (clip, int "blksize", int "pel", int "level", int "search", int "searchparam", bool "isb", int "lambda", bool "chroma", int "delta", int "idx", bool "truemotion", int "lsad", int "pnew", int "plevel", bool "global", int "overlap", string "outfile", int "sharp")

Оценивает движения методом сличения блоков и производит специальный выходной клип с данными по векторам движения (используемыми другими программами).
Реализованы некоторые иерархические многоуровневые методы поиска (от грубого масштаба изображения к тонкому). Функция использует нулевой вектор и векторы соседних блоков как предикторы (начальные приближения) для текущего блока. Сначала оценивается разница (SAD) для предикторов, затем пробный вектор изменяется на некоторую величину в некотором направлении, оценивается SAD, и так далее. Принятый новый вектор для блока - это вектор с минимальной разностью (SAD) (с некоторой поправкой-штрафом для согласованности движения)

blksize: Размер блока. Возможны только значения 4, 8 или 16 (по умолчанию 8). БОльшие блоки менее чувствительны к шумам, и обрабатываются быстрее, но и менее точны.

pel : Это точность прогнозирования движения. 1 означает точность до пикселя, 2 - до полу-пикселя. Пока возможные значения только 1 и 2. (Теоретически рассматривались также значения 4 и 8, выше 8 задавать бессмысленно и расходуется слишком много памяти). По умолчанию: 2 с версии 1.4.10.

level: Это количество уровней, не используемых при иерархическом анализе во время нахождения векторов движения. Чем оно меньше, тем лучше. Переменная оставлена для учебных (тестовых) целей. По умолчанию: 0.

search, searchparam : search определяет тип поиска, и searchparam - дополнительные установки для поиска:

- search = 0 : 'Однопроходный Поиск' (OneTimeSearch). searchparam - шаг между каждыми пробуемыми векторами (если searchparam больше 1, шаг будет постепенно уменьшаться).
- search = 1 : 'N-проходный Поиск'(NStepSearch). N задается параметром searchparam. Это наиболее хорошо известный алгоритм поиска векторов движения.
- search = 2 : Логарифмический поиск, также называемый Бриллиантовый поиск (Diamond Search). searchparam определяет начальный шаг поиска, и он (шаг) как и ранее, постепенно уменьшается. Это метод поиска по умолчанию (с параметром searchparam = 2).
- search= 3 : Исчерпывающий поиск, searchparam - это радиус. Метод медленный, но дает лучшие результаты по значению SAD.

isb : позволяет выбрать прямое направление поиска (между текущим и предыдущим кадром) либо обратное (между текущим и последующим кадром). isb = false означает прямой поиск ( isb установленное в true - обратное направление поиска).

chroma : установка в true позволяет учитывать и цветовую информацию при оценке движения (false - толькоя яркостную). По умолчанию true.

delta : устанавливает кадровый интервал между указанным и текущим кадром. По умолчанию он равен 1, что означает, что вектора движения ищутся между текущим и предыдущим (или следующим) кадром. Установка в 2 позволит искать mvs между кадром n и n-2 или n+2 (в зависимости от значения isb).

idx : позволяет фильтру сохранит производимую им интерполяцию в течении процесса оценки движения, для последующего повторного использования другими составляющими фильтра для того же клипа. Это позволяет, например, при выполнении поиска вперед и назад для того же клипа, избежать повторного расчета билинейной интерполяции при pel = 2. По умолчанию, задается уникальное отрицательное число (уникальное для каждого фильтра). Если вы используете его, то должны задавать аналогичные положительные числа, и вы должны использовать только те же значения для фильтров, работающих с тем же клипом (иначе анализ не будет работать правильно).

Существуют дополнительные параметры, которые устанавливают согласованность векторов движения для оценки так называемого истинного движения (true motion). Некоторые найденные поиском блоки другого кадра могут быть наиболее подобны образцовым блокам текущего блока по критерию интенсивности (SAD), но не отвечать истинному движению объекта. Например, они могут принадлежать другому подобному объекту в дугом углу кадра, или относиться к некоторой периодической структуре. Параметры "истинного движения" (true motion) пытаются поддерживать поле движения согласованным, слаженным, вместо некоторого случайного распределения векторов. Это особенно важно для частичной компенсации и интерполяции движения. Некоторые параметры являются экспериментальными и могут быль удалены (заменены) из последующих версий после тестирования. Пожалуйста, сообщайте ваши заключения.

truemotion это предварительно созданный набор значений этих параметров. Он позволяет легко переключать значения по умолчанию сразу всех параметров "истинного движения". Установите его равным true для поиска истинного движения (высокой согласованности векторов), Установите его равным false для поиска векторов движения с наилучшей SAD. По умолчанию - true c версии v1.4.10. В любом случае вы можете настроить каждый параметр индивидуально.

lambda : устанавливает связанность (слаженность, coherence) поля векторов. Чем выше, тем больше связанность. Однако, если задать его слишком высоким, некоторые 'правильные' вектора движения могут быть пропущены. Величины около 400 - 2000 (для размера блока 8х8) настоятельно рекомендуются. Внутренне это коэффициент штрафа к SAD для квадратичной разности вектора от предиктора (соседей), масштабированная на 256.
По умолчанию 0 для truemotion=false и 1000*blksize*blksize/64 для truemotion=true.

lsad: предел SAD для использования lambda. Локальная lambda сбрасывается в 0 для предиктора вектора (сформированного из соседей) с большей чем порог величиной SAD. Это предотвращает использование плохих предикторов, но расстраивает согласованность движения. Величины выше 1000 (для размера блока 8) настоятельно рекомендуются для истинного движения.
По умолчанию 400*blksize*blksize/64 для truemotion=false и 1200*blksize*blksize/64 для truemotion=true.

pnew: штраф к SAD стоимости для нового вектора-кандидата. SAD (стоимость) нового пробного вектора должна быть лучше чем у предиктора на эту величину, чтобы он бы принят как новый. Величины около 50-100 (для размера блока 8х8) рекомендуются для истинного движения. Это предотвращает замену вполне хороших предикторов на новый вектор с немного лучшей SAD, но другой длиной и направлением.
Значение pnew также используется как верхний предел величины SAD предикторов для отмены дальнейшего поиска.
По умолчанию 0 для truemotion=false и 75*blksize*blksize/64 для truemotion=true.

plevel: режим масштабирования штрафного коэффициента lambda от уровня. Величина =0 - без масштабирования, 1 - линейная, 2 - квадратичная зависимость от размера иерархического уровня. Заметьте, что длина вектора меньше на более низком уровне.
По умолчанию 0 для truemotion=false и 1 для truemotion=true.

global: оценить глобальное движение (на каждом уровне) и использовать его как дополнительный предиктор. Оценивается только панорамное смещение (ни зум, ни вращение). Величина = false означает отменить, true - разрешить. По умолчанию false для truemotion=false и true для truemotion=true.

overlap: величина перекрытия блоков. Должна быть четной и меньше размера блока (до blksize/2 для MVCompensate). Перекрытие происходит по вертикали и по горизонтали. Шаг между блоками для оценки движения равен (blksize-overlap). N блоков покрывают размер ((blksize-overlap)*N + overlap) на кадре. Параметр экспериментальный. Попробуйте значения перекрытия от blksize/4 до blksize/2. Чем больше перекрытие, тем больше число блоков, и меньше скорость обработки. Величина по умолчанию 0.
Функции, поддерживающие режим перекрытия: MVFlow, MVFlowInter, MVFlowFps1/2, MVShow, MVVMask, MVCompensate, MVDeGrain1/2.

outfile: имя файла для вывода данных по векторам движения. Эти данные могут быть использованы некоторыми внешними программами или может быть следующими версиями MVTools для кодирования второго прохода и т.п.
Протзводимый двоичный файл имеет заголовок (структура MVAnalysisData, смотри исходный код MVInterface.h), и последовательность данных:
номер кадра, данные вектора (Vx, Vy, SAD) кахдого блока, номер следующего пригодного кадра, данные векторов этого кадра, и т.д.
По умолчанию - пустая строка, не записывать файл.

sharp: метод субпиксельной интерполяции для pel=2.
Используйте 0 для мягкой (билинейной) интерполяции, 1 для бикубической (по 4 точкам, Catmull-Rom), 2 для резкой Wiener (по 6 точкам, подобно Lanczos).
По умолчанию 2.

Попробуйте использовать функцию `MVShow` function для контроля оцененного поля движения и настройки параметров.

### MVCompensate

`MVCompensate` (clip, clip "vectors", bool "scbehavior", int "mode", int "idx")

Выполняет полную компенсацию движения кадра. Это означает, что блоки указываемые векторами движения в предыдущем кадре (или последующем, в зависимости от установок `MVAnalyse`) будут двигаться вдоль векторов с целью достичь своих мест в текущем кадре.

scbehavior (по умолчанию true), определяет, какой кадр будет сохранен при смене сцен. Если true, кадр оставляется неизменным. Иначе указанный кадр копируется в текущий.

mode может быть 0 , 1 (по умолчанию)или 2. Mode=0 (быстрая) означает использование компенсации, созданной во время поиска векторов. Mode=1 означает перерасчет этой компенсации по векторам (так как возможно вы хотите использовать вектора к другому клипу чем тот, в котором выполнялся поиск). 2 означает перерасчет компенсации, но она выполняется циклически, предполагая, что вектора применяются к последнему просчитанному кадру. Результат будет ужасным, и этот режим не стоит использовать кроме случаев, когда вы точно знаете, что делаете.

idx работает аналогично idx в `MVAnalyse`. Используется только с mode = 1.

Обработка прекрывающихся блоков реализована в режиме mode=1 как оконное суммирование блоков (аналогично FFT3DFilter, величина overlap до blksize/2) для снижения артефактов блочности, и пока как последовательное покрытие блоками слева направо, сверху вниз для остальных режимов 0,2.

### MVDenoise

`MVDenoise` (clip, clip mvs [,...], bool "Y", bool "U", bool "V", int "thT", int "thSAD", int "thMV")

Выполняет базовое временнОе шумоподавление с компенсацией движения. Для опорных кадров выполняется компенсация движения и затем они сливаются с текущим кадром. Два порога используются для предотвращения артефактов.

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

Второй, thSAD, определяет, будет ли блок изменен или нет (по тем же правилам, что и thSCD1). Если блок изменился, пиксель не сливается с соответствующими из предыдущего и последующего кадров.

thMV это длина вектора, выше которой блок не используется для шумопонижения.

Наконец, Y, U и V говорят, какие плоскости должны быть обработаны шумоподавителем.

По умолчанию:Y, U и V установлены в true (да), thT = 10, thSAD = 200 и thMV = 30.

### MVMask

`MVMask` (clip, clip "vectors", int "ml", float "gamma", int "kind", int "Ysc")

Создает клип масок на основе данных векторов движения. Маска определяется данными по блокам, но интерполируется до полного размера кадра. Маска создается как в яркостном канале, так и в плоскостях цветности. Величины в маске могут быть от 0 (мин) до 255 (макс).

Параметр kind определяет разновидность маски.

Режим kind=0 создает маску движения исходя из длины векторов движения. Функция строит маску лучше, чем MotionMask ( MaskTools ), так как вектора движения намного более достоверны, чем алгоритм в MotionMask. Значение маски 0 означает отсутствие движения вообще (длина вектора нулевая). Чем больше длина вектора, тем больше величина маски (насыщается до 255), масштаб определяется параметром ml.

kind=1 позволяет построить маску из величин SAD (суммы абсолютных разностей) вместо длин векторов. Это может быть полезно, чтобы выявить проблемные области с плохой оценкой движения. (Используется внутренний коэффициент blocksize*blocksize/4 для нормализации масштаба ml.)

kind=2 позволяет построить маску окклюзий (разрывности, заграждения, occlusion) (плохих блоков из-за разрыва, растяжения). В настоящей версии используется некоторая нормализованная сумма положительных разностей движения блоков. Она может масштабироваться ml.

ml определяет масштаб (шкалу) маски движения. Если длина вектора (или величина другой разновидности) больше и равна ml, то выходная величина насыщается до 255. Меньшие величины дают меньшее выходное значение.

gamma используется для определения показателя степени зависимости выхода от входа. gamma = 1.0 подразумевает линейную зависимость, а gamma = 2.0 дает квадратичную. И наконец, Ysc есть величина, принимаемая маской при смене сцены.

По умолчанию: kind=0, ml = 100, gamma = 1.0, и Ysc = 0.

### MVSCDetection

`MVSCDetection` (clip, clip "vectors", int "Ysc")

Создает клип маски смены сцены на основе данных векторов движения. Маска создается для каналов яркости и цветоразности. Выход без смены сцены равен 0.

Ysc - это величина, принимаемая маской при смене сцены, по умолчанию 255.

### MVShow

`MVShow` (clip, clip "vectors", int "scale", int "sil", int "tol', bool "showsad")

Показывает вектора движения. Параметр scale позволяет увеличить вектора движения, например для увеличения точности (когда pel > 1 и scale = 1, невозможно увидеть изменения менее чем на 1 пиксель). sil позволяет увидеть различные уровни анализа (когда для поиска векторов движения задан иерархический анализ и интересно увидеть что произойдет при более высоких уровнях). tol - порог допуска (толерантности). Если искажения, вызванные вектором движения больше tol, то вектор не показывается. Наконец, showsad позволяет показать среднее значение SAD картинки после компенсации.

По умолчанию: scale = 1, sil = 0, tol = 20000 и showsad = false (что обеспечивает показ всех векторов).

### MVChangeCompensate

`MVChangeCompensate` (clip vectors, clip)

Позволяет изменить компенсационную информацию, сохраненную в потоке векторов движения vectors.

### MVIncrease

`MVIncrease` (clip, clip "vectors", int "horizontal", int "vertical", int "idx")

Позволяет использовать вектора, рассчитанные для версии клипа с уменьшенными размерами для выполнения компенсации клипа оригинального размера.

horizontal горизонтальное соотношение между шириной оригинального и уменьшенного клипа.

vertical вертикальное соотношение между высотой оригинального и уменьшенного клипа.

idx работает так же, как и в `MVAnalyse`

### MVDepan

`MVDepan` (clip, clip "vectors", bool "zoom", bool "rot", float "pixaspect", float "error", bool "info", string "log")

Получает вектора движения, оценивает глобальное движение и помещает данные в выходной кадр в специальном формате для плагина DePan (от Fizick).

Меж-кадровое глобальное движение (панорамирование, зум, вращение) оценивается итерационной процедурой, с использованием только хороших блоков.

Отвергаемые блоки: 1) вблизи границ кадра; 2) с большим SAD (по параметру thSCD1); 3) с движением, отличающимся от глобального.

Параметры zoom и rot включают оценку зума и вращения, pixaspect это аспект пиксела (1.094 для стандартного PAL, 0.911 для стандартного NTSC), error это максимум отличия от среднего движения.

Оцениваемое глобальное движение кадра выключается в нулевое для больших ошибок движения error или на смене сцены (по параметрам thSCD1, thSCD2).

Параметр info позволяет вывести информацию по глобальному движению для отладки.

Параметр log позволяет задать имя лог-файла для вывода значений в формате DeShaker, DePan.

Значения по умолчанию: zoom = true, rot = true, pixaspect = 1.0, error = 15.0, info = false.

Для оценки глобального движения чересстрочного видео, вы должны разделить поля (как для MVAnalyse, так и MVDepan).

### MVFlow

`MVFlow` (clip, clip "vectors", float "time", int "mode", int "idx")

Делает компенсацию движения кадра не по блокам (как MVCompensation), а по пикселам. (Flow - течение). Вектор движения каждого пиксела вычисляется путем билинейной интерполяции векторов движения текущего и соседних блока (в соответствии с положением пиксела). Это означает, что пикселы, указываемые вектором в опорном кадре будут двигаться (течь) вдоль вектора, чтобы достичь их мест в текущем кадре. Данный метод компенсации движения течением не производит блочных артефактов, и хорош для понижения шума, но иногда может создать очень странные деформированные картины :). Оценка истинного движения настоятельно рекомендуется для этой функции. Компенсация движения может быть полной или частичной (в промежуточное время).
Ограничение: вектора с компонентами выше 127 будут сброшены к нулевой длине.

time: процент компенсации движения (по умолчанию=100.0, полная компенсация), определяет временной момент между опорным и текущим кадром.

mode: режим может быть или 0 (по умолчанию), или 1.
mode=0 - поднести пикселы к каждому месту целевого кадра. Это основной рабочий режим.
mode=1 - сдвинуть пикселы от каждого места источника (опорного). Это отладочный (учебный) режим с некоторыми пустыми местами (с нулевой интенсивностью). Он может быть использован для генерации маски окклюзий.

idx (может) работать как указано для idx в MVAnalyse.

### MVFlowInter

`MVFlowInter` (clip, clip "mvbw", clip "mvfw", float "time", float "ml", int "idx")

Функция интерполяции движения. Это не то же самое (но подобное) функции MVInterpolate более старых версий MVTools. Она использует обратные "mvbw" и прямые "mvfw" вектора движения, чтобы создать изображение в некоторый промежуточный момент времени между текущим и следующим кадром. Она использует по-пиксельную компенсацию движения (методом MVFlow) из обоих кадров. Используются внутренние прямая и обратная маски окклюзий - разрывности (методом MVMask kind=2) и временные взвешивающие факторы, чтобы произвести выходное изображение с минимальными артефактами. Оценка истинного движения настоятельно рекомендуется для этой функции.

time: положение интерполяционного момента времени между кадрами (в процентах, по умолчанию=50.0, посредине)

ml: масштабный параметр маски. Большие величины соответствуют более слабой маске окклюзий (как в функции MVMask, используйте ее для настройки и отладки). По умолчанию=100.

idx (может) работать как указано для idx в MVAnalyse.

### MVFlowFps

`MVFlowFps` (clip, clip "mvbw", clip "mvfw", int "num", int "den", float "ml", int "idx")

Будет изменять частоту кадров (fps) клипа (и число кадров). Функция может быть использована для преобразования частоты, эффектов замедления движения и т.п. Она использует обратные "mvbw" и прямые "mvfw" вектора движения чтобы создать интерполированные изображения в некоторые промежуточные моменты времени между кадрами. Функция использует по-пиксельный метод компенсации движения (как MVFlow, MVFlowInter). Используются внутренние прямая и обратная маски окклюзий - разрывности (методом MVMask kind=2) и временные взвешивающие факторы, чтобы произвести выходное изображение с минимальными артефактами. Оценка истинного движения настоятельно рекомендуется для этой функции.

num: fps числитель (по умолчанию=25)

den: fps знаменатель (по умолчанию=1). Результирующая частота кадров fps = num/den. Например, используйте 30000/1001 для 29.97

ml: масштабный параметр маски. Большие величины соответствуют более слабой маске окклюзий (как в функции MVMask, используйте ее для настройки и отладки). По умолчанию=100.

idx (может) работать как указано для idx в MVAnalyse.

### MVFlowFps2

`MVFlowFps2` (clip, clip "mvbw", clip "mvfw", clip "mvbw2", clip "mvfw2", int "num", int "den", float "ml", int "idx", int "idx2")

Будет изменять частоту кадров (fps) клипа (и число кадров) подобно MVFlowFps, но с немного лучшим качеством (и более медленной обработкой). В дополнении к обратным "mvbw" и прямым "mvfw" векторам движения оригинального исходного клипа, функция использует обратные "mvbw2" и прямые "mvfw2" вектора движения второго (модифицированного) клипа-источника. Второй клип должен быть сделан из оригинального исходного клипа путем обрезки (то есть диагонального сдвига) на половину размера блока. Это может быть сделано командой `Crop(a,a,-b,-b)`, где a=b=4 должны использоваться для blksize=8, a=b=8 для blksize=16, и a=2, b=6 для blksize=4 (смотри пример). Границы блоков будут на разных частях объектов. MVFlowFps2 обращает сдвиг внутренне и усредняет вектора движения двух источников для снижения ошибок оценки движения. Функция использует по-пиксельный метод компенсации движения (как MVFlow, MVFlowInter). Используются внутренние прямая и обратная маски окклюзий - разрывности (методом MVMask kind=2) и временные взвешивающие факторы, чтобы произвести выходное изображение с минимальными артефактами. Оценка истинного движения настоятельно рекомендуется для этой функции.

num: fps numerator (default=25)

den: fps denominator (default=1). Результирующая частота кадров fps = num/den. Например, используйте 30000/1001 для 29.97

ml: масштабный параметр маски. Большие величины соответствуют более слабой маске окклюзий (как в функции MVMask, используйте ее для настройки и отладки). По умолчанию=100.

idx (может) работать как указано для idx в MVAnalyse.

idx2 это индекс MVAnalyse второго (смещенного) клипа clip (не должен совпадать с первым idx).

### MVFlowBlur

`MVFlowBlur` (clip, clip "mvbw", clip "mvfw", float "blur", int "prec", int "idx")

Экспериментальная простая функция размытия движения (motion blur). Она может быть использована для создания эффекта Фильма (чтобы имитировать конечное время открытия затвора кинокамеры). Она использует обратные "mvbw" и прямые "mvfw" вектора движения для создания и наложения многих копий частично компенсированных пикселов в промежуточные моменты времени в некотором интервале размытия вокруг текущего кадра. Используется по-пиксельная компенсация (метод MVFlow). Оценка истинного движения настоятельно рекомендуется для этой функции.

blur: временной интервал размытия между кадрами, время открытия затвора (в процентах, по умолчанию=50.0)

prec: точность размытия в единицах пикселов. Максимальный шаг между компенсированными размытыми пикселами. По умолчанию =1 (наиболее точно).

idx (может) работать как указано для idx в MVAnalyse.

### MVDeGrain1 и MVDeGrain2

`MVDeGrain1` (clip, clip "mvbw", clip "mvfw", int "thSAD", int "plane", int "idx")

`MVDeGrain2` (clip, clip "mvbw", clip "mvfw", clip "mvbw2", clip "mvfw2", int "thSAD", int "plane", int "idx")

Производит динамическое понижение шума с компенсацией движения. Блоки опорных предыдущих и последующих кадров компенсируются и затем усредняются с текущим кадром с весовыми факторами зависящими от разницы блоков от текущего (SAD). Функции поддерживают режим перекрытия блоков (overlap). Обработка прекрывающихся блоков реализована как оконное суммирование блоков (аналогично FFT3DFilter, величина overlap до blksize/2) для снижения артефактов блочности.

MVDeGrain1 имеет временной радиус 1 (использует вектора предыдущего mvfw и последующего mvbw кадров).

MVDeGrain2 имеет временной радиус 2 (использует вектора двух предыдущих mvfw2, mvfw и двух последующих mvbw,mvbw2 кадров). Он медленнее, но дает чуть лучшие результаты.

Степень фильтрации управляется параметром "thSAD". Он определяет порог суммы абсолютных разностей блоков (SAD). Вы должны ввести величину thSAD приведенную к блоку 8x8. Чем больше SAD, тем меньше вес. Блоки с SAD выше порога thSAD имеют нулевой вес.
По умолчанию : thSAD=400.

Параметр plane устанавливает обрабатываемые цветовые плоскости:
0 - яркость, 1 - цветность U, 2 - цветность V, 3 - обе цветности, 4 - все. По умолчанию 4.

idx (может) работать как указано для idx в MVAnalyse.

## III) Примеры

Показать вектора движения (вперед) :

    vectors = source.MVAnalyse(isb = false)
    return source.MVShow(vectors)

Показать аналогичное назад:

    vectors = source.MVAnalyse(isb = true)
    return source.MVShow(vectors)

Использование MVMask :

    vectors = source.MVAnalyse(isb = false)
    return source.MVMask(vectors)

Для шумоподавления:

    backward_vec2 = source.MVAnalyse(isb = true, lambda = 1000, delta=2)
    backward_vec1 = source.MVAnalyse(isb = true, lambda = 1000, delta=1)
    forward_vec1 = source.MVAnalyse(isb = false, lambda = 1000, delta=1)
    forward_vec2 = source.MVAnalyse(isb = false, lambda = 1000, delta=2)
    return source.MVDenoise(backward_vec2,backward_vec1,forward_vec1,forward_vec2,tht=10,thsad=300)

Чтобы убрать блочность компенсации, хранимой в потоке векторов движения:

    vectors = source.MVAnalyse(isb = false, lambda = 1000)
    compensation = source.MVCompensate(vectors, mode = 0)
    compensation = compensation.Deblock() # используем функцию DeBlock
    vectors = vectors.MVChangeCompensate(compensation)

Чтобы понизить шум c pel = 2, эффективно :

    backward_vec2 = source.MVAnalyse(isb = true, lambda = 1000, delta = 2, pel = 2, idx = 1)
    backward_vec1 = source.MVAnalyse(isb = true, lambda = 1000, delta = 1, pel = 2, idx = 1)
    forward_vec1 = source.MVAnalyse(isb = false, lambda = 1000, delta = 1, pel = 2, idx = 1)
    forward_vec2 = source.MVAnalyse(isb = false, lambda = 1000, delta = 2, pel = 2, idx = 1)
    return source.MVDenoise(backward_vec2,backward_vec1,forward_vec1,forward_vec2,tht=10,thsad=300)

Чтобы использовать MVIncrease :

    vectors = source.reduceby2().mvanalyse(isb = true)
    return source.MVIncrease(vectors, horizontal = 2, vertical = 2)

Чтобы использовать MVDepan с плагином Depan для чересстрочного видео (пример функции DepanStabilize):

    source = source.AssumeTFF().SeparateFields() # установи корректный порядок полей
    vectors = source.MVAnalyse(isb = false)
    globalmotion = source.MVDepan(vectors, pixaspect=1.094, thSCD1=400)
    DepanStabilize(source, data=globalmotion, cutoff=2.0, mirror=15, pixaspect=1.094)
    Weave()

Чтобы сгладить проблемные (блочные) области компенсированного кадра с маской заграждения:

    vectors = source.MVAnalyse(isb = false, lambda = 1000)
    compensation = source.MVCompensate(vectors) # или используйте MVFlow функцию здесь
    # приготовим размытый кадр с некоторой сильной функцие блюра или deblock:
    blurred = compensation.DeBlock(quant=51) # используем функцию DeBlock
    badmask = source.MVMask(vectors, kind = 2, ml=50)
    overlay(compensation,blurred,mask=badmask) # или используйте более быструю MaskedMerge

Чтобы восстановить испорченные кадры интерполяцией c MVFlowInter:

    backward_vectors = source.MVAnalyse(isb = true, truemotion=true, pel=2, delta=2, idx=1)
    forward_vectors = source.MVAnalyse(isb = false, truemotion=true, pel=2, delta=2, idx=1)
    inter = source.MVFlowInter(backward_vectors, forward_vectors, time=50, ml=70, idx=1)
    # Предположим плохие кадры 50 и 60
    source.trim(0,49) ++ inter.trim(49,-1) \
     ++ source.trim(51,59) ++ inter.trim(59,-1) ++ source.trim(61,0)

Чтобы изменить частоту кадров с MVFlowFps:

    # предполагаем прогрессивный PAL 25 fps источнмк
    backward_vec = source.MVAnalyse(isb = true, truemotion=true, pel=2, idx=1)
    # we use explicit idx for more fast processing
    forward_vec = source.MVAnalyse(isb = false, truemotion=true, pel=2, idx=1)
    return source.MVFlowFps(backward_vec, forward_vec, num=50, den=1, ml=100, idx=1) # получили 50

Чтобы изменить частоту (fps) с MVFlowFps2:

    # Предполагаем прогрессивный PAL 25 fps источнмк. Преобразуем его к 50 к/с.
    backward_vec = source.MVAnalyse(isb = true, truemotion=true, pel=2, idx=1)
    # мы используем явное указание idx для более быстрой обработки
    forward_vec = source.MVAnalyse(isb = false, truemotion=true, pel=2, idx=1)
    cropped = source.crop(4,4,-4,-4) # обрезка на половину размера блока 8
    backward_vec2 = cropped.MVAnalyse(isb = true, truemotion=true, pel=2, idx=2)
    forward_vec2 = cropped.MVAnalyse(isb = false, truemotion=true, pel=2, idx=2)
    return source.MVFlowFps2(backward_vec,forward_vec,backward_vec2,forward_vec2,num=50,idx=1,idx2=2)

Чтобы генерировать приятное размытие движения с MVFlowBlur:

    backward_vectors = source.MVAnalyse(isb = true, truemotion=true)
    forward_vectors = source.MVAnalyse(isb = false, truemotion=true)
    return source.MVFlowBlur(backward_vectors, forward_vectors, blur=15)

Понижение шума с некоторым внешним фильтром (который использует три кадра: предыдущий, текущий, следующий):

    backward_vectors = source.MVAnalyse(isb = true, truemotion=true, delta = 1, idx = 1, thSCD1=500)
    # мы используем явное idx для более быстрой обработки
    forward_vectors = source.MVAnalyse(isb = false, truemotion=true, delta = 1, idx = 1, thSCD1=500)
    forward_compensation = source.MVFlow(forward_vectors, idx=1) # или используйте MVCompensate
    backward_compensation = source.MVFlow(backward_vectors, idx=1) # или используйте MVCompensate
    # создадим чередующиеся трех-кадровые последовательности
    interleave(forward_compensation, source, backward_compensation)

    DeGrainMedian() # поместите  предпочитаемый Вами временной (пространственно-временной) фильтр здесь

    return selectevery(3,1) # возвращает фильтрованные только центральные (не компенсированные) кадры

Чтобы использовать предварительно отфильтрованный клип для более надежной оценки движения, но компенсировать движение нефильтрованного клипа (на примере подавления шума):

    # Используем некий шумоподавитель (блюр) или стабилизатор яркости для предварительной фильтрации
    prefiltered = source.DeGrainMedian()
    backward_vectors = prefiltered.MVAnalyse(isb = true, truemotion=true, delta = 1, idx = 1)
    # мы используем явное idx для более быстрой обработки
    forward_vectors = prefiltered.MVAnalyse(isb = false, truemotion=true, delta = 1, idx = 1)
    # используем нефильтрованный оригинальный клип для компенсации движения (с другим idx)
    forward_compensation = source.MVFlow(forward_vectors, idx=2) # или используйте MVCompensate(mode=1)
    backward_compensation = source.MVFlow(backward_vectors, idx=2) # или используйте MVCompensate(mode=1)
    # создадим чередующиеся трех-кадровые последовательности
    interleave(forward_compensation, source, backward_compensation)

    DeGrainMedian() # поместите предпочитаемый Вами временной (пространственно-временной) фильтр здесь

    return selectevery(3,1) # возвращает фильтрованные только центральные (не компенсированные) кадры

Чтобы подавить шум функцией MVDegrain2 с перекрывающимися блоками и субпиксельной точностью :

    backward_vec2 = source.MVAnalyse(isb = true, delta = 2, pel = 2, overlap=4, sharp=1, idx = 1)
    backward_vec1 = source.MVAnalyse(isb = true, delta = 1, pel = 2, overlap=4, sharp=1, idx = 1)
    forward_vec1 = source.MVAnalyse(isb = false, delta = 1, pel = 2, overlap=4, sharp=1, idx = 1)
    forward_vec2 = source.MVAnalyse(isb = false, delta = 2, pel = 2, overlap=4, sharp=1, idx = 1)
    source.MVDegrain2(backward_vec1,forward_vec1,backward_vec2,forward_vec2,thSAD=400, idx=1)

Чтобы подавить шум чересстрочного источника функцией MVDegrain1 с перекрывающимися блоками и субпиксельной точностью:

    fields=source.AssumeTFF().SeparateFields() # or AssumeBFF
    backward_vec = fields.MVAnalyse(isb = true, delta = 2, pel = 2, overlap=4, sharp=1, idx = 1)
    forward_vec = fields.MVAnalyse(isb = false, delta = 2, pel = 2, overlap=4, sharp=1, idx = 1)
    fields.MVDegrain1(backward_vec,forward_vec,thSAD=400,idx=1)
    Weave()

## IV) Отказ (от гарантий)

Плагин распространяется на условиях лицензии GPL. Вы должны согласиться с условиями в 'Copying.txt' прежде чем использовать плагин и его исходный код. Прошу материальную помощь для поддержки.

## V) Ревизии

1.4.11 (06.09.2006 by Fizick)

- Подправил интерполяцию предикторов векторов (от грубого до тонкого масштаба) для overlap>0.
- Исправлена ошибка с шириной для overlap=0, YV12 в MVDegrain1 (спасибо Boulder за доклад)

1.4.10 (18.08.2006 by Fizick)

- Подправил обработку правого и нижнего края в MVCompensate для произвольных размеров кадра.
- Изменил значения по умолчанию в MVAnalyse: pel=2, truemotion=true, sharp=2.

1.4.9 (14.08.2006 by Fizick)

- Исправил ошибку в MMX оптимизации к режиму перекрытия в MVDeGrain, MVCompensate для YUY2 с blksize=8 (спасибо TSchniede за доклад).

1.4.8 (31.07.2006 by Fizick)

- Добавил некоторую MMX оптимизацию к режиму перекрытия в MVDeGrain, MVCompensate.
- Исправил ошибку с последними (не обрабатываемыми) строками в MVDeGrain.

1.4.7 (25.07.2006 by Fizick)

- Снизил сеточность перекрытия в MVDeGrain1, MVDeGrain2, MVCompensate.
- Добавил пример с MVDeGrain1 для чересстоочного

1.4.6 (24.07.2006 by Fizick)

- Снижено шумоподавление в MVDeGrain1, MVDeGrain2.
- Параметр plane в MVDeGrain1, MVDeGrain2 теперь работает :)

1.4.5 (22.07.2006 by Fizick)

- Добавлен параметр plane в MVDeGrain1, MVDeGrain2.

1.4.4 (19.07.2006 by Fizick)

- Исправил значение по умолчанию thSAD=400 в MVDeGrain1, MVDeGrain2.
- Исправил ошибку с цветовой плоскостью V в MVChangeCompensate.

1.4.3 (17.07.2006 by Fizick)

- Снизил сеточность перекрытия в MVDeGrain1, MVDeGrain2.

1.4.2 (16.07.2006 by Fizick)

- Исправил ошибку доступа к памяти в MVDeGrain1, MVDeGrain2. Спасибо krieger2005 за доклад.

1.4.1 (23.06.2006 by Fizick)

- Изменил режим MVDeGrain1, MVDeGrain2 на взвешивание по SAD.
- Изменил thSCD1 по умолчанию с 300 до 400.

1.4.0 (19.06.2006 by Fizick)

- Добавил MVDeGrain1, MVDeGrain2 ограниченные усредняющие шумоподавители.
- Исправил масштаб thSAD в MVDenoise.
- Исправил документацию о SAD.

1.3.1 (11.06.2006 by Fizick)

- Добавил бикубический метод субпиксельной интерполяции для pel=2 (с iSSE оптимизацией для sharp=1,2).
- Ассемблерная SSE оптимизация скорости для метода компенсации с перекрытием блоков.

1.3.0 (05.06.2006 by Fizick)

- Реализовал компенсацию движения перекрывающихся блоков в MVCompensation(mode=1).
- Изменил режим по умолчанию на mode=1 в MVCompensation как наиболее универсальный.
- Добавил метод резкой субпиксельной интерполяции для pel=2.
- Исправил ошибку для blksize=16 с YUY2.
- (Список на будущее: ассемблерная SSE оптимизация скорости для новых методов компенсации и интерполяции.)

1.2.6 beta (21.05.2006 by Fizick)

- Добавил опцию выводить данные по векторам движения в лог файл, как просил Endre.

1.2.5 (08.05.2006 by Fizick)

- Снижен вес нулевого вектора, погрешнось итераций в MVDepan

1.2.4 (07.04.2006 by Fizick)

- Исправлена ошибка v.1.2.3 в режиме info в MVDepan

1.2.3 (31.03.2006 by Fizick)

- Реализована обработка разделеного на поля чересстрочного видео в MVDepan;
- добавлена опция лог-файла в MVDepan.

1.2.2 beta (01.03.2006 by Fizick)

- Исправлена ошибка сдвига кадра v1.2.1 MMX YUY2 преобразования (спасибо WorBry за сообщение)

1.2.1 beta (20.02.2006 by Fizick)

- Fixed bug of v1.2,
- Скорость восстановлена,
- MMX YUY2 преобразование (из Avisynth 2.6 функции от sh0dan)
- Но режим overlap кажется все еще работает неверно

1.2 beta (17.02.2006 by Fizick)

- YUY2 формат (кроме MVIncrease), без оптимизации

1.1.1 (16.02.2006 by Fizick)

- Удалил фильтры DeBlock и Corrector (не используют вектора движения, будут отдельными плагинами)
- Документировал старую функцию MVSCDetection.
- Очистил проект от неиспользуемых исходных файлов.

1.1 (не публичный выпуск 9.01.2006 by Fizick)

- Достаточно большая ревизия (бета). Новая опция для оценки движения перекрывающихся блоков в MVAnalyse для использования в MVFlow, MVFlowInter, MVFlowFps для улучшенной компенсации движения.
- Таблицы для интерполяции движения.
- Небольшая коррекция величины смещения в MVFlowFps2.

1.0.3 (Выпущена 30.12.2005 by Fizick)

- Исправил ошибку смещения в MVFlowInter, MVFlowFps (введенную в v1.0.2).

1.0.2 (Выпущена 28.12.2005 by Fizick)

- Скорректровал величину смещения в MVFlow (немного).

1.0.1 (Выпущена 24.12.2005 by Fizick)

- Исправил утечку памяти в MVAnalyse с глобальным движением (спасибо AI за доклад).
- Удалил пенальти для нулевого вектора-предиктора в MVAnalyse (был введен в v1.0).
- Изменил chroma=true по умолчанию в MVAnalyse.
- Добавил пример предварительной фильтрации.

1.0 (Выпущена 29.11.2005 by Fizick)

- Восстановил нулевой вектор как предиктор в MVAnalyse.
- Изменил масштаб времени блюра в MVFlowBlur (100 это полностью открытый затвор теперь) как просил Mug Funky.

0.9.13.3 (Выпущена 27.11.2005 by Fizick)

- Добавил вектор глобального движения (простой метод) в качестве предиктора в MVAnalyse.
- Поиск векторов прекращается (для скорости), если найден хороший предиктор (с SAD < pnew).
- Параметр scale в MVShow теперь работает правильно.
- Отменил вывод некоторой отладочной и профилирующей инфомации (для увеличения скорости).
- Изменил значение по умолчанию prec=1 (было 2) в MVFlowBlur.

0.9.13.2 (Выпущена 22.11.2005 by Fizick)

- Исправил ошибку в MVFlowFps, MVFlowFps2 для нецелых частот.

0.9.13.1 (Выпущена 21.11.2005 by Fizick)

- Исправил ошибку в MVFlowFps, MVFlowFps2, MVFlowInter, MVFlowBlur (введенную в 0.9.13).
- Убрал параметр plen из MVAnalyse как бесполезный.

0.9.13 (Выпущена 20.11.2005 by Fizick)

- Добавил truemotion пресет к MVAnalyse.
- Добавил экспериментальную MVFlowFps2.
- Изменил метод округления при интерполяции вектора во всех MVFLow... функциях.
- Немного отредактирована документация, обновлена русская.

0.9.12.4 (Выпущена 15.11.2005 by Fizick)

- Изменил тип параметра ml в MVMask, MVFlowInter, MVFlowFps с int на float.
- Добавил проверки диапазона параметров ml, time, blur.
- Исправил малую возможную ошибку (emms).
- Частично обновил документацию. Но я не уверен, что sh0dan запрашивал имено такое обновление :). Это все еще не руководство пользователя, а справочник по функциям.

0.9.12.3 (Выпущена 14.11.2005 by Fizick)

- Исправлена ошибка для цветности для ширины не кратной 16 в MVMask (введена в v0.9.11).
- Некоторая оптимизация скорости MVFlowFps.
- Переустановил размер внутренего буфера кадров в превоначальную величину 10. Пробуйте разные версии.

0.9.12.2 (Выпущена 13.11.2005 by Fizick)

- Добавил экспериментальный точную но медленую функцию MVFlowBlur как запрашивал scharfis_brain.
- Временно изменил разиер внутреннего буфера на 5.

0.9.12.1 (Выпущена 12.11.2005 by Fizick)

- Добавил экспериментальную функцию MVFlowFps.
- Убрал функцию MVInter.
- Временно изменил размер внутреннего буфера кадров с 10 до 3 для снижения использования памяти. Скорость должна быть протестирована для сложных скриптов.

0.9.12 (Выпущена 09.11.2005 by Fizick)

- Добавлена функция MVFlowInter. Функция MVInter будет удалена из следующего выпуска (она хуже).
- Изменил масштаб ml для kind=2 MVMask до более оптимального умолчания.
- Исправил небольшую ошибку в Bilinear.asm (странные пикселы у правой границы для pel=2).

0.9.11.1 (Выпущена 06.11.2005 by Fizick)

- Добавил поддержку полу-пикселов pel=2 к MVFlow.
- Увеличен максимальный quant с 51 до 60 в DeBlock для очень сильного подавления блочности.
- Исправлена документация.

0.9.11 (Выпущена 04.11.2005 by Fizick)

- Улучшена MVMask: Заменен булевый параметр showsad на целый kind, добавил опцию маски окклюзий, изменил код билинейного масштабирования на более корректный и быстрый SimpleResize.

0.9.10.1 (Выпущена 01.11.2005 by Fizick)

- Исправил ошибку с малым изменением яркости и цветности в MVInter (ошибка округления).
- Интерполяция векторов в MVFlow и маски в MVInter теперь корректны (благодаря исправлению ошибки в SimpleResize).

0.9.10 (Выпущена 31.10.2005 by Fizick)

- Добавлены некоторые опции оценки истинного (сглаженного) движения к MVAnalyse
- Добавлена функция MVFlow для по-пиксельной компенсации
- Добавлена функция MVInter для интерполяции движения (очень экспериментальная).

0.9.9.1 (Выпущена 20.01.2005 by Manao)

- Больше нет необходимости в stlport_vcxxxx.dll

0.9.9

- Добавлена функция: Corrector
- Добавлена функция: MVIncrease
- Возможен новый размер блока: 16
- Новый параметр в MVAnalyse : chroma
- Изменения в ядре

0.9.8.5

- MVCompensate изменена: новый параметр idx, работающий как idx в MVAnalyse, и позволяющий увеличить скорость при многократной компенсации тех же кадров.

0.9.8.4

- Оценка движения (ME) теперь берет в расчет и цветовую информацию, как просил tsp.

0.9.8.3

- Добавлена функция Corrector, как просил scharfi.

0.9.8.2

- Новая функция MVDepan (добавлена Fizick) для плагина Depan.

0.9.8

- Вновь некоторые изменения в синтаксисе фильтров.Сильно изменено ядро, в основном с целью выигрыша по скорости где возможно. Однако, по умолчанию выигрыш в скорости не заметен, необходимо корректно сконфигурировать анализирующий фильтр с помощью параметра "idx" для выигрыша в скорости (в режиме "pel" = 2).
- Устранены ошибки в MVDenoise, и цветовом шумоподавлении в MVDenoise.
- Теперь фильтры, стоящие ниже по цепочке фильтров, говорят фильтру анализа, если нуждаются в компенсации, так что вы не должны об этом заботиться на стадии анализа.

0.9.7

- Вновь многое переписано. Отключены интерполирующие фильтры (на время), все другие фильтры работают и предположительно, стабильны. Слегка изменен синтаксис, и будет меняться до достижения версии 1.0 (если она однажды будет достигнута). Изменения затронули главным образом `MVAnalyse`. Новый фильтр: `MVChangeCompensate`.

0.9.6.2

- Исправлена ошибка в параметрах `MVMask`.

0.9.6.1

- Lot of bugfixes for the existing filters. MVMask, MVShow, MVCompensate, MVDenoise and MVSCDetection, and MVAnalyse should work . Other may crash unexpectedly.
- Now, for the three new filters. Two have nothing to do with motion compensation, but I didn't want to put them in separate binaries, since they'll mainly be used with filters from this package. The third one uses vectors, and integrates somehow the two others.
- QDeQuant(clip c, int quant, int level) : takes a clip and quantizes it, using an approximation of the H264 DCT. It filters the three planes ( 4x4 blocks for each of them, so the chroma isn't processed as in H264 ). It's not exactly the H264 DCT because at q1, it's lossless, and a q51 it's not that bad, but you can raise quant over 51. Level is the reference level of the picture. By default it's zero, but it can be set, for example, to 128. The picture is then treates as if pixels were ranging from -128 to 127, hence avoiding errors around 128.
- Deblock(clip c, int quant, int aOffset, int bOffset ) : takes a clip, and deblock it using H264 deblocking, as if the picture was made only of inter blocks. This time, quant ranges from 0 to 51 as in H264, and has the same impact. aOffset and bOffset allow to raise / lower the quant when deciding for some internal thresholds. They are set by default to 0. Be warned that the filter should do nothing at quant < 16, if aOffset and bOffset are both zero. It's a wanted behavior ( thus it respect the partially the norm ).
- EncDenoise(clip c, clip vectors, bool scbehavior, int quant, int aOffset, int bOffset, int thSCD1, int thSCD2) : it merges Deblock, QDeQuant and MVCompensate, taking from them the name and behavior of their parameters. It basically does a h264 encode as if all blocks were 8x8 inter blocks. Reference frame is the previous frame output by the filter ( if it is the correct one, else it's the previous frame of the source ), mvs are those given by mvanalyse on the source. The reference frame is compensated by the vectors, then the residual difference is quantized / dequantized and added to the result of the motion compensation. Finally, the frame is deblocked, and serves as reference for the next one.

0.9.5.3

- Mainly a bugfixe ( several filters were affected by a silly bug , and MVCompensate now do padded motion compensation, and compensate also the chroma ( though it rounds the vector to odd coordinates to do so )
- A new feature, as asked by Fizick, for mvcompensate : "scbehavior", a boolean set to true by default, will allow you to keep the previous frame over a scenechange if you set it to false.

0.9.5.2

- MVMask has two new parameters : showsad (bool) which allows to build the mask of the SAD values instead of the mask of the vectors' length. Ysc allows you to set the value taken by the mask on scene changes
- MVCompensate : behavior modification on scene changes. Now, the current frame is left untouched if a scene change was detected.
- New filter : MVSCDetection, with one parameter, Ysc, which works as previously.
- MVInterpolate, MVConvertFPS and MVBlur are enabled, but may be buggy ( though I wasn't able to make MVConvertFPS crash )

0.9.5

- Очень существенно переписано исполняемое ядро. Вектора теперь ищутся с точностью от пикселя и выше (в связи с тем, что никакой другой фильтр, кроме MVShow, еще не может работать с большей точностью). Механизм поиска сейчас быстрый (что не обязательно подразумевает, что и фильтры, использующие его информацию тоже быстрые)
- Новый параметр в MVAnalyse : lambda. Смотри документацию выше о том, как он работает
- MVDenoise работает лучше.

0.9.4

- Вектора можно сохранять в файле. С этой целью в фильтре MVAnalyse добавлен параметр filename="C:\foo.bar". Если файл не существует, вектора будут сохраняться в нем. Если он существует, то вектора будут из него читаться. Но обратите внимание:
  - Файл для целого фильма будет около 500 MБ
  - Сохранение / считывание файла требует в этот момент наличие прямого доступа к кадрам, потому его можно использовать только во время кодирования фильма, но не в процессе случайного доступа к его кадрам.
  - Прирост скорости не настолько велик, как я надеялся, так как SAD-ы не могут быть сохранены (это требует слишком много места) и должны пересчитываться.
- Фильтр MVDenoise теперь работает на 5 кадрах, и его параметры теперь "thT" и "sadT" (смотрите в документации как они работают). Он работает весьма приятно (очень хорошо для тяжелого шумоподавления)
- Порог детектирования смены сцен слегка изменен. Теперь блок изменяется, если его SAD больше thSCD1. По умолчанию thSCD1 = 300, и thSCD2 = 130. Работает хорошо (лучше, чем предыдущий SCD-механизм).

0.9.3

- Последние чистки в механизме поиска векторов.Теперь должно работать слегка быстрее
- Больше параметров поиска, устанавливаемых пользователем, особенно алгоритм поиска. Смотри документацию
- Обеспечивается работа клиент / сервер. Теперь сначала используется MVAnalyse, а потом уже желаемый фильтр. Смотри документацию и примеры, которые я изменил.
- MVCompensate отделена от MVShow (это более логично). На данный момент не работает с цветовыми компонентами (поведение аналогично MVShow в последних версиях)
- Некоторые чистки в MVBlur / MVInterpolate / MVConvertFPS, но работают они примерно так-же. Теперь MVBlur выполняет размытие в пределах кадра, а не между текущим и предыдущим кадром.
- Проделано половина работы для записи векторов в файл. Но результирующий файл будет больше (около 500 MБ - 1 ГБ, я думаю).
- MVDenoise слегка быстрее (по крайней мере - должен быть)
- Оптимизировано копирование в фильтре, благодаря функциям копирования AviSynth.
- MVShow может отображать средний SAD компенсации (с использованием showsad = true)

0.9.2.1

- Возвращена функция MVInterpolate.
- MVConvertFPS должна работать и на последних кадрах клипа

0.9.2

- MVInterpolate больше не существует.
- MVBlur и MVConvertFPS улучшены. Они так же обзавелись новыми параметрами, смотрите об этом в документации.
- в MVShow возвращен режим компенсации ( MVShow(cm = true) )

0.9.1 - 12.05.2004

- Первая версия переименованная в MVTools.

0.1-0.6 - Выпущена 24.01.2004 - 01.04.2004 by Manao

- Первые публичные версии MotionVectors (Motion.dll).

`$English Date: 2006/09/17 20:32:46 $
Начальный русский перевод и дополнения 08.07.2005 Turyst04 Turyst04@nextmail.ru
Редакция и дополнения 14.07.2005 Fizick http://bag.hotmail.ru
Подробное введение, добавленные функции 31.10.2005-17.09.2006 Fizick http://avisynth.org.ru`