Commit ccb83408 authored by Trent Piepho's avatar Trent Piepho Committed by Mauro Carvalho Chehab

V4L/DVB (11912): em28xx: Use v4l bounding/alignment function

The v4l function has a better algorithm for aligning image size.

It appears that the em2800 can only scale by 50% or 100%, i.e. the only
heights supported might be 240 and 480.  In that case the old code would
set any height other than 240 to 480.  Request 240 get 240, but request 239
and then you get 480.  Change it to round to the nearest supported value.
Signed-off-by: default avatarTrent Piepho <xyzzy@speakeasy.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 9bd0e8d7
...@@ -687,8 +687,8 @@ static int vidioc_try_fmt_vid_cap(struct file *file, void *priv, ...@@ -687,8 +687,8 @@ static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
{ {
struct em28xx_fh *fh = priv; struct em28xx_fh *fh = priv;
struct em28xx *dev = fh->dev; struct em28xx *dev = fh->dev;
int width = f->fmt.pix.width; unsigned int width = f->fmt.pix.width;
int height = f->fmt.pix.height; unsigned int height = f->fmt.pix.height;
unsigned int maxw = norm_maxw(dev); unsigned int maxw = norm_maxw(dev);
unsigned int maxh = norm_maxh(dev); unsigned int maxh = norm_maxh(dev);
unsigned int hscale, vscale; unsigned int hscale, vscale;
...@@ -701,34 +701,20 @@ static int vidioc_try_fmt_vid_cap(struct file *file, void *priv, ...@@ -701,34 +701,20 @@ static int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
return -EINVAL; return -EINVAL;
} }
/* width must even because of the YUYV format
height must be even because of interlacing */
height &= 0xfffe;
width &= 0xfffe;
if (unlikely(height < 32))
height = 32;
if (unlikely(height > maxh))
height = maxh;
if (unlikely(width < 48))
width = 48;
if (unlikely(width > maxw))
width = maxw;
if (dev->board.is_em2800) { if (dev->board.is_em2800) {
/* the em2800 can only scale down to 50% */ /* the em2800 can only scale down to 50% */
if (height % (maxh / 2)) height = height > (3 * maxh / 4) ? maxh : maxh / 2;
height = maxh; width = width > (3 * maxw / 4) ? maxw : maxw / 2;
if (width % (maxw / 2)) /* According to empiatech support the MaxPacketSize is too small
width = maxw; * to support framesizes larger than 640x480 @ 30 fps or 640x576
/* according to empiatech support */ * @ 25 fps. As this would cut of a part of the image we prefer
/* the MaxPacketSize is to small to support */ * 360x576 or 360x480 for now */
/* framesizes larger than 640x480 @ 30 fps */
/* or 640x576 @ 25 fps. As this would cut */
/* of a part of the image we prefer */
/* 360x576 or 360x480 for now */
if (width == maxw && height == maxh) if (width == maxw && height == maxh)
width /= 2; width /= 2;
} else {
/* width must even because of the YUYV format
height must be even because of interlacing */
v4l_bound_align_image(&width, 48, maxw, 1, &height, 32, maxh, 1, 0);
} }
get_scale(dev, width, height, &hscale, &vscale); get_scale(dev, width, height, &hscale, &vscale);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment