summaryrefslogtreecommitdiffstats
path: root/stream
diff options
context:
space:
mode:
authorreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2009-03-16 17:12:29 +0000
committerreimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>2009-03-16 17:12:29 +0000
commitb397b28b31e8a57b71f90ef31dbdafad25fd5820 (patch)
treec71d0429b5499d92bab4107bef0faa991cda7681 /stream
parent91dd12b122e0877acb93f6829e708353c6d8903e (diff)
downloadmpv-b397b28b31e8a57b71f90ef31dbdafad25fd5820.tar.bz2
mpv-b397b28b31e8a57b71f90ef31dbdafad25fd5820.tar.xz
Add TVI_CONTROL_VID_SET_WIDTH_HEIGHT to set width and height together for v4l2,
otherwise some drivers will always stay stuck in the lowest resolution. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@28975 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'stream')
-rw-r--r--stream/tv.c6
-rw-r--r--stream/tv.h1
-rw-r--r--stream/tvi_v4l2.c8
3 files changed, 15 insertions, 0 deletions
diff --git a/stream/tv.c b/stream/tv.c
index 58321d5302..7e8ae530d4 100644
--- a/stream/tv.c
+++ b/stream/tv.c
@@ -439,6 +439,12 @@ static int open_tv(tvi_handle_t *tvh)
#endif
/* limits on w&h are norm-dependent -- JM */
+ if (tvh->tv_param->width != -1 && tvh->tv_param->height != -1) {
+ // first tell the driver both width and height, some drivers do not support setting them independently.
+ int dim[2];
+ dim[0] = tvh->tv_param->width; dim[1] = tvh->tv_param->height;
+ funcs->control(tvh->priv, TVI_CONTROL_VID_SET_WIDTH_HEIGHT, dim);
+ }
/* set width */
if (tvh->tv_param->width != -1)
{
diff --git a/stream/tv.h b/stream/tv.h
index 37c63b7a89..c7ffae032c 100644
--- a/stream/tv.h
+++ b/stream/tv.h
@@ -175,6 +175,7 @@ typedef struct {
#define TVI_CONTROL_VID_SET_PICTURE 0x11e
#define TVI_CONTROL_VID_SET_GAIN 0x11f
#define TVI_CONTROL_VID_GET_GAIN 0x120
+#define TVI_CONTROL_VID_SET_WIDTH_HEIGHT 0x121
/* TUNER controls */
#define TVI_CONTROL_TUN_GET_FREQ 0x201
diff --git a/stream/tvi_v4l2.c b/stream/tvi_v4l2.c
index a5485bf07f..c890d7a51e 100644
--- a/stream/tvi_v4l2.c
+++ b/stream/tvi_v4l2.c
@@ -780,6 +780,14 @@ static int control(priv_t *priv, int cmd, void *arg)
return TVI_CONTROL_TRUE;
case TVI_CONTROL_VID_CHK_WIDTH:
return TVI_CONTROL_TRUE;
+ case TVI_CONTROL_VID_SET_WIDTH_HEIGHT:
+ if (getfmt(priv) < 0) return TVI_CONTROL_FALSE;
+ priv->format.fmt.pix.width = ((int *)arg)[0];
+ priv->format.fmt.pix.height = ((int *)arg)[1];
+ priv->format.fmt.pix.field = V4L2_FIELD_ANY;
+ if (ioctl(priv->video_fd, VIDIOC_S_FMT, &priv->format) < 0)
+ return TVI_CONTROL_FALSE;
+ return TVI_CONTROL_TRUE;
case TVI_CONTROL_VID_SET_WIDTH:
if (getfmt(priv) < 0) return TVI_CONTROL_FALSE;
priv->format.fmt.pix.width = *(int *)arg;