v4l2: add a private option for video standard.
This commit is contained in:
		
							parent
							
								
									a861ffeffa
								
							
						
					
					
						commit
						b3da269211
					
				@ -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,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user