Formáty obrazu videa
Nejprve se zkusme podívat na základní typy formátů nekomprimovaného videa a jak vůbec vznikly. Základním požadavkem bylo uložení tak, aby bylo ekvivalentní analogovému formátu. Budeme se zabývat pouze formátem PAL, i když pro digitalní zpracovaní se liší pouze počtem řádků a snímků za vteřinu - PAL a SECAM má 576 viditelných řádek a 25 smímků/s a NTSC 480 řádků resp. 29.97 sn/s - princip uložení v digitální formě je shodný. Všechny systémy se dále liší jen kódováním barev v analogové verzi, černobílý základ je stejný - je to jasová složka, barevná je pak namodulována s dvakrát nižší šířkou pásma - barva má tedy dvakrát nižší rozlišení než jasová složka a proto jsou velké kontrasty zatíženy i "barevnou duhou", při střídajících se svislých pruzích v obraze je pak vidět barevné moiré - to není způsobenou nízkou kvalitou tuneru, vychází to z principu přenosu obrazu (a barevné složky). Je viditelné jak na TV kartě v PC, tak na klasické "bedně". Novější televizory vyšší cenové kategorie se snaží tyto nectnosti skrýt.
Z tohoto také vychází základní formáty videa v PC. Před převodem do číslicové formy se nejprve oddělí jasová složka (Y) od barevné a barevná se rozdělí na dvě složky U a V jak ukazuje obrázek:
Následuje převod pomocí rychlých A/D převodníků, každá složka zvlášť, přičemž barevné složky se samplují poloviční frekvencí než jasová, protože informace v signálu stejně není. Většinou se ještě používá oversampling, tedy vzorkování vyšší frekvencí než potřebnou a následná digitální úprava do požadované velikosti. Ve výsledku pak máme pro jeden frame 576 řádků po 720 jasových a 360 barevných bodech, což odpovídá šířce pásma (rozlišení) normy PAL. Někdy se používá horizontální rozlišení 768 bodů, aby byla zachována velikost poměru stran jednoho bodu 1:1 (TV má poměr stran 4:3, ale 720:576=5:4 -> 768:576=4:3).
Máme tedy tři složky: jasovou Y a barevné U,V, tomuto formátu se pak říká YUV. Existuje spoustu možností, jak uložit tyto složky do paměti - po bodech (YUVYUVYUV...), po řádcích, po plochách atd. Zdigitalizovaný formát je vždy ve formátu YUV 4:2:2, co znamenají tato čísla, si povíme později. S těmito formáty se ale pracuje špatně, protože je nelze jednoduše sčítat, průměrovat apod., tedy editovat. Převádí se proto do formátu RGB, kdy se přepočítá jasová a barevné složky na známou trojici červená R, zelená G a modrá B. Vše se už dělá digitálně, což je jednodušší a kvalitnější - samozřejmě hardwarově.
Formáty YUV
Formáty YUV se dělí do dvou skupin - packed a planar, lišící se uložením jasové a barevná složky v paměti. Formáty packed mají uloženy všechny složky YUV do tzv. makropixelů (shluk několika pixelů, např. 4) a jdou po sobě, planar formáty mají uloženy všechny složky zvlášť, tvoří tedy tři virtuální plochy, které jsou ve výsledku složeny dohromady.
Dále se pro YUV formáty vžilo tříčíselné označení, např. YUV 4:2:2. Udává vždy poměr mezi počtem barevné složky vůči jasové a někdy i počet bytů na makropixel (někdy se to ale nedodržuje). V tomto případě je poměr 4:2 a barevná složka tedy obsahuje polovinu bodů vůči jasové - na dva jasové body odpovídá pouze jeden barevný. Podobně YUV 4:1:1 obsahuje pouze čtvrtinu barevné složky oproti jasové a YUV 4:4:4 má rovnocené kódování jasové i barevných složek - měla by tedy být kvalitnější, jenže se přepočítává z YUV 4:2:2 a žádná informace navíc zde tedy není (výhodné pouze pro zpracování, tam se ale používá RGB32).
Existuje mnoho způsobů, jak jsou uloženy v paměti a proto každému způsobu (formátu) byl přiřazen identifikační znak, tzv. FourCC - Four Character Code. Ve čtyřech bytech (tedy jednom 32-bitovém slovu) jsou pomocí ASCII tabulky přiřazeny znaky odpovídající zkratce. Tyto zkratky (a tedy i kódy) jsou registrovány Microsoftem, pokud tedy chcete zaregistrovat svůj, obraťte se na ně ... Jednotlivé formáty lze mezi sebou libovolně převádět, ne vždy jde ale o bezeztrátový převod - lišit se mohou počet bitů na pixel (počet dostupných barev) a kódování (poměr barvy k jasu).
Teď už seznam používaných FourCC kódů, nejprve packed formáty:
FourCC | Hex kód | Kódování | Počet bitů na pixel | Poznámka |
YUY2 | 32595559 | 4:2:2 | 16 | Macropixel obsahuje dva pixely v jednom 32bitovém slově - 2x Y a 1xUV, spolus UYVY nejpoužívanější |
UYVY | 59565955 | 4:2:2 | 16 | Stejný jako YUY2, pouze s jiným sledem YUV složek. |
UYNV | 564E5955 | 4:2:2 | 16 | Přejmenovaný UYVY, registrovaný firmou NVidia kvůli řešení problému více overlay bufferů stejného formátu. |
YUNV | 564E5559 | 4:2:2 | 16 | Přejmenovaný UYVY, registrovaný firmou NVidia kvůli řešení problému více overlay bufferů stejného formátu. |
cyuv | 76757963 | 4:2:2 | 16 | Stejný jako UYVY, pouze řazení řádků naopak - spodní řádek nejdříve |
Y41P | 50313459 | 4:1:1 | 12 | Macropixel obsahuje 8 pixelů ve 3 32-bitových slovech. Někdy nazýván BTYUV. |
Y41T | 54313459 | 4:1:1 | 12 | Stejný jako Y41P, ale nejnižší bit složky Y značí průhlednost (transparency) |
Y42T | 54323459 | 4:2:2 | 16 | Stejný jako UYVY, ale nejnižší bit složky Y značí průhlednost (transparency) |
V422 | 32323456 | 4:2:2 | 16 | Stejný jako YUY2 |
CLJR | 524A4C43 | 4:1:1 | 8 | Macropixel obsahuje 4 pixely ve 32-bitovém slově. Y složky mají 5 bitů a UV složky jsou 6bitové. |
YUVP | 50565559 | 4:2:2 | 24 | Jako YUY2, ale vyšší počet bitů na pixel. |
UYVP | 50565955 | 4:2:2 | 24 | Jako UYVY, ale vyšší počet bitů na pixel. |
Y211 | 31313259 | 2:1:1 | 8 | Sampluje pouze každé druhé Y a každé čtvrté UV |
Y800 | 30303859 | 8:0:0 | 8 | Obsahuje pouze Y pro monochromatický obraz |
A planární formáty:
FourCC | Hex kód | Kódování | Počet bitů na pixel | Poznámka |
YV12 | 32315659 | 4:1:1 | 12 | Nejprve 8bitový Y (celý obraz) následovaný 2x2 subsamplovaný UV (horizontální i vertikální směr). Používá se u MPEG-1/2 formátů. |
YVU9 | 39555659 | 8:1:1 | 9 | Nejprve 8bitový Y následovaný 4x4 subsamplovaný UV |
I420 | 30323449 | 4:1:1 | 12 | Nejprve 8bitový Y následovaný 2x2 subsamplovaný UV |
IYUV | 56555949 | 4:1:1 | 12 | Shodný s I420 |
CLPL | 4C504C43 | 4:1:1 | 12 | Registrovaný firmou Cirrus Logic, podobný YV12 |
IF09 | 39304649 | 8:1:1 | 9.5 | 8bitový Y plane následovaný 4x4 subsamplovaným UV s delta kódováním (rozdíl vůči předchozímu pixelu) |
Y800 | 30303859 | 8:0:0 | 8 | Obsahuje pouze Y pro monochromatický obraz |
Jak je vidět, nejčastějšími formáty a také nejpoužívanějšími jsou packed formáty s kódováním YUV 4:2:2 - a mezi nimi YUY2 a UYVY. Tyto se také nejvíce používají pro hardwarový overlay na grafických kartách - je to buffer v paměti graf. karty, obsahující definici obrazu a dále je hardwarově zpracovám pro zobrazení (změna velikosti, jas, obtékání, transparence apod.), což ulehčuje procesoru při zobrazování. Pro overlay buffery se nepoužívají RGB formáty.
Formáty RGB
Formáty RGB byly zavedeny pro snadnější práci s obrazem. Obsahují tři barevné složky - červenou, zelenou a modrou - které tvoří vždy jeden pixel. Není zde tedy definováno subsamplování barevné složky, ostatně jasová a barevná složka zde nejsou odděleny. Jednotlivé formáty se prakticky liší jen počtem bitů na pixel.
Převod mezi YUV a RGB formáty lze provést příslušnými vzorci. Pro RGB->YUV:
Y = (0.257 * R) + (0.504 * G) + (0.098 * B) + 16
U (Cb) = (0.439 * R) - (0.368 * G) - (0.071 * B) + 128
V (Cr) = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128
YUV->RGB:
R = 1.164(Y - 16) + 1.596(Cr - 128)
G = 1.164(Y - 16) - 0.813(Cr - 128) - 0.391(Cb - 128)
B = 1.164(Y - 16) + 2.018(Cb - 128)
Seznam používaných FourCC kódů pro RGB formáty:
FourCC | Hex kód | Počet bitů na pixel | Poznámka |
BI_RGB | 00000000 | 1,4,8,16,24,32 | Základní formát pro kódování BMP souborů a obrazu videa. Podle počtu bitů na pixel se dále označují RGB8, RGB24, atd. |
RGB | 32424752 | 1,4,8,16,24,32 | Identické BI_RGB |
BI_RLE8 | 00000001 | 8 | Komprimovaný obraz pomocí metody Run Length Encoding plus možnost skoku mezi pixely a další vylepšení. Princip lze ho najít v API od Microsoftu, používá se jen u statických snímků (BMP) |
RLE8 | 38454C52 | 8 | Indentické BI_RLE8 |
BI_RLE4 | 00000002 | 4 | Komprimovaný obraz pomocí metody Run Length Encoding. Princip metody neznám, lze ho ale najít v API od Microsoftu, používá se jen u statických snímků (BMP) |
BI_BITFIELDS | 00000003 | 16,24,32 | Jako RGB, ale s libovolným kódováním uvnitř pixelů a sledem pixelů |
RGBA | 41424752 | 16,32 | Jako RGB, ale navíc je alpha kanál a kódování jako u BI_BITFIELDS |
RGBT | 54424752 | 16,32 | Jako RGB, ale navíc je kanál určující průhlednost (transparency) a kódování jako u BI_BITFIELDS |
Těchto formátů již není tolik, ono ani není příliš možností, jak tímto způsobem uložit obraz. Některé metody jsou již složitější a umožňují určitou dávku komprese bez znatelné ztráty kvality (oproti YUV, kde k redukci velikosti dat docházelo odstraněním části informace).