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