Así es como logra reproducir y codificar vídeo tu tarjeta gráfica NVIDIA
No hay duda de que NVIDIA tiene un dominio absoluto en el mundo del streaming de contenido. La clave de ellos se encuentra tanto en el NVDEC y el NVENC, dos unidades dentro de sus GPU que se encargan de las tareas de reproducción de vídeo. En este artículo os vamos a explicar de forma sencilla qué son exactamente y cómo funcionan.
Hemos de aclarar el hecho de que en todas las GPU, tanto si son dedicadas como si funcionan en forma de tarjeta de expansión. Tienen unidades dedicadas relacionadas con la reproducción de vídeo. Sin embargo, para este artículo nos hemos centrado en las unidades integradas en las GPU de NVIDIA. En cuanto a su implementación, se encuentran en los diferentes modelos de desde la arquitectura Kepler hasta las actuales con Lovelace.
¿Qué son NVDEC y NVENC?
Hemos de partir que las GPU, al igual que ocurre con las CPU, son en realidad lo que llamamos un SoC, con varios componentes conectados a un controlador de memoria integrado situado en la parte central y que se encarga de comunicar los diferentes elementos entre sí y al mismo tiempo todos ellos con la memoria que tienen asignada.
Por lo que en un chip gráfico no solo nos encontraremos con los diferentes núcleos para ejecutar programas shader y unidades de función fija para gráficos en 3D, sino también otros elementos que resultan esenciales para ciertas tareas.
Una de ellas es la reproducción y la codificación de vídeo, las cuales en el hardware de NVIDIA se realizan por las unidades NVDEC y NVENC respectivamente, dos pequeños procesadores que se encuentran en el interior de las tarjetas de NVIDIA y qué han ido evolucionando con cada nueva GeForce que aparece en el mercado. Su particularidad es que pueden reproducir y generar vídeo en diferentes resoluciones y formatos de vídeo.
Todo ello lo hacen consumiendo diez veces menos que la unidad principal de la GPU y ocupando muy poco espacio en el chip. Sin embargo, hemos de aclarar que NVDEC y NVENC al no servir para lo mismo, tienen un funcionamiento completamente dispar uno respecto al otro.
¿Qué es lo que hacen exactamente?
Empezando por el NVDEC, su trabajo consiste en descifrar los bloques que forman un archivo de vídeo en un códec soportado por el hardware y generar en la memoria de vídeo los diferentes fotogramas para que los podamos ver en el monitor o el televisor. El NVENC, en cambio, es más complicado, ya que lo que hace hacer el proceso inverso, es decir, coger el último frame que se encuentra en memoria para convertirlo en bloques, codificarlo para después almacenarlo o retransmitirlo a través de internet.
De las dos tareas, la codificación de video es más complicada, por el hecho de que requiere duplicar el espacio asignado al búfer de imagen y, por tanto, por cada stream que estemos generando le estamos quitando memoria de vídeo a la GPU para otras tareas, como por ejemplo generar gráficos en 3D a tiempo real. Es por ello que de cara al streaming se aconseja siempre optar por tarjetas gráficas con más memoria en ellas que la que los diferentes títulos ponen en sus especificaciones recomendadas.
Aunque su principal tarea es liberar de la carga tanto a la CPU como a la GPU, en el caso que nos ocupa de NVIDIA, de tener que encargarse de la reproducción de vídeo. Lo cual hacen muy bien y para colmo sin subir los consumos energéticos mientras realizan esta tarea.
¿Cómo funciona el NVDEC?
El NVDEC no es una pieza de hardware, sino que son varias distintas, las cuales son las siguientes:
- Una serie de decodificadores de vídeo para cada formato, estas son unidades de función fija no programables que toman como datos de entrada los bloques del archivo para luego escribir el frame final sobre la memoria de vídeo. Con cada generación se añade soporte para nuevos códecs y para mejores resoluciones para los ya existentes.
- Para ciertos códecs más avanzados se utiliza un procesador de dominio específico, esta es una pequeña CPU para con el set de registros e instrucciones limitado a solo lo que es necesario para su tarea específica. Por lo que olvidaros de poderlos usar para ejecutar programas desde ellos.
En cuanto al resto de características, hemos de partir del hecho de que tiene acceso solo al espacio de memoria principal de la GPU, lo cual es normal desde el momento en que necesita generar el búfer de imagen en la VRAM, para que el controlador de pantalla de la GPU pueda leerlo y enviarlo al búfer de imagen. Esto además permite la manipulación del mismo a través de programas CUDA usando shaders de computación que se han creado específicamente para la manipulación de vídeo y crear así efectos especiales o simplemente ejecutar algoritmos de inteligencia artificial con ellos, ya sea para la detección de objetos o para cosas como ampliar la resolución a través algoritmos de aprendizaje profundo.
¿Cómo funciona el NVENC?
El NVENC es un codificador de vídeo, por lo que toma una serie de frames generados por la GPU para codificarlos en algún tipo de formato de archivo de forma automática, además de eso también se encarga de la transcodificación que consiste en cambiar al vuelo la resolución de un vídeo, cambiarlo de formato o ambas cosas al mismo tiempo. Siendo estas funciones producto de la intercomunicación con el NVDEC.
Hemos de partir del hecho de que los formatos de vídeo son versiones cifradas para que ocupen mucho menos de lo que ocuparían de forma nativa. Es por ello que se utilizan una serie de algoritmos para cifrar la información en los diferentes formatos de vídeo. Así como una serie de unidades que ayudan a la codificación y que se encargan de obtener información de cada frame, no solo el color, sino también cosas como la estimación de movimiento.
En realidad, el NVDEC y NVENC es lo que llamamos un microcontrolador con una unidad DMA asociada que le permite comunicarse con la memoria de vídeo. Su particularidad es que sus instrucciones se encuentran escogidas de cara a la codificación de vídeo. Y a la hora de crear los diferentes archivos de vídeo no usa una unidad de función fija, sino un programa cargado desde su propia memoria, desde la cual también copia los bloques del búfer de imagen que codificará.