Analýza VP8 versus H.264: entropy coding, loop filter
Kapitoly článků
"Kódování entropie" je proces, který zpracovává všechny informace ze všech dosavadních kroků, tedy koeficienty diskrétní kosinové transformace, módy predikce, vektory pohybu a další, přičemž je následně bezztrátově komprimuje do výsledného datového souboru. A proč se tento podproces tak divně jmenuje? Inu každý, kdo se trochu zabýval teorií informace, už své ví. Nicméně pro ostatní, pojem entropie popisuje, jak moc je daný systém neorganizovaný (jinak řečeno "chaotický" či "neuspořádaný"). Kódování entropie je tak proces, který volně řečeno "do chaosu zavádí řád" tím, že přeuspořádá jednotlivé dílčí prvky do vhodné podoby.
VP8 používá aritmetický kodér jistým způsobem podobný tomu v H.264, ale s několika kritickými obměnami (ty zde opět nebudeme podrobněji rozebírat, přečtěte si v případě zájmu Jasonův blog), které vycházejí z toho, co On2 používala ve VP5, VP6 a pravděpodobně i ve VP7, kde byly nasazeny neadaptivní aritmetické kodéry.
Jak moc velkou penalizaci kompresního poměru přístup VP8 představuje, není známé. Každopádně zpět k věci. Dílčí část kódování entropie, a sice kódování vektorů pohybu, se skládá ze dvou částí: predikce založené na okolních vektorech pohybu a aktuální kompresi, což vyústí v rozdílovou hodnotu použitou pro kódování aktuálního (zpracovávaného) vektoru pohybu. Predikční metoda ve VP8 je "trochu zvláštní", ale na bližší povídání to prostě v tuto chvíli není, daná část specifikace toto popisující je jen zmateně napsaný kód v C bez jakéhokoli komentáře. Jason odhaduje, že kód provádí toto: vybírá kódování na základě okolních vektorů pohybu a pak se rozhodne, který z predikovaných vektorů použije, nebo jestli místo toho neuloží do výstupu jen deltu (rozdíl) oproti jinému.
Temnou stránkou této metody je, že (stejně jako VP3, resp. Ogg Theora), závisí silně na znovu užívání předchozích vektorů pohybu. To je nebezpečné v tom smyslu, že pokud kodér (a to nedávno zjistili i vývojáři Theory) zvolí vektor pohybu, který není skutečným vektorem pohybu, ale právě oním "potomkem jiného", aby tak uspořil datový objem, pak to může mít negativní dopad na vizuální stránku videa v daném snímku (snímcích). Každopádně Jason jasně říká, že v této dílčí podčásti specifikace VP8 si není jistý, jestli je lepší predikce ve VP8, nebo H.264.
Komprese výsledné delta je podobná H.264 s výjimkou velmi velkých delt, kde je VP8 trochu lepší.
Kódování Intra predikce je ve VP8 pravděpodobně o něco lepší než metoda v H.264, kterou Jason vždy považoval za trochu odfláknutou z hlediska specifikace.
Residuální kódování je ještě obtížnější na analýzu než vektory pohybu, protože je ve VP8 k dispozici pouze kus vysoce optimalizovaného a "zamlženého" C kódu, opět žádné komentáře. Každopádně jako CAVLC a CABAC (context-adaptive variable-length coding a context-adaptive binary arithmetic coding) v H.264 zakládá na stejných/podobných principech.
Jason dodává, že implementace schématu pro dělení dat do dílčích oblastí je noční můra pro hardwarové implementace, neboť velmi zvyšuje požadavky na paměťovou propustnost. Celkově pak kódování entropie Jason hodnotí jako v některých částech lepší, v jiných horší a v dalších zase jako velmi zvláštní. Pokud by v tomto mělo být H.264 hodnoceno jako lepší, pak to bude jen o příslovečný fousek.
Loop filtr
Loop filtr proběhne vždy po dekódování nebo kódování snímku a slouží k tomu, aby provedl další processing na snímku. Typicky jde o odstranění bloků (známý deblocking) u videí využívajících zmíněnou DCT. Není tu jen pro zlepšení vzhledu videa, ale také jako součást procesu, který připravuje predikci pro následující snímky. Z toho důvodu musí být shodný pro encoding i decoding videa. Implementace loop filtru ve VP8 je jakoby podobná H.264, opět ale s několika rozdíly. Za prvé má dva režimy: rychlý a normální. Rychlý je jednoznačně jednodušší implementace než ta v H.264, normální je zase o něco komplexnější. Za druhé, při filtraci mezi makrobloky se oba formáty trochu liší (VP8 používá větší rozsah, který H.264 používá jen pro intra části).
Do třetice pak VP8 neobsahuje to nejlepší z adaptivních mechanismů v H.264, adaptivní mechanismus implementuje pouze při přeskakování p16×16 bloků ("p" jsou ty, které nesou pouze změnu oproti předchozímu snímku(ům)). VP8 ve svém důsledku prochází bloky pořád dokola a dokola, i když se mezi snímky nijak nezměnily. Formát H.264 využívá více mechanismů, aby si tuhle zbytečnou práci ušetřil.