summaryrefslogtreecommitdiffstats
path: root/stream/tvi_v4l.c
diff options
context:
space:
mode:
authorvoroshil <voroshil@b3059339-0415-0410-9bf9-f77b7e298cf2>2007-05-21 17:00:08 +0000
committervoroshil <voroshil@b3059339-0415-0410-9bf9-f77b7e298cf2>2007-05-21 17:00:08 +0000
commit709aa5eb74416ebd240d85bff732695b875efec7 (patch)
tree52c8a4a48ba5d5177d09e3ddd4252632f20550e2 /stream/tvi_v4l.c
parent6b17d17e8c0f4a5cdd43ddfa0ba9b4cb25f6c4d5 (diff)
downloadmpv-709aa5eb74416ebd240d85bff732695b875efec7.tar.bz2
mpv-709aa5eb74416ebd240d85bff732695b875efec7.tar.xz
make v4l1 driver work properly.
v4l1 API docs says that VIDIOCSWIN (picture size) and VIDIOCSPICT (pixel format) should be called before VIDIOCGMBUF ioctl call. patch by Trent Piepho xyzzy at speakeasy dot org git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@23372 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'stream/tvi_v4l.c')
-rw-r--r--stream/tvi_v4l.c88
1 files changed, 45 insertions, 43 deletions
diff --git a/stream/tvi_v4l.c b/stream/tvi_v4l.c
index 142be84a39..30621b8e8f 100644
--- a/stream/tvi_v4l.c
+++ b/stream/tvi_v4l.c
@@ -597,35 +597,6 @@ static int init(priv_t *priv)
goto err;
}
- if ( !tv_param_mjpeg )
- {
- /* map grab buffer */
- if (ioctl(priv->video_fd, VIDIOCGMBUF, &priv->mbuf) == -1)
- {
- mp_msg(MSGT_TV, MSGL_ERR, "ioctl get mbuf failed: %s\n", strerror(errno));
- goto err;
- }
-
- mp_msg(MSGT_TV, MSGL_V, "mbuf: size=%d, frames=%d\n",
- priv->mbuf.size, priv->mbuf.frames);
- priv->mmap = mmap(0, priv->mbuf.size, PROT_READ|PROT_WRITE,
- MAP_SHARED, priv->video_fd, 0);
- if (priv->mmap == (unsigned char *)-1)
- {
- mp_msg(MSGT_TV, MSGL_ERR, "Unable to map memory for buffers: %s\n", strerror(errno));
- goto err;
- }
- mp_msg(MSGT_TV, MSGL_DBG2, "our buffer: %p\n", priv->mmap);
-
- /* num of buffers */
- priv->nbuf = priv->mbuf.frames;
-
- /* video buffers */
- priv->buf = calloc(priv->nbuf, sizeof(struct video_mmap));
- if (!priv->buf)
- goto malloc_failed;
- memset(priv->buf, 0, priv->nbuf * sizeof(struct video_mmap));
- }
/* init v4l audio even when we don't capture */
init_v4l_audio(priv);
@@ -770,6 +741,7 @@ static int start(priv_t *priv)
{
int i;
int bytes_per_sample;
+ struct video_window win;
if (ioctl(priv->video_fd, VIDIOCGPICT, &priv->picture) == -1)
{
@@ -796,6 +768,50 @@ static int start(priv_t *priv)
if (ioctl(priv->video_fd, VIDIOCSPICT, &priv->picture) == -1)
{
mp_msg(MSGT_TV, MSGL_ERR, "ioctl set picture failed: %s\n", strerror(errno));
+ mp_msg(MSGT_TV, MSGL_ERR, "The 'outfmt' of '%s' is likely not supported by your card\n",
+ vo_format_name(priv->format));
+ return 0;
+ }
+
+ /* Set capture size */
+ win.x = 0;
+ win.y = 0;
+ win.width = priv->width;
+ win.height = priv->height;
+ win.chromakey = -1;
+ win.flags = 0;
+ win.clipcount = 0;
+ if (ioctl(priv->video_fd, VIDIOCSWIN, &win) == -1)
+ mp_msg(MSGT_TV, MSGL_ERR, "ioctl set window failed: %s\n", strerror(errno));
+
+ if ( !tv_param_mjpeg )
+ {
+ /* map grab buffer */
+ if (ioctl(priv->video_fd, VIDIOCGMBUF, &priv->mbuf) == -1)
+ {
+ mp_msg(MSGT_TV, MSGL_ERR, "ioctl get mbuf failed: %s\n", strerror(errno));
+ return 0;
+ }
+
+ mp_msg(MSGT_TV, MSGL_V, "mbuf: size=%d, frames=%d\n",
+ priv->mbuf.size, priv->mbuf.frames);
+ priv->mmap = mmap(0, priv->mbuf.size, PROT_READ|PROT_WRITE,
+ MAP_SHARED, priv->video_fd, 0);
+ if (priv->mmap == (unsigned char *)-1)
+ {
+ mp_msg(MSGT_TV, MSGL_ERR, "Unable to map memory for buffers: %s\n", strerror(errno));
+ return 0;
+ }
+ mp_msg(MSGT_TV, MSGL_DBG2, "our buffer: %p\n", priv->mmap);
+
+ /* num of buffers */
+ priv->nbuf = priv->mbuf.frames;
+
+ /* video buffers */
+ priv->buf = calloc(priv->nbuf, sizeof(struct video_mmap));
+ if (!priv->buf)
+ return 0;
+ memset(priv->buf, 0, priv->nbuf * sizeof(struct video_mmap));
}
if ( !tv_param_mjpeg )
@@ -827,20 +843,6 @@ static int start(priv_t *priv)
#endif
#if 0
- {
- struct video_window win;
-
- win.x = 0;
- win.y = 0;
- win.width = priv->width;
- win.height = priv->height;
- win.chromakey = -1;
- win.flags = 0;
- //win.clipcount = 0;
-
- ioctl(priv->video_fd, VIDIOCSWIN, &win);
- }
-
// initialize video capture
if (ioctl(priv->video_fd, VIDIOCCAPTURE, &one) == -1)
{