libdvbpsi 源代码学习(二)

时间:2022-01-08 16:30:10

        刚开始学习MPEG-2 TS流解析时,看ISO/IEC13818-1的文档上面的PAT,PMT表:program_association_section()和TS_program_map_section()时,很容易就以为可以直接从188字节的TS packet中取数据填到各个字段中,网上也可以搜到这样类似的程序:

    

        这样在解析PAT和PMT表时往往也能得到正确的答案,这是因为PAT,PMT表数据量比较小的缘故。其实在TS流中还有一个重要的概念——section。文档中program_association_section()和TS_program_map_section()指的就是PAT section和PMT section。它们中都有一个字段:section_length,文档告诉我们这个字段值的是此字段之后section的字节数,除了EIT section的最大字节数是4096外,其他section最大字节数是1024字节。 而TS packet最大只有188字节,因此这里需要考虑section到packet的映射问题,基本上存在三种情况:

1、section对应一个packet

2、section太长,在几个连续的packet中

3、在一个packet的负载中结束上一个section之后马上开始了一个新的section。

这三种情况可以在libdvbpsi源码的void dvbpsi_PushPacket(dvbpsi_handle h_dvbpsi, uint8_t* p_data)函数中找到。明白了这三种情况,再对照函数的注释,应该就不难看懂这个函数了。