CX88-blackbird - fixes to VIDIOC_S_FMT
- From: "Valentin Zagura" <puthre (at) gmail.com>
- Date: Mon, 1 May 2006 22:16:39 +0300
Fixes to VIDIOC_S_FMT ioctl. Now changing capture resolutions work.
Added verification of width or height that equals 0 in cx88_setscale
to avoid division by 0.
It seems that norm_maxw in case of PAL should be 720 as any greater
width will not work.
Signed-off-by: Valentin Zagura <puthre (at) gmail.com>
# HG changeset patch
# User root@localhost
# Node ID 1391fe92db6ab03f0ba123bfb0f903425f2e6913
# Parent 25d43622a4ef80dce7f2b9b46b4581801495f98a
Fixed VIDIOC_S_FMT in cx88-blackbird.
diff -r 25d43622a4ef -r 1391fe92db6a linux/drivers/media/video/cx88/cx88-blackbird.c
--- a/linux/drivers/media/video/cx88/cx88-blackbird.c Fri Apr 21 13:04:52 2006 +0300
+++ b/linux/drivers/media/video/cx88/cx88-blackbird.c Sat Apr 22 03:56:37 2006 +0300
@@ -1478,15 +1478,33 @@ static int mpeg_do_ioctl(struct inode *i
f->fmt.pix.bytesperline = 0;
f->fmt.pix.sizeimage = dev->ts_packet_size * dev->ts_packet_count; /* 188 * 4 * 1024; */;
f->fmt.pix.colorspace = 0;
-#if 0
+#if 1
+ if( !f->fmt.pix.width || !f->fmt.pix.height )
+ return -EINVAL;
+ if( f->fmt.pix.width<48 )
+ f->fmt.pix.width=48;
+ else
+ if( f->fmt.pix.width>norm_maxw(core->tvnorm) )
+ f->fmt.pix.width=norm_maxw(core->tvnorm);
+ if( f->fmt.pix.height<32 )
+ f->fmt.pix.height=32;
+ else
+ if( f->fmt.pix.height>norm_maxh(core->tvnorm) )
+ f->fmt.pix.height=norm_maxh(core->tvnorm);
+
dev->width = f->fmt.pix.width;
dev->height = f->fmt.pix.height;
fh->mpegq.field = f->fmt.pix.field;
#endif
-#if 0
+#if 1
+ blackbird_api_cmd(fh->dev, BLACKBIRD_API_END_CAPTURE, 3, 0,
+ BLACKBIRD_END_NOW,
+ BLACKBIRD_MPEG_CAPTURE,
+ BLACKBIRD_RAW_BITS_NONE);
cx88_set_scale(core, f->fmt.pix.width, f->fmt.pix.height, f->fmt.pix.field);
blackbird_api_cmd(dev, BLACKBIRD_API_SET_RESOLUTION, 2, 0,
f->fmt.pix.height, f->fmt.pix.width);
+ blackbird_initialize_codec(dev);
#endif
dprintk(0,"VIDIOC_S_FMT: w: %d, h: %d, f: %d\n",
f->fmt.pix.width, f->fmt.pix.height, f->fmt.pix.field );
diff -r 25d43622a4ef -r 1391fe92db6a linux/drivers/media/video/cx88/cx88-core.c
--- a/linux/drivers/media/video/cx88/cx88-core.c Fri Apr 21 13:04:52 2006 +0300
+++ b/linux/drivers/media/video/cx88/cx88-core.c Sat Apr 22 03:56:37 2006 +0300
@@ -731,6 +731,8 @@ int cx88_set_scale(struct cx88_core *cor
V4L2_FIELD_HAS_TOP(field) ? "T" : "",
V4L2_FIELD_HAS_BOTTOM(field) ? "B" : "",
core->tvnorm->name);
+ if ((!width)||(!height))
+ return 0;
if (!V4L2_FIELD_HAS_BOTH(field))
height *= 2;
diff -r 25d43622a4ef -r 1391fe92db6a linux/drivers/media/video/cx88/cx88.h
--- a/linux/drivers/media/video/cx88/cx88.h Fri Apr 21 13:04:52 2006 +0300
+++ b/linux/drivers/media/video/cx88/cx88.h Sat Apr 22 03:56:37 2006 +0300
@@ -88,8 +88,10 @@ struct cx88_tvnorm {
static unsigned int inline norm_maxw(struct cx88_tvnorm *norm)
{
+#if 0
return (norm->id & V4L2_STD_625_50) ? 768 : 640;
-#if 0
+#endif
+#if 1
return (norm->id & V4L2_STD_625_50) ? 720 : 640;
#endif
}
--
video4linux-list mailing list
Unsubscribe mailto:video4linux-list-request (at) redhat.com?subject=unsubscribe
https://www.redhat.com/mailman/listinfo/video4linux-list