9 // 2-STD-B10v4_6.pdf p178 (190/399)
10 int parsePAThead(unsigned char *data, PAThead *path) {
13 memset(path, 0, sizeof(PAThead));
15 path->table_id = getBit(data, &boff, 8);
16 path->section_syntax_indicator = getBit(data, &boff, 1);
17 path->zero = getBit(data, &boff, 1);
18 path->reserved1 = getBit(data, &boff, 2);
19 path->section_length = getBit(data, &boff, 12);
20 path->transport_stream_id = getBit(data, &boff, 16);
21 path->reserved2 = getBit(data, &boff, 2);
22 path->version_number = getBit(data, &boff, 5);
23 path->current_next_indicator = getBit(data, &boff, 1);
24 path->section_number = getBit(data, &boff, 8);
25 path->last_section_number = getBit(data, &boff, 8);
30 int parsePATbody(unsigned char *data, PATbody *patb) {
33 memset(patb, 0, sizeof(PATbody));
35 patb->program_number = getBit(data, &boff, 16);
36 patb->reserved = getBit(data, &boff, 3);
37 if ( patb->program_number == 0 ) {
38 patb->network_PID = getBit(data, &boff, 13);
41 patb->program_map_PID = getBit(data, &boff, 13);
47 void dumpPAT(unsigned char *ptr, SECcache *secs, int count, int *pmtpids)
57 len = parsePAThead(ptr, &path);
60 // printf("PAT=()\n");
62 loop_len = path.section_length;
63 while ( loop_len > 0 ) {
64 len = parsePATbody(ptr, &patb);
68 if ( patb.program_number != 0 ) {
69 for ( i = 1; i < count; i++ ) {
70 if ( secs[i].pid == patb.program_map_PID ) {
73 if ( secs[i].pid == 0 ) {
74 // printf("PAT: Adding PID(0x%04x) to secs[%d]\n", patb.program_map_PID, i);
75 secs[i].pid = patb.program_map_PID;
79 for ( i = 0; i < count; i++ ) {
80 if ( pmtpids[i] == patb.program_map_PID ) {
83 if ( pmtpids[i] == 0 ) {
84 // printf("PAT: Adding PID(0x%04x) to pmtpids[%d]\n", patb.program_map_PID, i);
85 pmtpids[i] = patb.program_map_PID;
95 // 2-STD-B10v4_6.pdf p180 (192/399(
96 int parsePMThead(unsigned char *data, PMThead *pmth) {
99 memset(pmth, 0, sizeof(PMThead));
101 pmth->table_id = getBit(data, &boff, 8);
102 pmth->section_syntax_indicator = getBit(data, &boff, 1);
103 pmth->zero = getBit(data, &boff, 1);
104 pmth->reserved1 = getBit(data, &boff, 2);
105 pmth->section_length = getBit(data, &boff, 12);
106 pmth->program_number = getBit(data, &boff, 16);
107 pmth->reserved2 = getBit(data, &boff, 2);
108 pmth->version_number = getBit(data, &boff, 5);
109 pmth->current_next_indicator = getBit(data, &boff, 1);
110 pmth->section_number = getBit(data, &boff, 8);
111 pmth->last_section_number = getBit(data, &boff, 8);
112 pmth->reserved3 = getBit(data, &boff, 3);
113 pmth->PCR_PID = getBit(data, &boff, 13);
114 pmth->reserved4 = getBit(data, &boff, 4);
115 pmth->program_info_length = getBit(data, &boff, 12);
120 int parsePMTbody(unsigned char *data, PMTbody *pmtb) {
123 memset(pmtb, 0, sizeof(PMTbody));
125 pmtb->stream_type = getBit(data, &boff, 8);
126 pmtb->reserved1 = getBit(data, &boff, 3);
127 pmtb->elementary_PID = getBit(data, &boff, 13);
128 pmtb->reserved2 = getBit(data, &boff, 4);
129 pmtb->ES_info_length = getBit(data, &boff, 12);
134 void dumpPMT(unsigned char *ptr, SECcache *secs, int count, int *dsmccpids)
145 len = parsePMThead(ptr, &pmth);
148 printf("PMT=(%d:%d:%d:%d:%d:%d:%d:%d)\n",
149 pmth.table_id, pmth.section_length ,
150 pmth.program_number , pmth.version_number ,
151 pmth.section_number , pmth.last_section_number ,
152 pmth.PCR_PID , pmth.program_info_length);
154 loop_len = pmth.program_info_length;
155 while ( loop_len > 0 ) {
156 len = parseOTHERdesc(ptr);
161 loop_len = pmth.section_length - pmth.program_info_length - 13;// 9はヘッダ長 4はCRC
162 while ( loop_len > 0 ) {
163 len = parsePMTbody(ptr, &pmtb);
167 printf("PMTb=(0x%x:%d:%d)\n",
168 pmtb.stream_type , pmtb.elementary_PID , pmtb.ES_info_length);
170 // 2-STD-B24v5_4-3p3.pdf p11 (25/125)
171 if ( pmtb.stream_type == 0x0B || pmtb.stream_type == 0x0D ) {
172 for ( i = 1; i < count; i++ ) {
173 if ( secs[i].pid == pmtb.elementary_PID ) {
176 if ( secs[i].pid == 0 ) {
177 //printf("PMT: Adding PID(0x%04x) to secs[%d]\n", pmtb.elementary_PID, i);
178 secs[i].pid = pmtb.elementary_PID;
182 for ( i = 0; i < count; i++ ) {
183 if ( dsmccpids[i] == pmtb.elementary_PID ) {
186 if ( dsmccpids[i] == 0 ) {
187 //printf("PMT: Adding PID(0x%04x) to dsmccpids[%d]\n", pmtb.elementary_PID, i);
188 dsmccpids[i] = pmtb.elementary_PID;
194 desc_len = pmtb.ES_info_length;
195 loop_len -= desc_len;
197 while ( desc_len > 0 ) {
198 len = parseOTHERdesc(ptr);