OSDN Git Service

fix logo output format
[rec10/rec10-git.git] / epgdump / epgdump.c
index e4dd11e..5985370 100755 (executable)
@@ -114,7 +114,7 @@ void        xmlspecialchars(char *str)
 
 
 void   GetSDT(FILE *infile, SVT_CONTROL *svttop, SECcache *secs, 
-       int count, STATION **station, int * station_count, char *header, int is_bs_cs_logo)
+       int count, STATION **station, int * station_count, char *header, int is_logo)
 {
        SECcache  *bsecs;
        int pmtpids[SECCOUNT];
@@ -140,7 +140,7 @@ void        GetSDT(FILE *infile, SVT_CONTROL *svttop, SECcache *secs,
                else if((bsecs->pid & 0xFF) == 0x29) {
                        dumpCDT(bsecs->buf, *station, *station_count);
                }
-               else if ( is_bs_cs_logo ) {
+               else if ( is_logo ) {
                        /* PAT */
                        if((bsecs->pid & 0xFF) == 0x00) {
                                dumpPAT(bsecs->buf, secs, count, pmtpids);
@@ -329,20 +329,20 @@ int main(int argc, char *argv[])
        STATION *pStas ;
        int             act = 0;
        int             i , j, k ;
-       int             is_bs_cs_logo = 0;
+       int             is_logo = 0;
        SDTTdata  sdtd;
        SDTTdataLoop *loop;
        SDTTdataService *service;
 
-       /* 興味のあるpidを指定 */
-       memset(secs, 0,  sizeof(SECcache) * SECCOUNT);
-       secs[0].pid = 0x00; /* PAT  */
-       secs[1].pid = 0x11; /* SDT  */
-       secs[2].pid = 0x23; /* SDTT */
-       secs[3].pid = 0x29; /* CDT  */
-
        memset(dsmctl, 0,  sizeof(dsmctl));
 
+       if(argc == 5 && strcmp(argv[1], "/LOGO") == 0){
+               argc--;
+               argv[1] = argv[2];
+               argv[2] = argv[3];
+               argv[3] = argv[4];
+               is_logo = 1;
+       }
        if(argc == 4){
                arg_onTV = argv[1];
                if(strcmp(argv[2], "-")) {
@@ -368,9 +368,9 @@ int main(int argc, char *argv[])
                        outfile = stdout;
                }
        }else{
-               fprintf(stdout, "Usage : %s {/BS|/CS} <tsFile> <xmlFile>\n", argv[0]);
-               fprintf(stdout, "Usage : %s <id> <tsFile> <xmlFile>\n", argv[0]);
+               fprintf(stdout, "Usage : %s (/LOGO) {/BS|/CS|<id>} <tsFile> <outfile>\n", argv[0]);
                fprintf(stdout, "\n");
+               fprintf(stdout, "/LOGO    ロゴ取得モード。独立して指定し、番組表の出力を行ないません。\n");
                fprintf(stdout, "id       チャンネル識別子。地上波の物理チャンネルを与えます。\n");
                fprintf(stdout, "/BS      BSモード。一つのTSからBS全局のデータを読み込みます。\n");
                fprintf(stdout, "/CS      CSモード。一つのTSから複数局のデータを読み込みます。\n");
@@ -394,6 +394,24 @@ int main(int argc, char *argv[])
        svttop = calloc(1, sizeof(SVT_CONTROL));
        act = 0 ;
 
+       /* 興味のあるpidを指定 */
+       if ( is_logo ) {
+               memset(secs, 0,  sizeof(SECcache) * SECCOUNT);
+               secs[0].pid = 0x00; /* PAT  */
+               secs[1].pid = 0x11; /* SDT  */
+               secs[2].pid = 0x29; /* CDT  */
+       }
+       else {
+               memset(secs, 0,  sizeof(SECcache) * SECCOUNT);
+               secs[0].pid = 0x00; /* PAT  */
+               secs[1].pid = 0x11; /* SDT  */
+               secs[2].pid = 0x12; /* EIT  */
+               secs[3].pid = 0x23; /* SDTT */
+               secs[4].pid = 0x26; /* EIT  */
+               secs[5].pid = 0x27; /* EIT  */
+               secs[6].pid = 0x29; /* CDT  */
+       }
+
        if(strcmp(arg_onTV, "/TIME") == 0){
                printf("TSに載っている時刻データは2秒ほど早めてあるのかもしれません。\n");
                memset(secs, 0,  sizeof(SECcache) * SECCOUNT);
@@ -408,9 +426,6 @@ int main(int argc, char *argv[])
        }else if(strcmp(arg_onTV, "/CS") == 0){
                char *head = "CS";
                GetSDT(infile, svttop, secs, SECCOUNT, &pStas, &staCount, head, 0);
-       }else if(strcmp(arg_onTV, "/BSCSLOGO") == 0){
-               is_bs_cs_logo = 1;
-               GetSDT(infile, svttop, secs, SECCOUNT, &pStas, &staCount, "", 1);
        }else if(strcmp(arg_onTV, "/TEST") == 0){
                char *head = "TEST";
                GetSDT(infile, svttop, secs, SECCOUNT, &pStas, &staCount, head, 0);
@@ -445,63 +460,77 @@ int main(int argc, char *argv[])
        fprintf(outfile, "<!DOCTYPE tv SYSTEM \"xmltv.dtd\">\n\n");
        fprintf(outfile, "<tv generator-info-name=\"tsEPG2xml\" generator-info-url=\"http://localhost/\">\n");
 
-       for ( i = 0; i < 1024; i++) {
-               if ( dsmctl[i].isUsed == 0 ) break;
-               parseSDTTdata(dsmctl[i].blockData, &sdtd);
-
-               for (j = 0; j < sdtd.number_of_loop; j++) {
-                       loop = sdtd.loop + sizeof(SDTTdataLoop) * j;
-
-                       for ( k = 0; k < loop->number_of_services; k++) {
-                               service = loop->services + sizeof(SDTTdataService) * k;
-
-                               /*
-                               for(lp = 0 ; lp < staCount ; lp++){
-                                       if ( 
-                                               pStas[lp].tsId == service->transport_stream_id && 
-                                               pStas[lp].onId == service->original_network_id && 
-                                               pStas[lp].svId == service->service_id
-                                       ) {
-                                               clt2png(loop->data, 
-                                                       &pStas[lp].logo_array[sdtd.logo_type].logo, 
-                                                       &pStas[lp].logo_array[sdtd.logo_type].logo_size);
-                                       }
+       if ( is_logo ) {
+               memset(Logo, '\0', sizeof(Logo));
+               for(lp = 0 ; lp < staCount ; lp++){
+                       for ( i = 0 ; i < 6 ; i++) {
+                               if (pStas[lp].logo_array[i].logo) {
+                                       base64_encode(Logo, pStas[lp].logo_array[i].logo, pStas[lp].logo_array[i].logo_size);
+                                       xmlspecialchars(Logo);
+                                       fprintf(outfile, "    <logo ts=\"%d\" on=\"%d\" sv=\"%d\" type=\"%d\">%s</logo>\n", 
+                                               pStas[lp].tsId, 
+                                               pStas[lp].onId, 
+                                               pStas[lp].svId, 
+                                               i, 
+                                               Logo);
                                }
-                               */
-
-                               #if 0
-                               printf( "SDTTdataLoop (%d:%d) %d:%d[%d:%d:%d]%d\n", 
-                                       i, j, 
-                                       sdtd.logo_type, 
-                                       loop->logo_id, 
-                                       service->transport_stream_id, 
-                                       service->original_network_id, 
-                                       service->service_id, 
-                                       loop->data_size
-                               );
-                               #endif
-
-                               if ( is_bs_cs_logo ) {
-                                       fprintf(outfile, "  <logo ts=\"%d\" on=\"%d\" sv=\"%d\" type=\"%d\">%d</logo>\n", 
+                       }
+               }
+
+               for ( i = 0; i < 1024; i++) {
+                       if ( dsmctl[i].isUsed == 0 ) break;
+                       parseSDTTdata(dsmctl[i].blockData, &sdtd);
+
+                       for (j = 0; j < sdtd.number_of_loop; j++) {
+                               loop = sdtd.loop + sizeof(SDTTdataLoop) * j;
+
+                               for ( k = 0; k < loop->number_of_services; k++) {
+                                       service = loop->services + sizeof(SDTTdataService) * k;
+
+                                       /*
+                                       for(lp = 0 ; lp < staCount ; lp++){
+                                               if ( 
+                                                       pStas[lp].tsId == service->transport_stream_id && 
+                                                       pStas[lp].onId == service->original_network_id && 
+                                                       pStas[lp].svId == service->service_id
+                                               ) {
+                                                       clt2png(loop->data, 
+                                                               &pStas[lp].logo_array[sdtd.logo_type].logo, 
+                                                               &pStas[lp].logo_array[sdtd.logo_type].logo_size);
+                                               }
+                                       }
+                                       */
+
+                                       #if 0
+                                       printf( "SDTTdataLoop (%d:%d) %d:%d[%d:%d:%d]%d\n", 
+                                               i, j, 
+                                               sdtd.logo_type, 
+                                               loop->logo_id, 
+                                               service->transport_stream_id, 
+                                               service->original_network_id, 
+                                               service->service_id, 
+                                               loop->data_size
+                                       );
+                                       #endif
+
+                               
+                                       void* logo = NULL;
+                                       int logo_size = 0;
+
+                                       clt2png(loop->data, &logo, &logo_size);
+                                       memset(Logo, '\0', sizeof(Logo));
+                                       base64_encode(Logo, logo, logo_size);
+                                       xmlspecialchars(Logo);
+
+                                       fprintf(outfile, "  <logo ts=\"%d\" on=\"%d\" sv=\"%d\" type=\"%d\" dlid=\"%d\">%s</logo>\n", 
                                                service->transport_stream_id, 
                                                service->original_network_id, 
                                                service->service_id, 
                                                sdtd.logo_type, 
-                                               loop->logo_id);
+                                               loop->logo_id, 
+                                               Logo);
                                }
-                       }
 
-                       if ( is_bs_cs_logo ) {
-                               void* logo = NULL;
-                               int logo_size = 0;
-
-                               clt2png(loop->data, &logo, &logo_size);
-                               memset(Logo, '\0', sizeof(Logo));
-                               base64_encode(Logo, logo, logo_size);
-                               xmlspecialchars(Logo);
-                               fprintf(outfile, "  <logodata id=\"%d\">%s</logodata>\n", 
-                                       loop->logo_id, 
-                                       Logo);
                        }
                }
        }
@@ -514,18 +543,9 @@ int main(int argc, char *argv[])
                fprintf(outfile, "    <display-name lang=\"ja_JP\">%s</display-name>\n", ServiceName);
                fprintf(outfile, "    <id ts=\"%d\" on=\"%d\" sv=\"%d\"/>\n", pStas[lp].tsId, pStas[lp].onId, pStas[lp].svId);
 
-               memset(Logo, '\0', sizeof(Logo));
-               for ( i = 0 ; i < 6 ; i++) {
-                       if (pStas[lp].logo_array[i].logo) {
-                               base64_encode(Logo, pStas[lp].logo_array[i].logo, pStas[lp].logo_array[i].logo_size);
-                               xmlspecialchars(Logo);
-                               fprintf(outfile, "    <logo type=\"%02d\">%s</logo>\n", i, Logo);
-                       }
-               }
-
                fprintf(outfile, "  </channel>\n");
        }
-       if ( is_bs_cs_logo ) {
+       if ( is_logo ) {
                fprintf(outfile, "</tv>\n");
                goto cleanup;
        }