|
|
|
@ -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, |
|
|
|
|
}; |
|
|
|
|