# MPEG-PSI

MPEG-PSI (MPEG - Program Specific Information) es un multiplexor de transporte de MPEG-2 que puede transportar varios programas, cada uno compuesto por uno o varios trenes elementales de paquetes (PES), de manera que para guiar y simplificar los procesos de desmultiplexación y presentación de los programas en el decodificador, MPEG-2 define cuatro tipo de tablas que juntas constituyen la información específica de los programas (PSI). Estas tablas son:
* Program Association Table (PAT), tabla de asociación de programas,
* Program Map Table (PMT), tabla de mapa de programa,
* Conditional Acces Table (CAT), tabla de acceso condicional, y
* Network Information Table (NIT), tabla de información de red.
Cada tabla está formada por paquetes de datos que son reconocidos por un particular identificador de paquete (PID).
La PMT define los PID que identifican los flujos de datos individuales paquetizados que constituyen un programa. Estas corrientes individuales se denominan corrientes elementales en el estándar MPEG. Estas corrientes elementales pueden incluir corrientes de datos como video, audio para diferentes lenguas y títulos de flujos de datos.
PAT asocia el número de un programa con los PID que permiten la identificación y ensamblaje de los paquetes que comprenden el PMT.
NIT es una tabla opcional pero puede ser estructurada y usada para definir parámetros de la red física. como por ejemplo las frecuencias de los canales en transmisión por satélite o los canales de transponder.
CAT contiene la información condicional de acceso, como los códigos de cifrado que dependen de los derechos de usuario.

## PAT

En la Transport Stream (corriente de programa) los paquetes identificados con el número 0 (PID=0x0000), son los que hacen referencia a la tabla PAT, los cuales son de presencia obligatoria, además son los más importantes en la jerarquía de la información específica de programas.
Su función es la de indicar para cada programa transportado por el multiplexor de transporte, la relación entre el número de programa (de 0 a 65535) y el PID de los paquetes que transportan una tabla que indica los datos que identifican el programa (PMT). De manera que todos los programas del multiplexor en el transport stream (TS) son listados indicando que PMT transporta y sus PID, cada entrada en la PAT apunta a una PMT. La primera entrada, programa 0, es reservado para datos de red y contiene el PID de los paquetes de la NIT. La PAT siempre se transmite de forma clara, aunque todos los programas estén cifrados.
A continuación se hace una descripción de un paquete de datos conteniendo una tabla PAT.
Descripción PAT :
| Cuando existe | Campo PAT | Comentario | Número de bits |
| | Table ID | Este campo identifica el contenido del TS, siempre a 0x0000 para PAT | 8 |
| | section syntax error | siempre a 1 | 1 |
| | <<0>> | | 1 |
| | reserved | | 2 |
| | Section length | Informa del número de programas que se enumeran a continuación, especificando el número de bytes de esta sección, comenzando inmediatamente después de este campo e incluyendo el CRC. Los dos primeros bits deben ser cero, valor máximo 1021. | 12 |
| | transport stream ID | Identificación del tren en una red. | 16 |
| | reserved | | 2 |
| | version number | Incrementado a 1 cada modificación de programa. | 5 |
| | current next indicator | Cuando es "1" indica que la PAT que se envió es aplicable. Cuando el bit es "0", indica que la tabla enviada aún no es aplicable y será aplicable la siguiente. | 1 |
| | section number | Número de la sección en curso, primera será igual a 0. | 8 |
| | last section number | Número de la última sección (Ntot -1) | 8 |
| | program number 0 | Programa igual a 0 corresponde a la tabla de información de red (NIT). | 16 |
| | reserved | | 3 |
| | network PID | PID de la tabla de información de red. | 13 |
| Repetido N veces dependiendo de section length | Program num | Número de programa (1 a 65535). | 16 |
| Repetido N veces dependiendo de section length | reserved | Siempre configurado a '111' | 3 |
| Repetido N veces dependiendo de section length | program map PID | PID de la tabla de identificación de programa (PMT). | 13 |
| | CRC32 | 32 | |

## PMT

Existe una tabla PMT (Program Map Table) por programa presente en el multiplexor. Principalmente indica (sin cifrar) los PID de los trenes elementales que constituyen el programa y, opcionalmente, otra información privada relativa al programa, que eventualmente puede ser cifrada (por ejemplo, ECM para el control de acceso). El PMT proporciona información sobre cada programa presente en transport stream, incluida la program_number, y la lista de elementary streams que componen el programa. Cada corriente primaria se etiqueta con un valor stream_type (video, audio, datos...) PMT también incluye campos de longitud variable llamados ‘descriptores’ que pueden incluir datos opcionales que describen el programa completo o corrientes individuales en el servicio del programa.
A continuación se hace una descripción de un paquete de datos conteniendo una tabla PMT.
Descripción PMT :
| Campo (PMT) | Comentario | Número de bits |
| table ID | Siempre a 0x02 para PMT | 8 |
| section syntax indicator | Siempre a 1. | 1 |
| <<0>> | | 1 |
| reserved | | 2 |
| section length | Número de programas listados abajo, los dos primeros bits siempre a 0, valor máximo 1021. | 12 |
| program number | Especifica el programa descrito a continuación. | 16 |
| reserved | | 2 |
| version number | Incrementado por 1 cada modificación de PMT. | 5 |
| current Next indicator | Si el valor es 1 la tabla es vigente, si el valor es 0 la siguiente tabla será válida. | 1 |
| section number | Siempre 0x00 | 8 |
| last Section number | Siempre 0x00 | 8 |
| reserved | | 3 |
| PCR PID | PID de la Program Cock Reference (PCR). | 13 |
| reserved | | 4 |
| program info length | Longitud total de los datos útiles (bytes). | 12 |
| stream type1 | Naturaleza del tren elemental n.º 1. | 8 |
| reserved | | 3 |
| elementary PID1 | PID del tren elemental n.º 1. | 13 |
| reserved | | 4 |
| ES info length1 | N1=nº de bytes de los descriptores siguientes. | 12 |
| descriptors1 | Ddatos complementarios | N1 bytes |
| stream type2 | Naturaleza del tren elemental n.º 2. | 8 |
| reserved | | 3 |
| elementary PID2 | PID del tren elemental n.º 2. | 13 |
| reserved | | 4 |
| ES info length2 | N2=nº de bytes de los descriptores siguientes. | 12 |
| descriptors2 | Datos complementarios. | N2 bytes |
| ..., etc.(ES nº.x) | | ... |
| CRC32 | CRC sobre 32 bits. | 32 |

## CAT

La tabla CAT (Conditional Access Table) debe estar presente a partir del momento en que al menos un programa sea de acceso condicional. Se transporta por los paquetes de PID=0x0001 e indica los PID de los paquetes que transportan los EMM por uno a varios sistemas de control de acceso (una de las informaciones necesarias para el descifrado de los programas de acceso condicional).
La norma MPEG-2 prevé la posibilidad de añadir informaciones complementarias opcionales que permiten que el receptor se configure automáticamente, al tiempo que ofrece al usuario la posibilidad de ‘navegar’ entre los numerosos servicios que se ofertan.
A continuación se hace una descripción de un paquete de datos conteniendo una tabla CAT.
Descripción CAT :
| Campo (CAT) | Comentario | Número de bits |
| table ID | Siempre a 0x0001 para CAT | 8 |
| section syntax indicator | Siempre a 1 | 1 |
| <<0>> | | 1 |
| reserved | | 2 |
| section length | 2 bits de mayor peso a 0, valor máximo 1021. | 12 |
| reserved | | 16 |
| reserved | | 2 |
| version number | Incrementado por 1 cada modificación de CAT. | 5 |
| current next indicator | Si el valor es 1 la tabla es vigente, si el valor es 0 la siguiente tabla será válida | 1 |
| section number | Número de la sección en curso (1ª==0). | 8 |
| last section number | Número de la última sección (Ntot-1). | 8 |
| descriptors | Datos de control de acceso. | máximo 1012 bytes |
| CRC32 | CRC sobre 32 bits. | 32 |

## NIT

La tabla NIT (Network Information Table) transmite la información relativa a la organización física del multiplexor y características de la propia red. Esta tabla de información de red, transporta informaciones específicas relativas a una red formada por varios canales físicos (por tanto varios trenes de transporte independientes) tales como (mínimo) las frecuencias y/o los números de los canales de red utilizados en la configuración del receptor. Esta tabla además contiene el flujo de datos privados de información como teletexto, subtítulos, etc.
Esta tabla, si está presente, constituye por definición el programa 0 del multiplexor y es considerada como datos privados.
Descripción NIT :
| Campo (privado) | Comentario | Número de bits |
| table ID | Libre (excepto de 00h a 3FH y FFH | 8 |
| section syntax indicator | 0=formato libre después de lenght, 1=estándar. | 1 |
| private indicator | Marcador (uso definido por el usuario). | 1 |
| reserved | | 2 |
| private section length | 2 bits de mayor peso a 1, valor máximo 4093. | 12 |
| private data byte | Datos privados. | Máximo 4093 bytes |

## Cómo funciona

En el Transport Stream, todos los paquetes pertenecientes a un Elementary Stream (ES) dado, tendrán el mismo identificador (PID). El demultiplexor podrá seleccionar fácilmente todos los datos para un ES dado (video, audio o datos) simplemente aceptando los paquetes con el PID correcto.
La información específica de programa (PSI) es transportada en paquetes con único e inconfundible PID, algunos son estandarizados y otros son especificados por la PAT y CAT. Estos paquetes deben ser incluidos de forma periódica en cada transport stream.
Cuando el transport stream es recibido, el demultiplexor debe buscar los PID 0 y 1 en las cabeceras de los paquetes. Todos los paquetes con PID 0 contienen la PAT y todos con PID 1 contienen la CAT. A partir de la PAT, el demultiplexor puede encontrar los PID de la NIT y de cada PMT. Recuperando los paquetes que contienen los PMT, el demultiplexor podrá obtener los PID de cada elementary stream que componen el programa deseado. De manera que si es requerido la decodificación de un programa particular, todo lo que necesitaremos para encontrar todos los elementary streams conformando un programa, será la PAT y entonces la PMT del programa a presentar. Si el programa está cifrado, el acceso a la CAT será necesario.