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 decodificação ou renderização de vídeo YUV em Windows.

Introdução

Vários 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 em 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 local de pixel para codificar o canal Y (também chamado de canal luma) e usam 8 bits por exemplo para codificar cada exemplo de croma 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 de croma.
  • 4:2:2 significa 2:1 downsampling horizontal, sem downsampling vertical. Cada linha de verificação contém quatro amostras 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 Y para cada exemplo de você e V. A amostragem 4:1:1 é menos comum que outros formatos e não é discutida detalhadamente neste artigo.

Os diagramas a seguir mostram como o croma é amostrado para cada uma das taxas de downsampling. Os exemplos de Luma são representados por uma cruz e os exemplos de croma são representados por um círculo.

figure 1. chroma sampling

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 no 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 formatos 4:2:2 e 4:4:4. Por esse motivo, o esquema MPEG-2 é preferencial em Windows e deve ser considerado a interpretação padrão de 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 elementos 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 se originar em um limite de 32 bits (DWORD). No entanto, o alinhamento pode ser maior que 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 Formatos, 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.

figure 2. ayuv memory layout

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 de caractere não assinados, em que o primeiro byte contém o primeiro exemplo de Y, o segundo byte contém o primeiro exemplo de U (Cb), o terceiro byte contém o segundo exemplo Y e o quarto byte contém o primeiro exemplo de V (Cr), conforme mostrado no diagrama a seguir.

figure 3. yuy2 memory layout

Se a imagem for endereçada como uma matriz de valores WORD pouco endianos, 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 o Microsoft DirectX Video Acceleration (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:2.

UYVY

Esse formato é o mesmo que o formato YUY2, exceto que a ordem de bytes é invertida, ou seja, os bytes de croma e luma são invertidos (Figura 4). Se a imagem for endereçada como uma matriz de dois valores word little-endian, 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.

figure 4. uyvy memory layout

Formatos 4:2:0, 16 Bits por Pixel

Dois formatos de 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 planar. Os canais de croma são subsamplados 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 de caracteres não assinados. Isso é seguido por todos os exemplos de V (Cr) e, em seguida, todos os exemplos de U (Cb). Os aviões 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 começar nos limites de memória que são várias de 16 linhas. A Figura 5 mostra a origem de você e V para um quadro de vídeo 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);

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

figure 5. imc1 memory layout (example)

IMC3

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

figure 6. imc3 memory layout

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 de croma são subsampados 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 de passo completo na área de chroma começa com uma linha de amostras V, seguida por uma linha de amostras de U que começa no próximo limite de meio passo (Figura 7). Esse layout faz 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.

figure 7. imc2 memory layout

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.

figure 8. imc4 memory layout

YV12

Todos os exemplos Y aparecem primeiro na memória como uma matriz de valores de caracteres não assinados. Essa matriz é seguida imediatamente por todos os exemplos de V (Cr). O passo do avião V é metade do passo do plano Y; e o plano V contém metade das linhas que o plano Y. O plano V é seguido imediatamente por todos os exemplos de U (Cb), com o mesmo passo e número de linhas que o plano V, conforme mostrado na ilustração a seguir.

figure 9. yv12 memory layout

NV12

Todos os exemplos Y aparecem primeiro na memória como uma matriz de valores de caracteres não assinados com um número par de linhas. O plano Y é seguido imediatamente por uma matriz de valores de caracteres não assinados que contém amostras de U (Cb) e V (Cr) empacotados. Quando a matriz U-V combinada é tratada como uma matriz de valores WORD de 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 o DirectX VA. Espera-se que seja um requisito de termo intermediário para aceleradores de VA DirectX que dão suporte ao 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.

figure 10. nv12 memory layout

Conversões de taxa de amostragem de espaço de cores e 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 "em grande escala" e vídeo de estúdio RGB, ou "RGB com espaço na cabeça e sala dos 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 exemplo de vermelho, verde e azul, onde N é 8 ou mais. O vídeo de estúdio 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 de estúdio RGB é a definição RGB preferencial para vídeo em Windows, enquanto o computador RGB é a definição RGB preferida 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 cores 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 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 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 as amostras 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 no 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 do 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 exemplo 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), onde 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).

O piso(x) da função retorna o maior inteiro menor ou igual a x. O clip3(x, y, z) da função é definido 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 é de 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 de estúdio RGB, 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.

Estas 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 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 do que 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 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 em RGB. As seções a seguir apresentam alguns métodos para converter formatos 4:2:0 e 4:2:2 para 4:4:4.

Convertendo YUV 4:2:0 em 4:2:2 YUV

Converter 4:2:0 YUV em 4:2:2 YUV requer a upconversion vertical por um fator de dois. Esta seção descreve um método de exemplo para executar o 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 croma 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() denota o 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 nessa 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 Catmull-Rom interpolação, também conhecido como interpolação de convolução cúbica.

figure 11. diagram showing 4:2:0 to 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 todas as outras linhas de exemplo 4:2:2. No entanto, a introdução desse deslocamento aumentaria a quantidade de processamento necessária para gerar os exemplos e tornaria impossível reconstruir os exemplos 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, H.263 ou vídeo MPEG-1, a fase das amostras de croma 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 de luma (um deslocamento de 25 pixels 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 a 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 de 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) embalados. Quando a matriz U-V combinada é tratada como uma matriz de valores WORD de pouco-endiano, os exemplos de U são contidos nos LSBs de cada WORD e os exemplos V estão contidos nos MSBs. (Esse layout de memória é semelhante ao NV12, embora a amostragem de croma seja diferente.)
  • Y41P é um formato 4:1:1 embalado, 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 bytes: 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 exemplo Y especifica a chave de croma (0 = transparente, 1 = opaco).
  • Y42T é idêntico ao UYVY, exceto que o bit menos significativo de cada exemplo 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 

onde XXXXXXXX está o código FOURCC. Assim, o subtipo GUID 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 do Subtipo de Vídeo.

Sobre o vídeo YUV

Tipos de mídia de vídeo