[Ffmpeg-cvslog] r8542 - trunk/libavformat/v4l2.c

lucabe subversion
Thu Mar 29 08:32:54 CEST 2007


Author: lucabe
Date: Thu Mar 29 08:32:54 2007
New Revision: 8542

Modified:
   trunk/libavformat/v4l2.c

Log:
Allow setting v4l2 input and video standard.
Patch by Limin Wang (lance.lmwang AT gmail DOT com)


Modified: trunk/libavformat/v4l2.c
==============================================================================
--- trunk/libavformat/v4l2.c	(original)
+++ trunk/libavformat/v4l2.c	Thu Mar 29 08:32:54 2007
@@ -422,6 +422,57 @@ static void mmap_close(struct video_data
     av_free(s->buf_len);
 }
 
+static int v4l2_set_parameters( AVFormatContext *s1, AVFormatParameters *ap )
+{
+    struct video_data *s = s1->priv_data;
+    struct v4l2_input input;
+    struct v4l2_standard standard;
+    int i;
+
+    /* set tv video input */
+    memset (&input, 0, sizeof (input));
+    input.index = ap->channel;
+    if(ioctl (s->fd, VIDIOC_ENUMINPUT, &input) < 0) {
+        av_log(s1, AV_LOG_ERROR, "The V4L2 driver ioctl enum input failed:\n");
+        return AVERROR_IO;
+    }
+
+    av_log(s1, AV_LOG_DEBUG, "The V4L2 driver set input_id: %d, input: %s\n",
+           ap->channel, input.name);
+    if(ioctl (s->fd, VIDIOC_S_INPUT, &input.index) < 0 ) {
+        av_log(s1, AV_LOG_ERROR, "The V4L2 driver ioctl set input(%d) failed\n",
+            ap->channel);
+        return AVERROR_IO;
+    }
+
+    av_log(s1, AV_LOG_DEBUG, "The V4L2 driver set standard: %s\n",
+           ap->standard );
+    /* set tv standard */
+    memset (&standard, 0, sizeof (standard));
+    for(i=0;;i++) {
+        standard.index = i;
+        if (ioctl(s->fd, VIDIOC_ENUMSTD, &standard) < 0) {
+            av_log(s1, AV_LOG_ERROR, "The V4L2 driver ioctl set standard(%s) failed\n",
+                   ap->standard);
+            return AVERROR_IO;
+        }
+
+        if(!strcasecmp(standard.name, ap->standard)) {
+            break;
+        }
+    }
+
+    av_log(s1, AV_LOG_DEBUG, "The V4L2 driver set standard: %s, id: %"PRIu64"\n",
+           ap->standard, standard.id);
+    if (ioctl(s->fd, VIDIOC_S_STD, &standard.id) < 0) {
+        av_log(s1, AV_LOG_ERROR, "The V4L2 driver ioctl set standard(%s) failed\n",
+            ap->standard);
+        return AVERROR_IO;
+    }
+
+    return 0;
+}
+
 static int v4l2_read_header(AVFormatContext *s1, AVFormatParameters *ap)
 {
     struct video_data *s = s1->priv_data;
@@ -494,6 +545,9 @@ static int v4l2_read_header(AVFormatCont
     }
     s->frame_format = desired_format;
 
+    if( v4l2_set_parameters( s1, ap ) < 0 )
+        return AVERROR_IO;
+
     st->codec->pix_fmt = fmt_v4l2ff(desired_format);
     s->frame_size = avpicture_get_size(st->codec->pix_fmt, width, height);
     if (capabilities & V4L2_CAP_STREAMING) {




More information about the ffmpeg-cvslog mailing list