X-Git-Url: http://git.osdn.net/view?p=rec10%2Frec10-git.git;a=blobdiff_plain;f=tstools%2Fepgdump%2Fepgdump.c;h=0c0141be17afcf4da09a15831530dfe008e63b8d;hp=046f2b91d226a5bb830c82704ac3d5b2b10136cc;hb=930d3dbdc17ad4179a9b512f4e787a896a544943;hpb=d63ca135202a679bd918561b65e806966f94546e diff --git a/tstools/epgdump/epgdump.c b/tstools/epgdump/epgdump.c index 046f2b9..0c0141b 100755 --- a/tstools/epgdump/epgdump.c +++ b/tstools/epgdump/epgdump.c @@ -7,9 +7,14 @@ #include #include "ts.h" +#include "psi.h" #include "sdt.h" +#include "sdtt.h" #include "eit.h" +#include "tot.h" +#include "dsmcc.h" #include "ts_ctl.h" +#include "util.h" typedef struct _ContentTYPE{ char *japanese ; @@ -18,32 +23,78 @@ typedef struct _ContentTYPE{ #define CAT_COUNT 16 static CONTENT_TYPE ContentCatList[CAT_COUNT] = { - { "¥Ë¥å¡¼¥¹¡¦ÊóÆ»", "news" }, - { "¥¹¥Ý¡¼¥Ä", "sports" }, - { "¾ðÊó", "information" }, - { "¥É¥é¥Þ", "drama" }, - { "²»³Ú", "music" }, - { "¥Ð¥é¥¨¥Æ¥£", "variety" }, - { "±Ç²è", "cinema" }, - { "¥¢¥Ë¥á¡¦Æû£", "anime" }, - { "¥É¥­¥å¥á¥ó¥¿¥ê¡¼¡¦¶µÍÜ", "documentary" }, - { "±é·à", "stage" }, - { "¼ñÌ£¡¦¼ÂÍÑ", "hobby" }, - { "Ê¡»ã", "etc" }, //Ê¡»ã - { "ͽÈ÷", "etc" }, //ͽÈ÷ - { "ͽÈ÷", "etc" }, //ͽÈ÷ - { "ͽÈ÷", "etc" }, //ͽÈ÷ - { "¤½¤Î¾", "etc" } //¤½¤Î¾ + { "ニュース・報道", "news" }, + { "スポーツ", "sports" }, + { "情報", "information" }, + { "ドラマ", "drama" }, + { "音楽", "music" }, + { "バラエティ", "variety" }, + { "映画", "cinema" }, + { "アニメ・特撮", "anime" }, + { "ドキュメンタリー・教養", "documentary" }, + { "演劇", "stage" }, + { "趣味・実用", "hobby" }, + { "福祉", "welfare" }, + { "予備", "etc" }, + { "予備", "etc" }, + { "予備", "etc" }, + { "その他", "etc" } }; + SVT_CONTROL *svttop = NULL; -#define SECCOUNT 4 -char title[1024]; -char subtitle[1024]; -char desc[102400] = {0}; -char Category[1024]; -char ServiceName[1024]; -iconv_t cd ; +DSM_CONTROL dsmctl[1024]; +#define SECCOUNT 64 +static unsigned char *base64 = (unsigned char *)"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +static void base64_char(unsigned long bb, int srclen, unsigned char *dest, int j) +{ + int x, i, base; + + /* 最終位置の計算 */ + for ( i = srclen; i < 2; i++ ) + bb <<= 8; + + /* BASE64変換 */ + for ( base = 18, x = 0; x < srclen + 2; x++, base -= 6) { + dest[j++] = base64[ (unsigned long)((bb>>base) & 0x3F) ]; + } + + /* 端数の判断 */ + for ( i = x; i < 4; i++ ) { + dest[j++] = (unsigned char)'='; /* 端数 */ + } + +} + +static void base64_encode(unsigned char *dest, const unsigned char *src, int len) +{ + unsigned char *p = src; + unsigned long bb = (unsigned long)0; + int i = 0, j = 0; + + while (len--) + { + bb <<= 8; + bb |= (unsigned long)*p; + + /* 24bit単位に編集 */ + if (i == 2) { + base64_char(bb, i, dest, j); + + j = j + 4; + i = 0; + bb = 0; + } else + i++; + + p++; + } + + /* 24bitに満たない場合 */ + if (i) base64_char(bb, i - 1, dest, j); + +} void xmlspecialchars(char *str) { @@ -56,38 +107,72 @@ void xmlspecialchars(char *str) -void GetSDT(FILE *infile, SVT_CONTROL *svttop, SECcache *secs, int count) +void GetSDT(FILE *infile, SVT_CONTROL *svttop, SECcache *secs, + int count, STATION **station, int * station_count, char *header, int is_logo) { SECcache *bsecs; + int pmtpids[SECCOUNT]; + memset(pmtpids, 0, sizeof(pmtpids)); + int dsmccpids[SECCOUNT]; + memset(dsmccpids, 0, sizeof(dsmccpids)); + int i = 0 , downloadDataId = 0; while((bsecs = readTS(infile, secs, count)) != NULL) { /* SDT */ if((bsecs->pid & 0xFF) == 0x11) { - dumpSDT(bsecs->buf, svttop); + dumpSDT(bsecs->buf, svttop, station, station_count, header); } - } -} -void GetSDT_chout(FILE *infile, SVT_CONTROL *svttop, SECcache *secs, int count,STATION *station, int * station_count,char *header) -{ - SECcache *bsecs; - - while((bsecs = readTS(infile, secs, count)) != NULL) { - /* SDT */ - if((bsecs->pid & 0xFF) == 0x11) { - dumpSDT_chout(bsecs->buf,svttop,station,station_count,header); + /* TOT */ + else if((bsecs->pid & 0xFF) == 0x14) { + dumpTOT(bsecs->buf); + } + /* SDTT */ + //else if((bsecs->pid & 0xFF) == 0x23) { + // dumpSDTT(bsecs->buf, *station, *station_count); + //} + /* BIT */ + else if((bsecs->pid & 0xFF) == 0x24) { + dumpBIT(bsecs->buf); + } + /* CDT */ + else if((bsecs->pid & 0xFF) == 0x29) { + dumpCDT(bsecs->buf, *station, *station_count); + } + else if ( is_logo ) { + /* PAT */ + if((bsecs->pid & 0xFF) == 0x00) { + dumpPAT(bsecs->buf, secs, count, pmtpids); + } + /* PMT */ + for ( i = 1; i < SECCOUNT; i++ ) { + if ( pmtpids[i] == 0 ) { + break; + } + /* PMT specified by PAT */ + if ( bsecs->pid == pmtpids[i] ) { + dumpPMT(bsecs->buf, secs, count, dsmccpids); + } + } + /* DSM-CC */ + for ( i = 0; i < SECCOUNT; i++ ) { + if ( dsmccpids[i] == 0 ) { + break; + } + /* DSM-CC specified by PMT */ + if ( bsecs->pid == dsmccpids[i] ) { + dumpDSMCC(bsecs->buf, &downloadDataId, &dsmctl); + } + } } } } -void GetEIT(FILE *infile, FILE *outfile, STATION *psta, SECcache *secs, int count) + +void GetEIT(FILE *infile, FILE *outfile, STATION *psta, SECcache *secs) { SECcache *bsecs; EIT_CONTROL *eitcur ; EIT_CONTROL *eitnext ; EIT_CONTROL *eittop = NULL; - char *outptr ; - char *inptr ; - size_t ilen; - size_t olen; time_t l_time ; time_t end_time ; struct tm tl ; @@ -95,6 +180,18 @@ void GetEIT(FILE *infile, FILE *outfile, STATION *psta, SECcache *secs, int coun char cendtime[32]; char cstarttime[32]; + char title[1024]; + char subtitle[1024]; + char desc[102400] = {0}; + char Category[1024]; + char VideoType[1024]; + char AudioType[1024]; + + memset(secs, 0, sizeof(SECcache) * SECCOUNT); + secs[0].pid = 0x12; /* EIT */ + secs[1].pid = 0x26; /* EIT */ + secs[2].pid = 0x27; /* EIT */ + eittop = calloc(1, sizeof(EIT_CONTROL)); eitcur = eittop ; fseek(infile, 0, SEEK_SET); @@ -117,40 +214,32 @@ void GetEIT(FILE *infile, FILE *outfile, STATION *psta, SECcache *secs, int coun if(eitcur->content_type > CAT_COUNT){ eitcur->content_type = CAT_COUNT -1 ; } - outptr = title ; memset(title, '\0', sizeof(title)); - ilen = strlen(eitcur->title); - olen = sizeof(title); - inptr = eitcur->title; - iconv(cd, &inptr, &ilen, &outptr, &olen); + strcpy(title, eitcur->title); xmlspecialchars(title); memset(subtitle, '\0', sizeof(subtitle)); - ilen = strlen(eitcur->subtitle); - olen = sizeof(subtitle); - outptr = subtitle ; - inptr = eitcur->subtitle; - iconv(cd, &inptr, &ilen, &outptr, &olen); + strcpy(subtitle, eitcur->subtitle); xmlspecialchars(subtitle); memset(desc, '\0', sizeof(desc)); if ( eitcur->desc ) { - ilen = strlen(eitcur->desc); - olen = sizeof(desc); - outptr = desc ; - inptr = eitcur->desc; - iconv(cd, &inptr, &ilen, &outptr, &olen); + strcpy(desc, eitcur->desc); xmlspecialchars(desc); } memset(Category, '\0', sizeof(Category)); - ilen = strlen(ContentCatList[eitcur->content_type].japanese); - olen = sizeof(Category); - outptr = Category ; - inptr = ContentCatList[eitcur->content_type].japanese; - iconv(cd, &inptr, &ilen, &outptr, &olen); + strcpy(Category, ContentCatList[eitcur->content_type].japanese); xmlspecialchars(Category); + memset(VideoType, '\0', sizeof(VideoType)); + strcpy(VideoType, parseComponentDescType(eitcur->video_type)); + xmlspecialchars(VideoType); + + memset(AudioType, '\0', sizeof(AudioType)); + strcpy(AudioType, parseAudioComponentDescType(eitcur->audio_type)); + xmlspecialchars(AudioType); + tl.tm_sec = eitcur->ss ; tl.tm_min = eitcur->hm ; tl.tm_hour = eitcur->hh ; @@ -163,7 +252,7 @@ void GetEIT(FILE *infile, FILE *outfile, STATION *psta, SECcache *secs, int coun l_time = mktime(&tl); if((eitcur->ehh == 0) && (eitcur->emm == 0) && (eitcur->ess == 0)){ (void)time(&l_time); - end_time = l_time + (60 * 5); // £µÊ¬¸å¤ËÀßÄê + end_time = l_time + (60 * 5); // 5分後に設定 endtl = localtime(&end_time); }else{ end_time = l_time + eitcur->ehh * 3600 + eitcur->emm * 60 + eitcur->ess; @@ -173,24 +262,25 @@ void GetEIT(FILE *infile, FILE *outfile, STATION *psta, SECcache *secs, int coun memset(cstarttime, '\0', sizeof(cstarttime)); strftime(cendtime, (sizeof(cendtime) - 1), "%Y%m%d%H%M%S", endtl); strftime(cstarttime, (sizeof(cstarttime) - 1), "%Y%m%d%H%M%S", &tl); -#if 1 - fprintf(outfile, " \n", - cstarttime, cendtime, psta->ontv); + + fprintf(outfile, " \n", + cstarttime, cendtime, psta->ontv, eitcur->event_id); fprintf(outfile, " %s\n", title); fprintf(outfile, " %s\n", subtitle); fprintf(outfile, " %s\n", desc); fprintf(outfile, " %s\n", Category); -// fprintf(outfile, " %s\n", ContentCatList[eitcur->content_type].english); + fprintf(outfile, " \n", eitcur->video_type, VideoType); + fprintf(outfile, " \n", eitcur->audio_type, eitcur->multi_type, AudioType); + //fprintf(outfile, " %s\n", ContentCatList[eitcur->content_type].english); fprintf(outfile, " \n"); -#else +#if 0 fprintf(outfile, "(%x:%x:%x)%s,%s,%s,%s,%s,%s\n", eitcur->servid, eitcur->table_id, eitcur->event_id, cstarttime, cendtime, title, subtitle, Category, ContentCatList[eitcur->content_type].english); -#endif -#if 0 + fprintf(outfile, "(%x:%x)%04d/%02d/%02d,%02d:%02d:%02d,%02d:%02d:%02d,%s,%s,%s,%s\n", eitcur->table_id, eitcur->event_id, eitcur->yy, eitcur->mm, eitcur->dd, @@ -209,170 +299,170 @@ void GetEIT(FILE *infile, FILE *outfile, STATION *psta, SECcache *secs, int coun free(eittop); eittop = NULL; } -void checkSta_BS(STATION **station,int *stalength){ - STATION *statmp; - int chl[90]; - int chlt=0; - int stal=0; - STATION * statin= *station; - statmp=malloc(sizeof(STATION)*2); - for (int i=0;i<*stalength;i++){ - int noidinchl=1; - for (int j=0;j= 290){ - noidinchl=0; - } - } - if (noidinchl==1){ - statmp=realloc(statmp,(stal+1)*sizeof(STATION)); - statmp[stal]=statin[i]; - //memcpy(statmp[stal-1],station[i],sizeof(STATION)); - chl[chlt]=statin[i].svId; - chlt++; - stal++; - } - } - //*station=realloc(station,(stal+1)*sizeof(STATION)); - //memcpy(*station,statmp,(stal+1)*sizeof(STATION)); - *station=statmp; - *stalength=stal; - //memcpy(statin,statmp,chlt*sizeof(STATION)); - //free(statmp); - return; -} void checkSta(STATION **station,int *stalength){ STATION *statmp; int chl[90]; - int chlt=0; - int stal=0; - STATION * statin= *station; - statmp=malloc(sizeof(STATION)*2); - for (int i=0;i<*stalength;i++){ - int noidinchl=1; - for (int j=0;j \n", argv[0]); - fprintf(stdout, "Usage : %s \n", argv[0]); - fprintf(stdout, "ontvcode ¥Á¥ã¥ó¥Í¥ë¼±Ê̻ҡ£****.ontvjapan.com ¤Ê¤É\n"); - fprintf(stdout, "/BS BS¥â¡¼¥É¡£°ì¤Ä¤ÎTS¤«¤éBSÁ´¶É¤Î¥Ç¡¼¥¿¤òÆɤ߹þ¤ß¤Þ¤¹¡£\n"); - fprintf(stdout, "/CS CS¥â¡¼¥É¡£°ì¤Ä¤ÎTS¤«¤éÊ£¿ô¶É¤Î¥Ç¡¼¥¿¤òÆɤ߹þ¤ß¤Þ¤¹¡£\n"); + fprintf(stdout, "Usage : %s (/LOGO) {/BS|/CS|} \n", argv[0]); + fprintf(stdout, "\n"); + fprintf(stdout, "/LOGO ロゴ取得モード。独立して指定し、番組表の出力を行ないません。\n"); + fprintf(stdout, " 必要なTSの長さ 地上波は10分 BS/CSは20分です。\n"); + fprintf(stdout, "id チャンネル識別子。地上波の物理チャンネルを与えます。\n"); + fprintf(stdout, "/BS BSモード。一つのTSからBS全局のデータを読み込みます。\n"); + fprintf(stdout, "/CS CSモード。一つのTSから複数局のデータを読み込みます。\n"); + fprintf(stdout, "/TIME 時刻合わせモード。TSからTOT(Time Offset Table)を読み込みます。\n"); + fprintf(stdout, " recpt1 <任意> 10(秒以上) - | epgdump /TIME - <任意>の形で使用してください。\n"); + fprintf(stdout, " TOTは5秒に1回しか来ないため、recpt1に与える時間をある程度長くしてください。\n"); +/* + fprintf(stdout, " ontvcode Channel identifier (ex. ****.ontvjapan.com)\n"); + fprintf(stdout, " /BS BS mode\n"); + fprintf(stdout, " This mode reads the data of all BS TV stations\n"); + fprintf(stdout, " from one TS data.\n"); + fprintf(stdout, " /CS CS mode\n"); + fprintf(stdout, " This mode reads the data of two or more CS TV stations\n"); + fprintf(stdout, " from one TS data.\n"); +*/ return 0; } - if(strcmp(arg_onTV, "/BS") == 0){ - STATION *sta=malloc(sizeof(STATION)*2); - int sta_count = 0; - svttop = calloc(1, sizeof(SVT_CONTROL)); - char *head="BS"; - GetSDT_chout(infile, svttop, secs, SECCOUNT,&sta, &sta_count,head); - checkSta_BS(&sta,&sta_count); - //if (sta_count) - //printf("Station count: %d\n1st ontv=%s,name=%s\n",sta_count, sta[0].ontv, sta[0].name); - pStas = sta; - staCount = sta_count;// sizeof(pStas) / sizeof (STATION); - act = 0 ; - outputhtml=1; + pStas = NULL; + staCount = 0; + 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); + secs[0].pid = 0x14; /* TOT */ + + GetSDT(infile, NULL, secs, SECCOUNT,NULL, NULL,NULL, 0); + + goto cleanup; + }else if(strcmp(arg_onTV, "/BS") == 0){ + char *head = "BS"; + GetSDT(infile, svttop, secs, SECCOUNT, &pStas, &staCount, head, is_logo); }else if(strcmp(arg_onTV, "/CS") == 0){ - STATION *sta=NULL; - int sta_count = 0; - svttop = calloc(1, sizeof(SVT_CONTROL)); - char *head="CS"; - GetSDT_chout(infile, svttop, secs, SECCOUNT,&sta, &sta_count,head); - checkSta(&sta,&sta_count); - //if (sta_count) - //printf("Station count: %d\n1st ontv=%s,name=%s\n",sta_count, sta[0].ontv, sta[0].name); - pStas = sta; - staCount = sta_count; - //staCount=sizeof(pStas) / sizeof (STATION); - act = 0 ; - outputhtml=1; + char *head = "CS"; + GetSDT(infile, svttop, secs, SECCOUNT, &pStas, &staCount, head, is_logo); }else if(strcmp(arg_onTV, "/TEST") == 0){ - STATION *sta=NULL; - int sta_count = 0; - svttop = calloc(1, sizeof(SVT_CONTROL)); - char *head="TEST"; - GetSDT_chout(infile, svttop, secs, SECCOUNT,&sta, &sta_count,head); - checkSta(&sta,&sta_count); + memset(secs, 0, sizeof(SECcache) * SECCOUNT); + secs[0].pid = 0x24; /* BIT */ + + char *head = "TEST"; + GetSDT(infile, svttop, secs, SECCOUNT, &pStas, &staCount, head, 0); //if (sta_count) - //printf("Station count: %d\n1st ontv=%s,name=%s\n",sta_count, sta[0].ontv, sta[0].name); - pStas = sta; - staCount = sta_count;// sizeof(pStas) / sizeof (STATION); - act = 0 ; - outputhtml=1; + // printf("Station count: %d\n1st ontv=%s,name=%s\n",staCount, pStas[0].ontv, pStas[0].name); }else{ - /*act = 1 ; + GetSDT(infile, svttop, secs, SECCOUNT, &pStas, &staCount, arg_onTV, 0); + + // 地上波のマルチチャンネル対応のためコメントアウト + /* + act = 1 ; svttop = calloc(1, sizeof(SVT_CONTROL)); GetSDT(infile, svttop, secs, SECCOUNT); - svtcur = svttop->next ; //ÀèƬ + svtcur = svttop->next ; //先頭 if(svtcur == NULL){ free(svttop); - return ; + return 1; } pStas = calloc(1, sizeof(STATION)); @@ -381,63 +471,128 @@ int main(int argc, char *argv[]) pStas->svId = svtcur->event_id ; pStas->ontv = arg_onTV ; pStas->name = svtcur->servicename ; - staCount = 1;*/ - ///Êѹ¹¸å - STATION *sta=NULL; - int sta_count = 0; - svttop = calloc(1, sizeof(SVT_CONTROL)); - //char *head=arg_onTV; - GetSDT_chout(infile, svttop, secs, SECCOUNT,&sta, &sta_count,arg_onTV); - checkSta(&sta,&sta_count); - //if (sta_count) - //printf("Station count: %d\n1st ontv=%s,name=%s\n",sta_count, sta[0].ontv, sta[0].name); - pStas = sta; - staCount = sta_count;// sizeof(pStas) / sizeof (STATION); - act = 0 ; - outputhtml=1; + staCount = 1; + */ } - if (outputhtml == 1){ - fprintf(outfile, "\n"); - fprintf(outfile, "\n\n"); - fprintf(outfile, "\n"); + checkSta(&pStas, &staCount); - cd = iconv_open("UTF-8", "EUC-JP"); - for(lp = 0 ; lp < staCount ; lp++){ - memset(ServiceName, '\0', sizeof(ServiceName)); - ilen = strlen(pStas[lp].name); - olen = sizeof(ServiceName); - outptr = ServiceName ; - inptr = pStas[lp].name ; - iconv(cd, &inptr, &ilen, &outptr, &olen); - xmlspecialchars(ServiceName); - - fprintf(outfile, " \n", pStas[lp].ontv); - fprintf(outfile, " %s\n", ServiceName); - fprintf(outfile, " \n"); - } + fprintf(outfile, "\n"); + fprintf(outfile, "\n\n"); + fprintf(outfile, "\n"); + + char ServiceName[1024]; + char Logo[8192]; + + if ( is_logo ) { + memset(Logo, '\0', sizeof(Logo)); for(lp = 0 ; lp < staCount ; lp++){ - GetEIT(infile, outfile, &pStas[lp], secs, SECCOUNT); - } - fprintf(outfile, "\n"); - if(inclose) { - fclose(infile); + 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, " %s\n", + pStas[lp].tsId, + pStas[lp].onId, + pStas[lp].svId, + i, + Logo); + } + } } - if(outclose) { - fclose(outfile); - } - iconv_close(cd); - if(act){ - free(pStas); - svtcur = svttop ; //ÀèƬ - while(svtcur != NULL){ - svtsave = svtcur->next ; - free(svtcur); - svtcur = svtsave ; + 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, " %s\n", + service->transport_stream_id, + service->original_network_id, + service->service_id, + sdtd.logo_type, + loop->logo_id, + Logo); + } + } } - }else{ - } + for(lp = 0 ; lp < staCount ; lp++){ + memset(ServiceName, '\0', sizeof(ServiceName)); + strcpy(ServiceName, pStas[lp].name); + xmlspecialchars(ServiceName); + + fprintf(outfile, " \n", pStas[lp].ontv); + fprintf(outfile, " %s\n", ServiceName); + fprintf(outfile, " \n", pStas[lp].tsId, pStas[lp].onId, pStas[lp].svId); + + fprintf(outfile, " \n"); + } + if ( is_logo ) { + fprintf(outfile, "\n"); + goto cleanup; + } + for(lp = 0 ; lp < staCount ; lp++){ + GetEIT(infile, outfile, &pStas[lp], secs); + } + fprintf(outfile, "\n"); +cleanup: + if(inclose) { + fclose(infile); + } + if(outclose) { + fclose(outfile); + } + if(act){ + free(pStas); + svtcur = svttop ; //先頭 + while(svtcur != NULL){ + svtsave = svtcur->next ; + free(svtcur); + svtcur = svtsave ; + } + } + return 0; } +