|
|
|
@ -169,14 +169,11 @@ static int device_init(AVFormatContext *ctx, int *width, int *height, |
|
|
|
|
{ |
|
|
|
|
struct video_data *s = ctx->priv_data; |
|
|
|
|
int fd = s->fd; |
|
|
|
|
struct v4l2_format fmt; |
|
|
|
|
struct v4l2_format fmt = { .type = V4L2_BUF_TYPE_VIDEO_CAPTURE }; |
|
|
|
|
struct v4l2_pix_format *pix = &fmt.fmt.pix; |
|
|
|
|
|
|
|
|
|
int res; |
|
|
|
|
|
|
|
|
|
memset(&fmt, 0, sizeof(struct v4l2_format)); |
|
|
|
|
|
|
|
|
|
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; |
|
|
|
|
pix->width = *width; |
|
|
|
|
pix->height = *height; |
|
|
|
|
pix->pixelformat = pix_fmt; |
|
|
|
@ -334,14 +331,14 @@ static void list_formats(AVFormatContext *ctx, int fd, int type) |
|
|
|
|
|
|
|
|
|
static int mmap_init(AVFormatContext *ctx) |
|
|
|
|
{ |
|
|
|
|
struct video_data *s = ctx->priv_data; |
|
|
|
|
struct v4l2_requestbuffers req; |
|
|
|
|
int i, res; |
|
|
|
|
struct video_data *s = ctx->priv_data; |
|
|
|
|
struct v4l2_requestbuffers req = { |
|
|
|
|
.type = V4L2_BUF_TYPE_VIDEO_CAPTURE, |
|
|
|
|
.count = desired_video_buffers, |
|
|
|
|
.memory = V4L2_MEMORY_MMAP |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
memset(&req, 0, sizeof(struct v4l2_requestbuffers)); |
|
|
|
|
req.count = desired_video_buffers; |
|
|
|
|
req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; |
|
|
|
|
req.memory = V4L2_MEMORY_MMAP; |
|
|
|
|
res = ioctl(s->fd, VIDIOC_REQBUFS, &req); |
|
|
|
|
if (res < 0) { |
|
|
|
|
if (errno == EINVAL) { |
|
|
|
@ -374,12 +371,12 @@ static int mmap_init(AVFormatContext *ctx) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for (i = 0; i < req.count; i++) { |
|
|
|
|
struct v4l2_buffer buf; |
|
|
|
|
struct v4l2_buffer buf = { |
|
|
|
|
.type = V4L2_BUF_TYPE_VIDEO_CAPTURE, |
|
|
|
|
.index = i, |
|
|
|
|
.memory = V4L2_MEMORY_MMAP |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
memset(&buf, 0, sizeof(struct v4l2_buffer)); |
|
|
|
|
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; |
|
|
|
|
buf.memory = V4L2_MEMORY_MMAP; |
|
|
|
|
buf.index = i; |
|
|
|
|
res = ioctl(s->fd, VIDIOC_QUERYBUF, &buf); |
|
|
|
|
if (res < 0) { |
|
|
|
|
av_log(ctx, AV_LOG_ERROR, "ioctl(VIDIOC_QUERYBUF)\n"); |
|
|
|
@ -411,14 +408,13 @@ static int mmap_init(AVFormatContext *ctx) |
|
|
|
|
|
|
|
|
|
static void mmap_release_buffer(AVPacket *pkt) |
|
|
|
|
{ |
|
|
|
|
struct v4l2_buffer buf; |
|
|
|
|
struct v4l2_buffer buf = { 0 }; |
|
|
|
|
int res, fd; |
|
|
|
|
struct buff_data *buf_descriptor = pkt->priv; |
|
|
|
|
|
|
|
|
|
if (pkt->data == NULL) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
memset(&buf, 0, sizeof(struct v4l2_buffer)); |
|
|
|
|
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; |
|
|
|
|
buf.memory = V4L2_MEMORY_MMAP; |
|
|
|
|
buf.index = buf_descriptor->index; |
|
|
|
@ -437,15 +433,14 @@ static void mmap_release_buffer(AVPacket *pkt) |
|
|
|
|
static int mmap_read_frame(AVFormatContext *ctx, AVPacket *pkt) |
|
|
|
|
{ |
|
|
|
|
struct video_data *s = ctx->priv_data; |
|
|
|
|
struct v4l2_buffer buf; |
|
|
|
|
struct v4l2_buffer buf = { |
|
|
|
|
.type = V4L2_BUF_TYPE_VIDEO_CAPTURE, |
|
|
|
|
.memory = V4L2_MEMORY_MMAP |
|
|
|
|
}; |
|
|
|
|
struct buff_data *buf_descriptor; |
|
|
|
|
struct pollfd p = { .fd = s->fd, .events = POLLIN }; |
|
|
|
|
int res; |
|
|
|
|
|
|
|
|
|
memset(&buf, 0, sizeof(struct v4l2_buffer)); |
|
|
|
|
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; |
|
|
|
|
buf.memory = V4L2_MEMORY_MMAP; |
|
|
|
|
|
|
|
|
|
res = poll(&p, 1, s->timeout); |
|
|
|
|
if (res < 0) |
|
|
|
|
return AVERROR(errno); |
|
|
|
@ -504,12 +499,11 @@ static int mmap_start(AVFormatContext *ctx) |
|
|
|
|
int i, res; |
|
|
|
|
|
|
|
|
|
for (i = 0; i < s->buffers; i++) { |
|
|
|
|
struct v4l2_buffer buf; |
|
|
|
|
|
|
|
|
|
memset(&buf, 0, sizeof(struct v4l2_buffer)); |
|
|
|
|
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; |
|
|
|
|
buf.memory = V4L2_MEMORY_MMAP; |
|
|
|
|
buf.index = i; |
|
|
|
|
struct v4l2_buffer buf = { |
|
|
|
|
.type = V4L2_BUF_TYPE_VIDEO_CAPTURE, |
|
|
|
|
.index = i, |
|
|
|
|
.memory = V4L2_MEMORY_MMAP |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
res = ioctl(s->fd, VIDIOC_QBUF, &buf); |
|
|
|
|
if (res < 0) { |
|
|
|
@ -552,12 +546,12 @@ static void mmap_close(struct video_data *s) |
|
|
|
|
static int v4l2_set_parameters(AVFormatContext *s1, AVFormatParameters *ap) |
|
|
|
|
{ |
|
|
|
|
struct video_data *s = s1->priv_data; |
|
|
|
|
struct v4l2_input input; |
|
|
|
|
struct v4l2_standard standard; |
|
|
|
|
struct v4l2_input input = { 0 }; |
|
|
|
|
struct v4l2_standard standard = { 0 }; |
|
|
|
|
struct v4l2_streamparm streamparm = { 0 }; |
|
|
|
|
struct v4l2_fract *tpf = &streamparm.parm.capture.timeperframe; |
|
|
|
|
AVRational framerate_q = { 0 }; |
|
|
|
|
int i, ret; |
|
|
|
|
AVRational framerate_q; |
|
|
|
|
|
|
|
|
|
streamparm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; |
|
|
|
|
|
|
|
|
@ -569,7 +563,6 @@ static int v4l2_set_parameters(AVFormatContext *s1, AVFormatParameters *ap) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* set tv video input */ |
|
|
|
|
memset (&input, 0, sizeof (input)); |
|
|
|
|
input.index = s->channel; |
|
|
|
|
if (ioctl(s->fd, VIDIOC_ENUMINPUT, &input) < 0) { |
|
|
|
|
av_log(s1, AV_LOG_ERROR, "The V4L2 driver ioctl enum input failed:\n"); |
|
|
|
@ -589,7 +582,6 @@ static int v4l2_set_parameters(AVFormatContext *s1, AVFormatParameters *ap) |
|
|
|
|
av_log(s1, AV_LOG_DEBUG, "The V4L2 driver set standard: %s\n", |
|
|
|
|
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) { |
|
|
|
|