X-Git-Url: http://git.osdn.net/view?p=rec10%2Frec10-git.git;a=blobdiff_plain;f=dist%2Ftrunk%2Ftstools%2Fepgdump%2Fts.c;h=7036bc37bf3e0f9230ab38f21c7c728c2cfafa22;hp=c6cac1c5a10ec51bed92d4bd41d474c8b7360940;hb=d63ca135202a679bd918561b65e806966f94546e;hpb=13e65e890a6dd60705bacc22b893ce5c899b7001 diff --git a/dist/trunk/tstools/epgdump/ts.c b/dist/trunk/tstools/epgdump/ts.c index c6cac1c..7036bc3 100755 --- a/dist/trunk/tstools/epgdump/ts.c +++ b/dist/trunk/tstools/epgdump/ts.c @@ -22,7 +22,7 @@ SECcache *readTS(FILE *in, SECcache secs[], int size) { int inchar; int i; - /* sync¥Ð¥¤¥È¤Þ¤ÇÆɤßÈô¤Ð¤· */ + /* syncバイトまで読み飛ばし */ if(rcount == 0) { while((inchar = fgetc(in)) != EOF) { if((inchar & 0xFF) == 0x47) { @@ -38,9 +38,9 @@ SECcache *readTS(FILE *in, SECcache secs[], int size) { retry: - /* Ì᤹¤Ù¤­»Ä¤ê¤¬¤¢¤ë¤«? */ + /* 戻すべき残りがあるか? */ if(ridx >= 0 && secs[ridx].cont) { - /* ¥Ð¥Ã¥Õ¥¡¥Á¥§¥Ã¥¯ */ + /* バッファチェック */ if((secs[ridx].cur.payload[secs[ridx].curlen] & 0xFF) == 0xFF) { secs[ridx].cont = 0; secs[ridx].seclen = 0; @@ -48,14 +48,14 @@ retry: secs[ridx].curlen = 0; } else { len = secs[ridx].cur.payloadlen - secs[ridx].curlen; - /* Á´ÉôÀßÄêºÑ¤ß¥Á¥§¥Ã¥¯ */ + /* 全部設定済みチェック */ if(len == 0) { secs[ridx].cont = 0; secs[ridx].seclen = 0; secs[ridx].setlen = 0; secs[ridx].curlen = 0; } else { - /* ¤³¤³¤Çseclen¤¬¸Ù¤ë¤è¤¦¤ËTSʬ³ä¤µ¤ì¤Æ¤¤¤ë¤Èº¤¤ë¤Ê @@ + /* ここでseclenが跨るようにTS分割されていると困るな @@ if(secs[ridx].pid == 0x12) { int check = secs[ridx].cur.payload[secs[ridx].curlen] & 0xFF; if(!(check == 0x4E || @@ -67,7 +67,14 @@ retry: */ boff = 12; - secs[ridx].seclen = getBit(&secs[ridx].cur.payload[secs[ridx].curlen], &boff, 12) + 3; // ¥Ø¥Ã¥À + secs[ridx].seclen = getBit(&secs[ridx].cur.payload[secs[ridx].curlen], &boff, 12) + 3; // ヘッダ + /* + if(secs[ridx].seclen > MAXSECLEN){ + // セクションが MAXSECLEN より大きい時はこのセクションをスキップ + secs[ridx].cont = 0; + goto retry; + } + */ /* if(secs[ridx].seclen == 2334) { @@ -75,13 +82,13 @@ retry: } */ - /* TS¥Ç¡¼¥¿Ä¹-ÀßÄêºÑ¤ß¥Ç¡¼¥¿Ä¹ */ + /* TSデータ長-設定済みデータ長 */ if(secs[ridx].seclen > len) { memcpy(secs[ridx].buf, &secs[ridx].cur.payload[secs[ridx].curlen], len); secs[ridx].setlen = len; secs[ridx].curlen = 0; secs[ridx].cont = 1; - /* ¼¡¤Î¥ì¥³¡¼¥ÉÆɤ߹þ¤ß */ + /* 次のレコード読み込み */ } else { memcpy(secs[ridx].buf, &secs[ridx].cur.payload[secs[ridx].curlen], secs[ridx].seclen); @@ -89,11 +96,11 @@ retry: secs[ridx].curlen += secs[ridx].seclen; secs[ridx].cont = 1; - /* CRC¤Î¥Á¥§¥Ã¥¯ */ + /* CRCのチェック */ if(checkcrc(&(secs[ridx]))) { - return &(secs[ridx]); /* Ìá¤ë */ + return &(secs[ridx]); /* 戻る */ } - goto retry; /* ¤â¤¦°ì²ó */ + goto retry; /* もう一回 */ } } } @@ -102,14 +109,14 @@ retry: int roffset = 0; while(1) { if(fread(buf+roffset, 188-roffset, 1, in) != 1) { - /* »Ä¤ê¤Î½èÍý? */ + /* 残りの処理? */ return NULL; } roffset = 0; rcount++; if((buf[0] & 0xFF) != 0x47) { - /* ºÇ½é¤ÏbufÃæ¤Ë0x47¤¬¤¢¤ë¤«¥Á¥§¥Ã¥¯ */ + /* 最初はbuf中に0x47があるかチェック */ for(i = 1; i < 188; i++) { if((buf[i] & 0xFF) == 0x47) { break; @@ -117,7 +124,7 @@ retry: } if(i < 188) { - /* ¤½¤³¤«¤éºÆÆɤ߹þ¤ß¤·¤ÆÍߤ·¤¤¤Î¤Çseek */ + /* そこから再読み込みして欲しいのでseek */ //fseek(in, (188 - i) * -1, SEEK_CUR); roffset = i; memmove(buf, buf + i, 188 - i); @@ -197,16 +204,17 @@ retry: shall be '1', indicating that the first byte of the payload of this Transport Stream packet carries the pointer_field. */ if(pk.payload_unit_start_indicator == 1) { - /* pointer_field¤Ï¤¤¤é¤Ê¤¤ */ + /* pointer_fieldはいらない */ payptr += 1; pk.payloadlen -= 1; } + memset(pk.payload, 0xFF, sizeof(pk.payload)); -#if 1 /* 07/07/2009 add: */ + /* 07/07/2009 add: */ + //if((pk.payloadlen <= 0) || (pk.payloadlen > sizeof(pk.payload))){ if( pk.payloadlen > sizeof(pk.payload) ){ continue; } -#endif memcpy(pk.payload, payptr, pk.payloadlen); /* @@ -219,15 +227,22 @@ retry: } */ - /* ¶½Ì£¤Î¤¢¤ëpid¤«³Îǧ */ + /* 興味のあるpidか確認 */ for(int i = 0;i < size; i++) { if(secs[i].pid == pk.pid) { secs[i].cur = pk; - /* ÅÓÃæ½èÍýÃ椫ºÇ½é¤«? */ + /* 途中処理中か最初か? */ if(!secs[i].cont) { - /* ºÇ½é ¥»¥¯¥·¥ç¥óŤòÄ´¤Ù¤ë */ + /* 最初 セクション長を調べる */ boff = 12; - secs[i].seclen = getBit(secs[i].cur.payload, &boff, 12) + 3; // ¥Ø¥Ã¥À; + secs[i].seclen = getBit(secs[i].cur.payload, &boff, 12) + 3; // ヘッダ; + /* + if(secs[i].seclen > MAXSECLEN){ + // セクション長が MAXSECLEN より長いときはこのセクションをスキップ + secs[i].cont = 0; + goto retry; + } + */ /* if(secs[i].seclen == 2334) { printf("aa"); @@ -245,32 +260,32 @@ retry: secs[i].curlen = secs[i].seclen; secs[i].cont = 1; ridx = i; - /* CRC¤Î¥Á¥§¥Ã¥¯ */ + /* CRCのチェック */ if(checkcrc(&(secs[ridx]))) { - return &(secs[i]); /* ¼è¤ê¹ç¤¨¤ºÌá¤ë */ + return &(secs[i]); /* 取り合えず戻る */ } - goto retry; /* »Ä¤ê½èÍý¤Ø */ + goto retry; /* 残り処理へ */ } - /* ¥»¥¯¥·¥ç¥óĹ-ÀßÄêºÑ¤ßĹ */ + /* セクション長-設定済み長 */ len = secs[i].seclen - secs[i].setlen; if(len > secs[i].cur.payloadlen) { - /* Á´ÂΞÁ÷ */ + /* 全体転送 */ memcpy(&secs[i].buf[secs[i].setlen], secs[i].cur.payload, secs[i].cur.payloadlen); secs[i].setlen += secs[i].cur.payloadlen; continue; } - /* ¥»¥¯¥·¥ç¥óŤλĤê¤òÀßÄê */ + /* セクション長の残りを設定 */ memcpy(&secs[i].buf[secs[i].setlen], secs[i].cur.payload, len); secs[i].setlen = secs[i].seclen; secs[i].curlen += len; secs[i].cont = 1; ridx = i; - /* CRC¤Î¥Á¥§¥Ã¥¯ */ + /* CRCのチェック */ if(checkcrc(&(secs[ridx]))) { return &(secs[i]); } - goto retry; /* »Ä¤ê½èÍý¤Ø */ + goto retry; /* 残り処理へ */ } } } @@ -278,7 +293,7 @@ retry: //return NULL; } -/* BonTest/TsStream.cpp¤«¤é¤Î¥Ñ¥¯¥ê */ +/* BonTest/TsStream.cppからのパクリ */ unsigned int CalcCrc(unsigned int crc, unsigned char *buf, int len) { unsigned int c = crc; int n; @@ -312,17 +327,16 @@ unsigned int CalcCrc(unsigned int crc, unsigned char *buf, int len) { int checkcrc(SECcache *secs) { -#if 1 /* 07/07/2009 add: °Û¾ï¾õÂÖ²óÈò¤Î¤¿¤á */ - /* ¥»¥¯¥·¥ç¥óºÇÂçŤòĶ¤¨¤ë¤³¤È¤Ê¤É¤¢¤êÆÀ¤Ê¤¤¤Ï¤º¤À¤¬... */ + /* 07/07/2009 add: 異常状態回避のため */ + /* セクション最大長を超えることなどあり得ないはずだが... */ if( secs->seclen > MAXSECLEN ){ - /* ¤è¤¯Ê¬¤«¤é¤ó¤Î¤ÇÇË´þ¤·¤Æ¤ä¤ë */ + /* よく分からんので破棄してやる */ return 0; } -#endif - /* ¥»¥¯¥·¥ç¥ó¤Î½ª¤ê¤ËÃÖ¤«¤ì¤ë4¥Ð¥¤¥È¤ÎCRC32¤Ï¡¢ - CRC·×»»¤Î·ë²Ì0¤Ë¤Ê¤ë¤è¤¦¤ËÀßÄꤵ¤ì¤ë¡£ - Ãͤ¬È¯À¸¤·¤¿¾ì¹ç¤Ï¡¢¥¨¥é¡¼¤Ê¤Î¤ÇÂоݳ°¤Ë¤¹¤ë */ + /* セクションの終りに置かれる4バイトのCRC32は、 + CRC計算の結果0になるように設定される。 + 値が発生した場合は、エラーなので対象外にする */ if(CalcCrc(0xffffffffU, secs->buf, secs->seclen)) { // fprintf(stderr, "tblid:0x%x CRC error\n", secs->buf[0]); return 0;