OSDN Git Service

commit local dev ver
[rec10/rec10-git.git] / epgdump / dsmcc.c
1 // -*- tab-width:4 -*-
2
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6
7 #include "dsmcc.h"
8 #include "ts_ctl.h"
9 #include "clt2png.h"
10
11 // STD-B21 p130 (144)
12 int parseDSMCChead(unsigned char *data, DSMCChead *dsmh) {
13         int boff = 0;
14
15         memset(dsmh, 0, sizeof(DSMCChead));
16
17         dsmh->table_id = getBit(data, &boff, 8);
18         dsmh->section_syntax_indicator = getBit(data, &boff, 1);
19         dsmh->complement_indicator = getBit(data, &boff,1);
20         dsmh->reserved1 = getBit(data, &boff, 2);
21         dsmh->section_length = getBit(data, &boff, 12);
22         dsmh->table_id_extension = getBit(data, &boff, 16);
23         dsmh->reserved2 = getBit(data, &boff, 2);
24         dsmh->version_number = getBit(data, &boff, 5);
25         dsmh->current_next_indicator = getBit(data, &boff, 1);
26         dsmh->section_number = getBit(data, &boff, 8);
27         dsmh->last_section_number = getBit(data, &boff, 8);
28
29         return 8;
30 }
31
32 int parseDSMCCbodyDII(unsigned char *data, DSMCCbodyDII *dsmbdii) {
33         int boff = 0, i;
34         DSMCCbodyDIIModule *module;
35
36         memset(dsmbdii, 0, sizeof(DSMCCbodyDII));
37
38         // header
39         dsmbdii->protocolDiscriminator = getBit(data, &boff, 8);
40         dsmbdii->dsmccType = getBit(data, &boff, 8);
41         dsmbdii->messageId = getBit(data, &boff, 16);
42         dsmbdii->transaction_id = getBit(data, &boff, 32);
43         dsmbdii->reserved = getBit(data, &boff, 8);
44         dsmbdii->adaptationLength = getBit(data, &boff, 8);
45         dsmbdii->messageLength = getBit(data, &boff, 16);
46         if ( dsmbdii->adaptationLength > 0 ) {
47                 dsmbdii->dsmccAdaptationHeader = allocCopy(data, &boff, dsmbdii->adaptationLength);
48         }
49
50         // body
51         dsmbdii->downloadId = getBit(data, &boff, 32);
52         dsmbdii->blockSize = getBit(data, &boff, 16);
53         dsmbdii->windowSize = getBit(data, &boff, 8);
54         dsmbdii->ackPeriod = getBit(data, &boff, 8);
55         dsmbdii->tCDownloadWindow = getBit(data, &boff, 32);
56         dsmbdii->tCDownloadScenario = getBit(data, &boff, 32);
57         dsmbdii->compatibilityDescriptor = getBit(data, &boff, 16);
58 /*
59         see http://www.atsc.org/cms/standards/a_90-with-att.pdf
60
61         compatibilityDescriptorLength   16
62         descriptorCount 16
63         for(i=0;i<descriptorCount;i++) {
64                 descriptorType          8
65                 descriptorLength        8
66                 specifierType           8
67                 specifierData           24
68                 model                           16
69                 version                         16
70                 subDescriptorCount      8
71                 for(j=0;j<subDescriptorCount;j++) {
72                         subDescriptor() {
73                                 subDescriptorType       8
74                                 subDescriptorLength     8
75                                 for(k=0;k<subDescriptorLength;k++) {
76                                         additionalInformation   8
77                 }
78         }
79 */
80         boff += dsmbdii->compatibilityDescriptor * 8;
81         dsmbdii->numberOfModules = getBit(data, &boff, 16);
82
83         if ( dsmbdii->numberOfModules > 0 ) {
84                 dsmbdii->modules = calloc(1, sizeof(DSMCCbodyDIIModule) * dsmbdii->numberOfModules);
85
86                 for (i=0; i<dsmbdii->numberOfModules; i++) {
87                         module = dsmbdii->modules + sizeof(DSMCCbodyDIIModule) * i;
88                         module->moduleId = getBit(data, &boff, 16);
89                         module->moduleSize = getBit(data, &boff, 32);
90                         module->moduleVersion = getBit(data, &boff, 8);
91                         module->moduleInfoLength = getBit(data, &boff, 8);
92                         module->moduleInfo = allocCopy(data, &boff, module->moduleInfoLength);
93                 }
94         }
95
96         dsmbdii->privateDataLength = getBit(data, &boff, 8);
97         dsmbdii->privateData = allocCopy(data, &boff, dsmbdii->privateDataLength);
98
99         return boff / 8;
100 }
101
102 int parseDSMCCbodyDDB(unsigned char *data, DSMCCbodyDDB *dsmbddb) {
103         int boff = 0;
104
105         memset(dsmbddb, 0, sizeof(DSMCCbodyDDB));
106
107         // header
108         dsmbddb->protocolDiscriminator = getBit(data, &boff, 8);
109         dsmbddb->dsmccType = getBit(data, &boff, 8);
110         dsmbddb->messageId = getBit(data, &boff, 16);
111         dsmbddb->downloadId = getBit(data, &boff, 32);
112         dsmbddb->reserved1 = getBit(data, &boff, 8);
113         dsmbddb->adaptationLength = getBit(data, &boff, 8);
114         dsmbddb->messageLength = getBit(data, &boff, 16);
115         if ( dsmbddb->adaptationLength > 0 ) {
116                 dsmbddb->dsmccAdaptationHeader = allocCopy(data, &boff, dsmbddb->adaptationLength);
117         }
118
119         // body
120         dsmbddb->moduleId = getBit(data, &boff, 16);
121         dsmbddb->moduleVersion = getBit(data, &boff, 8);
122         dsmbddb->reserved2 = getBit(data, &boff, 8);
123         dsmbddb->blockNumber = getBit(data, &boff, 16);
124         dsmbddb->blockData = allocCopy(data, &boff, dsmbddb->adaptationLength);
125
126         return boff / 8;
127 }
128
129 void dumpDSMCC(unsigned char *ptr, STATION *station, int station_count)
130 {
131         DSMCChead  dsmh;
132         DSMCCbodyDII  dsmbdii;
133         DSMCCbodyDDB  dsmbddb;
134         DSMCCbodyDIIModule *module;
135
136         int len = 0;
137         int loop_len = 0;
138         int i = 0;
139
140         /* DSMCC */
141         len = parseDSMCChead(ptr, &dsmh);
142         ptr += len;
143         //loop_len = dsmh.section_length - (len - 3 + 4); // 3は共通ヘッダ長 4はCRC
144 /*
145         printf("DSMCChead=(%d:%d:%d:%d)\n",
146                 dsmh.table_id, dsmh.section_length, 
147                 dsmh.table_id_extension, dsmh.section_number);
148 */
149         if ( dsmh.table_id == 0x3B ) {
150                 len = parseDSMCCbodyDII(ptr, &dsmbdii);
151 #if 1
152                 printf("DSMCCbDDI=(%d:%d:%d:%d:%d:%d) (%d:%d:%d:%d)\n",
153                         dsmbdii.protocolDiscriminator, dsmbdii.dsmccType, 
154                         dsmbdii.messageId, dsmbdii.transaction_id, 
155                         dsmbdii.adaptationLength, dsmbdii.messageLength, 
156
157                         dsmbdii.downloadId , dsmbdii.blockSize , dsmbdii.compatibilityDescriptor , 
158                         dsmbdii.numberOfModules);
159 #endif
160                 for (i=0; i<dsmbdii.numberOfModules; i++) {
161                         module = dsmbdii.modules + sizeof(DSMCCbodyDIIModule) * i;
162                         /*
163                         if ( *module->moduleInfo == 0x01 ) {
164                                 printf("1 %d %s\n",module, module->moduleInfo + 2);
165                         }
166                         else if ( *module->moduleInfo == 0x02 ) {
167                                 printf("2 %s\n",module->moduleInfo + 2);
168                         }
169                         else if ( *module->moduleInfo == 0x03 ) {
170                                 printf("3 %s\n",module->moduleInfo);
171                         }
172                         */
173                 }
174         }
175         else if ( dsmh.table_id == 0x3C ) {
176                 len = parseDSMCCbodyDDB(ptr, &dsmbddb);
177 //              if ( station[0].logo_download_data_id == dsmbddb.downloadId ) {
178 //              if ( 151585024 == dsmbddb.downloadId ) {
179 #if 1
180                         printf("DSMCCbDDB=(%d:%d:%d:%d:%d:%d) (%d:%d:%d)\n",
181                                 dsmbddb.protocolDiscriminator, dsmbddb.dsmccType, 
182                                 dsmbddb.messageId, dsmbddb.downloadId, 
183                                 dsmbddb.adaptationLength, dsmbddb.messageLength, 
184
185                                 dsmbddb.moduleId , dsmbddb.moduleVersion , dsmbddb.blockNumber);
186 #endif
187 //              }
188         }
189
190         return;
191 }
192