Commit fd694964 authored by Pantelis Koukousoulas's avatar Pantelis Koukousoulas Committed by Mauro Carvalho Chehab

V4L/DVB (5095): Pvrusb2: Allow VIDIOC_S_FMT with -1 for resolution values

With the previous patch, mplayer started but was polling the video
device forever without any video actually coming out. Further analysis
showed that it does a VIDIOC_S_FMT with width and height set to -1 (!!!).
The code handling this only cares that both are lower than the minimum
range allowed so it ends up setting the size to 19x17 (!!) This pretty
much breaks the encoder here. Even if this breakage is yet another (TM)
result of my setup, setting the size to 19x17 by default would surprise
most users IMHO.
So, special case for -1 and interpret this to be a request for the
default size, please. Users can then set their favorite size both
through mplayer and through sysfs.
With this patch, mplayer finally works in pvr:// mode (not that we
really gain anything over operating it through sysfs with lirc,
sometime I might actually get off my lazy a** and contribute this
setup too)
Signed-off-by: default avatarPantelis Koukousoulas <pakt223@freemail.gr>
Signed-off-by: default avatarMike Isely <isely@pobox.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent 848ed3ca
...@@ -498,7 +498,7 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file, ...@@ -498,7 +498,7 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file,
ret = 0; ret = 0;
switch(vf->type) { switch(vf->type) {
case V4L2_BUF_TYPE_VIDEO_CAPTURE: { case V4L2_BUF_TYPE_VIDEO_CAPTURE: {
int lmin,lmax; int lmin,lmax,ldef;
struct pvr2_ctrl *hcp,*vcp; struct pvr2_ctrl *hcp,*vcp;
int h = vf->fmt.pix.height; int h = vf->fmt.pix.height;
int w = vf->fmt.pix.width; int w = vf->fmt.pix.width;
...@@ -507,14 +507,20 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file, ...@@ -507,14 +507,20 @@ static int pvr2_v4l2_do_ioctl(struct inode *inode, struct file *file,
lmin = pvr2_ctrl_get_min(hcp); lmin = pvr2_ctrl_get_min(hcp);
lmax = pvr2_ctrl_get_max(hcp); lmax = pvr2_ctrl_get_max(hcp);
if (w < lmin) { ldef = pvr2_ctrl_get_def(hcp);
if (w == -1) {
w = ldef;
} else if (w < lmin) {
w = lmin; w = lmin;
} else if (w > lmax) { } else if (w > lmax) {
w = lmax; w = lmax;
} }
lmin = pvr2_ctrl_get_min(vcp); lmin = pvr2_ctrl_get_min(vcp);
lmax = pvr2_ctrl_get_max(vcp); lmax = pvr2_ctrl_get_max(vcp);
if (h < lmin) { ldef = pvr2_ctrl_get_def(vcp);
if (h == -1) {
h = ldef;
} else if (h < lmin) {
h = lmin; h = lmin;
} else if (h > lmax) { } else if (h > lmax) {
h = lmax; h = lmax;
......
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