Vidyo anunció recientemente su propia implementación de códec VP9 escalable, con importantes mejoras de rendimiento y eficiencia en comparación con la implementación del códec VP9 de código abierto WebM, especialmente en dispositivos móviles. Además, el códec VP9 de Vidyo mantiene una compatibilidad total con WebRTC y con cualquier aplicación que utilice el códec VP9 de WebM, incluido el navegador Chrome de Google. En esta serie de blogs de tres partes, explicaré con más detalle los detalles y las ventajas de este nuevo y emocionante diseño. Pero, antes de hacerlo, es importante comprender primero los antecedentes y el contexto de VP9, la escalabilidad y los códecs de vídeo en general.
El códec de vídeo VP9 estuvo disponible por primera vez en el navegador Google Chrome a finales de 2015, cuando Cromo 48 . Aunque WebRTC requiere que tanto VP8 como H.264 sean compatibles con un navegador, VP9 introdujo una alternativa de código abierto y supuestamente libre de derechos que superaba tanto a H.264 como, por supuesto, al mucho más antiguo VP8. En un entrada del blog en diciembre de 2015, resumí la historia del desarrollo de VP9 en el contexto de WebRTC y Google+ Hangouts.
La importancia de VP9 para la comunicación en tiempo real va mucho más allá del hecho de que ofrece una eficiencia de compresión de última generación en un paquete de código abierto y libre de derechos de autor. Como escribí en abril de 2016 en mi artículo invitado "Escalabilidad, VP9 y lo que significa para WebRTC" en BlogGeek.Me, es el primer códec de este tipo que aporta escalabilidad de última generación a la comunicación de vídeo basada en navegador. La escalabilidad ha demostrado ser una herramienta esencial para implementar vídeo multipunto de alta calidad, y está respaldada por los estándares de códecs H.264 y HEVC.
La codificación escalable significa que el mismo flujo de bits de vídeo contiene subconjuntos de datos, llamados capas, que permiten reconstruir el original a diferentes resoluciones. La escalabilidad puede referirse a varias dimensiones, a saber, temporal, espacial o de calidad; las dos primeras se utilizan en aplicaciones de comunicación en tiempo real.
La escalabilidad temporal significa que el mismo flujo de bits de vídeo permite tomar un subconjunto de los datos y representar el vídeo a diferentes velocidades de fotogramas. Figura 1 muestra cómo se realiza la codificación de vídeo en la comunicación en tiempo real cuando no se utiliza escalabilidad, es decir, con una sola capa. Cada imagen utiliza como referencia la imagen codificada anteriormente; de este modo, el codificador sólo necesita enviar la diferencia entre imágenes sucesivas, reduciendo así la cantidad de datos que debe transmitir. Estas imágenes se denominan "P", de la palabra "predicted" (predicha). La primera imagen no utiliza la predicción de una imagen anterior y se denomina imagen intra o "I". Una limitación es que, para descodificar una imagen, hay que haber recibido todas las imágenes precedentes de la cadena. Esta estructura de codificación de imágenes suele denominarse IPPP, por la secuencia de tipos de imágenes a partir de la que se construye.
Figura 1: Codificación monocapa
Figura 2 muestra cómo se realiza la codificación cuando se utilizan tres capas temporales. Las imágenes se muestran con un desplazamiento vertical para identificar fácilmente las distintas capas. Supongamos que la frecuencia de imagen total es de 30 imágenes por segundo (fps). La capa inferior (capa 0) codifica una de cada cuatro imágenes, lo que proporciona una frecuencia de 7,5 fps. Observe que esta capa se codifica de la misma manera que en Figura 1 - la primera imagen es una imagen I, y las siguientes son todas imágenes P (P0).
Figura 2: Escalabilidad temporal con tres capas
La capa 1 se construye añadiendo las imágenes que están a medio camino entre las imágenes de la capa 0. En la figura 2, sería la imagen P1. En la figura 2 sería la imagen P1. Obsérvese que se codifica utilizando la imagen inmediatamente anterior de la capa 0. Si añadimos las imágenes P1 a las P0, tenemos una velocidad total de 15 fps. Por último, la capa 2 se construye añadiendo todas las imágenes restantes (P2). Estas imágenes se codifican de nuevo utilizando las imágenes inmediatamente anteriores de una capa inferior. Para la primera P2, esto significa I0 (o P0 más adelante en el tiempo) mientras que para la segunda P2 significa la P1 en el tiempo 2. Si sumamos las imágenes P2 a las P0 y P1, obtenemos un total de 30 fps.
Esta estructura, denominada codificación jerárquica de imágenes P, tiene varias propiedades útiles. En primer lugar, podemos eliminar las capas superiores sin que ello afecte a nuestra capacidad de descodificar las capas inferiores. Así, es posible reducir la frecuencia de imagen en cualquier punto temporal sin procesar la señal. En segundo lugar, la estructura también nos permite pasar a una capa temporal superior en cualquier momento. Por ejemplo, puedo estar recibiendo y descodificando sólo la capa 0 a 7,5 fps, pero luego decidir pasar a los 30 fps completos y empezar a hacerlo sin ningún retraso ni procesamiento adicional de la señal. La estructura también ha mejorado significativamente la robustez. Por ejemplo, sólo es necesario que la capa 0 se reciba de forma fiable.