2024. április 26., péntek

Gyorskeresés

Útvonal

Cikkek » Számtech rovat

Az x264 és a DXVA kompatibilitás

  • (f)
  • (p)
Írta: |

Egyre több HD tartalmú lemezről készülnek ripek, különböző felvett anyagokat kódolhatunk x264-gyel, de...

[ ÚJ TESZT ]

Egyre több HD tartalmú lemezről készülnek ripek, különböző felvett anyagokat kódolhatunk x264-gyel, de viszonylag kevés ezek közül olyan, amely eleget tenne a DXVA kompatibilitás követelményeinek. Nézzük meg, mit kell tenni, hogy kihasználhassuk videokártyánk áldásos segítségét a dekódolásban.

Bevezetés

Sajnos meglepődve tapasztalom, hogy sokan nem tudják rendesen használni az x264-et, illetve nem ismerik elég alaposan a H.264 szabványt sem. Nem ismerik, a használt level értékének hasznát, csupán annyit sok esetben, hogy x264-et használnak. Ez viszont nem mond túl sokat önmagában Sajnos elég sűrűn kiderül az is, Hogy L5.1-et használnak, ami mögött minden bizonnyal az a tévhit kering (többek között), hogy a legmagasabb level = legjobb minőség, pedig ha megnézzük, ez abszolút nem igaz.

Ennek okai valószínűleg a DivX, XviD és a dvdrip kódolásának más hozzáállásában keresendőek, illetve a nagyon hiányos scene szabályokban. Az XviD nem igényel hardveres segítséget és különösebben nem is terheli meg a processzort sem, így a beállításokat egy GUI-ban vagy bármely enkóder szoftverben kevés korlátozással szabadon változtatgathatjuk. Ha egy csapat meg akar felelni a scene szabályainak, akkor is csupán végig kell olvasnia a hosszú leírást és azt a kevés megkötést kell csupán beépítenie, amit annak idején a kitalálók állítottak fel.

Az újabb szabályok között megtaláljuk az x264-re vonatkozó leírást is (persze ez is már elég régi). Ebben nagyon kevés információ van a kódolásra, holott ezen áll vagy bukik minden. Egyedül azt kötik ki, hogy a b-frames=3 minimum, illetve a bitráta min. 4Mbit legyen. Ezzel nem jutunk közelebb a megoldáshoz. Az XviD és DivX után néhányan megszokták, hogy bármit beállíthatnak, nem jár következményekkel. Az x264 esetében azonban meggondolatlanul nem lehet garázdálkodni. Vannak, akik azt mondják, a kép jó, más nem számít. Persze, egy Q6600 nyilván simán le fogja játszani, de talán annyira mégsem mindegy.

Joggal kérdezhetjük, hogy mi értelme ennek, hiszen egy mai gyors CPU is képes 60-80% CPU-kihasználtság mellett simán játszani az 1080p-s filmeket. Igaz, de amint valami miatt (windows frissítés, stb.) egy szép nagy tüske (peak) keletkezik a kihasználtságban be fog akadni a lejátszás. Emellett ha már minden VGA tudja ezt, akkor miért nem akarnánk használni is?

DXVA

A DXVA (DirectX Video Acceleration) tulajdonképpen egy Windows API elsősorban konzolokhoz, ami hardveres támogatást engedélyez a nagyfelbontású videók lejátszásához. Gyakorlatilag a színkorrekció, deinterlacing, mozgáskompenzáció, iDCT, vagyis a számításigényes műveletek áttolása a GPU-nak végrehajtásra.

Egyelőre 2 verziója létezik, a DXVA 1.0 és DXVA 2.0. Az 1.0 már a Windows 2000 rendszerekben is megtalálható volt, alapvetően a WMR 7/9 rendererekre épül, míg a 2.0 már a Vista sajátja és egy új renderert is hozott magával, az EVR-t (Enhanced Video Renderer), ami az MF (Media Foundation) része.

Nem szeretnék ebbe hosszan belemenni, mert nem ez a fő témája ennek az írásnak. A lényeg, hogy egy előre meghatározott paraméterekkel érkező stream-et képes csak így pipeline-olni a codec, így nem mindent tud támogatni. Nyilván nem is lehetne minden extrém beállításra felkészíteni, ezért a kódolást végző személynek kell figyelmesnek lennie ahhoz, hogy olyan munka kerüljön ki a kezéből, ami képes ezt a támogatást kihasználni.

DXVA kompatibilitás

A hivatalos dokumentáció sehol nem említi azokat a kritériumokat, amelyek betartása szükséges az x264 használatakor ahhoz, hogy a támogatás aktív legyen, így többnyire sok ember áldozatos tesztelgetése, kísérletezése nyomán állt össze a „szabálylista”. Ez mindenképp értékelendő!

Először néhány új fogalmat vezessünk be.

level_idc: a level értéke, amit használni szeretnénk. A hardveres támogatáshoz ennek az értéknek 4.0 és 4.2 közé kell esnie (Cyberlink codec esetén pl.) vagy 3.0, 3.1 lehet. Ettől eltérni ugyan lehet, de ez már önmagában megtöri a kompatibilitást. Egy L5.1 használata ,ahogyan azt néhányan használják is, az ismert 20FPS-en beragadt lejátszást, vagyis akadást jelenthat nagyon sok esetben.

DPB: Decoded Picture Buffer. Ennek mérete korlátot jelent a hardveres támogatásban, ugyanis a szabvány szerint meghatározott méretet nem léphetjük át! Az ok egyszerű. A hardveres dekóderek (és itt nem csak a VGA, bármilyen hardveres dekóder érdekelt (pl.:asztali lejátszók)) nem rendelkeznek olyan mértékű memóriával, mint a szoftveresek, így ezek csakis annyi memóriát adnak át a dekódolás cache-elésének céljára, amennyi szükséges, szemben a szoftveres dekóderekkel, amelyek a rendszermemóriából szabadon foglalhatnak maguknak.

num_ref_frames: ez egy kalkulált paraméter, amit a dekóder limitként használ a referenciakeretekhez. Látszólag nincs köze a hardveres támogatáshoz, de gyakorlatilag elég sok köze van hozzá, ahogy látni fogjuk. Értéke 0 és 16 lehet; számítása a –ref=x, a –b-frames=x és a --b-pyramid paraméterek alapján történik. Vegyünk egy példát:

--ref=3 -> 3-mal növeli meg a num_ref_frames értékét
--b-frames=3 -> 1-et ad mindig a num_ref_frames értékéhez, függetlenül a beállított értéktől
--b-pyramid, ha aktív, akkor 2-t ad a paraméterhez. Ha összeadjuk, akkor 3+1+2 = 6, ami már nem jó.

A DXVA korlátja szerint egy High@L4.1 1080p videónál a num_ref_frames < 5, mígy a 720p esetén num_ref_frames < 10 minden esetben. 720x480-as felbontás mellett a maximális 16 is használható. Tapasztalati úton sok esetet végignézhetünk, de talán a legegyszerűbb, ha a –ref értéke mindig eggyel kevesebb a maximális korlátnál és kikapcsoljuk a b-pyramid paramétert. A –b-frames bármi lehet, dr ajánlott a 3 megtartása, esetleg animáció esetén 8 is lehet.

Ha ezt a két fogalmat már ismerjük, akkor meg is adhatjuk a DPB és a num_ref_frames közötti összefüggést. Mivel a DPB fizikai korlát, átlépni nem ildomos, mert akkor elég érdekes dolgok történhetnek, mint fekete képernyő, csak az első keret látszik és az időszámláló nem mozdul, hogy csak a legtipikusabbakat említsem.

Minden esetben igaz a következő:
Magasság(video) * Szélesség(video) * num_ref_frames <= 8294400 (gyakorlatilag ez lesz a DPB mérete). Ez egy kalkulált érték, fizikailag 12582912 a határ, de ebbe nem csak ennyi információt kell tárolnia a dekódernek, így a képlet lesz a releváns. Így könnyen ki is számíthatjuk az elégséges num_ref_frames értéket sima behelyettesítéssel.

Van például egy 1920x864 méretű videónk, amihez a num_ref_frames=5, míg pl.: egy 1280x648-as videóhoz 10 tartozik. Persze ne feledjük az előbb felállított korlátot a hardveres támogatás miatt, így csökkentsük mindkét esetben eggyel az értéket.
Ha már megvan az anyagunk és nem használja a támogatást, még nincs minden veszve. Ha nem rontották el nagyon a kódolást, akkor a következőket lehet megpróbálni:

- Ki kell próbálni a Media Player Classic Home Cinema verzióját, ha az támogatja a VGA-nkat.

- A h264info program segítségével a header-ben írjuk át a level értékét 3.1 vagy 4.1-re. (az x264 gyakorlatilag csak a header értékadásánál használja ezt az értéket, így nyugodtan módosítható).

- Ha nem megy, használjuk a CoreAVC szoftveres dekódert (ekkor ugyebár nem lesz hardveres támogatás, de jó esély van a sima lejátszásra).

- Át kell kódolni újra a fájlt jó paraméterekkel. Ez hosszadalmas és nem is biztos, hogy célra vezet, de akinek nagyon kell egy film így, megpróbálhatja.

Végezetül nézzünk meg pár mintát, amelyek engedélyezik, és amelyek megtörik a hardveres gyorsítást:

DXVA kompatibilis 1080p beállítások:

num_ref_frames=4 ref=1 b-frames=3 b-pyramid=on
--level 4.1 --ref 1 --bframes 3 --b-pyramid --b-adapt --b-rdo --bime --weightb --direct auto --subme 6 --trellis 1 --analyse p8x8,b8x8,i4x4,i8x8 --8x8dct --vbv-maxrate 25000 --me umh --merange 12

num_ref_frames=4 ref=3 b-frames=3 b-pyramid=off
--level 4.1 --ref 3 --mixed-refs --bframes 3 --no-b-pyramid --b-adapt --b-rdo --bime --weightb --direct auto --subme 6 --trellis 1 --analyse p8x8,b8x8,i4x4,i8x8 --8x8dct --vbv-maxrate 25000 --me umh --merange 12

num_ref_frames=4 ref=3 b-frames=3 b-pyramid=off b-adapt=off
--level 4.1 --ref 3 --mixed-refs --bframes 3 --no-b-pyramid --no-b-adapt --b-rdo --bime --weightb --direct auto --subme 6 --trellis 1 --analyse p8x8,b8x8,i4x4,i8x8 --8x8dct --vbv-maxrate 25000 --me umh --merange 12

num_ref_frames=4 ref=3 b-frames=16 b-pyramid=off
--level 4.1 --ref 3 --mixed-refs --bframes 16 --no-b-pyramid --b-rdo --bime --weightb --direct auto --subme 6 --trellis 1 --analyse p8x8,b8x8,i4x4,i8x8 --8x8dct --vbv-maxrate 25000 --me umh --merange 12

num_ref_frames=4 ref=4 b-frames=0 b-pyramid=off b-adapt=off
--level 4.1 --ref 4 --mixed-refs --bframes 0 --no-b-pyramid --no-b-adapt --b-rdo --bime --weightb --direct auto --subme 6 --trellis 1 --analyse p8x8,b8x8,i4x4,i8x8 --8x8dct --vbv-maxrate 25000 --me umh --merange 12

Nem kompatibilis 1080p beállítások:

num_ref_frames=5 ref=2 b-frames=2 b-pyramid=on
--level 4.1 --ref 2 --mixed-refs --bframes 2 --b-pyramid --b-adapt --b-rdo --bime --weightb --direct auto --subme 6 --trellis 1 --analyse p8x8,b8x8,i4x4,i8x8 --8x8dct --vbv-maxrate 25000 --me umh --merange 12

num_ref_frames=6 ref=3 b-frames=3 b-pyramid=on
--level 4.1 --ref 3 --mixed-refs --bframes 3 --b-pyramid --b-adapt --b-rdo --bime --weightb --direct auto --subme 6 --trellis 1 --analyse p8x8,b8x8,i4x4,i8x8 --8x8dct --vbv-maxrate 25000 --me umh --merange 12

num_ref_frames=5 ref=4 b-frames=3 b-pyramid=off
--level 4.1 --ref 4 --mixed-refs --bframes 3 --no-b-pyramid --b-adapt --b-rdo --bime --weightb --direct auto --subme 6 --trellis 1 --analyse p8x8,b8x8,i4x4,i8x8 --8x8dct --vbv-maxrate 25000 --me umh --merange 12

DXVA kompatibilis 720p beállítások:

num_ref_frames=9 ref=9 b-frames=0 b-pyramid=off b-adapt=off
--level 4.1 --ref 9 --mixed-refs --bframes 0 --no-b-pyramid --no-b-adapt --direct auto --subme 6 --trellis 1 --analyse p8x8,b8x8,i4x4,i8x8 --8x8dct --vbv-maxrate 25000 --me umh --merange 12

num_ref_frames=9 ref=8 b-frames=3 b-pyramid=off
--level 4.1 --ref 8 --mixed-refs --bframes 3 --no-b-pyramid --b-adapt --b-rdo --bime --weightb --direct auto --subme 6 --trellis 1 --analyse p8x8,b8x8,i4x4,i8x8 --8x8dct --vbv-maxrate 25000 --me umh --merange 1

num_ref_frames=8 ref=7 b-frames=3 b-pyramid=off
--level 4.1 --ref 7 --mixed-refs --bframes 3 --no-b-pyramid --b-adapt --b-rdo --bime --weightb --direct auto --subme 6 --trellis 1 --analyse p8x8,b8x8,i4x4,i8x8 --8x8dct --vbv-maxrate 25000 --me umh --merange 12

num_ref_frames=7 ref=6 b-frames=3 b-pyramid=off
--level 4.1 --ref 6 --mixed-refs --bframes 3 --no-b-pyramid --b-adapt --b-rdo --bime --weightb --direct auto --subme 6 --trellis 1 --analyse p8x8,b8x8,i4x4,i8x8 --8x8dct --vbv-maxrate 25000 --me umh --merange 12

num_ref_frames=9 ref=6 b-frames=3 b-pyramid=on
--level 4.1 --ref 6 --mixed-refs --bframes 3 --b-pyramid --b-adapt --b-rdo --bime --weightb --direct auto --subme 6 --trellis 1 --analyse p8x8,b8x8,i4x4,i8x8 --8x8dct --vbv-maxrate 25000 --me umh --merange 12

Nem kompatibilis 720p beállítások:

num_ref_frames=10 ref=9 b-frames=3 b-pyramid=off
--level 4.1 --ref 9 --mixed-refs --bframes 3 --b-pyramid --b-adapt --b-rdo --bime --weightb --direct auto --subme 6 --trellis 1 --analyse p8x8,b8x8,i4x4,i8x8 --8x8dct --vbv-maxrate 25000 --me umh --merange 12

Nos, remélem, ezek után sokan fognak örülni annak, hogy hardveres támogatást is használnak. :)

Update:
A --ref a rev 721-től már használható 4-gyel, b-frames 2 -vel , és b-pyramid -dal is, tehát a DPB korlát itt kitolódik.

"A patch was added in x264 revision 721 that changes the way --ref works, allowing it to specify the total Decoded Picture Buffer (DPB) size. Now, B-frames and B-Pyramids can be used without the DPB size exceeding the --ref value."

Köszönöm az infót hcboy-nak :)

Azóta történt

Előzmények

Hirdetés

Copyright © 2000-2024 PROHARDVER Informatikai Kft.