summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--linux/drivers/media/video/bttv-driver.c28
-rw-r--r--linux/drivers/media/video/bttv-vbi.c59
-rw-r--r--linux/drivers/media/video/bttvp.h7
-rw-r--r--linux/drivers/media/video/v4l1-compat.c13
-rw-r--r--v4l/ChangeLog35
5 files changed, 98 insertions, 44 deletions
diff --git a/linux/drivers/media/video/bttv-driver.c b/linux/drivers/media/video/bttv-driver.c
index 913a9c705..01b0d601e 100644
--- a/linux/drivers/media/video/bttv-driver.c
+++ b/linux/drivers/media/video/bttv-driver.c
@@ -1,5 +1,5 @@
/*
- $Id: bttv-driver.c,v 1.80 2005/12/10 17:51:31 rmcc Exp $
+ $Id: bttv-driver.c,v 1.81 2005/12/14 22:05:02 hverkuil Exp $
bttv - Bt848 frame grabber driver
@@ -224,6 +224,10 @@ const struct bttv_tvnorm bttv_tvnorms[] = {
.vdelay = 0x20,
.vbipack = 255,
.sram = 0,
+ /* ITU-R frame line number of the first VBI line
+ we can capture, of the first and second field. */
+ .vbistart[0] = 7,
+ .vbistart[1] = 320,
},{
.v4l2_id = V4L2_STD_NTSC_M,
.name = "NTSC",
@@ -240,6 +244,8 @@ const struct bttv_tvnorm bttv_tvnorms[] = {
.vdelay = 0x1a,
.vbipack = 144,
.sram = 1,
+ .vbistart[0] = 10,
+ .vbistart[1] = 273,
},{
.v4l2_id = V4L2_STD_SECAM,
.name = "SECAM",
@@ -256,6 +262,8 @@ const struct bttv_tvnorm bttv_tvnorms[] = {
.vdelay = 0x20,
.vbipack = 255,
.sram = 0, /* like PAL, correct? */
+ .vbistart[0] = 7,
+ .vbistart[1] = 320,
},{
.v4l2_id = V4L2_STD_PAL_Nc,
.name = "PAL-Nc",
@@ -272,6 +280,8 @@ const struct bttv_tvnorm bttv_tvnorms[] = {
.vdelay = 0x1a,
.vbipack = 144,
.sram = -1,
+ .vbistart[0] = 7,
+ .vbistart[1] = 320,
},{
.v4l2_id = V4L2_STD_PAL_M,
.name = "PAL-M",
@@ -288,6 +298,8 @@ const struct bttv_tvnorm bttv_tvnorms[] = {
.vdelay = 0x1a,
.vbipack = 144,
.sram = -1,
+ .vbistart[0] = 10,
+ .vbistart[1] = 273,
},{
.v4l2_id = V4L2_STD_PAL_N,
.name = "PAL-N",
@@ -304,6 +316,8 @@ const struct bttv_tvnorm bttv_tvnorms[] = {
.vdelay = 0x20,
.vbipack = 144,
.sram = -1,
+ .vbistart[0] = 7,
+ .vbistart[1] = 320,
},{
.v4l2_id = V4L2_STD_NTSC_M_JP,
.name = "NTSC-JP",
@@ -320,6 +334,8 @@ const struct bttv_tvnorm bttv_tvnorms[] = {
.vdelay = 0x16,
.vbipack = 144,
.sram = -1,
+ .vbistart[0] = 10,
+ .vbistart[1] = 273,
},{
/* that one hopefully works with the strange timing
* which video recorders produce when playing a NTSC
@@ -340,6 +356,8 @@ const struct bttv_tvnorm bttv_tvnorms[] = {
.vbipack = 255,
.vtotal = 524,
.sram = -1,
+ .vbistart[0] = 10,
+ .vbistart[1] = 273,
}
};
static const unsigned int BTTV_TVNORMS = ARRAY_SIZE(bttv_tvnorms);
@@ -2596,10 +2614,10 @@ static int bttv_do_ioctl(struct inode *inode, struct file *file,
fmt->count[0] = fmt2.fmt.vbi.count[0];
fmt->start[1] = fmt2.fmt.vbi.start[1];
fmt->count[1] = fmt2.fmt.vbi.count[1];
- if (fmt2.fmt.vbi.flags & VBI_UNSYNC)
- fmt->flags |= V4L2_VBI_UNSYNC;
- if (fmt2.fmt.vbi.flags & VBI_INTERLACED)
- fmt->flags |= V4L2_VBI_INTERLACED;
+ if (fmt2.fmt.vbi.flags & V4L2_VBI_UNSYNC)
+ fmt->flags |= VBI_UNSYNC;
+ if (fmt2.fmt.vbi.flags & V4L2_VBI_INTERLACED)
+ fmt->flags |= VBI_INTERLACED;
return 0;
}
case VIDIOCSVBIFMT:
diff --git a/linux/drivers/media/video/bttv-vbi.c b/linux/drivers/media/video/bttv-vbi.c
index 06f3e62b3..d10d81f77 100644
--- a/linux/drivers/media/video/bttv-vbi.c
+++ b/linux/drivers/media/video/bttv-vbi.c
@@ -1,5 +1,5 @@
/*
- $Id: bttv-vbi.c,v 1.9 2005/01/13 17:22:33 kraxel Exp $
+ $Id: bttv-vbi.c,v 1.10 2005/12/14 22:05:02 hverkuil Exp $
bttv - Bt848 frame grabber driver
vbi interface
@@ -32,6 +32,12 @@
#include <asm/io.h>
#include "bttvp.h"
+/* Offset from line sync pulse leading edge (0H) in 1 / sampling_rate:
+ bt8x8 /HRESET pulse starts at 0H and has length 64 / fCLKx1 (E|O_VTC
+ HSFMT = 0). VBI_HDELAY (always 0) is an offset from the trailing edge
+ of /HRESET in 1 / fCLKx1, and the sampling_rate tvnorm->Fsc is fCLKx2. */
+#define VBI_OFFSET ((64 + 0) * 2)
+
#define VBI_DEFLINES 16
#define VBI_MAXLINES 32
@@ -164,40 +170,30 @@ void bttv_vbi_setlines(struct bttv_fh *fh, struct bttv *btv, int lines)
void bttv_vbi_try_fmt(struct bttv_fh *fh, struct v4l2_format *f)
{
const struct bttv_tvnorm *tvnorm;
- u32 start0,start1;
- s32 count0,count1,count;
+ s64 count0,count1,count;
tvnorm = &bttv_tvnorms[fh->btv->tvnorm];
f->type = V4L2_BUF_TYPE_VBI_CAPTURE;
f->fmt.vbi.sampling_rate = tvnorm->Fsc;
f->fmt.vbi.samples_per_line = 2048;
f->fmt.vbi.sample_format = V4L2_PIX_FMT_GREY;
- f->fmt.vbi.offset = 244;
+ f->fmt.vbi.offset = VBI_OFFSET;
f->fmt.vbi.flags = 0;
- switch (fh->btv->tvnorm) {
- case 1: /* NTSC */
- start0 = 10;
- start1 = 273;
- break;
- case 0: /* PAL */
- case 2: /* SECAM */
- default:
- start0 = 7;
- start1 = 320;
- }
- count0 = (f->fmt.vbi.start[0] + f->fmt.vbi.count[0]) - start0;
- count1 = (f->fmt.vbi.start[1] + f->fmt.vbi.count[1]) - start1;
- count = max(count0,count1);
- if (count > VBI_MAXLINES)
- count = VBI_MAXLINES;
- if (count < 1)
- count = 1;
+ /* s64 to prevent overflow. */
+ count0 = (s64) f->fmt.vbi.start[0] + f->fmt.vbi.count[0]
+ - tvnorm->vbistart[0];
+ count1 = (s64) f->fmt.vbi.start[1] + f->fmt.vbi.count[1]
+ - tvnorm->vbistart[1];
+ count = clamp (max (count0, count1), 1LL, (s64) VBI_MAXLINES);
- f->fmt.vbi.start[0] = start0;
- f->fmt.vbi.start[1] = start1;
+ f->fmt.vbi.start[0] = tvnorm->vbistart[0];
+ f->fmt.vbi.start[1] = tvnorm->vbistart[1];
f->fmt.vbi.count[0] = count;
f->fmt.vbi.count[1] = count;
+
+ f->fmt.vbi.reserved[0] = 0;
+ f->fmt.vbi.reserved[1] = 0;
}
void bttv_vbi_get_fmt(struct bttv_fh *fh, struct v4l2_format *f)
@@ -210,21 +206,12 @@ void bttv_vbi_get_fmt(struct bttv_fh *fh, struct v4l2_format *f)
f->fmt.vbi.sampling_rate = tvnorm->Fsc;
f->fmt.vbi.samples_per_line = 2048;
f->fmt.vbi.sample_format = V4L2_PIX_FMT_GREY;
- f->fmt.vbi.offset = 244;
+ f->fmt.vbi.offset = VBI_OFFSET;
+ f->fmt.vbi.start[0] = tvnorm->vbistart[0];
+ f->fmt.vbi.start[1] = tvnorm->vbistart[1];
f->fmt.vbi.count[0] = fh->lines;
f->fmt.vbi.count[1] = fh->lines;
f->fmt.vbi.flags = 0;
- switch (fh->btv->tvnorm) {
- case 1: /* NTSC */
- f->fmt.vbi.start[0] = 10;
- f->fmt.vbi.start[1] = 273;
- break;
- case 0: /* PAL */
- case 2: /* SECAM */
- default:
- f->fmt.vbi.start[0] = 7;
- f->fmt.vbi.start[1] = 319;
- }
}
/* ----------------------------------------------------------------------- */
diff --git a/linux/drivers/media/video/bttvp.h b/linux/drivers/media/video/bttvp.h
index 91d3a15e7..019994967 100644
--- a/linux/drivers/media/video/bttvp.h
+++ b/linux/drivers/media/video/bttvp.h
@@ -1,5 +1,5 @@
/*
- $Id: bttvp.h,v 1.29 2005/12/10 17:51:31 rmcc Exp $
+ $Id: bttvp.h,v 1.30 2005/12/14 22:05:02 hverkuil Exp $
bttv - Bt848 frame grabber driver
@@ -81,6 +81,8 @@
#define UNSET (-1U)
+#define clamp(x, low, high) min (max (low, x), high)
+
/* ---------------------------------------------------------- */
struct bttv_tvnorm {
@@ -96,6 +98,9 @@ struct bttv_tvnorm {
u8 vbipack;
u16 vtotal;
int sram;
+ /* ITU-R frame line number of the first VBI line we can
+ capture, of the first and second field. */
+ u16 vbistart[2];
};
extern const struct bttv_tvnorm bttv_tvnorms[];
diff --git a/linux/drivers/media/video/v4l1-compat.c b/linux/drivers/media/video/v4l1-compat.c
index 42a41b1cb..02fe28a5e 100644
--- a/linux/drivers/media/video/v4l1-compat.c
+++ b/linux/drivers/media/video/v4l1-compat.c
@@ -1,5 +1,5 @@
/*
- * $Id: v4l1-compat.c,v 1.14 2005/12/07 12:30:28 mchehab Exp $
+ * $Id: v4l1-compat.c,v 1.15 2005/12/14 22:05:02 hverkuil Exp $
*
* Video for Linux Two
* Backward Compatibility Layer
@@ -979,6 +979,10 @@ v4l_compat_translate_ioctl(struct inode *inode,
dprintk("VIDIOCGVBIFMT / VIDIOC_G_FMT: %d\n", err);
break;
}
+ if (fmt2->fmt.vbi.sample_format != V4L2_PIX_FMT_GREY) {
+ err = -EINVAL;
+ break;
+ }
memset(fmt, 0, sizeof(*fmt));
fmt->samples_per_line = fmt2->fmt.vbi.samples_per_line;
fmt->sampling_rate = fmt2->fmt.vbi.sampling_rate;
@@ -994,6 +998,11 @@ v4l_compat_translate_ioctl(struct inode *inode,
{
struct vbi_format *fmt = arg;
+ if (VIDEO_PALETTE_RAW != fmt->sample_format) {
+ err = -EINVAL;
+ break;
+ }
+
fmt2 = kmalloc(sizeof(*fmt2),GFP_KERNEL);
memset(fmt2, 0, sizeof(*fmt2));
@@ -1014,7 +1023,7 @@ v4l_compat_translate_ioctl(struct inode *inode,
if (fmt2->fmt.vbi.samples_per_line != fmt->samples_per_line ||
fmt2->fmt.vbi.sampling_rate != fmt->sampling_rate ||
- VIDEO_PALETTE_RAW != fmt->sample_format ||
+ fmt2->fmt.vbi.sample_format != V4L2_PIX_FMT_GREY ||
fmt2->fmt.vbi.start[0] != fmt->start[0] ||
fmt2->fmt.vbi.count[0] != fmt->count[0] ||
fmt2->fmt.vbi.start[1] != fmt->start[1] ||
diff --git a/v4l/ChangeLog b/v4l/ChangeLog
index eda29fe1f..5ac248ec6 100644
--- a/v4l/ChangeLog
+++ b/v4l/ChangeLog
@@ -1,3 +1,38 @@
+2005-12-14 21:49 hverkuil
+
+ * linux/drivers/media/video/bttv-driver.c: (bttv_do_ioctl):
+ * linux/drivers/media/video/bttv-vbi.c: (bttv_vbi_try_fmt),
+ (bttv_vbi_get_fmt):
+ * linux/drivers/media/video/bttvp.h:
+ * linux/drivers/media/video/tda9887.c: (dump_read_message),
+ (dump_write_message), (tda9887_set_tvnorm), (tda9887_set_insmod),
+ (tda9887_set_config), (tda9887_status), (tda9887_configure),
+ (tda9887_tuner_status), (tda9887_get_afc), (tda9887_standby),
+ (tda9887_tuner_init):
+ * linux/drivers/media/video/tuner-core.c: (set_type), (set_addr),
+ (tuner_attach), (tuner_command):
+ * linux/drivers/media/video/v4l1-compat.c:
+ (v4l_compat_translate_ioctl):
+
+ - V4L2_(G|S|TRY)_FMT returned incorrect VBI start lines for PAL-M,
+ NTSC-JP, and PAL-60. They also returned an inaccurate VBI offset.
+ - V4L2_(G|S)_FMT and V4L2_TRY_FMT disagreed about the start of VBI
+ capturing in PAL and SECAM second field. Note the start line fixes
+ may break applications using VIDIOCSVBIFMT because this ioctl fails
+ when the driver does not support exactly the requested parameters.
+ - V4L2_TRY_FMT did not clear the reserved field in struct
+ v4l2_vbi_format.
+ - V4L2_(S|TRY)_FMT did not expect very large or small VBI start or
+ count values, returning wrong (but safe) counts due to an overflow.
+ - VIDIOCGVBIFMT confused V4L and V4L2 VBI flags. However this had no
+ effect because the flags have the same value and bttv never sets
+ them.
+ - In v4l_compat_translate_ioctl() the VIDIOC(G|S)VBIFMT code did not
+ expect V4L2 drivers supporting VBI formats besides V4L2_PIX_FMT_GREY.
+
+ Signed-off-by: Michael H. Schimek <mschimek@gmx.at>
+ Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
+
2005-12-14 19:34 mchehab
* linux/drivers/media/video/cx88/cx88-alsa.c: (dsp_buffer_init),