12 int parseDSMCChead(unsigned char *data, DSMCChead *dsmh) {
15 memset(dsmh, 0, sizeof(DSMCChead));
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);
32 int parseDSMCCbodyDII(unsigned char *data, DSMCCbodyDII *dsmbdii) {
34 DSMCCbodyDIIModule *module;
36 memset(dsmbdii, 0, sizeof(DSMCCbodyDII));
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);
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);
59 see http://www.atsc.org/cms/standards/a_90-with-att.pdf
61 compatibilityDescriptorLength 16
63 for(i=0;i<descriptorCount;i++) {
71 for(j=0;j<subDescriptorCount;j++) {
75 for(k=0;k<subDescriptorLength;k++) {
76 additionalInformation 8
80 boff += dsmbdii->compatibilityDescriptor * 8;
81 dsmbdii->numberOfModules = getBit(data, &boff, 16);
83 if ( dsmbdii->numberOfModules > 0 ) {
84 dsmbdii->modules = calloc(1, sizeof(DSMCCbodyDIIModule) * dsmbdii->numberOfModules);
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);
96 dsmbdii->privateDataLength = getBit(data, &boff, 8);
97 dsmbdii->privateData = allocCopy(data, &boff, dsmbdii->privateDataLength);
102 int parseDSMCCbodyDDB(unsigned char *data, DSMCCbodyDDB *dsmbddb) {
105 memset(dsmbddb, 0, sizeof(DSMCCbodyDDB));
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);
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);
129 void dumpDSMCC(unsigned char *ptr, STATION *station, int station_count)
132 DSMCCbodyDII dsmbdii;
133 DSMCCbodyDDB dsmbddb;
134 DSMCCbodyDIIModule *module;
141 len = parseDSMCChead(ptr, &dsmh);
143 //loop_len = dsmh.section_length - (len - 3 + 4); // 3は共通ヘッダ長 4はCRC
145 printf("DSMCChead=(%d:%d:%d:%d)\n",
146 dsmh.table_id, dsmh.section_length,
147 dsmh.table_id_extension, dsmh.section_number);
149 if ( dsmh.table_id == 0x3B ) {
150 len = parseDSMCCbodyDII(ptr, &dsmbdii);
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,
157 dsmbdii.downloadId , dsmbdii.blockSize , dsmbdii.compatibilityDescriptor ,
158 dsmbdii.numberOfModules);
160 for (i=0; i<dsmbdii.numberOfModules; i++) {
161 module = dsmbdii.modules + sizeof(DSMCCbodyDIIModule) * i;
163 if ( *module->moduleInfo == 0x01 ) {
164 printf("1 %d %s\n",module, module->moduleInfo + 2);
166 else if ( *module->moduleInfo == 0x02 ) {
167 printf("2 %s\n",module->moduleInfo + 2);
169 else if ( *module->moduleInfo == 0x03 ) {
170 printf("3 %s\n",module->moduleInfo);
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 ) {
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,
185 dsmbddb.moduleId , dsmbddb.moduleVersion , dsmbddb.blockNumber);