tauja.ujaen.estauja.ujaen.es/bitstream/10953.1/11283/1/TFG... · Herramienta de Análisis de...
Transcript of tauja.ujaen.estauja.ujaen.es/bitstream/10953.1/11283/1/TFG... · Herramienta de Análisis de...
Escu
ela
Po
lité
cn
ica
Su
pe
rio
r d
e L
ina
res
HERRAMIENTA DE ANÁLISIS DE
UN TRANSPORT STREAM DVB-T
ESCUELA POLITÉCNICA
SUPERIOR DE LINARES
HERRAMIENTA DE ANÁLISIS DE
UN TRANSPORT STREAM DVB-T
ESCUELA POLITÉCNICA
SUPERIOR DE LINARES
Alumno: Mireya Aguilera Martos
Tutor: Prof. D. Luis Ramón López López
Co-tutor: Prof. D. José Enrique Muñoz Expósito
Depto.: Ingeniería de Telecomunicación
Febrero, 2020
UNIVERSIDAD DE JAÉN
Escuela Politécnica Superior de Linares
Trabajo Fin de Grado
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
2
UNIVERSIDAD DE JAÉN
Escuela Politécnica Superior de Linares
Grado en Ingeniería de Tecnologías de Telecomunicación
Trabajo Fin de Grado
Herramienta de Análisis de un Transport Stream DVB-T
Alumno: Mireya Aguilera Martos
Fdo.________________________
Tutor: Luis Ramón López López
Fdo.________________________
Tutor: José Enrique Muñoz Expósito
Fdo.________________________
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
3
Índice de contenido
ÍNDICE DE ILUSTRACIONES .............................................................................. 7
ÍNDICE DE TABLAS ............................................................................................. 8
1. RESUMEN ...................................................................................................... 9
1.1. RESUMEN .................................................................................................. 9
1.2. ABSTRACT ................................................................................................. 9
Lista de Acrónimos ........................................................................................10
2. ESTADO DEL ARTE Y OBJETIVOS .............................................................12
2.1. OBJETIVOS ...............................................................................................12
2.2. ESTADO DEL ARTE ....................................................................................12
2.3. JUSTIFICACIÓN DE LAS DECISIONES ADOPTADAS .........................................14
2.4. ORGANIZACIÓN DEL TRABAJO ....................................................................16
3. EVOLUCIÓN DE LA TELEVISIÓN DIGITAL .................................................17
3.1. ORÍGENES DE LA TELEVISIÓN. ....................................................................17
3.2. HISTORIA DE LA TELEVISIÓN EN ESPAÑA .....................................................21
4. ESTÁNDAR MPEG-2 Y APLICACIÓN EN DVB-T .........................................24
4.1. INTRODUCCIÓN .........................................................................................24
4.2. TABLAS DE INFORMACIÓN DE SERVICIO (SI) ...............................................28
4.2.1. Mecanismo de tablas SI. Uso de secciones ........................................28
4.3. MAPEO DE SECCIONES EN UN PAQUETE TS. ...............................................29
4.4. CODIFICACIÓN DE LOS CAMPOS PID Y TABLE_ID .........................................29
4.4.1. Program Association Table (PAT).......................................................29
4.4.2. Conditional Access Table (CAT) .........................................................29
4.4.3. Program Map Table (PMT) .................................................................29
4.4.4. Network Information Table (NIT) .........................................................30
4.4.5. Bouquet Association Table (BAT) .......................................................30
4.4.6. Service Description Table (SDT) ........................................................30
4.4.7. Event Information table (EIT) ..............................................................30
4.4.8. Running Status Table (RST) ...............................................................30
4.4.9. Time and Date Table (TDT) ................................................................30
4.4.10. Time Offset Table (TOT) ...................................................................30
4.4.11. Stuffing Table (ST) ............................................................................30
4.4.12. Selection Information Table (SIT) ......................................................30
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
4
4.4.13. Discontinuity Information Table (DIT) ................................................31
4.5. TABLAS DEFINIDAS EN EL ESTÁNDAR INTERNACIONAL ISO/IEC 13818-1 .......31
4.5.1. Capa de paquetes de Transport Stream .............................................31
4.5.2. Transporte de secuencias de programas y secuencias de sistemas
ISO/IEC 11172-1 en el Transport Stream .................................................................33
4.5.3. Información específica de programa (PSI). .........................................34
4.5.4. Tabla de Asociación de Programas (PAT) ..........................................35
4.5.5. Tabla de Acceso Condicional (CAT) ...................................................37
4.5.6. Tabla de Mapeo de Programas (PMT) ................................................37
4.6. DEFINICIÓN SEMÁNTICA DE CAMPOS EN DESCRIPTORES DE ELEMENTOS DE
PROGRAMA 39
4.6.1. Video Stream Descriptor .....................................................................40
4.6.2. Audio Stream Descriptor .....................................................................41
4.6.3. Hierarchy Descriptor ...........................................................................42
4.6.4. Registration Descriptor .......................................................................43
4.6.5. Data Stream Aligment Descriptor .......................................................44
4.6.6. Target Background Grid Descriptor ....................................................45
4.6.7. Video Window Descriptor ...................................................................46
4.6.8. Conditional Access Descriptor ............................................................47
4.6.9. ISO 639 Language Descriptor ............................................................48
4.6.10. System Clock Descriptor ...................................................................49
4.6.11. Multiplex Buffer Utilization Descriptor ................................................50
4.6.12. Copyright Descriptor .........................................................................50
4.6.13. Maximum Bitrate Descriptor ..............................................................51
4.6.14. Private Data Indicator Descriptor ......................................................51
4.6.15. MPEG-4 Video Descriptor .................................................................52
4.6.16. MPEG-4 Audio Descriptor .................................................................52
4.6.17. SL Descriptor ....................................................................................52
4.6.18. FMC Descriptor .................................................................................53
4.6.19. External_ES_ID Descriptor ...............................................................54
4.6.20. Multiplex Buffer Descriptor ................................................................55
5. REVISIÓN DEL ALGORITMO Y PROCESO DE DESARROLLO ..................56
5.1. ENTORNO DE TRABAJO ..............................................................................56
5.2. REVISIÓN DEL ALGORITMO .........................................................................57
5.2.1. Código de análisis de la cabecera de un Transport Stream ................58
5.2.2. Diagrama de flujo de la lectura de bytes. ............................................60
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
5
5.2.3. Algoritmo de lectura de N bits. ............................................................61
5.2.4. Algoritmo de salto de N bits. ...............................................................62
5.2.5. Algoritmo de lectura de una cadena de caracteres. ............................63
5.2.6. Código de análisis de la PAT. .............................................................63
5.2.7. Código de análisis de la SDT. .............................................................65
5.2.8. Código de análisis de la PMT. ............................................................66
5.3. INSERCIÓN DEL CONTENIDO EN UNA BASE DE DATOS ...................................68
5.4. VISUALIZACIÓN DEL CONTENIDO DEL TRANSPORT STREAM ..........................69
5.4.1. Página principal ..................................................................................69
5.4.2. Lista de programas .............................................................................69
5.4.3. Lista de componentes.........................................................................69
5.4.4. Página de administración ...................................................................69
5.4.5. Inserción de un Transport Stream.......................................................69
6. RESULTADOS OBTENIDOS ........................................................................71
6.1. PÁGINA PRINCIPAL ....................................................................................72
6.2. LISTA DE PROGRAMAS ...............................................................................73
6.3. LISTA DE COMPONENTES ...........................................................................74
6.4. PÁGINA DE ADMINISTRACIÓN ......................................................................75
6.5. ADMINISTRACIÓN DE TRANSPORT STREAM .................................................76
7. DIFICULTADES ENCONTRADAS ................................................................77
8. CONCLUSIONES Y LÍNEAS DE FUTURO ...................................................78
ANEXO A: CÓDIGO DE PROYECTO ..................................................................80
1. TRANSPORTSTREAMPARSER.PHP ..................................................................80
2. INDEX.PHP ................................................................................................. 113
3. SHOWSDT.PHP .......................................................................................... 117
4. SHOWPROGRAM.PHP ................................................................................. 119
5. PANEL-CONTROL.PHP ................................................................................. 123
6. CHECKLOGIN.PHP ....................................................................................... 126
7. LOGOUT.PHP .............................................................................................. 127
8. SELECT.PHP............................................................................................... 128
9. DELETEMODIFY.PHP ................................................................................... 132
10. PID.PHP ................................................................................................. 136
11. INSERTFILE.PHP ..................................................................................... 137
12. CONFIG.PHP ........................................................................................... 139
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
6
ANEXO B. ACCESO A LA BASE DE DATOS ................................................... 140
ANEXO C. TABLA DE ISO/IEC 8859-1. ALFABETO LATINO N.1 ................... 142
BIBLIOGRAFÍA ................................................................................................. 143
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
7
Índice de ilustraciones
Figura 2.1.Arquitectura de la aplicación en modo usuario¡Error! Marcador no
definido.
Figura 2.2.Arquitectura de la aplicación en modo administrador¡Error! Marcador no
definido.
Figura 2.3. Diagrama de ejemplo de uso de la herramienta¡Error! Marcador no
definido.
Figura 3.1. Funcionamiento de un disco de Nipkow................................................ 17
Figura 3.2.Representación esquemática de un escaneo progresivo. ...................... 17
Figura 3.3. Esquema de un iconoscopio. ................................................................ 18
Figura 3.4. Representación esquemática de un escaneo entrelazado. ................... 19
Figura 3.5. Vista de una línea de una señal de vídeo compuesta monocromática. . 19
Figura 4.1. Generación de un Transport Stream ..................................................... 25
Figura 4.2. Proceso de demultiplexado de transporte para un programa ................ 26
Figura 4.3.Tablas MPEG-2 ..................................................................................... 27
Figura 4.4. Relación entre las tablas a analizar por la herramienta ......................... 27
Figura 4.5. Área de visualización del Target Background Grid Descriptor .............. 45
Figura 5.1. Esquema de un paquete Transport Stream .......................................... 59
Figura 5.2. Diagrama de flujo de leerN ................................................................... 61
Figura 6.6.1. Página principal ................................................................................. 72
Figura B.0.1. Estado de WAMPServer.................................................................. 140
Figura B.0.2. Página de acceso a phpMyAdmin ................................................... 140
Figura B.0.3. Vista general de la base de datos dvbmpeg .................................... 141
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
8
Índice de tablas
Tabla 1. Esquema de un Transport Stream ..........................................................31
Tabla 2. Valor de adaptation_field_control ............................................................32
Tabla 3. Tablas PSI ..............................................................................................34
Tabla 4. Esquema PAT ........................................................................................35
Tabla 5. Valores del campo table_id .....................................................................36
Tabla 6. Esquema CAT ........................................................................................37
Tabla 7. Esquema PMT ........................................................................................38
Tabla 8. Valores del campo descriptor_tag ...........................................................39
Tabla 9. Esquema de Video Stream Descriptor ....................................................41
Tabla 10. Esquema de Audio Stream Descriptor ..................................................41
Tabla 11. Esquema de Hierarchy Descriptor ........................................................42
Tabla 12. Valores del campo hierarchy_type ........................................................43
Tabla 13. Esquema de Registration Descriptor .....................................................43
Tabla 14. Esquema de Data Stream Alignment Descriptor ...................................44
Tabla 15. Valores del campo alignment_type para vídeo .....................................44
Tabla 16. Valores del campo alignment_type para audio .....................................45
Tabla 17. Esquema de Target Background Grid Descriptor ..................................45
Tabla 18. Esquema de Video Window Descriptor .................................................46
Tabla 19. Esquema de Conditional Access Descriptor .........................................47
Tabla 20. Esquema de ISO 639 Language Descriptor ..........................................48
Tabla 21. Valores del campo audio_type ..............................................................49
Tabla 22. Esquema de System Clock Descriptor ..................................................49
Tabla 23. Esquema de Multiplex Buffer Utilization Descriptor ...............................50
Tabla 24. Esquema de Copyright Descriptor ........................................................50
Tabla 25. Esquema de Maximum Bitrate Descriptor .............................................51
Tabla 26. Esquema de Private Data Indicator Descriptor .....................................51
Tabla 27. Esquema de MPEG-4 Video Descriptor ................................................52
Tabla 28. Esquema de MPEG-4 Audio Descriptor ................................................52
Tabla 29. Esquema de SL Descriptor ...................................................................53
Tabla 30. Esquema de FMC Descriptor ................................................................53
Tabla 31. Esquema de External ES ID Descriptor ................................................54
Tabla 32. Esquema de Multiplex Buffer Descriptor ...............................................55
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
9
1. RESUMEN
1.1. Resumen
Este Trabajo de Fin de Grado es una herramienta que permite el estudio de la
estructura de un Transport Stream DVB-T con fines didácticos, que se enmarca dentro del
campo de procesado de señales de vídeo. El trabajo consistirá en el desarrollo de una
aplicación capaz de analizar, mediante la interacción con el usuario, un elemento de tipo
Transport Stream para poder determinar y mostrar el contenido almacenado. Esta
herramienta se va a desarrollar en NetBeans IDE 8.2, en código PHP, HTML y SQL. La
herramienta se visualizará desde un navegador web con pestañas interactivas que mostrará
al usuario el contenido almacenado en la base de datos tras analizar el Transport Stream,
así como la modificación de la descripción y eliminación del mismo.
Palabras clave: procesado de vídeo, MPEG, DVB-SI, HTML, PHP, SQL.
1.2. Abstract
In this dissertation, we propose a practical tool that allows the study of the structure of
a Transport Stream DVB-T with didactics purposes, which is part of the field of video signal
processing. The work will consist in the development of an application capable of analysing,
through interaction with the user, an element of Transport Stream type to be able to determine
and show the stored content. This tool will be developed in NetBeans IDE 8.2, in PHP, HTML
and SQL code. The tool will be displayed from a web browser with interactive tabs that will
show the user the content stored in the database after analysing the Transport Stream, as
well as the modification of the description and removal of it.
Key words: MPEG, DVB-T, video signal processing, HTML, PHP, SQL.
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
10
Lista de Acrónimos
TDT Televisión Digital Terrestre
DVB-T Digital Video Broadcasting-Terrestrial
MPEG Moving Pictures Expert Group
COFDM Coded Orthogonal Frequency Division Multiplexing
CRT Cathode Ray Tube
VHF Very High Frequency
NTSC National Television System Committee
CCIR International Radio Consultative Committee
SECAM Sequential colour with memory
PAL Phase Alternating Line
EMM Entitlement Management Message
ETM Extended Text Message
ECM Entitlement Control Messages
PCR Program Clock Reference
PES Packetized Elementary Stream
IPTV Internet Protocol TV
ADSL Asymmetric digital subscriber line
FTTH Fiber To The Home
TS Transport Stream
PAT Program Association Table
PMT Program Map Table
SDT Service Description Table
GUI Graphical User Interface
PHP PHP: Hypertext Preprocessor
MySQL My Structured Query Language
SQL Structured Query Language
SI Service Information
MPEG Moving Picture Experts Group
NIT Network Information Table
ES Elementary Stream
PES Packetized Elementary Stream
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
11
PSI Program Specific Information
CAT Conditional Access Table
BAT Bouquet Association Table
EIT Event Information Table
RST Running Status Table
TDT Time and Date Table
TOT Time Offset Table
ST Stuffing Table
SIT Section Information Table
DIT Discontinuity Information Table
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
12
2. ESTADO DEL ARTE Y OBJETIVOS
2.1. Objetivos
El principal objetivo de este trabajo de fin de grado es el desarrollo y la
implementación de una herramienta capaz de analizar la unidad básica de transporte digital
del estándar MPEG-2, el Transport Stream, a través del lenguaje de programación PHP. A
partir de un fichero de entrada, la herramienta será capaz de extraer las diferentes tablas y
partes que componen un Transport Stream y visualizar el contenido extraído en un
navegador, donde permitirá al usuario ver la relación existente entre las diferentes partes del
Transport Stream analizado. Además, dicha herramienta almacenará el contenido extraído
del Transport Stream en una base de datos, la cual podrá ser modificado su contenido o
eliminar alguno de sus registros.
Con el fin de conseguir este objetivo principal, se han propuesto conseguir los
siguientes objetivos:
• Diseño de una herramienta que permita estudiar la estructura de un Transport
Stream DVB-T.
• Implementación de la herramienta.
• Documentación acerca del uso de la herramienta
2.2. Estado del arte
En las últimas décadas, la digitalización como concepto ha abarcado todo el amplio
abanico de la tecnología y la televisión no ha estado exenta de ello. La Televisión Digital
Terrestre, también conocida como TDT, combina la televisión digital con la transmisión
terrestre, emitiendo por los canales de la televisión convencional analógica. La novedad de
la TDT es su difusión a través de ondas hertzianas terrestres y, además, es de uso gratuito,
en el sentido que no hay que realizar el pago de ninguna cuota mensual para poder tener
acceso al contenido. [1]
La TDT consigue aumentar la oferta de programas, mejorar la calidad de imagen y
sonido, facilitar la recepción, ampliar la interactividad, ofrecer aplicaciones multimedia y
permitir programas con diferentes coberturas: nacional, autonómica y local. Uno de los
principales atractivos es la interactividad, con la que se facilita la interacción de los usuarios
con la programación y, además, ofrece servicios y aplicaciones útiles para el comercio,
información y aprendizaje, entre otros. [1]
Con este antecedente, se puede observar que la Televisión Digital Terrestre
comprende una innovación tecnológica muy importante. Como parte de este proceso, nos
encontramos con la etapa de multiplexación de las señales. El estándar DVB-T, Difusión de
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
13
Video Digital-Terrestre, utiliza MPEG-2 para la transmisión de audio, vídeo y otros datos,
usando una modulación de “Multiplexación por División de Frecuencia Ortogonal Codificada”
(COFDM). MPEG-2 es similar a MPEG-1, pero también proporciona soporte para vídeo
entrelazado y tiene disposiciones para una compatibilidad hacia HDTV mediante el uso de
niveles y perfiles más altos. Esto dio lugar a la estandarización de tres variantes para los
diversos medios de transmisión: satélite (DVB-S), cable (DVB-C) y terrestre (DVB-T), que se
produjo entre 1994 y 1996. [2]
En los últimos años del siglo XX, han aparecido otras formas de televisión digital:
televisión digital por cable, televisión digital terrestre (TDT) y, más recientemente, televisión
digital a través de la línea de abonado de teléfono (IPTV sobre ADSL o FTTH). Estos
desarrollos han provocado el desuso de la televisión analógica en Europa. [2]
Por otro lado, la rápida disminución de los precios de los televisores grandes de
pantalla plana con una resolución compatible con los requisitos de HDTV los hace ahora
accesibles a un público que ha ido aumentando en número. Esta caída de precios coincide
con la disponibilidad de estándares de compresión más efectivos (como MPEG-4 AVC/
H.264) que, finalmente, han permitido el desarrollo a gran escala de HDTV en Europa.
En la actualidad, se pueden encontrar un sinfín de opciones que permiten al usuario
el estudio de un Transport Stream sin necesidad de un demultiplexor para el estudio de su
contenido. Por ejemplo, podemos encontrar herramientas como:
• Programa de análisis de streams DVB/MPEG, DVBSNOOP, cuyo propósito
es depurar, volcar o ver la información de la transmisión digital enviadas por
satélite, cable o terrestre [1]. Para poder visualizar el valor de los PIDs
transmitidos es necesario ejecutar en Linux el programa dvbsnoop con el
parámetro -s pidscan -tssubdecode -pd 6. Para poder acceder a los datos
asociados a la PAT se deberá ejecutar la utilidad con los siguientes
parámetros: dvbsnoop -s ts -pd 4 -tssubdecode -nph 0x00. Tras lanzar este
comando, se visualizará una lista de los programas y el PID asociado.
• Programa de análisis de streams DemuxToy Middleware Analyser [2]. Se
trata de una aplicación que, introduciendo un fichero como parámetro de
entrada, devuelve el contenido que se encuentra en el Transport Stream.
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
14
• Programa de análisis de streams DVB Inspector [3]. Es un analizador de
código abierto DVB, escrito en Java. Puede mostrar la estructura lógica de los
datos DVB SI y PSI. También muestra datos de uso de velocidad de bits. Se
puede utilizar para analizar contenidos; estructura de video MPEG, teletexto,
subtítulos DVB, carruseles de objetos DSM-CC, etc.
La gran mayoría de los programas que analizan Transport Stream ofrecen una serie
de inconvenientes que resulta conveniente resaltar:
• Dan demasiada información al usuario y no muestran la relación que existe
entre las diferentes tablas que forman el Transport Stream.
• Son complejos de usar y requieren de un conocimiento previo de la materia
para facilitar la navegación entre la información.
• No están disponibles sin conexión. Algunos programas necesitan de una
conexión a Internet para poder realizar el análisis de los datos.
• Son aplicaciones de pago. Algunas aplicaciones requieren de su compra por
parte del usuario para poder acceder a su uso.
• Resultan poco pedagógicos. El contenido que muestran no está adaptado
para un uso docente o para una fácil comprensión por parte de un alumno
que visualiza por primera vez el contenido de un Transport Stream.
• Requieren del sistema operativo Linux para poder ejecutar la aplicación.
Este trabajo se enfocará precisamente en el estudio del estándar MPEG-2 y de la
unidad básica de transporte digital, los paquetes MPEG-2 Transport Stream de una manera
didáctica, fácil, intuitiva y sin necesidad de tener acceso a una conexión de Internet por parte
del usuario.
2.3. Justificación de las decisiones adoptadas
A la hora de desarrollar este proyecto uno de los puntos fundamentales fue la
intención de uso de esta herramienta. Un ejemplo de ello sería en un aula donde un profesor
realiza una captura de un Transport Stream mediante un capturador y lo inserta en la
aplicación, en modo administrador, para su análisis. Después, el alumno desde su
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
15
ordenador, podrá acceder a la aplicación en modo usuario y visualizará un listado con los
Transport Streams que han sido insertados por el profesor y profundizar en el contenido de
éstos de una manera rápida y eficaz.
Si el profesor necesitase añadir un nuevo archivo para analizar, los resultados de
éste se mostrarían en el ordenador del usuario tras un periodo corto de tiempo.
Figura 2.1. Diagrama de ejemplo de uso de la herramienta
Otro de los puntos fue qué tipo de herramienta se quería implementar. Existía la
opción de implementar una aplicación de escritorio o una aplicación web. La elección de
desarrollar una aplicación web se basó principalmente en la libertad de ejecución que tiene,
pues cualquier ordenador con la aplicación WAMPServer instalado es capaz de ejecutar esta
herramienta sin necesidad de instalar contenido adicional.
Otro de los puntos fundamentales para el desarrollo fue la elección del lenguaje de
programación que se iba a implementar. Se eligió finalmente el uso de PHP junto a SQL.
PHP es un lenguaje de código abierto especialmente adecuado para el desarrollo web y que
puede ser incrustado en HTML. Además, lo que distingue a PHP de algo del lado del cliente
como JavaScript es que el código es ejecutado en el servidor, generando HTML y enviándolo
al cliente. El cliente recibirá el resultado de ejecutar el script, aunque no se sabrá el código
Profesor Estudiante
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
16
subyacente que era. El servidor web puede ser configurado para que procese todos los
ficheros HTML con PHP, por lo que no hay manera de que los usuarios puedan saber qué
se tiene debajo de la manga. [6]
La elección de MySQL como gestor de la base de datos de nuestra herramienta se
basó en la adaptabilidad existente entre PHP y SQL. Es relativamente sencillo generar una
conexión entre PHP y MySQL para poder gestionar los datos que se analizarán a lo largo de
la ejecución de la herramienta, así como poder crear conexiones con programas externos
como HeidiSQL o Microsoft Management SQL Server.
2.4. Organización del trabajo
La memoria se dividirá en tres bloques bien diferenciados:
• En primer lugar, los apartados 3 y 4 servirán como revisión de conocimientos.
Se incluirá una introducción de la evolución de la televisión en España y su
digitalización, así como una introducción teórica del estándar MPEG para
comprender mejor el trabajo realizado. En concreto, en el apartado 3, se hablará
sobre conceptos generales de vídeo y de la digitalización de estándares de
televisión. El apartado 4 servirá como revisión de los conocimientos
relacionados con el estándar MPEG y su aplicación en DVB-T.
• En el apartado 5, se describirá el algoritmo utilizado y el proceso de desarrollo
de la herramienta de análisis de un Transport Stream DVB-T. También se
incluirá un esquema general de la aplicación que permitirá comprender el
funcionamiento de la misma y las partes que la componen.
• Por último, en los apartados 6 y 7, se expondrán y evaluarán los resultados
obtenidos y las conclusiones que se pueden extraer de los mismos.
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
17
3. EVOLUCIÓN DE LA TELEVISIÓN DIGITAL
3.1. Orígenes de la televisión.
Debemos tener en cuenta que todos los estándares de televisión actuales que se
encuentran en uso en la actualidad derivan de los estándares de televisión “en blanco y
negro” que tuvieron inicio en las décadas de 1940 y 1950, que han definido su marco. Los
primeros intentos en la televisión electromecánica comenzaron a finales de la década de
1920, utilizando el disco Nipkow para el análisis y la reproducción de la escena que se
televisaría, con una definición de 30 líneas y 12.5 imágenes por segundo. [2]
Figura 3.1. Funcionamiento de un disco de Nipkow.
Esta baja definición dio resultado en un ancho de banda de vídeo de menos de 10
kHz, permitiendo que esas imágenes se transmitiesen en un transmisor AM/MW o LW
ordinario. La resolución pronto mejoró a 60, 90 e, incluso, 120 líneas, y luego se estabilizó
por un tiempo en 180 líneas (Alemania, Francia) o 240 líneas (Inglaterra, Estados Unidos)
alrededor del año 1935. El escaneo fue progresivo, lo que significa que todas las líneas de
las imágenes se escaneaban secuencialmente en un cuadro, tal y como se muestra en la
figura 3.2.
Figura 3.2.Representación esquemática de un escaneo progresivo.
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
18
Estas definiciones, utilizadas para las primeras transmisiones “regulares”, fueron el
límite práctico para el disco Nipkow utilizado para el análisis de imágenes; el tubo de rayos
catódicos (CRT) comenzó a utilizarse para la visualización en la parte del receptor. Con el
fin de evitar las perturbaciones debidas a la radiación electromagnética de los
transformadores o una ondulación en la fuente de alimentación, la velocidad de imagen (o
frame rate) se derivó de la frecuencia de la red. Esto dio lugar a tasas de actualización de
25 imágenes por segundo en Europa y 30 imágenes por segundo en Estados Unidos. El
ancho de banda requerido fue del orden de 1 MHz, lo que implica el uso de frecuencias VHF
(del orden de 40-50 MHz) para la transmisión. Sin embargo, la resolución espacial de estas
primeras imágenes de TV aún era insuficiente, y se vieron afectadas por un parpadeo muy
molesto debido al hecho de que su frecuencia de actualización era demasiado baja.
Durante los años que precedieron a la Segunda Guerra Mundial, el análisis de las
imágenes se volvió completamente electrónico con la invención del iconoscopio [3] (Figura
3.3) y las definiciones en so alcanzaron a 405 líneas (Inglaterra), 441 líneas (Estados Unidos,
Alemania) o 455 líneas (Francia) gracias al uso del escaneado entrelazado. Este ingenioso
método, inventado en 1927, consistió en escanear un primer campo formado por las líneas
impares del marco y luego un segundo campo formado por las líneas pares (Figura 3.4), lo
que permite que la tasa de actualización de la imagen para una resolución vertical dada
pueda duplicarse (50 o 60 Hz en vez de 25 o 30 Hz) sin aumentar por ello el ancho de banda
requerido para la transmisión.
Figura 3.3. Esquema de un iconoscopio.
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
19
Figura 3.4. Representación esquemática de un escaneo entrelazado.
Sin embargo, la necesidad de mantener un enlace entre la velocidad de la imagen y
la frecuencia de la red llevó inevitablemente a estándares diferentes a ambos lados del
Atlántico, incluso cuando el número de líneas era idéntico (como en el caso de los sistemas
de 441 líneas de Estados Unidos y Alemania). Estos sistemas compartían las siguientes
características comunes:
• Una señal de imagen compuesta única que combinaba información de vídeo,
blanqueo y sincronización, también descrita como señal de banda base de vídeo
(Figura 3.5).
• Un escaneo entrelazado (de orden 2), reconocido como el que tiene el mejor
compromiso entre parpadeo y ancho de banda requerido. [4]
Figura 3.5. Vista de una línea de una señal de vídeo compuesta monocromática.
Poco después, debido al aumento en el tamaño del tubo de imagen, y teniendo en
cuenta la resolución del ojo en condiciones normales de visión, la resolución espacial de
estos sistemas todavía parecía insuficiente, y la mayoría de los expertos propusieron una
definición vertical de entre 500 y 700 líneas. Las siguientes características se eligieron en
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
20
1941 para el sistema monocromático de Estados Unidos, que más tarde se convirtió en
NTSC (Comité Nacional de Sistemas de Televisión) cuando se actualizó a color en 1952:
• 525 líneas, con escaneo entrelazado (dos campos de 262.5 líneas);
• Frecuencia de campo, 60 Hz (cambiada a 59.94 Hz tras la introducción del color);
• Frecuencia de línea, 15750 Hz (60 x 262.5); más tarde cambió a 15735 Hz con
color (59.94 x 262.5);
• Ancho de banda de vídeo, 4.2 MHz; modulación de vídeo negativa;
• Sonido FM con portadora a 4.5 MHz por encima de la portadora de imágenes.
Después de la Segunda Guerra Mundial, a partir de 1949, la mayoría de los países
europeos, exceptuando Francia y Reino Unido, adoptaron el estándar alemán GERBER,
también conocido como CCIR. Puede verse como una adaptación del sistema de Estados
Unidos a una frecuencia de campo de 50 Hz, manteniendo una frecuencia de línea lo más
cercana posible a 15750 Hz; esto permitió aprovechar la experiencia estadounidense con la
tecnología de recepción. Esta elección implicó un mayor número de líneas,
aproximadamente en el radio 60/50, y, en consecuencia, un ancho de banda más amplio
para obtener resoluciones horizontales y verticales bien equilibradas. Se definieron las
siguientes características:
• 625 líneas, escaneo entrelazado (dos campos de 312.5 líneas);
• Frecuencia de campo, 50 Hz;
• Frecuencia de línea, 15625 Hz (50 x 312.5),
• Ancho de banda de vídeo, 5 MHz; modulación de vídeo negativa;
• Transmisión de sonido FM 5.5 MHz sobre la portadora de imágenes.
Esto ha formado la base de todos los estándares de color europeos: PAL, SECAM,
D2-MAC, PAL+…
Hasta principios de la década de 1980, se han utilizado diferentes sistemas en el
Reino Unido (405 líneas, lanzadas en 193 y reiniciadas después de una larga interrupción
durante la guerra) y en Francia (819 líneas, lanzadas en 1949 por Henri de France, que
también inventó el sistema SECAM en 1957). Estos sistemas no se adaptaron a la televisión
en color para la transmisión debido a la casi imposibilidad de la conversión del estándar con
los medios técnicos disponibles en ese momento, y finalmente se abandonaron después de
un período de transmisión simultánea con el nuevo estándar de color.
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
21
3.2. Historia de la televisión en España
La historia de la televisión en España está fuertemente relacionada con la de la radio.
En noviembre de 1938, durante el desarrollo de la Guerra Civil, se produjo la primera
exhibición de televisión. Diez años más tarde, se produjeron las primeras demostraciones
en España, las cuales fueron realizadas por empresas privadas como Philips y RCA, con el
fin de convencer a autoridades de difundir sus emisiones. Así, Philips organizó pruebas
televisivas difundiendo programas musicales y humorísticos para el público en 1948 en el
marco de la Feria de Muestras de Barcelona. El éxito fue inmenso. A partir de ello, en 1951-
1952, TVE comenzó sus emisiones en prueba. [5]
En octubre de 1956, comenzaron oficialmente las emisiones regulares en España.
Consistían en la retransmisión de la misa, de discursos oficiales, etc. En febrero de 1959, se
estrenaba el primer partido de fútbol. Una multitud de ciudadanos compraron televisores en
la Ciudad Condal, fue un enorme éxito. Sin embargo, y pese a su inmenso éxito, se tardó
años en que la mayoría de españoles pudieran tener acceso a los programas. Entre los años
1960 y 1964 fue llegando la televisión a los hogares.
Antes de estas fechas, un televisor era un producto de gran lujo que había que
importar desde el extranjero, y al que solamente tenían acceso una ínfima parte de la
población. A partir de los primeros años 1960, los poderes públicos plantearon políticas para
incentivar el consumo y potenciar la penetración del medio en la sociedad. Así el Estado
tomó diversas medidas como la venta a plazos y tarifas inferiores.
Al final de la década, se estimaba un total de 3 millones y medio de aparatos en
España, lo que equivalía al 40% de los hogares de todo el país. Sin embargo, había una
gran diferencia dependiendo de la zona, lugares como Madrid y Barcelona contaban con un
70% de televisores, mientras que en ciudades pequeñas apenas el 25% tenía un televisor.
Por ello, aparecieron los parques de televisores y teleclubs en las zonas rurales. Sin
embargo, su éxito fue limitado, ya que el televisor no era un aparato prioritario para los
españoles.
En la segunda mitad de los años 1960, la televisión se convirtió en la principal forma
de ocio. TVE vivía su Edad de Oro. Ya no tenía problemas financieros y proponía numerosos
programas competitivos en los festivales europeos. Así, los ingresos provenían de los
anuncios y la cadena aumentaba el tiempo de publicidad o subía las tarifas de los anuncios
cuando necesitaba fondos, pues en España la publicidad televisiva no se encontraba
prohibida o limitada.
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
22
La televisión en color apareció y cambió radicalmente la imagen de un punto de vista
técnico. TVE adoptó el sistema PAL en 1970. Los programas no eran tan diferentes de lo
presente, aunque las técnicas variaron muchísimo desde aquella época. Las cadenas
difundían producciones extranjeras, largometrajes y series.
Durante la transición (1976-1982), la televisión tuvo un papel decisivo, ya que era la
principal forma de información y conocimiento de millones de personas. Dirigió varias
operaciones:
• Erosionó los valores sociales de la dictadura y TVE se esforzó en contrarrestar
los valores de paz, orden y estabilidad que prevalecían durante el franquismo
frente a los de libertad y democracia.
• Legitimó el régimen de libertades y la televisión desarrolló tácticas programáticas
para la noche de las elecciones.
• Elaboró una política pedagógica de los nuevos valores democráticos a través de
series como Curro Jiménez, Cañas y barro, etc., donde se trataba de presentar
personajes en una sociedad en plena transformación, los cuales aprenden de sus
errores y buscan un mundo mejor.
Los gustos de los espectadores iban cambiando poco a poco a favor de programas
que reflejaron gustos más cercanos a la sensibilidad contemporánea.
En 1980, por primera vez en España, se promulgaba una reglamentación con rango
de ley, el Estatuto de la Radio y la televisión, con el objetivo de establecer una normativa
jurídica democrática que controlase el sistema televisivo español. Fue el resultado de un
consenso entre el partido del gobierno de la época (Unión de Centro Democrático) y el
principal partido de la oposición (PSOE). Ya hacía algunos años que los partidos españoles
reivindicaban la creación de un “Consejo Superior”, un órgano independiente de los poderes
públicos que organizara el sector. Estos años están marcados por el crecimiento de las horas
de emisión y de las cifras de audiencia. La televisión se convertía en un fenómeno social:
era un medio de comunicación de gran alcance y repercusión.
En los años 1990, aparecían televisiones privadas de cobertura estatal con una
programación similar a la de TV1: Antena 3, Tele 5 y Canal +. En consecuencia, todas las
emisoras tuvieron que adaptarse a un nuevo marco competitivo y reorganizar el
funcionamiento del sector en función de la audiencia.
La televisión española tuvo cambios drásticos en los últimos años, alrededor del año
2000, debido en parte a la aparición más que evidente de la competencia. Ahora, el criterio
básico consiste en satisfacer las demandas del público y conseguir el mayor número de
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
23
audiencia. Por eso, las televisiones privilegian los programas dirigidos a ciertos
consumidores para cada banda horaria. Es la razón por la que han aparecido muchos
programas minoritarios como, por ejemplo, el cine en blanco y negro o los programas
infantiles. Eso es lo que se conoce como “guerra de audiencias”, el motor de las televisiones.
El gusto del público también ha cambiado. Mientras que en los años 1980
predominaban los largometrajes estadounidenses, en la actualidad, la balanza se inclina
más hacia programas deportivos y series. Sin embargo, sigue existiendo en la actualidad los
programas especiales como los debates electorales, o las bodas reales.
En la actualidad, nos encontramos con la televisión digital, unida a internet. Los
espectadores se convierten, una vez más en usuarios-consumidores y se debe pagar por
ciertos servicios interactivos adicionales como, por ejemplo, televisión a la carta. Este es el
claro ejemplo de cómo ciertas plataformas han sufrido un crecimiento exponencial en los
últimos años, siendo Netflix su máximo exponente, seguido de plataformas como HBO y
Amazon Prime. [6]
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
24
4. ESTÁNDAR MPEG-2 Y APLICACIÓN EN DVB-T
4.1. Introducción
Para poder comentar las características del estándar MPEG y DVB-T, antes hay que
realizar una introducción de estos términos y la relación que existe entre ambos.
MPEG-2, Moving Picture Experts Group 2, es la designación para un grupo de
estándares de codificación de audio y vídeo acordado por MPEG y publicados como
estándar ISO 13818. Por lo general se usa este grupo de estándares para la codificación de
audio y vídeo en señales de transmisión, que incluyen Televisión Digital Terrestre, por
satélite o cable. [11]
Este grupo de estándares introduce y define Transport Streams, que son diseñados
para transportar audio y vídeo digital a través de medios impredecibles e inestables y son
utilizados en transmisiones televisivas.
Un Transport Stream es un protocolo de comunicación para audio, vídeo y datos
especificado en los estándares de MPEG-2. Los flujos de datos de cada programa de
televisión se comprimen independientemente formando cada uno de ellos un ES (Elementary
Stream) o “corriente elemental” que, a su vez se estructuran en forma de paquetes llamados
PES (Packetized Elementary Stream). [12]
Estos paquetes de audio y vídeo, así como otros datos del programa, pasan
posteriormente a un multiplexor donde se conforma un solo tren binario. Para esta
multiplexación, el grupo de estándares de PMEG-2 distingue entre dos posibilidades: la
conformación de un PS (Program Stream) y la conformación de un TS (Transport Stream).
Un Transport Stream es apropiado para entornos ruidosos, opción que encaja en las
necesidades de la difusión de TDT. 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.
Un Transport Stream puede formarse con varios programas de televisión y cada uno
de ellos con varios ES. Los ES 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. Esto se puede visualizar en la figura 4.1. [12]
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
25
Figura 4.1. Generación de un Transport Stream
Para poder explicar correctamente qué es DVB antes hay que definir qué es un
múltiplex. Son circuitos combinacionales con varias entradas y una única salida de datos, y
están dotados de entradas de control capaces de seleccionar una y, solo una, de las
entradas de datos para permitir su transmisión desde la entrada seleccionada hacia la salida.
En este contexto el múltiplex se utiliza como un dispositivo que puede recibir varias
entradas y transmitirlas por un medio de transporte compartido. Para ello lo que hace es
dividir el medio de transmisión en múltiples canales, para que varios nodos puedan
comunicarse al mismo tiempo. [13]
El esquema de multiplexado puede describirse como una combinación de
multiplexado en dos capas diferentes. En la primera, los flujos de transporte se forman
multiplexando uno o más flujos elementales en la capa de transporte. En la segunda, los
flujos de transporte se combinan, generalmente por multiplexado asíncrono de paquetes,
para formar el sistema completo. La capa en el sistema, que contiene la información tanto al
nivel de programa como al nivel de sistema, se designa como de información específica de
programa (PSI).
Un Transport Stream se forma multiplexando ES, con o sin empaquetado PES, que
comparten una base de tiempo común. Según estos ES se multiplexan, se organizan en
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
26
paquetes de transporte y se agrega un flujo binario de control que describe el programa. Los
ES y flujos binarios de control se identifican por sus respectivos y únicos PIDs en el
encabezado del Transport Stream. El flujo de control contiene la PMT, que describe el mapa
del ES e incluye información de los PIDs de transporte que constituyen el programa, así
como la identificación de las aplicaciones que se transmiten en esos flujos, la relación entre
dichos flujos, etc. [12]
Esta relación entre flujos se puede ver claramente en la figura 4.2 y 4.3.
Figura 4.2. Proceso de demultiplexado de transporte para un programa
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
27
Figura 4.3.Tablas MPEG-2
Para este proyecto se ha tenido en cuenta la relación entre las diferentes partes de
un Transport Stream de la siguiente manera: (figura 4.4.)
Figura 4.4. Relación entre las tablas a analizar por la herramienta
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
28
DVB-T, siglas de Digital Video Broadcasting – Terrestrial, en español: Difusión de
Vídeo Digital – Terrestre, es el estándar para la transmisión de Televisión Digital terrestre
(TDT) creado por la organización europea Digital Video Broadcasting (DVB). Es un sistema
que transmite audio, vídeo y otros datos a través de un flujo MPEG-2, usando una
modulación de “Multiplexación por División de Frecuencia Ortogonal Cruzada” (COFDM).
4.2. Tablas de Información de Servicio (SI)
4.2.1. Mecanismo de tablas SI. Uso de secciones
La especificación de tablas de Información de Servicio, en adelante SI, en el presente
documento y las tablas MPEG-SI se segmentarán en una o más secciones antes de
insertarse en paquetes TS.
Las tablas, cuando se transmitan, no se codificarán, con la excepción del EIT, que
podrá ser codificado si fuera necesario.
Una sección es una estructura sintáctica que se utilizará para asignar todas las tablas
MPEG-2 y las tablas SI especificadas en el presente documento, en paquetes TS.
Estas estructuras sintácticas se ajustan a la sintaxis de la sección privada definida en
ISO/IEC 13818-1. [6]
Las secciones son de longitud variable y dentro de cada tabla estarán limitadas a
1024 bytes de longitud, excepto para las secciones del EIT que estarán limitadas a 4096
bytes. Cada sección se identificará de forma única mediante la combinación de los siguientes
elementos:
• Table_id: Identifica a qué tabla pertenece la sección.
• Table_id_extension: es utilizada para la identificación de una sub_table.
• Section_number: el campo permite que el decodificador vuelva a montar las
secciones de una sub_table determinada en su orden original. Se recomienda,
que las secciones se transmitan en orden numérico, a menos que se desee
transmitir algunas secciones con más frecuencias que otras.
• Version_number: Cuando cambien las características del TS descritas en el SI
que se indican en la ETSI EN 300 468 v.1.15.1 [7], se enviarán los nuevos datos
del SI que contengan la información actualizada. Una nueva versión de los datos
SI se señala enviando una subtabla con los mismos identificadores que la
subtabla anterior que contiene los datos relevantes, pero con el siguiente valor
de version_number.
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
29
• Current_next_indicator: Cada sección será numerada como válida “ahora”
(actualmente) o como válida en el futuro inmediato (siguiente). Esto permite la
transmisión de una versión futura del SI antes del cambio, dando al decodificador
la oportunidad de prepararse para éste. Sin embargo, no hay ningún requisito
para transmitir la siguiente versión de una sección con antelación, pero si se
transmite, entonces será la siguiente versión correcta de esa sección.
4.3. Mapeo de secciones en un paquete TS.
Las secciones se asignarán directamente a los paquetes TS. Las secciones pueden
comenzar al principio de la carga útil de un paquete TS, pero esto no es un requisito, porque
el comienzo de la primera sección en la carga útil de un paquete TS es señalado por el
pointer_field. Nunca hay más de un pointer_field en un paquete TS, ya que el inicio de
cualquier otra sección se puede identificar contando la longitud de la primera y cualquier
sección posterior, ya que la sintaxis no permite brechas entre secciones dentro de un
paquete TS.
Dentro de los paquetes TS de cualquier valor PID único, una sección se termina antes
de que se permita que se inicie la siguiente, o de lo contrario no es posible identificar a qué
encabezado de sección pertenecen los datos. SI una sección termina antes del final de un
paquete TS, pero no es conveniente abrir otra sección, se puede utilizar un mecanismo de
relleno para rellenar el espacio. El relleno se puede realizar rellenando cada byte restante
del paquete con el valor “0xFF”.
4.4. Codificación de los campos PID y table_id
4.4.1. Program Association Table (PAT)
Para cada servicio en el multiplex, la PAT indica la ubicación (los valores del
identificador de paquetes (PID) de los paquetes del Transport Stream (TS)) de la tabla mapas
de programa (PMT) correspondiente. También da la ubicación de la tabla de información de
red (NIT).
4.4.2. Conditional Access Table (CAT)
La CAT proporciona la información sobre los sistemas de CA utilizados en el
multiplex; la información es privada y depende del sistema de CA, pero incluye la ubicación
de la secuencia Entitlement Management Message (EMM) cuando corresponda.
4.4.3. Program Map Table (PMT)
La PMT identifica e indica la ubicación de las secuencias que componen cada servicio
y la ubicación de los campos del PCR para un servicio.
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
30
4.4.4. Network Information Table (NIT)
4.4.5. Bouquet Association Table (BAT)
La tabla BAT describe un bouquet y los servicios que en él se agrupan (de uno o
varios TS).
El término “Bouquet” se utiliza para referirse a una colección de servicios
comercializados como entidad única. Las tablas BAT ofrecen información sobre los bouquets
comercializados por los operadores de Televisión Digital.
4.4.6. Service Description Table (SDT)
La tabla SDT contiene datos que describen los servicios del sistema, por ejemplo,
nombres de servicio, el proveedor de servicios, etc.
4.4.7. Event Information table (EIT)
La tabla EIT contiene datos relativos a eventos o programas como el nombre del
evento, la hora de inicio, la duración, etc.
El uso de diferentes descriptores permite la transmisión de diferentes tipos de
información de eventos, por ejemplo, para diferentes tipos de servicio.
4.4.8. Running Status Table (RST)
La tabla RST proporciona el estado de un evento (en ejecución / no en ejecución). El
RST actualiza esta información y permite el cambio automático oportuno a eventos.
4.4.9. Time and Date Table (TDT)
La tabla TDT proporciona información relativa a la fecha y hora actuales. Esta
información se proporciona en una tabla separada debido a la actualización frecuente de
esta información.
4.4.10. Time Offset Table (TOT)
La tabla TDT proporciona información relativa a la fecha y hora actuales y la
compensación de la hora local. Esta información se proporciona en una tabla separada
debido a la actualización frecuente de esta información.
4.4.11. Stuffing Table (ST)
La tabla ST se utiliza para invalidar las secciones existentes, por ejemplo, en los
límites de los sistemas de entrega.
4.4.12. Selection Information Table (SIT)
La tabla SIT se utiliza sólo en bitstreams parciales. Lleva un resumen de la
información SI requerida para describir las secuencias en la corriente de bits parcial.
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
31
4.4.13. Discontinuity Information Table (DIT)
La tabla DIT se utiliza sólo en bitstreams parciales. Se inserta donde la información
SI en la corriente de bits parcial puede ser discontinua.
4.5. Tablas definidas en el estándar internacional ISO/IEC 13818-1
4.5.1. Capa de paquetes de Transport Stream
Un Transport Stream siempre seguirá el siguiente esquema:
Tabla 1. Esquema de un Transport Stream
Sintaxis Número de bits
Transport_packet () {
Sync_byte
Transport_error_indicator
Payload_unit_start_indicator
Transport_priority
PID
Transport_scramblig_control
Adaptation_field_control
Continuity_counter
If (adaptation_field_control == ‘10’ || adaptation_field_control == ‘11’) {
Adaptation_field ()
}
If (adaptation_field_control == ‘01’ || adaptation_field_control == ‘11’) {
for (i=0; i<N; i++) {
data_byte
}
}
8
1
1
1
13
2
2
4
8
• Sync_byte: El byte de sincronización es un campo fijo de 8 bits cuyo valor es
0x47.
• Transport_error_indicator: es un indicador de 1 bit. Cuando se establece en
1 indica que existe al menos 1 error de bit no corregido en el paquete del
Transport Stream. Esto se puede establecer por 1 entidad externa a la capa
de transporte. Cuando se establece en 1 este bit, no se restablecerá a 0 a
menos que se hayan los errores presentes.
• Payload_unit_start_indicator: Es un indicador de 1 bit que tiene un
significado normativo para los paquetes de Transport Stream que transportan
paquetes PES o datos PSI.
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
32
Cuando la carga útil del paquete Transport Stream contiene datos del paquete
PES, el payload_unit_start_indicator tiene el siguiente significado: un ‘1’ indica que la
carga útil de este paquete comenzará con el primer byte de un paquete PES; y un ‘0’
indica que ningún paquete PES empezará en este paquete Transport Stream. Si el
indicador está a ‘1’, entonces uno y solamente un paquete PES empezará en este
paquete Transport Stream.
Cuando la carga útil del paquete Transport Stream contiene datos del paquete
PSI, el payload_unit_start_indicator tiene el siguiente significado: un ‘1’ indica el
primer byte de la carga útil de este paquete Transport Stream contiene el
pointer_field. Si el paquete Transport Stream no contiene el primer byte de la sección
PSI, el indicador valdrá ‘0’.
• Transport_priority: Es un indicador de 1 bit. Cuando el indicador está
establecido en ‘1’ indica que el paquete asociado tiene más prioridad que
otros paquetes del mismo PID, pero con el indicador a ‘0’.
• PID: El PID es un campo de 13 bits que indica el tipo de datos
almacenados en la carga útil del paquete. El PID de valor 0x0000 está
reservado para la Program Association Table (PAT), el PID de valor
0x0001 está reservado para la Conditional Access Table (CAT). Los PID
de valores entre 0x0002 – 0x000F están reservados. El PID de valor
0x1FFF está reservado para paquetes de contenido nulo.
• Transport_scrambling_control: Es un indicador de 2 bits que indica el
modo de codificación de la carga útil del paquete. La cabecera y el campo
de adaptación del paquete no estarán codificados. En caso de que el
paquete sea nulo, el valor del campo de transport_scrambling_control será
‘00’.
• Adaptation_field_control: Es un indicador de 2 bits que indica si a la
cabecera de un paquete Transport Stream le sigue un campo de
adaptación o carga útil.
Tabla 2. Valor de adaptation_field_control
Valor Descripción
00 Reservado
01 Solamente carga útil
10 Sólo campo de adaptación
11 Campo de adaptación y carga útil
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
33
• Continuity_counter: Es un campo de 4 bits que se incrementa con cada
paquete de un Transport Stream con el mismo PID. Vuelve al valor inicial
0 después de alcanzar su valor máximo. No se incrementará cuando el
campo adaptation_field_control de los paquetes sea ‘00’ o ‘10’.
• Data_byte: Los bytes de datos serán bytes contiguos de datos de los
paquetes PES, secciones PSI, bytes de relleno de paquetes después de
secciones PSI o datos privados que no estén en estas estructuras como
se indica en el PID. En el caso de paquetes nulos con el valor de PID
0x1FFF, data_bytes puede tener cualquier valor. El número de
data_bytes, N, se especifica como 1184 menos el número de bytes en el
adaptation_field ().
4.5.2. Transporte de secuencias de programas y secuencias de sistemas ISO/IEC
11172-1 en el Transport Stream
El Transport Stream contiene campos adicionales para admitir el transporte de
secuencias de programas y corrientes de sistemas ISO/IEC 11172-1, de una manera que
permite la reconstrucción simple de la secuencia respectiva en el decodificador.
Al colocar una secuencia de programa en un Transport Stream, los paquetes PES de
la secuencia del programa con los valores stream_id de private_stream_1, ITU-T Rec. H.262
| ISO/IEC 13818-2 o vídeo ISO/IEC 11172-2, e ISO/IEC 13818-3 o el audio ISO/IEC 11172-
3, se transportan en paquetes de Transport Stream. [8] [9] [10] [11] [12]
Para estos paquetes PES, al reconstruir el Program Stream en el decodificador de
Transport Stream, los datos del paquete PES se copian a la secuencia del programa que se
está reconstruyendo.
Para los paquetes PES de las secuencias de programa con valores stream_id de
program_stream_map, padding_stream, private_stream_2, Entitlement Control Messages
(ECM), EMM, DSM_CC_stream, o program_stream_directory, todos los bytes del paquete
PES de la secuencia de programa, excepto el packet_start_code_prefix, se colocan en los
campos data_bytes de un nuevo paquete PES. El stream_id de este nuevo paquete PES
tiene el valor de ancillary_stream. Este nuevo paquete será transportado en los paquetes
Transport Stream.
Al reconstruir el Program Stream en el decodificador Transport Stream, para
paquetes PES con un valor stream_id de ancillary_stream_id, el valor de
packet_start_code_prefix se escribe en la secuencia de programas que se está
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
34
reconstruyendo, seguida de los campos data_byte de estos paquetes PES del Transport
Stream.
4.5.3. Información específica de programa (PSI).
La Información específica de programa incluye datos de las normativas ITU-T Rec.
H.222.0 | ISO/IEC 13818-1 y datos privados que permiten la demultiplexación de programas
por los decodificadores. Los programas se componen de una o más secuencias elementales,
cada una etiquetada por un PID. Los programas, streams elementales o sus partes pueden
codificarse para el acceso condicional. Sin embargo, la información específica del programa
no será codificada. [13] [6]
En los Transport Streams, la información específica del programa se clasifica en
cinco estructuras de tabla como se muestra en la tabla 3. Mientras estas estructuras pueden
ser consideradas tablas simples, pueden ser segmentadas en secciones y ser insertadas en
paquetes Transport Stream, algunas con PID predeterminados, y otras con PID
seleccionables por el usuario.
Tabla 3. Tablas PSI
Nombre Tipo de Stream Número de PID Descripción
Program
Association Table
(PAT)
ITU-T Rec. H.222.0
| ISO/IEC 13818-1 0x00
Asocia el número
de programa y el
PID de la Program
Map Table (PMT)
Program Map Table
(PMT)
ITU-T Rec. H.222.0
| ISO/IEC 13818-1
Asignación indicada
en la PAT
Especifica el valor
del PID para los
componentes de
uno o más
programas
Network Information
Program (NIT) Privado
Asignación indicada
en la PAT
Parámetros de la
red física como las
frecuencias FDM,
Números de
transpondedor…
Conditional Access
Table (CAT)
ITU-T Rec. H.222.0
| ISO/IEC 13818-1 0x01
Asocia uno o más
streams EEM
(privados), cada
uno con un PID
único.
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
35
Transport Stream
Description Table
ITU-T Rec. H.222.0
| ISO/IEC 13818-1 0x02
Asocia uno o más
descriptores de la
tabla 8 a un
Transport Stream.
Las tablas PSI definidas de la ITU-T Rec. H.222.0 | ISO/IEC 13818-1 se segmentarán
en una o más secciones que serán transportadas dentro de los paquetes de transporte. Una
sección es una estructura sintáctica que será utilizada para mapear cada tabla PSI definida
en el Transport Stream. [13] [6]
4.5.4. Tabla de Asociación de Programas (PAT)
La tabla de asociación de programas, de ahora en adelante PAT, proporciona la
correspondencia entre un program_number y el valor PID de los paquetes de Transport
Stream que llevan la definición de programa. El program_number es la etiqueta numérica
asociada a un programa.
La PAT se estructura de la siguiente manera:
Tabla 4. Esquema PAT
Sintaxis Número de bits
Program_association_section () {
Table_id
Section_syntax_indicator
‘0’
reserved
section_length
transport_stream_id
reserved
version_number
current_next_indicator
section_number
last_section_number
for (i=0; i<N; i++) {
program_number
reserved
if (program_number == ‘0’) {
network_PID
} else {
Program_map_PID
8
1
1
2
12
16
2
5
1
8
8
16
3
13
13
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
36
}
}
CRC_32
}
32
4.5.4.1. Valores de table_id
El campo table_id identifica el contenido de una sección PSI de un Transport Stream,
como se puede ver reflejado en la tabla 5:
Tabla 5. Valores del campo table_id
Valor Descripción
0x00 Program_association_section
0x01 Conditional_access_section
0x02 TS_program_map_section
0x03 TS_description_section
0x04 ISO_IEC_14496_scene_description_section
0x05 ISO_IEC_14496_object_descriptor_section
0x06-0x37 ITU-T Rec. H.222.0 | ISO/IEC 13818-1 reserved
0x38-0x3F Defined in ISO/IEC 13818-6 [14]
0x40-0xFE User private
0xFF Forbidden
4.5.4.2. Definición semántica de los campos en la PAT
• Table_id: Campo de 8 bits. Estará establecido a 0x00.
• Section_length: Campo de 12 bits, donde los dos primeros tienen un valor
de ‘00’. Los 10 bits restantes especifican el número de bytes de la sección,
empezando inmediatamente después del campo section_length, e incluye el
CRC.
• Transport_stream_id: Campo de 16 bits que sirve de etiqueta para identificar
este Transport Stream de otro múltiplex en la red. Su valor lo define el usuario.
• Program_number: Es un campo de 16 bits. Especifica el programa al que se
aplica el program_map_PID. Cuando se establece en 0x00, la siguiente
referencia será el PID de red (network PID). Para todos los demás casos, el
valor de este campo está definido por el usuario. Este campo no tomará
ningún valor único más de una vez dentro de la PAT.
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
37
• Network_PID: El network_PID es un campo de 13 bits que se utiliza
solamente junto con el valor del program_number fijado a 0x00. Especifica el
PID de los paquetes del Transport Stream que contendrá la tabla de
información de red.
4.5.5. Tabla de Acceso Condicional (CAT)
La tabla de acceso condicional (CA) proporciona la asociación entre uno o más
sistemas de CA, sus secuencias EMM y cualquier parámetro especial asociado a ellos.
La tabla se encuentra en una o varias secciones con la sintaxis siguiente. Puede ser
segmentada para ocupar varias secciones.
Tabla 6. Esquema CAT
Sintaxis Número de bits
CA_section () {
Table_id
Section_syntax_indicator
‘0’
reserved
section_length
reserved
version_number
current_next_indicator
section_number
last_section_number
for (i=0; i<N; i++) {
descriptor ()
}
CRC_32
}
8
1
1
2
12
18
5
1
8
8
32
• Table_id: campo de 8 bits. Estará establecido a 0x01.
4.5.6. Tabla de Mapeo de Programas (PMT)
La tabla de mapeo de programas (PMT) proporciona las relaciones entre los números
de programa y los elementos de programa que los componen. Una sola instancia de dicha
asignación se conoce como una “definición de programa”. La PMT es la colección completa
de todas las definiciones de programa de un Transport Stream. Esta tabla se transmitirá en
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
38
paquetes, cuyos valores PID son seleccionados por el codificador. Si se desea, se puede
utilizar más de un valor PID.
La tabla se encuentra en una o varias secciones con la sintaxis siguiente. Se puede
segmentar para ocupar varias secciones. En cada sección, el campo de section_number se
establecerá en 0. Las secciones se identifican mediante el campo program_number.
La definición de los campos del descriptor () se puede encontrar en la tabla 8.
Tabla 7. Esquema PMT
Sintaxis Número de bits
TS_program_map_section () {
Table_id
Section_syntax_indicator
‘0’
Reserved
section_length
program_number
reserved
version_number
current_next_indicator
section_number
last_section_number
reserved
PCR_PID
Reserved
Program_info_length
for (i=0; i<N; i++) {
descriptor ()
}
for (i=0; i<N1; i++) {
stream_type
reserved
elementary_PID
reserved
ES_info_length
for (i=0; i<N2; i++) {
descriptor ()
CRC_32
}
8
1
1
2
12
16
2
5
1
8
8
3
13
4
12
8
3
13
4
12
32
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
39
4.5.6.1. Definición de los campos de la Tabla de Mapeo de Programas (PMT)
• Table_id: campo de 8 bits. En el caso de la PMT, éste tendrá siempre el valor
0x02.
• Program_number: campo de 16 bits. Especifica el programa al que se aplica
el program_map_PID. Una definición de programa se llevará dentro de una
sola PMT. Esto implica que una definición de programa nunca es mayor que
1016. El program_number puede ser utilizado como designación para un
canal de radiodifusión, por ejemplo. Al describir los diferentes elementos del
que programa que pertenecen a éste, los datos de diferentes fuentes (por
ejemplo, eventos secuenciales) se pueden concatenar para formar un
conjunto continuo de secuencias mediante un program_number.
• PCR_PID: Es un campo de 13 bits que indica el PID de los paquetes del
Transport Stream que contendrá los campos PCR, Program Clock Reference,
válidos para el programa especificado por program_number. Si no hay PCR
asociado a una definición de programa para secuencias privadas, este campo
tomará el valor 0x1FFF.
• Program_info_length: Campo de 8 bits, cuyos dos primeros bits tienen un
valor de ‘00’. Los restantes 10 bits especifican el número de bytes de los
descriptores que siguen al program_info_length_field.
• Stream_type: Campo de 8 bits que especifica el tipo de elemento de
programa que se transporta en los paquetes con el PID especificado en el
campo Elementary_PID.
• Elementary_PID: Campo de 13 bits que especifica el PID de los paquetes de
Transport Stream que transportan elementos de asociación de programa.
4.6. Definición semántica de campos en descriptores de elementos de
programa
La siguiente semántica se aplica a los descriptores definidos de 4.5.1 a 4.5.20.
• Descriptor_tag: campo de 8 bits que identifica el descriptor a utilizar.
• Descriptor_length: campo de 8 bits que especifica el número de bytes del
descriptor inmediatamente después del campo descriptor_length.
Tabla 8. Valores del campo descriptor_tag
Descriptor_tag Identificador
0 Reservado
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
40
1 Reservado
2 Video_stream_descriptor
3 Audio_stream_descriptor
4 Hierarchy_descriptor
5 Registration_descriptor
6 Data_stream_alignment_descriptor
7 Target_backgroung_grid_descriptor
8 Video_window_descriptor
9 CA_descriptor
10 ISO_639_language_descriptor
11 System_clock_descriptor
12 Multiplex_buffer_utilization_descriptor
13 Copyright_descriptor
14 Maximum_bitrate_descriptor
15 Private_data_indicator_descriptor
16 Smoothing_buffer_descriptor
17 STD_descriptor
18 IBP_descriptor
19-26 Definidas en ISO/IEC 13818-6
27 MPEG-4_video_descriptor
28 MPEG-4_audio_descriptor
29 IOD_descriptor
30 SL_descriptor
31 FMC_descriptor
32 External_ES_ID_descriptor
33 MuxCode_descriptor
34 FmxBufferSize_descriptor
35 MultiplexBuffer_descriptor
4.6.1. Video Stream Descriptor
El descriptor de secuencia de vídeo proporciona información básica que identifica los
parámetros de codificación de una secuencia elemental de vídeo, tal y como se describe en
el ITU-T Rec. H.262 | ISO/IEC 13818-2 o ISO/IEC 11172-2. [8] [9] [10]
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
41
Tabla 9. Esquema de Video Stream Descriptor
Sintaxis Número de bits
Video_stream_descriptor () {
Descriptor_tag
Descriptor_length
Multiple_frame_rate_flag
Frame_rate_code
MPEG_1_only_flag
Constrained_parameter_flag
Still_picture_flag
If (MPEG_1_only_flag == ‘0’) {
Profile_and_level_indication
Chroma_format
Frame_rate_extension_flag
Reserved
}
}
8
8
1
4
1
1
1
8
2
1
5
• MPEG_1_only_flag: Campo de 1 bit que cuando está a ‘1’ indica que la
secuencia de vídeo contiene solamente información de ISO/IEC 11172-2. Si
está a ‘0’ la secuencia de vídeo puede contener datos de ITU-T H.262 |
ISO/IEC 13818-2. [10] [8] [9]
4.6.2. Audio Stream Descriptor
El descriptor de secuencia de audio proporciona información básica que identifica la
versión de codificación de una secuencia elemental de audio como se describe en ISO/IEC
13818-3 o ISO/IEC 11172-3. [11] [12]
Tabla 10. Esquema de Audio Stream Descriptor
Sintaxis Número de bits
Audio_stream_descriptor () {
Descriptor_tag
Descriptor_length
Free_format_flag
ID
Layer
Variable_rate_audio_indicator
Reserved
}
8
8
1
1
2
1
3
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
42
• Free_format_flag: Este campo de 1 bit cuando se establece en ‘1’ indica que
la secuencia de audio puede contener uno o más fotogramas de audio con el
bitrate_index establecido en ‘0000’. Si se establece en ‘0’, el bitrate_index no
es ‘0000’ en cualquier fotograma de audio de la secuencia de audio.
• ID: Este campo de 1 bit cuando está a ‘1’ indica que el campo ID está
establecido a ‘1’ en cada fotograma de audio de la secuencia de audio.
• Layer: Este campo de 2 bits está codificada del mismo modo que el campo
de capa en las secuencias de audio ISO/IEC 13818-3 o ISO/IEC 11172-3. La
capa indicada en este campo será igual o superior a la capa más alta
especificada en cualquier fotograma de audio de la secuencia de audio. [11]
[12]
4.6.3. Hierarchy Descriptor
El descriptor de jerarquía proporciona información para identificar los elementos del
programa que contienen componentes de vídeo y audio codificados jerárquicamente, y
secuencias privadas que se multiplexan en varias secuencias.
Tabla 11. Esquema de Hierarchy Descriptor
Sintaxis Número de bits
Hierarchy_descriptor () {
Descriptor_tag
Descriptor_length
Reserved
Hierarchy_type
Reserved
Hierarchy_layer_index
Reserved
Hierarchy_embedded_layer_index
Reserved
Hierarchy_channel
}
8
8
4
4
2
6
2
6
2
6
• Hierarchy_type: La relación jerárquica entre la capa de jerarquía asociada y
su capa incrustada de jerarquía que se define en la siguiente tabla:
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
43
Tabla 12. Valores del campo hierarchy_type
Valor Descripción
0 Reserved
1 ITU-T Rec. H.262 | ISO/IEC 13818-2 Spatial Scalability
2 ITU-T Rec. H.262 | ISO/IEC 13818-2 SNR Scalability
3 ITU-T Rec. H.262 | ISO/IEC 13818-2 Temporal Scalability
4 ITU-T Rec. H.262 | ISO/IEC 13818-2 Data partitioning
5 ISO/IEC 13818-3 Extension bitstream
6 ITU-T Rec.H222.0 | ISO/IEC 13818-1 Private Stream
7 ITU-T Rec. H.262 | ISO/IEC 13818-2 Multi-view Profile
8-14 Reserved
15 Capa base
• Hierarchy_layer_index: Es un campo de 6 bits que define un índice único
asociado al elemento de programa de la tabla de jerarquías de capas de
codificación. Los índices serán únicos dentro de una definición de programa
único.
• Hierarchy_embedded_layer_index: Es un campo de 6 bits que define el
índice de tabla de jerarquía del elemento de programa al que se debe tener
acceso antes de la descodificación de la secuencia elemental asociada a este
descriptor. Este campo no está definido si el valor de hierarchy_type es 15.
• Hierarchy_channel: Es un campo de 6 bits que indica el número de canal
previsto para el elemento de programa asociado en un conjunto ordenado de
canales de transmisión. El canal de transmisión más robusto se define por el
valor más bajo de este campo con respecto a la definición general de la
jerarquía de transmisión.
4.6.4. Registration Descriptor
El descriptor de registro proporciona un método para identificar de forma única e
inequívoca los formatos de datos privados.
Tabla 13. Esquema de Registration Descriptor
Sintaxis Número de bits
Registration_descriptor () {
Descriptor_tag
Descriptor_length
8
8
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
44
Format_identifier
For (i=0; i<N; i++) {
Additional_identification_info
}
}
32
8
• Format_identifier: Campo de 32 bits obtenido de una autoridad de registro
según lo designado por ISO/IEC JTC 1/SC 29. [15]
4.6.5. Data Stream Aligment Descriptor
El descriptor de alineación de flujo de datos describe qué tipo de alineación está
presente en la secuencia elemental asociada. Si el data_alignment_indicator en el
encabezado del paquete PES se establece en ‘1’ y el descriptor está presente, la alineación
– como se especifica en este descriptor – será necesaria.
Tabla 14. Esquema de Data Stream Alignment Descriptor
Sintaxis Número de bits
Data_stream_alignment_descriptor () {
Descriptor_tag
Descriptor_length
Alignment_type
}
8
8
8
• Alignment_type: El valor de este campo de 8 bits se describe en la tabla
siguiente:
o Tipo de alineación de vídeo.
Tabla 15. Valores del campo alignment_type para vídeo
Tipo de alineación Descripción
00 Reserved
01 Unidad de acceso a vídeo o segmentación
02 Unidad de acceso a vídeo
03 GOP o SEQ
04 SEQ
05-FF Reserved
o Tipo de alineación de audio.
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
45
Tabla 16. Valores del campo alignment_type para audio
Tipo de alineación Descripción
00 Reservado
01 Palabra de sincronización
02-FF Reservado
4.6.6. Target Background Grid Descriptor
Es posible tener una o más secuencias de vídeo que, cuando se descodifican, no
están destinadas a ocupar el área de visualización completa (por ejemplo, un monitor). La
combinación de este descriptor y el Video Window Descriptor permite la visualización de
estas ventanas de vídeo en sus ubicaciones deseadas. Este descriptor se utiliza para
describir una cuadrícula de píxeles de unidad proyectados en el área de visualización. A
continuación, se utiliza el Video Window Descriptor para describir, para la secuencia
asociada, la ubicación en la cuadrícula en la que se debe mostrar el píxel superior izquierdo
de la ventana de visualización o el rectángulo de visualización de la unidad de presentación
de vídeo. Esto se representa en la figura 4.2.
Figura 4.5. Área de visualización del Target Background Grid Descriptor
Tabla 17. Esquema de Target Background Grid Descriptor
Sintaxis Número de bits
Target_backgroung_grid_descriptor () {
Descriptor_tag
Descriptor_length
Horizontal_size
Vertical_size
Aspect_ratio_information
8
8
14
14
4
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
46
}
• Horizontal_size: El tamaño horizontal en píxeles.
• Vertical_size: El tamaño vertical en píxeles.
• Aspect_ratio_information: Especifica la relación de aspecto de la muestra
o la relación de aspecto de visualización.
4.6.7. Video Window Descriptor
El descriptor de la ventana de vídeo se utiliza para describir las características de la
ventana de la secuencia elemental de vídeo asociada. Sus valores hacen referencia al
Target Background Grid Descriptor (Descriptor de cuadrícula de fondo de destino) para la
misma secuencia.
Tabla 18. Esquema de Video Window Descriptor
Sintaxis Número de bits
Video_window_descriptor () {
Descriptor_tag
Descriptor_length
Horizontal_offset
Vertical_offset
Window_priority
}
8
8
14
14
4
• Horizontal_offset: El valor indica la posición horizontal del píxel superior
izquierdo de la ventada de visualización de vídeo actual o el rectángulo de
visualización si se indica en la extensión de visualización de imagen en la
cuadrícula de fondo de destino para su visualización tal y como se define en
el target_background_grid_descriptor. El píxel superior izquierdo de la
ventana de vídeo será uno de los píxeles de la cuadrícula de fondo de destino.
• Vertical_offset: El valor indica la posición vertical del píxel superior izquierdo
de la ventana de visualización de vídeo actual o el rectángulo de visualización
de imagen en la cuadrícula de fondo de destino para su visualización tal y
como se define en el target_background_grid_descriptor. El píxel superior
izquierdo de la ventana de vídeo será uno de los píxeles de la cuadrícula de
fondo de destino.
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
47
• Window_priority: El valor indica cómo se superponen las ventanas. Un valor
de 0 es la prioridad más baja y un valor de 15 es la prioridad más alta, es
decir, las ventanas con prioridad 15 son siempre visibles.
4.6.8. Conditional Access Descriptor
El descriptor de acceso condicional se utiliza para especificar tanto la información de
administración de acceso condicional de todo el sistema como los EMM y la
información específica de la secuencia elemental, como los ECM. Se puede utilizar
tanto en el TS_program_map_section como en el program_stream_map. Si se
codifica cualquier secuencia elemental, habrá un descriptor de acceso condicional
para el programa que contiene esa secuencia elemental. Si existe alguna información
de administración de acceso condicional en todo el sistema dentro de una secuencia
de transporte, un descriptor de acceso condicional estará presente en la tabla de
acceso condicional
Cuando el descriptor de acceso condicional se encuentra en el
TS_program_map_section (table_id = 0x02), el CA_PID señala a los paquetes que contienen
la información de control de acceso relacionada con el programa, tal como ETM, Extended
Text Message. Su presencia como información del programa indica aplicabilidad a todo el
programa. En el mismo caso, su presencia como información ES extendida indica la
aplicabilidad al elemento de programa asociado. También se prevén datos privados.
Cuando el descriptor de acceso condicional se encuentra en el CA_section
(table_id=0x01), el CA_PID señala a los paquetes que contienen información de
administración del control de acceso y/o de todo el sistema como EMM.
Tabla 19. Esquema de Conditional Access Descriptor
Sintaxis Número de bits
CA_descriptor () {
Descriptor_tag
Descriptor_length
CA_system_ID
Reserved
CA_PID
For (i=0; i>N; i++) {
Private_data_byte
}
}
8
8
16
3
13
8
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
48
• CA_system_ID: Campo de 16 bits que indica el tipo de sistema de acceso
condicional aplicable para las secuencias ECM, y/o EMM asociadas. La
codificación de esto se define de forma privada y no es especificada por el
UIT-T ISO/IEC.
• CA_PID: Campo de 13 bits que indica el PID de los paquetes de la secuencia
de transporte que contendrá la información ECM o EMM para los sistemas de
CA según lo especificado con el CA_System_ID asociado. El contenido (ECM
o EMM) de los paquetes indicados por el CA_PID se determina del contexto
en el que se encuentra el CA_PID, es decir, un TS_program_map_section o
la tabla de CA en la secuencia de transporte, o el campo stream_id en la
secuencia del Transport Stream.
4.6.9. ISO 639 Language Descriptor
El descriptor de idioma es utilizado para especificar el idioma de los elementos de
programa asociados.
Tabla 20. Esquema de ISO 639 Language Descriptor
Sintaxis Número de bits
ISO_639_language_descriptor () {
Descriptor_tag
Descriptor_length
For (i=0; i>N; i++) {
ISO_639_language_code
Audio_type
}
}
8
8
24
8
• ISO_639_language_code: Identifica el idioma o los idiomas utilizados por el
elemento de programa asociado. El ISO_639_language_code contiene un
código de 3 caracteres según lo especificado por ISO 639- 2. Cada carácter
se codifica en 8 bits según ISO 8859-1 y se inserta en orden en este campo
de 24 bits. En el caso de las secuencias de audio en varios idiomas, el campo
ISO_639_language_code reflejará el contenido de la secuencia de audio. [16]
[17]
• Audio_type: Campo de 8 bits que especifica el tipo de secuencia definido en
la siguiente tabla:
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
49
Tabla 21. Valores del campo audio_type
Tipo de alineación Descripción
0x00 Indefinido
0x01 Efectos limpios (sin idioma)
0x02 Discapacidad auditiva
0x03 Comentarios para discapacidad visual
0x04-0xFF Reservado
4.6.10. System Clock Descriptor
Este descriptor transmite información sobre el reloj del sistema que se utilizó para
generar las marcas de tiempo.
Si se utiliza una referencia de reloj externa, el external_clock_reference_indicator se
puede establecer en ‘1’. El decodificador puede utilizar de manera opcional la misma
referencia externa si está disponible.
Tabla 22. Esquema de System Clock Descriptor
Sintaxis Número de bits
System_clock_descriptor () {
Descriptor_tag
Descriptor_length
External_clock_reference_indicator
Reserved
Clock_accuracy_integer
Clock_accuracy_exponent
Reserved
}
8
8
1
1
6
3
5
• External_clock_reference_indicator: Campo de 1 bit. Cuando está
establecido a ‘1’ indica que el reloj del sistema se ha derivado de una
referencia de frecuencia externa que puede estar disponible en el
decodificador.
• Clock_accuracy_integer: Campo de 6 bits. Junto con el
clock_accuracy_exponent, proporciona la precisión de frecuencia fraccionaria
del reloj del sistema en partes por millón.
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
50
• Clock_accuracy_exponent: Es un entero de 3 bits. Junto con el
clock_accuracy_integer, proporciona la precisión de frecuencia fraccionaria
del reloj del sistema en partes por millón.
4.6.11. Multiplex Buffer Utilization Descriptor
Este descriptor proporciona límites en la ocupación del búfer múltiplex STD. Esta
información está destinada a dispositivos como remultiplexores, que pueden utilizar esta
información para admitir una estrategia de remultiplexación deseada.
Tabla 23. Esquema de Multiplex Buffer Utilization Descriptor
Sintaxis Número de bits
Multiplex_buffer_utilization_descriptor () {
Descriptor_tag
Descriptor_length
Bound_valid_flag
LTW_offset_lower_bound
Reserved
LTW_offset_upper_bound
}
8
8
1
15
1
14
• Bound_valid_flag: Cuando está establecido a ‘1’ indica que los campos
LTW_offset_lower_bound y LTW_offset_upper_bound son válidos.
• LTW_offset_lower_bound: Este campo de 15 bits tiene utilidades de (27
MHz / 300) períodos de reloj, según se define para el LTW_offset. El
LTW_offset_lower_bound representa el valor más bajo que tendría cualquier
campo de LTW_offset, si ese campo se codificara en cada paquete de la
secuencia/s a las que hace referencia este descriptor. Los campos de
LTW_offset reales pueden o no codificarse en la secuencia de bits cuando el
descriptor de utilización del búfer multiplex está presente. Este límite es válido
para la siguiente aparición de este descriptor.
• LTW_offset_upper_bound: Este campo de 15 bits representa el valor más
alto que tendría cualquier campo de LTW_offset.
4.6.12. Copyright Descriptor
Este descriptor provee un método para habilitar la identificación de trabajos
audiovisuales. Se aplica a programas o elementos de programa dentro de programas.
Tabla 24. Esquema de Copyright Descriptor
Sintaxis Número de bits
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
51
Copyright_descriptor () {
Descriptor_tag
Descriptor_length
Copyright_identifier
For (i=0; i<N; i++) {
Additional_copyright_info
}
}
8
8
32
8
• Copyright_identifier: Campo de 32 bits que se obtiene de la Autoridad de
Registro.
• Additional_copyright_info: El contenido de este campo está definido por el
copyright_identifier y, una vez definidos, no cambiarán.
4.6.13. Maximum Bitrate Descriptor
Tabla 25. Esquema de Maximum Bitrate Descriptor
Sintaxis Número de bits
Maximum_bitrate_descriptor () {
Descriptor_tag
Descriptor_length
Reserved
Maximum_bitrate
}
8
8
2
22
• Maximum_bitrate: La velocidad de bits máxima se codificará como un entero
positivo de 22 bits en este campo. El valor indica el límite superior de la
velocidad de bits, incluida la sobrecarga de transporte, que se encontrará en
este elemento o programa. El valor del maximum_bitrate se expresa en
unidades de 50 bytes/segundo. Este descriptor se incluye en la PMT. Su
presencia como información ampliada del programa indica la aplicabilidad a
todo el programa. Su presencia como información ES indica la aplicabilidad
al elemento de programa asociado.
4.6.14. Private Data Indicator Descriptor
Tabla 26. Esquema de Private Data Indicator Descriptor
Sintaxis Número de bits
Private_data_indicator_descriptor () {
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
52
Descriptor_tag
Descriptor_length
Private_data_indicator
}
8
8
2
22
4.6.15. MPEG-4 Video Descriptor
Para secuencias ISO/IEC 14496-2 individuales transportadas directamente en
paquetes PES, este descriptor proporciona información básica para identificar los
parámetros de codificación de dichas secuencias elementales visuales.
Tabla 27. Esquema de MPEG-4 Video Descriptor
Sintaxis Número de bits
MPEG-4_video_descriptor () {
Descriptor_tag
Descriptor_length
MPEG-4_visual_profile_and_level
}
8
8
8
• MPEG-4_visual_profile_and_level: Este campo de 8 bits identificará el perfil
y nivel de la secuencia de vídeo ISO/IEC 14496-2. [18]
4.6.16. MPEG-4 Audio Descriptor
Para secuencias ISO/IEC 14496-3 individuales transportadas directamente en
paquetes PES, este descriptor de audio MPEG-4 proporciona información básica para
identificar los parámetros de codificación de dichas secuencias elementales de audio. [19]
Tabla 28. Esquema de MPEG-4 Audio Descriptor
Sintaxis Número de bits
MPEG-4_audio_descriptor () {
Descriptor_tag
Descriptor_length
MPEG-4_audio_profile_and_level
}
8
8
8
4.6.17. SL Descriptor
Este descriptor se utilizará cuando una sola secuencia SL empaquetada ISO/IEC
14496-1 esté encapsulada en paquetes PES. Este descriptor asocia la ES_ID de esta
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
53
secuencia a una Elementary_PID en caso de una secuencia de transporte o a un
elementary_stream_id en caso de una secuencia de programa. Dentro de una secuencia de
transporte, el descriptor SL se transmitirá para la secuencia elemental correspondiente en el
bucle descriptor inmediatamente después del campo ES_info_length en la tabla de mapas
de programa. Si un mapa de secuencia de programa está presente en una secuencia de
programa, el descriptor se transmitirá en el bucle descriptor inmediatamente después del
campo elementary_stream_info_length dentro del mapa de secuencia de programa. [20]
Tabla 29. Esquema de SL Descriptor
Sintaxis Número de bits
SL_descriptor () {
Descriptor_tag
Descriptor_length
ES_ID
}
8
8
16
4.6.18. FMC Descriptor
Este descriptor indica que la herramienta ISO/IEC 14496-1 FlexMux se ha utilizado
para multiplexar secuencias empaquetadas SL ISO/IEC 14496-1 en una secuencia FlexMux
antes de la encapsulación en paquetes o secciones ISO/IEC 14496. El descriptor asocia los
canales FlexMux a los calores ES_ID de las secuencias empaquetada SL en la secuencia
FlexMux. [20]
Se requiere un descriptor FMC para cada elemento de programa al que hace
referencia un valor de Elementary_PID en una secuencia de transporte y para cada
Elementary_stream_id de una secuencia de programa que transmite una secuencia
FlexMux. Dentro de una secuencia de transporte, el descriptor FMC se transmitirá para la
secuencia elemental correspondiente en el bucle descriptor inmediatamente después del
campo ES_info_length en la tabla de mapas de programa. Si un mapa de secuencia de
programa está presente en una secuencia de programa, el descriptor FMC se transmitirá en
el bucle descriptor inmediatamente después del campo elementary_stream_info_length en
el mapa de secuencia de programa.
Para cada secuencia empaquetada SL en una secuencia FlexMux, el canal FlexMux
se identificará mediante una sola entrada en el descriptor FMC.
Tabla 30. Esquema de FMC Descriptor
Sintaxis Número de bits
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
54
FMC_descriptor () {
Descriptor_tag
Descriptor_length
For (i=0; i<descriptor_length; i+=3) {
ES_ID
FlexMuxChannel
}
}
8
8
16
8
• ES_ID: Este campo de 16 bits especifica el identificador ISO/IEC 14496-1 de
la secuencia SL empaquetada. [20]
• FlexMuxChannel: Campo de 8 bits que especifica el número de canales
FlexMux usados para esta secuencia SL empaquetada.
4.6.19. External_ES_ID Descriptor
El descriptor External_ES_ID asigna un ES_ID, tal como se define en ISO/IEC 14496-
1, a un elemento de programa al que no se ha asignado ningún valor de ES_ID por otros
medios. Esta ES_ID permite hacer referencia a un componente que no es ISO/IEC 14496
en la descripción de la escena o, por ejemplo, asociar un componente que no es ISO/IEC
14496 a una secuencia IPMP.
Dentro de una secuencia de transporte, la asignación de un ES_ID se realizará
mediante el transporte de un descriptor de External_ES_ID para la secuencia elemental
correspondiente en el bucle descriptor inmediatamente después del campo ES_info_length
de la tabla de mapas de programa. Si un mapa de secuencia de programa está presente en
una secuencia de programa, el descriptor de External_ES_ID se transmitirá en el bucle
descriptor inmediatamente después del campo elementary_stream_info_length en el mapa
de secuencia de programa.
Tabla 31. Esquema de External ES ID Descriptor
Sintaxis Número de bits
External_ES_ID_descriptor () {
Descriptor_tag
Descriptor_length
External_ES_ID
}
8
8
16
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
55
4.6.20. Multiplex Buffer Descriptor
El descriptor Multiplex Buffer transmite el tamaño del búfer multiplex MBn, así como
la velocidad de fuga Rxn a la que los datos se transfieren del búfer de transporte TBn al búfer
MBn para un elemento de programa específico ITU-T Rec. H.222.0 | ISO/IEC 13818-1
referenciado por un valor de Elementary_PID en la Program Map Table (PMT). [13] [6]
Se asociará un descriptor Multiplex Buffer a cada Elementary_PID que contenga una
secuencia ISO/IEC 14496 FlexMux o una secuencia SL empaquetada, incluidas las que
contienen secciones ISO/IEC 14496.
Este descriptor se transmitirá en el bucle descriptor inmediatamente después del
campo ES_info_length de la Program Map Table.
Tabla 32. Esquema de Multiplex Buffer Descriptor
Sintaxis Número de bits
MultiplexBuffer_descriptor () {
Descriptor_tag
Descriptor_length
MB_buffer_size
TB_leak_rate
}
8
8
24
24
• MB_buffer_size: Campo de 24 bits especificará el tamaño en bytes del búfer
MBn de la secuencia elemental n asociada a este descriptor.
• TB_leak_rate: Este campo de 24 bits especificará en unidades de 400 bits
por segundo la velocidad a la que se transfieren los datos del búfer de
transporte TBn al búfer múltiplex MBn para la secuencia elemental n asociada
a este descriptor.
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
56
5. REVISIÓN DEL ALGORITMO Y PROCESO DE DESARROLLO
A la hora de desarrollar la aplicación, se ha basado en la herramienta de trabajo PHP
debido a la versatilidad que tiene. PHP es un lenguaje multiplataforma que, junto a un
servidor web, en este caso se ha utilizado WAMP, puede utilizarse como una máquina virtual
de ejecución de un código o programa.
También se ha añadido el uso de una base de datos como es MySQL para poder
almacenar la información, modificarla e incluso, eliminarla.
5.1. Entorno de trabajo
Herramientas para el desarrollo y el análisis de un Transport Stream:
• Entorno de desarrollo
Se ha utilizado NetBeans IDE 8.2 con PHP, pero se podría realizar con
cualquier aplicación que tuviera editor de código PHP integrado. Se han
creado diferentes archivos de código PHP y PHP con HTML.
• Entorno de valoración:
Se ha utilizado la herramienta WAMPServer 3.2.0 para poder ejecutar el
código a través de localhost.
• Base de datos:
Se ha utilizado MySQL como herramienta de almacenamiento de los datos
analizados.
• Control de versiones:
Se ha hecho uso de GitHub para realizar un control de las versiones del
proyecto.
• Entorno de comprobación:
Se ha utilizado el programa HxD Hex Editor 2.3.0.0 para visualizar el
contenido de los Transport Stream e ir comprobando los resultados obtenidos.
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
57
5.2. Revisión del algoritmo
Figura 5.1. Arquitectura de la aplicación en modo usuario
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
58
Figura 5.2. Arquitectura de la aplicación en modo administrador
Una vez revisados los elementos que componen un Transport Stream, se va a
detallar la estructura que ha influenciado en la generación del algoritmo para el análisis de
un elemento Transport Stream.
5.2.1. Código de análisis de la cabecera de un Transport Stream
La multiplexación de un Transport Stream consiste en paquetes de una longitud
constante igual a 188 bytes, de los cuales 4 bytes forman la cabecera obligatoria tras la que
se puede tener un campo de adaptación opcional. El resto de 184 bytes contienen
información o carga útil, los cuales transportan diferentes tipos de información, como
información sobre servicios, datos e información de relleno (paquetes nulos) para poder
obtener una tasa de transmisión fija. El esquema se puede visualizar en la figura 5.1.
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
59
El valor del byte de sincronización es utilizado como referencia de inicio del paquete
TS, tiene un valor fijo de 0x47 hexadecimal, de esta manera se tiene la certeza de cuándo
ha comenzado un paquete TS.
Figura 5.3. Esquema de un paquete Transport Stream
Para poder obtener los datos a analizar, primero se realizará una captura de esos
datos mediante un sistema de decodificación que nos permita obtener un fichero con datos
binarios del contenido de un Transport Stream. Puesto que los datos están en formato
binario, será necesario poder abrir el fichero de la manera correcta.
$transportstreamname=basename($fichero);
$count=0;
$lenfichero = filesize($fichero);
while ($count< $lenfichero) {
leerFichero ($fichero, $count);
$count+=11280;
}
echo "Fin de lectura.";
function leerFichero (string $fichero, int $count) {
$array = '';
$count0=0;
$data = file_get_contents ($fichero, false, null, $count,11280);
$pointer = 0;
$len= strlen($data);
while ($pointer < $len && $fichero == $fichero) {
leerDatos ($data, $pointer);
$pointer += 188;
}
}
El primer paso será la obtención del tamaño del fichero de entrada, $fichero, pues
habrá que hacer una lectura desde un inicio hasta un final. Una vez obtenemos $lenfichero,
se llamará a la función leerFichero () hasta que el indicador de vueltas $count llegue a la
longitud total. El valor de $count irá incrementando a cada vuelta en 188 pues es el tamaño
que tiene un paquete TS.
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
60
La función leerFichero () llama a su vez a la función de PHP file_get_contents () a la
cual deberemos pasarle un fichero a analizar y la cantidad de datos que debe leer. En este
caso, se le ha indicado que lea un valor de 11280, 60 veces 188, de esta manera cada vez
que se llame a la función leerFichero () se leerá el contenido de 60 paquetes TS.
Dentro de la función leerFichero () se llama, a su vez a la función leerDatos () cuyos
parámetros de entrada serán los datos obtenidos de file_get_contents () y un puntero que
nos servirá de guía para poder consultar los datos y ver su posición en el fichero.
5.2.2. Diagrama de flujo de la lectura de bytes.
Para poder obtener los datos correctamente al utilizar la función leerDatos (), primero
se implementaron unas subfunciones capaces de leer el contenido en paquetes de bits.
• leerN (), es una función que tiene como parámetro de entrada el número de
bits que queremos leer y el parámetro de salida es el número decimal que se
obtiene de leer N bits.
• saltarN (), función similar a leerN () pero simplemente tiene un parámetro de
entrada, facilitando de esta manera, el desplazamiento de n bits.
• leerCadena (), cuyo parámetro de entrada será el número de bits que se
quiere leer y el parámetro de salida será una cadena de caracteres con
codificación UTF-8. Esta función, a su vez, hace uso de leerN ().
En la figura 5.2. se muestra el diagrama que se ha seguido para poder hacer una
lectura de los bytes en paquetes de 8 bits.
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
61
Figura 5.4. Diagrama de flujo de leerN
5.2.3. Algoritmo de lectura de N bits.
function leerN (int $n) {
$valor = 0;
global $pos;
global $nbits;
global $array;
global $unos;
$unos = array (
0 => 0x00,
1 => 0x01,
2 => 0x03,
3 => 0x07,
4 => 0x0F,
5 => 0x1F,
6 => 0x3F,
7 => 0x7F,
leerN(N)
valor = 0
N>0
si Nbits = 0, leer byte nuevo y Nbits = 8
cuantos = min(N, Nbits)
máscara = unos (cuantos) << abs(Nbits -
cuantos)
valorc = (máscara[cuantos] &
byteactual ) >> abs(Nbits - cuantos)
valor = valor + valorc << (N-cuantos)
N = N - cuantos
Nbits = Nbits - cuantos
End
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
62
8 => 0xFF
);
if($n>0) {
while ($n>0) {
if ($nbits == 0) {
$nbits = 8;
$pos+=1;
$byteActual=ord($array[$pos]);
$cuantos = min ($n, $nbits);
$mascara = $unos[$cuantos] << abs ($nbits -$cuantos);
$valorc = ($mascara & $byteActual) >> abs ($nbits -
$cuantos);
$valor=$valor + ($valorc << abs($n-$cuantos));
$n = $n - $cuantos;
$nbits = $nbits -$cuantos;
} else {
$byteActual=ord($array[$pos]);
$cuantos = min ($n, $nbits);
$mascara = $unos[$cuantos] << abs ($nbits -$cuantos);
$valorc = ($mascara & $byteActual) >> abs ($nbits -
$cuantos);
$valor=$valor + ($valorc << abs($n-$cuantos));
$n = $n - $cuantos;
$nbits = $nbits -$cuantos;
}
}
} else {
}
return $valor;
}
5.2.4. Algoritmo de salto de N bits.
function saltarN (int $n) {
$valor = 0;
global $pos;
global $nbits;
global $array;
global $unos;
$unos = array (
0 => 0x00,
1 => 0x01,
2 => 0x03,
3 => 0x07,
4 => 0x0F,
5 => 0x1F,
6 => 0x3F,
7 => 0x7F,
8 => 0xFF
);
if($n>0) {
while ($n>0) {
if ($nbits == 0) {
$nbits = 8;
$pos+=1;
$byteActual=ord($array[$pos]);
$cuantos = min ($n, $nbits);
$n = $n - $cuantos;
$nbits = $nbits -$cuantos;
} else {
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
63
$byteActual=ord($array[$pos]);
$cuantos = min ($n, $nbits);
$n = $n - $cuantos;
$nbits = $nbits -$cuantos;
}
}
} else {
}
}
5.2.5. Algoritmo de lectura de una cadena de caracteres.
Para la generación del algoritmo de lectura de una cadena de caracteres se ha tenido
que tener en cuenta que el contenido a analizar tenía una codificación diferente dependiendo
del primer byte de lectura, tal y como se hace referencia en la norma ETSI EN 300 468,
anexo A. [7]
Se indica que si el primer byte de lectura tiene un valor dentro del rango [0x20 – 0xff],
entonces los siguientes bytes estarán codificados con el alfabeto latino no.1.
En nuestro caso, se ha utilizado la ISO-8859-1 e ISO-8859-9 para la decodificación
de los caracteres. [21] [22]
function leerCadena (int $length) {
$char = '';
$i=0;
$table_type = 'ISO-8859-1';
while($i<$length) {
$c = leerN (8);
if ($c == 0x05) {
$table_type = 'ISO-8859-9';
} else {
$c = iconv ($table_type,'utf-8', chr($c));
$char.=$c;
}
$i++;
}
return $char;
}
5.2.6. Código de análisis de la PAT.
Una vez se ha definido cómo empezar a obtener datos del fichero, el siguiente paso
es obtener los datos de la tabla PAT, pues ésta es la que nos indicará los siguientes datos
a buscar.
function leerDatos (string $data, int $pointer) {
$syncbyte = leerN (8);
$syncbytehex =dechex($syncbyte);
if ($syncbyte! == 0x47) {
throw new Exception ("Error en SYNCBYTE. No válido.");
}
$transportErrorIndicator = leerN (1);
if ($transportErrorIndicator === 0x01) {
echo "Error detectado.";
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
64
throw new Exception ("Transport Error Indicator ON.");
}
$payloadUnitStartIndicator = leerN (1);
$transportPriority = leerN (1);
$pid = leerN (13);
$transportScramblingControl = leerN (2);
$adaptationFieldControl = leerN (2);
$continuityCounter= leerN (4);
$hasPayload= ($adaptationFieldControl & 0b01) === 0b01;
$hasAdaptationField = ($adaptationFieldControl & 0b10) === 0b10;
if($hasPayload) {
if(isset($pidtable[$pid])) {
if ($pid === Pid::PAT) {}
Dentro de la función leerDatos (), se leen los datos de la cabecera y el valor del $pid,
si éste, tiene un valor de 0x00 hexadecimal, procederemos a leer el contenido de la PAT.
$tableID = leerN (8);
$sectionSyntax = leerN (1);
$reserved=leerN(3);
$sectionLength = leerN(12);
$tsID = leerN(16);
$reserved3 = leerN(2);
$versionNumber = leerN(5);
$currentnextId = leerN(1);
$sectionNumber = leerN(8);
$lastSectionNumber = leerN(8);
$vueltapat = 0;
$countpat=0;
for($j=0; $j<$sectionLength; $j+=8){
$programNumber= leerN(16);
$reserved4 = leerN(3);
if($programNumber == 0){
$networkPID = leerN(13);
$pat[$networkPID] = $programNumber;
}else{
$pmtPID = leerN(13);
$pat[$pmtPID] = $programNumber;
}
}
$crc = leerN (32);
Este código ha tenido como guía el esquema de la PAT según la ISO/IEC 13818-1.
[6]
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
65
Una vez tenemos el contenido de la PAT, se tiene una relación entre el número de
programa y el PID de los paquetes que transportan una tabla que indica los datos que
identifican el programa (PMT). De esta manera, todos los programas del multiplexor en el
Transport Stream son listados indicando cual es la PMT que transporta y su PID. El primer
programa de la PAT está reservado para datos de red, se distingue en el código como
$networkPID y contiene el PID de los paquetes de la NIT.
Este contenido se queda almacenado en la base de datos mediante una inserción de
datos que se explica de manera detallada en el Anexo A.
5.2.7. Código de análisis de la SDT.
Una vez se han obtenido los datos de los programas, se procede a analizar el
contenido del fichero en busca de la SDT que nos indicará el nombre del proveedor de
servicio y el nombre del servicio.
$tableID = leerN(8);
$sectionSyntax = leerN(1);
$reserved = leerN(3);
$sectionLength = leerN(12);
$slength = $sectionLength;
$sectionlengthBin = decbin($sectionLength);
$tsID = leerN(16);
$tsIDHEX = dechex($tsID);
$reserved2 = leerN(2);
$versionNumber = leerN(5);
$versionNumberBin = decbin($versionNumber);
$currentnextId = leerN(1);
$sectionNumber = leerN(8);
$lastSectionNumber = leerN(8);
$originalNetworkID = leerN(16);
$reserved3= leerN(8);
$vueltasdt = 0;
$countsdt=0;
while($sectionLength>=0){
$service_id= leerN(16);
$reserved4 = leerN(6);
$eit_scheduled_flag = leerN(1);
$countsdt +=1;
$eit_present_following_flag = leerN(1);
$running_status = leerN(3);
$free_CA_mnode = leerN(1);
$descriptor_loop_length = leerN(12);
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
66
$descriptor_tag= leerN(8);
$descriptor_length = leerN(8);
$service_type = leerN(8);
$service_provider_name_length = leerN(8);
$service_provider_name = leerCadena($service_provider_name_length);
$service_name_length = leerN(8);
$service_name = leerCadena($service_name_length) ;
$vueltasdt+=1;
$sectionLength -=7+ ($descriptor_loop_length);
}
$crc = leerN (32);
Al igual que pasaba con el código de la PAT, para éste se ha utilizado de guía el
esquema de la norma ETSI EN 300 468 v1.15.1. [15]
5.2.8. Código de análisis de la PMT.
Una vez hemos leído el contenido de la PAT y de la SDT, se procede a buscar el
contenido de la PMT para los PID obtenidos en la SDT. Dentro de la PMT se obtienen
diferentes datos dependiendo del valor que tenga el descriptor_tag. Cada uno de los
descriptores nos indicará qué tipo de contenido lleva el programa en el paquete de
Elementary Stream de nuestro Transport Stream.
saltarN(8);
$tableID = leerN(8);
$sectionSyntax = leerN(1);
$reserved = leerN(3);
$sectionLength = leerN(12);
$programNumber = leerN(16);
$reserved2 = leerN(2);
$versionNumber=leerN(5);
$currentnextId = leerN(1);
$sectionNumber = leerN(8);
$lastSectionNumber = leerN(8);
$reserved3 = leerN(3);
$PCR_PID= leerN(13);
$reserved4 = leerN(4);
$programInfoLength = leerN(12);
$stream_type = leerN(8);
saltarN(3);
$elementary_PID = leerN(13);
saltarN(4);
$ES_info_length = leerN(12);
$descriptor_tag = leerN(8);
$descriptor_tag_hex = dechex($descriptor_tag);
$countpointer= $count + $pointer;
switch ($descriptor_tag_hex){
case 0x02:
video_stream_descriptor($countpointer, $programNumber);
break;
case 0x03:
audio_stream_descriptor($countpointer, $programNumber);
break;
case 0x04:
hierarchy_descriptor($countpointer, $programNumber);
break;
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
67
case 0x06:
data_stream_alignment_descriptor($countpointer,
$programNumber);
break;
case 0x07:
target_background_grid_descriptor($countpointer,
$programNumber);
break;
case 0x08:
video_window_descriptor($countpointer, $programNumber);
break;
case 0x0a:
iso_639_language_descriptor($countpointer, $programNumber);
break;
case 0x0b:
system_clock_descriptor($countpointer, $programNumber);
break;
case 0x0c:
multiplex_buffer_utilization_descriptor($countpointer,
$programNumber);
break;
case 0x0d:
copyright_descriptor();
break;
case 0x0e:
maximum_bitrate_descriptor($countpointer, $programNumber);
break;
case 0x0f:
private_data_indicator_descriptor($countpointer,
$programNumber);
break;
case 0x10:
smoothing_buffer_descriptor($countpointer, $programNumber);
break;
case 0x11:
std_descriptor($countpointer, $programNumber);
break;
case 0x12:
ibp_descriptor($countpointer, $programNumber);
break;
case 0x1b:
mpeg4_video_descriptor($countpointer, $programNumber);
break;
case 0x1c:
mpeg4_audio_descriptor($countpointer, $programNumber);
break;
case 0x1e:
sl_descriptor($countpointer, $programNumber);
break;
case 0x1f:
fmc_descriptor($countpointer, $programNumber);
break;
case 0x20:
external_es_id_descriptor($countpointer, $programNumber);
break;
case 0x23:
multiplexbuffer_descriptor($countpointer, $programNumber);
break;
case 0x45:
vbi_data_descriptor($countpointer, $programNumber);
break;
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
68
case 0x46:
vbi_teletext_descriptor($countpointer, $programNumber);
break;
case 0x52:
stream_identifier_descriptor($countpointer, $programNumber);
break;
case 0x56:
teletext_descriptor($countpointer, $programNumber);
break;
case 0x59:
subtitling_descriptor($countpointer, $programNumber);
break;
case 0x5f:
private_data_specifier_descriptor();
break;
case 0x60:
service_move_descriptor($countpointer, $programNumber);
break;
case 0x65:
scrambling_descriptor($countpointer, $programNumber);
break;
case 0x66:
data_broadcast_id_descriptor($countpointer, $programNumber);
break;
}
5.3. Inserción del contenido en una base de datos
Para almacenar el contenido se ha hecho uso de la herramienta que nos ofrece
WAMPServer. Se ha creado una base de datos de nombre dvbmpeg y se han creado las
correspondientes tablas que almacenarán los datos que se vayan leyendo desde el
analizador. Para la inserción de los datos se ha hecho uso de:
• Sentencias parametrizadas
Los datos se insertan mediante una preparación y una ejecución. En la etapa
de preparación se envía una plantilla de sentencia al servidor de bases de
datos. El servidor realizará una comprobación de la sintaxis e inicializará los
recursos internos del servidor para su uso posterior.
• Control de duplicidad
Antes de realizar cualquier inserción en la base de datos, se realiza una
consulta previa para comprobar si existe ese registro. Si existe no se
insertará.
• Identificación única
En la base de datos se insertará únicamente el nombre del fichero Transport
Stream a analizar, el resto de las tablas de la base de datos, identificarán su
contenido con un valor único que tendrá asociado el nombre del fichero.
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
69
5.4. Visualización del contenido del Transport Stream
Para poder visualizar el contenido del Transport Stream analizado, se ha hecho uso
del lenguaje de programación HTML y HTML+PHP para poder mostrar el contenido
almacenado en la base de datos.
5.4.1. Página principal
La página principal, index.php, visualiza un listado de archivos que han sido
analizados por la herramienta. Además, se tiene un apartado de administración que
solamente será accesible si el usuario ingresa con la contraseña correcta y éste se encuentra
en la base de datos registrado.
5.4.2. Lista de programas
Si se selecciona un Transport Stream, se nos redirigirá a la página showSDT.php
cuyo parámetro de entrada será el identificador del Transport Stream. En esta página se
mostrará el listado de programas que existen en ese Transport Stream junto a su número
identificativo de la PAT, así como el nombre del proveedor de servicio.
5.4.3. Lista de componentes
Si se selecciona cualquier programa, se nos redirigirá ahora la página
showProgram.php, que muestra la lista de componentes que son transportados en ese
programa.
Se obtiene, el identificador del descriptor, el nombre del descriptor, el puntero que
facilitará la búsqueda de ese paquete en la aplicación HxD de lectura de datos
hexadecimales, el PCR_PID y el tipo de secuencia de transporte.
5.4.4. Página de administración
Al introducir las credenciales que darán acceso a la parte de administración, se
accede a la página de administración de Transport Stream, en la cual se podrá realizar una
de las siguientes acciones:
• Modificar un Transport Stream, modificando la descripción asociada.
• Eliminar un Transport Stream y todos los registros asociados.
• Insertar un Transport Stream.
5.4.5. Inserción de un Transport Stream
Para la inserción del contenido de un Transport Stream, se ha modificado el valor
máximo de subida de ficheros de php:
• Upload_max_filesize = 512MB
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
70
• Post_max_size = 512MB
Una vez se realiza la inserción, se hace una llamada al código que se encarga del
análisis del Transport Stream con el parámetro de entrada el nombre del fichero que se
encontrará en la nueva ubicación.
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
71
6. RESULTADOS OBTENIDOS
El resultado principal, el diseño de una herramienta que permita estudiar la
estructura de un Transport Stream DVB-T con fines didácticos, ha sido logrado. El
usuario que acceda a la herramienta será capaz de obtener, de un fichero, los datos que se
encuentran en él, y mostrarlos a través de un entorno de visualización, tal como Chrome,
simplemente teniendo WAMPServer iniciado.
Este proyecto cuenta a su vez con seguridad aplicada, con control de inicio de sesión
en el navegador, así como obtención de parámetros mediante un formulario GET, de esta
manera, se podrá visualizar contenido diferente accediendo a la misma ruta pero con
parámetros diferentes.
Para obtener un diseño orientado a todos los navegadores, se ha hecho uso de la
propiedad de CSS, flex, que permitirá una visibilidad de contenido adaptado al tamaño del
navegador. Se ha añadido también el logotipo corporativo de la Universidad de Jaén como
icono de la ventana de navegación. [23]
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
72
6.1. Página principal
La página principal, http://localhost/proyecto/index.php, estará compuesta por una
barra de navegación superior que indicará en todo momento la situación actual y el recorrido
seguido, pudiendo volver hacia atrás en cualquier momento manteniendo los parámetros de
consulta.
Además, también se visualiza una tarjeta con los nombres de los Transport Stream
que se encuentran analizados en la base de datos y de cuyo contenido se puede disponer.
Al final de la página, se visualiza una tarjeta que dará acceso a la página de
administración, donde el usuario podrá ser capaz de insertar un nuevo fichero a analizar,
modificar un parámetro del Transport Stream o eliminar.
Figura 6.6.1. Página principal
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
73
6.2. Lista de programas
Pulsando sobre cualquier Transport Stream, se accede a la lista de programas que
se encuentran en él.
En esta ventana, http://localhost/proyecto/showSDT.php?Id=1, se le introduce como
parámetro de entrada el identificador único del Transport Stream que existe en la base de
datos. Y se mostrará una tarjeta con un identificador de programa, obtenido de la PAT, y el
nombre del servicio, obtenido de la SDT.
Figura 6.6. Lista de programas de un Transport Stream
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
74
6.3. Lista de componentes
Accediendo a un programa del Transport Stream analizado,
http://localhost/proyecto/showProgram.php?ProgramId=410 , se obtendrá una lista con los
diferentes descriptores que se han capturado durante el análisis.
Figura 6.3. Lista de componentes de un programa
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
75
6.4. Página de administración
Introduciendo las credenciales correctas en la página principal, se accede a la página
de administración, http://localhost/proyecto/panel-control.php, donde aparecen dos tarjetas,
una de ellas con el listado de Transport Streams analizados, y una tarjeta para poder insertar
un fichero de formato .ts que, una vez comprobado que el formato es el correcto, redirigirá a
la página de la herramienta de análisis del Transport Stream,
http://localhost/proyecto/transportstreamparser.php?file=mireya5.ts.
Figura 6.4. Página de administración
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
76
6.5. Administración de Transport Stream
Una vez se ha seleccionado el Transport Stream que se desea modificar, nos
aparece en la ventana, http://localhost/proyecto/select.php?select=1, una tarjeta con el
parámetro que tiene actualmente el Transport Stream habilitado para modificar, en este
caso, la descripción.
Como previamente se ha dicho, en esta ventana se puede guardar una nueva
descripción en la base de datos, eliminar el Transport Stream o cancelar y volver a la página
de administración.
Figura 6.5. Administración de Transport Stream
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
77
7. DIFICULTADES ENCONTRADAS
A la hora de desarrollar esta herramienta han surgido una serie de dificultades que
han interferido en el desarrollo del proyecto:
• Encontrar información relativa a las normas ISO/IEC 13818. Ha resultado
complicado poder acceder al contenido de estas normas, claves para el
desarrollo de la herramienta, pues contienen toda la información relacionada
con las tablas implementadas en el código de proyecto.
• Limitación de PHP para poder realizar una subida de archivos. En un principio
se planteó realizar una subida de fichero en trozos, pero resultaba muy
complicado que funcionara correctamente con la configuración establecida en
WAMPServer, por lo que se optó finalmente, por aumentar el tamaño de la
subida de los ficheros en el archivo de configuración inicial de PHP, php.ini.
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
78
8. CONCLUSIONES Y LÍNEAS DE FUTURO
Con todo lo anteriormente expuesto, la primera conclusión a la que podemos llegar
una vez realizadas todas las tareas descritas en esta memoria es la relativa al cumplimiento
de todos los objetivos propuestos en el apartado número 3:
Una herramienta capaz de analizar un Transport Stream DVB-T ha sido
implementada a lo largo de este trabajo, ofreciendo ciertas funcionalidades más allá del
simple análisis. La pequeña cantidad de recursos que necesita para funcionar son clave
frente a otras herramientas mucho más complejas y difíciles de adquirir.
Tras un estudio del estado del arte en el ámbito del análisis de Transport Stream, se
ha podido estudiar a fondo diversos métodos sobre los cuales nos hemos apoyado para
confeccionar nuestra herramienta de análisis.
Como consiguiente se han podido observar puntos fuertes y carencias de estos
métodos con el fin de mejorar en ciertos aspectos nuestra herramienta.
Se ha realizado un análisis de diversos Transport Stream, centrándonos en gran
medida en las partes características de éstos.
Tras este estudio, hemos sido capaces de obtener una configuración óptima para
nuestra herramienta mediante una serie de fases de evaluación.
Como se podrá observar en el apartado 6 de esta memoria, un GUI ha sido creado
de forma satisfactoria con el propósito de que el usuario final pueda aprovechar por completo
todas las funcionalidades que aporta la herramienta de forma fácil e intuitiva.
En cuanto al posible futuro de este trabajo, el hecho de seguir mejorando las
características de la herramienta sería una de las propiedades. Para ello, debemos mejorar
ciertas partes del proceso de análisis:
• Realizar capturas en tiempo real de un Transport Stream obtenido por un
receptor. Esta es una de las ideas que más apoyo puede tener a nivel
didáctico. Una mejora en el análisis de la herramienta que permita al usuario
conectar directamente el dispositivo capturador con el ordenador encargado
de lanzar la ejecución, ahorrará el paso de tener que almacenar ese contenido
previo a su análisis. Además, no habría limitación de tamaño de Transport
Stream pues el contenido se enviaría en partes.
• Comparar Transport Stream. Una vez analizados y almacenados en la base
de datos, sería interesante poder seleccionar varios elementos y comparar su
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
79
contenido, por ejemplo, si se tratan de Transport Stream con contenido cifrado
y sin cifrar.
• Descodificar el contenido de otras tablas que pueden llegar a ser interesantes
a nivel didáctico, por ejemplo la tabla con información de red (Network
Information Table, o NIT) o la tabla con información de eventos (Event
Information table, o EIT).
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
80
ANEXO A: CÓDIGO DE PROYECTO
1. Transportstreamparser.php
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="icon" href="ujalogo.jpg" type="image/x-icon"/>
<title> Analizador de Transport Stream</title>
</head>
<body>
<?php
$nombrefichero=$_GET['file'];
set_time_limit(8000);
print_r(getdate());
include 'Pid.php';
include './config.php';
$fichero = './media/' . $nombrefichero;
$transportstreamname=basename($fichero);
$count=0;
$i = 0;
$ts =0;
$pat = array();
$pmt = array();
$sdtlist = array();
$transportstreamlist = array();
$patlist = array();
$programs = array();
$lenfichero = filesize($fichero);
$id = mysqli_connect(Config::$servername, Config::$username,
Config::$password);
$db=mysqli_select_db($id,Config::$database);
if(!$id){
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
$query ="Select distinct name from transportstream";
$result = mysqli_query($id, $query);
while($row = mysqli_fetch_assoc($result)){
$transportstreamlist[$ts]=$row['name'];
$ts++;
}
if(!in_array($transportstreamname, $transportstreamlist)){
$stmt = mysqli_prepare($id,"INSERT INTO TransportStream(Name) VALUES
(?)");
mysqli_stmt_bind_param($stmt,'s',$transportstreamname);
$resultstmt = mysqli_stmt_execute($stmt);
if(!$resultstmt){
echo "Fallo al ejecutar la consulta: (" . mysqli_error($id) . "48)
" ;
die("Error: no se pudo realizar la consulta.");
}
}
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
81
$stmtid = mysqli_prepare($id, "SELECT Id from TransportStream where Name =
?");
mysqli_stmt_bind_param($stmtid, 's', $transportstreamname);
$resultstmtid = mysqli_stmt_execute($stmtid);
mysqli_stmt_bind_result($stmtid, $transportstreamid);
mysqli_stmt_fetch($stmtid);
if(!$resultstmtid){
echo "Fallo al ejecutar la consulta: (" . mysqli_error($id) . ") "
;
die("Error: no se pudo realizar la consulta.");
}
mysqli_stmt_free_result($stmtid);
while($count< $lenfichero){
leerFichero($fichero,$count);
$i+=1;
$count+=11280;
echo "<br>Veces que entra en el bucle: " . $i . "<br>"
. "Count: $count<br>";
}
mysqli_close($id);
echo "Fin de lectura.";
function leerFichero(string $fichero,int $count){
$array = '';
$count0=0;
$data = file_get_contents($fichero,false, null, $count,11280);
$pointer = 0;
$i=0;
$len= strlen($data);
echo "<br>Tamaño: $len, Count: $count <br>";
while ( $pointer < $len && $fichero == $fichero){
leerDatos($data,$pointer);
$pointer += 188;
$i+=1;
}
}
function leerDatos(string $data,int $pointer){
global $pos;
global $nbits;
global $transportstreamid;
global $pat;
global $pmt;
global $array;
global $count;
global $patlist;
global $programs;
global $id;
global $db;
global $sdtlist;
global $programNumber;
global $transportstreamid;
$pos = 0;
$nbits = 8;
$showpid = 0;
$array = $data;
$pidtable = array(
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
82
0x0000 => 'PAT',
0x0001 => 'CAT',
0x0002 => 'TSDT',
0x0010 => 'NIT_ST',
0x0011 => 'SDT_BAT_ST',
0x0012 => 'EIT_ST_CIT',
0x0013 => 'RST_ST',
0x0014 => 'TDT_TOT_ST',
0x0015 => 'NETWORK_SYNC',
0x0016 => 'RNT',
0x001c => 'INBAND_SIG',
0x001d => 'MEASUREMENT',
0x001e => 'DIT',
0x001f => 'SIT'
);
$servicetype= array(
0x01 => 'DIGITAL TELEVISION SERVICE',
0x02 => 'DIGITAL RADIO SOUND SERVICE',
0x03 => 'TELETEXT SERVICE' ,
0x04 => 'NVOD REFERENCE SERVICE',
0x05 => 'NVOD TIME SHIFTED SERVICE',
0x06 => 'MOSAIC SERVICE',
0x07 => 'FM RADIO SERVICE',
0x08 => 'DVB SRM SERVICE',
0x0a => 'ADVANCED CODEC DIGITAL RADIO SOUND SERVICE',
0x0b => 'H264 AVC MOSAIC SERVICE',
0x0c => 'DATA BROADCAST SERVICE',
0x0e => 'RCS MAP',
0x0f => 'RCS FLS',
0x10 => 'DVB_MHP_SERVICE',
0x11 => 'MPEG2_HD_DIGITAL_TELEVISION_SERVICE',
0x16 => 'H.264/AVC SD DIGITAL TELEVISION SERVICE',
0x17 => 'H.264/AVC SD NVOD TIME-SHIFTED SERVICE',
0x18 => 'H.264/AVC SD NVOD REFERENCE SERVICE',
0x19 => 'H.264/AVC HD DIGITAL TELEVISION SERVICE',
0x1A => 'H.264/AVC HD NVOD TIME-SHIFTED SERVICE',
0x1B => 'H.264/AVC HD NVOD REFERENCE SERVICE'
);
$syncbyte = leerN(8);
$syncbytehex =dechex($syncbyte);
if ($syncbyte !== 0x47){
throw new Exception("Error en SYNCBYTE. No válido.");
}
$transportErrorIndicator = leerN(1);
if($transportErrorIndicator === 0x01){
echo "Error detectado.";
throw new Exception("Transport Error Indicator ON.");
showTransportErrorIndicator($transportErrorIndicator);
}
$payloadUnitStartIndicator = leerN(1);
$transportPriority = leerN(1);
$pid = leerN(13);
$transportScramblingControl = leerN(2);
$adaptationFieldControl = leerN(2);
$continuityCounter= leerN(4);
global $pat;
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
83
global $pmt;
$hasPayload=($adaptationFieldControl & 0b01) === 0b01;
$hasAdaptationField = ($adaptationFieldControl & 0b10) === 0b10;
if($hasPayload){
if(isset($pidtable[$pid])){
if($pid === Pid::PAT){
if(!$id){
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
saltarN(8);
$tableID = leerN(8);
$sectionSyntax = leerN(1);
$reserved=leerN(3);
$sectionLength = leerN(12);
$sectionlengthBin = decbin($sectionLength);
$tsID = leerN(16);
$reserved3 = leerN(2);
$versionNumber = leerN(5);
$versionNumberBin = decbin($versionNumber);
$currentnextId = leerN(1);
$sectionNumber = leerN(8);
$lastSectionNumber = leerN(8);
$vueltapat = 0;
$countpat=0;
$query1 = "Select distinct pointer from pat";
$result1 = mysqli_query($id,$query1);
$i=0;
$j=0;
$n=0;
while($row1 = mysqli_fetch_assoc($result1)){
$patlist[$i]=$row1['pointer'];
$i++;
}
mysqli_free_result($result1);
$countpointer = $count+$pointer;
if(!in_array(($countpointer), $patlist)){
$stmt = mysqli_prepare($id,"INSERT INTO PAT VALUES
(?,?,?,?,?,?,?,?)");
mysqli_stmt_bind_param($stmt,'iiiiiiii',$transportstreamid,$countpointer,$
tableID, $sectionSyntax, $sectionLength, $tsID, $currentnextId,
$sectionNumber);
$result = mysqli_stmt_execute($stmt);
if(!$result){
echo "Fallo al ejecutar la consulta: (" .
mysqli_error($id) . " 223) " ;
die("Error: no se pudo realizar la consulta.");
}
}
$query_2 = "Select distinct program_number from programs";
$result_2 = mysqli_query($id, $query_2);
while($row = mysqli_fetch_assoc($result_2)){
$programs[$n]=$row['program_number'];
$n++;
}
if(!$result_2){
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
84
echo "Fallo al ejecutar la consulta: (" .
mysqli_error($id) . " 236) " ;
die("Error: no se pudo realizar la consulta.");
}
mysqli_free_result($result_2);
for($j=0; $j<$sectionLength; $j+=8){
$programNumber= leerN(16);
$reserved4 = leerN(3);
IF($programNumber == 0){
$networkPID = leerN(13);
$pat[$networkPID] = $programNumber;
}else{
$pmtPID = leerN(13);
$pat[$pmtPID] = $programNumber;
}
$vueltapat+=1;
if (!in_array($programNumber, $programs)){
if($programNumber == 0 ){
$stmt2 = mysqli_prepare($id, "INSERT INTO
programs VALUES (?,?,?)");
mysqli_stmt_bind_param($stmt2,'iii',$transportstreamid, $programNumber,
$networkPID);
$result2 = mysqli_execute($stmt2);
if(!$result2){
echo "Fallo al ejecutar la consulta: (" .
mysqli_error($id) . ") " ;
die("Error: no se pudo realizar la
consulta.");
}
}else if($programNumber < 1016){
$stmt2 = mysqli_prepare($id, "INSERT INTO
programs VALUES (?,?,?)");
mysqli_stmt_bind_param($stmt2,'iii',
$transportstreamid, $programNumber, $pmtPID);
$result2 = mysqli_execute($stmt2);
if(!$result2){
echo "Fallo al ejecutar la consulta: (" .
mysqli_error($id) . ") " ;
die("Error: no se pudo realizar la
consulta.");
}
}
}
}
$crc = leerN(32);
}
if($pid === Pid::SDT_BAT_ST){
global $count;
global $transportstreamid;
if(!$id){
echo "Fallo al ejecutar la consulta: (" .
mysqli_error($id) . " 297) " ;
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
saltarN(8);
$tableID = leerN(8);
$sectionSyntax = leerN(1);
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
85
$reserved = leerN(3);
$sectionLength = leerN(12);
$slength = $sectionLength;
$sectionlengthBin = decbin($sectionLength);
$tsID = leerN(16);
$tsIDHEX = dechex($tsID);
$reserved2 = leerN(2);
$versionNumber = leerN(5);
$versionNumberBin = decbin($versionNumber);
$currentnextId = leerN(1);
$sectionNumber = leerN(8);
$lastSectionNumber = leerN(8);
$originalNetworkID = leerN(16);
$reserved3= leerN(8);
$vueltasdt = 0;
$countsdt=0;
while($sectionLength>=0){
$service_id= leerN(16);
$reserved4 = leerN(6);
$eit_scheduled_flag = leerN(1);
$countsdt +=1;
$eit_present_following_flag = leerN(1);
$running_status = leerN(3);
$free_CA_mnode = leerN(1);
$descriptor_loop_length = leerN(12);
$descriptor_tag= leerN(8);
$descriptor_length = leerN(8);
$service_type = leerN(8);
$service_provider_name_length = leerN(8);
$service_provider_name =
leerCadena($service_provider_name_length);
$service_name_length = leerN(8);
$service_name = leerCadena($service_name_length) ;
$vueltasdt+=1;
$sectionLength -=7+ ($descriptor_loop_length);
$query1 = "Select distinct service_id from sdt";
$result1 = mysqli_query($id,$query1);
$i=0;
$j=0;
$sdtlist = array();
while($row1 = mysqli_fetch_assoc($result1)){
$sdtlist[$i]=$row1['service_id'];
$i++;
}
$countpointer = $count+$pointer;
if(!in_array($service_id, $sdtlist) && $service_id <
1016){
$stmt3 = mysqli_prepare($id, "INSERT INTO sdt
values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
?, ?)");
mysqli_stmt_bind_param($stmt3,'iiiiiiiiiiiiiiiiiiiiisis',
$transportstreamid, $countpointer, $tableID, $sectionSyntax, $slength,
$tsID, $versionNumber,$currentnextId,$sectionNumber, $lastSectionNumber,
$originalNetworkID,$service_id,
$eit_scheduled_flag,$eit_present_following_flag, $running_status,
$free_CA_mnode, $descriptor_loop_length, $descriptor_tag,
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
86
$descriptor_length, $service_type, $service_provider_name_length,
$service_provider_name,$service_name_length,$service_name);
$result3 = mysqli_execute($stmt3);
if(!$result3){
echo "Fallo al ejecutar la consulta: (" .
mysqli_error($id) . ") " ;
die("Error: no se pudo realizar la
consulta.");
}
}
}
$crc = leerN(32);
}else{
}
}else if(count($pat) !== 0){
if(!$id){
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
saltarN(8);
$tableID = leerN(8);
$sectionSyntax = leerN(1);
$reserved = leerN(3);
$sectionLength = leerN(12);
$programNumber = leerN(16);
$reserved2 = leerN(2);
$versionNumber=leerN(5);
$currentnextId = leerN(1);
$sectionNumber = leerN(8);
$lastSectionNumber = leerN(8);
$reserved3 = leerN(3);
$PCR_PID= leerN(13);
$reserved4 = leerN(4);
$programInfoLength = leerN(12);
$stream_type = leerN(8);
saltarN(3);
$elementary_PID = leerN(13);
saltarN(4);
$ES_info_length = leerN(12);
$descriptor_tag = leerN(8);
$descriptor_tag_hex = dechex($descriptor_tag);
$countpointer= $count + $pointer;
if($pid <>8191 && $programNumber < 1016){
$query1 = "Select distinct pointer from pmt";
$result1 = mysqli_query($id,$query1);
$i=0;
$pmtlist = array();
while($row1 = mysqli_fetch_assoc($result1)){
$pmtlist[$i]=$row1['pointer'];
$i++;
}
mysqli_free_result($result1);
if(in_array($programNumber,$programs) && $programNumber
<>0 && $programNumber< 1016){
$stmt4 = mysqli_prepare($id, "INSERT INTO pmt values
(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
87
mysqli_stmt_bind_param($stmt4,'iiiiiiiiiiiiiiiii',$transportstreamid,$coun
tpointer, $tableID,$sectionSyntax,$sectionLength, $programNumber,
$versionNumber, $currentnextId, $sectionNumber, $lastSectionNumber,
$PCR_PID, $programInfoLength, $stream_type, $elementary_PID,
$ES_info_length, $descriptor_tag, $descriptor_tag_hex);
$result4 = mysqli_execute($stmt4);
if(!$result4){
echo "Fallo al ejecutar la consulta: (" .
mysqli_error($id) . " 470) " ;
die("Error: no se pudo realizar la consulta.");
}
switch ($descriptor_tag_hex){
case 0x02:
video_stream_descriptor($countpointer,
$programNumber);
break;
case 0x03:
audio_stream_descriptor($countpointer,
$programNumber);
break;
case 0x04:
hierarchy_descriptor($countpointer,
$programNumber);
break;
case 0x06:
data_stream_alignment_descriptor($countpointer, $programNumber);
break;
case 0x07:
target_background_grid_descriptor($countpointer, $programNumber);
break;
case 0x08:
video_window_descriptor($countpointer,
$programNumber);
break;
case 0x0a:
iso_639_language_descriptor($countpointer,
$programNumber);
break;
case 0x0b:
system_clock_descriptor($countpointer,
$programNumber);
break;
case 0x0c:
multiplex_buffer_utilization_descriptor($countpointer, $programNumber);
break;
case 0x0d:
copyright_descriptor();
break;
case 0x0e:
maximum_bitrate_descriptor($countpointer,
$programNumber);
break;
case 0x0f:
private_data_indicator_descriptor($countpointer, $programNumber);
break;
case 0x10:
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
88
smoothing_buffer_descriptor($countpointer,
$programNumber);
break;
case 0x11:
std_descriptor($countpointer, $programNumber);
break;
case 0x12:
ibp_descriptor($countpointer, $programNumber);
break;
case 0x1b:
mpeg4_video_descriptor($countpointer,
$programNumber);
break;
case 0x1c:
mpeg4_audio_descriptor($countpointer,
$programNumber);
break;
case 0x1e:
sl_descriptor($countpointer, $programNumber);
break;
case 0x1f:
fmc_descriptor($countpointer, $programNumber);
break;
case 0x20:
external_es_id_descriptor($countpointer,
$programNumber);
break;
case 0x23:
multiplexbuffer_descriptor($countpointer,
$programNumber);
break;
case 0x45:
vbi_data_descriptor($countpointer,
$programNumber);
break;
case 0x46:
vbi_teletext_descriptor($countpointer,
$programNumber);
break;
case 0x52:
stream_identifier_descriptor($countpointer,
$programNumber);
break;
case 0x56:
teletext_descriptor($countpointer,
$programNumber);
break;
case 0x59:
subtitling_descriptor($countpointer,
$programNumber);
break;
case 0x5f:
private_data_specifier_descriptor();
break;
case 0x60:
service_move_descriptor($countpointer,
$programNumber);
break;
case 0x65:
scrambling_descriptor($countpointer,
$programNumber);
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
89
break;
case 0x66:
data_broadcast_id_descriptor($countpointer,
$programNumber);
break;
}
}
}
}else{
saltarN(1472);
}
}
}
function leerN(int $n){
$valor = 0;
global $pos;
global $nbits;
global $array;
global $unos;
$unos = array(
0 => 0x00,
1 => 0x01,
2 => 0x03,
3 => 0x07,
4 => 0x0F,
5 => 0x1F,
6 => 0x3F,
7 => 0x7F,
8 => 0xFF
);
if($n>0){
while ($n>0){
if($nbits == 0){
$nbits = 8;
$pos+=1;
$byteActual=ord($array[$pos]);
$cuantos = min($n,$nbits);
$mascara = $unos[$cuantos] << abs($nbits -$cuantos);
$valorc = ($mascara & $byteActual) >> abs($nbits -
$cuantos);
$valor=$valor + ($valorc << abs($n-$cuantos));
$n = $n - $cuantos;
$nbits = $nbits -$cuantos;
}else{
$byteActual=ord($array[$pos]);
$cuantos = min($n,$nbits);
$mascara = $unos[$cuantos] << abs($nbits -$cuantos);
$valorc = ($mascara & $byteActual) >> abs($nbits -
$cuantos);
$valor=$valor + ($valorc << abs($n-$cuantos));
$n = $n - $cuantos;
$nbits = $nbits -$cuantos;
}
}
}else{
}
return $valor;
}
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
90
function saltarN(int $n){
$valor = 0;
global $pos;
global $nbits;
global $array;
global $unos;
$unos = array(
0 => 0x00,
1 => 0x01,
2 => 0x03,
3 => 0x07,
4 => 0x0F,
5 => 0x1F,
6 => 0x3F,
7 => 0x7F,
8 => 0xFF
);
if($n>0){
while ($n>0){
if($nbits == 0){
$nbits = 8;
$pos+=1;
$byteActual=ord($array[$pos]);
$cuantos = min($n,$nbits);
$n = $n - $cuantos;
$nbits = $nbits -$cuantos;
}else{
$byteActual=ord($array[$pos]);
$cuantos = min($n,$nbits);
$n = $n - $cuantos;
$nbits = $nbits -$cuantos;
}
}
}else{
}
}
function leerCadena(int $length){
$char = '';
$i=0;
$table_type = 'ISO-8859-1';
while($i<$length){
$c = leerN(8);
if($c == 0x05){
$table_type = 'ISO-8859-9';
}else{
$c = iconv($table_type,'utf-8', chr($c));
$char .=$c;
}
$i++;
}
return $char;
}
function leerCadenaISO(int $length){
$char = '';
$i=0;
$table_type = 'ISO-8859-1';
while($i<$length){
$c = leerN(8);
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
91
$c = iconv($table_type,'utf-8', chr($c));
$char .=$c;
$i++;
}
return $char;
}
function video_stream_descriptor(int $countpointer, int $programNumber){
global $transportstreamid;
global $id;
global $db;
if(!$id){
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
$descriptor_length=leerN(8);
$multiple_frame_rate_flag = leerN(1);
$frame_rate_code = leerN(4);
$mpeg_1_only_flag = leerN(1);
$constrained_parameter_flag = leerN(1);
$still_picture_flag=leerN(1);
echo "VIDEO STREAM DESCRIPTOR: <br>Descriptor Length:
$descriptor_length //"
. "Multiple FR Flag: $multiple_frame_rate_flag //"
. "FR Code: $frame_rate_code //"
. "MPEG 1 only flag: $mpeg_1_only_flag //"
. "Constrained parameter flag : $constrained_parameter_flag
//"
. "Still picture flag : $still_picture_flag <br>";
if ($mpeg_1_only_flag == 0){
$profile_and_level_indication = leerN(8);
$chroma_format = leerN(2);
$frame_rate_extension_flag = leerN(1);
$reserved = leerN(5);
}
$query1 = "Select distinct pointer from videostreamdescriptor";
$result1 = mysqli_query($id,$query1);
$i=0;
$list = array();
while($row1 = mysqli_fetch_assoc($result1)){
$list[$i]=$row1['pointer'];
$i++;
}
if(!in_array($countpointer, $list)){
$stmt = mysqli_prepare($id, "INSERT INTO videostreamdescriptor
values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt,'iiiiiiiiiiii', $transportstreamid,
$programNumber, $countpointer,
$descriptor_length,$multiple_frame_rate_flag,
$frame_rate_code,$mpeg_1_only_flag,$constrained_parameter_flag,$still_pict
ure_flag,$profile_and_level_indication,$chroma_format,$frame_rate_extensio
n_flag);
$result = mysqli_execute($stmt);
if(!$result){
echo "Fallo al ejecutar la consulta: (" . mysqli_error($id) .
" 776) " ;
die("Error: no se pudo realizar la consulta.");
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
92
}
mysqli_stmt_free_result($stmt);
}
}
function audio_stream_descriptor(int $countpointer, int $programNumber){
global $transportstreamid;
global $id;
global $db;
if(!$id){
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
$descriptor_length=leerN(8);
$free_format_flag = leerN(1);
$id2 = leerN(1);
$layer = leerN(2);
$variable_rate_audio_indicator = leerN(1);
$reserved = leerN(3);
echo "AUDIO STREAM DESCRIPTOR: <br>Descriptor length:
$descriptor_length //"
. "Free Format Flag: $free_format_flag //"
. "ID: $id2 //"
. "Layer: $layer //"
. "Variable Rate Audio Indicator:
$variable_rate_audio_indicator<br>";
$query1 = "Select distinct pointer from audiostreamdescriptor";
$result1 = mysqli_query($id,$query1);
$i=0;
$list = array();
while($row1 = mysqli_fetch_assoc($result1)){
$list[$i]=$row1['pointer'];
$i++;
}
if(!in_array($countpointer, $list)){
$stmt = mysqli_prepare($id, "INSERT INTO audiostreamdescriptor
values (?, ?, ?, ?, ?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt,'iiiiiiii',$transportstreamid,
$programNumber, $countpointer, $descriptor_length,$free_format_flag,$id2,
$layer, $variable_rate_audio_indicator);
$result = mysqli_execute($stmt);
if(!$result){
echo "Fallo al ejecutar la consulta: (" . mysqli_error($id) .
" 807) " ;
die("Error: no se pudo realizar la consulta.");
}
mysqli_stmt_free_result($stmt);
}
}
function hierarchy_descriptor(int $countpointer, int $programNumber){
global $transportstreamid;
global $id;
global $db;
$descriptor_length = leerN(8);
$reserved = leerN(4);
$hierarchy_type = leerN(4);
$reserved2 = leerN(2);
$hierarchy_layer_index = leerN(6);
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
93
$reserved3 = leerN(2);
$hierarchy_embedded_layer_index = leerN(6);
$reserved4=leerN(2);
$hierarchy_channel = leerN(6);
echo "HIERARCHY DESCRIPTOR: <br>Descriptor length: $descriptor_length
//"
. "Hierarchy Type: $hierarchy_type //"
. "Hierarchy Layer: $hierarchy_layer_index //"
. "Hierarchy Embedded Layer Index:
$hierarchy_embedded_layer_index //"
. "Hierarchy Channel: $hierarchy_channel<br>";
if(!$id){
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
$query1 = "Select distinct pointer from hierarchydescriptor";
$result1 = mysqli_query($id,$query1);
$i=0;
$list = array();
while($row1 = mysqli_fetch_assoc($result1)){
$list[$i]=$row1['pointer'];
$i++;
}
if(!in_array($countpointer, $list)){
$stmt = mysqli_prepare($id, "INSERT INTO hierarchydescriptor
values (?, ?, ?, ?, ?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt,'iiiiiiii',$countpointer,$transportstreamid,
$programNumber, $descriptor_length, $hierarchy_type,
$hierarchy_layer_index, $hierarchy_embedded_layer_index,
$hierarchy_channel);
$result = mysqli_execute($stmt);
if(!$result){
echo "Fallo al ejecutar la consulta: (" . mysqli_error($id) .
"839) " ;
die("Error: no se pudo realizar la consulta.");
}
mysqli_stmt_free_result($stmt);
}
}
function registration_descriptor(int $countpointer, int $programNumber){
global $transportstreamid;
global $id;
global $db;
$descriptor_length=leerN(8);
$format_identifier=leerN(32);
for($i=0;$i<$format_identifier;$i++){
$additional_identification_info = leerN(8);
}
echo "REGISTRATION DESCRIPTOR: <br>Descriptor length:
$descriptor_length //"
. "Format identifier: $format_identifier<br>";
if(!$id){
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
94
$query1 = "Select distinct pointer from registrationdescriptor";
$result1 = mysqli_query($id,$query1);
$i=0;
$list = array();
while($row1 = mysqli_fetch_assoc($result1)){
$list[$i]=$row1['pointer'];
$i++;
}
if(!in_array($countpointer, $list)){
$stmt = mysqli_prepare($id, "INSERT INTO registrationdescriptor
values (?, ?, ?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt,'iiiiii',$countpointer,$transportstreamid,
$programNumber, $descriptor_length, $format_identifier,
$additional_identification_info);
$result = mysqli_execute($stmt);
if(!$result){
echo "Fallo al ejecutar la consulta: (" . mysqli_error($id) .
" 864) " ;
die("Error: no se pudo realizar la consulta.");
}
mysqli_stmt_free_result($stmt);
}
}
function data_stream_alignment_descriptor(int $countpointer, int
$programNumber){
global $transportstreamid;
global $id;
global $db;
$descriptor_length=leerN(8);
$alignment_type = leerN(8);
echo "DATA STREAM ALIGNMENT DESCRIPTOR: <br>Descriptor length:
$descriptor_length // "
. "Alignment Type: $alignment_type<br>";
if(!$id){
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
$query1 = "Select distinct pointer from
datastreamalignmentdescriptor";
$result1 = mysqli_query($id,$query1);
$i=0;
$list = array();
while($row1 = mysqli_fetch_assoc($result1)){
$list[$i]=$row1['pointer'];
$i++;
}
if(!in_array($countpointer, $list)){
$stmt = mysqli_prepare($id, "INSERT INTO
datastreamalignmentdescriptor values (?, ?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt,'iiiii',$countpointer,$transportstreamid,
$programNumber, $descriptor_length, $alignment_type);
$result = mysqli_execute($stmt);
if(!$result){
echo "Fallo al ejecutar la consulta: (" . mysqli_error($id) .
" 886) " ;
die("Error: no se pudo realizar la consulta.");
}
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
95
mysqli_stmt_free_result($stmt);
}
}
function target_background_grid_descriptor(int $countpointer, int
$programNumber){
global $transportstreamid;
global $id;
global $db;
$descriptor_length=leerN(8);
$horizontal_size =leerN(14);
$vertical_size = leerN(14);
$aspect_ratio_information = leerN(4);
echo "TARGET BACKGROUND GRID DESCRIPTOR: <br>Descriptor Length:
$descriptor_length //"
. "Horizontal size: $horizontal_size //"
. "Vertical size: $vertical_size //"
. "Aspect Ratio: $aspect_ratio_information<br>";
if(!$id){
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
$query1 = "Select distinct pointer from
targetbackgroundgriddescriptor";
$result1 = mysqli_query($id,$query1);
$i=0;
$targetlist = array();
while($row1 = mysqli_fetch_assoc($result1)){
$targetlist[$i]=$row1['pointer'];
$i++;
}
if(!in_array($countpointer, $targetlist)){
$stmt = mysqli_prepare($id, "INSERT INTO
targetbackgroundgriddescriptor values (?, ?, ?, ?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt,'iiiiiii',$countpointer,$transportstreamid,
$programNumber, $descriptor_length, $horizontal_size, $vertical_size,
$aspect_ratio_information);
$result = mysqli_execute($stmt);
if(!$result){
echo "Fallo al ejecutar la consulta: (" . mysqli_error($id) .
" 912) " ;
die("Error: no se pudo realizar la consulta.");
}
mysqli_stmt_free_result($stmt);
}
}
function video_window_descriptor(int $countpointer, int $programNumber){
global $transportstreamid;
global $id;
global $db;
$descriptor_length=leerN(8);
$horizontal_offset = leerN(14);
$vertical_offset = leerN(14);
$window_priority = leerN(4);
echo "VIDEO WINDOW DESCRIPTOR: <br>Descriptor Length:
$descriptor_length //"
. "Horizontal offset: $horizontal_offset //"
. "Vertical offset: $vertical_offset //"
. "Window priority: $window_priority<br>";
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
96
if(!$id){
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
$query1 = "Select distinct pointer from videowindowdescriptor";
$result1 = mysqli_query($id,$query1);
$i=0;
$videolist = array();
while($row1 = mysqli_fetch_assoc($result1)){
$videolist[$i]=$row1['pointer'];
$i++;
}
if(!in_array($countpointer, $videolist)){
$stmt = mysqli_prepare($id, "INSERT INTO videowindowdescriptor
values (?, ?, ?, ?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt,'iiiiiii',$countpointer,$transportstreamid,
$programNumber, $descriptor_length, $horizontal_offset, $vertical_offset,
$window_priority);
$result = mysqli_execute($stmt);
if(!$result){
echo "Fallo al ejecutar la consulta: (" . mysqli_error($id) .
" 1048) " ;
die("Error: no se pudo realizar la consulta.");
}
mysqli_stmt_free_result($stmt);
}
}
function ca_descriptor(int $countpointer, int $programNumber){
$descriptor_length=leerN(8);
$ca_system_id = leerN(16);
$reserved = leerN(3);
$ca_PID=leerN(13);
}
function iso_639_language_descriptor(int $countpointer, int
$programNumber){
global $transportstreamid;
global $id;
global $db;
if(!$id){
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
$descriptor_length=leerN(8);
for ($i=0;$i<$descriptor_length;$i++){
$iso_639_language_code = leerCadena(24);
$audio_type = leerN(8);
echo "ISO 639 DESCRIPTOR: <br>Descriptor Length:
$descriptor_length //"
. "ISO 639 Language Code: $iso_639_language_code
//"
. "Audio Type: $audio_type<br>";
$query1 = "Select distinct pointer from
iso639languagedescriptor";
$result1 = mysqli_query($id,$query1);
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
97
$n=0;
$isolist = array();
while($row1 = mysqli_fetch_assoc($result1)){
$isolist[$n]=$row1['pointer'];
$n++;
}
if(!in_array($countpointer, $isolist)){
$stmt = mysqli_prepare($id, "INSERT INTO
iso639languagedescriptor values(?, ?, ?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt,'iiiisi',$transportstreamid,$programNum
ber, $countpointer,$descriptor_length, $iso_639_language_code,
$audio_type);
$result = mysqli_execute($stmt);
if(!$result){
echo "Fallo al ejecutar la consulta: (" .
mysqli_error($id) . " 983) " ;
die("Error: no se pudo realizar la consulta.");
}
}
}
mysqli_stmt_free_result($stmt);
}
function system_clock_descriptor(){
$descriptor_length=leerN(8);
$external_clock_reference_indicator = leerN(1);
$reserved = leerN(1);
$clock_accuracy_integer = leerN(6);
$clock_accuracy_exponent =leerN(3);
$reserved2 = leerN(5);
echo "SYSTEM CLOCK DESCRIPTOR: <br>Descriptor Length:
$descriptor_length //"
. "External clock reference indicator:
$external_clock_reference_indicator //"
. "Clock accuracy integer: $clock_accuracy_integer //"
. "Clock accuracy exponent: $clock_accuracy_exponent<br>";
}
function multiplex_buffer_utilization_descriptor(int $countpointer, int
$programNumber){
global $transportstreamid;
global $id;
global $db;
if(!$id){
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
$descriptor_length=leerN(8);
$bound_valid_flag = leerN(1);
$ltw_offset_lower_bound = leerN(15);
$reserved = leerN(1);
$ltw_offset_upper_bound = leerN(14);
$query1 = "Select distinct pointer from
multiplexbufferutilizationdescriptor";
$result1 = mysqli_query($id,$query1);
$i=0;
$list = array();
while($row1 = mysqli_fetch_assoc($result1)){
$list[$i]=$row1['pointer'];
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
98
$i++;
}
if(!in_array($countpointer, $list)){
$stmt = mysqli_prepare($id, "INSERT INTO
multiplexbufferutilizationdescriptor values (?, ?, ?, ?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt,'iiiiiii',$countpointer,$transportstreamid,
$descriptor_length, $bound_valid_flag, $ltw_offset_lower_bound,
$ltw_offset_upper_bound,$programNumber);
$result = mysqli_execute($stmt);
if(!$result){
echo "Fallo al ejecutar la consulta: (" . mysqli_error($id) .
" 1145) " ;
die("Error: no se pudo realizar la consulta.");
}
mysqli_stmt_free_result($stmt);
}
echo "MULTIPLEX BUFFER UTILIZATION DESCRIPTOR: <br>Descriptor Length:
$descriptor_length //"
. "Bound valid flag: $bound_valid_flag //"
. "LTW offset lower bound: $ltw_offset_lower_bound //"
. "LTW Offset Upper bound: $ltw_offset_upper_bound<br>";
}
function copyright_descriptor(int $countpointer, int $programNumber){
global $transportstreamid;
global $id;
global $db;
if(!$id){
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
$descriptor_length= leerN(8);
$copyright_identifier = leerN(32);
for ($i=0;$i<$descriptor_length;$i++){
$additional_copyright_data = leerN(8);
}
$query1 = "Select distinct pointer from copyrightdescriptor";
$result1 = mysqli_query($id,$query1);
$n=0;
$list = array();
while($row1 = mysqli_fetch_assoc($result1)){
$list[$n]=$row1['pointer'];
$n++;
}
if(!in_array($countpointer, $list)){
$stmt = mysqli_prepare($id, "INSERT INTO copyrightdescriptor
values (?, ?, ?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt,'iiiiii',$countpointer,$transportstreamid,
$programNumber, $descriptor_length, $copyright_identifier,
$additional_copyright_data);
$result = mysqli_execute($stmt);
if(!$result){
echo "Fallo al ejecutar la consulta: (" . mysqli_error($id) .
" 1185) " ;
die("Error: no se pudo realizar la consulta.");
}
mysqli_stmt_free_result($stmt);
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
99
}
echo "COPYRIGHT DESCRIPTOR: <br>Descriptor Length: $descriptor_length
<br>";
}
function maximum_bitrate_descriptor(int $countpointer, int
$programNumber){
global $transportstreamid;
global $id;
global $db;
if(!$id){
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
$descriptor_length= leerN(8);
$reserved = leerN(2);
$maximum_bitrate = leerN(22);
$query1 = "Select distinct pointer from maximumbitratedescriptor";
$result1 = mysqli_query($id,$query1);
$i=0;
$list = array();
while($row1 = mysqli_fetch_assoc($result1)){
$list[$i]=$row1['pointer'];
$i++;
}
if(!in_array($countpointer, $list)){
$stmt = mysqli_prepare($id, "INSERT INTO maximumbitratedescriptor
values (?, ?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt,'iiiii',$countpointer,$transportstreamid,$pro
gramNumber, $descriptor_length, $maximum_bitrate);
$result = mysqli_execute($stmt);
if(!$result){
echo "Fallo al ejecutar la consulta: (" . mysqli_error($id) .
" 1221) " ;
die("Error: no se pudo realizar la consulta.");
}
mysqli_stmt_free_result($stmt);
}
echo "MAXIMUM BITRATE DESCRIPTOR: <br>Descriptor Length:
$descriptor_length //"
. "Maximum bitrate: $maximum_bitrate <br>";
}
function private_data_indicator_descriptor(int $countpointer, int
$programNumber){
global $transportstreamid;
global $id;
global $db;
if(!$id){
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
$descriptor_length=leerN(8);
$private_data_indicator = leerN(32);
$query1 = "Select distinct pointer from privatedatadescriptor";
$result1 = mysqli_query($id,$query1);
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
100
$i=0;
$list = array();
while($row1 = mysqli_fetch_assoc($result1)){
$list[$i]=$row1['pointer'];
$i++;
}
if(!in_array($countpointer, $list)){
$stmt = mysqli_prepare($id, "INSERT INTO privatedatadescriptor
values (?, ?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt,'iiiii',$countpointer,$transportstreamid,$pro
gramNumber, $descriptor_length, $private_data_indicator);
$result = mysqli_execute($stmt);
if(!$result){
echo "Fallo al ejecutar la consulta: (" . mysqli_error($id) .
" 1256) " ;
die("Error: no se pudo realizar la consulta.");
}
mysqli_stmt_free_result($stmt);
}
echo "PRIVATE DATA DESCRIPTOR: <br>Descriptor Length:
$descriptor_length //"
. "Private Data indicator: $private_data_indicator <br>";
}
function smoothing_buffer_descriptor(int $countpointer, int
$programNumber){
global $transportstreamid;
global $id;
global $db;
if(!$id){
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
$descriptor_length = leerN(8);
$reserved=leerN(2);
$sb_leak_rate = leerN(22);
$reserved2=leerN(2);
$sb_size = leerN(22);
$query1 = "Select distinct pointer from smoothingbufferdescriptor";
$result1 = mysqli_query($id,$query1);
$i=0;
$list = array();
while($row1 = mysqli_fetch_assoc($result1)){
$list[$i]=$row1['pointer'];
$i++;
}
if(!in_array($countpointer, $list)){
$stmt = mysqli_prepare($id, "INSERT INTO smoothingbufferdescriptor
values (?, ?, ?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt,'iiiiii',$countpointer,$transportstreamid,$pr
ogramNumber, $descriptor_length, $sb_leak_rate, $sb_size);
$result = mysqli_execute($stmt);
if(!$result){
echo "Fallo al ejecutar la consulta: (" . mysqli_error($id) .
" 1294) " ;
die("Error: no se pudo realizar la consulta.");
}
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
101
mysqli_stmt_free_result($stmt);
}
echo "SMOOTHING BUFFER DESCRIPTOR: <br>Descriptor Length:
$descriptor_length //"
. "SB Leak Rate: $sb_leak_rate //"
. "SB Size: $sb_size<br>";
}
function std_descriptor(int $countpointer, int $programNumber){
global $transportstreamid;
global $id;
global $db;
if(!$id){
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
$descriptor_length=leerN(8);
$reserved = leerN(7);
$leak_valid_flag=leerN(1);
$query1 = "Select distinct pointer from stddescriptor";
$result1 = mysqli_query($id,$query1);
$i=0;
$list = array();
while($row1 = mysqli_fetch_assoc($result1)){
$list[$i]=$row1['pointer'];
$i++;
}
if(!in_array($countpointer, $list)){
$stmt = mysqli_prepare($id, "INSERT INTO stddescriptor values (?,
?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt,'iiiii',$countpointer,$transportstreamid,$pro
gramNumber, $descriptor_length, $leak_valid_flag);
$result = mysqli_execute($stmt);
if(!$result){
echo "Fallo al ejecutar la consulta: (" . mysqli_error($id) .
" 1331) " ;
die("Error: no se pudo realizar la consulta.");
}
mysqli_stmt_free_result($stmt);
}
echo "STD DESCRIPTOR: <br>Descriptor Length: $descriptor_length //"
. "Leak valid flag: $leak_valid_flag <br>";
}
function ibp_descriptor(int $countpointer, int $programNumber){
global $transportstreamid;
global $id;
global $db;
if(!$id){
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
$descriptor_length=leerN(8);
$closed_gop_flag = leerN(1);
$identical_glop_flag = leerN(1);
$max_gop_length = leerN(14);
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
102
$query1 = "Select distinct pointer from ibpdescriptor";
$result1 = mysqli_query($id,$query1);
$i=0;
$list = array();
while($row1 = mysqli_fetch_assoc($result1)){
$list[$i]=$row1['pointer'];
$i++;
}
if(!in_array($countpointer, $list)){
$stmt = mysqli_prepare($id, "INSERT INTO ibpdescriptor values (?,
?, ?, ?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt,'iiiiiii',$countpointer,$transportstreamid,$p
rogramNumber, $descriptor_length, $closed_gop_flag, $identical_glop_flag,
$max_gop_length);
$result = mysqli_execute($stmt);
if(!$result){
echo "Fallo al ejecutar la consulta: (" . mysqli_error($id) .
" 1368) " ;
die("Error: no se pudo realizar la consulta.");
}
mysqli_stmt_free_result($stmt);
}
echo "IBP DESCRIPTOR: <br>Descriptor Length: $descriptor_length //"
. "Closed GOP Flag: $closed_gop_flag //"
. "Identical GOP Flag: $identical_glop_flag //"
. "Max GOP Length: $max_gop_length <br>";
}
function mpeg4_video_descriptor(int $countpointer, int $programNumber){
global $transportstreamid;
global $id;
global $db;
if(!$id){
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
$descriptor_length=leerN(8);
$mpeg4_visual_profile_and_level = leerN(8);
$query1 = "Select distinct pointer from mpeg4videodescriptor";
$result1 = mysqli_query($id,$query1);
$i=0;
$list = array();
while($row1 = mysqli_fetch_assoc($result1)){
$list[$i]=$row1['pointer'];
$i++;
}
if(!in_array($countpointer, $list)){
$stmt = mysqli_prepare($id, "INSERT INTO mpeg4videodescriptor
values (?, ?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt,'iiiii',$countpointer,$transportstreamid,$pro
gramNumber, $descriptor_length, $mpeg4_visual_profile_and_level);
$result = mysqli_execute($stmt);
if(!$result){
echo "Fallo al ejecutar la consulta: (" . mysqli_error($id) .
" 1405) " ;
die("Error: no se pudo realizar la consulta.");
}
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
103
mysqli_stmt_free_result($stmt);
}
echo "MPEG4 VIDEO DESCRIPTOR: <br>Descriptor Length:
$descriptor_length //"
. "MPEG4 Visual profile and level:
$mpeg4_visual_profile_and_level <br>";
}
function mpeg4_audio_descriptor(int $countpointer, int $programNumber){
global $transportstreamid;
global $id;
global $db;
if(!$id){
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
$descriptor_length=leerN(8);
$mpeg4_audio_profile_and_level = leerN(8);
$query1 = "Select distinct pointer from mpeg4audiodescriptor";
$result1 = mysqli_query($id,$query1);
$i=0;
$list = array();
while($row1 = mysqli_fetch_assoc($result1)){
$list[$i]=$row1['pointer'];
$i++;
}
if(!in_array($countpointer, $list)){
$stmt = mysqli_prepare($id, "INSERT INTO mpeg4audiodescriptor
values (?, ?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt,'iiiii',$countpointer,$transportstreamid,$pro
gramNumber, $descriptor_length, $mpeg4_audio_profile_and_level);
$result = mysqli_execute($stmt);
if(!$result){
echo "Fallo al ejecutar la consulta: (" . mysqli_error($id) .
" 1440) " ;
die("Error: no se pudo realizar la consulta.");
}
mysqli_stmt_free_result($stmt);
}
echo "MPEG4 AUDIO DESCRIPTOR: <br>Descriptor Length:
$descriptor_length //"
. "MPEG4 Audio profile and level:
$mpeg4_audio_profile_and_level <br>";
}
function sl_descriptor(int $countpointer, int $programNumber){
global $transportstreamid;
global $id;
global $db;
if(!$id){
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
$descriptor_length=leerN(8);
$es_id = leerN(16);
$query1 = "Select distinct pointer from sldescriptor";
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
104
$result1 = mysqli_query($id,$query1);
$i=0;
$list = array();
while($row1 = mysqli_fetch_assoc($result1)){
$list[$i]=$row1['pointer'];
$i++;
}
if(!in_array($countpointer, $list)){
$stmt = mysqli_prepare($id, "INSERT INTO sldescriptor values (?,
?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt,'iiiii',$countpointer,$transportstreamid,$pro
gramNumber, $descriptor_length, $es_id);
$result = mysqli_execute($stmt);
if(!$result){
echo "Fallo al ejecutar la consulta: (" . mysqli_error($id) .
" 1475) " ;
die("Error: no se pudo realizar la consulta.");
}
mysqli_stmt_free_result($stmt);
}
echo "SL DESCRIPTOR: <br>Descriptor Length: $descriptor_length //"
. "ES id: $es_id <br>";
}
function fmc_descriptor(int $countpointer, int $programNumber){
global $transportstreamid;
global $id;
global $db;
if(!$id){
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
$descriptor_length=leerN(8);
for ($i=0;$i<$descriptor_length;$i+=3){
$es_id = leerN(16);
$flexmuxchannel = leerN(8);
$query1 = "Select distinct pointer from fmcdescriptor";
$result1 = mysqli_query($id,$query1);
$i=0;
$list = array();
while($row1 = mysqli_fetch_assoc($result1)){
$list[$i]=$row1['pointer'];
$i++;
}
if(!in_array($countpointer, $list)){
$stmt = mysqli_prepare($id, "INSERT INTO fmcdescriptor values
(?, ?, ?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt,'iiiiii',$countpointer,$transportstreamid,$pr
ogramNumber, $descriptor_length, $es_id, $flexmuxchannel);
$result = mysqli_execute($stmt);
if(!$result){
echo "Fallo al ejecutar la consulta: (" .
mysqli_error($id) . " 1512) " ;
die("Error: no se pudo realizar la consulta.");
}
mysqli_stmt_free_result($stmt);
}
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
105
echo "FMC DESCRIPTOR: <br>Descriptor Length: $descriptor_length
//"
. "ES id: $es_id //"
. "FlexMux Channel: $flexmuxchannel <br>";
}
}
function external_es_id_descriptor(int $countpointer, int $programNumber){
global $transportstreamid;
global $id;
global $db;
if(!$id){
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
$descriptor_length=leerN(8);
$external_es_id = leerN(16);
$query1 = "Select distinct pointer from externalesiddescriptor";
$result1 = mysqli_query($id,$query1);
$i=0;
$list = array();
while($row1 = mysqli_fetch_assoc($result1)){
$list[$i]=$row1['pointer'];
$i++;
}
if(!in_array($countpointer, $list)){
$stmt = mysqli_prepare($id, "INSERT INTO externalesiddescriptor
values (?, ?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt,'iiiii',$countpointer,$transportstreamid,$pro
gramNumber, $descriptor_length, $external_es_id);
$result = mysqli_execute($stmt);
if(!$result){
echo "Fallo al ejecutar la consulta: (" . mysqli_error($id) .
" 1549) " ;
die("Error: no se pudo realizar la consulta.");
}
mysqli_stmt_free_result($stmt);
}
echo "EXTERNAL ES ID DESCRIPTOR: <br>Descriptor Length:
$descriptor_length //"
. "ES id: $external_es_id <br>";
}
function multiplexbuffer_descriptor(int $countpointer, int
$programNumber){
global $transportstreamid;
global $id;
global $db;
if(!$id){
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
$descriptor_length=leerN(8);
$mb_buffer_size = leerN(24);
$tb_leak_rate = leerN(24);
$query1 = "Select distinct pointer from multiplexbufferdescriptor";
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
106
$result1 = mysqli_query($id,$query1);
$i=0;
$list = array();
while($row1 = mysqli_fetch_assoc($result1)){
$list[$i]=$row1['pointer'];
$i++;
}
if(!in_array($countpointer, $list)){
$stmt = mysqli_prepare($id, "INSERT INTO multiplexbufferdescriptor
values (?, ?, ?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt,'iiiiii',$countpointer,$transportstreamid,$pr
ogramNumber, $descriptor_length, $mb_buffer_size, $tb_leak_rate);
$result = mysqli_execute($stmt);
if(!$result){
echo "Fallo al ejecutar la consulta: (" . mysqli_error($id) .
" 1585) " ;
die("Error: no se pudo realizar la consulta.");
}
mysqli_stmt_free_result($stmt);
}
echo "MULTIPLEX BUFFER DESCRIPTOR: <br>Descriptor Length:
$descriptor_length //"
. "MB Buffer Size: $mb_buffer_size //"
. "TB Leak rate: $tb_leak_rate <br>";
}
function vbi_data_descriptor(int $countpointer, int $programNumber){
global $transportstreamid;
global $id;
global $db;
if(!$id){
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
$descriptor_lenght=leerN(8);
for ($i=0;$i<$descriptor_lenght;$i++){
$data_service_id = leerN(8);
$data_service_descriptor_length =leerN(8);
if($data_service_id == 0x01 ||
$data_service_id==0x02 ||
$data_service_id==0x04 ||
$data_service_id==0x05 ||
$data_service_id==0x06 ||
$data_service_id==0x07){
for($j=0;$j<$data_service_descriptor_length;$j++){
$reserved = leerN(2);
$field_parity=leerN(1);
$line_offset = leerN(5);
$query1 = "Select distinct pointer from
vbidatadescriptor";
$result1 = mysqli_query($id,$query1);
$n=0;
$list = array();
while($row1 = mysqli_fetch_assoc($result1)){
$list[$n]=$row1['pointer'];
$n++;
}
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
107
if(!in_array($countpointer, $list)){
$stmt = mysqli_prepare($id, "INSERT INTO vbidatadescriptor
values (?, ?, ?, ?, ?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt,'iiiiiiii',$countpointer,$transportstreamid,$
programNumber, $descriptor_lenght, $data_service_id,
$data_service_descriptor_length, $field_parity, $line_offset);
$result = mysqli_execute($stmt);
if(!$result){
echo "Fallo al ejecutar la consulta: (" .
mysqli_error($id) . " 1634) " ;
die("Error: no se pudo realizar la consulta.");
}
mysqli_stmt_free_result($stmt);
}
echo "VBI DATA DESCRIPTOR: <br>Descriptor Length:
$descriptor_lenght //"
. "data service id: $data_service_id //"
. "Data service descriptor length:
$data_service_descriptor_length //"
. "field parity: $field_parity //"
. "line offset: $line_offset <br>";
}
} else{
for ($j=0;$j<$data_service_descriptor_lenght;$j++){
$reserved =leerN(8);
}
}
}
}
function vbi_teletext_descriptor(int $countpointer, int $programNumber){
global $transportstreamid;
global $id;
global $db;
if(!$id){
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
$descriptor_length=leerN(8);
for($i=0;$i<$descriptor_length;$i++){
$iso_639_language_code = leerCadena(24);
$teletext_type = leerN(5);
$teletext_magazine_number = leerN(3);
$teletext_page_number = leerN(8);
$query1 = "Select distinct pointer from vbiteletextdescriptor";
$result1 = mysqli_query($id,$query1);
$n=0;
$list = array();
while($row1 = mysqli_fetch_assoc($result1)){
$list[$n]=$row1['pointer'];
$n++;
}
if(!in_array($countpointer, $list)){
$stmt = mysqli_prepare($id, "INSERT INTO vbiteletextdescriptor
values (?, ?, ?, ?, ?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt,'iiiisiii',$countpointer,$transportstreamid,$
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
108
programNumber, $descriptor_length, $iso_639_language_code,
$teletext_type, $teletext_magazine_number, $teletext_page_number);
$result = mysqli_execute($stmt);
if(!$result){
echo "Fallo al ejecutar la consulta: (" .
mysqli_error($id) . " ) " ;
die("Error: no se pudo realizar la consulta.");
}
mysqli_stmt_free_result($stmt);
}
}
echo "VBI TELETEXT DESCRIPTOR: <br>Descriptor Length:
$descriptor_length //"
. "ISO 639 language code: $iso_639_language_code //"
. "Teletext type: $teletext_type<br>";
}
function mosaic_descriptor(){
}
function stream_identifier_descriptor(int $countpointer, int
$programNumber){
global $transportstreamid;
global $id;
global $db;
if(!$id){
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
$descriptor_length=leerN(8);
$component_tag = leerN(8);
$query1 = "Select distinct pointer from streamidentifierdescriptor";
$result1 = mysqli_query($id,$query1);
$n=0;
$list = array();
while($row1 = mysqli_fetch_assoc($result1)){
$list[$n]=$row1['pointer'];
$n++;
}
if(!in_array($countpointer, $list)){
$stmt = mysqli_prepare($id, "INSERT INTO vbiteletextdescriptor
values (?, ?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt,'iiiii',$countpointer,$transportstreamid,$pro
gramNumber, $descriptor_length, $component_tag);
$result = mysqli_execute($stmt);
if(!$result){
echo "Fallo al ejecutar la consulta: (" .
mysqli_error($id) . " ) " ;
die("Error: no se pudo realizar la consulta.");
}
mysqli_stmt_free_result($stmt);
}
}
function teletext_descriptor(int $countpointer, int $programNumber){
echo "TELETEXT DESCRIPTOR <br>";
global $transportstreamid;
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
109
global $id;
global $db;
if(!$id){
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
$descriptor_length=leerN(8);
echo "Descriptor Lenght: $descriptor_length<br>";
for($i=0;$i<$descriptor_length;$i++){
$iso_639_language_code = leerCadena(24);
$teletext_type = leerN(5);
$teletext_magazine_number = leerN(3);
$teletext_page_number = leerN(8);
$query1 = "Select distinct pointer from teletextdescriptor";
$result1 = mysqli_query($id,$query1);
$n=0;
$list = array();
while($row1 = mysqli_fetch_assoc($result1)){
$list[$n]=$row1['pointer'];
$n++;
}
if(!in_array($countpointer, $list)){
$stmt = mysqli_prepare($id, "INSERT INTO teletextdescriptor
values (?, ?, ?, ?, ?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt,'iiiisiii',$countpointer,$transportstreamid,$
programNumber, $descriptor_length, $iso_639_language_code,
$teletext_type, $teletext_magazine_number, $teletext_page_number);
$result = mysqli_execute($stmt);
if(!$result){
echo "Fallo al ejecutar la consulta: (" .
mysqli_error($id) . " 938) " ;
die("Error: no se pudo realizar la consulta.");
}
mysqli_stmt_free_result($stmt);
}
echo "TELETEXT DESCRIPTOR: <br>Descriptor Length:
$descriptor_length //"
. "ISO 639 language code: $iso_639_language_code //"
. "Teletext type: $teletext_type//"
. "Teletext magazine number: $teletext_magazine_number //"
. "Teletext page number: $teletext_page_number<br>";
}
}
function subtitling_descriptor(int $countpointer, int $programNumber){
global $transportstreamid;
global $id;
global $db;
if(!$id){
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
$descriptor_length=leerN(8);
for($i=0;$i<$descriptor_length;$i++){
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
110
$iso_639_language_code = leerCadena(24);
$subtitling_type = leerN(8);
$composition_page_id = leerN(16);
$ancillary_page_id = leerN(16);
$query1 = "Select distinct pointer from subtitlingdescriptor";
$result1 = mysqli_query($id,$query1);
$n=0;
$list = array();
while($row1 = mysqli_fetch_assoc($result1)){
$list[$n]=$row1['pointer'];
$n++;
}
if(!in_array($countpointer, $list)){
$stmt = mysqli_prepare($id, "INSERT INTO subtitlingdescriptor
values (?, ?, ?, ?, ?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt,'iiiisiii',$countpointer,$transportstreamid,$
programNumber, $descriptor_length, $iso_639_language_code,
$subtitling_type, $composition_page_id, $ancillary_page_id);
$result = mysqli_execute($stmt);
if(!$result){
echo "Fallo al ejecutar la consulta: (" .
mysqli_error($id) . " 938) " ;
die("Error: no se pudo realizar la consulta.");
}
mysqli_stmt_free_result($stmt);
}
echo "SUBTITLING DESCRIPTOR: <br>Descriptor Length:
$descriptor_length //"
. "ISO 639 language code: $iso_639_language_code //"
. "Subtitling type: $subtitling_type<br>";
}
}
function private_data_specifier_descriptor(int $countpointer, int
$programNumber){
global $transportstreamid;
global $id;
global $db;
if(!$id){
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
$descriptor_length=leerN(8);
$private_data_specifier=leerN(32);
$query1 = "Select distinct pointer from
privatedataspecifierdescriptor";
$result1 = mysqli_query($id,$query1);
$i=0;
$list = array();
while($row1 = mysqli_fetch_assoc($result1)){
$list[$i]=$row1['pointer'];
$i++;
}
if(!in_array($countpointer, $list)){
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
111
$stmt = mysqli_prepare($id, "INSERT INTO
privatedataspecifierdescriptor values (?, ?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt,'iiiii',$countpointer,$transportstreamid,$pro
gramNumber, $descriptor_length, $private_data_specifier);
$result = mysqli_execute($stmt);
if(!$result){
echo "Fallo al ejecutar la consulta: (" . mysqli_error($id) .
" 938) " ;
die("Error: no se pudo realizar la consulta.");
}
mysqli_stmt_free_result($stmt);
}
echo "PRIVATE DATA SPECIFIER DESCRIPTOR: <br>Descriptor Length:
$descriptor_length //"
. "Private data specifier: $private_data_specifier<br>";
}
function service_move_descriptor(int $countpointer, int $programNumber){
global $transportstreamid;
global $id;
global $db;
if(!$id){
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
$descriptor_length=leerN(8);
$new_original_network_id = leerN(16);
$new_transport_stream_id = leerN(16);
$new_service_id = leerN(16);
$query1 = "Select distinct pointer from servicemovedescriptor";
$result1 = mysqli_query($id,$query1);
$i=0;
$list = array();
while($row1 = mysqli_fetch_assoc($result1)){
$list[$i]=$row1['pointer'];
$i++;
}
if(!in_array($countpointer, $list)){
$stmt = mysqli_prepare($id, "INSERT INTO servicemovedescriptor
values (?, ?, ?, ?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt,'iiiiiii',$countpointer,$transportstreamid,$p
rogramNumber, $descriptor_length, $new_original_network_id,
$new_transport_stream_id, $new_service_id);
$result = mysqli_execute($stmt);
if(!$result){
echo "Fallo al ejecutar la consulta: (" . mysqli_error($id) .
" 938) " ;
die("Error: no se pudo realizar la consulta.");
}
mysqli_stmt_free_result($stmt);
}
echo "SERVICE MOVE DESCRIPTOR: <br>Descriptor Length:
$descriptor_length //"
. "New original network id: $new_original_network_id //"
. "New transport stream id: $new_transport_stream_id //"
. "New service id: $new_service_id<br>";
}
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
112
function scrambling_descriptor(int $countpointer, int $programNumber){
global $transportstreamid;
global $id;
global $db;
if(!$id){
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
$descriptor_length = leerN(8);
$scrambling_mode = leerN(8);
$query1 = "Select distinct pointer from scramblingdescriptor";
$result1 = mysqli_query($id,$query1);
$i=0;
$list = array();
while($row1 = mysqli_fetch_assoc($result1)){
$list[$i]=$row1['pointer'];
$i++;
}
if(!in_array($countpointer, $list)){
$stmt = mysqli_prepare($id, "INSERT INTO scramblingdescriptor
values (?, ?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt,'iiiii',$countpointer,$transportstreamid,$pro
gramNumber, $descriptor_length, $scrambling_mode);
$result = mysqli_execute($stmt);
if(!$result){
echo "Fallo al ejecutar la consulta: (" . mysqli_error($id) .
" 938) " ;
die("Error: no se pudo realizar la consulta.");
}
mysqli_stmt_free_result($stmt);
}
echo "SCRAMBLING DESCRIPTOR: <br>Descriptor Length: $descriptor_length
//"
. "Scrambling mode: $scrambling_mode<br>";
}
function data_broadcast_id_descriptor(int $countpointer, int
$programNumber){
global $transportstreamid;
global $id;
global $db;
if(!$id){
die("Error: No se pudo conectar");
}
if(!$db){
die("Error: No existe la base de datos.");
}
$descriptor_length=leerN(8);
$data_broadcast_id = leerN(16);
for ($i=0;$i<$descriptor_length;$i++){
$id_selector_byte = leerN(8);
$query1 = "Select distinct pointer from
databroadcastiddescriptor";
$result1 = mysqli_query($id,$query1);
$n=0;
$list = array();
while($row1 = mysqli_fetch_assoc($result1)){
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
113
$list[$n]=$row1['pointer'];
$n++;
}
if(!in_array($countpointer, $list)){
$stmt = mysqli_prepare($id, "INSERT INTO
databroadcastiddescriptor values (?, ?, ?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt,'iiiiii',$countpointer,$transportstreamid,$pr
ogramNumber, $descriptor_length, $data_broadcast_id, $id_selector_byte);
$result = mysqli_execute($stmt);
if(!$result){
echo "Fallo al ejecutar la consulta: (" .
mysqli_error($id) . " 938) " ;
die("Error: no se pudo realizar la consulta.");
}
}
mysqli_stmt_free_result($stmt);
echo "DATA BROADCAST ID DESCRIPTOR: <br>Descriptor Length:
$descriptor_length //"
. "Data Broadcast Id: $data_broadcast_id //"
. "Id selector byte: $id_selector_byte<br>";
}
}
function padding8(string $value){
$val = decbin($value);
$data= str_pad($val, 8, "0", STR_PAD_LEFT);
return $data;
}
function paddingN(string $value, int $n){
$val = decbin($value);
$data= str_pad($val, $n, "0", STR_PAD_LEFT);
return $data;
}
function arraytobin(string $value){
$out='';
for ($i=0; $i<strlen($value);$i++){
$out .= padding8(ord(substr($value, $i, 1)));
}
return $out;
}
?>
</body>
</html>
2. Index.php
<html>
<head>
<meta charset="utf-8">
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
114
<meta name="viewport" content="width=device-width, initial-
scale=1.0">
<link rel="icon" href="ujalogo.jpg" type="image/x-icon"/>
<title> Herramienta de análisis de un Transport Stream DVB-
T</title>
<link rel="stylesheet" type="text/css"
href="semantic/dist/semantic.min.css">
<link href="style.css" rel="stylesheet" type="text/css"/>
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<link rel="stylesheet" type="text/css" href="https://aula.iesoretania.es/theme/yui_combo.php?rollup/3.17.2/yui-moodlesimple-min.css" />
<script id="firstthemesheet" type="text/css"></script>
<link rel="stylesheet" type="text/css" href="https://aula.iesoretania.es/theme/styles.php/boost/1578900641_1578900773/all" />
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<script src="semantic/dist/semantic.min.js"></script>
</head>
<body >
<?php
include './config.php';
$id = mysqli_connect(Config::$servername, Config::$username,
Config::$password);
if(!$id){
die("Error: No se pudo conectar");
}
if(!mysqli_select_db($id,Config::$database)){
die("Error: No existe la base de datos.");
}
?>
<div>
<header id="page-header" class="row">
<div class="col-12 pt-3 pb-3">
<div class="cardheader">
<div class="card-body">
<div class="d-flex">
<div class="mr-auto">
<div class="page-content-header">
<div class="page-header-headings">
<h1 style="padding-left:0px"> Página
Principal </h1>
</div>
</div>
</div>
</div>
<div class="d-flex flex-wrap">
<div id="page-navbar">
<nav role="navigation" aria-label="Barra de
navegación">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a href="index.php"> Página
Principal </a>
</li>
</ol>
</nav>
</div>
</div>
</div>
</div>
</div>
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
115
</header>
</div>
<div>
<h1 align="center" style="padding:1rem; margin:1rem;"> Listado de
Transport Streams </h1>
</div>
<?php
$query="select distinct Name, Id from transportstream";
$result = mysqli_query($id, $query);
if(!$result){
die("Error: no se pudo realizar la consulta.");
}
echo '<div class="container2 style="width:0;" align="center">';
echo '<div class="card" style="background-color:white" align="center">';
echo '<form class="showpat" action="showSDT.php" method="get" >';
echo '<table align="center" border="0" style="letter-spacing: 1px;">';
while($row = mysqli_fetch_assoc($result)){
echo '<tr>';
echo '<td style="border: 0px solid rgb(190, 190, 190);padding:
10px;">' . $row['Name'] . '</td>';
echo'<td><button type="submit" class="styled2" name="Id" value="' .
$row['Id'] . '" style="margin-left: 3rem></td>';
echo '<td style="border: 0px solid rgb(190, 190, 190);padding:
10px;">Seleccionar</td>';
echo '</tr>';
}
echo '</table>';
echo '</form>';
echo '</div></div>';
mysqli_free_result($result);
mysqli_close($id);
?>
<div class="containeradmin">
<form action="checklogin.php" method="get">
<div class="card flex" align="center" style="background-
color:white">
<div class="flex " style="margin: 1rem; ">
<br>
<label for="username" style="left: 0">Usuario:</label>
<input type="text" style="border-radius: 5px;"
placeholder="Ingresar Usuario" id="username" name="username">
</div>
<div class="flex" style="margin: 1rem; ">
<br>
<label for="pass">Password :</label>
<input type="password" style="border-radius: 5px;"
placeholder="Ingresa tu contraseña" id="pass" name="password" required>
</div>
<div >
<button type="submit"class="input">Entrar</button>
</div>
<br>
</div>
</form>
</div>
</body>
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
116
</html>
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
117
3. ShowSDT.php
<html>
<head>
<meta charset="utf-8">
<link rel="icon" href="ujalogo.jpg" type="image/x-icon"/>
<title> Lista de Programas</title>
<link rel="stylesheet" type="text/css"
href="semantic/dist/semantic.min.css">
<link href="style.css" rel="stylesheet" type="text/css"/>
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<link rel="stylesheet" type="text/css" href="https://aula.iesoretania.es/theme/yui_combo.php?rollup/3.17.2/yui-moodlesimple-min.css" />
<script id="firstthemesheet" type="text/css"></script>
<link rel="stylesheet" type="text/css" href="https://aula.iesoretania.es/theme/styles.php/boost/1578900641_1578900773/all" />
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<script src="semantic/dist/semantic.min.js"></script>
</head>
<body>
<div>
<header id="page-header" class="row">
<div class="col-12 pt-3 pb-3">
<div class="cardheader">
<div class="card-body">
<div class="d-flex">
<div class="mr-auto">
<div class="page-content-header">
<div class="page-header-headings">
<h1> Lista de programas </h1>
</div>
<form action="index.php" method="get">
<div>
<div>
<button type="submit"
class="return"><i class="material-icons">home</i></button>
</div>
</div>
</form>
</div>
</div>
</div>
<div class="d-flex flex-wrap">
<div id="page-navbar">
<nav role="navigation" aria-label="Barra de
navegación">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a href="index.php"> Página
Principal </a>
</li>
<li class="breadcrumb-item">
<a > Lista de programas</a>
</li>
</ol>
</nav>
</div>
</div>
</div>
</div>
</div>
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
118
</header>
</div>
<?php
include './config.php';
$id = mysqli_connect(Config::$servername, Config::$username,
Config::$password);
if(!$id){
die("Error: No se pudo conectar");
}
if(!mysqli_select_db($id,Config::$database)){
die("Error: No existe la base de datos.");
}
$query="select distinct Service_id, service_provider_name, service_name
from sdt where transportstream= '".$_GET['Id']."' and service_id<1016";
$result = mysqli_query($id, $query);
if(!$result){
die("Error: no se pudo realizar la consulta.");
}
$query2="select distinct service_provider_name from sdt where
transportstream= '".$_GET['Id']."' ";
$result2 = mysqli_query($id, $query2);
if(!$result2){
die("Error: no se pudo realizar la consulta.");
}
$row2 = mysqli_fetch_assoc($result2);
$serviceprovidername = $row2['service_provider_name'];
echo '<div class="container2 " style="margin-top:0; padding-top:0;">';
echo '<form action="showProgram.php" method="get" >';
echo '<h1 align="center" style="padding:1rem; margin:1rem;"> Lista de
programas de ' . $serviceprovidername . '</h1>';
echo '<div class="cardsdt flex" style="padding:1rem; margin:1rem; align-
content:center;" >';
echo '<br><br><table class="showprogram" border="0">';
while($row = mysqli_fetch_assoc($result)){
echo '<tr>';
echo '<td style="border: 0px ;padding: 10px;"><input type="submit"
class="favorite styled" name="ProgramId" value="' . $row['Service_id'] .
'" style="padding: 0.5rem; "></td>';
echo '<td style="border: 0px ;padding: 10px;">' . $row['service_name']
. '</td>';
echo '</tr>';
}
echo '</table><br><br></div></form></div>';
mysqli_free_result($result);
mysqli_close($id);
?>
</body>
</html>
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
119
4. ShowProgram.php
<html>
<head>
<meta charset="utf-8">
<link rel="icon" href="ujalogo.jpg" type="image/x-icon"/>
<title> Lista de componentes</title>
<link rel="stylesheet" type="text/css"
href="semantic/dist/semantic.min.css">
<link href="style.css" rel="stylesheet" type="text/css"/>
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<link rel="stylesheet" type="text/css" href="https://aula.iesoretania.es/theme/yui_combo.php?rollup/3.17.2/yui-moodlesimple-min.css" />
<script id="firstthemesheet" type="text/css"></script>
<link rel="stylesheet" type="text/css" href="https://aula.iesoretania.es/theme/styles.php/boost/1578900641_1578900773/all" />
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<script src="semantic/dist/semantic.min.js"></script>
</head>
<body >
<?php
include './config.php';
$id = mysqli_connect(Config::$servername, Config::$username,
Config::$password);
if(!$id){
die("Error: No se pudo conectar");
}
if(!mysqli_select_db($id,Config::$database)){
die("Error: No existe la base de datos.");
}
$programid= $_GET['ProgramId'] ;
$sdtid = 0;
$stmt = mysqli_prepare($id,"select TransportStream from sdt where
service_id = ?");
mysqli_stmt_bind_param($stmt,'i',$programid);
$resultstmt = mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $sdtid);
mysqli_stmt_fetch($stmt);
if(!$resultstmt){
echo "Fallo al ejecutar la consulta: (" . mysqli_error($id) .
") " ;
die("Error: no se pudo realizar la consulta.");
}
mysqli_stmt_free_result($stmt);
?>
<div>
<header id="page-header" class="row">
<div class="col-12 pt-3 pb-3">
<div class="cardheader">
<div class="card-body">
<div class="d-flex">
<div class="mr-auto">
<div class="page-content-header">
<div class="page-header-headings">
<h1> Lista de componentes </h1>
</div>
<form action="index.php" method="get">
<div>
<div>
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
120
<button type="submit"
class="return"><i class="material-icons">home</i></button>
</div>
</div>
</form>
</div>
</div>
</div>
<div class="d-flex flex-wrap">
<div id="page-navbar">
<nav role="navigation" aria-label="Barra de
navegación">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a href="index.php"> Página
Principal </a>
</li>
<li class="breadcrumb-item">
<?php echo '<a
href="showSDT.php?Id='. $sdtid .'"> Lista de programas</a>'; ?>
</li>
<li class="breadcrumb-item">
<a> Lista de componentes</a>
</li>
</ol>
</nav>
</div>
</div>
</div>
</div>
</div>
</header>
</div>
<?php
echo '<div><h1 align="center" style="padding:2rem; margin:2rem;"> Listado
de componentes del programa ' . $programid . ' </h1></div>';
$stmtprograms = mysqli_prepare($id,"select programnumber,
descriptor_tag_hex, Pointer, pcr_pid, stream_type, description from (
select distinct a.programnumber,
a.descriptor_tag_hex,
a.Pointer,
a.pcr_pid,
case a.stream_type when 0 then 'Contenido reservado ITU-T | ISO/IEC'
when 1 then 'Vídeo ISO/IEC 11172'
when 2 then 'Vídeo ITU-T Rec. H.262 |ISO/IEC 13818-2 o Secuencia
de vídeo ISO/IEX 11172-2'
when 3 then 'Audio ISO/IEC 11172'
when 4 then 'Audio ISO/IEC 13818-3'
when 5 then 'Sección privada ITU-T Rec. H.222.0 | ISO/IEC 13818-1'
when 6 then 'Paquetes PES con contenido privado ITU-T Rec. H.222.0
| ISO/IEC 13818-1'
when 7 then 'MHEG ISO/IEC 13522'
when 8 then 'DSM-CC ITU-T Rec. H.222.0 | ISO/IEC 13818-1'
when 9 then 'ITU-T Rec. H.222.1'
when 10 then 'ISO/IEC 13818-6 tipo A'
when 11 then 'ISO/IEC 13818-6 tipo B'
when 12 then 'ISO/IEC 13818-6 tipo C'
when 13 then 'ISO/IEC 13818-6 tipo D'
when 14 then 'Datos auxiliares ITU-T Rec. H.222.0 | ISO/IEC 13818-
1'
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
121
when 15 then 'Audio con sintaxis de transporte ADTS ISO/IEC 13818-
7'
when 16 then 'Visual ISO/IEC 14496-2'
when 17 then 'Audio con sintaxis de transporte LATM definida en
ISO/IEC 14496-3 / AMD 1'
when 18 then 'Secuencia de paquetes SL ISO/IEC 14496-1 o
secuencias FlexMux transportadas en paquetes PES'
when 19 then 'Secuencia de paquetes SL ISO/IEC 14496-1 o
secuencias FlexMux transportadas secciones ISO/IEC 14496_'
when 20 then 'Protocolo de descarga sincronizada ISO/IEC 13818-6'
end as stream_type,
b.description
from pmt a
inner join bealltables b
on a.descriptor_tag_hex=b.value
where type='descriptor' and a.programnumber=?
union
select distinct c.programnumber,
c.descriptor_tag_hex,
c.Pointer,
c.pcr_pid,
case c.stream_type when 0 then 'Contenido reservado ITU-T | ISO/IEC'
when 1 then 'Vídeo ISO/IEC 11172'
when 2 then 'Vídeo ITU-T Rec. H.262 |ISO/IEC 13818-2 o Secuencia
de vídeo ISO/IEX 11172-2'
when 3 then 'Audio ISO/IEC 11172'
when 4 then 'Audio ISO/IEC 13818-3'
when 5 then 'Sección privada ITU-T Rec. H.222.0 | ISO/IEC 13818-1'
when 6 then 'Paquetes PES con contenido privado ITU-T Rec. H.222.0
| ISO/IEC 13818-1'
when 7 then 'MHEG ISO/IEC 13522'
when 8 then 'DSM-CC ITU-T Rec. H.222.0 | ISO/IEC 13818-1'
when 9 then 'ITU-T Rec. H.222.1'
when 10 then 'ISO/IEC 13818-6 tipo A'
when 11 then 'ISO/IEC 13818-6 tipo B'
when 12 then 'ISO/IEC 13818-6 tipo C'
when 13 then 'ISO/IEC 13818-6 tipo D'
when 14 then 'Datos auxiliares ITU-T Rec. H.222.0 | ISO/IEC 13818-
1'
when 15 then 'Audio con sintaxis de transporte ADTS ISO/IEC 13818-
7'
when 16 then 'Visual ISO/IEC 14496-2'
when 17 then 'Audio con sintaxis de transporte LATM definida en
ISO/IEC 14496-3 / AMD 1'
when 18 then 'Secuencia de paquetes SL ISO/IEC 14496-1 o
secuencias FlexMux transportadas en paquetes PES'
when 19 then 'Secuencia de paquetes SL ISO/IEC 14496-1 o
secuencias FlexMux transportadas secciones ISO/IEC 14496_'
when 20 then 'Protocolo de descarga sincronizada ISO/IEC 13818-6'
end as stream_type,
d.description
from pmt c
left OUTER join bealltables d
on c.descriptor_tag_hex=d.value
where programnumber=? order by Pointer) as a");
mysqli_stmt_bind_param($stmtprograms, 'ii', $programid, $programid);
$resultprograms = mysqli_stmt_execute($stmtprograms);
mysqli_stmt_bind_result($stmtprograms, $programnumber,
$descriptor_tag_hex, $pointer, $pcr_pid, $stream_type, $description);
echo '<div class="cardprograms" >';
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
122
echo '<table align="center" border="0" style="letter-spacing: 1px;">';
echo '<thead>'
. '<tr>
<th>Descriptor tag</th>
<th> Description </th>
<th> Pointer </th>
<th>PCR_PID</th>
<th>Stream type </th>
</td>
</thead>';
while(mysqli_stmt_fetch($stmtprograms)){
echo '<tr>';
echo '<td style="border: 0px solid rgb(190, 190, 190);padding:
10px;">' . $descriptor_tag_hex . '</td>';
echo '<td style="border: 0px solid rgb(190, 190, 190);padding:
10px;">' . $description . '</td>';
echo '<td style="border: 0px solid rgb(190, 190, 190);padding:
10px;">' . $pointer . '</td>';
echo '<td style="border: 0px solid rgb(190, 190, 190);padding:
10px;">' . $pcr_pid . '</td>';
echo '<td style="border: 0px solid rgb(190, 190, 190);padding:
10px;">' . $stream_type . '</td>';
echo '</tr>';
}
if(!$resultprograms){
echo "Fallo al ejecutar la consulta: (" . mysqli_error($id) . ") "
;
die("Error: no se pudo realizar la consulta.");
}
mysqli_stmt_free_result($stmtprograms);
echo '</table></div>';
mysqli_close($id);
?>
</body>
</html>
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
123
5. Panel-control.php
<?php
session_start();
if(isset($_SESSION['loggedin']) && $_SESSION['loggedin']==true){
}else{
echo "Inicia sesión para acceder a este contenido. <br>";
echo "<br><a href='index.php'>Login</a>";
header('Location: http://localhost/proyecto/index.php');
exit;
}
$now = time();
if($now > $_SESSION['expire']){
session_destroy();
header('Location: http://localhost/proyecto/index.php');
echo "Tu sesión ha expirado,"
. "<a href='index.php'> Inicia Sesión </a>";
exit;
}
?>
<!DOCTYPE html>
<html lang="es">
<head>
<title>Página de administración de Trasport Stream</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-
scale=1">
<link rel="icon" href="ujalogo.jpg" type="image/x-icon"/>
<link rel="stylesheet" type="text/css"
href="semantic/dist/semantic.min.css">
<link href="style.css" rel="stylesheet" type="text/css"/>
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<link rel="stylesheet" type="text/css" href="https://aula.iesoretania.es/theme/yui_combo.php?rollup/3.17.2/yui-moodlesimple-min.css" />
<script id="firstthemesheet" type="text/css"></script>
<link rel="stylesheet" type="text/css" href="https://aula.iesoretania.es/theme/styles.php/boost/1578900641_1578900773/all" />
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<script src="semantic/dist/semantic.min.js"></script>
<style type="text/css">
a:link{
text-decoration: none;
}
</style>
</head>
<body>
<div>
<header id="page-header" class="row">
<div class="col-12 pt-3 pb-3">
<div class="cardheader">
<div class="card-body">
<div class="d-flex">
<div class="mr-auto">
<div class="page-content-header">
<div>
<form action="index.php"
method="get">
<div>
<div>
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
124
<button type="submit"
class="return" ><i class="material-icons">home</i></button>
</div>
</div>
</form>
<form action="logout.php"
method="get">
<div>
<div>
<button type="submit"
class="logout" ><i class="material-icons">cancel</i></button>
</div>
</div>
</form>
</div>
<div class="page-header-headings">
<h1> Página de administración de
Transport Stream </h1>
</div>
</div>
</div>
</div>
<div class="d-flex flex-wrap">
<div id="page-navbar">
<nav role="navigation" aria-label="Barra
de navegación">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a href="index.php"> Página
Principal </a>
</li>
<li class="breadcrumb-item">
<a> Página de administración
de Transport Stream </a>
</li>
</ol>
</nav>
</div>
</div>
</div>
</div>
</div>
</header>
</div>
<?php
include './config.php';
ini_set('upload_max_filesize', '500M');
ini_set('post_max_size', '500M');
ini_set('max_input_time', 80000);
ini_set('max_execution_time', 80000);
$id = mysqli_connect(Config::$servername, Config::$username,
Config::$password);
if(!$id){
die("Error: No se pudo conectar");
}
if(!mysqli_select_db($id,Config::$database)){
die("Error: No existe la base de datos.");
}
$query="select * from transportstream";
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
125
$result = mysqli_query($id, $query);
if(!$result){
die("Error: no se pudo realizar la consulta.");
}
echo '<div class="container2" style="margin:2rem; padding: 2rem;">';
echo '<form action="select.php" method="get">'
. '<div class="card3" align="center">';
echo '<h2 align="center" style="padding:2rem; margin:2rem;">Seleccionar
Transport Stream a modificar</h2>';
echo '<table align="center" border="0" style="letter-spacing: 1px;">';
while($row = mysqli_fetch_assoc($result)){
echo '<tr>';
echo '<td style="border: 0px solid rgb(190, 190, 190);padding:
10px;">' . $row['Name'] . '</td>';
echo'<td><button type="submit" class="styled2" name="select" value="'
. $row['Id'] . '" style="margin-left: 3rem></td>';
echo '<td style="border: 0px solid rgb(190, 190, 190);padding:
10px;">Seleccionar</td>';
echo '</tr>';
}
mysqli_free_result($result);
echo '</table><br><br></div></form></div>';
mysqli_close($id);
?>
<div class="container2">
<div class="card3" align="center">
<h2 align="center" style="padding:2rem;
margin:2rem;">Insertar un Transport Stream</h2>
<form action="InsertFile.php" method="post"
enctype="multipart/form-data" style="padding: 2rem;margin: 2rem;">
<input type="file" id="file" name="file" >
<button type="submit" class="styledinput"
name="insert" value="insert">Insertar</button>
</form>
</div>
</div>
</body>
</html>
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
126
6. Checklogin.php
<html> <head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-
scale=1.0">
<title> TransportStreams</title>
<link rel="stylesheet" type="text/css"
href="semantic/dist/semantic.css">
<link href="style.css" rel="stylesheet" type="text/css"/>
<script src="https://code.jquery.com/jquery-
3.1.1.min.js"></script>
<script src="semantic/dist/semantic.js"></script>
</head>
<body>
<?php
session_start();
?>
<?php
include './config.php';
$id = mysqli_connect(Config::$servername, Config::$username,
Config::$password);
if(!$id){
die("Error: No se pudo conectar");
}
if(!mysqli_select_db($id,Config::$database)){
die("Error: No existe la base de datos." . mysqli_error($id));
}
$username = $_GET['username'];
$password = $_GET['password'];
$sql = "SELECT * FROM admin WHERE username = '$username'";
$result = mysqli_query($id, $sql);
if(mysqli_num_rows($result)>0){}
$row = mysqli_fetch_array($result);
if($password == $row['password']){
$_SESSION['loggedin']=true;
$_SESSION['username']=$username;
$_SESSION['start']=time();
$_SESSION['expire']= $_SESSION['start'] + (5*60);
echo "Bienvenido! " . $_GET['username'];
echo '<br><br><a href=panel-control.php>Panel de control </a>';
header('Location: http://localhost/proyecto/panel-control.php');
//redirecciona a la páfina del usuario
}else{
echo "Username o Password incorrectos.";
echo "<br><a href='index.php'> Volver a intentarlo </a>";
}
mysqli_close($id);
?>
</body>
</html>
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
127
7. Logout.php
<?php
session_start();
unset ($SESSION['username']);
session_destroy();
header('Location: http://localhost/proyecto/index.php');
?>
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
128
8. Select.php
<html>
<head>
<meta charset="utf-8">
<link rel="icon" href="ujalogo.jpg" type="image/x-icon"/>
<meta name="viewport" content="width=device-width, initial-
scale=1">
<link rel="stylesheet" type="text/css"
href="semantic/dist/semantic.min.css">
<link href="style.css" rel="stylesheet" type="text/css"/>
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<link rel="stylesheet" type="text/css" href="https://aula.iesoretania.es/theme/yui_combo.php?rollup/3.17.2/yui-moodlesimple-min.css" />
<script id="firstthemesheet" type="text/css"></script>
<link rel="stylesheet" type="text/css" href="https://aula.iesoretania.es/theme/styles.php/boost/1578900641_1578900773/all" />
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<script src="semantic/dist/semantic.min.js"></script>
<style type="text/css">
a:link{
text-decoration: none;
}
</style>
<title>Administración de Transport Stream</title>
</head>
<body>
<?php
session_start();
if(isset($_SESSION['loggedin']) && $_SESSION['loggedin']==true){
}else{
echo "Inicia sesión para acceder a este contenido. <br>";
echo "<br><a href='index.php'>Login</a>";
header('Location: http://localhost/proyecto/index.php');
exit;
}
$now = time();
if($now > $_SESSION['expire']){
session_destroy();
header('Location: http://localhost/proyecto/index.php');
echo "Tu sesión ha expirado,"
. "<a href='index.php'> Inicia Sesión </a>";
exit;
}
?>
<?php
include './config.php';
$id = mysqli_connect(Config::$servername, Config::$username,
Config::$password);
if(!$id){
die("Error: No se pudo conectar");
}
if(!mysqli_select_db($id,Config::$database)){
die("Error: No existe la base de datos.");
}
$idts = $_GET['select'];
?>
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
129
<div>
<header id="page-header" class="row">
<div class="col-12 pt-3 pb-3">
<div class="cardheader">
<div class="card-body">
<div class="d-flex">
<div class="mr-auto">
<div class="page-content-header">
<div>
<form action="index.php" method="get">
<div>
<div>
<button type="submit"
class="return"><i class="material-icons">home</i></button>
</div>
</div>
</form>
<form action="logout.php"
method="get">
<div>
<div>
<button type="submit"
class="logout" ><i class="material-icons">cancel</i></button>
</div>
</div>
</form>
</div>
<div class="page-header-headings">
<h1> Administración de Transport
Stream </h1>
</div>
</div>
</div>
</div>
<div class="d-flex flex-wrap">
<div id="page-navbar">
<nav role="navigation" aria-label="Barra de
navegación">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a href="index.php"> Página
Principal </a>
</li>
<li class="breadcrumb-item">
<a href="panel-control.php">
Página de administración de Transport Stream </a>
</li>
<li class="breadcrumb-item">
<a> Administración Transport
Stream </a>
</li>
</ol>
</nav>
</div>
</div>
</div>
</div>
</div>
</header>
</div>
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
130
<?php
$stmt = mysqli_prepare($id,"select * from transportstream where Id = ?");
mysqli_stmt_bind_param($stmt,'i',$idts);
$resultstmt = mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $transportstreamname, $transportstreamid,
$description);
mysqli_stmt_fetch($stmt);
if(!$resultstmt){
echo "Fallo al ejecutar la consulta: (" . mysqli_error($id) . ") " ;
die("Error: no se pudo realizar la consulta.");
}
mysqli_stmt_free_result($stmt);
echo '<div class="container2 " style="margin:2rem; padding: 2rem;">'
. '<div class="card3" align="center">'
. '<h2 align="center" style="padding:2rem;
margin:2rem;">Administración del Transport Stream ' . $transportstreamname
. '</h2>';
$stmtmodify = mysqli_prepare($id,"select description from transportstream
where Id = ?");
mysqli_stmt_bind_param($stmtmodify, 'i', $transportstreamid);
$resultmodify = mysqli_stmt_execute($stmtmodify);
mysqli_stmt_bind_result($stmtmodify, $descriptionoriginal);
mysqli_stmt_fetch($stmtmodify);
if(!$resultmodify){
echo "Fallo al ejecutar la consulta: (" . mysqli_error($id) . ") " ;
die("Error: no se pudo realizar la consulta.");
}
mysqli_stmt_free_result($stmtmodify);
?>
<div>
<div class="flexdescription " style="justify-content:flex-
start;align-items: center;">
<label for="description" style="margin-right: 0.5rem;"
>Descripción:</label>
<?php echo '<form action="deletemodify.php" method="get">'
.'<input type="text" style="border-radius: 5px;"
id="description" name="description" value="'.$descriptionoriginal.'">';?>
</div>
</div>
<?php echo '</div>';?>
<br>
<div class ="flexdescription" style="justify-content: center;" >
<div>
<?php echo '<form action="deletemodify.php" method="get">'
. '<button type="submit" class="styledinput" style="background-
color:green;" name="modify" value="' . $transportstreamid . '">Guardar'
. '</button>'
. '</form>';?>
</div>
<div>
<?php echo'<button type="submit" class="styledinput" name="delete"
value="' . $transportstreamid . '">'
. '<a
href="deletemodify.php?delete='.$transportstreamid.'" style="color:
white">Eliminar</a>'
. '</button>';?>
</div>
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
131
<div>
<button type="submit" class="styledinput" style="background-color:
red;"><a href="panel-control.php" style="color:
white">Cancelar</a></button>
</div>
</div>
<?php
mysqli_close($id);
?>
</body>
</html>
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
132
9. Deletemodify.php
<html>
<head>
<meta charset="utf-8">
<link rel="icon" href="ujalogo.jpg" type="image/x-icon"/>
<meta name="viewport" content="width=device-width, initial-
scale=1">
<link rel="stylesheet" type="text/css"
href="semantic/dist/semantic.min.css">
<link href="style.css" rel="stylesheet" type="text/css"/>
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<link rel="stylesheet" type="text/css" href="https://aula.iesoretania.es/theme/yui_combo.php?rollup/3.17.2/yui-moodlesimple-min.css" />
<script id="firstthemesheet" type="text/css"></script>
<link rel="stylesheet" type="text/css" href="https://aula.iesoretania.es/theme/styles.php/boost/1578900641_1578900773/all" />
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<script src="semantic/dist/semantic.min.js"></script>
<style type="text/css">
a:link{
text-decoration: none;
}
</style>
<title> Administración de Transport Stream</title>
</head>
<body>
<?php
session_start();
if(isset($_SESSION['loggedin']) && $_SESSION['loggedin']==true){
}else{
echo "Inicia sesión para acceder a este contenido. <br>";
echo "<br><a href='index.php'>Login</a>";
header('Location: http://localhost/proyecto/index.php');
exit;
}
$now = time();
if($now > $_SESSION['expire']){
session_destroy();
header('Location: http://localhost/proyecto/index.php');
echo "Tu sesión ha expirado,"
. "<a href='index.php'> Inicia Sesión </a>";
exit;
}
?>
<?php
include './config.php';
$id = mysqli_connect(Config::$servername, Config::$username,
Config::$password);
if(!$id){
die("Error: No se pudo conectar");
}
if(!mysqli_select_db($id,Config::$database)){
die("Error: No existe la base de datos.");
}
if(isset($_GET['delete'])){
$iddelete = $_GET['delete'];
?>
<div>
<header id="page-header" class="row">
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
133
<div class="col-12 pt-3 pb-3">
<div class="cardheader">
<div class="card-body">
<div class="d-flex">
<div class="mr-auto">
<div class="page-content-header">
<div class="page-header-headings">
<h1> Administración de Transport
Stream </h1>
</div>
<form action="index.php" method="get">
<div>
<div>
<button type="submit"
class="return"><i class="material-icons">home</i></button>
</div>
</div>
</form>
</div>
</div>
</div>
<div class="d-flex flex-wrap">
<div id="page-navbar">
<nav role="navigation" aria-label="Barra de
navegación">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a href="index.php"> Página
Principal </a>
</li>
<li class="breadcrumb-item">
<a href="panel-control.php">
Página de administración de Transport Stream </a>
</li>
<li class="breadcrumb-item">
<?php echo '<a
href="select.php?select='. $iddelete.' "> Administración Transport Stream
</a>'; ?>
</li>
<li class="breadcrumb-item">
<a> Eliminar Transport Stream
</a>
</li>
</ol>
</nav>
</div>
</div>
</div>
</div>
</div>
</header>
</div>
<?php
$stmtdelete = mysqli_prepare($id,"DELETE FROM transportstream where Id
= ?");
mysqli_stmt_bind_param($stmtdelete, 'i', $iddelete);
$resultdelete = mysqli_stmt_execute($stmtdelete);
if(!$resultdelete){
echo "Fallo al ejecutar la consulta: (" . mysqli_error($id) . ") "
;
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
134
die("Error: no se pudo realizar la consulta.");
}
mysqli_stmt_free_result($stmtdelete);
echo '<div>'
. '<p> Se han eliminado correctamente los datos del registro con id:
"'. $iddelete . '"</p>'
. '</div>';
}else if(isset($_GET['modify'])){
$idmodify = $_GET['modify'];
?>
<div>
<header id="page-header" class="row">
<div class="col-12 pt-3 pb-3">
<div class="cardheader">
<div class="card-body">
<div class="d-flex">
<div class="mr-auto">
<div class="page-content-header">
<div class="page-header-headings">
<h1> Administración de Transport
Stream </h1>
</div>
<form action="index.php" method="get">
<div>
<div>
<button type="submit"
class="return"><i class="material-icons">home</i></button>
</div>
</div>
</form>
</div>
</div>
</div>
<div class="d-flex flex-wrap">
<div id="page-navbar">
<nav role="navigation" aria-label="Barra de
navegación">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a href="index.php"> Página
Principal </a>
</li>
<li class="breadcrumb-item">
<a href="panel-control.php">
Página de administración de Transport Stream </a>
</li>
<li class="breadcrumb-item">
<?php echo '<a
href="select.php?select='. $idmodify.' "> Administración Transport Stream
</a>'; ?>
</li>
<li class="breadcrumb-item">
<a> Modificar Transport Stream
</a>
</li>
</ol>
</nav>
</div>
</div>
</div>
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
135
</div>
</div>
</header>
</div>
<?php
$description = $_GET['description'];
$stmtmodify = mysqli_prepare($id,"update transportstream set
description = ? where Id = ?");
mysqli_stmt_bind_param($stmtmodify, 'si', $description,$idmodify);
$resultmodify = mysqli_stmt_execute($stmtmodify);
if(!$resultmodify){
echo "Fallo al ejecutar la consulta: (" . mysqli_error($id) . ") "
;
die("Error: no se pudo realizar la consulta.");
}
echo '<div class="container">'
. '<p> Se han modificado correctamente la descripción del registro con
id: "'. $idmodify . '"</p>'
. '</div>';
}
?>
</body>
</html>
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
136
10. Pid.php
<?php
class Pid {
const PAT = 0x0000;
const CAT = 0x0001;
const TSDT = 0x0002;
const NIT_ST = 0x0010;
const SDT_BAT_ST = 0x0011;
const EIT_ST_CIT = 0x0012;
const RST_ST = 0x0013;
const TDT_TOT_ST = 0x0014;
const NETWORK_SYNC = 0x0015;
const RNT = 0x0016;
const INBAND_SIG = 0x001c;
const MEASUREMENT = 0x001d;
const DIT = 0x001e;
const SIT = 0x001f;
const NULL_PACKET = 0x1fff;
public function __construct(int $value) {
$this->value = $value;
}
}
?>
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
137
11. InsertFile.php
<html>
<head>
<meta charset="utf-8">
<link rel="icon" href="ujalogo.jpg" type="image/x-icon"/>
<title> Service Description Table</title>
<link rel="stylesheet" type="text/css"
href="semantic/dist/semantic.min.css">
<link rel="stylesheet"
href="https://fonts.googleapis.com/icon?family=Material+Icons">
<script
src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script src="semantic/dist/semantic.min.js"></script>
</head>
<body>
<?php
ini_set('upload_max_filesize', '500M');
ini_set('post_max_size', '500M');
ini_set('max_input_time', 80000);
ini_set('max_execution_time', 80000);
var_dump($_POST);
var_dump($_FILES);
if(isset($_POST["insert"])){
$file = $_FILES['file'];
$dir_subida = './media/';
// get details of the uploaded file
$fileTmpPath = $_FILES['file']['tmp_name'];
$fileName = $_FILES['file']['name'];
$fileSize = $_FILES['file']['size'];
$fileType = $_FILES['file']['type'];
$fileNameCmps = explode(".", $fileName);
$fileExtension = strtolower(end($fileNameCmps));
echo "Nombre del archivo: ";
print_r($fileName);
echo "<br> Nombre de fichero temporal: ";
print_r($fileTmpPath);
echo "<br> Tamaño del archivo: ";
print_r($fileSize);
echo "<br> Tipo de archivo: ";
print_r($fileType);
echo "<br> <br>";
$newFileName = $fileName;
$allowedfileExtensions = array('ts');
if (in_array($fileExtension, $allowedfileExtensions)) {
$dest_path = $dir_subida . $newFileName;
if (isset($_POST['button'])){
$tsname = $fileName;
echo $tsname . '<br>';
}
if(move_uploaded_file($fileTmpPath, $dest_path)){
$message ='File is successfully uploaded.';
header("Location: transportstreamparser.php?file=$newFileName
");
}else{
$message = 'There was some error moving the file to upload
directory. Please make sure the upload directory is writable by web
server.';
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
138
echo $message . '<br>';
}
}else{
echo "Extensión incorrecta. ";
echo '<br><br><a href=panel-control.php>Panel de control </a>';
header('Location: http://localhost/proyecto/panel-control.php');
}
}
?>
<div style="margin:2rem; padding: 2rem;">
<form action="index.php" method="get">
<div>
<div>
<button type="submit" class="return"><i
class="material-icons">home</i></button>
</div>
</div>
</form>
</div>
</body>
</html>
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
139
12. Config.php
<?php
class Config {
static $servername = "localhost";
static $username = "agumarmi";
static $database = "dvbmpeg";
static $password = "";
public function __construct(int $value) {
$this->value = $value;
}
}
?>
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
140
ANEXO B. ACCESO A LA BASE DE DATOS
Para poder visualizar el contenido que se ha almacenado en la base de datos creada
una vez se ha analizado el Transport Stream se debe seguir las siguientes pautas:
• Tener instalado WAMPServer e iniciar los servicios.
Figura B.0.1. Estado de WAMPServer
• Acceder a phpMyAdmin, bien seleccionando ‘phpMyAdmin’ en la figura B.1.
o introduciendo en la barra de navegación del navegador la siguiente ruta:
http://localhost/phpmyadmin/
Figura B.0.2. Página de acceso a phpMyAdmin
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
141
• Se introducen las credenciales por defecto para entrar como:
o Administrador:
▪ Usuario: root
▪ Contraseña:’’
o Usuario con acceso de lectura, eliminación e inserción:
▪ Usuario: admin
▪ Contraseña: admin
o Usuario para la conexión con PHP:
▪ Usuario: agumarmi
▪ Contraseña: ‘’
• Una vez se accede a la Página Principal de phpMyAdmin, se selecciona la
base de datos dvbmpeg y podremos acceder al contenido del Transport
Stream analizado.
Figura B.0.3. Vista general de la base de datos dvbmpeg
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
142
ANEXO C. TABLA DE ISO/IEC 8859-1. ALFABETO LATINO N.1
0 1 2 3 4 5 6 7 8 9 A B C D E F
0 NUL SOH STX ETX EOT ENQ ACK BEL BS HT NL VT NP CR SO SI
1 DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US
2 SP ! " # $ % & ’ ( ) * + , - . /
3 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
4 @ A B C D E F G H I J K L M N O
5 P Q R S T U V W X Y Z [ / ] ^ _
6 ˋ a b c d e f g h i j k l m n o
7 p q r s t u v w x y z { | } ~ DEL
8
9
A NBS ¡ ¢ £ ¤ ¥ - § ¨ © » Ç Â - ® ‾
B ° • ¸ ´ ¶ • ¸ ¶ ° È ° ¿
C À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï
D Ã Ñ Ò Ó Ô Õ Ö ° Ø Ù Ú Û Ü Å Ê ß
E à á â ã ä å æ ç è é ê ë ì í î ï
F ñ ò ó ô õ ö Ö ø ù ú û ü Æ Ê ÿ
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
143
BIBLIOGRAFÍA
[1] Wikipedia, «Televisión Digital Terrestre en España,» [En línea]. Available:
https://es.wikipedia.org/wiki/Televisi%C3%B3n_digital_terrestre_en_Espa%C3%B1a.
[2] Wikipedia, «Historia de la Televisión,» [En línea]. Available:
https://es.wikipedia.org/wiki/Historia_de_la_televisi%C3%B3n.
[3] «¿Qué es un iconoscopio?,» [En línea]. Available:
https://soloesciencia.com/2017/12/19/que-es-un-iconoscopio/.
[4] «Entrelazado / Progresivo, Vídeo,» [En línea]. Available:
http://www.zonadvd.com/modules.php?name=Encyclopedia&op=content&tid=36 .
[5] M. d. Educación, «MEDIA- Televisión,» [En línea]. Available:
http://recursos.cnice.mec.es/media/television/bloque2/pag2.html#.
[6] ISO/IEC, «ISO/IEC 13818-1. Information technology - Generic coding of moving
pictures and associated audio information: Systems,» ISO/IEC 2000, 2000.
[7] ETSI, «ETSI EN 300 468 v1.15.1. Digital Video Briadcasting (DVB):
Specification for Service Information (SI) un DVB Systems,» ETSI, 2016.
[8] ITU, «H.262 : Information technology - Generic coding of moving pictures and
associated audio information: Video,» ITU, 2012.
[9] ISO/IEC, «ISO/IEC 13818-2: Information technology — Generic coding of
moving pictures and associated audio information — Part 2: Video,» 2013.
[10] ISO/IEC, «ISO/IEC 11172-2: Information technology — Coding of moving
pictures and associated audio for digital storage media at up to about 1,5 Mbit/s — Part
2: Video,» 1993.
[11] U.-E. ISO/IEC, «Tecnología de la información. Codificación genérica de
imágenes animadas y de la información sonora asociada. Parte 3: Audio. (ISO/IEC
13818-3:1995),» 1996.
Herramienta de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
144
[12] ISO/IEC, «ISO/IEC: 11172-3:1993: Information technology — Coding of moving
pictures and associated audio for digital storage media at up to about 1,5 Mbit/s — Part
3: Audio».
[13] ITU, «H.222.0 : Tecnología de la información - Codificación genérica de
imágenes en movimiento e información de audio asociada: Sistemas,» 2018.
[14] ISO/IEC, «ISO/IEC 13818-6: Information technology- Generic coding of moving
pictures and associated audio information. Extensions for DSM-CC,» ISO/IEC, 1998.
[15] I. JTC, «ISO/IEC JTC 1/SC 29: Coding of audio, picture, multimedia and
hypermedia information,» 1991.
[16] ISO, «ISO 639-2:1998: Codes for the representation of names of languages —
Part 2: Alpha-3 code».
[17] ISO/IEC, «ISO/IEC 8859-1: Information technology — 8-bit single-byte coded
graphic character sets — Part 1: Latin alphabet No. 1,» 1998.
[18] ISO/IEC, «ISO/IEC 14496-2: Information technology - Coding of audio-visual
objects -Part 2: Visual,» 2004.
[19] ISO/IEC, «ISO/IEC 14496-3: Information technology — Coding of audio-visual
objects — Part 3: Audio,» 2019.
[20] ISO/IEC, «ISO/IEC 14496-1: Information technology — Coding of audio-visual
objects — Part 1: Systems,» 2010.
[21] ISO/IEC, «ISO/IEC 8859-1: Information technology — 8-bit single-byte coded
graphic character sets — Part 1: Latin alphabet No. 1,» 1998.
[22] ISO/IEC, «ISO/IEC 8859-9: Information technology — 8-bit single-byte coded
graphic character sets — Part 9: Latin alphabet No. 5,» 1999.
[23] U. d. Jaén, «Identidad Corporativa,» [En línea]. Available:
https://www.ujaen.es/gobierno/viccom/proyeccion-institucional/identidad-
corporativa/identidad-corporativa.
Escu
ela
Po
lité
cn
ica
Su
pe
rio
r d
e L
ina
res
MANUAL DE INSTALACIÓN PARA
EL USO DE HERRAMIENTA DE
ANÁLISIS DE UN TRANSPORT
STREAM DVB-T
ESCUELA POLITÉCNICA
SUPERIOR DE LINARES
HERRAMIENTA DE ANÁLISIS DE
UN TRANSPORT STREAM DVB-T
Alumno: Mireya Aguilera Martos
Febrero, 2020
UNIVERSIDAD DE JAÉN
Escuela Politécnica Superior de Linares
Trabajo Fin de Grado
Manual de instalación para el uso de Manual de instalación para el uso de
Herramienta de Análisis de un transport Stream DVB-T | Mireya Aguilera Martos
2
Índice de contenido
1. PASOS ........................................................................................................ 3
1.1. Iniciar la aplicación WampServer ............................................................. 3
1.2. Añadir carpeta de proyecto a WampServer .............................................. 3
1.3. Acceso a la aplicación .............................................................................. 3
Manual de instalación para el uso de Manual de instalación para el uso de
Herramienta de Análisis de un transport Stream DVB-T | Mireya Aguilera Martos
3
1. PASOS
Para poder hacer uso de la Herramienta de Análisis de Transport Stream DVB-T es
necesario seguir una serie de pautas:
1.1. Iniciar la aplicación WampServer
Basta con ejecutar la aplicación instalada en el equipo e iniciar los servicios.
En el caso de que no estuviera instalada la aplicación, se deberá descargar e
instalar de la página web http://www.wampserver.com/en/ en el apartado de descargas,
https://sourceforge.net/projects/wampserver/files/WampServer%203/WampServer%203.0
.0/wampserver3.2.0_x64.exe/download
1.2. Añadir carpeta de proyecto a WampServer
Para poder acceder a la ejecución de la aplicación, se deberá descomprimir el
contenido del TransportStreamAnalyser.zip en la carpeta donde se haya instalado
WampServer y en la subcarpeta www.
1.3. Acceso a la aplicación
Una vez se haya descomprimido el archivo, accediendo a la página web
http://localhost/proyecto/index.php, será posible ejecutar la Herramienta de Análisis de
TransportStream.
Escu
ela
Po
lité
cn
ica
Su
pe
rio
r d
e L
ina
res
MANUAL DE USUARIO PARA EL
USO DE HERRAMIENTA DE
ANÁLISIS DE UN TRANSPORT
STREAM DVB-T
ESCUELA POLITÉCNICA
SUPERIOR DE LINARES
HERRAMIENTA DE ANÁLISIS DE
UN TRANSPORT STREAM DVB-T
Alumno: Mireya Aguilera Martos
Febrero, 2020
UNIVERSIDAD DE JAÉN
Escuela Politécnica Superior de Linares
Trabajo Fin de Grado
Manual de usuario para el uso de Manual de usuario para el uso de Herramienta
de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
2
Índice de contenido
1. Página principal ......................................................................................... 3
2. Lista de programas .................................................................................... 4
3. Lista de componentes ............................................................................... 5
4. Página de administración ......................................................................... 6
5. Administración de Transport Stream ....................................................... 7
Manual de usuario para el uso de Manual de usuario para el uso de Herramienta
de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
3
1. Página principal
La página principal, http://localhost/proyecto/index.php, estará compuesta por una
barra de navegación superior que indicará en todo momento la situación actual y el
recorrido seguido, pudiendo volver hacia atrás en cualquier momento manteniendo los
parámetros de consulta.
Además, también se visualiza una tarjeta con los nombres de los Transport Stream
que se encuentran analizados en la base de datos y de cuyo contenido se puede disponer.
Al final de la página, se visualiza una tarjeta que dará acceso a la página de
administración, donde el usuario podrá ser capaz de insertar un nuevo fichero a analizar,
modificar un parámetro del Transport Stream o eliminar.
Figura 1.1. Página principal
Manual de usuario para el uso de Manual de usuario para el uso de Herramienta
de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
4
2. Lista de programas
Pulsando sobre cualquier Transport Stream, se accede a la lista de programas que
se encuentran en él.
En esta ventana, http://localhost/proyecto/showSDT.php?Id=1, se le introduce
como parámetro de entrada el identificador único del Transport Stream que existe en la
base de datos. Y se mostrará una tarjeta con un identificador de programa, obtenido de la
PAT, y el nombre del servicio, obtenido de la SDT.
Figura 2.1. Lista de programas de un Transport Stream
Manual de usuario para el uso de Manual de usuario para el uso de Herramienta
de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
5
3. Lista de componentes
Accediendo a un programa del Transport Stream analizado,
http://localhost/proyecto/showProgram.php?ProgramId=410 , se obtendrá una lista con los
diferentes descriptores que se han capturado durante el análisis.
Figura 3.1. Lista de componentes de un programa
Manual de usuario para el uso de Manual de usuario para el uso de Herramienta
de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
6
4. Página de administración
Introduciendo las credenciales correctas en la página principal, se accede a la
página de administración, http://localhost/proyecto/panel-control.php, donde aparecen dos
tarjetas, una de ellas con el listado de Transport Streams analizados, y una tarjeta para
poder insertar un fichero de formato .ts que, una vez comprobado que el formato es el
correcto, redirigirá a la página de la herramienta de análisis del Transport Stream,
http://localhost/proyecto/transportstreamparser.php?file=mireya5.ts.
Figura 4.1. Página de administración
Manual de usuario para el uso de Manual de usuario para el uso de Herramienta
de Análisis de Transport Stream DVB-T | Mireya Aguilera Martos
7
5. Administración de Transport Stream
Una vez se ha seleccionado el Transport Stream que se desea modificar, nos
aparece en la ventana, http://localhost/proyecto/select.php?select=1, una tarjeta con el
parámetro que tiene actualmente el Transport Stream habilitado para modificar, en este
caso, la descripción.
Como previamente se ha dicho, en esta ventana se puede guardar una nueva
descripción en la base de datos, eliminar el Transport Stream o cancelar y volver a la página
de administración.
Figura 5.1. Administración de Transport Stream