OSDN Git Service

update epgdump for dist.
[rec10/rec10-git.git] / dist / trunk / tstools / epgdump / ts.c
index c6cac1c..7036bc3 100755 (executable)
@@ -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) {
-               /* ¥Ð¥Ã¥Õ¥¡¥Á¥§¥Ã¥¯ */
+               /* ã\83\90ã\83\83ã\83\95ã\82¡ã\83\81ã\82§ã\83\83ã\82¯ */
                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;
-                       /* Á´ÉôÀßÄêºÑ¤ß¥Á¥§¥Ã¥¯ */
+                       /* å\85¨é\83¨è¨­å®\9aæ¸\88ã\81¿ã\83\81ã\82§ã\83\83ã\82¯ */
                        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ã\81®ã\83\81ã\82§ã\83\83ã\82¯ */
                                        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¤¬¤¢¤ë¤«¥Á¥§¥Ã¥¯ */
+                       /* æ\9c\80å\88\9dã\81¯buf中ã\81«0x47ã\81\8cã\81\82ã\82\8bã\81\8bã\83\81ã\82§ã\83\83ã\82¯ */
                        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ã\81®ã\83\81ã\82§ã\83\83ã\82¯ */
                                        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ã\81®ã\83\81ã\82§ã\83\83ã\82¯ */
                                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;