9 int parsePAThead(unsigned char *data, PAThead *path) {
12 memset(path, 0, sizeof(PAThead));
14 path->table_id = getBit(data, &boff, 8);
15 path->section_syntax_indicator = getBit(data, &boff, 1);
16 path->zero = getBit(data, &boff, 1);
17 path->reserved1 = getBit(data, &boff, 2);
18 path->section_length = getBit(data, &boff, 12);
19 path->transport_stream_id = getBit(data, &boff, 16);
20 path->reserved2 = getBit(data, &boff, 2);
21 path->version_number = getBit(data, &boff, 5);
22 path->current_next_indicator = getBit(data, &boff, 1);
23 path->section_number = getBit(data, &boff, 8);
24 path->last_section_number = getBit(data, &boff, 8);
29 int parsePATbody(unsigned char *data, PATbody *patb) {
32 memset(patb, 0, sizeof(PATbody));
34 patb->program_number = getBit(data, &boff, 16);
35 patb->reserved = getBit(data, &boff, 3);
36 if ( patb->program_number == 0 ) {
37 patb->network_PID = getBit(data, &boff, 13);
40 patb->program_map_PID = getBit(data, &boff, 13);
46 void dumpPAT(unsigned char *ptr, SECcache *secs, int count, int *pmtpids)
56 len = parsePAThead(ptr, &path);
59 // printf("PAT=()\n");
61 loop_len = path.section_length;
62 while ( loop_len > 0 ) {
63 len = parsePATbody(ptr, &patb);
67 if ( patb.program_number != 0 ) {
68 for ( i = 1; i < count; i++ ) {
69 if ( secs[i].pid == patb.program_map_PID ) {
72 if ( secs[i].pid == 0 ) {
73 // printf("PAT: Adding PID(0x%04x) to secs[%d]\n", patb.program_map_PID, i);
74 secs[i].pid = patb.program_map_PID;
78 for ( i = 0; i < count; i++ ) {
79 if ( pmtpids[i] == patb.program_map_PID ) {
82 if ( pmtpids[i] == 0 ) {
83 // printf("PAT: Adding PID(0x%04x) to pmtpids[%d]\n", patb.program_map_PID, i);
84 pmtpids[i] = patb.program_map_PID;
94 int parsePMThead(unsigned char *data, PMThead *pmth) {
97 memset(pmth, 0, sizeof(PMThead));
99 pmth->table_id = getBit(data, &boff, 8);
100 pmth->section_syntax_indicator = getBit(data, &boff, 1);
101 pmth->zero = getBit(data, &boff, 1);
102 pmth->reserved1 = getBit(data, &boff, 2);
103 pmth->section_length = getBit(data, &boff, 12);
104 pmth->program_number = getBit(data, &boff, 16);
105 pmth->reserved2 = getBit(data, &boff, 2);
106 pmth->version_number = getBit(data, &boff, 5);
107 pmth->current_next_indicator = getBit(data, &boff, 1);
108 pmth->section_number = getBit(data, &boff, 8);
109 pmth->last_section_number = getBit(data, &boff, 8);
110 pmth->reserved3 = getBit(data, &boff, 3);
111 pmth->PCR_PID = getBit(data, &boff, 13);
112 pmth->reserved4 = getBit(data, &boff, 4);
113 pmth->program_info_length = getBit(data, &boff, 12);
118 int parsePMTbody(unsigned char *data, PMTbody *pmtb) {
121 memset(pmtb, 0, sizeof(PMTbody));
123 pmtb->stream_type = getBit(data, &boff, 8);
124 pmtb->reserved1 = getBit(data, &boff, 3);
125 pmtb->elementary_PID = getBit(data, &boff, 13);
126 pmtb->reserved2 = getBit(data, &boff, 4);
127 pmtb->ES_info_length = getBit(data, &boff, 12);
132 void dumpPMT(unsigned char *ptr, SECcache *secs, int count, int *dsmccpids)
143 len = parsePMThead(ptr, &pmth);
146 printf("PMT=(%d:%d:%d:%d:%d:%d:%d:%d)\n",
147 pmth.table_id, pmth.section_length ,
148 pmth.program_number , pmth.version_number ,
149 pmth.section_number , pmth.last_section_number ,
150 pmth.PCR_PID , pmth.program_info_length);
152 loop_len = pmth.program_info_length;
153 while ( loop_len > 0 ) {
154 len = parseOTHERdesc(ptr);
159 loop_len = pmth.section_length - pmth.program_info_length - 13;// 9はヘッダ長 4はCRC
160 while ( loop_len > 0 ) {
161 len = parsePMTbody(ptr, &pmtb);
165 printf("PMTb=(0x%x:%d:%d)\n",
166 pmtb.stream_type , pmtb.elementary_PID , pmtb.ES_info_length);
168 if ( pmtb.stream_type == 0x0B || pmtb.stream_type == 0x0D ) {
169 for ( i = 1; i < count; i++ ) {
170 if ( secs[i].pid == pmtb.elementary_PID ) {
173 if ( secs[i].pid == 0 ) {
174 printf("PMT: Adding PID(0x%04x) to secs[%d]\n", pmtb.elementary_PID, i);
175 secs[i].pid = pmtb.elementary_PID;
179 for ( i = 0; i < count; i++ ) {
180 if ( dsmccpids[i] == pmtb.elementary_PID ) {
183 if ( dsmccpids[i] == 0 ) {
184 printf("PMT: Adding PID(0x%04x) to dsmccpids[%d]\n", pmtb.elementary_PID, i);
185 dsmccpids[i] = pmtb.elementary_PID;
191 desc_len = pmtb.ES_info_length;
192 loop_len -= desc_len;
194 while ( desc_len > 0 ) {
195 len = parseOTHERdesc(ptr);