# Amostras

## 1. Conversões de formato de cor e o Erro de Amostragem de Croma

As figuras seguintes mostram erros que são exemplos do Erro de Amostragem de Croma, assim chamado porque o vídeo é incorretamente amostrado (YV12 entrelaçado, amostrado como progressivo ou vice-versa). Como resultado, você verá freqüentemente lacunas ao alto e ao fundo dos objetos coloridos e linhas "fantasmas" flutuando acima ou abaixo dos objetos.

figura 1a: exemplo de fonte entrelaçada (YV12) sendo amostrada como vídeo progressivo (YUY2) (de http://zenaria.com/gfx/)

figura 1b: a mesma imagem com amostragem de croma correta (de http://zenaria.com/gfx/)

figura 2a: exemplo de fonte progressiva (YV12) sendo amostrada como vídeo entrelaçado (YUY2)

figura 2b: a mesma imagem com amostragem de croma correta

Nesta seção, será mostrado o que causa isso e como acertar. Quer dizer, fazer isso menos visível, porque não é possível corrigir completamente.

Referências:
[The Chroma Upsampling Error]
[The Chroma Upsampling Error - Television and Video Advice]

### 1.1 Erro de Amostragem de Croma (CUE, ou SUGESTÃO)

Como previamente declarado, o Erro Chroma Upsampling acontece principalmente quando você converte de YV12 entrelaçado (verdadeiro) para qualquer outro formato e o conversor pensa que o vídeo é progressivo. Ou, ao contrário, se o material é progressivo (ou entrelaçado, codificado como progressivo) e amostrado como entrelaçado. Isto não é porém tão ruim quanto ao contrário.

Quando VDub prever o vídeo, precisará convertê-lo para RGB. Considerando que AviSynth entrega YV12, pede o codec (por exemplo XviD ou DivX) para converter YV12 a RGB. O codec porém SEMPRE amostra progressivamente. Conseqüentemente você terá artefatos na prévia de Vdub, em material entrelaçado YV12. Isto porém, não está presente no vídeo YV12 (ou na codificação resultante). Para confirmar, deixe !AviSynth fazer a conversão colocando ConvertToRGB(interlaced=true) no fim do seu escrito.

### 1.2 Corrigindo vídeo que tem o Erro de Amostragem de Croma

Você terá que borrar o croma de algum modo (deixando o luma intacto).

Por exemplo (usando tomsmocomp.dll):

    AviSource(...)
    MergeChroma(TomsMoComp(-1,5,0))

## 2. Aspectos teóricos

Nesta seção, será explicada a colocação do croma, como isto é relacionado para a amostragem (RGB - > YUY2 - > YV12) e como ela é feita no AviSynth.

Também explica em detalhes por que a SUGESTÃO (CUE ) acontece. Para resumir o segundo, o problema é que há uma diferença entre YV12 progressivo e YV12 entrelaçado, porque o croma é compartilhado verticalmente entre píxeis vizinhos.
Veja também http://forum.doom9.org/showthread.php?s=&threadid=52151&highlight=upsampling.

### 2.1 Os formatos de cor: RGB, YUY2 e YV12

Para poder entender como a amostragem YV12 < - > YUY2 trabalha e por que sua fonte é entrelaçada ou progressiva, os formatos de cores YV12/YUY2 serão discutidos primeiro. Não é importante aqui como eles ficam em sua memória. Informações sobre isso podem ser achadas aqui: ColorSpaces.

#### Formato de cor YUV 4:4:4

O termo 4:4:4 denota que para cada quatro amostras de luminância (Y), há quatro amostras de cada U e V. Assim cada píxel tem um valor de luminância (Y), um valor U (amostra de diferença azul ou Cb) e um valor V (amostra de diferença vermelha ou Cr). Note, "C" é apenas uma amostra de croma (amostra UV).

O plano de uma imagem codificada em 4:4:4 se parece como:

quadro | linha
YC YC YC YC | linha 1
YC YC YC YC | linha 2
YC YC YC YC | linha 3
YC YC YC YC | linha 4

#### Formato de cor YUY2

YUY2 (ou YUYV) é um formato 4:2:2. O termo 4:2:2 denota que para cada quatro amostras de luminância (Y), há duas de cada U e V, dando menos largura de banda à crominância (cor) em relação à luminância. Assim para cada píxel, compartilha horizontalmente UV (croma) com um píxel vizinho.

O plano de uma imagem codificada em 4:2:2 se parece como:

quadro | linha
YC Y YC Y | linha 1
YC Y YC Y | linha 2
YC Y YC Y | linha 3
YC Y YC Y | linha 4

#### Formato de cor YV12

Para o formato de cor YV12 há uma diferença entre progressivo e entrelaçado. A causa é que os valores de croma também são compartilhados verticalmente entre as duas linhas vizinhas.

YV12 é um formato 4:2:0. O termo 4:2:0 denota que para cada quatro amostras (duas horizontais e duas verticais) da luminância (Y), há uma amostra de cada U e V, dando menos largura de banda à crominância (cor) em relação à luminância.

YV12 progressivo

Para cada píxel, compartilha horizontalmente UV (croma ou C) com um píxel vizinho e compartilha verticalmente UV com a linha vizinha (assim a linha 1 com a linha 2, linha 3 com a 4, etc).

O layout da imagem codificada progressiva 4:2:0 se parece como (esquema MPEG 2 - veja abaixo)

quadro | linha
Y_Y_Y_Y | linha 1
C___C__ |
Y_Y_Y_Y | linha 2
Y_Y_Y_Y | linha 3
C___C__ |
Y_Y_Y_Y | linha 4

YV12 entrelaçado

Para cada píxel, compartilha horizontalmente UV (croma ou C) com um píxel vizinho e compartilha verticalmente UV com o próximo para a linha vizinha (assim a linha 1t com a linha 3t, a linha 2b com a 4b, etc).

O esboço da imagem codificada progressiva 4:2:0 se parece como (esquema MPEG 2 - veja abaixo)

quadro | linha
Y_Y_Y_Y | linha 1t
C___C__ |
Y_Y_Y_Y | linha 2b
Y_Y_Y_Y | linha 3t
C___C__ |
Y_Y_Y_Y | linha 4b

ou

campo 1 | campo 2 | linha
Y_Y_Y_Y |  | linha 1t
C___C__ |  |
| Y_Y_Y_Y | linha 2b
Y_Y_Y_Y |  | linha 3t
| C___C__ |
| Y_Y_Y_Y | linha 4b

### 2.2 Sub-amostragem

A sub-amostragem é usada para reduzir o armazenamento e exigências da largura de banda de radiodifusão para vídeo digital. Isto é efetivo para um sinal !YCbCr porque o olho humano é mais sensível para mudanças em preto e branco que para mudanças de cor. Assim, reduzindo drasticamente a info de cor, mostra muito pouca diferença. YUY2 e YV12 são exemplos de formatos de cor reduzidos.

#### Conversão RGB -> YUY2

Mais sobre conversões de cores RGB - > YUV podem ser achadas aqui: ColorConversions.
Recorde o plano de uma imagem codificada 4:4:4

quadro | linha
YC1 YC2 YC3 YC4 | linha 1
YC1 YC2 YC3 YC4 | linha 2
YC1 YC2 YC3 YC4 | linha 3
YC1 YC2 YC3 YC4 | linha 4

No AviSynth, o modo padrão está usando um núcleo 1-2-1 para interpolar croma, que é

C1x = (C1+C1+C2)/4 ???
C3x = (C2+C3+C3+C4)/4
C5x = (C4+C5+C5+C6)/4

A imagem 4:2:2 codificada se torna

quadro | linha
Y1C1x Y2 Y3C3x Y4 | linha 1
Y1C1x Y2 Y3C3x Y4 | linha 2
Y1C1x Y2 Y3C3x Y4 | linha 3
Y1C1x Y2 Y3C3x Y4 | linha 4

O outro modo ConvertBackToYUY2 usa croma do píxel esquerdo, assim,

quadro | linha
Y1C1 Y2 Y3C3 Y4 | linha 1
Y1C1 Y2 Y3C3 Y4 | linha 2
Y1C1 Y2 Y3C3 Y4 | linha 3
Y1C1 Y2 Y3C3 Y4 | linha 4

Note (como no estilo de outros formatos) a posição dos valores croma, representa o resultado do PESO da sub-amostragem.

Conversão entrelaçada YUY2 -> YV12

Recorde o estilo de uma imagem 4:2:0 codificada entrelaçada, mas com os pesos incluídos:

quadro | linha | pesos
Y_Y_Y_Y | linha 1t |
C___C__ |  | croma do YUY2_lines (0.75)*1t + (0.25)*3t
Y_Y_Y_Y | linha 2b |
Y_Y_Y_Y | linha 3t |
C___C__ |  | croma do YUY2_lines (0.25)*2b + (0.75)*4b
Y_Y_Y_Y | linha 4b |

ou

campo 1 | campo 2 | linha | pesos
Y_Y_Y_Y |  | linha 1t |
C___C__ |  |  | croma do YUY2_lines (0.75)*1t + (0.25)*3t
| Y_Y_Y_Y | linha 2b |
Y_Y_Y_Y |  | linha 3t |
| C___C__ |  | croma do YUY2_lines (0.25)*2b + (0.75)*4b
| Y_Y_Y_Y | linha 4b |

Note (como no plano de outros formatos) a posição dos valores croma, representa o resultado do PESO da sub-amostragem.

Assim o croma está esticado através de duas linhas luma no mesmo campo!

Conversão progressiva YUY2 -> YV12

Recorde o esboço de uma imagem 4:2:0 codificada

quadro | linha | pesos
Y_Y_Y_Y | linha 1 |
C___C__ |  | croma do YUY2_lines (0.5)*1 + (0.5)*2
Y_Y_Y_Y | linha 2 |
Y_Y_Y_Y | linha 3 |
C___C__ |  | croma do YUY2_lines (0.5)*3 + (0.5)*4
Y_Y_Y_Y | linha 4 |

Note (como no plano de outros formatos) a posição dos valores croma, representa o resultado do PESO da sub-amostragem.

Assim o croma está esticado através de duas linhas luma no mesmo campo!

### 2.3 Amostragem

#### Conversão YUY2 -> RGB

Recorde o plano de uma imagem 4:2:2 codificada

quadro | linha
Y1C1 Y2 Y3C3 Y4 | linha 1
Y1C1 Y2 Y3C3 Y4 | linha 2
Y1C1 Y2 Y3C3 Y4 | linha 3
Y1C1 Y2 Y3C3 Y4 | linha 4

Para a conversão de 4:2:2 - > 4:4:4, as amostras de croma perdidas são interpoladas (usando um (kernel) núcleo 1-1), que é

C2x = (C1+C3)/2
C4x = (C3+C5)/2

e as amostras de croma existentes são copiadas.

A imagem 4:4:4 codificada se torna

quadro | linha
Y1C1 Y2C2x Y3C3 Y4C4x | linha 1
Y1C1 Y2C2x Y3C3 Y4C4x | linha 2
Y1C1 Y2C2x Y3C3 Y4C4x | linha 3
Y1C1 Y2C2x Y3C3 Y4C4x | linha 4

#### Conversão entrelaçada YV12 -> YUY2

No AviSynth, as amostras de croma perdidas são interpoladas como segue

quadro | linha | pesos
Y_Y_Y_Y | linha 1t | croma do YV12_lines 1t
C___C__ |  |
Y_Y_Y_Y | linha 2b | croma do YV12_lines 4b
Y_Y_Y_Y | linha 3t | croma do YV12_lines (0.75)*1t + (0.25)*5t
C___C__ |  |
Y_Y_Y_Y | linha 4b | chroma of YV12_lines (0.75)*4b + (0.25)*8b
Y_Y_Y_Y | linha 5t | croma do YV12_lines (0.25)*1t + (0.75)*5t
C___C__ |  |
Y_Y_Y_Y | linha 6b | croma do YV12_lines (0.25)*4b + (0.75)*8b
Y_Y_Y_Y | linha 7t | croma do YV12_lines (0.75)*5t + (0.25)*9t
C___C__ |  |
Y_Y_Y_Y | linha 8b | croma do YV12_lines (0.75)*8b + (0.25)*12b

ou

campo 1 | campo 2 | linha | pesos
Y_Y_Y_Y |  | linha 1t | croma do YV12_lines 1t
C___C__ |  |  |
| Y_Y_Y_Y | linha 2b | croma do YV12_lines 4b
Y_Y_Y_Y |  | linha 3t | croma do YV12_lines (0.75)*1t + (0.25)*5t
| C___C__ |  |
| Y_Y_Y_Y | linha 4b | croma do YV12_lines (0.75)*4b + (0.25)*8b
Y_Y_Y_Y |  | linha 5t | croma do YV12_lines (0.25)*1t + (0.75)*5t
C___C__ |  |  |
| Y_Y_Y_Y | linha 6b | croma do YV12_lines (0.25)*4b + (0.75)*8b
Y_Y_Y_Y |  | linha 7t | croma do YV12_lines (0.75)*5t + (0.25)*9t
| C___C__ |  |
| Y_Y_Y_Y | linha 8b | croma do YV12_lines (0.75)*8b + (0.25)*12b

AviSynth usa uma interpolação diferente como o sugerido pelas especificações de mpeg2 (talvez devido à velocidade). O posterior é

campo 1 | campo 2 | linha | pesos
Y_Y_Y_Y |  | linha 1t | croma do YV12_lines 1t
C___C__ |  |  |
| Y_Y_Y_Y | linha 2b | croma do YV12_lines 4b
Y_Y_Y_Y |  | linha 3t | croma do YV12_lines (5/8)*1t + (3/8)*5t
| C___C__ |  |
| Y_Y_Y_Y | linha 4b | croma do YV12_lines (7/8)*4b + (1/8)*8b
Y_Y_Y_Y |  | linha 5t | croma do YV12_lines (1/8)*1t + (7/8)*5t
C___C__ |  |  |
| Y_Y_Y_Y | linha 6b | croma do YV12_lines (3/8)*4b + (5/8)*8b
Y_Y_Y_Y |  | linha 7t | croma do YV12_lines (5/8)*5t + (3/8)*9t
| C___C__ |  |
| Y_Y_Y_Y | linha 8b | croma do YV12_lines (7/8)*8b + (1/8)*12b

Conversão progressiva YV12 -> YUY2

As amostras de cromas perdidas são interpoladas como:

quadro | linha | pesos
Y_Y_Y_Y | linha 1 | croma do YV12_lines 1
C___C__ |  |
Y_Y_Y_Y | linha 2 | croma do YV12_lines (0.75)*1 + (0.25)*3
Y_Y_Y_Y | linha 3 | croma do YV12_lines (0.25)*1 + (0.75)*3
C___C__ |  |
Y_Y_Y_Y | linha 4 | croma do YV12_lines (0.75)*3 + (0.25)*5
Y_Y_Y_Y | linha 5 | croma do YV12_lines (0.25)*3 + (0.75)*5
C___C__ |  |
Y_Y_Y_Y | linha 6 | croma do YV12_lines (0.75)*5 + (0.25)*7

### 2.4 Referências

ColorSpaces
[4:4:4] amostra
[4:2:2] amostra
[4:2:0] amostra
[Chroma Upsampling]
[Chroma Subsampling Standards]

### 3.1 Amostras MPEG-1 versus MPEG-2

Há duas variantes comuns de amostra 4:2:0. Uma delas é usada em vídeo MPEG-2 (e CCIR-601) e a outra é em MPEG-1.

O esquema MPEG-2 é como amostra AviSynth de vídeo 4:2:0, porque evita completamente a amostragem horizontal em conversões 4:2:0 < - > 4:2:2.

O layout de uma imagem MPEG-1codificada progressiva 4:2:0

quadro | linha | pesos
Y_Y_Y_Y | linha 1 |
_C__C_ |  | croma do YUY2_lines (0.5)*1 + (0.5)*2
Y_Y_Y_Y | linha 2 |
Y_Y_Y_Y | linha 3 |
_C__C_ |  | croma do YUY2_lines (0.5)*3 + (0.5)*4
Y_Y_Y_Y | linha 4 |

O layout de uma imagem MPEG-2 codificada progressiva 4:2:0

quadro | linha | pesos
Y_Y_Y_Y | linha 1 |
C___C__ |  | croma do YUY2_lines (0.5)*1 + (0.5)*2
Y_Y_Y_Y | linha 2 |
Y_Y_Y_Y | linha 3 |
C___C__ |  | croma do YUY2_lines (0.5)*3 + (0.5)*4
Y_Y_Y_Y | linha 4 |

### 3.2 Amostra DV

Para perfeição, mencionaremos amostra DV. DV é 4:2:0 (PAL) e 4:1:1 (NTSC). Note que o posicionamento da amostra do anterior é diferente do 4:2:0 croma em MPEG-1/MPEG-2!

O esboço de uma imagem 4:2:0 codificada (baseada em campo)

campo | linha
YV Y YV Y YV Y YV Y | linha 1
YU Y YU Y YU Y YU Y | linha 2
YV Y YV Y YV Y YV Y | linha 3
YU Y YU Y YU Y YU Y | linha 4

O esboço de uma imagem 4:1:1 codificada (baseada em campo)

campo | linha
YC Y Y Y YC Y Y Y | linha 1
YC Y Y Y YC Y Y Y | linha 2
YC Y Y Y YC Y Y Y | linha 3
YC Y Y Y YC Y Y Y | linha 4

Alguns comentários sobre estes formatos:
- 4:1:1 não é suportado nativamente no AviSynth.
- Os decodificadores DV produzem tudo em YUY2 ou RGB (com a exceção de ffdshow quando YV12 está habilitado).
- Quando produzindo YUY2/RGB (NTSC), o codec de MainConcept duplica as amostras do croma em vez de interpolar. O plugin [ReInterpolate411] pode ser usado para corrigir isso, resultando em melhor qualidade.

### 3.3 Referências

[MSDN: YUV sampling] Descreve as técnicas de amostras YUV mais comuns.
[DV sampling]

## 4. 4:2:0 Problema de Croma Entrelaçado (ou ICP)

Em conteúdo interlaçado em geral terá partes estáticas. Se for amostrado corretamente com amostragem entrelaçada, ainda terá problemas de croma nas extremidades diagonais de objetos coloridos luminosos em partes estáticas de um quadro A razão é que "Quando os dois campos são repostos depois por um desentrelaçador (ou por seu olho e mente, se assistir isto numa TV entrelaçada), as gradações relativamente suaves e os contornos de cada campo ficam virados para cima por várias gradações ligeiramente diferentes e contornos de outro campo" (aspas da primeira referência). Isto é chamado o Problema de Croma Entrelaçado. A "solução" é um movimento amostrado compensado, mas tal filtro de AviSynth/VDub que tenta fazer isto, ainda não existe.

Referências:
[The 4:2:0 Interlaced Chroma Problem]
[The 4:2:0 Interlaced Chroma Problem - Television and Video Advice]

`$Date: 2006/10/27 21:11:07 $ Portuguese translation by RoLon`