#include <time.h>
#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 ;
#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" },
+ { "ã\83\90ã\83©ã\82¨ã\83\86ã\82£", "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)
{
-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 ;
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);
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 ;
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;
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, " <programme start=\"%s +0900\" stop=\"%s +0900\" channel=\"%s\">\n",
- cstarttime, cendtime, psta->ontv);
+
+ fprintf(outfile, " <programme start=\"%s +0900\" stop=\"%s +0900\" channel=\"%s\" event=\"%d\">\n",
+ cstarttime, cendtime, psta->ontv, eitcur->event_id);
fprintf(outfile, " <title lang=\"ja_JP\">%s</title>\n", title);
fprintf(outfile, " <desc lang=\"ja_JP\">%s</desc>\n", subtitle);
fprintf(outfile, " <longdesc lang=\"ja_JP\">%s</longdesc>\n", desc);
fprintf(outfile, " <category lang=\"ja_JP\">%s</category>\n", Category);
-// fprintf(outfile, " <category lang=\"en\">%s</category>\n", ContentCatList[eitcur->content_type].english);
+ fprintf(outfile, " <video type=\"%d\">%s</video>\n", eitcur->video_type, VideoType);
+ fprintf(outfile, " <audio type=\"%d\" multi=\"%d\">%s</audio>\n", eitcur->audio_type, eitcur->multi_type, AudioType);
+ //fprintf(outfile, " <category lang=\"en\">%s</category>\n", ContentCatList[eitcur->content_type].english);
fprintf(outfile, " </programme>\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,
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<chlt;j++){
- if (chl[j]==statin[i].svId || statin[i].svId >= 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<chlt;j++){
- if (chl[j]==statin[i].svId){
- noidinchl=0;
+ 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 < chlt ; j++){
+ if ( chl[j] == statin[i].svId ) {
+ 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;
+ if ( noidinchl == 1 ) {
+ statmp = realloc(statmp, (stal+1) * sizeof(STATION));
+ statmp[stal] = statin[i];
+ chl[chlt] = statin[i].svId;
chlt++;
stal++;
- }
+ }
}
- sleep(1);
- *station=statmp;
- *stalength=stal;//¤³¤³¤¤¤é¤¬²ø¤·¤¤
+ *station = statmp;
+ *stalength = stal;//ここいらが怪しい
//memcpy(statin,statmp,chlt*sizeof(STATION));
//free(statmp);
return;
}
+
int main(int argc, char *argv[])
{
FILE *infile = stdin;
FILE *outfile = stdout;
- int arg_maxcount = 1 ;
char *arg_onTV ;
- int mode = 1;
int staCount ;
- int eitcnt;
- char *file;
int inclose = 0;
int outclose = 0;
- int flag = 0 ;
- int outputhtml = 1;
SVT_CONTROL *svtcur ;
SVT_CONTROL *svtsave ;
- char *outptr ;
- char *inptr ;
- size_t ilen;
- size_t olen;
SECcache secs[SECCOUNT];
- int rtn;
int lp ;
STATION *pStas ;
- int act ;
+ int act = 0;
+ int i , j, k ;
+ int is_logo = 0;
+ SDTTdata sdtd;
+ SDTTdataLoop *loop;
+ SDTTdataService *service;
- /* ¶½Ì£¤Î¤¢¤ëpid¤ò»ØÄê */
- memset(secs, 0, sizeof(SECcache) * SECCOUNT);
- secs[0].pid = 0x11;
- secs[1].pid = 0x12;
- secs[2].pid = 0x26;
- secs[3].pid = 0x27;
+ 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];
- file = argv[2];
- if(strcmp(file, "-")) {
- infile = fopen(file, "r");
+ if(strcmp(argv[2], "-")) {
+ infile = fopen(argv[2], "r");
+ if ( !infile) {
+ printf( "tsFile not found (Can't open file: %s)\n", argv[2] );
+ exit( -1 );
+ }
inclose = 1;
}
+ else {
+ infile = stdin;
+ }
if(strcmp(argv[3], "-")) {
outfile = fopen(argv[3], "w+");
+ if ( !outfile) {
+ printf( "xmlFile not found (Can't open file: %s)\n", argv[3] );
+ exit( -1 );
+ }
outclose = 1;
}
+ else {
+ outfile = stdout;
+ }
}else{
- fprintf(stdout, "Usage : %s /BS <tsFile> <outfile>\n", argv[0]);
- fprintf(stdout, "Usage : %s <ontvcode> <tsFile> <outfile>\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|<id>} <tsFile> <outfile>\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));
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, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
- fprintf(outfile, "<!DOCTYPE tv SYSTEM \"xmltv.dtd\">\n\n");
- fprintf(outfile, "<tv generator-info-name=\"tsEPG2xml\" generator-info-url=\"http://localhost/\">\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, " <channel id=\"%s\">\n", pStas[lp].ontv);
- fprintf(outfile, " <display-name lang=\"ja_JP\">%s</display-name>\n", ServiceName);
- fprintf(outfile, " </channel>\n");
- }
+ fprintf(outfile, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
+ fprintf(outfile, "<!DOCTYPE tv SYSTEM \"xmltv.dtd\">\n\n");
+ fprintf(outfile, "<tv generator-info-name=\"tsEPG2xml\" generator-info-url=\"http://localhost/\">\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, "</tv>\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, " <logo ts=\"%d\" on=\"%d\" sv=\"%d\" type=\"%d\">%s</logo>\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, " <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,
+ Logo);
+ }
+
}
}
- }else{
-
}
+ for(lp = 0 ; lp < staCount ; lp++){
+ memset(ServiceName, '\0', sizeof(ServiceName));
+ strcpy(ServiceName, pStas[lp].name);
+ xmlspecialchars(ServiceName);
+
+ fprintf(outfile, " <channel id=\"%s\">\n", pStas[lp].ontv);
+ 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);
+
+ fprintf(outfile, " </channel>\n");
+ }
+ if ( is_logo ) {
+ fprintf(outfile, "</tv>\n");
+ goto cleanup;
+ }
+ for(lp = 0 ; lp < staCount ; lp++){
+ GetEIT(infile, outfile, &pStas[lp], secs);
+ }
+ fprintf(outfile, "</tv>\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;
}
+