任务四
根据解析PAT表的PMT_PID列表,获取所有的相关的PMT表,并且解析出包含的节目信息,主要是指音频和视频的pid。
相关知识
相信解码流解到这一步的人,对表的解析多多少少有一些了解,在这先放张PMT表的结构图,方便大家了解。PMT表示的是节目映射表的简称,可由PAT表查找到相应的PID,里面存储着音频、视频以及其他一些与节目相关的信息。解到这一步后,可以尝试着把音频视频的PID对应的ts_package找出来,并且另存一个文件,用播放器打开,可以看到对应的节目,会对解码流的任务有更深的理解,知道我们的目的是什么。
前八个字节就不用赘述了,descriptor对目前阶段来说,用处不大,也用不着管,知道它占多大空间就行了,我们要关注的字段有
program_info_length->后面描述子的总长度,stream_type前面的那个描述子
stream_type->媒体流的类型,判断是音频还是视频的重要标志
elementary_PID->媒体流类型对应的PID,可通过此PID找到对应的信息
ES_info_length->后续descriptor的长度
解析过程
这里的解析过程会比较麻烦,因为pmt的table有很多个,每解一个节目需要获取一遍table
1 流程图
2 数据结构定义
typedef struct stream_message
{
unsigned int stream_type :8;
unsigned int elementary_pid :13;
struct stream_message *next;
}STREAM_MESSAGE;
typedef struct pmt_info
{
unsigned short program_number;
STREAM_MESSAGE *stream_message;
struct pmt_info *next;
}PMT_INFO;
typedef int(*CHECK_TYPE)(STREAM_MESSAGE message_node);
3 解析代码
/*****************************************************************************
* Function Name: check_stream_type_callback
* Description : according the condition then get the specify message
* Parameters : STREAM_MESSAGE message_node
* Returns : static int
* -1 check error
* other check success
*****************************************************************************/
static int check_stream_type_callback(STREAM_MESSAGE message_node)
{
if (0x0b == message_node.stream_type)
{
return 3;
}
if (0x06 == message_node.stream_type)
{
return 2;
}
if ((0x03==message_node.stream_type