FFmpeg
v4l2_buffers.h
Go to the documentation of this file.
1 /*
2  * V4L2 buffer helper functions.
3  *
4  * Copyright (C) 2017 Alexis Ballier <aballier@gentoo.org>
5  * Copyright (C) 2017 Jorge Ramirez <jorge.ramirez-ortiz@linaro.org>
6  *
7  * This file is part of FFmpeg.
8  *
9  * FFmpeg is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * FFmpeg is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with FFmpeg; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  */
23 
24 #ifndef AVCODEC_V4L2_BUFFERS_H
25 #define AVCODEC_V4L2_BUFFERS_H
26 
27 #include <stdatomic.h>
28 #include <linux/videodev2.h>
29 
30 #include "avcodec.h"
31 
36 };
37 
38 /**
39  * V4L2Buffer (wrapper for v4l2_buffer management)
40  */
41 typedef struct V4L2Buffer {
42  /* each buffer needs to have a reference to its context */
44 
45  /* This object is refcounted per-plane, so we need to keep track
46  * of how many context-refs we are holding. */
49 
50  /* keep track of the mmap address and mmap length */
51  struct V4L2Plane_info {
53  void * mm_addr;
54  size_t length;
55  } plane_info[VIDEO_MAX_PLANES];
56 
58 
59  /* the v4l2_buffer buf.m.planes pointer uses the planes[] mem */
60  struct v4l2_buffer buf;
61  struct v4l2_plane planes[VIDEO_MAX_PLANES];
62 
63  int flags;
65 
66 } V4L2Buffer;
67 
68 /**
69  * Extracts the data from a V4L2Buffer to an AVFrame
70  *
71  * @param[in] frame The AVFRame to push the information to
72  * @param[in] buf The V4L2Buffer to get the information from
73  *
74  * @returns 0 in case of success, AVERROR(EINVAL) if the number of planes is incorrect,
75  * AVERROR(ENOMEM) if the AVBufferRef can't be created.
76  */
78 
79 /**
80  * Extracts the data from a V4L2Buffer to an AVPacket
81  *
82  * @param[in] pkt The AVPacket to push the information to
83  * @param[in] buf The V4L2Buffer to get the information from
84  *
85  * @returns 0 in case of success, AVERROR(EINVAL) if the number of planes is incorrect,
86  * AVERROR(ENOMEM) if the AVBufferRef can't be created.
87  *
88  */
90 
91 /**
92  * Extracts the data from an AVPacket to a V4L2Buffer
93  *
94  * @param[in] frame AVPacket to get the data from
95  * @param[in] avbuf V4L2Bfuffer to push the information to
96  *
97  * @returns 0 in case of success, a negative AVERROR code otherwise
98  */
100 
101 /**
102  * Extracts the data from an AVFrame to a V4L2Buffer
103  *
104  * @param[in] frame AVFrame to get the data from
105  * @param[in] avbuf V4L2Bfuffer to push the information to
106  *
107  * @returns 0 in case of success, a negative AVERROR code otherwise
108  */
110 
111 /**
112  * Initializes a V4L2Buffer
113  *
114  * @param[in] avbuf V4L2Bfuffer to initialize
115  * @param[in] index v4l2 buffer id
116  *
117  * @returns 0 in case of success, a negative AVERROR code otherwise
118  */
120 
121 /**
122  * Enqueues a V4L2Buffer
123  *
124  * @param[in] avbuf V4L2Bfuffer to push to the driver
125  *
126  * @returns 0 in case of success, a negative AVERROR code otherwise
127  */
129 
130 
131 #endif // AVCODEC_V4L2_BUFFERS_H
V4L2Buffer::num_planes
int num_planes
Definition: v4l2_buffers.h:57
ff_v4l2_buffer_initialize
int ff_v4l2_buffer_initialize(V4L2Buffer *avbuf, int index)
Initializes a V4L2Buffer.
Definition: v4l2_buffers.c:494
out
FILE * out
Definition: movenc.c:54
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:300
V4L2Buffer::V4L2Plane_info::length
size_t length
Definition: v4l2_buffers.h:54
ff_v4l2_buffer_avframe_to_buf
int ff_v4l2_buffer_avframe_to_buf(const AVFrame *frame, V4L2Buffer *out)
Extracts the data from an AVFrame to a V4L2Buffer.
Definition: v4l2_buffers.c:412
ff_v4l2_buffer_enqueue
int ff_v4l2_buffer_enqueue(V4L2Buffer *avbuf)
Enqueues a V4L2Buffer.
Definition: v4l2_buffers.c:561
V4L2Buffer::V4L2Plane_info
Definition: v4l2_buffers.h:51
V4L2Buffer::buf
struct v4l2_buffer buf
Definition: v4l2_buffers.h:60
V4L2Buffer::context
struct V4L2Context * context
Definition: v4l2_buffers.h:43
V4L2Buffer
V4L2Buffer (wrapper for v4l2_buffer management)
Definition: v4l2_buffers.h:41
V4L2BUF_RET_USER
@ V4L2BUF_RET_USER
Definition: v4l2_buffers.h:35
V4L2Context
Definition: v4l2_context.h:36
V4L2Buffer::V4L2Plane_info::mm_addr
void * mm_addr
Definition: v4l2_buffers.h:53
ff_v4l2_buffer_buf_to_avpkt
int ff_v4l2_buffer_buf_to_avpkt(AVPacket *pkt, V4L2Buffer *buf)
Extracts the data from a V4L2Buffer to an AVPacket.
Definition: v4l2_buffers.c:453
index
int index
Definition: gxfenc.c:89
V4L2BUF_AVAILABLE
@ V4L2BUF_AVAILABLE
Definition: v4l2_buffers.h:33
V4L2Buffer::context_ref
AVBufferRef * context_ref
Definition: v4l2_buffers.h:47
V4L2BUF_IN_DRIVER
@ V4L2BUF_IN_DRIVER
Definition: v4l2_buffers.h:34
V4L2Buffer::context_refcount
atomic_uint context_refcount
Definition: v4l2_buffers.h:48
plane_info
Definition: vf_edgedetect.c:51
V4L2Buffer::flags
int flags
Definition: v4l2_buffers.h:63
V4L2Buffer::planes
struct v4l2_plane planes[VIDEO_MAX_PLANES]
Definition: v4l2_buffers.h:61
V4L2Buffer::V4L2Plane_info::bytesperline
int bytesperline
Definition: v4l2_buffers.h:52
avcodec.h
ff_v4l2_buffer_avpkt_to_buf
int ff_v4l2_buffer_avpkt_to_buf(const AVPacket *pkt, V4L2Buffer *out)
Extracts the data from an AVPacket to a V4L2Buffer.
Definition: v4l2_buffers.c:478
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:264
pkt
static AVPacket pkt
Definition: demuxing_decoding.c:54
atomic_uint
intptr_t atomic_uint
Definition: stdatomic.h:56
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:81
AVPacket
This structure stores compressed data.
Definition: packet.h:332
ff_v4l2_buffer_buf_to_avframe
int ff_v4l2_buffer_buf_to_avframe(AVFrame *frame, V4L2Buffer *buf)
Extracts the data from a V4L2Buffer to an AVFrame.
Definition: v4l2_buffers.c:419
V4L2Buffer_status
V4L2Buffer_status
Definition: v4l2_buffers.h:32
V4L2Buffer::status
enum V4L2Buffer_status status
Definition: v4l2_buffers.h:64