TS流解析之PAT表格解析
from: http://blog.csdn.net/xioahw/article/details/4093488
PAT表格定義如下:
typedef struct TS_PAT_Program
{
?unsigned program_number????:16;?//節(jié)目號
?unsigned program_map_PID???:13;?? //節(jié)目映射表的PID,節(jié)目號大于0時(shí)對應(yīng)的PID,每個(gè)節(jié)目對應(yīng)一個(gè)
}TS_PAT_Program;
//PAT表結(jié)構(gòu)體
typedef struct TS_PAT
{
??? unsigned table_id??????????????????????? : 8; //固定為0x00 ,標(biāo)志是該表是PAT
??? unsigned section_syntax_indicator??????? : 1; //段語法標(biāo)志位,固定為1
??? unsigned zero??????????????????????????? : 1; //0
??? unsigned reserved_1??????????????????????? : 2; // 保留位
??? unsigned section_length??????????????????? : 12; //表示這個(gè)字節(jié)后面有用的字節(jié)數(shù),包括CRC32
??? unsigned transport_stream_id??????????? : 16; //該傳輸流的ID,區(qū)別于一個(gè)網(wǎng)絡(luò)中其它多路復(fù)用的流
??? unsigned reserved_2??????????????????????? : 2;// 保留位
??? unsigned version_number??????????????????? : 5; //范圍0-31,表示PAT的版本號
??? unsigned current_next_indicator??????????? : 1; //發(fā)送的PAT是當(dāng)前有效還是下一個(gè)PAT有效
??? unsigned section_number??????????????????? : 8; //分段的號碼。PAT可能分為多段傳輸,第一段為00,以后每個(gè)分段加1,最多可能有256個(gè)分段
??? unsigned last_section_number??????????? : 8;? //最后一個(gè)分段的號碼
?
?std::vector<TS_PAT_Program> program;
??? unsigned reserved_3??????????????????????? : 3; // 保留位
??? unsigned network_PID??????????????????? : 13; //網(wǎng)絡(luò)信息表(NIT)的PID,節(jié)目號為0時(shí)對應(yīng)的PID為network_PID
??? unsigned CRC_32??????????????????????????? : 32;? //CRC32校驗(yàn)碼
} TS_PAT;
?
解析代碼如下:
HRESULT CTS_Stream_Parse::adjust_PAT_table( TS_PAT * packet, unsigned char * buffer)
{
??? packet->table_id??????????????????? = buffer[0];
??? packet->section_syntax_indicator??? = buffer[1] >> 7;
??? packet->zero??????????????????????? = buffer[1] >> 6 & 0x1;
??? packet->reserved_1??????????????????? = buffer[1] >> 4 & 0x3;
??? packet->section_length??????????????? = (buffer[1] & 0x0F) << 8 | buffer[2];
?
??? packet->transport_stream_id??????????? = buffer[3] << 8 | buffer[4];
?
??? packet->reserved_2??????????????????? = buffer[5] >> 6;
??? packet->version_number??????????????? = buffer[5] >> 1 &? 0x1F;
??? packet->current_next_indicator??????? = (buffer[5] << 7) >> 7;
??? packet->section_number??????????????? = buffer[6];
??? packet->last_section_number??????????? = buffer[7];
??? int len = 0;
??? len = 3 + packet->section_length;
??? packet->CRC_32??????????????????????? = (buffer[len-4] & 0x000000FF) << 24
??| (buffer[len-3] & 0x000000FF) << 16
??| (buffer[len-2] & 0x000000FF) << 8
??| (buffer[len-1] & 0x000000FF);
?
??
?int n = 0;
??? for ( n = 0; n < packet->section_length - 12; n += 4 )
??? {
??unsigned? program_num = buffer[8 + n ] << 8 | buffer[9 + n ];??
??????? packet->reserved_3??????????????? = buffer[10 + n ] >> 5;
??
??packet->network_PID = 0x00;
??if ( program_num == 0x00)
??{??
??????????? packet->network_PID = (buffer[10 + n ] & 0x1F) << 8 | buffer[11 + n ];
???TS_network_Pid = packet->network_PID; //記錄該TS流的網(wǎng)絡(luò)PID
???TRACE(" packet->network_PID %0x /n/n", packet->network_PID );
??}
??????? else
??????? {
???TS_PAT_Program PAT_program;
???PAT_program.program_map_PID = (buffer[10 + n] & 0x1F) << 8 | buffer[11 + n];
???PAT_program.program_number = program_num;
???packet->program.push_back( PAT_program );
???
???TS_program.push_back( PAT_program );//向全局PAT節(jié)目數(shù)組中添加PAT節(jié)目信息?????
??????? } ???????
??? }
?return 0;
}
因此,PAT數(shù)據(jù)解析結(jié)果如下:
PAT數(shù)據(jù)
table_id????:0x00????????????????????????????//8 ?
section_syntax_indicator???:0x01???????????// 1
'0'??????????????:0x00?????????????????????? // 1
reserved?????????????0x03????????????????// 2
section_length??????:0x00d????????????????????// 12
transport_stream_id????:0x0000???????????????? // 16
reserved????????????????????????:0x03????????// 2
version_number????????????:0x00??????????????// 5
current_next_indicator???:0x01???????????????// 1
section_number??????????????:0x00????????????// 8
last_section_number?????????:0x00??????????? // 8
program_number?????:0x0001??????????????????? // 16
??reserved????????????????:0x07?????????????? // 3
program_map_PID??????:0x03e8???????????? // 13
CRC???????? :0x f0 0b d7 79
由解析結(jié)構(gòu)可知,該P(yáng)AT表格中沒有網(wǎng)絡(luò)信息包信息,只包含一個(gè)節(jié)目,其PID為0x03e8
總結(jié)
以上是生活随笔為你收集整理的TS流解析之PAT表格解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redis集群(主从配置)
- 下一篇: TS流解析之PMT表格解析