[FFmpeg-cvslog] v4l2: add a private option for video standard.

Anton Khirnov git at videolan.org
Thu May 26 03:32:22 CEST 2011


ffmpeg | branch: master | Anton Khirnov <anton at khirnov.net> | Mon May 23 21:21:59 2011 +0200| [b3da2692115ea17190544883d15efa36219da99e] | committer: Anton Khirnov

v4l2: add a private option for video standard.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=b3da2692115ea17190544883d15efa36219da99e
---

 libavdevice/v4l2.c |   33 ++++++++++++++++++++++++++++-----
 1 files changed, 28 insertions(+), 5 deletions(-)

diff --git a/libavdevice/v4l2.c b/libavdevice/v4l2.c
index 8e0a6e6..dca31a8 100644
--- a/libavdevice/v4l2.c
+++ b/libavdevice/v4l2.c
@@ -44,6 +44,8 @@
 #include <time.h>
 #include <strings.h>
 #include "libavutil/imgutils.h"
+#include "libavutil/log.h"
+#include "libavutil/opt.h"
 
 static const int desired_video_buffers = 256;
 
@@ -54,6 +56,7 @@ enum io_method {
 };
 
 struct video_data {
+    AVClass *class;
     int fd;
     int frame_format; /* V4L2_PIX_FMT_* */
     enum io_method io_method;
@@ -64,6 +67,7 @@ struct video_data {
     int buffers;
     void **buf_start;
     unsigned int *buf_len;
+    char *standard;
 };
 
 struct buff_data {
@@ -467,31 +471,37 @@ static int v4l2_set_parameters(AVFormatContext *s1, AVFormatParameters *ap)
     }
 
     if (ap->standard) {
+        av_freep(&s->standard);
+        s->standard = av_strdup(ap->standard);
+    }
+
+    if (s->standard) {
         av_log(s1, AV_LOG_DEBUG, "The V4L2 driver set standard: %s\n",
-               ap->standard);
+               s->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);
+                       s->standard);
                 return AVERROR(EIO);
             }
 
-            if (!strcasecmp(standard.name, ap->standard)) {
+            if (!strcasecmp(standard.name, s->standard)) {
                 break;
             }
         }
 
         av_log(s1, AV_LOG_DEBUG, "The V4L2 driver set standard: %s, id: %"PRIu64"\n",
-               ap->standard, (uint64_t)standard.id);
+               s->standard, (uint64_t)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);
+                   s->standard);
             return AVERROR(EIO);
         }
     }
+    av_freep(&s->standard);
 
     if (ap->time_base.num && ap->time_base.den) {
         av_log(s1, AV_LOG_DEBUG, "Setting time per frame to %d/%d\n",
@@ -680,6 +690,18 @@ static int v4l2_read_close(AVFormatContext *s1)
     return 0;
 }
 
+static const AVOption options[] = {
+    { "standard", "", offsetof(struct video_data, standard), FF_OPT_TYPE_STRING, {.str = "NTSC" }, 0, 0, AV_OPT_FLAG_DECODING_PARAM },
+    { NULL },
+};
+
+static const AVClass v4l2_class = {
+    .class_name = "V4L2 indev",
+    .item_name  = av_default_item_name,
+    .option     = options,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
+
 AVInputFormat ff_v4l2_demuxer = {
     "video4linux2",
     NULL_IF_CONFIG_SMALL("Video4Linux2 device grab"),
@@ -689,4 +711,5 @@ AVInputFormat ff_v4l2_demuxer = {
     v4l2_read_packet,
     v4l2_read_close,
     .flags = AVFMT_NOFILE,
+    .priv_class = &v4l2_class,
 };



More information about the ffmpeg-cvslog mailing list