# Transport Stream

Transport Stream (término que puede ser traducido como corriente de transporte) es un protocolo de comunicación para audio, vídeo y datos especificado en los estándares de MPEG-2. Los flujos binarios de vídeo y audio de cada programa de televisión se comprimen independientemente formando cada uno de ellos una “corriente elemental” (ES – Elementary Stream). Cada una de estas corrientes elementales se estructura en forma de paquetes llamados PES (Packetized Elementary Stream).
Estos paquetes de video y audio, así como de otros datos de un mismo programa, pasan posteriormente a un multiplexor donde se conforma un solo tren binario. Para esta multiplexación, el grupo de estándares de MPEG-2 distingue entre dos posibilidades: la conformación de una “corriente de programa” (PS – Program Stream) y la conformación de una “corriente de transporte” (TS - Transport Stream).
La corriente de transporte es apropiada para entornos ruidosos, opción que encaja en las necesidades de la difusión de Televisión Digital Terrestre, por cable y vía satélite. Esta opción exige pasar los paquetes PES a otros paquetes más cortos, de 188 bytes de longitud, y aplicar técnicas de corrección de errores “hacia adelante” (FEC-Forward Error Correction). Con esto se puede organizar una corriente de transporte de un solo programa denominada SPTS (Siglas en inglés de Single Program Transport Stream). Esta longitud de paquetes incluye 4 bytes de cabecera o encabezado y es apropiada para utilizarse en redes ATM, así como en una amplia variedad de sistemas de transmisión y almacenamiento.
La corriente de transporte puede formarse con varios programas de televisión y cada uno de ellos con varias corrientes elementales. Como es lógico, las corrientes elementales que forman un mismo programa de televisión deben ser sincrónicas. Sin embargo, los diferentes programas pueden tener cada uno una sincronización independiente. En este caso, se organiza un canal de múltiplex con todos los programas.
El flujo binario de la corriente de transporte completa es constante, aun cuando varíen los flujos de cada corriente elemental. Para mantener este flujo total constante, se pueden incluir paquetes nulos. Entre otros datos, la corriente de transporte también lleva información de cifrado para el acceso condicional a determinados programas de pago.

## Contenido del paquete TS

La multiplexación de TS consiste en pequeños paquetes de longitud constante de 188 bytes, de los cuales 4 se destinan a una cabecera de inclusión obligatoria tras la que puede encontrarse un campo de adaptación opcional. El resto de bytes, hasta completar los 188, son de información o carga útil.

### Cabecera de un paquete TS

   * Byte sincro: Sirve para que el decodificador pueda sincronizarse correctamente con los datos entrantes. Tiene el valor hexadecimal de 0x47 (0d71, en formato decimal) y delimita el inicio de un paquete TS. Hace falta mencionar que, al contrario de los paquetes PES, este valor de sincronización puede darse en cualquiera de los 187 bytes restantes.
   * Indicador de error de transporte: Este bit se pone activo cuando se detecta un error en la transmisión.
   * Indicador de arranque: Indica si en la cabecera de la información hay un paquete PES.
   * PID (Packet Identification o "Identificador de paquete"): Es un campo de 13 bits que permite la distinción de paquetes de diferentes Elementary Streams. De los 2$^{13}$ valores posibles, hay 17 reservados para funciones especiales. Esto permite 8175 valores que son asignables a todos los otros flujos ES que forman el TS. El multiplexor tiene que garantizar que cada ES tenga un único identificador PID. La normativa MPEG no especifica qué valores de PID se tienen que dar a los ES (a excepción de los 17 mencionados).
   * Control de cifrado: Indica si hay o no datos cifrados en la carga útil de datos.
   * Control campo de adaptación: Indica si la cabecera tiene campo de adaptación. Son 2 bits no 1.
   * Control de carga: Indica si hay o no datos de carga útil. Se suele tomar el Control campo de adaptación como 2 bits y según sea 10, 01 o 11 indica si hay datos de adaptación, de carga o de ambos.
   * Contador de continuidad: El codificador lo incrementa en 1 cada vez que envía un paquete de la misma fuente. Esto permite que el decodificador sea capaz de deducir si se ha presentado una pérdida o una ganancia, incluso, de un paquete de transporte y evitar errores que no se podrían deducir de otra manera.

### Campo de adaptación

Los campos más destacables dentro del Campo de Adaptación de una cabecera son los siguientes:
   * Longitud del campo de adaptación: Indica la longitud de la cabecera extra.
   * PCR (Program Clock Reference): El PCR es una información de sincronización del reloj de 27 MHz del receptor necesaria para la decodificación del video, audio y datos. Se incluye periódicamente en los paquetes de transporte. El receptor necesita esta información – a una cadencia de unas 10 veces por segundo para hacer funcionar el bucle de fase de su oscilador local. Síncrono y en fase con el reloj PCR de 27 MHz se dispone de otro reloj de 90 kHz que se necesita en el sistema para sincronizar otras funciones.
   * Indicador de discontinuidad: Está en el PCR y en el contador de continuidad. Se utiliza para evitar pérdidas de información producidas por un salto en el codificador.
   * Bytes comodines: Son bytes de relleno para conseguir una trama de 188 bytes de información en el supuesto de que no hubiera información suficiente para llenar el paquete.
   * Cuenta atrás para corte: Indicador que permite una conmutación de paquetes limpia entre un TS y otro TS.

## Program Specific Information (PSI)

El decodificador MPEG-2, además de ser capaz de decodificar cada uno de los Elementary Streams que conforman un programa ha de ser capaz de encontrarlos dentro de una trama de transporte. El Program Specific Information (PSI) es lo que permite que el decodificador realice esa tarea.
Toda la señalización necesaria para la correcta recepción de la trama de transporte se da mediante tablas de información de servicio (Service Information Tables), que se introducen en la propia trama de transporte, divididas en secciones MPEG-2 y embutidas en paquetes de transporte. Estas tablas de señalización conforman Elementary Streams, tal y como lo hacen las tramas de video y audio. Por lo tanto, cada una viajará en paquetes de transporte con un PID único para cada Transport Stream.
Sin embargo, el mecanismo mediante el que dichos Elementary Streams se introducen en los paquetes de transporte es diferente al usado para las otras tramas. Una tabla de PSI no se introduce en un paquete PES antes de encapsularse en paquetes de transporte. Las tablas se introducen en secciones MPEG-2, las cuales pueden ser directamente introducidas en los paquetes de transporte.
Al contrario que en los PES, las secciones no empiezan y acaban forzosamente con un paquete de transporte. Cuando una sección o un PES empieza en un paquete, el indicador Payload unit start indicator (PUSI) se pone a "1". Cuando se trata de una sección, el paquete puede empezar al final de otra sección, precedida o no de un campo de adaptación (adaptation field). El primer byte de la carga útil es un indicador llamado pointer field el que da el desplazamiento del comienzo de la nueva sección con respecto a este byte.
Además de la tablas de PSI, MPEG-2 define una estructura de secciones privadas (private sections) mediante la cual el estándar es extensible. Además, estas tablas nos permiten la transmisión de datos privados. Cada tabla está constituida, según su importancia, por una o varias secciones (256 como máximo, con una longitud máxima de 1024 bytes, salvo para la tabla private que puede alcanzar los 4026 bytes).

### Tablas obligatorias de MPEG-2

   * PAT (Program Association Table)
       La PAT nos da información sobre todos los programas presentes en un Transport Stream. A través de ella, sabemos en qué PID viajan las tablas PMT que nos dan información sobre cada uno de los programas. La PAT siempre viaja en paquetes de transporte con PID=0. Evidentemente la tabla PAT será única para cada trama de transporte.
   * PMT (Program Map Table):
       Existe una PMT por cada programa presente en el Transport Stream. En ella se da información sobre todos los Elementary Streams asociados a un programa, de tal forma que el receptor es capaz de localizarlos y decodificarlos. Por lo tanto para cada Elementary Stream nos indica:
         * PID en el que viaja la trama fundamental.
         * Tipo de trama fundamental (vídeo, audio, datos...).
         * Descriptores asociados a la trama fundamental.
       El PID en el que viaja cada una de las PMTs (una para cada programa presente en la trama de transporte) es asignado por la PAT.
   * CAT (Conditional Access Table)
       Nos da información sobre el sistema de acceso condicional presente en el transport stream. Sólo es obligatoria en caso de que algún programa del transport stream esté codificado. La tabla CAT siempre viaja en paquetes de transporte de PID = 1.
   * NIT (Network Information Section)
       Transporta información de red. Esta red puede estar formada por varios canales físicos diferentes, que a su vez transporten tramas de transporte independientes entre sí. El PID en el que viaja la NIT es asignado por la PAT. La NIT es una tabla opcional, pero en caso de estar presente, conforma el programa número 0 en la PAT.