On Sunday 15 Aug 2004 15:48, Alfred Zastrow wrote: > Samuel Rivas schrieb: > > I've upgraded my system and I got a couple of problems: > > > > I applied the Kraxel patches in a 2.6.7 kernel for using the 0.2.12 > > version of the saa7134 driver. I have a MPEX with no tuner card > > (card=18 parameter). > > > > Now my video is muted and it contains no sound packets (though audio > > stream is listed in the PMT). I tried to turn off the mute control, but > > the video kept soundless. Brightness, contrast, hue, etc controls worked > > as expected. > > > > The weird thing is I thought this had worked since my first trial was > > an apparent success, I could hear sound in the video stream since I > > shutdown the machine. The next time I boot the system the card was muted > > (as expected) but "unmuting" it not longer worked. This was with the 2.11 > > version in an unpatched kernel, after a lot of trials I decided to have a > > stab at compiling the latest version, but it didn't work. > > > > I suppose I'm doing some dumb thing, but I'm totally dazed now :(. Is > > there anybody with such a card and such a driver version working as > > expected? > > > > The other problem is the transport stream I get is not correct, the > > coninuity_counter field skips values from time to time for the video > > stream (I can't know if this is true for the audio stream yet). > > Did you get an answer or found an solution. I have the same problem with > the MPEX tuner card. Under 2.4.26 it worked with sound and under 2.6.7 > it is absolutly silent. :-(
Hi, I've just tried my MPEX under 2.6.8.1 - no problems here. I *AM* using my updated patch (which I have attached) but I wouldn't have thought that would fix sound muting problems. The updated patch allows for greater control over encoding parameters. I've submitted it to Gerd Knorr.
--- linux-2.6.8.1.orig/drivers/media/video/saa7134/saa6752hs.c Sat Aug 14 11:56:23 2004 +++ linux-2.6.8.1/drivers/media/video/saa7134/saa6752hs.c Tue Aug 17 02:22:43 2004 @@ -11,6 +11,7 @@ #include <linux/types.h> #include <linux/videodev.h> #include <linux/init.h> +#include <linux/crc32.h> #include <media/id.h> #include <media/saa6752hs.h> @@ -36,7 +37,7 @@ SAA6752HS_COMMAND_RECONFIGURE = 4, SAA6752HS_COMMAND_SLEEP = 5, SAA6752HS_COMMAND_RECONFIGURE_FORCE = 6, - + SAA6752HS_COMMAND_MAX }; @@ -46,67 +47,73 @@ static u8 PAT[] = { 0xc2, // i2c register 0x00, // table number for encoder - + 0x47, // sync 0x40, 0x00, // transport_error_indicator(0), payload_unit_start(1), transport_priority(0), pid(0) 0x10, // transport_scrambling_control(00), adaptation_field_control(01), continuity_counter(0) - + 0x00, // PSI pointer to start of table - + 0x00, // tid(0) 0xb0, 0x0d, // section_syntax_indicator(1), section_length(13) - + 0x00, 0x01, // transport_stream_id(1) - + 0xc1, // version_number(0), current_next_indicator(1) - + 0x00, 0x00, // section_number(0), last_section_number(0) 0x00, 0x01, // program_number(1) - - 0xe0, 0x10, // PMT PID(0x10) - 0x76, 0xf1, 0x44, 0xd1 // CRC32 + 0xe0, 0x00, // PMT PID + + 0x00, 0x00, 0x00, 0x00 // CRC32 }; static u8 PMT[] = { 0xc2, // i2c register 0x01, // table number for encoder - + 0x47, // sync - 0x40, 0x10, // transport_error_indicator(0), payload_unit_start(1), transport_priority(0), pid(0x10) + 0x40, 0x00, // transport_error_indicator(0), payload_unit_start(1), transport_priority(0), pid 0x10, // transport_scrambling_control(00), adaptation_field_control(01), continuity_counter(0) - + 0x00, // PSI pointer to start of table - + 0x02, // tid(2) 0xb0, 0x17, // section_syntax_indicator(1), section_length(23) 0x00, 0x01, // program_number(1) - + 0xc1, // version_number(0), current_next_indicator(1) - + 0x00, 0x00, // section_number(0), last_section_number(0) - - 0xe1, 0x04, // PCR_PID (0x104) - + + 0xe0, 0x00, // PCR_PID + 0xf0, 0x00, // program_info_length(0) - - 0x02, 0xe1, 0x00, 0xf0, 0x00, // video stream type(2), pid(0x100) - 0x04, 0xe1, 0x03, 0xf0, 0x00, // audio stream type(4), pid(0x103) - - 0xa1, 0xca, 0x0f, 0x82 // CRC32 + + 0x02, 0xe0, 0x00, 0xf0, 0x00, // video stream type(2), pid + 0x04, 0xe0, 0x00, 0xf0, 0x00, // audio stream type(4), pid + + 0x00, 0x00, 0x00, 0x00 // CRC32 }; static struct mpeg_params mpeg_params_template = { - .bitrate_mode = MPEG_BITRATE_MODE_CBR, - .video_target_bitrate = 5000, + .video_bitrate_mode = MPEG_VIDEO_BITRATE_MODE_VBR, + .video_target_bitrate = 4000, + .video_max_bitrate = 6000, .audio_bitrate = MPEG_AUDIO_BITRATE_256, - .total_bitrate = 6000, + .total_bitrate = 7000, + .pmt_pid = 16, + .video_pid = 260, + .audio_pid = 256, + .pcr_pid = 259, + .video_format = MPEG_VIDEO_FORMAT_D1, }; - + /* ---------------------------------------------------------------------- */ @@ -122,11 +129,11 @@ case SAA6752HS_COMMAND_RESET: buf[0] = 0x00; break; - + case SAA6752HS_COMMAND_STOP: buf[0] = 0x03; break; - + case SAA6752HS_COMMAND_START: buf[0] = 0x02; break; @@ -134,11 +141,11 @@ case SAA6752HS_COMMAND_PAUSE: buf[0] = 0x04; break; - + case SAA6752HS_COMMAND_RECONFIGURE: buf[0] = 0x05; break; - + case SAA6752HS_COMMAND_SLEEP: buf[0] = 0x06; break; @@ -146,11 +153,11 @@ case SAA6752HS_COMMAND_RECONFIGURE_FORCE: buf[0] = 0x07; break; - + default: - return -EINVAL; + return -EINVAL; } - + // set it and wait for it to be so i2c_master_send(client, buf, 1); timeout = jiffies + HZ * 3; @@ -166,7 +173,7 @@ status = -ETIMEDOUT; break; } - + // wait a bit set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(HZ/100); @@ -175,7 +182,7 @@ // delay a bit to let encoder settle set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(HZ/20); - + // done return status; } @@ -185,14 +192,14 @@ struct mpeg_params* params) { u8 buf[3]; - + // set the bitrate mode buf[0] = 0x71; - buf[1] = params->bitrate_mode; + buf[1] = params->video_bitrate_mode; i2c_master_send(client, buf, 2); - + // set the video bitrate - if (params->bitrate_mode == MPEG_BITRATE_MODE_VBR) { + if (params->video_bitrate_mode == MPEG_VIDEO_BITRATE_MODE_VBR) { // set the target bitrate buf[0] = 0x80; buf[1] = params->video_target_bitrate >> 8; @@ -211,97 +218,180 @@ buf[2] = params->video_target_bitrate & 0xff; i2c_master_send(client, buf, 3); } - + // set the audio bitrate buf[0] = 0x94; buf[1] = params->audio_bitrate; i2c_master_send(client, buf, 2); - + // set the total bitrate buf[0] = 0xb1; buf[1] = params->total_bitrate >> 8; buf[2] = params->total_bitrate & 0xff; i2c_master_send(client, buf, 3); - + return 0; } static int saa6752hs_init(struct i2c_client* client, struct mpeg_params* params) -{ +{ unsigned char buf[3]; - void *data; + struct mpeg_params* cachedParams; + u32 crc; + unsigned char localPAT[256]; + unsigned char localPMT[256]; + + // grab the previous set of parameters + cachedParams = (struct mpeg_params*) i2c_get_clientdata(client); // check the bitrate parameters first if (params != NULL) { - if (params->bitrate_mode >= MPEG_BITRATE_MODE_MAX) + unsigned int pmt_pid = 0, pcr_pid = 0, video_pid = 0 , audio_pid = 0; + + // check supplied params are valid + if (params->video_format >= MPEG_VIDEO_FORMAT_MAX) return -EINVAL; - if (params->video_target_bitrate >= MPEG_VIDEO_TARGET_BITRATE_MAX) + if (params->video_bitrate_mode >= MPEG_VIDEO_BITRATE_MODE_MAX) return -EINVAL; - if (params->video_max_bitrate >= MPEG_VIDEO_MAX_BITRATE_MAX) + if (params->video_target_bitrate >= MPEG_VIDEO_TARGET_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->video_bitrate_mode == MPEG_VIDEO_BITRATE_MODE_VBR) { + if (params->video_max_bitrate >= MPEG_VIDEO_MAX_BITRATE_MAX) + return -EINVAL; + if (params->video_target_bitrate >= params->video_max_bitrate) + return -EINVAL; + } + if (params->pmt_pid != 0) { + if (params->pmt_pid > MPEG_PID_MAX) + return -EINVAL; + pmt_pid = params->pmt_pid; + } else { + pmt_pid = cachedParams->pmt_pid; + } + if (params->pcr_pid != 0) { + if (params->pcr_pid > MPEG_PID_MAX) + return -EINVAL; + pcr_pid = params->pcr_pid; + } else { + pcr_pid = cachedParams->pcr_pid; + } + if (params->video_pid != 0) { + if (params->video_pid > MPEG_PID_MAX) + return -EINVAL; + video_pid = params->video_pid; + } else { + video_pid = cachedParams->video_pid; + } + if (params->audio_pid != 0) { + if (params->audio_pid > MPEG_PID_MAX) + return -EINVAL; + audio_pid = params->audio_pid; + } else { + audio_pid = cachedParams->audio_pid; + } + + // update cache + memcpy(cachedParams, params, sizeof(struct mpeg_params)); + cachedParams->pmt_pid = pmt_pid; + cachedParams->pcr_pid = pcr_pid; + cachedParams->video_pid = video_pid; + cachedParams->audio_pid = audio_pid; } - - // Set GOP structure {3, 13} + + // set bitrate + saa6752hs_set_bitrate(client, cachedParams); + + // Set GOP structure {3, 13} buf[0] = 0x72; buf[1] = 0x03; buf[2] = 0x0D; i2c_master_send(client,buf,3); - + // Set minimum Q-scale {4} buf[0] = 0x82; buf[1] = 0x04; i2c_master_send(client,buf,2); - + // Set maximum Q-scale {12} buf[0] = 0x83; buf[1] = 0x0C; i2c_master_send(client,buf,2); - + // Set Output Protocol buf[0] = 0xD0; buf[1] = 0x01; i2c_master_send(client,buf,2); - + // Set video output stream format {TS} buf[0] = 0xB0; buf[1] = 0x05; i2c_master_send(client,buf,2); - - // Set Audio PID {0x103} + + /* compute PAT */ + memcpy(localPAT, PAT, sizeof(PAT)); + localPAT[17] = 0xe0 | ((cachedParams->pmt_pid >> 8) & 0x0f); + localPAT[18] = cachedParams->pmt_pid & 0xff; + crc = crc32_be(~0, &localPAT[7], sizeof(PAT) - 7 - 4); + localPAT[sizeof(PAT) - 4] = (crc >> 24) & 0xFF; + localPAT[sizeof(PAT) - 3] = (crc >> 16) & 0xFF; + localPAT[sizeof(PAT) - 2] = (crc >> 8) & 0xFF; + localPAT[sizeof(PAT) - 1] = crc & 0xFF; + + /* compute PMT */ + memcpy(localPMT, PMT, sizeof(PMT)); + localPMT[3] = 0x40 | ((cachedParams->pmt_pid >> 8) & 0x0f); + localPMT[4] = cachedParams->pmt_pid & 0xff; + localPMT[15] = 0xE0 | ((cachedParams->pcr_pid >> 8) & 0x0F); + localPMT[16] = cachedParams->pcr_pid & 0xFF; + localPMT[20] = 0xE0 | ((cachedParams->video_pid >> 8) & 0x0F); + localPMT[21] = cachedParams->video_pid & 0xFF; + localPMT[25] = 0xE0 | ((cachedParams->audio_pid >> 8) & 0x0F); + localPMT[26] = cachedParams->audio_pid & 0xFF; + crc = crc32_be(~0, &localPMT[7], sizeof(PMT) - 7 - 4); + localPMT[sizeof(PMT) - 4] = (crc >> 24) & 0xFF; + localPMT[sizeof(PMT) - 3] = (crc >> 16) & 0xFF; + localPMT[sizeof(PMT) - 2] = (crc >> 8) & 0xFF; + localPMT[sizeof(PMT) - 1] = crc & 0xFF; + + // Set Audio PID buf[0] = 0xC1; - buf[1] = 0x01; - buf[2] = 0x03; + buf[1] = (cachedParams->audio_pid >> 8) & 0xFF; + buf[2] = cachedParams->audio_pid & 0xFF; i2c_master_send(client,buf,3); - - // setup bitrate settings - data = i2c_get_clientdata(client); - if (params) { - saa6752hs_set_bitrate(client, params); - memcpy(data, params, sizeof(struct mpeg_params)); - } else { - // parameters were not supplied. use the previous set - saa6752hs_set_bitrate(client, (struct mpeg_params*) data); - } - + + // Set Video PID + buf[0] = 0xC0; + buf[1] = (cachedParams->video_pid >> 8) & 0xFF; + buf[2] = cachedParams->video_pid & 0xFF; + i2c_master_send(client,buf,3); + + // Set PCR PID + buf[0] = 0xC4; + buf[1] = (cachedParams->pcr_pid >> 8) & 0xFF; + buf[2] = cachedParams->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,localPAT,sizeof(PAT)); + i2c_master_send(client,localPMT,sizeof(PMT)); + // mute then unmute audio. This removes buzzing artefacts buf[0] = 0xa4; buf[1] = 1; i2c_master_send(client, buf, 2); buf[1] = 0; i2c_master_send(client, buf, 2); - + + // Set video format + buf[0] = 0x41; + buf[1] = cachedParams->video_format; + i2c_master_send(client, buf, 2); + // start it going saa6752hs_chip_command(client, SAA6752HS_COMMAND_START); @@ -322,14 +412,14 @@ return -ENOMEM; memcpy(client,&client_template,sizeof(struct i2c_client)); strlcpy(client->name, "saa6752hs", sizeof(client->name)); - + if (NULL == (params = kmalloc(sizeof(struct mpeg_params), GFP_KERNEL))) return -ENOMEM; memcpy(params,&mpeg_params_template,sizeof(struct mpeg_params)); i2c_set_clientdata(client, params); i2c_attach_client(client); - + return 0; } @@ -337,6 +427,7 @@ { if (adap->class & I2C_CLASS_TV_ANALOG) return i2c_probe(adap, &addr_data, saa6752hs_attach); + return 0; } @@ -355,16 +446,20 @@ saa6752hs_command(struct i2c_client *client, unsigned int cmd, void *arg) { struct mpeg_params* init_arg = arg; + int result; switch (cmd) { case MPEG_SETPARAMS: - return saa6752hs_init(client, init_arg); + result = saa6752hs_init(client, init_arg); + if (result != 0) + printk("saa6752hs: MPEG_SETPARAMS failed: %i\n", result); + return result; default: /* nothing */ break; } - + return 0; } --- linux-2.6.8.1.orig/include/media/saa6752hs.h Sat Aug 14 11:56:26 2004 +++ linux-2.6.8.1/include/media/saa6752hs.h Tue Aug 17 02:25:35 2004 @@ -1,4 +1,4 @@ -/* +/* saa6752hs.h - definition for saa6752hs MPEG encoder Copyright (C) 2003 Andrew de Quincey <[EMAIL PROTECTED]> @@ -21,30 +21,47 @@ #ifndef _SAA6752HS_H #define _SAA6752HS_H -enum mpeg_bitrate_mode { - MPEG_BITRATE_MODE_VBR = 0, /* Variable bitrate */ - MPEG_BITRATE_MODE_CBR = 1, /* Constant bitrate */ +enum mpeg_video_bitrate_mode { + MPEG_VIDEO_BITRATE_MODE_VBR = 0, /* Variable bitrate */ + MPEG_VIDEO_BITRATE_MODE_CBR = 1, /* Constant bitrate */ - MPEG_BITRATE_MODE_MAX + MPEG_VIDEO_BITRATE_MODE_MAX }; enum mpeg_audio_bitrate { MPEG_AUDIO_BITRATE_256 = 0, /* 256 kBit/sec */ MPEG_AUDIO_BITRATE_384 = 1, /* 384 kBit/sec */ - + MPEG_AUDIO_BITRATE_MAX }; +enum mpeg_video_format { + MPEG_VIDEO_FORMAT_D1 = 0, + MPEG_VIDEO_FORMAT_2_3_D1 = 1, + MPEG_VIDEO_FORMAT_1_2_D1 = 2, + MPEG_VIDEO_FORMAT_SIF = 3, + + MPEG_VIDEO_FORMAT_MAX +}; + #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; + enum mpeg_video_bitrate_mode video_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 pmt_pid; + unsigned int video_pid; + unsigned int audio_pid; + unsigned int pcr_pid; + + enum mpeg_video_format video_format; }; #define MPEG_SETPARAMS _IOW('6',100,struct mpeg_params)