# Colorimetry

Při přehrávání obsahu videa se může objevit několik problémů. Mohly by být špatné úrovně, vedoucí k vypraným barvám (černá je zobrazena jako tmavě šedá a bílá je zobrazena jako světle šedá). To je podrobněji popsáno zde. Dalším problémem je mírná deformace barev (což často vypadá jako malá změna v jasu) a to bude popsáno v tomto článku.

Problém by mohl nastat pokud je váš obsah vytvořen v jiném barevném prostředí než v jakém je později uložený. Obvykle je vytvořen v RGB, ale uložen jako YCbCr. Při zobrazení bude znovu převeden zpět na RGB. To znamená, že se použijí dva barevné převody. Problém je, že existují různé způsoby jak provést tento převod. Pokud nejsou dva barevné převody stejné, zobrazený obsah nebude stejný jako původní obsah. Existuje mnoho dalších barevných prostředí, ale nebudou zde diskutovány. Viz příklad zde.

Tedy při převádění YCbCr na RGB před zobrazením, musí být použit správný standard (Rec.601 nebo Rec.709) převodu barev, a to ten, který byl použit při ukládání obsahu. (Rec.709 a Rec.601 jsou zkratkami pro ITU-R BT.709 a ITU-R BT.601.)

## Obsah

- 1 Jaké jsou standardy převodu barev?
- 2 Jak poznám, že je před přehráváním použit správný standard?
- 3 Měl bych něco opravovat, když zpracovávám svůj obsah?
- 4 Jak mohu použít správný standard při přehrávání?
  - 4.1 Metoda #1: Úprava nastavení grafického ovladače
  - 4.2 Metoda #2: Převod do RGB32 pomocí ffdshow
  - 4.3 Metoda #3: Pixelshader v Media Player Classic
  - 4.4 Metoda #4: Použití AviSynth skriptu v ffdshow video dekodéru
- 5 Co říkají specifikace o tom, které colorimetry jsou podporovány v jednotlivém formátu?
  - 5.1 VCD/MPEG-1
  - 5.2 DVD/MPEG-2
  - 5.3 ATSC standard
  - 5.4 MPEG-4/ASP
  - 5.5 MPEG-4/AVC
  - 5.6 Výchozí hodnoty aplikace
- 6 Odkazy

## Jaké jsou standardy převodu barev?

Existuje více způsobů provedení převodu YCbCr <-> RGB . Obecný převod je dán vztahy

    Y = Kr*R + Kg*G + Kb*B
    Cb = (B-Y)/(1-Kb)
    Cr = (R-Y)/(1-Kr) = R - G * Kg/(1-Kr) - B * Kb/(1-Kr)

a jiný způsob:

    R = Y + Cr*(1-Kr)
    G = Y - Cb*(1-Kb)*Kb/Kg - Cr*(1-Kr)*Kr/Kg
    B = Y + Cb*(1-Kb)

s (0.0 <= [Y,R,G,B] <= 1.0) ; (-1.0 <= [Cb,Cr] <= 1.0) a Kr + Kg + Kb = 1.

Koeficienty červené, zelené a modré (Kr,Kg,Kb) jsou standardizovány ve specifikacích a existuje jich několik. Pro příklady se podívejte se na Převody barev.

## Jak poznám, že je před přehráváním použit správný standard?

To je těžká otázka, protože je těžko možné zaznamenat jestli je při přehrávání použit špatný standard. Ve skutečnosti je těžké vůbec všimnout si nějakého rozdílu mezi nimi. Podívejte se na následující obrázek:

Horní obrázek je zobrazen správně (použitím Rec.601), a pro spodní byl použit nesprávný standard (Rec.709) při přehrávání. Všimnete si, že spodní obrázek je sytější (tedy má výraznější barvy než horní obrázek). Ale také je posunuta červená trochu ke žluté. [Opačný způsob vede k méně sytému klipu, posunu červené směrem k purpurové (magenta) a modré k tyrkysové.]

Tedy jak pak poznáte, který standard zvolit pro přehrávání? Není to sice vždy možné, ale musíte znát originál vašeho souboru. V některých případech může být tato informace uložena v hlavičce souboru. Měli by jste se držet následujícího průvodce:

Pokud je váš obsah Standard Definition (SD) použijte Rec.601 a pokud je váš obas High Definition (HD) použijte Rec.709, kromě případu, že hlavička obsahu udává něco jiného. Budu s tím pracovat v následujících kapitolách.

## Měl bych něco opravovat, když zpracovávám svůj obsah?

Ano, měli by jste to v některých případech opravit. Závisí to na vašem konečném formátu a jak je přehráván. Obecně je bezpečné předpokládat, že Rec.601 je použito pro Standard Definition obsah a Rec.709 pro High Definition obsah při přehrávání. To znamená, že jakékoli specifické hlavičkové informace týkající se colorimetrů budou ignorovány. Zde bude předpokládáno, že zpracováváte pomocí AviSynthu.

Dejme tomu, že chcete enkódovat váš obsah jako Standard Definition obsah (to je výška enkódovaného videa < 720p (720 vertikálních řádků). Pokud je váš zdroj MPEG-2 (tak může být informace o colorimetrech uložena v jeho hlavičce), stáhněte si plugin ColorMatrix, a vytvořte následující skript:

    # ColorMatrix provede převod Rec.709 -> Rec.601 , pokud je váš zdroj Rec.709:
    DGDecode_mpeg2source("D:\source.d2v", info=3)
    ColorMatrix(hints=true, dest=2, interlace=false) # použijte interlace=true pro prokládaný obsah

Dejme tomu, že chcete enkódovat váš obsah jako High Definition obsah (to je výška enkódovaného videa >= 720p). Vytvořte následující skript:

    # ColorMatrix provede převod Rec.601 -> Rec.709 , pokud je váš zdroj Rec.601:
    DGDecode_mpeg2source("D:\source.d2v", info=3)
    ColorMatrix(hints=true, dest=0, interlace=false) # použijte interlace=true pro prokládaný obsah

Pokud není informace o colorimetrech uložena v hlavičce (jako například u DivX/XviD), není ve skutečnosti možné říci které colorimetry jsou použity pro jeho vytvoření. Vše co můžete udělat je předpokládat, že Rec.601 je použito pro SD obsah a Rec.709 je použito pro HD obsah, a doufejte, že tento předpoklad je správný. V tomto případě můžete použít parametr hints pluginu ColorMatrix, ale musíte zadat převod explicitně použitím parametru mode.

## Jak mohu použít správný standard při přehrávání?

Zda je to možné (za předpokladu, že je při přehrávání použit špatný standard) závisí na tom jak je váš obsah přehráván. Pokud používáte sofwarový přehrávač, musíte zkontrolovat zda má možnost to opravit. Pokud používáte přehrávač založený na directshow (jako WMP nebo MPC) jsou různé možnosti, které jsou vysvětleny níže. Pokud renderer dělá YCbCr->RGB převod, měli by jste mít na paměti, že (jak bylo zjištěno v tomto vlákně):

- Windowed/renderless VMR7 a VMR9 používají BT.601 pro video < 720p (720 vertikálních řádků)
- Windowed/renderless VMR7 a VMR9 používají BT.709 pro video >= 720p (720 vertikálních řádků)

Pokud používáte Haali's Video Renderer (stáhněte si Haali Media Splitter aby jste si ho nainstalovali) můžete si vybrat barevný standard.

Podívejte se sem na informace o různých rendererech.

### Metoda #1: Úprava nastavení grafického ovladače

Nejsem si jistý jestli je toto možné. Potřebuji se někoho zeptat ...

### Metoda #2: Převod do RGB32 pomocí ffdshow

Donucení ffdshow vysílat RGB32 může pomoci zabránit problémům s colorimetry. Stinnou stránkou této metody, že provádění tohoto převodu v softwaru zvyšuje zatížení CPU.

Pro vynucení RGB32 výstupu v ffdshow by jste měli zrušit zatržení všech barevných prostředí kromě RGB32 na výstupní straně (Output page) v ffdshow konfiguraci. Také se doporučuje zapnout "High quality YV12 to RGB conversion" (Vysoce kvalitní převod YV12 do RGB). Na straně převodu RGB, můžete zvolit který standard by měl být předpokládán, BT.601 nebo BT709. Vyberte první pro materiál s nízkým rozlišením, a druhý pro HD video

### Metoda #3: Pixelshader v Media Player Classic

Pixelshader je malý program, který běží na vašich grafických kartách a zpracovává nějaká grafická data. V tomto případě každý snímek vašeho videa.

Media Player Classic má speciální pixelshader zvaný "BT.601 -> BT.709". Shader , který dělá převod jiným způsobem stále není dostupný. Pokud je potřeba použijte tento.

Některé požadavky pro pixelshadery v MPC:

- Musíte použít kompatibilní video renderer: VMR-7 (renderless), VMR-9 (renderless), nebo EVR Custom Presenter.
- Nastavení plochy (surface) musí být nastaveno na "3D surfaces".
- Vyžaduje některé DirectX komponenty, které nejsou zahrnuty ve výchozí Windows instalaci. Spusťte DirectX Web Installer aby jste získali požadované DirectX aktualizace.

### Metoda #4: Použití AviSynth skriptu v ffdshow video dekodéru

Existují dva způsoby jak to udělat. Prvním je použití pluginu ColorMatrix jak je vysvětleno v jedné z předchozích kapitol, a druhým je převod do RGB použitím vhodné matice (matrix):

Zde převede ffdshow váš obsah do RGB použitím Rec.601.

## Co říkají specifikace o tom, které colorimetry jsou podporovány v jednotlivém formátu?

### VCD/MPEG-1

Část 2 MPEG-1 standardu pokrývá video a je definována v ISO/IEC-11172-2. Je těžce založena na H.261. Informace o colorimetrech není zapsána v hlavičce.

### DVD/MPEG-2

Specifikace DVD nejsou veřejně dostupné zdarma, a nevím kdo četl tyto specifikace. Specifikace DVD by měli být podskupinou MPEG-2 specifikací (ano vím, to je velký předpoklad), a ty jsou dostupné zdarma. Říkají následující:

Starší 1995 MPEG-2 specifikace (ISO/IEC 13818-2: 1995 (E)) říká

"V případě, že sequence_display_extension() není přítomno v bitstreamu nebo colour_description je nula, koeficienty matice (matrix) jsou předpokládány takové, že odpovídají matrix_coefficients (koeficientům matice) mající hodnotu 1." Hodnota 1 znamená "1 Recommendation ITU-R BT.709". Všimněte si, že v roce 1995 vyšly první tituly DVD, takže při vytváření těchto specifikací, DVD ještě neexistovaly. V roce 2000, byla specifikace MPEG-2 změněna s ohledem na toto:

Novější 2000 MPEG-2 specifikace (ITU-T Rec.H262 (2000 E)) říká

"V případě, že sequence_display_extension() není přítomno v bitstreamu nebo colour_description koeficienty matice (matrix) jsou předpokládány takové, že jsou implicitně definované aplikací." Koeficienty matice (matrix) jsou popsány v "Tabulce 6-9 – Matrix coefficients".

Jinými slovy, pokud sequence_display_extension není přítomno, colorimetry mohou být jakékoliv.

### ATSC standard

Jen pro legraci, ATSC standard na straně 18 (http://www.atsc.org/standards/a_81.pdf ) mluví o colorimetrech a předpokladech jaké dělat když 'sequence_display_extension' vám neřekne co dělat:
"Hodnoty pro color_primaries, transfer_characteristics, a matrix_coefficients by měly být explicitně indikovány v sequence_display_extension. Zatímco všechny hodnoty pro color_primaries, transfer_characteristics, a matrix_coefficients definované v Tabulkách 6-7, 6-8, a 6-9 ISO/IEC 13818-2 [16, 18] jsou povoleny v přenášeném bit streamu, poznamenává se, že ITU-R BT.709 [27] a SMPTE 170M jsou v běžných případech použity nejpravděpodobněji.

Poznámka: Některý dříve-enkódovaný legacy materiál nemusí mít colorimetry (t.j., color_primaries, transfer_characteristics, a matrix_coefficients) explicitně indikované v sequence_display_extension, a v takových případech jsou colorimetry nejpravděpodobněji ITU-R BT.709 pro všechny formáty kromě těch formátů s (vertikální velikostí) vertical_size_value = 480, které mají nejspíše colorimetry v souladu s SMPTE 170M." Jak je poznamenáno [hkazemi http://forum.doom9.org/showthread.php?p=1089854#post1089854]

### MPEG-4/ASP

Informace o colorimetrech se nezapisuje do hlavičky (header).

### MPEG-4/AVC

ITU-T Rec. H.264 (2005)/Amd.1 (06/2006) říká

"Když matrix_coefficients syntax element není přítomno, hodnota matrix_coefficients by měla být odvozená, aby byla rovna 2. To je: Charakteristiky obrazu jsou neznámé nebo jsou stanovené aplikací." Koeficienty matice jsou popsány v "Tabulce E-5 – Matrix coefficients".

### Výchozí hodnoty aplikace

Ve Video Mystified, autor Keith Jack dává následující tabulku (jak je poznamenáno od ariga; viz: Tabulka 13.16. MPEG-2 matrix_coefficients Codewords.)

    Sequence Display Extension:

    Color_primaries
    Tyto 8-bitové volitelné kodové výrazy (codeword) popisují souřadnice barevnosti (chromaticity coordinates) zdrojových primaries, jak je ukázáno v tabulce.
    Pokud sequence_display_extension nen přítomno, nebo color_description = 0, musí být použita indikovaná výchozí hodnota.
    Tato informace může být použita pro úpravu zpracování barev po MPEG-2 dekódování pro kompenzaci barevných priorit (color primaries)
    zobrazení.

    Kód:

    -----------------------------------------------------------------------------------
    |     Barevné priority   |    Kód      |        Výchozí hodnoty aplikace            |
    |     Color Primaries    |    Code     |        Application defaults                |
    |------------------------|-------------|--------------------------------------------|
    | nepřístupné            |  0000 0000  |                                            |
    | BT.709, SMPTE 274M     |  0000 0001  | MPEG-2, ATSC, DVB 25Hz HDTV, DVB 30Hz HDTV |
    | nespecifikované        |  0000 0010  |                                            |
    | vyhrazeno              |  0000 0011  |                                            |
    | BT.470 system M        |  0000 0100  | DVD-Video 30 Hz                            |
    | BT.470 system B, G, I  |  0000 0101  | DVD-Video 25 Hz, DVB 25Hz SDTV             |
    | SMPTE 170M             |  0000 0110  | DVD-Video 30 Hz, DVB 30Hz SDTV             |
    | SMPTE 240M             |  0000 0111  |                                            |
    | vyhrazeno              |  0000 1000  |                                            |
    | :                      |      :      |                                            |
    | vyhrazeno              |  1111 1111  |                                            |
    -----------------------------------------------------------------------------------

dragongodz tvrzení této tabulky vykládá následovně:
Po té co jsem konečně uslyšel od osoby, která je v profesionálním enkodérovém průmyslu (ne, neřeknu kdo), mám spolehlivější informaci.: "Tabulka je ve skutečnosti omezením toho co můžete použít. Jinými slovy pokud nastavíte sequence_display_extension na Rec.709 pro dvd je to nelegální. To neznamená, že to nebude hrát atd. , prostě to znamená, že to není podporováno a jakýkoliv přehrávač, který přísně následuje specifikace to bude nejspíš prostě ignorovat jako kdyby nebyla nastavena vůbec žádná hodnota."

## Odkazy

- http://forum.doom9.org/showthread.php?t=131169
- http://forum.doom9.org/showthread.php?t=133982
- http://forum.doom9.org/showthread.php?p=1089979
- http://forum.doom9.org/showthread.php?t=133982#post1090068

`$English Date: 2009/08/22 17:35:09 $`

`Český překlad:4.9.2009`