# HG changeset patch # User Yoshiki Yazawa # Date 1340747483 -32400 # Node ID 9783d247d1c9cd1d4b46613cd9800cb726f5f6f6 # Parent 2dc994610477102ab7fa9c4f8fbc777fd8860662 imported Shaolin-san's NIT fix patch. The original patch can be obtained at http://microgroove.jp/shaolin/2010/09/a_tiny_patch_for_recpt1tssplitter_litec.html diff -r 2dc994610477 -r 9783d247d1c9 recpt1/tssplitter_lite.c --- a/recpt1/tssplitter_lite.c Wed Jun 27 06:42:55 2012 +0900 +++ b/recpt1/tssplitter_lite.c Wed Jun 27 06:51:23 2012 +0900 @@ -390,12 +390,14 @@ */ static int AnalyzePat(splitter *sp, unsigned char *buf) #if 0 + splitter *sp + unsigned char** pat, // [out] PAT 情報(再構築後) + unsigned char* pids, // [out] 出力対象 PID 情報 + char** sid_list, // [in] 出力対象サービス ID のリスト + unsigned char* pmt_pids, // [out] サービス ID に対応する PMT の PID + int* pmt_retain // [out] 残すPMTの数 + unsigned char* buf, // [in] 読み込んだバッファ - unsigned char** pat, // [out] PAT 情報(再構築後) - unsigned char* pids, // [out] 出力対象 PID 情報 - char** sid_list, // [in] 出力対象サービス ID のリスト - unsigned char* pmt_pids, // [out] サービス ID に対応する PMT の PID - int* pmt_retain // [out] 残すPMTの数 #endif { int pos[MAX_PID]; @@ -423,16 +425,26 @@ size = buf[7]; /* prescan SID/PMT */ - for(i = 17, j = 0; i < (size + 8) - 4; i = i + 4, j++) { + for(i = 13, j = 0; i < (size + 8) - 4; i = i + 4) { + + pid = GetPid(&buf[i+2]); + if(pid == 0x0010) + continue; + avail_sids[j] = (buf[i] << 8) + buf[i+1]; - sp->avail_pmts[j] = GetPid(&buf[i+2]); + sp->avail_pmts[j] = pid; + j++; } sp->num_pmts = j; // 対象チャンネル判定 /* size + 8 = パケット全長 */ /* 最終 4 バイトはCRCなので飛ばす */ - for(i = 17; i < (size + 8) - 4; i = i + 4) { + for(i = 13; i < (size + 8) - 4; i = i + 4) { + + pid = GetPid(&buf[i+2]); + if(pid == 0x0010) + continue; service_id = (buf[i] << 8) + buf[i+1]; p = sid_list; @@ -531,7 +543,12 @@ /* if sid has been specified but no sid found, fall back to all */ if(*sid_list && !sid_found) { - for(i = 17; i < (size + 8) - 4; i = i + 4) { + for(i = 13; i < (size + 8) - 4; i = i + 4) { + + pid = GetPid(&buf[i+2]); + if(pid==0x0010) + continue; + service_id = (buf[i] << 8) + buf[i+1]; pid = GetPid(&buf[i + 2]); *(pmt_pids+pid) = 1; @@ -551,11 +568,11 @@ fprintf(stderr, "\n"); fprintf(stderr, "Chosen sid =%s\n", chosen_sid); -#if 0 +#if 1 /* print PMTs */ fprintf(stderr, "Available PMT = "); for(k=0; k < sp->num_pmts; k++) - fprintf(stderr, "%d ", sp->avail_pmts[k].pid); + fprintf(stderr, "0x%x ", sp->avail_pmts[k]); fprintf(stderr, "\n"); #endif @@ -564,7 +581,7 @@ #if 0 int tc; for(tc=0; tc<188; tc++) - fprintf(stderr, "%02x ", *(pat+tc)); + fprintf(stderr, "%02x ", *(sp->pat+tc)); #endif } @@ -578,9 +595,11 @@ */ static int RecreatePat(splitter *sp, unsigned char *buf, int *pos) #if 0 + splitter *sp // [in/out] + unsigned char** pat, // [out] PAT 情報(再構築後) + unsigned char* pids, // [out] 出力対象 PID 情報 + unsigned char* buf, // [in] 読み込んだバッファ - unsigned char** pat, // [out] PAT 情報(再構築後) - unsigned char* pids, // [out] 出力対象 PID 情報 int *pos // [in] 取得対象 PMT のバッファ中の位置 #endif { @@ -594,10 +613,17 @@ // CRC 計算のためのデータ { // チャンネルによって変わらない部分 - for (i = 0; i < LENGTH_PAT_HEADER; i++) + for (i = 0; i < LENGTH_PAT_HEADER - 4; i++) { y[i] = buf[i + 5]; } + + // NIT + y[LENGTH_PAT_HEADER-4] = 0x00; + y[LENGTH_PAT_HEADER-3] = 0x00; + y[LENGTH_PAT_HEADER-2] = 0xe0; + y[LENGTH_PAT_HEADER-1] = 0x10; + // チャンネルによって変わる部分 for (i = 0; i < MAX_PID; i++) {