[FFmpeg-cvslog] v4l2: do not force interlaced mode

Luca Barbato git at videolan.org
Thu Jan 5 02:18:54 CET 2012


ffmpeg | branch: master | Luca Barbato <lu_zero at gentoo.org> | Mon Nov 21 17:03:46 2011 +0100| [af7123b2ad1f5eea8111d0165b64271a9a096265] | committer: Luca Barbato

v4l2: do not force interlaced mode

Video4linux2 supports both interlaced and non-interlaced mode, do not
ask for interlaced if not necessary.

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

 libavdevice/v4l2.c |   10 ++++++++--
 1 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/libavdevice/v4l2.c b/libavdevice/v4l2.c
index eb16171..a9e32bb 100644
--- a/libavdevice/v4l2.c
+++ b/libavdevice/v4l2.c
@@ -64,6 +64,7 @@ struct video_data {
     enum io_method io_method;
     int width, height;
     int frame_size;
+    int interlaced;
     int top_field_first;
 
     int buffers;
@@ -162,7 +163,7 @@ static int device_init(AVFormatContext *ctx, int *width, int *height, uint32_t p
     fmt.fmt.pix.width = *width;
     fmt.fmt.pix.height = *height;
     fmt.fmt.pix.pixelformat = pix_fmt;
-    fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
+    fmt.fmt.pix.field = V4L2_FIELD_ANY;
     res = ioctl(fd, VIDIOC_S_FMT, &fmt);
     if ((*width != fmt.fmt.pix.width) || (*height != fmt.fmt.pix.height)) {
         av_log(ctx, AV_LOG_INFO, "The V4L2 driver changed the video from %dx%d to %dx%d\n", *width, *height, fmt.fmt.pix.width, fmt.fmt.pix.height);
@@ -175,6 +176,11 @@ static int device_init(AVFormatContext *ctx, int *width, int *height, uint32_t p
         res = -1;
     }
 
+    if (fmt.fmt.pix.field == V4L2_FIELD_INTERLACED) {
+        av_log(ctx, AV_LOG_DEBUG, "The V4L2 driver using the interlaced mode");
+        s->interlaced = 1;
+    }
+
     return res;
 }
 
@@ -686,7 +692,7 @@ static int v4l2_read_packet(AVFormatContext *s1, AVPacket *pkt)
         return res;
     }
 
-    if (s1->streams[0]->codec->coded_frame) {
+    if (s1->streams[0]->codec->coded_frame && s->interlaced) {
         s1->streams[0]->codec->coded_frame->interlaced_frame = 1;
         s1->streams[0]->codec->coded_frame->top_field_first = s->top_field_first;
     }



More information about the ffmpeg-cvslog mailing list