Formatos YUV recomendados de 8 bits para renderização de vídeo
Gary Sullivan e Stephen Estrop
Microsoft Corporation
Abril de 2002, atualizado em novembro de 2008
Este tópico descreve os formatos de cor YUV de 8 bits recomendados para renderização de vídeo no sistema operacional Windows. Este artigo apresenta técnicas para conversão entre formatos YUV e RGB e também fornece técnicas para upsampling de formatos YUV. Este artigo destina-se a qualquer pessoa que trabalhe com a decodificação ou renderização de vídeo YUV no Windows.
Introdução
Vários formatos YUV são definidos em toda a indústria de vídeos. Este artigo identifica os formatos YUV de 8 bits recomendados para renderização de vídeo no Windows. Fornecedores de decodificador e fornecedores de exibição são incentivados a dar suporte aos formatos descritos neste artigo. Este artigo não aborda outros usos de cor YUV, como fotografia ainda.
Os formatos descritos neste artigo usam 8 bits por localização de pixel para codificar o canal Y (também chamado de canal luma) e usar 8 bits por amostra para codificar cada amostra de chroma de U ou V. No entanto, a maioria dos formatos YUV usa menos de 24 bits por pixel em média, porque eles contêm menos amostras de você e V do que de Y. Este artigo não aborda formatos YUV com canais Y de 10 bits ou superiores.
Observação
Para os fins deste artigo, o termo U é equivalente a Cb e o termo V é equivalente a Cr.
Este artigo aborda os seguintes tópicos:
- Amostragem de YUV. Descreve as técnicas de amostragem yuv mais comuns.
- Definições do Surface. Descreve os formatos YUV recomendados.
- Conversões de taxa de amostragem de chroma e espaço de cor. Fornece algumas diretrizes para conversão entre formatos YUV e RGB e para conversão entre diferentes formatos YUV.
- Identificando formatos YUV no Media Foundation. Explica como descrever tipos de formato YUV no Media Foundation.
Amostragem de YUV
Os canais chroma podem ter uma taxa de amostragem menor do que o canal de luma, sem qualquer perda dramática de qualidade perceptiva. Uma notação chamada notação "A:B:C" é usada para descrever a frequência com que você e V são amostrados em relação a Y:
- 4:4:4 significa nenhum downsampling dos canais chroma.
- 4:2:2 significa 2:1 downsampling horizontal, sem downsampling vertical. Cada linha de verificação contém quatro exemplos de Y para cada dois exemplos de U ou V.
- 4:2:0 significa 2:1 downsampling horizontal, com 2:1 downsampling vertical.
- 4:1:1 significa 4:1 downsampling horizontal, sem downsampling vertical. Cada linha de verificação contém quatro exemplos de Y para cada amostra de você e V. A amostragem 4:1:1 é menos comum do que outros formatos e não é discutida em detalhes neste artigo.
Os diagramas a seguir mostram como o croma é amostrado para cada uma das taxas de downsampling. As amostras de Luma são representadas por uma cruz e as amostras de croma são representadas por um círculo.
A forma dominante de amostragem 4:2:2 é definida na Recomendação DE ITU-R BT.601. Há duas variantes comuns de amostragem 4:2:0. Um deles é usado no vídeo MPEG-2 e o outro é usado no MPEG-1 e nas Recomendações de ITU-T H.261 e H.263.
Em comparação com o esquema MPEG-1, é mais simples converter entre o esquema MPEG-2 e as grades de amostragem definidas para os formatos 4:2:2 e 4:4:4. Por esse motivo, o esquema MPEG-2 é preferencial no Windows e deve ser considerado a interpretação padrão dos formatos 4:2:0.
Definições do Surface
Esta seção descreve os formatos YUV de 8 bits recomendados para renderização de vídeo. Elas se enquadram em várias categorias:
- Formatos 4:4:4, 32 Bits por Pixel
- Formatos 4:2:2, 16 Bits por Pixel
- Formatos 4:2:0, 16 Bits por Pixel
- Formatos 4:2:0, 12 Bits por Pixel
Primeiro, você deve estar ciente dos seguintes conceitos para entender o que se segue:
- Origem da superfície. Para os formatos YUV descritos neste artigo, a origem (0,0) é sempre o canto superior esquerdo da superfície.
- Passo a passo. O passo de uma superfície, às vezes chamada de tom, é a largura da superfície em bytes. Dada uma origem de superfície no canto superior esquerdo, o passo é sempre positivo.
- Alinhamento. O alinhamento de uma superfície fica a critério do driver de exibição de gráficos. A superfície deve estar sempre alinhada ao DWORD; ou seja, as linhas individuais dentro da superfície têm a garantia de serem originadas em um limite de 32 bits (DWORD). No entanto, o alinhamento pode ter mais de 32 bits, dependendo das necessidades do hardware.
- Formato empacotado versus formato planar. Os formatos YUV são divididos em formatos empacotados e formatos planares . Em um formato empacotado, os componentes Y, U e V são armazenados em uma única matriz. Os pixels são organizados em grupos de macropixels, cujo layout depende do formato. Em um formato planar, os componentes Y, U e V são armazenados como três planos separados.
Cada um dos formatos YUV descritos neste artigo tem um código FOURCC atribuído. Um código FOURCC é um inteiro sem sinal de 32 bits criado pela concatenação de quatro caracteres ASCII.
- 4:4:4 (32 bpp)
- 4:2:2 (16 bpp)
- 4:2:0 (16 bpp)
- 4:2:0 (12 bpp)
Formatos 4:4:4, 32 Bits por Pixel
AYUV
Um único formato 4:4:4 é recomendado, com o código FOURCC AYUV. Esse é um formato empacotado, em que cada pixel é codificado como quatro bytes consecutivos, organizados na sequência mostrada na ilustração a seguir.
Os bytes marcados como A contêm valores para alfa.
Formatos 4:2:2, 16 Bits por Pixel
Dois formatos 4:2:2 são recomendados, com os seguintes códigos FOURCC:
- YUY2
- UYVY
Ambos são formatos empacotados, em que cada macropixel tem dois pixels codificados como quatro bytes consecutivos. Isso resulta na diminuição horizontal do croma por um fator de dois.
YUY2
No formato YUY2, os dados podem ser tratados como uma matriz de valores char sem sinal, em que o primeiro byte contém o primeiro exemplo Y, o segundo byte contém o primeiro exemplo de U (Cb), o terceiro byte contém o segundo exemplo de Y e o quarto byte contém o primeiro exemplo de V (Cr), conforme mostrado no diagrama a seguir.
Se a imagem for tratada como uma matriz de valores word little-endian, o primeiro WORD conterá o primeiro exemplo Y nos bits menos significativos (LSBs) e o primeiro exemplo U (Cb) nos bits mais significativos (MSBs). O segundo WORD contém o segundo exemplo Y nos LSBs e o primeiro exemplo de V (Cr) nos MSBs.
YUY2 é o formato preferencial de 4:2:2 pixels para a Aceleração de Vídeo DirectX da Microsoft (DirectX VA). Espera-se que seja um requisito de termo intermediário para aceleradores de VA do DirectX que dão suporte ao vídeo 4:2:2.
UYVY
Esse formato é o mesmo que o formato YUY2, exceto que a ordem de bytes é invertida, ou seja, os bytes chroma e luma são invertidos (Figura 4). Se a imagem for tratada como uma matriz de dois valores word little-endian, o primeiro WORD conterá U nos LSBs e Y0 nos MSBs e o segundo WORD conterá V nos LSBs e Y1 nos MSBs.
Formatos 4:2:0, 16 Bits por Pixel
Dois formatos 4:2:0 de 16 bits por pixel (bpp) são recomendados, com os seguintes códigos FOURCC:
- IMC1
- IMC3
Ambos os formatos YUV são formatos planares. Os canais chroma são subamostrados por um fator de dois nas dimensões horizontal e vertical.
IMC1
Todos os exemplos Y aparecem primeiro na memória como uma matriz de valores char sem sinal. Isso é seguido por todas as amostras de V (Cr) e, em seguida, todas as amostras de U (Cb). Os planos V e U têm o mesmo passo que o plano Y, resultando em áreas não usadas de memória, conforme mostrado na Figura 5. Os planos você e V devem iniciar em limites de memória que são um múltiplo de 16 linhas. A Figura 5 mostra a origem de você e V para um quadro de vídeo de 352 x 240. O endereço inicial dos planos você e V é calculado da seguinte maneira:
BYTE* pV = pY + (((Height + 15) & ~15) * Stride);
BYTE* pU = pY + (((((Height * 3) / 2) + 15) & ~15) * Stride);
em que pY é um ponteiro de bytes para o início da matriz de memória, conforme mostrado no diagrama a seguir.
IMC3
Esse formato é idêntico ao IMC1, exceto que os planos você e V são trocados, conforme mostrado no diagrama a seguir.
Formatos 4:2:0, 12 Bits por Pixel
Quatro formatos 4:2:0 12-bpp são recomendados, com os seguintes códigos FOURCC:
- IMC2
- IMC4
- YV12
- NV12
Em todos esses formatos, os canais chroma são subamostrados por um fator de dois nas dimensões horizontal e vertical.
IMC2
Esse formato é o mesmo que IMC1, exceto pela seguinte diferença: as linhas V (Cr) e U (Cb) são intercaladas em limites de meio passo. Em outras palavras, cada linha completa na área do croma começa com uma linha de amostras de V, seguida por uma linha de amostras U que começa no próximo limite de meio passo (Figura 7). Esse layout torna o uso mais eficiente do espaço de endereço do que o IMC1. Ele corta o espaço de endereço chroma pela metade e, portanto, o espaço de endereço total em 25%. Entre os formatos 4:2:0, IMC2 é o segundo formato mais preferencial, depois de NV12. A imagem a seguir ilustra esse processo.
IMC4
Esse formato é idêntico ao IMC2, exceto que as linhas U (Cb) e V (Cr) são trocadas, conforme mostrado na ilustração a seguir.
YV12
Todos os exemplos Y aparecem primeiro na memória como uma matriz de valores char sem sinal. Essa matriz é seguida imediatamente por todos os exemplos de V (Cr). O passo do avião V é metade do passo do avião Y; e o plano V contém metade das linhas que o plano Y. O plano V é seguido imediatamente por todas as amostras U (Cb), com o mesmo passo e número de linhas que o plano V, conforme mostrado na ilustração a seguir.
NV12
Todos os exemplos Y aparecem primeiro na memória como uma matriz de valores char sem sinal com um número par de linhas. O plano Y é seguido imediatamente por uma matriz de valores char sem sinal que contém amostras de U (Cb) e V (Cr) empacotadas. Quando a matriz U-V combinada é tratada como uma matriz de valores word little-endian, os LSBs contêm os valores U e os MSBs contêm os valores V. NV12 é o formato preferencial de 4:2:0 pixels para DirectX VA. Espera-se que seja um requisito de termo intermediário para aceleradores de VA DirectX que dão suporte a vídeo 4:2:0. A ilustração a seguir mostra o plano Y e a matriz que contém exemplos de V e você empacotados.
Conversões de espaço de cor e taxa de amostragem de chroma
Esta seção fornece diretrizes para a conversão entre YUV e RGB e para conversão entre alguns formatos YUV diferentes. Consideramos dois esquemas de codificação RGB nesta seção: RGB de computador de 8 bits, também conhecido como sRGB ou RGB de "escala completa", e RGB de vídeo de estúdio, ou "RGB com sala de cabeça e sala de dedos". Eles são definidos da seguinte maneira:
- O computador RGB usa 8 bits para cada amostra de vermelho, verde e azul. Preto é representado por R = G = B = 0 e branco é representado por R = G = B = 255.
- O vídeo de estúdio RGB usa alguns bits N para cada amostra de vermelho, verde e azul, em que N é 8 ou mais. O vídeo do Studio RGB usa um fator de dimensionamento diferente do computador RGB e tem um deslocamento. Preto é representado por R = G = B = 16*2^(N-8) e branco é representado por R = G = B = 235*2^(N-8). No entanto, os valores reais podem ficar fora desse intervalo.
O vídeo RGB do Studio é a definição RGB preferencial para vídeo no Windows, enquanto o computador RGB é a definição RGB preferencial para aplicativos que não são de vídeo. Em qualquer forma de RGB, as coordenadas de cromática são conforme especificado em ITU-R BT.709 para a definição das primárias de cor RGB. As coordenadas (x,y) de R, G e B são (0,64, 0,33), (0,30, 0,60) e (0,15, 0,06), respectivamente. O branco de referência é D65 com coordenadas (0,3127, 0,3290). O gama nominal é 1/0,45 (aproximadamente 2,2), com gama precisa definida em detalhes em ITU-R BT.709.
Conversão entre RGB e 4:4:4 YUV
Primeiro, descrevemos a conversão entre RGB e 4:4:4 YUV. Para converter 4:2:0 ou 4:2:2 YUV em RGB, recomendamos converter os dados YUV em 4:4:4 YUV e converter de 4:4:4 YUV para RGB. O formato AYUV, que é um formato 4:4:4, usa 8 bits cada para os exemplos de Y, U e V. O YUV também pode ser definido usando mais de 8 bits por exemplo para alguns aplicativos.
Duas conversões DE YUV dominantes de RGB foram definidas para vídeo digital. Ambos se baseiam na especificação conhecida como RECOMENDAÇÃO DE ITU-R BT.709. A primeira conversão é o formulário YUV mais antigo definido para uso de 50 Hz em BT.709. É o mesmo que a relação especificada na Recomendação DE ITU-R BT.601, também conhecida pelo nome mais antigo, CCIR 601. Ele deve ser considerado o formato YUV preferencial para resolução de TV de definição padrão (720 x 576) e vídeo de resolução inferior. Ela é caracterizada pelos valores de duas constantes Kr e Kb:
Kr = 0.299
Kb = 0.114
A segunda conversão é o formulário YUV mais recente definido para uso de 60 Hz no BT.709 e deve ser considerado o formato preferencial para resoluções de vídeo acima da SDTV. Ela é caracterizada por valores diferentes para essas duas constantes:
Kr = 0.2126
Kb = 0.0722
A conversão de RGB para YUV é definida começando com o seguinte:
L = Kr * R + Kb * B + (1 - Kr - Kb) * G
Os valores YUV são obtidos da seguinte maneira:
Y = floor(2^(M-8) * (219*(L-Z)/S + 16) + 0.5)
U = clip3(0, (2^M)-1, floor(2^(M-8) * (112*(B-L) / ((1-Kb)*S) + 128) + 0.5))
V = clip3(0, (2^M)-1, floor(2^(M-8) * (112*(R-L) / ((1-Kr)*S) + 128) + 0.5))
onde
- M é o número de bits por amostra YUV (M >= 8).
- Z é a variável de nível preto. Para o computador RGB, Z é igual a 0. Para o vídeo de estúdio RGB, Z é igual a 16*2^(N-8), em que N é o número de bits por amostra RGB (N >= 8).
- S é a variável de dimensionamento. Para o computador RGB, S é igual a 255. Para o vídeo de estúdio RGB, S é igual a 219*2^(N-8).
A função floor(x) retorna o maior inteiro menor ou igual a x. A função clip3(x, y, z) é definida da seguinte maneira:
clip3(x, y, z) = ((z < x) ? x : ((z > y) ? y : z))
Observação
Clip3 deve ser implementado como uma função em vez de uma macro de pré-processador; caso contrário, ocorrerão várias avaliações dos argumentos.
O exemplo Y representa brilho e os exemplos de você e V representam os desvios de cor para azul e vermelho, respectivamente. O intervalo nominal para Y é 16*2^(M-8) a 235*2^(M-8). Preto é representado como 16*2^(M-8) e branco é representado como 235*2^(M-8). O intervalo nominal para você e V é 16*2^(M-8) a 240*2^(M-8), com o valor 128*2^(M-8) representando croma neutro. No entanto, os valores reais podem ficar fora desses intervalos.
Para dados de entrada na forma de vídeo RGB de estúdio, a operação de clipe é necessária para manter os valores de você e V dentro do intervalo de 0 a (2^M)-1. Se a entrada for RGB do computador, a operação de clipe não será necessária, pois a fórmula de conversão não pode produzir valores fora desse intervalo.
Essas são as fórmulas exatas sem aproximação. Tudo o que se segue neste documento é derivado dessas fórmulas. Esta seção descreve as seguintes conversões:
- Convertendo RGB888 em YUV 4:4:4
- Convertendo YUV de 8 bits em RGB888
- Convertendo 4:2:0 YUV em 4:2:2 YUV
- Convertendo 4:2:2 YUV em 4:4:4 YUV
- Convertendo 4:2:0 YUV em 4:4:4 YUV
Convertendo RGB888 em YUV 4:4:4
No caso da entrada RGB do computador e da saída DE YUV BT.601 de 8 bits, acreditamos que as fórmulas fornecidas na seção anterior podem ser razoavelmente aproximadas pelo seguinte:
Y = ( ( 66 * R + 129 * G + 25 * B + 128) >> 8) + 16
U = ( ( -38 * R - 74 * G + 112 * B + 128) >> 8) + 128
V = ( ( 112 * R - 94 * G - 18 * B + 128) >> 8) + 128
Essas fórmulas produzem resultados de 8 bits usando coeficientes que não exigem mais de 8 bits de precisão (sem sinal). Os resultados intermediários exigirão até 16 bits de precisão.
Convertendo YUV de 8 bits em RGB888
Nas fórmulas RGB para YUV originais, é possível derivar as relações a seguir para BT.601.
Y = round( 0.256788 * R + 0.504129 * G + 0.097906 * B) + 16
U = round(-0.148223 * R - 0.290993 * G + 0.439216 * B) + 128
V = round( 0.439216 * R - 0.367788 * G - 0.071427 * B) + 128
Portanto, considerando:
C = Y - 16
D = U - 128
E = V - 128
as fórmulas para converter YUV em RGB podem ser derivadas da seguinte maneira:
R = clip( round( 1.164383 * C + 1.596027 * E ) )
G = clip( round( 1.164383 * C - (0.391762 * D) - (0.812968 * E) ) )
B = clip( round( 1.164383 * C + 2.017232 * D ) )
em que clip()
denota o recorte para um intervalo de [0,.255]. Acreditamos que essas fórmulas podem ser razoavelmente aproximadas pelo seguinte:
R = clip(( 298 * C + 409 * E + 128) >> 8)
G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8)
B = clip(( 298 * C + 516 * D + 128) >> 8)
Essas fórmulas usam alguns coeficientes que exigem mais de 8 bits de precisão para produzir cada resultado de 8 bits, e os resultados intermediários exigirão mais de 16 bits de precisão.
Para converter 4:2:0 ou 4:2:2 YUV em RGB, recomendamos converter os dados YUV em 4:4:4 YUV e converter de 4:4:4 YUV para RGB. As seções a seguir apresentam alguns métodos para converter os formatos 4:2:0 e 4:2:2 para 4:4:4.
Convertendo 4:2:0 YUV em 4:2:2 YUV
Converter 4:2:0 YUV em 4:2:2 YUV requer upconversion vertical por um fator de dois. Esta seção descreve um método de exemplo para executar a upconversion. O método pressupõe que as imagens de vídeo são uma verificação progressiva.
Observação
O processo de conversão de verificação entrelaçada 4:2:0 a 4:2:2 apresenta problemas atípicos e é difícil de implementar. Este artigo não aborda o problema de conversão da verificação entrelaçada de 4:2:0 para 4:2:2.
Permitir que cada linha vertical de exemplos de chroma de entrada seja uma matriz Cin[]
que varia de 0 a N a 1. A linha vertical correspondente na imagem de saída será uma matriz Cout[]
que varia de 0 a 2N a 1. Para converter cada linha vertical, execute o seguinte processo:
Cout[0] = Cin[0];
Cout[1] = clip((9 * (Cin[0] + Cin[1]) - (Cin[0] + Cin[2]) + 8) >> 4);
Cout[2] = Cin[1];
Cout[3] = clip((9 * (Cin[1] + Cin[2]) - (Cin[0] + Cin[3]) + 8) >> 4);
Cout[4] = Cin[2]
Cout[5] = clip((9 * (Cin[2] + Cin[3]) - (Cin[1] + Cin[4]) + 8) >> 4);
...
Cout[2*i] = Cin[i]
Cout[2*i+1] = clip((9 * (Cin[i] + Cin[i+1]) - (Cin[i-1] + Cin[i+2]) + 8) >> 4);
...
Cout[2*N-3] = clip((9 * (Cin[N-2] + Cin[N-1]) - (Cin[N-3] + Cin[N-1]) + 8) >> 4);
Cout[2*N-2] = Cin[N-1];
Cout[2*N-1] = clip((9 * (Cin[N-1] + Cin[N-1]) - (Cin[N-2] + Cin[N-1]) + 8) >> 4);
em que clip() indica recorte para um intervalo de [0..255].
Observação
As equações para lidar com as bordas podem ser matematicamente simplificadas. Eles são mostrados nesta forma para ilustrar o efeito de fixação nas bordas da imagem.
Na verdade, esse método calcula cada valor ausente interpolando a curva sobre os quatro pixels adjacentes, ponderado em direção aos valores dos dois pixels mais próximos (Figura 11). O método de interpolação específico usado neste exemplo gera amostras ausentes em posições de meio inteiro usando um método conhecido chamado interpolação Catmull-Rom, também conhecido como interpolação de convolução cúbica.
Em termos de processamento de sinal, a upconversion vertical deve incluir idealmente uma compensação de turno de fase para considerar o deslocamento vertical de meio pixel (em relação à grade de amostragem de saída 4:2:2) entre os locais das linhas de exemplo 4:2:0 e o local de cada outra linha de exemplo 4:2:2. No entanto, a introdução desse deslocamento aumentaria a quantidade de processamento necessária para gerar as amostras e tornaria impossível reconstruir as amostras originais 4:2:0 da imagem 4:2:2. Também tornaria impossível decodificar o vídeo diretamente em superfícies 4:2:2 e, em seguida, usar essas superfícies como imagens de referência para decodificar imagens subsequentes no fluxo. Portanto, o método fornecido aqui não leva em conta o alinhamento vertical preciso dos exemplos. Fazer isso provavelmente não é visualmente prejudicial em resoluções de imagem razoavelmente altas.
Se você começar com o vídeo 4:2:0 que usa a grade de amostragem definida em H.261, Vídeo H.263 ou MPEG-1, a fase das amostras de chroma de saída 4:2:2 também será deslocada por um deslocamento horizontal de meio pixel em relação ao espaçamento na grade de amostragem de luma (um deslocamento de um quarto de pixel em relação ao espaçamento da grade de amostragem de croma 4:2:2). No entanto, a forma MPEG-2 de vídeo 4:2:0 provavelmente é mais usada em computadores e não sofre desse problema. Além disso, a distinção provavelmente não é visualmente prejudicial em resoluções de imagem razoavelmente altas. Tentar corrigir esse problema criaria o mesmo tipo de problemas discutidos para o deslocamento de fase vertical.
Convertendo 4:2:2 YUV em 4:4:4 YUV
Converter 4:2:2 YUV em 4:4:4 YUV requer upconversion horizontal por um fator de dois. O método descrito anteriormente para upconversion vertical também pode ser aplicado ao upconversion horizontal. Para o vídeo MPEG-2 e ITU-R BT.601, esse método produzirá amostras com o alinhamento de fase correto.
Convertendo 4:2:0 YUV em 4:4:4 YUV
Para converter 4:2:0 YUV em 4:4:4 YUV, basta seguir os dois métodos descritos anteriormente. Converta a imagem 4:2:0 em 4:2:2 e converta a imagem 4:2:2 em 4:4:4. Você também pode alternar a ordem dos dois processos de upconversion, pois a ordem da operação realmente não importa para a qualidade visual do resultado.
Outros formatos YUV
Alguns outros formatos YUV menos comuns incluem o seguinte:
- AI44 é um formato YUV palettizado com 8 bits por exemplo. Cada exemplo contém um índice nos 4 bits mais significativos (MSBs) e um valor alfa nos 4 bits menos significativos (LSBs). O índice refere-se a uma matriz de entradas de paleta YUV, que devem ser definidas no tipo de mídia para o formato. Esse formato é usado principalmente para imagens de subpictura.
- NV11 é um formato planar 4:1:1 com 12 bits por pixel. Os exemplos Y aparecem primeiro na memória. O plano Y é seguido por uma matriz de amostras de U (Cb) e V (Cr) empacotadas. Quando a matriz U-V combinada é endereçada como uma matriz de valores WORD little-endian, os exemplos de U estão contidos nos LSBs de cada WORD e os exemplos de V estão contidos nos MSBs. (Esse layout de memória é semelhante ao NV12, embora a amostragem de chroma seja diferente.)
- Y41P é um formato empacotado 4:1:1, com você e V amostrados a cada quarto pixel horizontalmente. Cada macropixel contém 8 pixels em três bytes, com o seguinte layout de byte:
U0 Y0 V0 Y1 U4 Y2 V4 Y3 Y4 Y5 Y6 Y7
- Y41T é idêntico ao Y41P, exceto que o bit menos significativo de cada amostra Y especifica a chave de croma (0 = transparente, 1 = opaco).
- Y42T é idêntico ao UYVY, exceto que o bit menos significativo de cada amostra Y especifica a chave de croma (0 = transparente, 1 = opaco).
- YVYU é equivalente a YUYV, exceto que os exemplos de você e V são trocados.
Identificando formatos YUV no Media Foundation
Cada um dos formatos YUV descritos neste artigo tem um código FOURCC atribuído. Um código FOURCC é um inteiro sem sinal de 32 bits criado pela concatenação de quatro caracteres ASCII.
Há várias macros C/C++ que facilitam a declaração de valores FOURCC no código-fonte. Por exemplo, a macro MAKEFOURCC é declarada em Mmsystem.h e a macro FCC é declarada em Aviriff.h. Use-os da seguinte maneira:
DWORD fccYUY2 = MAKEFOURCC('Y','U','Y','2');
DWORD fccYUY2 = FCC('YUY2');
Você também pode declarar um código FOURCC diretamente como um literal de cadeia de caracteres simplesmente invertendo a ordem dos caracteres. Por exemplo:
DWORD fccYUY2 = '2YUY'; // Declares the FOURCC 'YUY2'
A reversão da ordem é necessária porque o sistema operacional Windows usa uma arquitetura little-endian. 'Y' = 0x59, 'U' = 0x55 e '2' = 0x32, então '2YUY' é 0x32595559.
No Media Foundation, os formatos são identificados por um GUID de tipo principal e um GUID de subtipo. O tipo principal para formatos de vídeo de computador é sempre MFMediaType_Video . O subtipo pode ser construído mapeando o código FOURCC para um GUID, da seguinte maneira:
XXXXXXXX-0000-0010-8000-00AA00389B71
em que XXXXXXXX
é o código FOURCC. Portanto, o GUID do subtipo para YUY2 é:
32595559-0000-0010-8000-00AA00389B71
As constantes para os GUIDs de formato YUV mais comuns são definidas no arquivo de cabeçalho mfapi.h. Para obter uma lista dessas constantes, consulte GUIDs de subtipo de vídeo.
Tópicos relacionados