summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@redhat.com>2007-09-19 07:36:34 -0300
committerMauro Carvalho Chehab <mchehab@redhat.com>2007-09-19 07:36:34 -0300
commit534ed3cae7cb15e779515ae9fb9d5eccdab2809c (patch)
tree90b91574319663fa5446b84e93b3fe9a054c8c83
parente946a6577dcb3a3377ebdaa61c6a7e824c722b2a (diff)
downloadmediapointer-dvb-s2-534ed3cae7cb15e779515ae9fb9d5eccdab2809c.tar.gz
mediapointer-dvb-s2-534ed3cae7cb15e779515ae9fb9d5eccdab2809c.tar.bz2
tm6000: Allow selecting audio bitrate
From: Mauro Carvalho Chehab <mchehab@infradead.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r--linux/drivers/staging/tm6000/tm6000-core.c2
-rw-r--r--linux/drivers/staging/tm6000/tm6000-video.c37
-rw-r--r--linux/drivers/staging/tm6000/tm6000.h1
3 files changed, 30 insertions, 10 deletions
diff --git a/linux/drivers/staging/tm6000/tm6000-core.c b/linux/drivers/staging/tm6000/tm6000-core.c
index c03871d99..44abe8382 100644
--- a/linux/drivers/staging/tm6000/tm6000-core.c
+++ b/linux/drivers/staging/tm6000/tm6000-core.c
@@ -745,9 +745,11 @@ printk("Original value=%d\n",val);
switch (bitrate) {
case 44100:
val|=0xd0;
+ dev->audio_bitrate=bitrate;
break;
case 48000:
val|=0x60;
+ dev->audio_bitrate=bitrate;
break;
}
val=tm6000_set_reg (dev, REQ_07_SET_GET_AVREG, 0xeb, val);
diff --git a/linux/drivers/staging/tm6000/tm6000-video.c b/linux/drivers/staging/tm6000/tm6000-video.c
index e24077fb5..160317a4d 100644
--- a/linux/drivers/staging/tm6000/tm6000-video.c
+++ b/linux/drivers/staging/tm6000/tm6000-video.c
@@ -612,8 +612,7 @@ static int tm6000_prepare_isoc(struct tm6000_core *dev,
dev->isoc_ctl.urb[i] = urb;
dev->isoc_ctl.transfer_buffer[i] = usb_buffer_alloc(dev->udev,
- sb_size, GFP_KERNEL,
- &dev->isoc_ctl.urb[i]->transfer_dma);
+ sb_size, GFP_KERNEL, &urb->transfer_dma);
if (!dev->isoc_ctl.transfer_buffer[i]) {
tm6000_err ("unable to allocate %i bytes for transfer"
" buffer %i\n", sb_size, i);
@@ -844,14 +843,32 @@ buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
urb_init=1;
if (urb_init) {
- /* Should allocate/request at least h
- res x v res x 2 bytes/pixel */
- urbsize=(buf->vb.size+dev->max_isoc_in-1)/dev->max_isoc_in;
-
- /* Hack to allocate memory for Video + Audio */
- /* FIXME: should also consider header ovehead of
- 4 bytes/180 bytes */
- urbsize+=((48000*4+24)/25+dev->max_isoc_in-1)/dev->max_isoc_in;
+ /* memory for video
+ Should be at least
+ Vres x Vres x 2 bytes/pixel by frame */
+ urbsize=buf->vb.size;
+
+ /* memory for audio
+ Should be at least
+ bitrate * 2 channels * 2 bytes / frame rate */
+ if (dev->norm & V4L2_STD_525_60) {
+ urbsize+=(dev->audio_bitrate*4+29)/30;
+ } else {
+ urbsize+=(dev->audio_bitrate*4+24)/25;
+ }
+
+ /* each audio frame seeems to have a frame number
+ with 2 bytes */
+ urbsize+=2;
+
+ /* Add 4 bytes by each 180 bytes frame */
+ urbsize+=((urbsize+179)/180)*4;
+
+ /* Round to an enough number of URBs */
+ urbsize=(urbsize+dev->max_isoc_in-1)/dev->max_isoc_in;
+
+
+printk("Allocating %d packets to handle %lu size\n", urbsize,buf->vb.size);
dprintk(dev, V4L2_DEBUG_QUEUE, "Allocating %d packets to handle "
"%lu size\n", urbsize,buf->vb.size);
diff --git a/linux/drivers/staging/tm6000/tm6000.h b/linux/drivers/staging/tm6000/tm6000.h
index c4d2cda69..d75cbb59b 100644
--- a/linux/drivers/staging/tm6000/tm6000.h
+++ b/linux/drivers/staging/tm6000/tm6000.h
@@ -146,6 +146,7 @@ struct tm6000_core {
/* Demodulator configuration */
int demod_addr; /* demodulator address */
+ int audio_bitrate;
/* i2c i/o */
struct i2c_adapter i2c_adap;
struct i2c_client i2c_client;