Mailing List archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[mpeg2] Setting Audio, Video, and PCR PIDs



Hi all,

the attached patch permits to specify the PIDs to be used, instead of
using the hardcoded ones. I lightly tested it, and everything seems to
work.

I added three fields to the mpeg_params structure, I hope it is ok...
The I got the code for computing the CRC32 from ffmpeg, that is licensed
under LGPL, hence I assume it is ok... I don't know if the authors' list
at the beginning of the file must be updated (I think the crc32 code and
table is by Fabrice Bellard). If yes, let me know, and I'll send an
updated patch. Otherwise, if you alread have some crc32 code... ;-)

The patch also fixes two things that I believe are typos:
1) if (params->bitrate_mode == MPEG_BITRATE_MODE_MAX &&
                    params->video_target_bitrate <=
params->video_max_bitrate)
does not seem to be correct... Maybe is should be
if (params->bitrate_mode == MPEG_BITRATE_MODE_VBR &&
                    params->video_target_bitrate >=
params->video_max_bitrate)

2) the check on params->video_max_bitrate was performed even in the CBR
case

I apologize if I misunderstood the code...


Now, I am thinking about adding code for setting the video format (it is
currently hardcoded to D1). Is it ok to add yet another field to
mpeg_params?

			Thanks,
				Luca
-- 
_____________________________________________________________________________
Copy this in your signature, if you think it is important:
                               N O    W A R ! ! !
diff -urp ../linux-2.4.23/drivers/media/video/saa6752hs.c drivers/media/video/saa6752hs.c
--- ../linux-2.4.23/drivers/media/video/saa6752hs.c	2004-02-10 11:25:16.000000000 +0100
+++ drivers/media/video/saa6752hs.c	2004-05-13 11:52:59.000000000 +0200
@@ -26,6 +26,54 @@ MODULE_DESCRIPTION("device driver for sa
 MODULE_AUTHOR("Andrew de Quincey");
 MODULE_LICENSE("GPL");
 
+
+
+static const unsigned long int crc_table[256] = {
+        0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,
+        0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
+        0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7,
+        0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
+        0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3,
+        0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
+        0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef,
+        0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
+        0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb,
+        0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
+        0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,
+        0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
+        0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4,
+        0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
+        0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08,
+        0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
+        0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc,
+        0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
+        0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050,
+        0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
+        0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,
+        0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
+        0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1,
+        0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
+        0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5,
+        0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
+        0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9,
+        0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
+        0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd,
+        0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
+        0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,
+        0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
+        0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2,
+        0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
+        0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e,
+        0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
+        0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a,
+        0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
+        0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676,
+        0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
+        0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,
+        0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
+        0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
+};
+
 static struct i2c_driver driver;
 static struct i2c_client client_template;
 
@@ -111,6 +159,21 @@ static struct mpeg_params mpeg_params_te
   
 /* ---------------------------------------------------------------------- */
 
+static u32 crc32_compute(const u8 *data, int len)
+{
+  int i;
+  u32 crc = 0xffffffff;
+
+  for (i = 0; i < len; i++) {
+    crc = (crc << 8) ^ crc_table[((crc >> 24) ^ *data++) & 0xff];
+  }
+
+  return crc;
+}
+
+
+
+
 
 static int saa6752hs_chip_command(struct i2c_client* client,
 				  enum saa6752hs_command command)
@@ -233,22 +296,40 @@ static int saa6752hs_init(struct i2c_cli
 {  
 	unsigned char buf[3];
 	void *data;
+	u32 crc;
+	static unsigned int pcr_pid = 260, video_pid = 256 , audio_pid = 259;
 
 	// check the bitrate parameters first
 	if (params != NULL) {
 		if (params->bitrate_mode >= MPEG_BITRATE_MODE_MAX)
 			return -EINVAL;
-		if (params->video_target_bitrate >= MPEG_VIDEO_TARGET_BITRATE_MAX)
-			return -EINVAL;
-  		if (params->video_max_bitrate >= MPEG_VIDEO_MAX_BITRATE_MAX)
+  		if (params->video_target_bitrate >= MPEG_VIDEO_MAX_BITRATE_MAX)
 			return -EINVAL;
 		if (params->audio_bitrate >= MPEG_AUDIO_BITRATE_MAX)
 			return -EINVAL;
 		if (params->total_bitrate >= MPEG_TOTAL_BITRATE_MAX)
         		return -EINVAL;
-		if (params->bitrate_mode         == MPEG_BITRATE_MODE_MAX &&
-		    params->video_target_bitrate <= params->video_max_bitrate)
-			return -EINVAL; 
+		if (params->bitrate_mode         == MPEG_BITRATE_MODE_VBR &&
+		    params->video_target_bitrate >= params->video_max_bitrate)
+			return -EINVAL;
+		if (params->bitrate_mode         == MPEG_BITRATE_MODE_VBR &&
+		    params->video_max_bitrate >= MPEG_VIDEO_TARGET_BITRATE_MAX)
+			return -EINVAL;
+		if (params->pcr_pid != 0) {
+			if (params->pcr_pid > MPEG_PID_MAX)
+        			return -EINVAL;
+			pcr_pid = params->pcr_pid;
+		}
+		if (params->video_pid != 0) {
+			if (params->video_pid > MPEG_PID_MAX)
+        			return -EINVAL;
+			video_pid = params->video_pid;
+		}
+		if (params->audio_pid != 0) {
+			if (params->audio_pid > MPEG_PID_MAX)
+        			return -EINVAL;
+			audio_pid = params->audio_pid;
+		}
 	}
   
     	// Set GOP structure {3, 13}
@@ -277,12 +358,6 @@ static int saa6752hs_init(struct i2c_cli
 	buf[1] = 0x05;
 	i2c_master_send(client,buf,2);
   
-    	// Set Audio PID {0x103}
-	buf[0] = 0xC1;
-	buf[1] = 0x01;
-	buf[2] = 0x03;
-	i2c_master_send(client,buf,3);
-  
         // setup bitrate settings
 	data = i2c_get_clientdata(client);
 	if (params) {
@@ -292,10 +367,44 @@ static int saa6752hs_init(struct i2c_cli
 		// parameters were not supplied. use the previous set
    		saa6752hs_set_bitrate(client, (struct mpeg_params*) data);
 	}
-	  
+
+	/* compute CRCs */
+	crc = crc32_compute(&PAT[7], sizeof(PAT) - 7 - 4);
+	PAT[sizeof(PAT) - 4] = (crc >> 24) & 0xFF;
+	PAT[sizeof(PAT) - 3] = (crc >> 16) & 0xFF;
+	PAT[sizeof(PAT) - 2] = (crc >> 8) & 0xFF;
+	PAT[sizeof(PAT) - 1] = crc & 0xFF;
+
+	PMT[15] = 0xE0 | ((pcr_pid >> 8) && 0x0F);
+	PMT[16] = pcr_pid & 0xFF;
+	PMT[20] = 0xE0 | ((video_pid >> 8) && 0x0F);
+	PMT[21] = video_pid & 0xFF;
+	PMT[25] = 0xE0 | ((audio_pid >> 8) && 0x0F);
+	PMT[26] = audio_pid & 0xFF;
+	crc = crc32_compute(&PMT[7], sizeof(PMT) - 7 - 4);
+	PMT[sizeof(PMT) - 4] = (crc >> 24) & 0xFF;
+	PMT[sizeof(PMT) - 3] = (crc >> 16) & 0xFF;
+	PMT[sizeof(PMT) - 2] = (crc >> 8) & 0xFF;
+	PMT[sizeof(PMT) - 1] = crc & 0xFF;
+    	// Set Audio PID
+	buf[0] = 0xC1;
+	buf[1] = (audio_pid >> 8) & 0xFF;
+	buf[2] = audio_pid & 0xFF;
+	i2c_master_send(client,buf,3);
+	// Set Video PID
+	buf[0] = 0xC0;
+	buf[1] = (video_pid >> 8) & 0xFF;
+	buf[2] = video_pid & 0xFF;
+	i2c_master_send(client,buf,3);
+ 	// Set PCR PID
+	buf[0] = 0xC4;
+	buf[1] = (pcr_pid >> 8) & 0xFF;
+	buf[2] = pcr_pid & 0xFF;
+	i2c_master_send(client,buf,3);
+
 	// Send SI tables
-  	i2c_master_send(client,PAT,sizeof(PAT));
-  	i2c_master_send(client,PMT,sizeof(PMT));
+	i2c_master_send(client,PAT,sizeof(PAT));
+	i2c_master_send(client,PMT,sizeof(PMT));
 	  
 	// mute then unmute audio. This removes buzzing artefacts
 	buf[0] = 0xa4;
diff -urp ../linux-2.4.23/drivers/media/video/saa6752hs.h drivers/media/video/saa6752hs.h
--- ../linux-2.4.23/drivers/media/video/saa6752hs.h	2004-02-10 11:25:16.000000000 +0100
+++ drivers/media/video/saa6752hs.h	2004-05-13 10:10:03.000000000 +0200
@@ -38,13 +38,17 @@ enum mpeg_audio_bitrate {
 #define MPEG_VIDEO_TARGET_BITRATE_MAX 27000
 #define MPEG_VIDEO_MAX_BITRATE_MAX 27000
 #define MPEG_TOTAL_BITRATE_MAX 27000
-    
+#define MPEG_PID_MAX ((1 << 14) - 1)
+ 
 struct mpeg_params {
 	enum mpeg_bitrate_mode bitrate_mode;
 	unsigned int video_target_bitrate;
 	unsigned int video_max_bitrate; // only used for VBR
 	enum mpeg_audio_bitrate audio_bitrate;
 	unsigned int total_bitrate;
+	unsigned int video_pid;
+	unsigned int audio_pid;
+	unsigned int pcr_pid;
 };
 
 #define MPEG_SETPARAMS             _IOW('6',100,struct mpeg_params)

Home | Main Index | Thread Index