OSDN Git Service

add bit parser
[rec10/rec10-git.git] / epgdump / dsmcc.c
index c521769..7924935 100644 (file)
@@ -9,6 +9,7 @@
 #include "clt2png.h"
 
 // STD-B21 p130 (144)
+// a_90-with-att.pdf p24 (29/99)
 int parseDSMCChead(unsigned char *data, DSMCChead *dsmh) {
        int boff = 0;
 
@@ -29,6 +30,8 @@ int parseDSMCChead(unsigned char *data, DSMCChead *dsmh) {
        return 8;
 }
 
+// a_90-with-att.pdf p29 (34/99)
+// 2-STD-B24v5_4-3p3.pdf p16 (30/125)
 int parseDSMCCbodyDII(unsigned char *data, DSMCCbodyDII *dsmbdii) {
        int boff = 0, i;
        DSMCCbodyDIIModule *module;
@@ -81,7 +84,7 @@ int parseDSMCCbodyDII(unsigned char *data, DSMCCbodyDII *dsmbdii) {
        dsmbdii->numberOfModules = getBit(data, &boff, 16);
 
        if ( dsmbdii->numberOfModules > 0 ) {
-               dsmbdii->modules = calloc(1, sizeof(DSMCCbodyDIIModule) * dsmbdii->numberOfModules);
+               dsmbdii->modules = calloc(1, sizeof(DSMCCbodyDIIModule) * dsmbdii->numberOfModules + 1000);
 
                for (i=0; i<dsmbdii->numberOfModules; i++) {
                        module = dsmbdii->modules + sizeof(DSMCCbodyDIIModule) * i;
@@ -89,7 +92,33 @@ int parseDSMCCbodyDII(unsigned char *data, DSMCCbodyDII *dsmbdii) {
                        module->moduleSize = getBit(data, &boff, 32);
                        module->moduleVersion = getBit(data, &boff, 8);
                        module->moduleInfoLength = getBit(data, &boff, 8);
-                       module->moduleInfo = allocCopy(data, &boff, module->moduleInfoLength);
+
+                       if ( *(data + boff / 8) == 0x01 ) {
+                               /* Type 記述子 モジュールの型(MIME 形式等) */
+                               module->descriptor_tag = getBit(data, &boff, 8);
+                               module->descriptor_length = getBit(data, &boff, 8);
+                               module->Type = allocCopy(data, &boff, module->descriptor_length + 1);
+                               module->Type[module->descriptor_length] = '\0';
+                               // +1 byte for null-terminated
+                       }
+                       else if ( *(data + boff / 8) == 0x02 ) {
+                               /* Name 記述子 モジュール名(ファイル名) */
+                               module->descriptor_tag = getBit(data, &boff, 8);
+                               module->descriptor_length = getBit(data, &boff, 8);
+                               module->Name = allocCopy(data, &boff, module->descriptor_length + 1);
+                               module->Name[module->descriptor_length] = '\0';
+                       }
+                       else if ( *(data + boff / 8) == 0x03 ) {
+                               /* Info 記述子 モジュール情報(文字型) */
+                               module->descriptor_tag = getBit(data, &boff, 8);
+                               module->descriptor_length = getBit(data, &boff, 8);
+                               boff += 24; // ISO_639_language_code
+                               module->Info = allocCopy(data, &boff, module->descriptor_length - 3 + 1);
+                               module->Info[module->descriptor_length] = '\0';
+                       }
+                       else {
+                               module->moduleInfo = allocCopy(data, &boff, module->moduleInfoLength);
+                       }
                }
        }
 
@@ -99,6 +128,7 @@ int parseDSMCCbodyDII(unsigned char *data, DSMCCbodyDII *dsmbdii) {
        return boff / 8;
 }
 
+// a_90-with-att.pdf p35 (40/99)
 int parseDSMCCbodyDDB(unsigned char *data, DSMCCbodyDDB *dsmbddb) {
        int boff = 0;
 
@@ -121,12 +151,12 @@ int parseDSMCCbodyDDB(unsigned char *data, DSMCCbodyDDB *dsmbddb) {
        dsmbddb->moduleVersion = getBit(data, &boff, 8);
        dsmbddb->reserved2 = getBit(data, &boff, 8);
        dsmbddb->blockNumber = getBit(data, &boff, 16);
-       dsmbddb->blockData = allocCopy(data, &boff, dsmbddb->adaptationLength);
+       dsmbddb->blockData = allocCopy(data, &boff, dsmbddb->messageLength);
 
        return boff / 8;
 }
 
-void dumpDSMCC(unsigned char *ptr, STATION *station, int station_count)
+void dumpDSMCC(unsigned char *ptr, int * downloadDataId, DSM_CONTROL *dsmctl)
 {
        DSMCChead  dsmh;
        DSMCCbodyDII  dsmbdii;
@@ -134,7 +164,6 @@ void dumpDSMCC(unsigned char *ptr, STATION *station, int station_count)
        DSMCCbodyDIIModule *module;
 
        int len = 0;
-       int loop_len = 0;
        int i = 0;
 
        /* DSMCC */
@@ -148,8 +177,8 @@ void dumpDSMCC(unsigned char *ptr, STATION *station, int station_count)
 */
        if ( dsmh.table_id == 0x3B ) {
                len = parseDSMCCbodyDII(ptr, &dsmbdii);
-#if 1
-               printf("DSMCCbDDI=(%d:%d:%d:%d:%d:%d) (%d:%d:%d:%d)\n",
+#if 0
+               printf("DSMCCbDII=(%d:%d:%d:%d:%d:%d) (%d:%d:%d:%d)\n",
                        dsmbdii.protocolDiscriminator, dsmbdii.dsmccType, 
                        dsmbdii.messageId, dsmbdii.transaction_id, 
                        dsmbdii.adaptationLength, dsmbdii.messageLength, 
@@ -159,24 +188,37 @@ void dumpDSMCC(unsigned char *ptr, STATION *station, int station_count)
 #endif
                for (i=0; i<dsmbdii.numberOfModules; i++) {
                        module = dsmbdii.modules + sizeof(DSMCCbodyDIIModule) * i;
-                       /*
-                       if ( *module->moduleInfo == 0x01 ) {
-                               printf("1 %d %s\n",module, module->moduleInfo + 2);
+                       // 0x01 Type 記述子
+                       // 0x02 Name 記述子
+                       // 0x03 Info 記述子
+                       if ( module->descriptor_tag == 0x01 ) {
+                               //printf("1 %s\n", module->Type);
                        }
-                       else if ( *module->moduleInfo == 0x02 ) {
-                               printf("2 %s\n",module->moduleInfo + 2);
+                       else if ( module->descriptor_tag == 0x02 ) {
+                               //printf("2 %s\n", module->Name);
+                               // is_bs_cs == 1 && 
+                               if ( !strncmp( module->Name, "LOGO", 4 ) ) {
+                                       //printf("%s(%d) : id = %d\n", module->Name, is_bs_cs, dsmbdii.downloadId);
+                                       *downloadDataId = dsmbdii.downloadId;
+                               }
+                               // なぜかBSにCSのロゴも載ってるため
+                               // is_bs_cs == 2 && 
+                               else if ( !strncmp( module->Name, "CS_LOGO", 7 ) ) {
+                                       //printf("%s(%d) : id = %d\n", module->Name, is_bs_cs, dsmbdii.downloadId);
+                                       *downloadDataId = dsmbdii.downloadId;
+                               }
                        }
-                       else if ( *module->moduleInfo == 0x03 ) {
-                               printf("3 %s\n",module->moduleInfo);
+                       else if ( module->descriptor_tag == 0x03 ) {
+                               //printf("3 %s\n", module->Info);
                        }
-                       */
                }
        }
        else if ( dsmh.table_id == 0x3C ) {
                len = parseDSMCCbodyDDB(ptr, &dsmbddb);
-//             if ( station[0].logo_download_data_id == dsmbddb.downloadId ) {
-//             if ( 151585024 == dsmbddb.downloadId ) {
-#if 1
+               if ( *downloadDataId == dsmbddb.downloadId ) {
+//             if ( 33882368 == dsmbddb.downloadId ) {
+//             {
+#if 0
                        printf("DSMCCbDDB=(%d:%d:%d:%d:%d:%d) (%d:%d:%d)\n",
                                dsmbddb.protocolDiscriminator, dsmbddb.dsmccType, 
                                dsmbddb.messageId, dsmbddb.downloadId, 
@@ -184,7 +226,31 @@ void dumpDSMCC(unsigned char *ptr, STATION *station, int station_count)
 
                                dsmbddb.moduleId , dsmbddb.moduleVersion , dsmbddb.blockNumber);
 #endif
-//             }
+
+                       for (i = 0; i < 1024; i++) {
+                               if ( dsmctl[i].isUsed == 0 ) {
+                                       // リストの終端まで来たので
+                                       //printf("moduleId=%d as dsmctl[%d]\n", dsmbddb.moduleId, i);
+                                       dsmctl[i].moduleId = dsmbddb.moduleId;
+                                       dsmctl[i].lastBlockNumber = -1;
+                                       dsmctl[i].isUsed = 1;
+                               }
+                               if ( dsmctl[i].moduleId == dsmbddb.moduleId ) {
+                                       if ( dsmctl[i].lastBlockNumber + 1 == dsmbddb.blockNumber ) {
+                                               dsmbddb.messageLength -= 6; // length of moduleId, moduleVersion, reserved, blockNumber
+                                               //printf("moduleId=%d as dsmctl[%d] size %d += %d\n", dsmbddb.moduleId, i, dsmctl[i].blockSize, dsmbddb.messageLength);
+                                               dsmctl[i].blockData = realloc( dsmctl[i].blockData, dsmctl[i].blockSize + dsmbddb.messageLength );
+                                               memcpy( dsmctl[i].blockData + dsmctl[i].blockSize, dsmbddb.blockData, dsmbddb.messageLength );
+                                               dsmctl[i].blockSize += dsmbddb.messageLength;
+                                               dsmctl[i].lastBlockNumber++;
+                                       }
+                                       else {
+                                               //printf("ignoring %d(max %d)\n", dsmbddb.blockNumber, dsmctl[i].lastBlockNumber);
+                                       }
+                                       break;
+                               }
+                       }
+               }
        }
 
        return;