Compartir a través de


Formatos YUV recomendados de 8 bits para la representación de vídeo

Gary Sullivan y Stephen Estrop

Microsoft Corporation

Abril de 2002, actualizado en noviembre de 2008

En este tema se describen los formatos de color YUV de 8 bits recomendados para la representación de vídeo en el sistema operativo Windows. En este artículo se presentan técnicas para la conversión entre formatos YUV y RGB, y también se proporcionan técnicas para mejorar el muestreo de formatos YUV. Este artículo está diseñado para cualquier persona que trabaje con la descodificación o representación de vídeo YUV en Windows.

Introducción

Numerosos formatos YUV se definen en todo el sector del vídeo. En este artículo se identifican los formatos YUV de 8 bits recomendados para la representación de vídeo en Windows. Se recomienda que los proveedores de descodificadores y los proveedores de pantallas admitan los formatos descritos en este artículo. En este artículo no se abordan otros usos del color YUV, como la fotografía fija.

Los formatos descritos en este artículo usan 8 bits por ubicación de píxeles para codificar el canal Y (también denominado canal luma) y usar 8 bits por muestra para codificar cada muestra cromática U o V. Sin embargo, la mayoría de los formatos YUV usan menos de 24 bits por píxel en promedio, ya que contienen menos muestras de U y V que de Y. En este artículo no se tratan los formatos YUV con canales Y de 10 bits o más.

Nota:

Para los fines de este artículo, el término U es equivalente a Cb y el término V es equivalente a Cr.

 

En este artículo se tratan los temas siguientes:

Muestreo de YUV

Los canales cromáticos pueden tener una frecuencia de muestreo más baja que el canal luma, sin ninguna pérdida dramática de calidad perceptual. Se usa una notación llamada "A:B:C" para describir la frecuencia con la que se muestrean U y V con respecto a Y.

  • 4:4:4 significa que no hay ningún muestreo descendente de los canales cromáticos.
  • 4:2:2 significa submuestreo horizontal de 2:1, sin submuestreo vertical. Cada línea de examen contiene cuatro muestras Y para cada dos muestras de U o V.
  • 4:2:0 significa un submuestreo horizontal de 2:1 y un submuestreo vertical de 2:1.
  • 4:1:1 significa reducción de tamaño horizontal 4:1, sin reducción de tamaño vertical. Cada línea de escaneo contiene cuatro muestras de Y por cada muestra de U y V. El muestreo 4:1:1 es menos común que otros formatos y no se describe en detalle en este artículo.

En los diagramas siguientes se muestra cómo se muestrea la croma para cada una de las tasas de reducción de tamaño. Las muestras de Luma se representan mediante una cruz y las muestras cromáticas se representan mediante un círculo.

figura 1. muestreo cromático

La forma dominante de muestreo 4:2:2 está definida en la Recomendación BT.601 (ITU-R). Hay dos variantes comunes del muestreo 4:2:0. Uno de estos se usa en vídeo MPEG-2 y el otro se usa en MPEG-1 y en ITU-T Recomendaciones H.261 y H.263.

En comparación con el esquema MPEG-1, es más sencillo convertir entre el esquema MPEG-2 y las cuadrículas de muestreo definidas para los formatos 4:2:2 y 4:4:4. Por este motivo, se prefiere el esquema MPEG-2 en Windows y se debe considerar la interpretación predeterminada de los formatos 4:2:0.

Definiciones de superficie

En esta sección se describen los formatos YUV de 8 bits recomendados para la representación de vídeo. Estos se dividen en varias categorías:

En primer lugar, debe tener en cuenta los siguientes conceptos para comprender lo siguiente:

  • Origen de superficie. Para los formatos YUV descritos en este artículo, el origen (0,0) es siempre la esquina superior izquierda de la superficie.
  • Paso. El paso de línea de una superficie, a veces también llamado 'pitch', es la anchura de la superficie en bytes. Dado un origen de superficie en la esquina superior izquierda, el paso siempre es positivo.
  • Alineación. La alineación de una superficie es a discreción del controlador de visualización de gráficos. La superficie siempre debe estar alineada a DWORD; es decir, se garantiza que las líneas individuales dentro de la superficie comiencen en un límite de 32 bits (DWORD). Sin embargo, la alineación puede ser mayor que 32 bits, en función de las necesidades del hardware.
  • Formato empaquetado frente al formato planar. Los formatos YUV se dividen en formatos empaquetados y formatos planares . En un formato empaquetado, los componentes Y, U y V se almacenan en una sola matriz. Los píxeles se organizan en grupos de macropixeles, cuyo diseño depende del formato. En un formato planar, los componentes Y, U y V se almacenan como tres planos independientes.

Cada uno de los formatos YUV descritos en este artículo tiene un código FOURCC asignado. Un código FOURCC es un entero de 32 bits sin signo que se crea mediante la concatenación de cuatro caracteres ASCII.

4:4:4 Formatos, 32 Bits por píxel

AYUV

Se recomienda un solo formato 4:4:4, con el código FOURCC AYUV. Se trata de un formato empaquetado, donde cada píxel se codifica como cuatro bytes consecutivos, organizados en la secuencia que se muestra en la siguiente ilustración.

Figura 2. Diseño de memoria AYUV

Los bytes marcados como A contienen valores para alpha.

4:4:4 Formatos, 24 Bits por píxel

I444

En formato I444, todos los ejemplos Y aparecen primero en la memoria como una matriz de valores char sin signo. Esta matriz va inmediatamente seguida de todas las muestras de U (Cb). El paso del plano U es el mismo paso del plano Y; y el plano U contiene el mismo número de líneas que el plano Y. El plano U va inmediatamente seguido de todas las muestras de V (Cr), con el mismo paso y número de líneas que el plano U. No hay relleno para los planos Y/U/V.

Diagrama que ilustra el diseño de memoria I444.

4:2:2 Formatos, 16 Bits por píxel

Se recomiendan dos formatos 4:2:2, con los siguientes códigos FOURCC:

  • YUY2
  • UYVY

Ambos son formatos empaquetados, donde cada macropixel es de dos píxeles codificados como cuatro bytes consecutivos. Esto da como resultado una reducción de tamaño horizontal de la croma por un factor de dos.

YUY2

En formato YUY2, los datos se pueden tratar como una matriz de caracteres sin signo, donde el primer byte contiene la primera muestra Y, el segundo byte contiene la primera muestra U (Cb), el tercer byte contiene la segunda muestra Y, y el cuarto byte contiene la primera muestra V (Cr), como se muestra en el diagrama siguiente.

Diagrama que ilustra el diseño de memoria yuy2

Si la imagen se aborda como una matriz de valores de WORD en formato little-endian, la primera WORD contiene la primera muestra Y en los bits menos significativos (LSB) y la primera muestra de U (Cb) en los bits más significativos (MSB). La segunda WORD contiene la segunda muestra Y en los LSB y la primera muestra V (Cr) en los MSB.

YUY2 es el formato de 4:2:2 píxeles preferido para la aceleración de vídeo de Microsoft DirectX (DirectX VA). Se espera que sea un requisito de término intermedio para los aceleradores de DirectX VA compatibles con vídeo 4:2:2.

UYVY

Este formato es el mismo que el formato YUY2, excepto que se invierte el orden de bytes, es decir, los bytes cromáticos y luma se voltean (figura 4). Si la imagen se representa como una matriz de dos valores WORD en formato little-endian, la primera WORD contiene U en los LSB e Y0 en los MSB, y la segunda WORD contiene V en los LSB e Y1 en los MSB.

Diagrama que ilustra el diseño de memoria uyvy

I422

En el formato I422 todas las muestras Y aparecen primero en la memoria como una matriz de valores char sin signo. Esta matriz va inmediatamente seguida de todas las muestras de U (Cb). El paso del plano U es la mitad del paso del plano Y; y el plano U contiene el mismo número de líneas que el plano Y. El plano U va seguido inmediatamente por todas las muestras de V (Cr), con el mismo paso y número de líneas que el plano U, como se muestra en la ilustración siguiente. No hay relleno para los planos Y/U/V.

Diagrama que ilustra el diseño de memoria I422.

4:2:0 Formatos, 16 Bits por píxel

Se recomiendan dos formatos de 4:2:0 de 16 bits por píxel (bpp), con los siguientes códigos FOURCC:

  • IMC1
  • IMC3

Ambos formatos YUV son formatos planos. Los canales cromáticos están reducidos de tamaño por un factor de dos tanto en las dimensiones horizontales como en las verticales.

IMC1

Todos los ejemplos Y aparecen primero en la memoria como una matriz de valores char sin signo. Esto va seguido de todas las muestras de V (Cr) y, a continuación, todas las muestras U (Cb). Los planos V y U tienen el mismo paso que el plano Y, lo que da como resultado áreas de memoria no utilizada, como se muestra en la figura 5. Los planos U y V deben iniciarse en los límites de memoria que sean un múltiplo de 16 líneas. En la figura 5 se muestra el origen de U y V para un frame de vídeo de 352 x 240. La dirección inicial de las planos U y V se calcula de la siguiente manera:

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

donde pY es un puntero de bytes al inicio de la matriz de memoria, como se muestra en el diagrama siguiente.

Diagrama que ilustra el diseño de memoria imc1 (ejemplo)

IMC3

Este formato es idéntico a IMC1, excepto que los planos U y V se intercambian, como se muestra en el diagrama siguiente.

Diagrama que ilustra el diseño de memoria imc3

Formatos 4:2:0, 12 bits por píxel

Se recomiendan cuatro formatos 4:2:0 12-bpp, con los siguientes códigos FOURCC:

  • IMC2
  • IMC4
  • YV12
  • NV12

En todos estos formatos, los canales cromáticos se reducen de tamaño por un factor de dos en las dimensiones horizontales y verticales.

IMC2

Este formato es el mismo que IMC1, excepto por la siguiente diferencia: las líneas V (Cr) y U (Cb) se intercalan en los límites de medio paso. En otras palabras, cada línea de paso completo en el área cromática comienza con una línea de muestras de V, seguida de una línea de muestras de U que comienza en el siguiente límite de medio avance (Figura 7). Este diseño hace un uso más eficaz del espacio de direcciones que IMC1. Reduce el espacio de direcciones cromáticas a la mitad y, por tanto, el espacio total de direcciones en un 25 por ciento. Entre los formatos 4:2:0, IMC2 es el segundo formato preferido, después de NV12. En la imagen siguiente se muestra este proceso.

Diagrama que ilustra el diseño de memoria imc2

IMC4

Este formato es idéntico a IMC2, salvo que las líneas U (Cb) y V (Cr) se intercambian, como se muestra en la ilustración siguiente.

Diagrama que ilustra el diseño de memoria imc4

YV12

Todos los ejemplos Y aparecen primero en la memoria como una matriz de valores char sin signo. Esta matriz va seguida inmediatamente de todas las muestras de V (Cr). El paso del plano V es la mitad del paso del plano Y; y el plano V contiene la mitad de las líneas que el plano Y. El plano V va seguido inmediatamente por todas las muestras de U (Cb), con el mismo paso y número de líneas que el plano V, como se muestra en la ilustración siguiente.

Diagrama que ilustra el diseño de memoria yv12

NV12

Todos los ejemplos Y aparecen primero en la memoria como una matriz de valores char sin signo con un número par de líneas. El plano Y es seguido inmediatamente por un array de valores char sin signo que contiene muestras empaquetadas de U (Cb) y V (Cr). Cuando la matriz de U-V combinada se aborda como una matriz de valores little-endian WORD, los LSB contienen los valores U y los MSB contienen los valores V. NV12 es el formato de 4:2:0 píxeles preferido para DirectX VA. Se espera que sea un requisito de término intermedio para los aceleradores de DirectX VA que admiten vídeo 4:2:0. En la ilustración siguiente se muestra el plano Y y la matriz que contiene muestras empaquetadas de U y V.

Diagrama que ilustra el diseño de memoria nv12

Conversiones de espacio de color y tasa de muestreo de croma

En esta sección se proporcionan instrucciones para la conversión entre YUV y RGB, y para convertir entre algunos formatos YUV diferentes. Consideramos dos esquemas de codificación RGB en esta sección: RGB de 8 bits de ordenador, también conocido como sRGB o RGB de "escala completa", y RGB de vídeo de estudio, o "RGB con margen superior y margen inferior". Estos se definen de la siguiente manera:

  • El RGB de computadora usa 8 bits para cada muestra de rojo, verde y azul. El negro se representa mediante R = G = B = 0 y el blanco se representa mediante R = G = B = 255.
  • El vídeo RGB de Studio usa cierto número de bits N para cada muestra de rojo, verde y azul, donde N es 8 o más. RGB de vídeo de estudio usa un factor de escala diferente al RGB de equipo y tiene un desplazamiento. El negro se representa mediante R = G = B = 16*2^(N-8) y el blanco se representa mediante R = G = B = 235*2^(N-8). Sin embargo, los valores reales pueden estar fuera de este intervalo.

Studio video RGB es la definición RGB preferida para vídeo en Windows, mientras que RGB de computadora es la definición preferida para aplicaciones que no son de vídeo. En cualquier forma de RGB, las coordenadas de cromática se especifican en ITU-R BT.709 para la definición de los colores RGB primarios. Las coordenadas (x,y) de R, G y B son (0,64, 0,33), (0,30, 0,60) y (0,15, 0,06), respectivamente. El blanco de referencia es D65 con coordenadas (0,3127, 0,3290). La gamma nominal es 1/0,45 (aproximadamente 2,2), con gamma precisa definida en detalle en ITU-R BT.709.

Conversión entre RGB y 4:4:4 YUV

Primero se describe la conversión entre RGB y 4:4:4 YUV. Para convertir 4:2:0 o 4:2:2 YUV a RGB, se recomienda convertir los datos YUV a 4:4:4 YUV y, a continuación, convertir de 4:4:4 YUV a RGB. El formato AYUV, que es un formato 4:4:4, usa 8 bits cada uno para las muestras Y, U y V. YUV también se puede definir con más de 8 bits por muestra para algunas aplicaciones.

Se han definido dos conversiones YUV dominantes de RGB para vídeo digital. Ambos se basan en la especificación conocida como recomendación ITU-R BT.709. La primera conversión es la antigua forma YUV, definida para uso a 50 Hz en BT.709. Es la misma que la relación especificada en ITU-R Recomendación BT.601, también conocida por su nombre anterior, CCIR 601. Debe considerarse el formato YUV preferido para la resolución de TV de definición estándar (720 x 576) y vídeo de menor resolución. Se caracteriza por los valores de dos constantes Kr y Kb:

Kr = 0.299
Kb = 0.114

La segunda conversión es la forma YUV más reciente definida para el uso de 60 Hz en BT.709 y debe considerarse el formato preferido para resoluciones de vídeo anteriores a SDTV. Se caracteriza por valores diferentes para estas dos constantes:

Kr = 0.2126
Kb = 0.0722

La conversión de RGB a YUV se define empezando por lo siguiente:

L = Kr * R + Kb * B + (1 - Kr - Kb) * G

Los valores YUV se obtienen de la siguiente manera:

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

¿dónde?

  • M es el número de bits por muestra de YUV (M >= 8).
  • Z es la variable de nivel negro. Para el RGB de la computadora, Z es igual a 0. Para el vídeo RGB de studio, Z es igual a 16*2^(N-8), donde N es el número de bits por muestra RGB (N >= 8).
  • S es la variable de escalado. Para el RGB de computadora, S es igual a 255. Para el vídeo RGB de studio, S es igual a 219*2^(N-8).

La función floor(x) devuelve el entero más grande menor o igual que x. La función clip3(x, y, z) se define de la siguiente manera:

clip3(x, y, z) = ((z < x) ? x : ((z > y) ? y : z))

Nota:

clip3 debe implementarse como una función en lugar de una macro de preprocesador; De lo contrario, se producirán varias evaluaciones de los argumentos.

 

La muestra Y representa el brillo, y las muestras you y V representan las desviaciones de color hacia azul y rojo, respectivamente. El intervalo nominal para Y es de 16*2^(M-8) a 235*2^(M-8). El negro se representa como 16*2^(M-8) y el blanco se representa como 235*2^(M-8). El rango nominal para U y V es de 16*2^(M-8) a 240*2^(M-8), con el valor 128*2^(M-8) que representa la crominancia neutra. Sin embargo, los valores reales pueden estar fuera de estos intervalos.

Para los datos de entrada en forma de vídeo RGB de estudio, la operación de clip es necesaria para mantener los valores de U y V dentro del intervalo de 0 a (2^M)-1. Si la entrada es RGB de computadora, la operación de clip no es necesaria, ya que la fórmula de conversión no puede generar valores fuera de este rango.

Estas son las fórmulas exactas sin aproximación. Todo lo que sigue en este documento se deriva de estas fórmulas. En esta sección se describen las conversiones siguientes:

Convertir RGB888 a YUV 4:4:4

En el caso de la entrada RGB del equipo y la salida BT.601 YUV de 8 bits, creemos que las fórmulas dadas en la sección anterior pueden aproximarse razonablemente con lo siguiente:

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

Estas fórmulas generan resultados de 8 bits mediante coeficientes que no requieren más de 8 bits de precisión (sin signo). Los resultados intermedios requerirán hasta 16 bits de precisión.

Conversión de YUV de 8 bits a RGB888

Desde las fórmulas RGB a YUV originales, se pueden derivar las siguientes relaciones 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

Por lo tanto, dado:

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

Las fórmulas para convertir YUV a RGB se pueden derivar de la siguiente manera:

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

donde clip() indica el recorte en un intervalo de [0..255]. Creemos que estas fórmulas se pueden aproximar razonablemente con lo siguiente:

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)

Estas fórmulas usan algunos coeficientes que requieren más de 8 bits de precisión para generar cada resultado de 8 bits y los resultados intermedios requerirán más de 16 bits de precisión.

Para convertir 4:2:0 o 4:2:2 YUV a RGB, se recomienda convertir los datos YUV a 4:4:4 YUV y, a continuación, convertir de 4:4:4 YUV a RGB. Las secciones siguientes presentan algunos métodos para convertir formatos 4:2:0 y 4:2:2 a 4:4:4.

Conversión de 4:2:0 YUV a 4:2:2 YUV

La conversión de 4:2:0 YUV a 4:2:2 YUV requiere una conversión ascendente vertical por un factor de dos. En esta sección se describe un método de ejemplo para realizar la conversión ascendente. El método supone que las imágenes de vídeo son de escaneo progresivo.

Nota:

El proceso de conversión de escaneo entrelazado de 4:2:0 a 4:2:2 presenta problemas inusuales y es difícil de implementar. En este artículo no se trata el problema de la conversión de exploración entrelazada de 4:2:0 a 4:2:2.

 

Deje que cada línea vertical de muestras cromáticas de entrada sea una matriz Cin[] que oscila entre 0 y N - 1. La línea vertical correspondiente de la imagen de salida será una matriz Cout[] que va de 0 a 2N a 1. Para convertir cada línea vertical, realice el siguiente proceso:

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

donde clip() indica el recorte en un intervalo de [0..255].

Nota:

Las ecuaciones para controlar los bordes se pueden simplificar matemáticamente. Se muestran en este formato para ilustrar el efecto de fijación en los bordes de la imagen.

 

En efecto, este método calcula cada valor que falta interpolando la curva sobre los cuatro píxeles adyacentes, ponderados hacia los valores de los dos píxeles más cercanos (figura 11). El método de interpolación específico utilizado en este ejemplo da lugar a la falta de muestras en las posiciones semi-enteras, mediante el uso de un método bien conocido denominado interpolación Catmull-Rom, también conocido como interpolación por convolución cúbica.

Diagrama que ilustra el sobremuestreo de 4:2:0 a 4:2:2

En términos de procesamiento de señal, la conversión ascendente vertical debería incluir idealmente una compensación de desplazamiento de fase para tener en cuenta el desplazamiento vertical de medio píxel (en relación con la cuadrícula de muestreo de salida 4:2:2) entre las ubicaciones de las líneas de muestra 4:2:0 y la ubicación de cada línea de muestra 4:2:2 alterna. Sin embargo, introducir este desplazamiento aumentaría la cantidad de procesamiento necesario para generar las muestras y haría imposible reconstruir las muestras originales de 4:2:0 a partir de la imagen de 4:2:2 muestreada. También haría imposible descodificar vídeo directamente en superficies 4:2:2 y, a continuación, usar esas superficies como imágenes de referencia para descodificar las imágenes posteriores en la secuencia. Por lo tanto, el método proporcionado aquí no tiene en cuenta la alineación vertical precisa de los ejemplos. Si lo hace, probablemente no sea visualmente perjudicial para resoluciones de imagen razonablemente elevadas.

Si comienza con un vídeo 4:2:0 que usa la cuadrícula de muestreo definida en H.261, H.263 o vídeo MPEG-1, la fase de las muestras cromáticas de salida 4:2:2 también se desplazará mediante un desplazamiento horizontal de medio píxel en relación con el espaciado en la cuadrícula de muestreo de luma (un desplazamiento de un cuarto de píxel con respecto al espaciado de la cuadrícula de muestreo cromática 4:2:2). Sin embargo, la forma MPEG-2 de vídeo 4:2:0 suele usarse más comúnmente en ordenadores personales y no sufre de este problema. Además, es probable que la distinción no sea visualmente perjudicial en resoluciones de imagen razonablemente elevadas. Al intentar corregir este problema, se crearía el mismo tipo de problemas descritos para el desplazamiento de fase vertical.

Convertir 4:2:2 YUV a 4:4:4 YUV

La conversión de 4:2:2 YUV a 4:4:4 YUV requiere una ampliación horizontal por un factor de dos. El método descrito anteriormente para la "upconversion" vertical también se puede aplicar a la "upconversion" horizontal. Para el video MPEG-2 y ITU-R BT.601, este método generará muestras con la alineación de fase correcta.

Convertir 4:2:0 YUV a 4:4:4 YUV

Para convertir 4:2:0 YUV a 4:4:4 YUV, simplemente puede seguir los dos métodos descritos anteriormente. Convierta la imagen 4:2:0 a 4:2:2 y, a continuación, convierta la imagen 4:2:2 a 4:4:4. También puede cambiar el orden de los dos procesos de conversión ascendente, ya que el orden de operación no afecta realmente la calidad visual del resultado.

Conversión de YUY2 a I422

Para el formato de color 4:2:2, algunos descodificadores pueden generar MFVideoFormat_YUY2 de forma predeterminada, que es un formato empaquetado. Sin embargo, muchos codificadores esperan la entrada en el formato planar MFVideoFormat_I422. En tales casos se puede insertar la transformada Transcoding Video Processor de Media Foundation (comúnmente denominada "XVP") en la tubería para convertir MFVideoFormat_YUY2 en MFVideoFormat_I422. Para obtener más información, vea Transcoding Video Processor Media Foundation Transform. En este ejemplo se muestra cómo usar XVP para realizar esta conversión para codificar flujos de trabajo.

#include <mfapi.h> 
#include <wmcodecdsp.h>  // CLSID_VideoProcessorMFT 

using Microsoft::WRL; 

HRESULT ConvertYUY2toI422WithXVP( 
    _In_ IMFSample* inputSample, 
    _In_ MFT_OUTPUT_DATA_BUFFER* outputBuffer, 
    UINT32 width, 
    UINT32 height)
{ 
    RETURN_HR_IF_NULL(E_INVALIDARG, inputSample);     
    RETURN_HR_IF_NULL(E_INVALIDARG, outputBuffer);     

    ComPtr<IMFTransform> xvp; 
    RETURN_IF_FAILED(CoCreateInstance( 
        CLSID_VideoProcessorMFT, 
        nullptr, 
        CLSCTX_INPROC_SERVER, 
        IID_PPV_ARGS(&xvp))); 

    // Set input type: MFVideoFormat_YUY2 
    ComPtr<IMFMediaType> inputType; 
    RETURN_IF_FAILED(MFCreateMediaType(&inputType)); 
    RETURN_IF_FAILED(inputType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video)); 
    RETURN_IF_FAILED(inputType->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_YUY2)); 
    RETURN_IF_FAILED(MFSetAttributeSize(inputType.Get(), MF_MT_FRAME_SIZE, width, height)); 
    RETURN_IF_FAILED(spXVP->SetInputType(0, inputType.Get(), 0)); 

    // Set output type: MFVideoFormat_I422 
    ComPtr<IMFMediaType> outputType; 
    RETURN_IF_FAILED(MFCreateMediaType(&outputType)); 
    RETURN_IF_FAILED(outputType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video)); 
    RETURN_IF_FAILED(outputType->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_I422)); 
    RETURN_IF_FAILED(MFSetAttributeSize(outputType.Get(), MF_MT_FRAME_SIZE, width, height)); 
    RETURN_IF_FAILED(xvp->SetOutputType(0, outputType.Get(), 0)); 

    // Submit input sample 
    RETURN_IF_FAILED(xvp->ProcessInput(0, inputSample, 0)); 

    // Request the converted output sample 
    DWORD status = 0; 
    return xvp->ProcessOutput(0, 1, outputBuffer, &status);
} 

Conversión de AYUV a I444

Para el formato de color 4:4:4, algunos descodificadores pueden generar MFVideoFormat_AYUV de forma predeterminada, que es un formato empaquetado. Sin embargo, muchos codificadores esperan que las entradas estén en el formato plano MFVideoFormat_I444. En tales casos, se puede insertar la transformada Transcoding Video Processor de Media Foundation (XVP) en la canalización para así convertir MFVideoFormat_AYUV en MFVideoFormat_I444. En este ejemplo se muestra cómo usar XVP para realizar esta conversión para codificar flujos de trabajo.

#include <mfapi.h> 
#include <wmcodecdsp.h>  // CLSID_VideoProcessorMFT 

using Microsoft::WRL; 

HRESULT ConvertAYUVtoI444WithXVP( 
    _In_ IMFSample* inputSample, 
    _In_ MFT_OUTPUT_DATA_BUFFER* outputBuffer, 
    UINT32 width, 
    UINT32 height) 
{ 
    RETURN_HR_IF_NULL(E_INVALIDARG, inputSample);     
    RETURN_HR_IF_NULL(E_INVALIDARG, outputBuffer);     

    ComPtr<IMFTransform> xvp; 
    RETURN_IF_FAILED(CoCreateInstance( 
        CLSID_VideoProcessorMFT, 
        nullptr, 
        CLSCTX_INPROC_SERVER, 
        IID_PPV_ARGS(&xvp))); 

    // Set input type: MFVideoFormat_AYUV 
    ComPtr<IMFMediaType> inputType; 
    RETURN_IF_FAILED(MFCreateMediaType(&inputType)); 
    RETURN_IF_FAILED(inputType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video)); 
    RETURN_IF_FAILED(inputType->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_AYUV)); 
    RETURN_IF_FAILED(MFSetAttributeSize(inputType.Get(), MF_MT_FRAME_SIZE, width, height)); 
    RETURN_IF_FAILED(xvp->SetInputType(0, inputType.Get(), 0)); 

    // Set output type: MFVideoFormat_I444 
    ComPtr<IMFMediaType> outputType; 
    RETURN_IF_FAILED(MFCreateMediaType(&outputType)); 
    RETURN_IF_FAILED(outputType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video)); 
    RETURN_IF_FAILED(outputType->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_I444)); 
    RETURN_IF_FAILED(MFSetAttributeSize(outputType.Get(), MF_MT_FRAME_SIZE, width, height)); 
    RETURN_IF_FAILED(xvp->SetOutputType(0, outputType.Get(), 0)); 

    // Submit input sample 
    RETURN_IF_FAILED(xvp->ProcessInput(0, inputSample, 0)); 

    // Request the converted output sample 
    DWORD status = 0; 
    return xvp->ProcessOutput(0, 1, outputBuffer, &status); 
} 

Otros formatos YUV

Algunos otros formatos YUV menos comunes son los siguientes:

  • AI44 es un formato YUV paletizado con 8 bits por muestra. Cada ejemplo contiene un índice en los 4 bits más significativos (MSB) y un valor alfa en los 4 bits menos significativos (LSB). El índice hace referencia a una matriz de entradas de paleta YUV, que se deben definir en el tipo de medio para el formato. Este formato se usa principalmente para imágenes de subimagen.
  • NV11 es un formato planar de 4:1:1 con 12 bits por píxel. Los ejemplos Y aparecen primero en la memoria. El plano Y va seguido de una serie de muestras empaquetadas de U (Cb) y V (Cr). Cuando la matriz de U-V combinada se aborda como una matriz de valores little-endian WORD, las muestras de U se encuentran en los LSB de cada WORD y las muestras V se encuentran en los MSB. (Este diseño de memoria es similar a NV12, aunque el muestreo cromático es diferente).
  • Y41P es un formato 4:1:1 empaquetado, con U y V siendo muestreados horizontalmente cada cuatro píxeles. Cada macropixel contiene 8 píxeles en tres bytes, con el siguiente diseño de bytes: U0 Y0 V0 Y1 U4 Y2 V4 Y3 Y4 Y5 Y6 Y7
  • Y41T es idéntico a Y41P, excepto el bit menos significativo de cada muestra Y especifica la clave cromática (0 = transparente, 1 = opaco).
  • Y42T es idéntico a UYVY, excepto el bit menos significativo de cada muestra Y especifica la clave cromática (0 = transparente, 1 = opaco).
  • YVYU es equivalente a YUYV, excepto que las muestras U y V se intercambian.

Identificación de formatos YUV en Media Foundation

Cada uno de los formatos YUV descritos en este artículo tiene un código FOURCC asignado. Un código FOURCC es un entero de 32 bits sin signo que se crea mediante la concatenación de cuatro caracteres ASCII.

Hay varias macros C/C++ que facilitan la declaración de valores FOURCC en el código fuente. Por ejemplo, la macro MAKEFOURCC se declara en Mmsystem.h, y la macro FCC se declara en Aviriff.h. Úselas como se indica a continuación:

DWORD fccYUY2 = MAKEFOURCC('Y','U','Y','2');
DWORD fccYUY2 = FCC('YUY2');

También se puede declarar un código FOURCC directamente, como un literal de cadena simplemente invirtiendo el orden de los caracteres. Por ejemplo:

DWORD fccYUY2 = '2YUY';  // Declares the FOURCC 'YUY2'

Revertir el orden es necesario porque el sistema operativo Windows usa una arquitectura little-endian. 'Y' = 0x59, 'U' = 0x55 y '2' = 0x32, por lo que '2YUY' es 0x32595559.

En Media Foundation, los formatos se identifican mediante un GUID de tipo principal y un GUID de subtipo. El tipo principal para los formatos de vídeo de ordenador siempre es MFMediaType_Video. El subtipo se puede construir asignando el código FOURCC a un GUID, como se indica a continuación:

XXXXXXXX-0000-0010-8000-00AA00389B71 

donde XXXXXXXX es el código FOURCC. Por lo tanto, el GUID de subtipo para YUY2 es:

32595559-0000-0010-8000-00AA00389B71 

Las constantes para los GUID de formato YUV más comunes se definen en el archivo de encabezado mfapi.h. Para obtener una lista de estas constantes, consulte GUID de subtipo de vídeo.

Acerca del vídeo de YUV

Tipos de vídeos