Partilhar via


Formatos YUV de 8 bits recomendados para renderização de vídeo

Gary Sullivan e Stephen Estrop

Corporação Microsoft

Abril de 2002, atualizado em novembro de 2008

Este tópico descreve os formatos de cores YUV de 8 bits recomendados para renderização de vídeo no sistema operacional Windows. Este artigo apresenta técnicas para converter entre formatos YUV e RGB e também fornece técnicas para sobreamostragem de formatos YUV. Este artigo destina-se a qualquer pessoa que trabalhe com decodificação ou renderização de vídeo YUV no Windows.

Introdução

Inúmeros formatos YUV são definidos em toda a indústria de vídeo. Este artigo identifica os formatos YUV de 8 bits recomendados para renderização de vídeo no Windows. Os fornecedores de descodificadores e de visualização são incentivados a suportar os formatos descritos neste artigo. Este artigo não aborda outros usos da cor YUV, como a fotografia fixa.

Todos 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 usam 8 bits por amostra para codificar cada amostra de cromo U ou V. No entanto, a maioria dos formatos YUV usa menos de 24 bits por pixel em média, porque contém menos amostras de U e V do que de Y. Este artigo não abrange formatos YUV com canais Y de 10 bits ou superiores.

Observação

Para efeitos do presente artigo, o termo U é equivalente a Cb e o termo V é equivalente a Cr.

 

Este artigo aborda os seguintes tópicos:

Amostragem YUV

Os canais Chroma podem ter uma taxa de amostragem mais baixa do que o canal luma, sem qualquer perda dramática de qualidade percetiva. Uma notação chamada "A:B:C" é usada para descrever com que frequência U e V são amostrados em relação a Y.

  • 4:4:4 significa que não existe redução da resolução dos canais de cor.
  • 4:2:2 significa uma redução horizontal de amostragem de 2:1, sem redução vertical de amostragem. Cada linha de varredura contém quatro amostras Y para cada duas amostras de U ou V.
  • 4:2:0 significa amostragem reduzida horizontal de 2:1, com amostragem reduzida vertical de 2:1.
  • 4:1:1 significa subamostragem horizontal 4:1, sem subamostragem vertical. Cada linha de varredura contém quatro amostras Y para cada amostra U 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 chroma é amostrado para cada uma das taxas de redução de amostragem. As amostras de Luma são representadas por uma cruz, e as amostras de cromo são representadas por um círculo.

figura 1 de amostragem de croma

A forma dominante de amostragem 4:2:2 é definida na Recomendação BT.601 ITU-R. Existem duas variantes comuns de amostragem 4:2:0. Um deles é usado em vídeo MPEG-2, e o outro é usado em MPEG-1 e em ITU-T recomendações 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 esta razão, o esquema MPEG-2 é preferido no Windows, e deve ser considerado a interpretação padrão de formatos 4:2:0.

Definições de superfície

Esta seção descreve os formatos YUV de 8 bits recomendados para renderização de vídeo. Estas dividem-se em várias categorias:

Primeiro, você deve estar ciente dos seguintes conceitos, a fim de 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.
  • Stride. A passada de uma superfície, às vezes chamada de pitch, é a largura da superfície em bytes. Dada uma origem na 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 gráfica. A superfície deve estar sempre alinhada com DWORD; ou seja, linhas individuais dentro da superfície têm a garantia de se originar em um limite de 32 bits (DWORD). O alinhamento pode ser maior que 32 bits, no entanto, dependendo das necessidades do hardware.
  • Formato compactado versus formato plano. Os formatos YUV são divididos em formatos agregados e formatos planares. Em um formato compactado, 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 plano, 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 não assinado de 32 bits que é criado concatenando quatro caracteres ASCII.

Formatos 4:4:4, 32 bits por pixel

AYUV

Recomenda-se um único formato 4:4:4, com o código FOURCC AYUV. Este é um formato compactado, onde cada pixel é codificado como quatro bytes consecutivos, organizados na sequência mostrada na ilustração a seguir.

Figura 2. Ayuv Memory Layout

Os bytes marcados com 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 compactados, onde cada macropixel é de dois pixels codificados como quatro bytes consecutivos. Isso resulta na redução horizontal da amostragem do cromo por um fator de dois.

YUY2

No formato YUY2, os dados podem ser tratados como uma matriz de valores de de caracteres não assinados, onde o primeiro byte contém a primeira amostra Y, o segundo byte contém a primeira amostra U (Cb), o terceiro byte contém a segunda amostra Y e o quarto byte contém a primeira amostra V (Cr), conforme mostrado no diagrama a seguir.

figura 3. Layout de memória Yuy2

Se a imagem for tratada como uma matriz de valores WORD em formato little-endian, o primeiro WORD conterá a primeira amostra de Y nos bits menos significativos (LSBs) e a primeira amostra de U (Cb) nos bits mais significativos (MSBs). O segundo WORD contém a segunda amostra Y nos LSBs e a primeira amostra V (Cr) nos MSBs.

YUY2 é o formato de pixel 4:2:2 preferido para o Microsoft DirectX Video Acceleration (DirectX VA). Espera-se que seja um requisito de médio prazo para aceleradores DirectX VA que suportam 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 endereçada como uma matriz de dois valores little-endian WORD, o primeiro WORD contém U nos LSBs e Y0 nos MSBs, e o segundo WORD contém V nos LSBs e Y1 nos MSBs.

figura 4. Layout de memória Uyvy

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 cromados são subamostrados por um fator de dois nas dimensões horizontal e vertical.

IMC1

Todas as amostras Y aparecem inicialmente na memória como uma matriz de valores de tipo char de não assinados. Isto é seguido por todas as amostras V (Cr) e, em seguida, todas as amostras U (Cb). Os planos V e U têm o mesmo tamanho do passo que o plano Y, o que resulta em áreas de memória não utilizadas, como mostra a Figura 5. Os planos U e V devem começar em limites de memória que são um múltiplo de 16 linhas. A Figura 5 mostra a origem de U e V para um frame de vídeo de 352 x 240. O endereço inicial dos planos u e V é calculado da seguinte forma:

BYTE* pV = pY + (((Height + 15) & ~15) * Stride);
BYTE* pU = pY + (((((Height * 3) / 2) + 15) & ~15) * Stride);

onde pY é um ponteiro de byte para o início da matriz de memória, conforme mostrado no diagrama a seguir.

figura 5. Layout de memória IMC1 (exemplo)

IMC3

Este formato é idêntico ao IMC1, exceto que os planos u e V são trocados, conforme mostrado no diagrama a seguir.

figura 6. Layout de memória IMC3

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 estes formatos, os canais chroma são subamostrados por um fator de dois nas dimensões horizontal e vertical.

IMC2

Este 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 de passada completa na área do cromo começa com uma linha de amostras de V, seguida por uma linha de amostras de U que começa no próximo limite de meia passada (Figura 7). Este layout faz um uso mais eficiente do espaço de endereçamento do que o IMC1. Ele corta o espaço de endereçamento cromado pela metade e, portanto, o espaço de endereçamento total em 25%. Entre os formatos 4:2:0, o IMC2 é o segundo formato preferido, depois do NV12. A imagem seguinte ilustra este processo.

figura 7. Layout de memória IMC2

IMC4

Este formato é idêntico ao IMC2, exceto que as linhas U (Cb) e V (Cr) são trocadas, conforme mostrado na ilustração a seguir.

figura 8. Layout de memória IMC4

YV12

Todas as amostras Y aparecem primeiro na memória como uma matriz de valores de de caracteres não assinados. Esta matriz é seguida imediatamente por todas as amostras de V (Cr). A passada do plano V é metade da passada do plano Y; e o plano V contém metade das linhas do plano Y. O plano V é seguido imediatamente por todas as amostras de U (Cb), com o mesmo intervalo e número de linhas que o plano V, como mostrado na ilustração a seguir.

figura 9. Layout de memória YV12

NV12

Todas as amostras Y aparecem primeiro na memória como um array de caracteres não assinados de valores com um número par de linhas. O plano Y é imediatamente seguido por uma matriz de valores de caractere não assinado que contém amostras compactadas de U (Cb) e V (Cr). Quando a matriz U-V combinada é endereçada como uma matriz de valores little-endian de WORD, os LSBs contêm os valores U e os MSBs contêm os valores V. NV12 é o formato de pixel 4:2:0 preferido para DirectX VA. Espera-se que seja um requisito de prazo intermediário para aceleradores DirectX VA que suportam vídeo 4:2:0. A ilustração a seguir mostra o plano Y e a matriz que contém amostras compactadas de U e V.

figura 10. Layout de memória NV12

Espaço de cores e conversões de taxa de amostragem de croma

Esta seção fornece diretrizes para converter entre YUV e RGB, e para converter entre alguns formatos YUV diferentes. Consideramos dois esquemas de codificação RGB nesta seção: computador de 8 bits RGB, também conhecido como sRGB ou RGB "full-scale", e vídeo de estúdio RGB, ou "RGB com espaço para a cabeça e para os dedos". Estes são definidos do seguinte modo:

  • O RGB do computador usa 8 bits para cada amostra de vermelho, verde e azul. O preto é representado por R = G = B = 0, e o branco é representado por R = G = B = 255.
  • O vídeo de estúdio RGB usa algum número de bits N para cada amostra de vermelho, verde e azul, onde N é 8 ou mais. O RGB de vídeo de estúdio usa um fator de escala diferente do RGB do computador e tem um deslocamento. O preto é representado por R = G = B = 16*2^(N-8), e o branco é representado por R = G = B = 235*2^(N-8). No entanto, os valores reais podem estar fora deste intervalo.

O RGB de vídeo de estúdio é a definição RGB preferida para vídeo no Windows, enquanto o RGB do computador é a definição RGB preferida para aplicações que não sejam de vídeo. Em qualquer forma de RGB, as coordenadas cromáticas são as especificadas no ITU-R BT.709 para a definição das cores primárias 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. A referência branca é D65 com coordenadas (0,3127, 0,3290). A gama nominal é de 1/0,45 (aproximadamente 2,2), com gama precisa definida em detalhe no 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 para RGB, recomendamos converter os dados YUV para 4:4:4 YUV e, em seguida, converter de 4:4:4 YUV para RGB. O formato ANYUV, que é um formato 4:4:4, usa 8 bits cada para as amostras Y, U e V. YUV também pode ser definido usando mais de 8 bits por amostra para algumas aplicações.

Duas conversões YUV dominantes de RGB foram definidas para vídeo digital. Ambos se baseiam na especificação denominada Recomendação BT.709 ITU-R. A primeira conversão é o formato YUV mais antigo definido na norma BT.709 para uso a 50 Hz. É a mesma relação especificada na Recomendação ITU-R BT.601, também conhecida pelo seu nome mais antigo, CCIR 601. Deve ser considerado o formato YUV preferido para resolução de TV de definição padrão (720 x 576) e vídeo de baixa resolução. Caracteriza-se pelos valores de duas constantes Kr e Kb:

Kr = 0.299
Kb = 0.114

A segunda conversão é a forma YUV mais recente, definida para uso a 60 Hz em BT.709, e deve ser considerada o formato preferido para resoluções de vídeo acima de SDTV. É caracterizada por valores diferentes para estas 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 então obtidos da seguinte forma:

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 computador RGB, Z é igual a 0. Para vídeo de estúdio RGB, Z é igual a 16*2^(N-8), onde N é o número de bits por amostra RGB (N >= 8).
  • S é a variável de escala. Para computador RGB, S é igual a 255. Para 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 forma:

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.

 

A amostra Y representa o brilho e as amostras U e V representam os desvios de cor em direção ao azul e ao vermelho, respectivamente. O intervalo nominal para Y é de 16*2^(M-8) a 235*2^(M-8). O preto é representado como 16*2^(M-8), e o branco é representado como 235*2^(M-8). O intervalo nominal para U e V é de 16*2^(M-8) a 240*2^(M-8), com o valor 128*2^(M-8) representando crominância neutra. No entanto, os valores reais podem estar fora destes intervalos.

Para dados de entrada na forma de vídeo de estúdio RGB, a operação de clipe é necessária para manter os valores U e V dentro do intervalo de 0 a (2^M)-1. Se a entrada do computador for RGB, a operação de recorte não será necessária, porque a fórmula de conversão não pode produzir valores fora deste intervalo.

Estas são as fórmulas exatas sem aproximação. Tudo o que se segue neste documento deriva destas fórmulas. Esta seção descreve as seguintes conversões:

Convertendo RGB888 para YUV 4:4:4

No caso da entrada RGB do computador e da saída BT.601 YUV de 8 bits, acreditamos que as fórmulas dadas 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 requerem mais de 8 bits de precisão sem sinal. Resultados intermediários exigirão até 16 bits de precisão.

Convertendo YUV de 8 bits para RGB888

A partir das fórmulas RGB-to-YUV originais, pode-se derivar as seguintes relações 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, dado:

C = Y - 16
D = U - 128
E = V - 128

as fórmulas para converter YUV para RGB podem ser derivadas da seguinte forma:

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                   ) )

onde clip() denota clipping dentro do intervalo de [0..255]. Acreditamos que estas 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 para RGB, recomendamos converter os dados YUV para 4:4:4 YUV e, em seguida, 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 para 4:2:2 YUV

A conversão de 4:2:0 YUV para 4:2:2 YUV requer uma elevação vertical por um fator de dois. Esta seção descreve um exemplo de método para executar a conversão ascendente. O método assume que as imagens de vídeo são de varrimento progressivo.

Observação

O processo de conversão de varredura entrelaçada 4:2:0 a 4:2:2 apresenta problemas atípicos e é difícil de implementar. Este artigo não aborda a questão da conversão do scan entrelaçado de 4:2:0 para 4:2:2.

 

Deixe que cada linha vertical de amostras de cromo de entrada seja uma matriz Cin[] que varia de 0 a N - 1. A linha vertical correspondente na imagem de saída será uma matriz Cout[] que varia de 0 a 2N - 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);

onde clip() denota a limitação ao intervalo de [0..255].

Observação

As equações para manusear as arestas podem ser matematicamente simplificadas. Eles são mostrados nesta forma para ilustrar o efeito de fixação nas bordas da imagem.

 

Com efeito, este método calcula cada valor em falta interpolando a curva sobre os quatro píxeis adjacentes, ponderados em relação aos valores dos dois píxeis mais próximos (Figura 11). O método de interpolação específico usado neste exemplo gera amostras ausentes em posições semiinteiras usando um método bem conhecido chamado interpolação Catmull-Rom, também conhecido como interpolação de convolução cúbica.

figura 11. diagrama mostrando a sobreamostragem de 4:2:0 para 4:2:2

Em termos de processamento de sinal, a conversão vertical deve idealmente incluir uma compensação de deslocamento de fase para levar em conta o deslocamento vertical de meio pixel (em relação à grade de amostragem de saída 4:2:2) entre os locais das linhas de amostra 4:2:0 e a localização de todas as outras linhas de amostra 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 4:2:0 originais a partir da imagem 4:2:2 com maior resolução. Também tornaria impossível decodificar 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. Por conseguinte, o método aqui apresentado não tem em conta o alinhamento vertical preciso das amostras. Fazer isso provavelmente não é visualmente prejudicial em resoluções de imagem razoavelmente altas.

Se você começar com vídeo 4:2:0 que usa a grade de amostragem definida em vídeo H.261, H.263 ou MPEG-1, a fase das amostras de chroma 4:2:2 de saída também será deslocada por um deslocamento horizontal de meio pixel em relação ao espaçamento na grade de amostragem luma (um deslocamento de quarto de pixel em relação ao espaçamento da grade de amostragem de cromo 4:2:2). No entanto, a forma MPEG-2 de vídeo 4:2:0 é provavelmente mais comumente usado em PCs e não sofre deste 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 para 4:4:4 YUV

A conversão de 4:2:2 YUV para 4:4:4 YUV requer um aumento na resolução horizontal por um fator de dois. O método descrito anteriormente para a conversão vertical também pode ser aplicado à conversão ascendente horizontal. Para vídeo MPEG-2 e ITU-R BT.601, este método produzirá amostras com o alinhamento de fase correto.

Convertendo 4:2:0 YUV para 4:4:4 YUV

Para converter 4:2:0 YUV para 4:4:4 YUV, você pode simplesmente seguir os dois métodos descritos anteriormente. Converta a imagem 4:2:0 em 4:2:2 e, em seguida, converta a imagem 4:2:2 em 4:4:4. Você também pode mudar a ordem dos dois processos de conversão para cima, pois a ordem de operação não importa realmente para a qualidade visual do resultado.

Outros formatos YUV

Alguns outros formatos YUV menos comuns incluem o seguinte:

  • AI44 é um formato YUV paletizado com 8 bits por amostra. Cada amostra 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 da paleta YUV, que deve estar definida no tipo de media para o formato. Este formato é usado principalmente para imagens de subimagem.
  • NV11 é um formato planar 4:1:1 com 12 bits por pixel. As amostras Y aparecem primeiro na memória. O plano Y é seguido por um conjunto de amostras compactadas de U (Cb) e V (Cr). Quando a matriz combinada U-V é endereçada como uma matriz de valores de WORD em formato little-endian, as amostras U estão contidas nos bits menos significativos (LSBs) de cada WORD, e as amostras V estão contidas nos bits mais significativos (MSBs). (Este layout de memória é semelhante ao NV12, embora a amostragem de cromo seja diferente.)
  • O Y41P é um formato empacotado de 4:1:1, com os componentes U e V amostrados a cada quarto pixel de forma horizontal. Cada macropixel contém 8 pixels em três bytes, com o seguinte layout de bytes: U0 Y0 V0 Y1 U4 Y2 V4 Y3 Y4 Y5 Y6 Y7
  • Y41T é idêntico ao Y41P, exceto o bit menos significativo de cada amostra Y especifica o chroma key (0 = transparente, 1 = opaco).
  • Y42T é idêntico ao UYVY, exceto o bit menos significativo de cada amostra Y especifica o chroma key (0 = transparente, 1 = opaco).
  • YVYU é equivalente a YUYV, exceto que as amostras u e V são trocadas.

Identificando os 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 não assinado de 32 bits que é criado concatenando quatro caracteres ASCII.

Existem 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 forma:

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'

É necessário inverter a ordem porque o sistema operativo Windows utiliza 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 principal tipo 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 

onde XXXXXXXX é o código FOURCC. Assim, 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 .

Sobre o Vídeo YUV

Tipos de Média de Vídeo