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]
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.
Você terá que borrar o croma de algum modo (deixando o luma intacto).
Por exemplo (usando tomsmocomp.dll):
AviSource(...) MergeChroma(TomsMoComp(-1,5,0))
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.
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.
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 |
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 |
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 | |
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.
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!
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 |
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 |
ColorSpaces
[4:4:4]
amostra
[4:2:2]
amostra
[4:2:0]
amostra
[Chroma
Upsampling]
[Chroma Subsampling Standards]
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 | |
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.
[MSDN:
YUV sampling] Descreve as técnicas de amostras YUV mais
comuns.
[DV sampling]
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