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
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:289
V4L2Buffer_status
Definition: v4l2_buffers.h:32
This structure describes decoded (raw) audio or video data.
Definition: frame.h:295
int ff_v4l2_buffer_buf_to_avframe(AVFrame *frame, V4L2Buffer *buf)
Extracts the data from a V4L2Buffer to an AVFrame.
Definition: v4l2_buffers.c:304
int ff_v4l2_buffer_enqueue(V4L2Buffer *avbuf)
Enqueues a V4L2Buffer.
Definition: v4l2_buffers.c:465
static AVPacket pkt
enum V4L2Buffer_status status
Definition: v4l2_buffers.h:64
int ff_v4l2_buffer_initialize(V4L2Buffer *avbuf, int index)
Initializes a V4L2Buffer.
Definition: v4l2_buffers.c:396
struct V4L2Context * context
Definition: v4l2_buffers.h:43
int ff_v4l2_buffer_buf_to_avpkt(AVPacket *pkt, V4L2Buffer *buf)
Extracts the data from a V4L2Buffer to an AVPacket.
Definition: v4l2_buffers.c:355
struct v4l2_buffer buf
Definition: v4l2_buffers.h:60
AVBufferRef * context_ref
Definition: v4l2_buffers.h:47
struct v4l2_plane planes[VIDEO_MAX_PLANES]
Definition: v4l2_buffers.h:61
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
atomic_uint context_refcount
Definition: v4l2_buffers.h:48
Libavcodec external API header.
V4L2Buffer (wrapper for v4l2_buffer management)
Definition: v4l2_buffers.h:41
int index
Definition: gxfenc.c:89
intptr_t atomic_uint
Definition: stdatomic.h:56
A reference to a data buffer.
Definition: buffer.h:81
int num_planes
Definition: v4l2_buffers.h:57
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:380
FILE * out
Definition: movenc.c:54
This structure stores compressed data.
Definition: avcodec.h:1454