diff options
-rw-r--r-- | linux/drivers/media/video/bttv-driver.c | 28 | ||||
-rw-r--r-- | linux/drivers/media/video/bttv-vbi.c | 59 | ||||
-rw-r--r-- | linux/drivers/media/video/bttvp.h | 7 | ||||
-rw-r--r-- | linux/drivers/media/video/v4l1-compat.c | 13 | ||||
-rw-r--r-- | v4l/ChangeLog | 35 |
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), |