OSDN Git Service

bfeaeda3175fc9d37ee7b8c4b367870a86f23014
[rec10/rec10-git.git] / epgdump / psi.c
1 // -*- tab-width:4 -*-
2
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6
7 #include "psi.h"
8
9 int parsePAThead(unsigned char *data, PAThead *path) {
10         int boff = 0;
11
12         memset(path, 0, sizeof(PAThead));
13
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);
25
26         return 8;
27 }
28
29 int parsePATbody(unsigned char *data, PATbody *patb) {
30         int boff = 0;
31
32         memset(patb, 0, sizeof(PATbody));
33
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);
38         }
39         else {
40                 patb->program_map_PID = getBit(data, &boff, 13);
41         }
42
43         return 4;
44 }
45
46 void dumpPAT(unsigned char *ptr, SECcache *secs, int count, int *pmtpids)
47 {
48         int len = 0;
49         int loop_len = 0;
50         int i;
51
52         PAThead path;
53         PATbody patb;
54
55         /* PAT */
56         len = parsePAThead(ptr, &path);
57         ptr += len;
58
59         // printf("PAT=()\n");
60
61         loop_len = path.section_length;
62         while ( loop_len > 0 ) {
63                 len = parsePATbody(ptr, &patb);
64                 ptr += len;
65                 loop_len -= len;
66
67                 if ( patb.program_number != 0 ) {
68                         for ( i = 1; i < count; i++ ) {
69                                 if ( secs[i].pid == patb.program_map_PID ) {
70                                         break;
71                                 }
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;
75                                         break;
76                                 }
77                         }
78                         for ( i = 0; i < count; i++ ) {
79                                 if ( pmtpids[i] == patb.program_map_PID ) {
80                                         break;
81                                 }
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;
85                                         break;
86                                 }
87                         }
88                 }
89         }
90
91         return;
92 }
93
94 int parsePMThead(unsigned char *data, PMThead *pmth) {
95         int boff = 0;
96
97         memset(pmth, 0, sizeof(PMThead));
98
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);
114
115         return 12;
116 }
117
118 int parsePMTbody(unsigned char *data, PMTbody *pmtb) {
119         int boff = 0;
120
121         memset(pmtb, 0, sizeof(PMTbody));
122
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);
128
129         return 5;
130 }
131
132 void dumpPMT(unsigned char *ptr, SECcache *secs, int count, int *dsmccpids)
133 {
134         int len = 0;
135         int loop_len = 0;
136         int desc_len = 0;
137         int i;
138
139         PMThead pmth;
140         PMTbody pmtb;
141
142         /* PMT */
143         len = parsePMThead(ptr, &pmth);
144         ptr += len;
145 /*
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);
151 */
152         loop_len = pmth.program_info_length;
153         while ( loop_len > 0 ) {
154                 len = parseOTHERdesc(ptr);
155                 ptr += len;
156                 loop_len -= len;
157         }
158
159         loop_len = pmth.section_length - pmth.program_info_length - 13;// 9はヘッダ長 4はCRC
160         while ( loop_len > 0 ) {
161                 len = parsePMTbody(ptr, &pmtb);
162                 ptr += len;
163                 loop_len -= len;
164 /*
165                 printf("PMTb=(0x%x:%d:%d)\n", 
166                         pmtb.stream_type , pmtb.elementary_PID , pmtb.ES_info_length);
167 */
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 ) {
171                                         break;
172                                 }
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;
176                                         break;
177                                 }
178                         }
179                         for ( i = 0; i < count; i++ ) {
180                                 if ( dsmccpids[i] == pmtb.elementary_PID ) {
181                                         break;
182                                 }
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;
186                                         break;
187                                 }
188                         }
189                 }
190
191                 desc_len = pmtb.ES_info_length;
192                 loop_len -= desc_len;
193
194                 while ( desc_len > 0 ) {
195                         len = parseOTHERdesc(ptr);
196                         ptr += len;
197                         desc_len -= len;
198                 }
199         }
200
201         return;
202 }
203