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

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.

figura 1. amostragem de chroma

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:

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.

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.

figura 2. layout de memória ayuv

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.

figura 3. layout de memória yuy2

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.

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

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

IMC3

Esse formato é idêntico ao IMC1, exceto que os planos você 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 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.

figura 7. Layout de memória imc2

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.

figura 8. Layout de memória imc4

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.

figura 9. Layout de memória yv12

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.

figura 10. Layout de memória nv12

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

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.

figura 11. diagrama mostrando 4:2:0 a 4:2:2 upsampling

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.

Sobre o vídeo YUV

Tipos de mídia de vídeo