Чтение информации из секции PAT (MPEG-TS)

Я пишу синтаксический анализатор файлов MPEG-TS, и я застрял на получении program_numbers и PID из раздела PAT. Я использую анализатор пакетов, чтобы сравнить свои результаты.

Например, вот пакет PAT

47 40 00 16 00 00 B0 31 00 14 D7 00 00 00 00 E0
10 00 01 E0 24 00 02 E0 25 00 03 E0 30 00 04 E0
31 00 1A E0 67 00 1C E0 6F 43 9D E3 F1 43 A3 E3
F7 43 AC E4 00 C3 69 A6 D8 FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF

Сначала я начал сравнивать результаты анализатора с байтами, чтобы увидеть связь. Это спарило байты следующим образом: [00 10] [01 24] [02 25] [03 30] и т. Д. Я заметил образец (для i = 14; i < конец; я + = 4) но это быстро обернулось ошибкой, потому что после байта «0x6F» он начал читать 16 бит, а не 8, поэтому номер_программы был 0x439D.

Я серьезно запутался и надеюсь, что кто-нибудь сможет объяснить мне, как разобрать пример PAT сверху.

3

Решение

каждый program_number 16 бит и сопровождается 16 битами, состоящими из 3 х ‘1’ бит и 13 бит program_map_pid (или же network_pid ifprogram_number` = 0)

Начните со смещения 13 в вашем дампе и прочитайте пары 16-битных слов, маскируя верхние 3 бита второго слова.

например

offset   bytes          words        program_number pid
======   ===========    =========    ============== ======================
000D:    00 00 E0 10 => 0000 E010 => 0000           0010 (network_pid)
0011:    00 01 E0 24 => 0001 E024 => 0001           0024 (program_map_pid)
0015:    00 02 E0 25 => 0002 E025 => 0002           0025 (program_map_pid)
0019:    etc..
001D:    etc..
0021:    etc..
0025:    00 1C E0 6F => 001C E06F => 001C           006F (program_map_pid)
0029:    43 9D E3 F1 => 439D E3F1 => 439D           03F1 (program_map_pid)
002D:    etc..
etc..

Теоретически это сложнее, чем это, поскольку в PAT может быть несколько разделов ассоциации программ, и вышеизложенное поможет только в первом разделе.

Для получения более подробной информации см. Раздел 2.4.4.3 ISO / IEC 13818-1, в частности таблицу 2-25.

5

Другие решения


По вопросам рекламы [email protected]