Commit c13eb703 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab

[media] bttv: fix try_fmt_vid_overlay and setup initial overlay size

try_fmt_vid_overlay should map incorrect sizes and fields to valid values.
It also expects that an initial overlay size is defined so g_fmt_vid_overlay
returns valid information.
Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 3d4b8035
...@@ -2111,22 +2111,33 @@ limit_scaled_size_lock (struct bttv_fh * fh, ...@@ -2111,22 +2111,33 @@ limit_scaled_size_lock (struct bttv_fh * fh,
may also adjust the current cropping parameters to get closer may also adjust the current cropping parameters to get closer
to the desired window size. */ to the desired window size. */
static int static int
verify_window_lock (struct bttv_fh * fh, verify_window_lock(struct bttv_fh *fh, struct v4l2_window *win,
struct v4l2_window * win, int adjust_size, int adjust_crop)
int adjust_size,
int adjust_crop)
{ {
enum v4l2_field field; enum v4l2_field field;
unsigned int width_mask; unsigned int width_mask;
int rc; int rc;
if (win->w.width < 48 || win->w.height < 32) if (win->w.width < 48)
return -EINVAL; win->w.width = 48;
if (win->w.height < 32)
win->w.height = 32;
if (win->clipcount > 2048) if (win->clipcount > 2048)
return -EINVAL; win->clipcount = 2048;
win->chromakey = 0;
win->global_alpha = 0;
field = win->field; field = win->field;
switch (field) {
case V4L2_FIELD_TOP:
case V4L2_FIELD_BOTTOM:
case V4L2_FIELD_INTERLACED:
break;
default:
field = V4L2_FIELD_ANY;
break;
}
if (V4L2_FIELD_ANY == field) { if (V4L2_FIELD_ANY == field) {
__s32 height2; __s32 height2;
...@@ -2135,18 +2146,11 @@ verify_window_lock (struct bttv_fh * fh, ...@@ -2135,18 +2146,11 @@ verify_window_lock (struct bttv_fh * fh,
? V4L2_FIELD_INTERLACED ? V4L2_FIELD_INTERLACED
: V4L2_FIELD_TOP; : V4L2_FIELD_TOP;
} }
switch (field) { win->field = field;
case V4L2_FIELD_TOP:
case V4L2_FIELD_BOTTOM:
case V4L2_FIELD_INTERLACED:
break;
default:
return -EINVAL;
}
/* 4-byte alignment. */
if (NULL == fh->ovfmt) if (NULL == fh->ovfmt)
return -EINVAL; return -EINVAL;
/* 4-byte alignment. */
width_mask = ~0; width_mask = ~0;
switch (fh->ovfmt->depth) { switch (fh->ovfmt->depth) {
case 8: case 8:
...@@ -2171,8 +2175,6 @@ verify_window_lock (struct bttv_fh * fh, ...@@ -2171,8 +2175,6 @@ verify_window_lock (struct bttv_fh * fh,
adjust_size, adjust_crop); adjust_size, adjust_crop);
if (0 != rc) if (0 != rc)
return rc; return rc;
win->field = field;
return 0; return 0;
} }
...@@ -2407,9 +2409,10 @@ static int bttv_try_fmt_vid_overlay(struct file *file, void *priv, ...@@ -2407,9 +2409,10 @@ static int bttv_try_fmt_vid_overlay(struct file *file, void *priv,
{ {
struct bttv_fh *fh = priv; struct bttv_fh *fh = priv;
return verify_window_lock(fh, &f->fmt.win, verify_window_lock(fh, &f->fmt.win,
/* adjust_size */ 1, /* adjust_size */ 1,
/* adjust_crop */ 0); /* adjust_crop */ 0);
return 0;
} }
static int bttv_s_fmt_vid_cap(struct file *file, void *priv, static int bttv_s_fmt_vid_cap(struct file *file, void *priv,
...@@ -4146,6 +4149,9 @@ static int bttv_probe(struct pci_dev *dev, const struct pci_device_id *pci_id) ...@@ -4146,6 +4149,9 @@ static int bttv_probe(struct pci_dev *dev, const struct pci_device_id *pci_id)
btv->init.fmt = format_by_fourcc(V4L2_PIX_FMT_BGR24); btv->init.fmt = format_by_fourcc(V4L2_PIX_FMT_BGR24);
btv->init.width = 320; btv->init.width = 320;
btv->init.height = 240; btv->init.height = 240;
btv->init.ov.w.width = 320;
btv->init.ov.w.height = 240;
btv->init.ov.field = V4L2_FIELD_INTERLACED;
btv->input = 0; btv->input = 0;
v4l2_ctrl_new_std(hdl, &bttv_ctrl_ops, v4l2_ctrl_new_std(hdl, &bttv_ctrl_ops,
......
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