# MVTools

## Přehled

autor: Manao, Fizick(Aleksandr Balachnin), Tsp, TSchniede
verze: 1.11.4.5
stáhnout: http://avisynth.org.ru/, http://www.avisynth.org/warpenterprises/
kategorie: Různé pluginy
požadavky: YV12 nebo YUY2 Barevné prostředí
licence: GPL

## Obsah

- I) O pluginu MVTools
- II) Popisy funkcí
- III) Příklady
- IV) Odmítnutí záruk (nepřeskakujte tuto část, ale nenutím vás to naučit se)
- V) Revize

## I) O pluginu MVTools

MVTools - plugin pro AviSynth 2.5 je kolekce funkcí pro odhadnutí a kompenzaci pohybu objektů ve video klipech. Kompenzace pohybu může být použita pro silné časové (temporal) odšumění, pokročilé převody snímkových frekvencí, restauraci obrazu a další úlohy.

Plugin obsahuje server-funkci odhadu pohybu MVAnalyse pro nalezení vektorů pohybu a několik klient-funkcí kompenzace pohybu (MVCompensate, MVMask a další) které používají tyto vektory.

Plugin používá metodu srovnávání bloků pro odhad pohybu (podobné metody jsou použity v MPEG2, MPEG4, atd). Ve fázi analýzy plugin rozděluje snímky na malé bloky a snaží se najít pro každý blok v aktuálním snímku nejpodobnější (odpovídající) blok v druhém snímku (předchozím nebo následujícím). Relativní posunutí těchto bloků je vektor pohybu. Hlavním měřítkem podobnosti bloků je součet absolutních rozdílů (SAD) všech pixelů těchto dvou porovnávaných bloků. SAD je hodnota, která říká, jak dobrý byl odhad pohybu.

Výstupem MVAnalyse (server) je speciální klip s informacemi o vektorech pohybu v nějakém formátu.

Ve fázi kompenzace klient-funkce pluginu čtou vektory pohybu a použijí je k vyjmutí bloků a zformování snímku s kompenzovaným pohybem (nebo realizuje nějakou jinou plnou nebo částečnou kompenzaci pohybu nebo funkci interpolace). Každý objekt (blok) v tomto (plně) kompenzovaném snímku je umístěn na stejnou pozici v jaké je v aktuálním snímku. Tedy, můžeme (například) použít silné časové odšumění dokonce pro docela rychle se pohybující objekty bez vytváření nepříjemných artefaktů a duchů (rysy objektu a hrany jsou shodné pokud je kompenzace perfektní). Plugin může vytvořit kompenzované sousední snímky pro každý aktuální snímek, a odstranit v nich šum vnitřní funkcí (MVDenoise). Nebo můžete použít kompenzované a původní snímky k vytvoření prolínaného (interleaved) klipu, odstranit v nich šum jakýmkoliv externím časovým (temporal) filtrem, a vybrat centrální vyčištěné původní snímky pro výstup (viz příklady).

Odhad pohybu a jeho kompenzace nejsou samozřejmě ideální a dokonale přesné. V některých komplikovaných případech (video se stmíváním - fading, ultra-rychlého pohybu, nebo periodických struktur) může být odhad pohybu zcela chybný, a kompenzovaný (obzvláště interpolovaný) snímek může být kostkatý a (nebo) ošklivý. Těžké potíže jsou také kvůli vzájemnému zastínění jednoho objektu druhým nebo obráceně odkrývání. Složité Avisynth skripty s řadou funkcí pro kompenzaci pohybu mohou spotřebovat velký objem paměti a výsledkem je velmi pomalé zpracování. Nejedná se o jednoduchý, ale o docela pokročilý plugin. Používejte ho jen ve vhodných případech a snažte se vyladit jeho parametry. Existuje mnoho diskuzí o použití kompenzace pohybu na doom9 Avisynth fóru. Především se podívejte na starší vlákno MVTools, vlákno true motion, nové vlákno MVTools a některá další. Snažte se číst příspěvky jako doplněk této dokumentace a žádejte zde o pomoc. Pokud se skutečně zajímáte o témata odhadu a kompenzace pohybu, můžete snadno najít řadu vědeckých publikací (použijte WWW vyhedávání).

Poznámky: Plugin je stále ve vývoji. Aktuální verze má některá omezení. Podporováno je jen progresivní YV12, YUY2 video. Použijte převod barevného formátu a zkuste použít (smart) bob-deinterlace pro prokládané video (může také pracovat rozdělení na pole SeparateFields s nebo bez SelectEven/SelectOdd). Některé komplikované skripty (MVBOB, MCBOB) používají MVTools pro odstranění prokládání s kompenzací pohybu.

Alternativně můžete zkusit použít plugin Motion od mg262.

## II) Popisy funkcí

### Běžné parametry

Filtry, které používají vektory pohybu mají běžné parametry. Ty jsou prahovými hodnotami detekce změny scény, a mají znaky mmx / isse. Také používají jeden nebo více vektorových streamů, které jsou vytvářeny funkcí `MVAnalyse`.

int thSCD1 : prahová hodnota, která rozhoduje, zda se blok změnil mezi předchozím snímkem a aktuálním. Když se blok změnil, znamená to, že odhad pohybu pro toto není významný. To nastává například při změně scény. Tedy to je jedna z prahových hodnot použitých k nastavení mechanismu změny scény. Jeho zvětšení sníží počet bloků detekovaných jako změněné. Může to být užitečné pro zašumělé nebo blikající video. Prahová hodnota je porovnána s hodnotou SAD (Sum of Absolute Differences - součet absolutních rozdílů, hodnotou, která říká jak špatný byl odhad pohybu ). Pro přesně identické bloky máme SAD=0. Ale skutečné bloky se vždy liší kvůli složitému pohybu objektů (přiblížení, rotaci, deformaci), diskrétnosti vzorkování pixelů, a šumu. Předpokládejme, že máme dva porovnané bloky 8x8 s každým pixelem lišícím se o 5. V tomto případě bude SAD 8x8x5 = 320 (blok nebude detekován jako změněný pro thSCD1=400). Pokud použijete bloky 4x4, SAD bude 320/4. Pokud použijete bloky 16x16, SAD bude 320*4. Ve skutečnosti se tento parametr násobí vnitřně v MVTools, a vy musíte vždy použít hodnotu redukovanou na velikost bloku 8x8. Výchozí je 400 (od v.1.4.1).

int thSCD2 : prahová hodnota, která nastavuje kolik bloků ve snímku se musí změnit aby se rozhodlo, že se jedná o změnu scény. Je to v rozsahu 0 až 255, 0 znamená 0 %, 255 znamená 100 %. výchozí je 130 ( což znamená 51 % ).

bool isse : znak, který umožňuje vypnout ISSE a MMX optimalizace pokud se nastaví na false (pro odladění). Výchozí je true. Pokud váš procesor nepodporuje ISSE MMX optimalizace, bude to každopádně vypnuto ( a vy nebudete schopni je aktivovat )

### MVAnalyse

`MVAnalyse` (clip, int "blksize", int "blksizeV", int "pel", int "level", int "search", int "searchparam", int "pelsearch", bool "isb", int "lambda", bool "chroma", int "delta", bool "truemotion", int "lsad", int "pnew", int "plevel", bool "global", int "pzero", int "overlap", int "overlapV", string "outfile", int "sharp", int "rfilter", clip "pelclip", int "dct", int "divide", bool "mc", int "idx", int "sadx264")

Odhaduje pohyb metodou srovnávání bloků a vytváří speciální výstupní klip s daty vektorů pohybu (používané dalšími funkcemi).
Jsou implementovány některé hierarchické víceúrovňové metody vyhledávání (od hrubého měřítka obrazu k nejjemnějšímu). Funkce používají nulový vektor a vektory sousedních bloků jako prediktory (předpovědi) pro aktuální blok. Nejdříve je odhadnuta odchylka (SAD) pro prediktory, pak se zkušební vektor (kandidát) změnění o nějakou hodnotu v některém směru, odhaduje se SAD, atd. Přijatý nový vektor je vektor s minimální hodnotou SAD (s nějakou penalizací na soudržnost pohybu).

blksize : Velikot bloku (horizontální). Je buď 4, 8 nebo 16 ( výchozí je 8 ). Větší bloky jsou méně citlivé na šum, jsou rychlejší, ale také méně přesné.

blksizeV : vertikální velikost bloku. Výchozí je rovna horizontální velikosti. Doplňkové možnosti: 4 pro blksize=8 a 8 nebo 2 pro blksize=16.

pel : je přesnost odhadu pohybu. Hodnota může být jen 1, 2 nebo 4. 1 znamená přesnost na pixel. 2 znamená přesnost na půl pixelu, 4 znamená přesnost na čtvrtinu pixelu, tvořenou prostorovou (spatial) interpolací (přesnější ale pomalejší a ne vždy lepší kvůli velkému kroku násobení mezi úrovněmi). Výchozí je 2 od v1.4.10.

level : je počet Nepoužitých hrubých úrovní v hierarchické analýze prováděné při vyhledávání vektorů pohybu. Obvykle čím nižší, tím lepší (lze nalézt vektory s jakoukoliv délkou). Proměnná je zachována pro studijní (testovací) účely. Někdy je level užitečný pro vyloučení velkých (lživých) vektorů (počítačové grafiky, atd). Výchozí : 0 (jsou použity všechny úrovně).

search, searchparam, pelsearch : search určuje typ vyhledávání v každé úrovni, a searchparam je přídavný parametr (krok, rádius) pro toto vyhledávání, a pelsearch je parametr na nejjemnější (pel) úrovni:

- search = 0 : 'jednoprůchodové vyhledávání'. searchparam je krok mezi každými zkoušenými vektory ( pokud searchparam je větší než 1, krok se bude progresivně upřesňovat - postupně zmenšovat ).
- search = 1 : 'N-průchodové'. N je nastaveno parametrem searchparam. Je to nejznámější algoritmus vyhledávání vektorů pohybu.
- search = 2 : Logaritmické vyhledávání, také nazývané Diamantové vyhledávání. searchparam je úvodní krok vyhledávání, a také se postupně zmenšuje. Je to výchozí typ vyhledávání ( s výchozími hodnotami searchparam = 2 a pelsearch = pel )
- search = 3 : Vyčerpávající vyhledávání, searchparam je rádius (čtvercová strana je 2*radius+1). Je pomalý, ale dává nejlepší výsledky podle hodnot SAD.

isb : umožní volit mezi dopředným vyhledáváním (pohyb z předchozího snímku do aktuálního) pro isb=false a zpětným vyhledáváním (pohyb z následujícího snímku do aktuálního) pro isb=true (isb znamená "IS Backward", je to implementováno a nazváno přesně tak jak je zde popsáno, neptejte se na to :-). Výchozí je isb=false.

chroma : nastavení na true umožní zahrnout také barevnost při odhadu pohybu (false - pouze jas). Výchozí je true.

delta : nastavuje interval snímků mezi referenčním snímkem a aktuálním snímkem. Výchozí je 1, což znamená, že vektory pohybu jsou vyhledávány mezi aktuálním snímkem a předchozím ( nebo dalším ) snímkem. Nastavení na 2 vám umožní vyhledávat vektory pohybu mezi snímkem n a n-2 nebo n+2 ( v závislosti na nastavení isb ).

Existuje několik pokročilých parametrů, které nastavují souvislost vektorů pohybu pro odhad takzvaného skutečného pohybu (true motion). Některé porovnané bloky z jiného snímku mohou být nejpodobnější vzorovým blokům aktuálního snímku podle kriteria intenzity (SAD), ale neodpovídají skutečnému pohybu objektu. Například, mohou příslušet jinému podobnému objektu v jiném rohu snímku nebo nějaké periodické struktuře. Parametry "True motion" se snaží udržet pohybová pole více soudržná, namísto některých náhodných distribucí vektorů. Je to obzvlášť důležité pro jednotlivé kompenzace pohybu a interpolace. Některé parametry jsou experimentální a mohou být odstraněny (nahrazeny) v příštích verzích po vyzkoušení. Oznamujte prosím své závěry.

truemotion je přednastavení hodnot těchto parametrů. Umožňuje snadno přepnout výchozí hodnoty všech "true motion" parametrů najednou. Nastavte true pro vyhledávání skutečného pohybu - true motion (vyšší soudržnost vektorů), Nastavte false pro vyhledávání vektorů pohybu s nejlepší SAD. Výchozí je true od v1.4.10. V každém případě můžete nastavit každý parametr samostatně.

lambda : nastavuje soudržnost polí vektorů. Čím vyšší, tím soudržnější. Nicméně, pokud je příliš vysoký, mohou být některé nejlepší vektory pohybu opomenuty. Velmi se doporučují hodnoty kolem 400 - 2000 (pro velikost bloku 8). Vnitřně je to koeficient pro penalizaci (úpravu) SAD od kvadratického rozdílu vektoru od prediktoru (sousedů), násobeným 256.
Výchozí je 0 pro truemotion=false a 1000*blksize*blksizeV/64 pro truemotion=true.

lsad: SAD limit pro použití lambda . Lokální lambda je sníženo (plynule od v1.10.2) pokud hodnota SAD vektoru prediktoru (zhotovená ze sousedních bloků) je větší než tento limit. Brání to použití špatných prediktorů, ale snižuje soudržnost pohybu. Pro skutečný pohyb (true motion) jsou doporučeny hodnoty nad 1000 (pro velikost bloku=8).
Výchozí je 400*blksize*blksizeV/64 pro truemotion=false a 1200*blksize*blksizeV/64 pro truemotion=true.

pnew: relativní penalizace (násobena 256) k odchylce (SAD) nového kandidujícího vektoru. Nový kandidující vektor musí být lepší, aby byl přijat jako nový vektor jen, když jeho SAD s penalizací (SAD + SAD*pnew/256) jen nižší než odchylka prediktoru (staré SAD). To brání nahrazení docela dobrých prediktorů novými vektory s o trochu lepším SAD ale jinou délkou a směrem.
Výchozí je 0 pro truemotion=false a 50 pro truemotion=true.

plevel: režim násobení penalizačního koeficientu lambda úrovně. Hodnota=0 - bez násobení, 1 - lineární, 2 - kvadratická závislost na velikosti hierarchické úrovně. Všimněte si, že délka vektoru je menší na nižší úrovni.
Výchozí je 0 pro truemotion=false a 1 pro truemotion=true

global: odhaduje globální pohyb (v každé úrovni) a používá ho jako doplňkový prediktor. Je odhadován pouze (panoramatický) posun kamery (ne přibližování ani rotace). Použijte false pro vypnutí, použijte true pro zapnutí. Výchozí je false pro truemotion=false a true pro truemotion=true.

pzero: relativní penalizace (násobena 256) k odchylce (SAD) pro nulový (a globální) vektor. Brání nahrazení docela dobrých prediktorů nulovými vektory s o trochu lepší SAD (lambda se pro nulové a globální vektory nepoužívá). Výchozí je roven pnew od v1.11.

overlap: hodnota překrytí bloků (horizontální). Musí být sudá a menší než velikost bloku (do blksize/2 pro MVCompensate). Krok mezi bloky pro odhad pohybu je roven (blksize-overlap). N bloků pokrývá velikost ((blksize-overlap)*N + overlap) na snímku. Zkuste použít hodnotu překrytí od blksize/4 do blksize/2. Čím větší překrytí, tím větší počet bloků, a tím menší rychlost zpracování. Výchozí hodnota je 0.
Funkce s podporou překrytí jsou: MVFlow, MVFlowInter, MVFlowFps (ne MVFlowFps2), MVShow, MVMask, MVCompensate, MVDeGrain1, MVDeGrain2, MVDeGrain3.

overlapv: vertikální hodnota překrytí bloků. Výchozí je rovna horizontální. Musí být sudá pro YV12 a menší než velikost bloku.

outfile: Jméno souboru pro zápis dat vektorů pohybu. Tato data mohou být použita některým externím programem nebo mohou být dalšími verzemi MVTools pro kódování druhého průchodu, atd.
Vytvářený binární soubor má hlavičku (struktura MVAnalysisData, viz MVInterface.h ve zdrojovém kódu), a sekvenci dat:
číslo snímku, data vektoru (Vx, Vy, SAD) každého bloku, příští platné číslo snímku, data vektoru tohoto snímku, atd.
Výchozí - Prázdný řetězec, nezapisuje soubor.

sharp: metoda interpolace subpixelu pro pel=2,4.
Použijte 0 pro měkkou interpolaci (bilineární), 1 pro bikubickou interpolaci (4 tap Catmull-Rom), 2 pro ostrou interpolaci Wiener (6 tap, podobná Lanczos).
Výchozí je 2.

rfilter: metoda snížení hierarchických úrovní. Použijte 0 pro jednoduchý součet 4 pixelů (průměrování, jako BilinearResize, stará metoda), použijte 1 pro filtr 1/4, 1/2, 1/4 (jako ReduceBy2) pro hladší odhad pohybu.
Výchozí je 1 (od v1.11.0.2).

pelclip: nadvzorkovaný zdrojový klip pro použití namísto vnitřní subpixelové interpolace (pro pel>1).
Pixely v řádcích a sloupcích dělitelné pel (0,2,4,... pro pel=2) musí být původní zdrojové pixely, ostatní pixely musí být interpolovány.
Příklad pro pel=2: `LanczosResize(width*2,height*2,src_left=0.25, src_top=0.25)`. (Nedávná poznámka: je to správné pro jas, ale ne přesně to odpovídá pozicím pixelů barevnosti vnitřní interpolace v MVTools. Přesto vektory a kompenzace pohybu jsou pro obvyklé klipy docela podobné, stejná barevnost by byla s src_left=0.5 pro YUY2 a dodatečně src_top=0.5 pro YV12).
Další užitečný příklad je EEDI2 hranově-namířený resampler.
Pro správné výsledky musíte použít (stejný) pelclip pro celý řtezec funkcí MVTools které používají stejný zdrojový klip (a idx).
Výchozí není definována.

dct: použití bloků DCT (frekvenční spektrum) pro výpočet rozdílu bloků (SAD). Zvláště může zlepšit odhad vektoru pohybu při blikání a stmívání jasu.
0 - obvyklé prostorové (spatial) bloky, nepoužívat DCT;
1 - použít bloky DCT místo prostorových dat (pomalé pro velikost bloku 8x8 a velmi pomalé pro jiné velikosti);
2 - smíchaná prostorová a DCT data; váha závisí na středním rozdílu jasu;
3 - adaptivní přepínání po blocích z prostorového na ekvivalentní-vážený smíšený režim (experimentální, o něco rychlejší).
4 - adaptivní přepínání po blocích z prostorového na smíšený režim s větší váhou DCT (experimentální, o něco rychlejší).
přidané režimy ve v1.9.5.3: (vyžadují sadx264 0-7, používají nejrychlejší SATD funkce, pouze jas!)
5 - SATD místo SAD pro jas
6 - stejné jako 2 jen používají SATD
7 - stejné jako 3 jen používají SATD
8 - stejné jako 4 jen používají SATD
9 - podobné jako 2, používají SATD a vážené rozsahy od SAD jen k ekvivalentním SAD & SATD
10 - podobné jako 3/4,používají SATD váha je na SAD, jen na velké změny jasu
Výchozí = 0.

divide: post-processing vektorů pohybu rozdělením každého bloku na 4 podbloky.
0 - nedělit;
1 - rozdělit bloky a připsat originální vektor všem 4 podblokům;
2 - rozdělit bloky a připsat střední (se 2 sousedními) vektory podblokům;
Výchozí je = 0. Hodnoty velikosti bloku překrytí musí být zvoleny, aby byly přijatelné po vnitřním dělení.

mc: dodatečně zachovat pohybově kompenzované snímky ve vektorovém klipu (použije se v MVDenoise). Výchozí je false (neuchovává se pro šetření paměti) od v1.11.4.

idx: index klipu. Umožňuje vnitřní znovupoužití (sdílení) víceúrovňových dat vypočtených pro snímky klipu několika instancemi filtru (nebo jinými funkcemi) pro rychlejší zpracování a snížení využití paměti. Je obzvlášť užitečný pro pel=2 k zabránění provádění výpočtů interpolace podruhé, při provádění dopředného & zpětného vyhledávání ve stejném klipu. Pokud používáte idx, měli by jste vždy použít kladné hodnoty, a měli by jste použít jen stejnou hodnotu filtrů které pracují ve stejném klipu (jinak by analýza nepracovala správně). Ve výchozím stavu je každé instanci filtru dáno jedinečné záporné číslo (které vytvoří svá vlastní víceúrovňová data).

sadx264: využívá SAD funkcí z kodeku x264 pokud jsou dostupné pro velikost bloku
0 - Autodetekovat CPU a vybrat nejlepší funkce
1 - použít MMX 16x16, 16x8, 8x8, 8x4, 4x4 (8x16, 4x8 použito jen na barevnost - chroma)
2 - použít MMX 16x16, 16x8, 8x8, 8x4 (8x16, použito jen na barevnost - chroma) zarovnáno na 32 bajtové bloky
3 - použít MMX 16x16, 16x8, 8x8, 8x4 (8x16, použito jen na barevnost - chroma) zarovnáno na 64 bajtové bloky, nejlepší pro Pentium M
4 - použít SSE2 16x16, 16x8 (žádné zvláštní zarovnání)
5 - použít SSE2 16x16, 16x8, zarovnáno na 64 bajtové bloky (dobrá volba pro Core)
6 - použít SSE3 16x16, 16x8 (zdá se, že rychleji pracuje jen na Pentium 4E & Core1)
7 - použít SSSES3 16x16, 16x8, zarovnáno na 64 bajtové bloky (dobrá volba pro Core2)
Režimy 8-12 jsou určeny jen pro ladění a testování - použijte místo nich dct >4.
Použití sadx264 > 7 znamená: použít vybraný místo SAD pro jakoukoliv jasové/barevnostní (luma/chroma) SAD kde je to možné!
pro SAD / SATD mix a pouze luma použijte dct
8 - použít SSD mmx, pracuje podobně jako 1
9 - použít SATD mmx, pracuje podobně jako 1
10 - použít SATD SSE2, pracuje podobně jako 2
11 - použít SATD SSSE3, pracuje podobně jako 2
12 - použít SATD SSSE3 s PHADD na 8xY, pracuje podobně jako 2
Výchozí je 0, použijte -1 nebo >=13 pro použití starého algoritmy v1.9.4 SAD a úplnou deaktivaci x264 SAD funkcí.

Zkuste použít funkci `MVShow` pro kontrolu odhadnutých polí pohybu a vyladění parametrů.

Poznámka: MVAnalyse (pokud Pel=2) detekuje znak videa založeného na polích (po SeparateFields) a automaticky dělá opravu vektorů pohybu v souladu s vertikálním posunem polí s různou paritou. Zkuste použít AssumeFrameBased pokud to nepotřebujete.

### MVCompensate

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

Provádí plnou kompenzaci pohybu ve snímku. To znamená, že bloky ukázané pomocí vektorů pohybu v referenčním snímku budou posunuty podle vektorů k dosažení jejich umístění v aktuálním snímku.

scbehavior ( výchozí je true ), rozhoduje, který snímek bude zachován při změně scény. Je-li true, snímek je ponechán nezměněný. Jinak je do aktuálního snímku zkopírován referenční snímek.

mode může být buď 0 nebo 1 (výchozí). Mode=0 dříve znamenal použití kompenzace prováděné při vyhledávání vektorů. Nyní je to prováděno v režimu mode=1. Mode=1 znamená, že přepočítává kompenzaci z dat vektorů ( protože můžete chtít použít vektory na jiný klip než ten ve kterém vyhledáváte ). Starý režim mode=2 je nyní vypnutý.

thSAD je prahová hodnota SAD pro bezpečnou (dummy) kompenzaci. Pokud je blok SAD nad thSAD, pak je blok špatný, a my použijeme zdrojový blok místo kompenzovaného bloku. Výchozí je 10000 (prakticky vypnuto).

fields: je-li nastaven na true a pel=2, pak přidáváme vhodná vertikální posunutí (po půlpixelu) polí pro video založené na polích. Zkuste to použít pro odstranění prokládání (ne pro odšumění).
Výchozí je false.

pelclip: nadvzorkovaný zdrojový klip pro použití místo interní subpixelové interpolace (stejné v MVAnalyse).
Výchozí není definováno.

idx pracuje stejným způsobem jako idx v MVAnalyse.

Zpracování překrytých bloků je implementováno jako okenní sumarizace bloků (jako FFT3DFilter, hodnota překrytí do blksize/2) pro snížení blocking artefaktů (kostkatění).

### MVDenoise

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

Provádí časové (temporal) odšumění s kompenzací pohybu z několika klipů vektorů mvs. Referenční snímky jsou pohybově kompenzovány a pak sloučeny s aktuálním snímkem.

První prahová hodnota, thT, rozhoduje zda pixel, který přichází z předchozího nebo následujícího snímku má být zahrnut do procesu výpočtu. Pokud se tento pixel liší více než thT od pixelu v aktuálním snímku, není použit.

Druhá thSAD, rozhoduje zda blok má být změněn nebo ne ( stejný princip jako thSCD1 ). Jestliže se blok změnil, pixely nejsou sloučeny s pixely z předchozího nebo následujícího snímku.

thMV je délka vektoru, nad kterou není blok použit pro odšumění.

Nakonec, Y, U a V říkají na kterých plochách by se mělo odšumovat.

Výchozí : Y, U a V jsou true, thT = 10, thSAD = 200 a thMV=30.

Funkce je zastaralá. Zpracování překrytých bloků je implementováno jako jednoduché sekvenční pokrytí bloky zleva doprava, shora dolů. Funkce používá data kompenzace pohybu uložené v klipech vektorů.

### MVMask

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

Vytváří klip masek z dat vektorů pohybu. Maska je definována daty bloků, ale je interpolovaná, aby zapadla na celou velikost snímku. Maska je vytvořena jak na jasové (luma) tak na barevnostních (chroma) plochách. Hodnoty masky mohou být od 0 (min) do 255 (max).

kind parametr definuje druh masky.

Režim kind=0 vytváří masku pohybu z délek vektorů pohybu. Vytváří lepší masku než MotionMask ( MaskTools ) protože vektory pohybu jsou mnohem víc věrohodné než algoritmus MotionMask. Hodnota masky 0 znamená nikde žádný pohyb ( délka vektorů pohybu je nulová ). Čím větší délka vektoru, tím větší hodnota masky (nasycené do 255), měřítko je definováno pomocí ml.

kind=1 umožní vytvořit masku hodnot SAD (součet absolutních rozdílů) místo délek vektorů. Může to být užitečné k nalezení problémových oblastí se špatným odhadem pohybu. (Je použit vnitřní faktor blocksize*blocksize/4 pro normalizaci měřítka ml.)

kind=2 umožňuje vytvořit okluzní masku (špatné bloky v důsledku roztržení, napětí). V současnosti se používá nějaký normalizovaný součet kladných rozdílů pohybu bloků. Může to být násobeno pomocí měřítka ml.

kind=3 umožňuje vytvořit masku horizontální komponenty vektoru pohybu v jednotkách pel plus 128. Násobené koeficienty se nepoužívají.

kind=4 umožňuje vytvořit masku vertikální komponenty vektoru pohybu v jednotkách pel plus 128. Násobené koeficienty se nepoužívají.

kind=5 - barevná mapa pohybu jako x,y komponent vektorů pohybu zobrazených v U, V barevných plochách (v jednotkách pel plus 128, násobené koeficienty se nepoužívají).

ml definuje měřítko masky pohybu. Když délka vektoru (nebo hodnota jiného typu) je vyšší nebo rovna ml, bude výstupní hodnota nasycena do 255. Menší hodnoty vedou k menším výstupům.

gamma je použito pro definování ukazatele závislosti výstupu na vstupu. gamma = 1.0 znamená lineární závislost, zatímco gamma = 2.0 dává kvadratickou závislost.

A nakonec, Ysc je hodnota vzatá maskou při změně scény

Výchozí jsou: kind = 0, ml = 100, gamma = 1.0, a Ysc = 0.

### MVSCDetection

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

Vytváří masku detekce scény z dat vektorů pohybu. Maska je vytvořena jak na jasové (luma) tak i na barevnostních (chroma) plochách. Výstup beze změny scény je 0.

Ysc je hodnota braná maskou při změně scény, výchozí je 255.

### MVShow

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

Zobrazuje vektory pohybu.

scale umožňuje zvětšit vektory pohybu, například za účelem zvýšení přesnosti ( když je pel > 1 a scale = 1, neuvidíte odchylky menší než jeden pixel ).

sil umožní vidět různé úrovně analýzy ( když se při vyhledávání vektorů pohybu provádí hierarchická analýza, a může to být zajímavé pro pozorování co se děje ve vyšších úrovních ).

tol je prahová hodnota tolerance. Pokud deformace vyvolaná vektorem pohybu větším než tol, vektor není zobrazen.

Nakonec, showsad umožní zobrazit střední SAD po kompenzaci obrazu.

Výchozí jsou : scale = 1, sil = 0, tol = 20000 a showsad = false ( což zobrazí všechny vektory ).

### MVChangeCompensate

`MVChangeCompensate` (clip vectors, clip)

Umožní měnit kompenzaci uloženou do mvs streamu (streamu vektorů pohybu).

### MVIncrease

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

Umožňuje použít vektory vypočítané pro zmenšenou verzi klipu aby byly použity pro provedení kompenzace v klipu s původní velikostí.

horizontal je horizontální poměr mezi šířkou klipu a šířkou zmenšeného klipu.

vertical je vertikální poměr mezi výškou klipu a výškou zmenšeného klipu.

idx pracuje stejně jako v `MVAnalyse`

### MVDepan

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

Dostává vektory pohybu, odhaduje globální pohyb a vkládá data do výstupního snímku ve zvláštním formátu pro plugin `DePan` (od Fizick).

Globální pohyb uvnitř snímku (panoramování, zoom, rotace) je odhadnut iterativní procedurou, za použití pouze dobrých bloků.

Odmítnuté bloky: 1) poblíž okrajů snímků; 2) s velkým SAD (podle parametru thSCD1 ); 3) s pohybem lišícím se od sousedů nebo globálu.

Parametry zoom a rot přepínají odhad zoom (přiblížení, vzdálení)) a rotaci, pixaspect je protažení pixelu (1.094 pro standardní PAL, 0.911 pro standardní NTSC), error je maximální střední odchylka pohybu.

Vyhodnocený globální pohyb ve snímku se přepne na nulu pro velké chyby pohybu nebo při změně scény (podle parametrů thSCD1, thSCD2 ).

parametr info umožňuje zapsat informace o globálním pohybu pro ladění.

parametr log umožňuje nastavit jméno log souboru ve formátu DeShaker, Depan.

parametr wrong definuje limit pro vypnutí bloků velmi odlišných od sousedních.

parametr zerow definuje váhu nulových vektorů pohybu (pro snížení jejich vlivu).

range - počet předchozích (a také následujících) snímků (polí) v blízkosti žádaného snímku pro odhad jejich pohybu.

Výchozí jsou : zoom = true, rot = true, pixaspect = 1.0, error = 15.0, info = false, wrong=10, zerow=0.05, range=0.

Pro odhad globálního pohybu prokládaného zdroje musíte rozdělit pole (jak pro MVAnalyse tak pro MVDepan).

### MVFlow

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

Provádí kompenzaci pohybu ve snímku ne po blocích (jako MVCompensation), ale po pixelech. Vektor pohybu pro každý pixel je vypočítán bilineární interpolací vektorů pohybu aktuálních a sousedních bloků (v souladu s pozicí pixelu). To znamená, že pixely ukázané vektorem v referenčním snímku budou posunuty (flow - proudí) podle vektorů pro dosažení jejich umístění v aktuálním snímku. Tato flow motion (proudící) kompenzační metoda neprodukuje žádné blokové artefakty, a je dobrá pro odšumění, ale občas může vytvářet velmi zvláštně deformované obrazy :). Pro tuto funkci se důrazně doporučuje skutečný odhad pohybu (true motion). Kompenzace pohybu může být úplná nebo částečná (v mezičase).
Omezení: vektory s komponentami nad 127 budou resetovány na nulovou délku.

time: procento kompenzace pohybu (výchozí=100.0, úplná kompenzace), definuje časový moment mezi referenčním a aktuálním snímkem.

mode může být buď 0 ( výchozí ), nebo 1.
mode=0 - přinést pixely na každé místo cílového snímku. Je to hlavní produkční režim.
mode=1 - posunout pixely z každého místa zdroje (reference). Je to ladící (učební) režim s nějakými prázdnými místy (s nulovou intensitou). Může být použit pro vytvoření masky okluzí.

fields: je-li nastaven na true a pel=2, pak přidáváme vhodná vertikální posunutí (po půlpixelu) polí pro video založené na polích. Zkuste ho použít pro odstranění prokládání (ne pro odšumění).
Výchozí je false.

pelclip: nadvzorkovaný zdrojový klip pro použití místo interní subpixelové interpolace (stejné v MVAnalyse).
Výchozí není definováno.

idx (možná) pracuje stejným způsobem jako idx v MVAnalyse.

### MVFlowInter

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

Funkce interpolace pohybu. Není stejná (ale podobná) jako funkce MVInterpolate strších verzí MVTools. Používá zpětných "mvbw" a dopředných "mvfw" vektorů pohybu pro vytvoření obrazu v nějakém mezičase mezi aktuálním a následujícím (podle delta) snímkem. Používá pixelovou (podle metody MVFlow) kompenzaci pohybu z obou snímků. Vnitřní zpětné a dopředné masky okluze (metoda MVMask kind=2) a časově vážené součinitele jsou použity pro vytvoření výstupního obrazu s minimálními artefakty. Pro tuto funkci se důrazně doporučuje skutečný odhad pohybu (true motion).

time: pozice interpolačního času mezi snímky (v procentech, výchozí=50.0, poloviční způsob)

mL: násobící parametr masky. Nižší hodnoty odpovídají silnějším maskám okluzí (jako ve funkci MVMask, použijte ho pro vyladění a odstranění chyb). Výchozí=100.

pelclip: nadvzorkovaný zdrojový klip pro použití místo interní subpixelové interpolace (stejné v MVAnalyse).
Výchozí není definováno.

idx (možná) pracuje stejným způsobem jako idx v MVAnalyse pro zvýšení rychlosti.

### MVFlowFps

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

Změní frekvenci snímků (fps) klipu (a počet snímků). Funkce může být použita pro převod frekvence snímků, efekt pomalého pohybu, atd. Používá zpětných "mvbw" a dopředných "mvfw" vektorů pohybu pro vytvoření obrazu v nějakém mezičase mezi snímky. Používá pixelovou kompenzaci pohybu (jako MVFlow, MVFlowInter). Vnitřní zpětné a dopředné masky okluze (metoda MVMask kind=2) a časově vážené součinitele jsou použity pro vytvoření výstupního obrazu s minimálními artefakty. Pro tuto funkci se důrazně doporučuje skutečný odhad pohybu (true motion).

num: čitatel fps výstupního klipu. Výchozí=25.

den: jmenovatel fps (výchozí=1). Výsledná fps = num/den. Především pro dvojnásobnou NTSC fps=2*29.97 použijte num=60000 a den=1001, a pro dvojnásobnou NTSC FILM fps=2*23.976 použijte num=48000 a den=1001. Když num nebo den je rovno 0, pak je pro výstup brána dvojnásobná fps vstupního klipu (od v1.8.1).

mask: režim masky zpracování:
mask=0 jsou jednoduché zpětné a dopředné masky okluze (použité ve verzích do 1.4.x, nejrychlejší);
mask=1 je podobná maska s dodatečným přepínáním na statické nulové vektory v okluzních oblastech (podobné do v1.5.x);
mask=2 je pro použití zvláštních vektorů ze sousedních snímků pro snížení halo efektu u objektů v okluzních oblastech (v1.8, nejpomalejší). Výchozí=2.

ml: parametr měřítka masky. Větší hodnoty odpovídají slabší masce okluze (jako ve funkci MVMask, použijte ho pro vyladění a odstranění chyb). Výchozí=100.

pelclip: nadvzorkovaný zdrojový klip pro použití místo interní subpixelové interpolace (stejné v MVAnalyse).
Výchozí není definováno.

idx (možná) pracuje stejným způsobem jako idx v MVAnalyse pro zvýšení rychlosti.

### MVFlowFps2

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

Změní frekvenci snímků (fps) klipu (a počet snímků) jako MVFlowFps, ale s trochu lepší kvalitou (a pomalejším zpracováním) s vnějším překrýváním bloků.
(Poznámky: MVFlowFps má nyní efektivnější vnitřní překrývání bloků, a MVFlowFps2 je zastaralý. MVFlowFps2 nepracuje správně s překrýváním v MVAnalyse).
Navíc ke zpětnými "mvbw" a dopřednými "mvfw" vektory pohybu původního zdrojového klipu, funkce MVFlowFps2 používá zpětné "mvbw2" a dopředné "mvfw2" vektory pohybu druhého (upraveného) zdrojového klipu. Druhý klip musí být vytvořen z původního zdrojového klipu oříznutím (t.j. diagonálním posunem) o půl velikosti bloku. Musí to být provedeno příkazem `Crop(a,a,-b,-b)`, kde a=b=4 musí být použito pro blksize=8, a=b=8 pro blksize=16, a a=2, b=6 pro blksize=4 (viz příklad). Okraje bloků budou v různých částech objektů. MVFlowFps2 obrací posun vnitřně a průměruje vektory pohybu z těchto dvou zdrojů pro snížení chyb odhadu pohybu. Funkce používá pixelovou kompenzaci pohybu (jako MVFlow, MVFlowInter). Vnitřní zpětné a dopředné masky okluze (metoda MVMask kind=2) a časově vážené součinitele jsou použity pro vytvoření výstupního obrazu s minimálními artefakty. Pro tuto funkci se důrazně doporučuje skutečný odhad pohybu (true motion).

num: čitatel fps výstupního klipu. Výchozí=25.

den: jmenovatel fps (výchozí=1). Výsledná fps = num/den. Především pro dvojnásobnou NTSC fps=2*29.97 použijte num=60000 a den=1001, a pro dvojnásobnou NTSC FILM fps=2*23.976 použijte num=48000 a den=1001. Když num nebo den je rovno 0, pak je pro výstup brána dvojnásobná fps vstupního klipu (od v1.8).

mask: režim masky zpracování:
mask=0 jsou jednoduché zpětné a dopředné masky okluze (použité ve verzích do 1.4.x, nejrychlejší);
mask=1 je podobná maska s dodatečným přepínáním na statické nulové vektory v okluzních oblastech (podobné do v1.5.x);
mask=2 je pro použití zvláštních vektorů ze sousedních snímků pro snížení halo efektu u objektů v okluzních oblastech (v1.8, nejpomalejší). Výchozí=2.

ml: parametr měřítka masky. Větší hodnoty odpovídají slabší masce okluze (jako ve funkci MVMask, použijte ho pro vyladění a odstranění chyb). Výchozí=100.

pelclip: nadvzorkovaný zdrojový klip pro použití místo interní subpixelové interpolace (stejné v MVAnalyse).
Výchozí není definováno.

idx (možná) pracuje stejným způsobem jako idx v MVAnalyse pro zvýšení rychlosti.

idx2 je index MVAnalyse druhého (posunutého) klipu (nesmí se shodovat s prvním idx).

### MVBlockFps

`MVBlockFps` (clip, clip "mvbw", clip "mvfw", int "num", int "den", int "mode", float "thres", int "idx")

Funkce používá částečnou kompenzaci pohybu založenou na blocích ke změně frekvence snímků (fps) klipu (a počtu snímků). Používá zpětné "mvbw" a dopředné "mvfw" vektory pohybu pro vytvoření interpolovaných obrazů v nějakém mezičase mezi snímky. Pro vytvoření výstupního obrazu se používají některé vnitřní zpětné a dopředné masky a časově vážené součinitele. (Algoritmus je založen na funkci MVInter starých MVTools v1.9.12.) Je to rychlejší než MVFlowFps , ale může vytvářet kostkatění a jiné artefakty. Pro tuto funkci se důrazně doporučuje skutečný odhad pohybu (true motion).

num: čitatel fps výstupního klipu. Výchozí=25.

den: jmenovatel fps (výchozí=1). Výsledná fps = num/den. Především pro dvojnásobnou NTSC fps=2*29.97 použijte num=60000 a den=1001, a pro dvojnásobnou NTSC FILM fps=2*23.976 použijte num=48000 a den=1001. Když num nebo den je rovno 0, pak je pro výstup brána dvojnásobná fps vstupního klipu.

mode: režim zpracování:
0 - průměr dopředné a zpětné částečné kompenzace pohybu (nejrychlejší, výchozí).
1 - statický střed.
2 - dynamický střed.
3 - časově vážená kombinace přenesených dopředných bloků maskovaných posunutými zpětnými a přenesených zpětných maskovaných posunutými dopřednými.
4 - režim 3 smíchaný s jednoduchým statickým časovým průměrem podle masky okluze posunutých bloků.
5 - maska okluze (pro ladění).

thres: prahová hodnota množství okluzí na blok pro binarizaci masky. Výchozí=0, což je vnitřně = blksize*blksizeV/4.

idx (možná) pracuje stejným způsobem jako idx v MVAnalyse pro zvýšení rychlosti.

### MVFlowBlur

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

Experimentální jednoduchá funkce rozmazání pohybu. Může být použita pro FILM-efekt (simulaci konce otevření závěrky kamery). Používá zpětné "mvbw" a dopředné "mvfw" vektory pohybu pro vytvoření a překrytí mnoha kopií částečně kompenzovaných pixelů v mezičase v nějakém intervalu rozmazání (blurring) kolem aktuálního snímku. Používá pixelovou kompenzaci pohybu (jako MVFlow). Pro tuto funkci se důrazně doporučuje skutečný odhad pohybu (true motion).

blur: časový interval rozmazání (blur) mezi snímky, čas otevření závěrky (v procentech, výchozí=50.0)

prec: přesnost rozmazání v jednotkách pixelů. Maximální krok mezi kompenzovanými rozmazanými pixely. Výchozí =1 (nejpřesnější).

pelclip: nadvzorkovaný zdrojový klip pro použití místo interní subpixelové interpolace (stejné v MVAnalyse).
Výchozí není definováno.

idx (možná) pracuje stejným způsobem jako idx v MVAnalyse pro zvýšení rychlosti.

### MVDeGrain1, MVDeGrain2 a MVDegrain3

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

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

`MVDeGrain3` (clip, clip "mvbw", clip "mvfw", clip "mvbw2", clip "mvfw2", clip "mvbw3", clip "mvfw3",int "thSAD", int "thSADC", int "plane", int "limit", clip "pelclip", int "idx")

Provádí časové (temporal) odšumění s kompenzací pohybu. Bloky předchozích a následujících snímků jsou pohybově kompenzovány a pak zprůměrovány s aktuálním snímkem s váženými součinitely závislými na rozdílech bloků od aktuálního (SAD). Funkce podporují režim překrývání bloků.

Zpracování překrývajících se bloků je implementována jako okenní sumarizace bloků (jako FFT3DFilter, hodnoty překrytí do blksize/2) pro snížení artefaktů kostkatění.

MVDeGrain1 má časový (temporal) rádius 1 (používá vektory předchozího mvfw a následujícího mvbw snímku).

MVDeGrain2 má časový (temporal) rádius 2 (používá vektory dvou předchozích mvfw2, mvfw a dvou následujících mvbw,mvbw2 snímků). MVDeGrain3 má časový (temporal) rádius 3 (používá vektory tří předchozích mvfw3, mvfw2, mvfw a tří následujících mvbw, mvbw2, mvbw3 snímků). Je to pomalejší, ale produkuje trochu lepší výsledky (silnější odšumění).

parametr "thSAD" definuje měkkou prahovou hodnotu součtu absolutních rozdílů bloku. Blok se SAD nad prahovou hodnotou thSAD má nulovou váhu při průměrování (odšumění). Blok s nízkou hodnotou SAD má největší váhu. Musíte zadat hodnotu thSAD redukovanou na velikost bloku 8x8. Nízké hodnoty mohou vést k šachovnicovému odšumění, velké hodnoty mohou vést k duchům a artefaktům.
Výchozí thSAD=400.

"thSADC" je prahová hodnota pro plochy barevnosti (chroma).
Výchozí (není-li zadána) : thSADC=thSAD. Pokud je zadána pak thSADCje použito pro barevnost a thSAD je použito pro jas (luma).

parametr plane nastavuje zpracovanou barevnou plochu:
0 - jas, 1 - barevnost U, 2 - barevnost V, 3 - obě barevné roviny, 4 - vše. Výchozí je 4.

limit: maximální změna pixelu (jako plugin DeGrainMedian pro zabránění některým artefaktům). Výchozí je 255 (bez omezení).

pelclip: nadvzorkovaný zdrojový klip pro použití místo interní subpixelové interpolace (stejné v MVAnalyse).
Výchozí není definováno.

idx (možná) pracuje stejným způsobem jako idx v MVAnalyse pro zvýšení rychlosti.

### MVRecalculate

`MVRecalculate` (clip, clip vectors, int "thSAD", int "blksize", int "blksizeV", int "search", int "searchparam", int "lambda", bool "chroma", bool "truemotion", int "pnew", int "overlap", int "overlapV", string "outfile", int "sharp", clip "pelclip", int "dct", int "divide", bool "mc", int "idx", int "sadx264")

Upřesňuje a přepočítává dříve odhadnutá (z MVAnalyse) data vektorů pohybu vectors pro jiný klip clip nebo nastavení nových parametrů (např. menší velikost bloku), po dělení, atd. Tato dvou fázová metoda může být také užitečná pro stabilnější (robustnější) odhad pohybu. Upřesnění se provádí jen na nejjemnější hierarchické úrovni. Interpolované vektory starých bloků jsou použity jako prediktory pro nové vektory, s přepočtem SAD. Jen nové vektory špatné kvality se SAD vyšší než prahová hodnota thSAD budou znovu odhadnuty vyhledáváním. Zadávejte hodnotu thSAD redukovanou (násobenou) na velikost bloku 8x8. Výchozí thSAD=200. Dobré vektory jsou nezměněny, ale jejich SAD bude aktualizováno (přepočítáno).

Další parametry mají stejný význam jako v MVAnalyse (ale můžete použít jiné hodnoty). Použijte jiné hodnoty idx pokud se klip nebo bloky liší.

## III) Příklady

Ve všech příkladech předpokládáme, že už je ve skriptu definovaný nějaký zdrojový klip source:

    source = AVISource("c:\test.avi") # nebo MPEG2Source, DirectShowSource, nějaký předchozí filtr, atd.

Zobrazení vektorů pohybu ( dopředných ) :

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

Zobrazení zpětných vektorů :

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

Použití MVMask :

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

Odšumnění :

    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)
    source.MVDenoise(backward_vec2,backward_vec1,forward_vec1,forward_vec2,tht=10,thSAD=300)

Deblokování kompenzace uložené v mvs streamu (streamu vektorů pohybu)

    vectors = source.MVAnalyse(isb = false, lambda = 1000)
    compensation = source.MVCompensate(vectors, mode = 0)
    compensation = compensation.Deblock() # použití funkce DeBlock
    vectors = vectors.MVChangeCompensate(compensation)

Odšumění s pel = 2, efektivní :

    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)
    source.MVDenoise(backward_vec2,backward_vec1,forward_vec1,forward_vec2,tht=10,thSAD=300)

Použití MVIncrease :

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

Použití MVDepan s pluginem Depan pro prokládaný zdroj (příklad funkce DepanStabilize):

    source = source.AssumeTFF().SeparateFields() # nastavení správného pořadí polí
    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()

Rozmazání problémových (kostkatých) oblastí kompenzovaných snímků s maskou okluze:

    vectors = source.MVAnalyse(isb = false, lambda = 1000)
    compensation = source.MVCompensate(vectors) # nebo zde použijte funkci MVFlow
    # připravíme rozmazaný snímek s nějakou silnou funkcí rozmazání nebo deblokování:
    blurred = compensation.DeBlock(quant=51) # použijeme zde funkci DeBlock
    badmask = source.MVMask(vectors, kind = 2, ml=50)
    overlay(compensation,blurred,mask=badmask) # nebo použijeme rychlejší funkci MaskedMerge z MaskTools

Nové vytvoření špatných snímků interpolací pomocí 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)
    # Předpokládejme, že špatné snímky jsou 50 a 60
    source.trim(0,49) ++ inter.trim(49,-1) \
     ++ source.trim(51,59) ++ inter.trim(59,-1) ++ source.trim(61,0)

Změna fps pomocí MVFlowFps:

    # Předpokládáme progresivní zdroj PAL 25 fps
    backward_vec = source.MVAnalyse(isb = true, truemotion=true, pel=2, idx=1)
    # použijeme explicitní idx pro rychlejší zpracování
    forward_vec = source.MVAnalyse(isb = false, truemotion=true, pel=2, idx=1)
    source.MVFlowFps(backward_vec, forward_vec, num=50, den=1, ml=100, idx=1) # získáme 50 fps

Zdvojnásobení fps pomocí MVFlowFps pro nejrychlejší (téměř) k přehrávání v reálném čase:

    # Předpokládáme progresivní zdroj PAL 25 fps nebo NTSC Film 23.976
    backward_vec = source.MVAnalyse(blksize=16, isb = true, chroma=false, pel=1, searchparam=1, idx=1)
    # použijeme explicitní idx pro rychlejší zpracování
    forward_vec = source.MVAnalyse(blksize=16, isb = false, chroma=false, pel=1, searchparam=1, idx=1)
    source.MVFlowFps(backward_vec, forward_vec, num=2*FramerateNumerator(source), \
       den=FramerateDenominator(source), mask=0, idx=1)

Zdvojnásobení fps pomocí MVFlowFps pro 'nejlepší' výsledky (ale pomalejší zpracování):

    # Předpokládáme progresivní zdroj PAL 25 fps nebo NTSC Film 23.976
    backward_vec = source.MVAnalyse(overlap=4, isb = true, pel=2, search=3, idx=1)
    # použijeme překrývání bloků, přesnost na půl pixelu a Vyčerpávající vyhledávání
    forward_vec = source.MVAnalyse(overlap=4, isb = false, pel=2, search=3, idx=1)
    source.MVFlowFps(backward_vec, forward_vec, num=2*FramerateNumerator(source), \
       den=FramerateDenominator(source), idx=1)

Změna fps pomocí MVFlowFps2:

    # Předpokládáme progresivní zdroj PAL 25 fps. Zkusme ho převést na 50.
    backward_vec = source.MVAnalyse(isb = true, truemotion=true, pel=2, idx=1, search=3)
    # použijeme explicitní idx pro rychlejší zpracování a použijeme úplné vyhledávání
    forward_vec = source.MVAnalyse(isb = false, truemotion=true, pel=2, idx=1, search=3)
    cropped = source.crop(4,4,-4,-4) # o polovinu velikosti bloku 8
    backward_vec2 = cropped.MVAnalyse(isb = true, truemotion=true, pel=2, idx=2, search=3)
    forward_vec2 = cropped.MVAnalyse(isb = false, truemotion=true, pel=2, idx=2, search=3)
    source.MVFlowFps2(backward_vec,forward_vec,backward_vec2,forward_vec2,num=50,idx=1,idx2=2)

Generování pěkného rozmazání pohybu pomocí MVFlowBlur:

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

Odšumění pomocí nějakého externího filtru pro odstranění šumu (který používá 3 snímky: předchozí, aktuální, následující):

    backward_vectors = source.MVAnalyse(isb = true, truemotion=true, delta = 1, idx = 1)
    # použijeme explicitní idx pro rychlejší zpracování
    forward_vectors = source.MVAnalyse(isb = false, truemotion=true, delta = 1, idx = 1)
    forward_compensation = source.MVFlow(forward_vectors, idx=1, thSCD1=500) # nebo použijte MVCompensate
    backward_compensation = source.MVFlow(backward_vectors, idx=1, thSCD1=500) # nebo použijte MVCompensate
    # vytvoříme postupné 3-snímkové sekvence
    interleave(forward_compensation, source, backward_compensation)

    DeGrainMedian() # umístěte sem váš oblíbený časový nebo časově-prostorový (temporal nebo spatial-temporal) odšumovač

    selectevery(3,1) # vrací jen filtrované centrální (nekompenzované) snímky

Použití předfiltrovaného klipu pro spolehlivější odhad pohybu, ale kompenzaci pohybu nepředfiltrovaného klipu (příklad odšumění)

    # Použijte některý odšumovač (rozmazávač) nebo odstraňovač blikání (deflicker) pro předfiltrování
    prefiltered = source.DeGrainMedian()
    backward_vectors = prefiltered.MVAnalyse(isb = true, truemotion=true, delta = 1, idx = 1)
    # použijeme explicitní idx pro rychlejší zpracování
    forward_vectors = prefiltered.MVAnalyse(isb = false, truemotion=true, delta = 1, idx = 1)
    # použijeme nepředfiltrovaný klip pro kompenzaci pohybu (s jiným idx)
    forward_compensation = source.MVFlow(forward_vectors, idx=2) # nebo použijte MVCompensate(mode=1)
    backward_compensation = source.MVFlow(backward_vectors, idx=2) # nebo použijte MVCompensate(mode=1)
    # vytvoříme postupné 3-snímkové sekvence
    interleave(forward_compensation, source, backward_compensation)

    DeGrainMedian() # umístěte sem váš oblíbený časový nebo časově-prostorový (temporal nebo spatial-temporal) odšumovač

    selectevery(3,1) # vrací jen filtrované centrální (nekompenzované) snímky

Odšumění pomocí MVDegrain2 s překrytými bloky (blksize=8) a subpixelovou přesností:

    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)

Odšumění prokládaného zdroje pomocí MVDegrain1 s překrývajícími se bloky (blksize=8) a subpixelovou přesností:

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

Odšumění prokládaného zdroje pomocí funkce MVDegrain2i:

    function MVDegrain2i(clip "source", int "overlap", int "dct", int "idx")
    {
    overlap=default(overlap,0) # hodnota překrytí (0 až 4 pro blksize=8)
    dct=default(dct,0) # použijte dct=1 pro klip se slabým blikáním
    idx=default(idx,1) # použijte různé idx pro rozdílné zdroje ve stejném skriptu
    fields=source.SeparateFields() # rozdělíme pole
    backward_vec2 = fields.MVAnalyse(isb = true, delta = 2, pel = 2, overlap=overlap, idx = idx,dct=dct)
    forward_vec2 = fields.MVAnalyse(isb = false, delta = 2, pel = 2, overlap=overlap, idx = idx,dct=dct)
    backward_vec4 = fields.MVAnalyse(isb = true, delta = 4, pel = 2, overlap=overlap, idx = idx,dct=dct)
    forward_vec4 = fields.MVAnalyse(isb = false, delta = 4, pel = 2, overlap=overlap, idx = idx,dct=dct)
    fields.MVDegrain2(backward_vec2,forward_vec2,backward_vec4,forward_vec4,thSAD=400,idx=idx)
    Weave()
    }

    source=AVISource("video.avi")
    mvdegrain2i(source,4,0,1)

Jak použít externí klip subpixelové interpolace:

    # Načtěte plugin Eedi2 (od tritical) s funkcí interpolace se zohledněním směrů obrysů
    LoadPlugin("Eedi2.dll")
    # vytvoříme ze zdroje nadvzorkovaný klip
    ups = source.EEDI2(field=1).LanczosResize(2*width(source), 2*height(source), src_left=0.25)
    bv = source.MVAnalyse(isb = true, pel = 2, overlap=4, pelclip=ups, idx = 1)
    source.MVCompensate(bv, pelclip=ups, idx=1)

Jak použít s MT filtrem a speciální vícevláknovou verzí AviSynthu:

    # Načtěte MT plugin od TSP
    LoadPlugin("MT.dll")
    avisource("some.avi")
    global idx1 = 10  # globální údaje od IanB
    MT("""
    idx1 = idx1 + 1
    # různá vlákna pro horní a spodní polovinu snímku musí mít různé idx (trik od Foxishadis)
    backward_vec2 = MVAnalyse(isb = true, delta = 2, pel = 2, overlap=4, sharp=1, idx = idx1)
    backward_vec1 = MVAnalyse(isb = true, delta = 1, pel = 2, overlap=4, sharp=1, idx = idx1)
    forward_vec1 = MVAnalyse(isb = false, delta = 1, pel = 2, overlap=4, sharp=1, idx = idx1)
    forward_vec2 = MVAnalyse(isb = false, delta = 2, pel = 2, overlap=4, sharp=1, idx = idx1)
    last.MVDegrain2(backward_vec1,forward_vec1,backward_vec2,forward_vec2,thSAD=400,idx=idx1)
    """,2) # dvě vlákna

    # Poznámka: Režim SetMTMode(2) vícevláknového AviSynthu je podporován od MVTools v.1.8.4.1 (beta testing)

Stejný příklad se SetMTMode:

    SetMTMode(5)
    FFmpegSource("some.avi") # avisource nepracuje se SetMTMode na mém stroji - TSchniede

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

Jak použít předfiltrovaný klip a přepočítat data pohybu původního zdroje (MVFlowFPS příklad)

    prefiltered = source.DeGrainMedian() # trocha vyhlazení
    backward = prefiltered.MVAnalyse(isb = true, idx = 1, blksize=16)
    forward = prefiltered.MVAnalyse(isb = false, idx = 1, blksize=16)
    # přepočítání původního zdrojového klipu s jinou velikostí bloku
    forward_re = MVRecalculate(source, forward, idx=2, blksize=8, thSAD=100)
    backward_re = MVRecalculate(source, backward, idx=2, blksize=8, thSAD=100)
    source.MVFlowFps(backward_re, forward_re, num=50, den=1, idx=2)

## IV) Odmítnutí záruk

Tento plugin je šířen za podmínek GNU GPL licence, bez jakýchkoli záruk. Viz. 'gpl.txt'.
Dokumentace je šířena pod CreativeCommons BY-SA 3.0 license.

Zvažte prosím provedení nějaké dotace pro podporu.

MVTools používají části kódu z následujících projektů:
Resizer (SimpleResize.cpp) je z Avisynth pluginu SimpleResize od Toma Barryho. http://www.trbarry.com
Fast DCT (fdct_mmx.asm) je z XVID MPEG-4 VIDEO KODEKU. http://www.xvid.org
DCT general transform (viz. fftwlite.h) je z FFTW knihovny (jako DLL výzva). http://www.fftw.org
SATD (pixel-32.asm, pixel.asm) a alternative SADx264 (sad-a.asm, x86inc.asm, x86inc-32.asm, cpu-32.asm) jsou z projektu x264. http://www.videolan.org/developers/x264.html (Loren Merritt, Laurent Aimar, Alex Izvorski et al).

## V) Revize

1.11.4.5 (15.11.2008 by Fizick)

- MVBlockFps: fixed left border bug

1.11.4.4 (15.10.2008 by Fizick)

- Restore old internal cache size growing as before v1.11.4.2 (some crashes reported).

1.11.4.3 (08.10.2008 by Fizick)

- MVDenoise: fixed error of v.1.11.4 with luma correction.
- MVCompensate: fix potential memory leakage (in constructor).

1.11.4.2 (26.09.2008 by Fizick)

- MVAnalyse: cut unused compensation memory space from vector clip (mc parameter).
- Decreased internal cache size growing.
- All MVFlow functions: fixed old bug with pixels for pel=4.
- MVAnalyse: added rfilter parameter (smooth method).
- MVBlockFps: added YUY2 and pelclip support.
- Tiny stability fixes for MT.

1.11.0.1 beta (08.09.2008 by Fizick)

- New MVBlockFps for simple fps change (almost realtime :-).
- MVAnalyse: more smooth method of frame hierarchical level reducing (like ReduceBy2) for smoothing at every level.
- MVAnalyse: Added pzero parameter of zero vector cost for more coherent motion vectors (now switched ON by default, set to 0 if you need in old algo).
- MVAnalyse: Decreased pelsearch internal clipping from pel to 1 (asked by somebody for speed).
- MVFlowFps,MVFlowFps2, MVFlowInter: removed thSAD parameter.
- All functions: Removed mmx parameter.

1.10.2.1 (28.08.2008 by Fizick)

- MVDegrain1-3: fixed old rounding error resulted in some chroma tint (some thanks to Didee for bugreport, but it could be more persevering in official MVTools forum thread :)
- Made doc about pelclip more accurate (hopely).

1.10.2.0 beta (27.08.2008 by Fizick)

- Debugged and renamed MVRefine back to new MVRecalculate :).
- MVAnalyse: changed LSAD threshold from hard by soft for a little more coherent motion at bad areas.
- MVAnalyse: fixed old bug for (rarely used) different horizontal and vertical overlap sizes.

1.10.1.0 not public (22.08.2008 by Fizick)

- Change MVRecalculate by more general function (MVRefine) which can re-estimate vectors.

1.10.0.0 not public (18.08.2008 by Fizick)

- Added MVRecalculate function to update SAD (as requested by Didee).
- Fixed possible memory leaks (thanks to josey_wells for note)
- Other changes of v1.9.6-1.9.7 branch by josey_wells are still not merged - too many work to analyse new code and numerous cosmetic rewriting, so based on v1.9.5.7

1.9.6.x-1.9.7.x series branch (01.08.2008-26.08.2008 by josey_wells)

- Added MVAnalyseMulti, MVDegrain, MVMultiExtract functions with internal multitheading (that does not require any special AviSynth, SetMTMode or MT)
- Some bug fixes (memory leaks), code consolidation (rewriting) for stability and performance improvements. Also there is a multitude of changes due to the addition of threading class, semaphore class, critical section class, thread files for MVDegrain, MVAnalyseMulti as well as factoring out common code for MVDegrain into a single base class moving out common code etc. There are no changes of algorithms. See messages at forum since August 2008 for download, syntax and discussion.

1.9.5.7 public beta (03.07.2008 by Fizick)

- Fixed Overlap_2xY_mmx
- Added (incomplete?) list of used projects to doc.

1.9.5.6 (02.07.2008 by TSchniede)

- Improved my, added Overlap_2xY_mmx, optimized CheckMV2 and LumaSAD.

1.9.5.5 (28.06.2008 by TSchniede)

- Improved default 2xY SAD and added new faster 2xY SAD.

1.9.5.4 (27.06.2008 by TSchniede)

- Ported CPU detection from x264.
- Now using x264 SAD autoddetect is default
- Merge with 1.9.5.1, re-enabled 32x16 mode (only default functions)

1.9.5.3 (26.06.2008 by TSchniede)

- Imported SSD & SATD funtions.
- access using sadx264 > 7 or dct > 4.

1.9.5.2 (24.06.2008 by TSchniede)

- Buffered source block in aligned area before calculating SAD.
- This fixes crashes if source block was unaligned due to overlaped blocks.
- Worst case was < 1% slower, most of the time it further increases performance.

1.9.5.1 public beta (21.06.2008 by Fizick)

- Merge v.1.9.5 changes by TSchniede.

1.9.5 (21.06.2008 by TSchniede), based on v.1.9.3

- MVAnalyse: added sadx264 option.
- Internal modifications - aligned memory of luma&chroma planes and modified MVTools to the interface of the SAD functions used in x264.
- minor bugfix (deactivate DebugPrint possible)

1.9.4.1 beta (12.06.2008 by Fizick, released 21.06.2008)

- Fixed bug for pel=4 with sharp=2 (thanks to Pustovetov for report and fix).
- MVCompensate: added block size 16x2 (bug reported by AVIL).

1.9.4 not public beta (08.06.2008 by Fizick)

- MVAnalyse and other: added block size 32x16 (requested by MAG79).

1.9.3.1 (05.06.2008 by Fizick)

- MVIncrease: was broken (as noted by MAG79).

1.9.3 (20.04.2008 by Fizick)

- MVAnalyse: fixed bug for pelclip (broken since v1.8.5).
- MVDegrain: added thSADC as chroma threshold (request by Terranigma).

1.9.2 (29.01.2008, all bugs were found by josey_wells)

- MVDegrain3: fixed bug in code for 16x8 block; fix typo (MVDegrain2 instead of MVDegrain3).
- MVAnalyse: fixed old bug in NStepSearch.

1.9.1 beta (15.12.2007 by Fizick)

- MVAnalyse: Increased speed (by 20%) of global motion estimation (other algo).
- MVAnalyse: Added assembler optimization for small blocksizes SAD (speed by 50%).
- MVMask: Added kind=5 motion colormap as x,y components of motion vector shown in U, V color planes.

1.9.0 (04.12.2007 by Fizick)

- Added MVDegrain3.

1.8.6 (02.12.2007 by Fizick)

- Added components x,y motion vector mask kind=3,4 to MVMask (requested by Terka).

1.8.5.1 (12.11.2007 by we:)

- Merge v1.8.4.3 and v1.8.5 changes, added MT example.

1.8.4.3 (05.10.2007 by Tsp)

- Implemented internal cache buffer miss detection with buffer growing (as suggested by IanB).

1.8.5 (05.11.2007 by Fizick)

- Added pelsearch parameter as search parameter (radius) at finest level (request by Terranigma).
- Decreased internal buffer to decrease memory usage, with some changes in critical sections.
- Added block size 16x2 (requested by ab_99).

1.8.4.2 (25.10.2007 by Tsp)

- Added critical section in frame refining to fix rare bug in multi-threaded processing.

1.8.4.1 (23.10.2007 by Tsp)

- Implemented thread-safe internal buffer access for correct multithreaded processing with SetMTmode(2) in Avisynth MT version (for multi CPU).

1.8.4 (22.08.2007 by Fizick)

- "divide" now works with "overlap".

1.8.3 (17-20.08.2007 by Fizick)

- MVFlowFps: renamed "mode" parameter to "mask".
- MVFlowFps2: added "mask" parameter.
- MVFlowFPS, MVFlowFPS2: Restored default values num=25, den=1 (as was in version 1.7 and early)
- MVDegrain1, MVGegrain2 - added "limit" parameter.

1.8.2 beta (30.07.2007 by Fizick)

- MVAnalyse: corrected (increased) search radius at finest level for pel>1.
- Added pel=4 option for quarter pixel precision.
- Renamed clip2x parameter to pelclip.

1.8.1 beta (28.06.2007 by Fizick)

- MVAnalyse: added postrocessing motion vectores by dividing blocks into subblocks to decrease zone of motion vectors interpolation.
- MVFlowFps: added "mode" parameter to select processing method at occlusion areas (and speed).
- Some internal changes (padding in MVAnalysisData, header to vector stream frames, etc).

1.8.0 beta (22.06.2007 by Fizick)

- MVFlowInter, MVFlowFPS, MVFlowFPS2, MVMask: improved occlusion mask by extent
- MVFlowInter, MVFlowFPS: decreased objects halo at occlusion areas by using motion vectors of adjacent frames
- MVFlowInter, MVFlowFPS: disabled SAD mask and thSAD parameter
- MVShow: fixed drawn positon of vectors
- MVFlowFPS, MVFlowFPS2: Changed default output fps to double of input (default num, den = 0)
- Added error messages on missed vector clips

1.7.0 beta (05.06.2007 by Fizick)

- MVAnalyse: added blksizeV and overlapV parameters for non-square blocks 8x4 and 16x8.

1.6.4 (30.05.2007 by Fizick)

- MVAnalyse: modified vectors order for Enhausted search (expanding squares).
- MVAnalyse: fixed bug with dct=3.
- MVFlowFps, MVFlowFPS2, MVFlowInter: now blend frames with bad motion estimaton (at scenechanges, flashes).
- MVFlowFps, MVFlowFPS2: fixed bug with thSAD parameter (and correspondent mask).

1.6.3 (06.05.2007 by Fizick)

- MVDepan: more compatible with DepanEstimate (range parameter, etc).

1.6.2 (11.11.2006 by Fizick)

- MVAnalyse: changed DCT=2 mode to global luma dependent.

1.6.1 beta (25.10.2006 by Fizick)

- MVAnalyse: added experimental DCT mode to improve motion estimation at luma flicker and fades (fast for blksize=8 only).

1.5.8 beta (14.10.2006 by Fizick)

- Many functions: added clip2x parameter to use 2X upsampled clip instead of internal subpixel interpolation for pel=2
- MVFlowFps, MVFlowFps2: added thSAD parameter; use local blending of neighbour frames pixels in regions with bad motion vectors
- MVFlowFps, MVFlowFps2: may use motion vectors for any frames delta
- MVFlowFps, MVFlowFps2: fixed a bug for video with big nominators and denominators (thanks to Trixter for report)
- MVCompensate: added experimental fields parameter to compensate fields shift of fieldbased video for pel=2
- MVAnalyse: changed pnew parameter to relative of SAD

1.5.3 beta (01.10.2006 by Fizick)

- MVAnalyse: improved zero motion estimation for fieldbased video for pel=2
- Merged v1.4.12-1.4.13 changes
- Temporary restored MVIncrease, MVChangeCompensation, MVDenoise (with compensation stored in vector clip)

1.5.1 beta (05.09.2006 by Fizick)

- Merged v1.4.11 changes

1.5.0 beta (23.08.2006 by Fizick)

- Corrected vector predictors interpolation (from coarse to fine scale) for overlap>0.
- MVFlowInter: added thSAD parameter.
- MVFlowInter: local blending of neighbour frames pixels in regions with bad motion vectors.
- Removed compensation storage in vector clip
- Removed functions MVIncrease, MVChangeCompensation, MVDenoise (it used compensation in vector clip, and did not support overlapping).
- Removed mode=2 loop option of MVCompensation, mode=0 is processed as mode=1 now.
- Added thSAD parameter to MVCompensation for safe (dummy) compensation as requested by Didee

1.4.13 (28.09.2006 by Fizick)

- Fixed bug with possible wrong frames pointers in core (MVClip.Update), hided by caching (thanks to IanB for advice)

1.4.12 (25.09.2006 by Fizick)

- Seems fixed bug with frames caching in MVDenoise (and possible in MVDegrain) (thanks to il9ad for report)

1.4.11 (06.09.2006 by Fizick)

- Corrected vector predictors interpolation (from coarse to fine scale) for overlap>0.
- Fixed bug with pitch for overlap=0, YV12 in MVDegrain1 (thanks to Boulder for report)

1.4.10 (18.08.2006 by Fizick)

- Corrected right and bottom borders processing in MVCompensate for arbitrary frame sizes.
- Changed defaults in MVAnalyse: pel=2, truemotion=true, sharp=2.

1.4.9 (14.08.2006 by Fizick)

- Fixes a bug in MMX optimization of overlap mode in MVDeGrain, MVCompensate for YUY2 with blksize=8 (thanks to TSchniede for report).

1.4.8 (31.07.2006 by Fizick)

- Added some MMX optimization of overlap mode in MVDeGrain, MVCompensate.
- Fixed a bug with last (not processed) rows in MVDeGrain.

1.4.7 (25.07.2006 by Fizick)

- Decreased overlap gridness in MVDeGrain1, MVDeGrain2, MVCompensate.
- Added example with MVDeGrain1 for interlaced.

1.4.6 (24.07.2006 by Fizick)

- Decreased denoising in MVDeGrain1, MVDeGrain2.
- Plane parameter in MVDeGrain1, MVDeGrain2 now works :)

1.4.5 (22.07.2006 by Fizick)

- Added plane parameter to MVDeGrain1, MVDeGrain2.

1.4.4 (19.07.2006 by Fizick)

- Corrected default thSAD=400 in MVDeGrain1, MVDeGrain2.
- Fixed a bug with V color plane in MVChangeCompensate.

1.4.3 (17.07.2006 by Fizick)

- Decrease overlap gridness in MVDeGrain1, MVDeGrain2.

1.4.2 (16.07.2006 by Fizick)

- Fixed a memory access bug in MVDeGrain1, MVDeGrain2. Thanks to krieger2005 for report.

1.4.1 (23.06.2006 by Fizick)

- Changed MVDeGrain1, MVDeGrain2 mode to SAD weigthing.
- Chanded thSCD1 default from 300 to 400.

1.4.0 (19.06.2006 by Fizick)

- Added MVDeGrain1, MVDeGrain2 limited averaging denoisers.
- Corrected thSAD scale in MVDenoise.
- Corrected documentation about SAD.

1.3.1 (11.06.2006 by Fizick)

- Added bicubic subpixel interpolation method for pel=2 (with iSSE optinization for sharp=1,2).
- Assembler iSSE speed optimization for overlapped block compensation.

1.3.0 (05.06.2006 by Fizick)

- Implemented overlapped block motion compensation to MVCompensation(mode=1).
- Changed default to mode=1 in MVCompensation as the most universal.
- Added sharp subpixel interpolation method for pel=2.
- Fixed bug for blksize=16 with YUY2.
- (To-do list: assembler SSE speed optimization for new compensation and interpolation methods.)

1.2.6 beta (21.05.2006 by Fizick)

- Added option to write motion vectors data to log file as requested by Endre.

1.2.5 (08.05.2006 by Fizick)

- Decreased zero vector weight, iteration accuracy in MVDepan

1.2.4 (07.04.2006 by Fizick)

- Fixed bug v.1.2.3 with info mode in MVDepan

1.2.3 (31.03.2006 by Fizick)

- Implemented MVDepan for interlaced source separated by fields;
- added optional MVDepan log file.

1.2.2 beta (01.03.2006 by Fizick)

- Fixed frame shift bug of v1.2.1 with mmx YUY2 conversion (thanks to WorBry for bug report)

1.2.1 beta (20.02.2006 by Fizick)

- Fixed bug of v1.2,
- Speed restored,
- mmx YUY2 conversion (from avisynth 2.6 function by sh0dan)
- But it seems, overlap mode still does not work properly

1.2 beta (17.02.2006 by Fizick)

- YUY2 format support (besides MVIncrease), no optimization

1.1.1 (16.02.2006 by Fizick)

- Removed DeBlock and Corrector filters (will be separate plugins)
- Documented old MVSCDetection function.
- Cleaned project from unused source files.

1.1 (non-public build 9.01.2006 by Fizick)

- Quite large revision (beta). New option for overlapped block motion estimation in MVAnalyse for usage in MVFlow, MVFlowInter, MVFlowFps for improved motion compensation.
- Lookup tables for motion interpolation.
- Small correction of displacement value in MVFlowFps2.

1.0.3 (Released 30.12.2005 by Fizick)

- Fixed bug with displacement in MVFlowInter, MVFlowFps (introduced in v1.0.2).

1.0.2 (Released 28.12.2005 by Fizick)

- Corrected value of displacement in MVFlow (a little).

1.0.1 (Released 24.12.2005 by Fizick)

- Fixed memory leakage bug in MVAnalyse with global motion (thanks to AI for report).
- Removed penalty for zero vector predictor in MVAnalyse (was introduced in v1.0).
- Changed chroma=true as default in MVAnalyse.

1.0 (Released 29.11.2005 by Fizick)

- I'm tired of long version numbers :). But the plugin is stil experimental :(.
- Restored zero vector predictor in MVAnalyse.
- Changed blur time scale in MVFlowBlur (100 is fully open shutter now) as Mug Funky requested.

0.9.13.3 (Released 27.11.2005 by Fizick)

- Added global motion (simple method) vector predictor to MVAnalyse.
- Vector search is skipped (for speed) if good predictor was found (with SAD < pnew).
- Parameter scale in MVShow works properly now.
- Disabled some debug and profiling info output (for speed increasing).
- Changed default prec=1 (was 2) in MVFlowBlur.

0.9.13.2 (Released 22.11.2005 by Fizick)

- Fixed bug in MVFlowFps, MVFlowFps2 for non-integer fps.

0.9.13.1 (Released 21.11.2005 by Fizick)

- Fixed bug in MVFlowFps, MVFlowFps2, MVFlowInter, MVFlowBlur (introduced in v0.9.13).
- Removed plen parameter from MVAnalyse as not useful.

0.9.13 (Released 20.11.2005 by Fizick)

- Added truemotion preset to MVAnalyse.
- Added experimental MVFlowFps2.
- Change interpolated vector rounding method in all MVFLow... functions.
- Edited documentation a little.

0.9.12.4 (Released 15.11.2005 by Fizick)

- Changed type of ml parameter in MVMask, MVFlowInter, MVFlowFps from int to float.
- Added bound check of ml, time, blur parameters.
- Small possible bug fixed (emms).
- Partially updated documentation. But I am not sure that sh0dan requested exactly such updating :). It is still not user guide but functions reference.

0.9.12.3 (Released 14.11.2005 by Fizick)

- Fixed bug for chroma for width not divisible by 16 in MVMask (introduced in v0.9.11).
- Some speed optimizing of MVFlowFps.
- Reset size of internal frames buffer to original value 10. Try various versions.

0.9.12.2 (Released 13.11.2005 by Fizick)

- Added experimental precise but slow MVFlowBlur function as scharfis_brain requested.
- Temporary changed size of internal frames buffer to 5.

0.9.12.1 (Released 12.11.2005 by Fizick)

- Added experimental MVFlowFps function.
- Disabled MVInter function.
- Temporary changed size of internal frames buffer from 10 to 3 for memory usage decreasing. Speed must be tested for complex scripts.

0.9.12 (Released 09.11.2005 by Fizick)

- Added MVFlowInter function. MVInter function will be removed in next release (it is worse).
- Changed scale of ml parameter for kind=2 of MVMask to more optimal default.
- Fixed small bug in Bilinear.asm (strange pixels near right border for pel=2).

0.9.11.1 (Released 06.11.2005 by Fizick)

- Added half-pel support to MVFlow.
- Increased max quant from 51 to 60 in DeBlock for very strong deblocking .
- Corrected documentation.

0.9.11 (Released 04.11.2005 by Fizick)

- Improved MVMask: Replaced boolean showsad parameter to integer kind, added occlusion mask option. Changed bilinear resize code to more correct and fast SimpleResize.

0.9.10.1 (Released 01.11.2005 by Fizick)

- Fixed bug with chroma and luma small changes in MVInter (rounding error).
- Vector interpolation in MVFlow and mask in MVInter are correct now (due to fixing bug in SimpleResize).

0.9.10 (Released 31.10.2005 by Fizick)

- Added some true motion (smoothed) estimation options to MVAnalyse
- Added function MVFlow for per-pixel motion compensation
- Added function MVInter for motion interpolation (very experimental)

0.9.9.1 (Released 20.01.2005 by Manao)

- No need anymore of stlport_vcxxxx.dll

0.9.9

- Filter added : Corrector
- Filter added : MVIncrease
- New available blocksize : 16
- New parameter in MVAnalyse : chroma
- Changes in the core

0.9.8.5

- `MVCompensate` changed : a new parameter, idx, which works as idx in `MVAnalyse`, and which allows speed up when compensating the same frames several times.

0.9.8.4

- ME takes into account the chroma now, as requested by tsp.

0.9.8.3

- Added `Corrector` function, as requested by scharfi.

0.9.8.2

- New function `MVDepan` (added by Fizick) for Depan plugin.

0.9.8.1

- Several bugfixes

0.9.8

- Yet another little changes in the filters' syntax. The core changed a lot, in order to gain speed were it was possible. However, by default, the speed gain won't be visible, you'll need to configure correctly the analysis filter through its "idx" parameter in order to gain speed ( in the mode "pel" = 2 ).
- Bugfixes in MVDenoise, and chroma denoising in MVDenoise.
- Now, the filters down the filter's chain tell to the analysis filter if they need the compensation, so you don't have to worry about that at the analysis stage.

0.9.7

- Yet again, a lot of rewriting. Interpolating filters are disabled ( for the moment ), all the other filters work and should be considered as stable. Syntax has changed a lot, and will change again before reaching 1.0 ( if it's reached one day ). Changes mainly affect `MVAnalyse`. New filter : `MVChangeCompensate`.

0.9.6.2

- Fixed bug in `MVMask` parameters.

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 lesser 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

- Huge rewritting of the core engine. Vectors are now searched with a precision up to the pixel ( because no other filters can use yet more precise vectors, except MVShow ). The search engine is now fast ( which doesn't mean necessarily that the filters which use it are fast )
- A new parameter for MVAnalyse : lambda. See the documentation of the filter to see how it works
- MVDenoise works better.

0.9.4

- Vectors can be saved to a file. In order to do so, add the parameter filename="C:\foo.bar" to the filter MVAnalyse. If the file doesn't exist, vectors will be saved into it. If it exists, vectors will be read from it. But, be warned :
  - The file for a whole movie will be around 500 MB
  - Saving / reading from a file need for the moment a linear access to the frames, so it has to be used only when encoding the movie, not when doing random access in it.
  - The speed gain is not as great as one may hope, because SADs can't be saved ( it would take too much space ) and so have to be recomputed.
- The filter MVDenoise now works on 5 frames, and its parameters are now "thT" and "sadT" ( have a look in the documentation to see how they work ). It works nice ( very good for heavy denoising )
- The scene change detection thresholds have slightly changed. Now, a block has changed if its SAD it over thSCD1. The default for thSCD1 is 300, and for thSCD2 it is 130. It orks well ( better than the previous SCD engine ).

0.9.3

- Last cleanings in the search of the motion vectors. It should be slightly faster
- More search parameters can be set by the user, especially the search algorithm. See the documentation
- Server / client implemented. You now first have to use MVAnalyse, and then the filter you want. Look at the documentation and at the examples I'll give alter.
- MVCompensate is separated from MVShow ( it's more logic that way ). For the moment, it doesn't move the chroma ( same behavior as MVShow in the latest releases )
- Some cleaning in MVBlur / MVInterpolate / MVConvertFPS, but still some work to do. Now, MVBlur blurs around the frame, not between the frame and the previous one.
- Half of the work is done for writing vectors to a file. But the resulting file will be large ( around 500 MB - 1 GB I guess ).
- MVDenoise is slightly faster ( at least it should )
- Copies are optimized inside the filter, thanks to avisynth's copy functions.
- MVShow can display the mean SAD of the compensation ( using showsad = true )

0.9.2.1

- MVInterpolate makes its come back.
- MVConvertFPS should work on the last few frames of the clip

0.9.2

- MVInterpolate doesn't exist anymore.
- MVBlur and MVConvertFPS have been improved. They also have got new parameters, have a look at the documentation.
- MVShow gets back its compensate mode ( MVShow(cm = true) )

0.9.1 - 12.05.2004

- First version renamed to MVTools.

0.1-0.6 Released 24.01.2004 - 01.04.2004 by Manao

- First public versions MotionVectors (Motion.dll).

## VI) Stáhnout

### Stáhnout MVTools v.1.11.4.5

### Existuje také nová větev MVTools v2.0 , která je ve vývoji.

Starší MVTools v.0.9.9.1 můžete stáhnout z Manaových stránek

`Český překlad:12.3.2009`