int inchar;
int i;
- /* sync¥Ð¥¤¥È¤Þ¤ÇÆɤßÈô¤Ð¤· */
+ /* syncバイトまで読み飛ばし */
if(rcount == 0) {
while((inchar = fgetc(in)) != EOF) {
if((inchar & 0xFF) == 0x47) {
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;
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 ||
*/
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) {
}
*/
- /* 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);
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; /* もう一回 */
}
}
}
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;
}
if(i < 188) {
- /* ¤½¤³¤«¤éºÆÆɤ߹þ¤ß¤·¤ÆÍߤ·¤¤¤Î¤Çseek */
+ /* そこから再読み込みして欲しいのでseek */
//fseek(in, (188 - i) * -1, SEEK_CUR);
roffset = i;
memmove(buf, buf + i, 188 - i);
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);
/*
}
*/
- /* ¶½Ì£¤Î¤¢¤ë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");
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; /* 残り処理へ */
}
}
}
//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;
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;