mirror of https://git.ffmpeg.org/ffmpeg.git
parent
a896d7f45a
commit
246007d370
|
@ -51,17 +51,10 @@
|
||||||
|
|
||||||
static const int desired_video_buffers = 256;
|
static const int desired_video_buffers = 256;
|
||||||
|
|
||||||
enum io_method {
|
|
||||||
io_read,
|
|
||||||
io_mmap,
|
|
||||||
io_userptr
|
|
||||||
};
|
|
||||||
|
|
||||||
struct video_data {
|
struct video_data {
|
||||||
AVClass *class;
|
AVClass *class;
|
||||||
int fd;
|
int fd;
|
||||||
int frame_format; /* V4L2_PIX_FMT_* */
|
int frame_format; /* V4L2_PIX_FMT_* */
|
||||||
enum io_method io_method;
|
|
||||||
int width, height;
|
int width, height;
|
||||||
int frame_size;
|
int frame_size;
|
||||||
int interlaced;
|
int interlaced;
|
||||||
|
@ -337,11 +330,6 @@ static int mmap_init(AVFormatContext *ctx)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int read_init(AVFormatContext *ctx)
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void mmap_release_buffer(AVPacket *pkt)
|
static void mmap_release_buffer(AVPacket *pkt)
|
||||||
{
|
{
|
||||||
struct v4l2_buffer buf;
|
struct v4l2_buffer buf;
|
||||||
|
@ -422,11 +410,6 @@ static int mmap_read_frame(AVFormatContext *ctx, AVPacket *pkt)
|
||||||
return s->buf_len[buf.index];
|
return s->buf_len[buf.index];
|
||||||
}
|
}
|
||||||
|
|
||||||
static int read_frame(AVFormatContext *ctx, AVPacket *pkt)
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int mmap_start(AVFormatContext *ctx)
|
static int mmap_start(AVFormatContext *ctx)
|
||||||
{
|
{
|
||||||
struct video_data *s = ctx->priv_data;
|
struct video_data *s = ctx->priv_data;
|
||||||
|
@ -693,19 +676,13 @@ static int v4l2_read_header(AVFormatContext *s1, AVFormatParameters *ap)
|
||||||
avpicture_get_size(st->codec->pix_fmt, s->width, s->height);
|
avpicture_get_size(st->codec->pix_fmt, s->width, s->height);
|
||||||
|
|
||||||
if (capabilities & V4L2_CAP_STREAMING) {
|
if (capabilities & V4L2_CAP_STREAMING) {
|
||||||
s->io_method = io_mmap;
|
if (!(res = mmap_init(s1)))
|
||||||
res = mmap_init(s1);
|
|
||||||
if (res == 0) {
|
|
||||||
res = mmap_start(s1);
|
res = mmap_start(s1);
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
s->io_method = io_read;
|
res = AVERROR(ENOSYS);
|
||||||
res = read_init(s1);
|
|
||||||
}
|
}
|
||||||
if (res < 0) {
|
if (res < 0) {
|
||||||
close(s->fd);
|
close(s->fd);
|
||||||
|
|
||||||
res = AVERROR(EIO);
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
s->top_field_first = first_field(s->fd);
|
s->top_field_first = first_field(s->fd);
|
||||||
|
@ -726,18 +703,8 @@ static int v4l2_read_packet(AVFormatContext *s1, AVPacket *pkt)
|
||||||
AVFrame *frame = s1->streams[0]->codec->coded_frame;
|
AVFrame *frame = s1->streams[0]->codec->coded_frame;
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
if (s->io_method == io_mmap) {
|
av_init_packet(pkt);
|
||||||
av_init_packet(pkt);
|
if ((res = mmap_read_frame(s1, pkt)) < 0) {
|
||||||
res = mmap_read_frame(s1, pkt);
|
|
||||||
} else if (s->io_method == io_read) {
|
|
||||||
if (av_new_packet(pkt, s->frame_size) < 0)
|
|
||||||
return AVERROR(EIO);
|
|
||||||
|
|
||||||
res = read_frame(s1, pkt);
|
|
||||||
} else {
|
|
||||||
return AVERROR(EIO);
|
|
||||||
}
|
|
||||||
if (res < 0) {
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -753,9 +720,7 @@ static int v4l2_read_close(AVFormatContext *s1)
|
||||||
{
|
{
|
||||||
struct video_data *s = s1->priv_data;
|
struct video_data *s = s1->priv_data;
|
||||||
|
|
||||||
if (s->io_method == io_mmap) {
|
mmap_close(s);
|
||||||
mmap_close(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
close(s->fd);
|
close(s->fd);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue