MPEG-TS PSI парсинг

Я пытаюсь построить разделы таблицы EIT, как указано в EN 300 468. Я успешно проанализировал пакеты в структурах данных (в Java) и могу получить доступ к полезной нагрузке каждого пакета.

Я не понимаю, как раздел таблицы разделен по пакетам, спецификация слегка запутанная / неопределенная. Каков процесс, если предположить, что можно отфильтровать поток пакетов TS по PID, чтобы построить такую ​​таблицу?

Я понимаю payload_unit_start_indicator будучи установленным, указывает, что первый байт поля полезной нагрузки является указателем на первый байт новой секции, является ли это смещением от начала полезной нагрузки?

Если, например, я получаю пакет TS и идентифицирую его как начало раздела, то должен ли я считывать байты в массив, определять длину раздела из заголовка и затем продолжать заполнять мой массив все большим количеством полезных нагрузок пакета TS одного и того же PID до bytesRead == sectionLength?

Спасибо за чтение, любой совет или помощь будет очень цениться!:)

2 ответа

Здесь вы можете визуализировать структуру транспортного пакета (TP).

Каков процесс, если предположить, что можно отфильтровать поток пакетов TS по PID, чтобы построить такую ​​таблицу?

Ну ты в значительной степени прибил это

Чтобы построить раздел из потока, вы должны накапливать TP из одного и того же PID. Как вы уже догадались payload_unit_start_indicator указывает на начало нового раздела. Однако это не смещение.

Тогда, как вы сказали, вы просто должны продолжать собирать полезные данные TP одного и того же PID до payloadBytesRead == sectionLength,

Transport Packets (188 bytes each):
---------------------------
|Header|     Payload1     |            TP1: payload_unit_start_indicator = 1
---------------------------
^
0x47 (Sync Byte)

---------------------------
|Header|     Payload2     |            TP2: payload_unit_start_indicator = 0
---------------------------

... 

Section (sectionLength):
---------------------------------------    ---------------------
|     Payload1     |     Payload2     | ...|      Payload N    |
---------------------------------------    ---------------------

Из спецификации en300 468:

Секции могут начинаться в начале полезной нагрузки пакета TS, но это не является обязательным требованием, поскольку начало первого раздела в полезной нагрузке пакета TS указывается полем pointer_field.

Таким образом, начало раздела на самом деле является смещением от полезной нагрузки:

uint8_t* section_start = payload + *payload + 1
Другие вопросы по тегам