changeset 132:9783d247d1c9

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
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Wed, 27 Jun 2012 06:51:23 +0900
parents 2dc994610477
children b14397800eae
files recpt1/tssplitter_lite.c
diffstat 1 files changed, 41 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- 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++)
 		{