Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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. Describe las técnicas de muestreo de YUV más comunes.
- Definiciones de superficie. Describe los formatos YUV recomendados.
- Conversiones de espacio de color y tasa de muestreo de croma. Proporciona algunas instrucciones para convertir entre formatos YUV y RGB y convertir entre diferentes formatos YUV.
- Identificación de formatos YUV en Media Foundation. Explica cómo describir los tipos de formato YUV en Media Foundation.
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.
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:
- 4:4:4 Formatos, 32 Bits por píxel
- 4:4:4 Formatos, 24 Bits por píxel
- 4:2:2 Formatos, 16 Bits por píxel
- 4:2:0 Formatos, 16 Bits por píxel
- Formatos 4:2:0, 12 bits por píxel
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 (32 bpp)
- 4:4:4 (24 bpp)
- 4:2:2 (16 bpp)
- 4:2:0 (16 bpp)
- 4:2:0 (12 bpp)
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.
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.
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.
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.
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.
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.
IMC3
Este formato es idéntico a IMC1, excepto que los planos U y V se intercambian, como se muestra en el diagrama siguiente.
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.
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.
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.
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.
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
- Conversión de YUV de 8 bits a RGB888
- Convertir 4:2:0 YUV a 4:2:2 YUV
- Convertir 4:2:2 YUV a 4:4:4 YUV
- Convertir 4:2:0 YUV a 4:4:4 YUV
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.
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.
Temas relacionados