OSDN Git Service

first implementation of restore
[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 // 2-STD-B10v4_6.pdf p178 (190/399)
10 int parsePAThead(unsigned char *data, PAThead *path) {
11         int boff = 0;
12
13         memset(path, 0, sizeof(PAThead));
14
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);
26
27         return 8;
28 }
29
30 int parsePATbody(unsigned char *data, PATbody *patb) {
31         int boff = 0;
32
33         memset(patb, 0, sizeof(PATbody));
34
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);
39         }
40         else {
41                 patb->program_map_PID = getBit(data, &boff, 13);
42         }
43
44         return 4;
45 }
46
47 void dumpPAT(unsigned char *ptr, SECcache *secs, int count, int *pmtpids)
48 {
49         int len = 0;
50         int loop_len = 0;
51         int i;
52
53         PAThead path;
54         PATbody patb;
55
56         /* PAT */
57         len = parsePAThead(ptr, &path);
58         ptr += len;
59
60         // printf("PAT=()\n");
61
62         loop_len = path.section_length;
63         while ( loop_len > 0 ) {
64                 len = parsePATbody(ptr, &patb);
65                 ptr += len;
66                 loop_len -= len;
67
68                 if ( patb.program_number != 0 ) {
69                         for ( i = 1; i < count; i++ ) {
70                                 if ( secs[i].pid == patb.program_map_PID ) {
71                                         break;
72                                 }
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;
76                                         break;
77                                 }
78                         }
79                         for ( i = 0; i < count; i++ ) {
80                                 if ( pmtpids[i] == patb.program_map_PID ) {
81                                         break;
82                                 }
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;
86                                         break;
87                                 }
88                         }
89                 }
90         }
91
92         return;
93 }
94
95 // 2-STD-B10v4_6.pdf p180 (192/399(
96 int parsePMThead(unsigned char *data, PMThead *pmth) {
97         int boff = 0;
98
99         memset(pmth, 0, sizeof(PMThead));
100
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);
116
117         return 12;
118 }
119
120 int parsePMTbody(unsigned char *data, PMTbody *pmtb) {
121         int boff = 0;
122
123         memset(pmtb, 0, sizeof(PMTbody));
124
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);
130
131         return 5;
132 }
133
134 void dumpPMT(unsigned char *ptr, SECcache *secs, int count, int *dsmccpids)
135 {
136         int len = 0;
137         int loop_len = 0;
138         int desc_len = 0;
139         int i;
140
141         PMThead pmth;
142         PMTbody pmtb;
143
144         /* PMT */
145         len = parsePMThead(ptr, &pmth);
146         ptr += len;
147 /*
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);
153 */
154         loop_len = pmth.program_info_length;
155         while ( loop_len > 0 ) {
156                 len = parseOTHERdesc(ptr);
157                 ptr += len;
158                 loop_len -= len;
159         }
160
161         loop_len = pmth.section_length - pmth.program_info_length - 13;// 9はヘッダ長 4はCRC
162         while ( loop_len > 0 ) {
163                 len = parsePMTbody(ptr, &pmtb);
164                 ptr += len;
165                 loop_len -= len;
166 /*
167                 printf("PMTb=(0x%x:%d:%d)\n", 
168                         pmtb.stream_type , pmtb.elementary_PID , pmtb.ES_info_length);
169 */
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 ) {
174                                         break;
175                                 }
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;
179                                         break;
180                                 }
181                         }
182                         for ( i = 0; i < count; i++ ) {
183                                 if ( dsmccpids[i] == pmtb.elementary_PID ) {
184                                         break;
185                                 }
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;
189                                         break;
190                                 }
191                         }
192                 }
193
194                 desc_len = pmtb.ES_info_length;
195                 loop_len -= desc_len;
196
197                 while ( desc_len > 0 ) {
198                         len = parseOTHERdesc(ptr);
199                         ptr += len;
200                         desc_len -= len;
201                 }
202         }
203
204         return;
205 }
206