Los errores en un flujo de video codificado pueden originarse debido a fallas en la transmisión del canal o problemas de red, tales como congestión o retrasos. Un error de bit es la alteración de uno o más bits, donde la polaridad de un bit ha cambiado; es decir, un uno se ha convertido en cero o viceversa. Estos errores pueden ocurrir en un enlace de red o en un canal de transmisión debido a interferencias en un enlace inalámbrico. Los errores de bits en un paquete pueden ser detectados por un servidor o un receptor, probablemente porque un valor de verificación es incorrecto o se ha detectado un error en un código de redundancia cíclica (CRC). Un paquete que contenga errores puede ser descartado por un servidor intermedio entre el emisor y el receptor de datos de video codificado. Además, los servidores de internet también pueden descartar paquetes debido a la congestión de la red, si un servidor no puede manejar la tasa de paquetes que está recibiendo en ese momento.

Las aplicaciones de transmisión de video, como las de streaming, la televisión en vivo y las videollamadas, requieren que el video se entregue dentro de un tiempo determinado, de manera casi inmediata en el caso de las videollamadas o en pocos segundos para aplicaciones unidireccionales como el streaming o la transmisión en vivo. Una vez que el usuario final comienza a reproducir un flujo de video, es crucial que los paquetes lleguen continuamente al cliente para minimizar la probabilidad de interrupciones o almacenamiento en búfer. Dado que la posibilidad de problemas en el canal o la red es alta, y por ende la posibilidad de paquetes perdidos o dañados, los errores son inevitables en muchos escenarios prácticos. Es, por lo tanto, necesario manejar los errores de transmisión en el video codificado de manera eficiente.

Idealmente, el sistema debería continuar decodificando y mostrando el video, si es posible, y debería diseñarse para minimizar el impacto visual de los errores. Las estrategias para manejar los errores incluyen la resincronización, la restricción de dependencias y la ocultación de errores.

Resincronización: Un error puede hacer que un decodificador pierda su lugar en la sintaxis del flujo de bits del video, lo que lo haría incapaz de seguir decodificando. En este caso, el decodificador puede abandonar la decodificación y reiniciar en un punto de sincronización. En una aplicación en la que es probable que ocurran errores, como en la mayoría de los escenarios de transmisión de video, pueden insertarse cuadros de video decodificables de manera independiente a intervalos regulares. Un cuadro de "actualización instantánea del decodificador" (IDR, por sus siglas en inglés) en un flujo de bits H.264, H.265 o H.266 se codifica sin dependencia de cuadros previamente codificados, utilizando solo predicción intra. Cuando el decodificador encuentra un error catastrófico, puede esperar al siguiente cuadro IDR y reiniciar la decodificación exitosa desde este punto. Los cuadros IDR, debido a su necesidad de usar predicción intra, son menos eficientes en términos de codificación que otros tipos de cuadros. Por lo tanto, la frecuencia de los cuadros IDR es un equilibrio entre la resiliencia ante errores y la eficiencia de compresión. Los cuadros IDR frecuentes resultan en un flujo de bits con una tasa de bits más alta, lo que es menos eficiente, pero permite que el decodificador se recupere rápidamente de un error. En contraste, los cuadros IDR menos frecuentes resultan en un flujo de bits más eficientemente comprimido, pero con un lapso más largo entre los puntos de resincronización.

Restricción de dependencias: Supongamos la siguiente estructura de cuadros de video: el cuadro P4 se predice a partir de I0 y el cuadro P8 se predice a partir de P4, lo que significa que P4 depende de I0 y P8 depende tanto de P4 como de I0. Un error en I0 podría propagarse a P4, P8 y a todos los cuadros B, como B1, B2, etc. Un error en cualquier cuadro utilizado como referencia, como I0, P4 y P8, puede propagarse a otros cuadros. Por otro lado, en este ejemplo, ninguno de los cuadros B1, B2, B3, B5, B6 o B7 se utiliza para predecir otros cuadros. Un error en uno de los cuadros B no se propagará a otros cuadros. Los cuadros B, por tanto, son menos sensibles a los errores y cualquier error en estos cuadros no tendrá un efecto visual significativo. Desde el punto de vista del usuario, un error en un cuadro que no se utiliza como referencia solo aparecerá en la pantalla durante un período de un solo cuadro, mientras que un error en un cuadro utilizado como referencia puede permanecer visible durante varios períodos de cuadros y será mucho más obvio para el espectador.

Estructuras de imagen repetitivas, como la que se describe en el ejemplo anterior, influyen en las dependencias temporales y en la propagación de errores temporales. Para mitigar los efectos de los errores, se pueden utilizar estructuras como los "slice" (segmentos) en los que se divide una imagen. Un slice en H.265/HEVC contiene un segmento de slice independiente seguido, opcionalmente, por varios segmentos de slice dependientes. Las predicciones, como la predicción intra o la predicción de vectores de movimiento, no pueden cruzar los límites de un slice. Esto significa que un error que ocurra en un slice no debería propagarse a los slices posteriores, permitiendo que estos puedan decodificarse sin hacer referencia a los datos en el slice que contiene el error. Al aumentar el número de slices en una imagen, se puede reducir el impacto de los errores. Sin embargo, un mayor número de slices reduce la eficiencia de compresión, ya que cada slice requiere información adicional en los encabezados y la falta de predicción entre slices disminuye la eficiencia general de la predicción. Por lo tanto, el uso de estructuras de slices es también un equilibrio entre eficiencia de compresión y resiliencia ante errores.

Ocultación de errores: Un error en el flujo de bits decodificado puede ser indicado externamente por un mensaje del protocolo de transporte que identifique un error en un paquete, o puede ser detectado por el decodificador cuando los elementos de sintaxis esperados no son recibidos. En estos casos, el decodificador puede intentar reducir el impacto visual del error utilizando técnicas de ocultación de errores. Esto implica emplear regiones adyacentes sin errores de la imagen o cuadros temporalmente adyacentes para intentar predecir y rellenar la región dañada. Cuando la ocultación de errores es exitosa, el resultado es un cuadro menos distorsionado visualmente.

Es importante comprender que los errores en los flujos de video codificados son inevitables en muchos contextos, especialmente cuando se trabaja con transmisión en tiempo real o aplicaciones en línea. Las estrategias implementadas para manejar estos errores, como la resincronización, la restricción de dependencias y la ocultación de errores, son cruciales para garantizar una experiencia visual lo más fluida posible, incluso en condiciones de red subóptimas. Sin embargo, siempre existe un compromiso entre la eficiencia de la compresión y la resiliencia ante errores, lo que obliga a diseñar sistemas que se adapten al contexto específico en el que se utilicen.

¿Cómo influyen los modos de predicción direccional en la compresión de video?

En la compresión de video moderna, uno de los métodos clave para reducir el tamaño de los archivos sin perder demasiada calidad es la predicción intra. Este proceso se basa en predecir los valores de píxeles dentro de un bloque a partir de los valores ya codificados de los píxeles vecinos. Los modos de predicción direccional juegan un papel crucial en este proceso, ya que permiten realizar predicciones más precisas aprovechando las tendencias espaciales de los datos. Entre estos modos, se destacan los llamados "modos diagonales", que ayudan a extrapolar los valores de un bloque a partir de muestras situadas en direcciones específicas.

En el primer modo diagonal, conocido como Diagonal (1), las muestras fuente ubicadas por encima y a la izquierda del bloque actual se extrapolan hacia abajo y a la derecha. En el segundo modo, Diagonal (2), las muestras fuente que se encuentran por encima y a la izquierda se extrapolan hacia abajo y a la derecha. Finalmente, el tercer modo, Diagonal (3), toma las muestras fuente situadas por encima y a la derecha del bloque y las extrapola hacia abajo y a la izquierda. Es importante mencionar que no se puede generar una predicción en la dirección de abajo hacia arriba o de derecha a izquierda debido a que las muestras inferiores y a la derecha aún no han sido decodificadas, lo que hace imposible utilizarlas para la predicción.

Por ejemplo, en el bloque de 4×4 que se muestra en la figura 5.19, la predicción vertical se crea copiando los cuatro píxeles superiores hacia abajo, mientras que la predicción horizontal se realiza copiando los cuatro píxeles de la izquierda hacia la derecha. Existen además predicciones diagonales, como la diagonal hacia abajo y a la izquierda o hacia abajo y a la derecha. En este caso, las predicciones diagonales tienden a ser más precisas, especialmente si la información de los píxeles ya codificados en las direcciones correspondientes es adecuada. Las predicciones que coinciden mejor con el bloque original pueden minimizar el error de predicción, lo que se refleja en los residuos.

En otro ejemplo, con los valores numéricos de las muestras mostrados en la figura 5.20, la predicción horizontal se obtiene copiando las muestras de la izquierda, mientras que la predicción diagonal hacia abajo a la derecha muestra un resultado más preciso, ya que las muestras de la diagonal superior izquierda proporcionan una mejor aproximación al bloque original. Esta predicción minimiza el residuo, lo que es crucial para la eficiencia de la compresión.

El proceso de predicción también involucra un ajuste detallado de la dirección y la forma en que se extrapolan los valores. En ocasiones, los predictores no se limitan a una dirección fija, sino que utilizan la filtración de muestras vecinas para obtener una estimación más precisa. Así, cuando el ángulo de predicción no es exactamente de 45 grados, la predicción de un valor en el bloque se realiza tomando un promedio o filtrando las muestras de los píxeles vecinos más cercanos.

Por otro lado, al seleccionar el tamaño del bloque para la predicción intra, el codificador tiene varias opciones dependiendo de las especificaciones del estándar de compresión utilizado. Un codificador H.264, por ejemplo, puede elegir entre bloques de 4×4, 8×8 o 16×16 píxeles. En bloques más grandes, como el 16×16, es más sencillo señalar la predicción, ya que solo se necesita enviar un parámetro que indique el modo de predicción, pero la precisión puede disminuir si el bloque original es muy detallado. En bloques más pequeños, como 4×4, se logra una mayor precisión al predecir cada bloque individualmente, pero el número de parámetros a transmitir aumenta significativamente. Por lo tanto, se busca un balance entre precisión y eficiencia de codificación, adaptándose al tipo de escena de video y a la textura de la imagen.

Al considerar la selección del tamaño de bloque, los detalles de la imagen juegan un papel fundamental. Las áreas de la escena con texturas suaves o detalles simples se benefician más de bloques grandes, ya que los valores de los píxeles cercanos son más similares y la predicción es más precisa. En cambio, las regiones con detalles complejos o texturas que cambian rápidamente requieren bloques más pequeños para obtener una predicción más precisa de cada píxel. Es un equilibrio dinámico que depende de las características de la imagen y del algoritmo de compresión utilizado.

El uso adecuado de los modos de predicción direccional y la selección del tamaño del bloque son aspectos fundamentales para lograr una compresión eficiente y de alta calidad en la codificación de video. La predicción precisa reduce significativamente el tamaño de los archivos sin sacrificar la calidad visual, lo que es esencial en aplicaciones como la transmisión en vivo o el almacenamiento de grandes cantidades de contenido visual.