X-Git-Url: http://git.osdn.net/view?p=rec10%2Frec10-git.git;a=blobdiff_plain;f=epgdump%2Fsdt.c;h=6192f6bf2f8c1c65f3934ce994c6b450f49c14e9;hp=46a74ff04fbf81e79b31b482b1a82ec7e6b3c865;hb=d63ca135202a679bd918561b65e806966f94546e;hpb=37b22a3601d2e00d0b676c7cd909d395c0526a44 diff --git a/epgdump/sdt.c b/epgdump/sdt.c index 46a74ff..6192f6b 100755 --- a/epgdump/sdt.c +++ b/epgdump/sdt.c @@ -1,3 +1,5 @@ +// -*- tab-width:4 -*- + #include #include #include @@ -46,10 +48,10 @@ int parseSDTbody(unsigned char *data, SDTbody *b) { } int parseSVCdesc(unsigned char *data, SVCdesc *desc) { +//0x48のサービス記述子、放送局の名前などが入っているよう int boff = 0; - - memset(desc, 0, sizeof(SVCdesc)); + memset(desc, 0, sizeof(SVCdesc)); desc->descriptor_tag = getBit(data, &boff, 8); desc->descriptor_length = getBit(data, &boff, 8); desc->service_type = getBit(data, &boff, 8); @@ -60,7 +62,36 @@ int parseSVCdesc(unsigned char *data, SVCdesc *desc) { return desc->descriptor_length + 2; } -int serachid(SVT_CONTROL *top, int service_id) + +int parseLOGdesc(unsigned char *data, LOGdesc *desc) { +//0xC1のデジタルコピー制御記述子 +//0xCFのロゴ伝送記述子 + int boff = 0; + + memset(desc, 0, sizeof(LOGdesc)); + desc->descriptor_tag = getBit(data, &boff, 8); + desc->descriptor_length = getBit(data, &boff, 8); + desc->logo_transmission_type = getBit(data, &boff, 8); + if ( desc->logo_transmission_type == 0x01 ) { + desc->reserved_future_use1 = getBit(data, &boff, 7); + desc->logo_id = getBit(data, &boff, 9); + desc->reserved_future_use2 = getBit(data, &boff, 4); + desc->logo_version = getBit(data, &boff, 12); + desc->download_data_id = getBit(data, &boff, 16); + } + else if ( desc->logo_transmission_type == 0x02 ) { + desc->reserved_future_use1 = getBit(data, &boff, 7); + desc->logo_id = getBit(data, &boff, 9); + } + else if ( desc->logo_transmission_type == 0x03 ) { + memcpy(desc->logo_char, data + boff / 8, desc->descriptor_length); + // getStr(desc->logo_char, data, &boff, desc->descriptor_length); + } + + return desc->descriptor_length + 2; +} + +int serachid(SVT_CONTROL *top, int service_id) { SVT_CONTROL *cur = top ; while(cur != NULL){ @@ -72,7 +103,7 @@ int serachid(SVT_CONTROL *top, int service_id) return 0 ; } -void enqueue_sdt(SVT_CONTROL *top, SVT_CONTROL *sdtptr) +void enqueue_sdt(SVT_CONTROL *top, SVT_CONTROL *sdtptr) { SVT_CONTROL *cur ; @@ -103,64 +134,148 @@ void enqueue_sdt(SVT_CONTROL *top, SVT_CONTROL *sdtptr) } -void dumpSDT(unsigned char *ptr, SVT_CONTROL *top) +void dumpSDT(unsigned char *ptr, SVT_CONTROL *top,STATION **station, int * station_count,char *ontvheader) { SDThead sdth; SDTbody sdtb; SVCdesc desc; + LOGdesc logd; SVT_CONTROL *svtptr ; + STATION * pStation = *station; int rc ; int len = 0; int loop_len = 0; + int desc_len = 0; + char sid[80]; + int stationi = *station_count; + int i = 0; /* SDT */ len = parseSDThead(ptr, &sdth); ptr += len; - loop_len = sdth.section_length - (len - 3 + 4); // 3¤Ï¶¦Ḁ̈إåÀĹ 4¤ÏCRC + loop_len = sdth.section_length - (len - 3 + 4); // 3は共通ヘッダ長 4はCRC while(loop_len > 0) { len = parseSDTbody(ptr, &sdtb); + //printf("body %d - %d = %d\n",loop_len,len,loop_len - len); ptr += len; loop_len -= len; - parseSVCdesc(ptr, &desc); - - rc = serachid(top, sdtb.service_id); - if(rc == 0){ - svtptr = calloc(1, sizeof(SVT_CONTROL)); - svtptr->event_id = sdtb.service_id; - svtptr->original_network_id = sdth.original_network_id; - svtptr->transport_stream_id = sdth.transport_stream_id; - svtptr->event_id = sdtb.service_id; - memcpy(svtptr->servicename, desc.service_name, strlen(desc.service_name)); - enqueue_sdt(top, svtptr); + + desc_len = sdtb.descriptors_loop_length; + loop_len -= desc_len; + while(desc_len > 0) { + if ( *ptr == 0xCF ) { + len = parseLOGdesc(ptr, &logd); + ptr += len; + desc_len -= len; + + #if 0 + printf("LOG=%d,%d,%d,%d\n", + logd.logo_transmission_type, logd.logo_id, + logd.logo_version, logd.download_data_id); + #endif + + /* + logd.logo_transmission_type + 0x01 CDT 伝送方式1:CDT をダウンロードデータ識別で直接参照する場合 + 0x02 CDT 伝送方式2:CDT をロゴ識別を用いてダウンロードデータ識別を間接的に参照する場合 + 0x03 簡易ロゴ方式 + */ + if ( logd.logo_transmission_type != 0x01 ) continue; + for (i=0; ioriginal_network_id = sdth.original_network_id; + svtptr->transport_stream_id = sdth.transport_stream_id; + svtptr->event_id = sdtb.service_id; + memcpy(svtptr->servicename, desc.service_name, strlen(desc.service_name)); + if (desc.service_type == 1){ + enqueue_sdt(top, svtptr); + + sprintf(sid, "%s_%d", ontvheader, sdtb.service_id ); + for (i=0; i0){ + ptr += sdtb.descriptors_loop_length; + } +*/ } - + *station = pStation; + *station_count = stationi; + //printf("stationi %d -",stationi);//stationi==294で落ちる return; } +