Blame view
include/media/v4l2-mem2mem.h
16.7 KB
7f98639de V4L/DVB: add memo... |
1 2 3 4 5 6 7 |
/* * Memory-to-memory device framework for Video for Linux 2. * * Helper functions for devices that use memory buffers for both source * and destination. * * Copyright (c) 2009 Samsung Electronics Co., Ltd. |
950720840 [media] Update Pa... |
8 |
* Pawel Osciak, <pawel@osciak.com> |
7f98639de V4L/DVB: add memo... |
9 10 11 12 13 14 15 16 17 18 |
* Marek Szyprowski, <m.szyprowski@samsung.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the * License, or (at your option) any later version */ #ifndef _MEDIA_V4L2_MEM2MEM_H #define _MEDIA_V4L2_MEM2MEM_H |
c139990e8 [media] media: vi... |
19 |
#include <media/videobuf2-v4l2.h> |
7f98639de V4L/DVB: add memo... |
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
/** * struct v4l2_m2m_ops - mem-to-mem device driver callbacks * @device_run: required. Begin the actual job (transaction) inside this * callback. * The job does NOT have to end before this callback returns * (and it will be the usual case). When the job finishes, * v4l2_m2m_job_finish() has to be called. * @job_ready: optional. Should return 0 if the driver does not have a job * fully prepared to run yet (i.e. it will not be able to finish a * transaction without sleeping). If not provided, it will be * assumed that one source and one destination buffer are all * that is required for the driver to perform one full transaction. * This method may not sleep. * @job_abort: required. Informs the driver that it has to abort the currently * running transaction as soon as possible (i.e. as soon as it can * stop the device safely; e.g. in the next interrupt handler), * even if the transaction would not have been finished by then. * After the driver performs the necessary steps, it has to call * v4l2_m2m_job_finish() (as if the transaction ended normally). * This function does not have to (and will usually not) wait * until the device enters a state when it can be stopped. |
62c0d016d [media] Docbook: ... |
42 |
* @lock: optional. Define a driver's own lock callback, instead of using |
5fa5edbe5 [media] v4l2-mem2... |
43 |
* &v4l2_m2m_ctx->q_lock. |
62c0d016d [media] Docbook: ... |
44 |
* @unlock: optional. Define a driver's own unlock callback, instead of |
5fa5edbe5 [media] v4l2-mem2... |
45 |
* using &v4l2_m2m_ctx->q_lock. |
7f98639de V4L/DVB: add memo... |
46 47 48 49 50 |
*/ struct v4l2_m2m_ops { void (*device_run)(void *priv); int (*job_ready)(void *priv); void (*job_abort)(void *priv); |
908a0d7c5 [media] v4l: mem2... |
51 52 |
void (*lock)(void *priv); void (*unlock)(void *priv); |
7f98639de V4L/DVB: add memo... |
53 54 55 |
}; struct v4l2_m2m_dev; |
5fa5edbe5 [media] v4l2-mem2... |
56 57 58 59 60 61 62 63 64 65 66 67 68 |
/** * struct v4l2_m2m_queue_ctx - represents a queue for buffers ready to be * processed * * @q: pointer to struct &vb2_queue * @rdy_queue: List of V4L2 mem-to-mem queues * @rdy_spinlock: spin lock to protect the struct usage * @num_rdy: number of buffers ready to be processed * @buffered: is the queue buffered? * * Queue for buffers ready to be processed as soon as this * instance receives access to the device. */ |
7f98639de V4L/DVB: add memo... |
69 |
struct v4l2_m2m_queue_ctx { |
908a0d7c5 [media] v4l: mem2... |
70 |
struct vb2_queue q; |
7f98639de V4L/DVB: add memo... |
71 |
|
7f98639de V4L/DVB: add memo... |
72 |
struct list_head rdy_queue; |
908a0d7c5 [media] v4l: mem2... |
73 |
spinlock_t rdy_spinlock; |
7f98639de V4L/DVB: add memo... |
74 |
u8 num_rdy; |
33bdd5a88 [media] mem2mem: ... |
75 |
bool buffered; |
7f98639de V4L/DVB: add memo... |
76 |
}; |
5fa5edbe5 [media] v4l2-mem2... |
77 78 79 80 |
/** * struct v4l2_m2m_ctx - Memory to memory context structure * * @q_lock: struct &mutex lock |
9f8d3a2ee [media] v4l2-mem2... |
81 |
* @m2m_dev: opaque pointer to the internal data to handle M2M context |
5fa5edbe5 [media] v4l2-mem2... |
82 83 84 85 86 87 88 89 |
* @cap_q_ctx: Capture (output to memory) queue context * @out_q_ctx: Output (input from memory) queue context * @queue: List of memory to memory contexts * @job_flags: Job queue flags, used internally by v4l2-mem2mem.c: * %TRANS_QUEUED, %TRANS_RUNNING and %TRANS_ABORT. * @finished: Wait queue used to signalize when a job queue finished. * @priv: Instance private data */ |
7f98639de V4L/DVB: add memo... |
90 |
struct v4l2_m2m_ctx { |
8e6e8f93f [media] V4L: Add ... |
91 92 |
/* optional cap/out vb2 queues lock */ struct mutex *q_lock; |
5fa5edbe5 [media] v4l2-mem2... |
93 |
/* internal use only */ |
7f98639de V4L/DVB: add memo... |
94 |
struct v4l2_m2m_dev *m2m_dev; |
7f98639de V4L/DVB: add memo... |
95 |
struct v4l2_m2m_queue_ctx cap_q_ctx; |
7f98639de V4L/DVB: add memo... |
96 97 98 99 100 |
struct v4l2_m2m_queue_ctx out_q_ctx; /* For device job queue */ struct list_head queue; unsigned long job_flags; |
908a0d7c5 [media] v4l: mem2... |
101 |
wait_queue_head_t finished; |
7f98639de V4L/DVB: add memo... |
102 |
|
7f98639de V4L/DVB: add memo... |
103 104 |
void *priv; }; |
5fa5edbe5 [media] v4l2-mem2... |
105 106 107 108 109 110 |
/** * struct v4l2_m2m_buffer - Memory to memory buffer * * @vb: pointer to struct &vb2_v4l2_buffer * @list: list of m2m buffers */ |
908a0d7c5 [media] v4l: mem2... |
111 |
struct v4l2_m2m_buffer { |
2d7007153 [media] media: vi... |
112 |
struct vb2_v4l2_buffer vb; |
908a0d7c5 [media] v4l: mem2... |
113 114 |
struct list_head list; }; |
4781646c1 [media] v4l2-mem2... |
115 116 117 |
/** * v4l2_m2m_get_curr_priv() - return driver private data for the currently * running instance or NULL if no instance is running |
dcbd87358 [media] v4l2-mem2... |
118 |
* |
9f8d3a2ee [media] v4l2-mem2... |
119 |
* @m2m_dev: opaque pointer to the internal data to handle M2M context |
4781646c1 [media] v4l2-mem2... |
120 |
*/ |
7f98639de V4L/DVB: add memo... |
121 |
void *v4l2_m2m_get_curr_priv(struct v4l2_m2m_dev *m2m_dev); |
4781646c1 [media] v4l2-mem2... |
122 123 |
/** * v4l2_m2m_get_vq() - return vb2_queue for the given type |
dcbd87358 [media] v4l2-mem2... |
124 125 126 |
* * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx * @type: type of the V4L2 buffer, as defined by enum &v4l2_buf_type |
4781646c1 [media] v4l2-mem2... |
127 |
*/ |
908a0d7c5 [media] v4l: mem2... |
128 |
struct vb2_queue *v4l2_m2m_get_vq(struct v4l2_m2m_ctx *m2m_ctx, |
7f98639de V4L/DVB: add memo... |
129 |
enum v4l2_buf_type type); |
4781646c1 [media] v4l2-mem2... |
130 131 132 |
/** * v4l2_m2m_try_schedule() - check whether an instance is ready to be added to * the pending job queue and add it if so. |
dcbd87358 [media] v4l2-mem2... |
133 134 |
* * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx |
4781646c1 [media] v4l2-mem2... |
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
* * There are three basic requirements an instance has to meet to be able to run: * 1) at least one source buffer has to be queued, * 2) at least one destination buffer has to be queued, * 3) streaming has to be on. * * If a queue is buffered (for example a decoder hardware ringbuffer that has * to be drained before doing streamoff), allow scheduling without v4l2 buffers * on that queue. * * There may also be additional, custom requirements. In such case the driver * should supply a custom callback (job_ready in v4l2_m2m_ops) that should * return 1 if the instance is ready. * An example of the above could be an instance that requires more than one * src/dst buffer per transaction. */ |
1190a419e [media] v4l2-mem2... |
151 |
void v4l2_m2m_try_schedule(struct v4l2_m2m_ctx *m2m_ctx); |
4781646c1 [media] v4l2-mem2... |
152 153 154 155 |
/** * v4l2_m2m_job_finish() - inform the framework that a job has been finished * and have it clean up * |
9f8d3a2ee [media] v4l2-mem2... |
156 |
* @m2m_dev: opaque pointer to the internal data to handle M2M context |
dcbd87358 [media] v4l2-mem2... |
157 158 |
* @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx * |
4781646c1 [media] v4l2-mem2... |
159 160 161 162 |
* Called by a driver to yield back the device after it has finished with it. * Should be called as soon as possible after reaching a state which allows * other instances to take control of the device. * |
5fa5edbe5 [media] v4l2-mem2... |
163 164 165 |
* This function has to be called only after &v4l2_m2m_ops->device_run * callback has been called on the driver. To prevent recursion, it should * not be called directly from the &v4l2_m2m_ops->device_run callback though. |
4781646c1 [media] v4l2-mem2... |
166 |
*/ |
7f98639de V4L/DVB: add memo... |
167 168 |
void v4l2_m2m_job_finish(struct v4l2_m2m_dev *m2m_dev, struct v4l2_m2m_ctx *m2m_ctx); |
908a0d7c5 [media] v4l: mem2... |
169 |
static inline void |
2d7007153 [media] media: vi... |
170 |
v4l2_m2m_buf_done(struct vb2_v4l2_buffer *buf, enum vb2_buffer_state state) |
908a0d7c5 [media] v4l: mem2... |
171 |
{ |
2d7007153 [media] media: vi... |
172 |
vb2_buffer_done(&buf->vb2_buf, state); |
908a0d7c5 [media] v4l: mem2... |
173 |
} |
4781646c1 [media] v4l2-mem2... |
174 175 |
/** * v4l2_m2m_reqbufs() - multi-queue-aware REQBUFS multiplexer |
dcbd87358 [media] v4l2-mem2... |
176 177 178 179 |
* * @file: pointer to struct &file * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx * @reqbufs: pointer to struct &v4l2_requestbuffers |
4781646c1 [media] v4l2-mem2... |
180 |
*/ |
7f98639de V4L/DVB: add memo... |
181 182 |
int v4l2_m2m_reqbufs(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, struct v4l2_requestbuffers *reqbufs); |
4781646c1 [media] v4l2-mem2... |
183 184 185 |
/** * v4l2_m2m_querybuf() - multi-queue-aware QUERYBUF multiplexer * |
dcbd87358 [media] v4l2-mem2... |
186 187 188 189 |
* @file: pointer to struct &file * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx * @buf: pointer to struct &v4l2_buffer * |
4781646c1 [media] v4l2-mem2... |
190 191 |
* See v4l2_m2m_mmap() documentation for details. */ |
7f98639de V4L/DVB: add memo... |
192 193 |
int v4l2_m2m_querybuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, struct v4l2_buffer *buf); |
4781646c1 [media] v4l2-mem2... |
194 195 196 |
/** * v4l2_m2m_qbuf() - enqueue a source or destination buffer, depending on * the type |
dcbd87358 [media] v4l2-mem2... |
197 198 199 200 |
* * @file: pointer to struct &file * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx * @buf: pointer to struct &v4l2_buffer |
4781646c1 [media] v4l2-mem2... |
201 |
*/ |
7f98639de V4L/DVB: add memo... |
202 203 |
int v4l2_m2m_qbuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, struct v4l2_buffer *buf); |
4781646c1 [media] v4l2-mem2... |
204 205 206 207 |
/** * v4l2_m2m_dqbuf() - dequeue a source or destination buffer, depending on * the type |
dcbd87358 [media] v4l2-mem2... |
208 209 210 211 |
* * @file: pointer to struct &file * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx * @buf: pointer to struct &v4l2_buffer |
4781646c1 [media] v4l2-mem2... |
212 |
*/ |
7f98639de V4L/DVB: add memo... |
213 214 |
int v4l2_m2m_dqbuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, struct v4l2_buffer *buf); |
4781646c1 [media] v4l2-mem2... |
215 216 217 218 |
/** * v4l2_m2m_prepare_buf() - prepare a source or destination buffer, depending on * the type |
dcbd87358 [media] v4l2-mem2... |
219 220 221 222 |
* * @file: pointer to struct &file * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx * @buf: pointer to struct &v4l2_buffer |
4781646c1 [media] v4l2-mem2... |
223 |
*/ |
e68cf471e [media] v4l2-mem2... |
224 225 |
int v4l2_m2m_prepare_buf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, struct v4l2_buffer *buf); |
4781646c1 [media] v4l2-mem2... |
226 227 228 229 |
/** * v4l2_m2m_create_bufs() - create a source or destination buffer, depending * on the type |
dcbd87358 [media] v4l2-mem2... |
230 231 232 233 |
* * @file: pointer to struct &file * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx * @create: pointer to struct &v4l2_create_buffers |
4781646c1 [media] v4l2-mem2... |
234 |
*/ |
8b94ca61d [media] v4l2-mem2... |
235 236 |
int v4l2_m2m_create_bufs(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, struct v4l2_create_buffers *create); |
7f98639de V4L/DVB: add memo... |
237 |
|
4781646c1 [media] v4l2-mem2... |
238 239 240 |
/** * v4l2_m2m_expbuf() - export a source or destination buffer, depending on * the type |
dcbd87358 [media] v4l2-mem2... |
241 242 243 244 |
* * @file: pointer to struct &file * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx * @eb: pointer to struct &v4l2_exportbuffer |
4781646c1 [media] v4l2-mem2... |
245 |
*/ |
83ae7c5a1 [media] v4l: vb2:... |
246 247 |
int v4l2_m2m_expbuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, struct v4l2_exportbuffer *eb); |
4781646c1 [media] v4l2-mem2... |
248 249 |
/** * v4l2_m2m_streamon() - turn on streaming for a video queue |
dcbd87358 [media] v4l2-mem2... |
250 251 252 253 |
* * @file: pointer to struct &file * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx * @type: type of the V4L2 buffer, as defined by enum &v4l2_buf_type |
4781646c1 [media] v4l2-mem2... |
254 |
*/ |
7f98639de V4L/DVB: add memo... |
255 256 |
int v4l2_m2m_streamon(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, enum v4l2_buf_type type); |
4781646c1 [media] v4l2-mem2... |
257 258 259 |
/** * v4l2_m2m_streamoff() - turn off streaming for a video queue |
dcbd87358 [media] v4l2-mem2... |
260 261 262 263 |
* * @file: pointer to struct &file * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx * @type: type of the V4L2 buffer, as defined by enum &v4l2_buf_type |
4781646c1 [media] v4l2-mem2... |
264 |
*/ |
7f98639de V4L/DVB: add memo... |
265 266 |
int v4l2_m2m_streamoff(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, enum v4l2_buf_type type); |
4781646c1 [media] v4l2-mem2... |
267 268 269 |
/** * v4l2_m2m_poll() - poll replacement, for destination buffers only * |
dcbd87358 [media] v4l2-mem2... |
270 271 272 273 |
* @file: pointer to struct &file * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx * @wait: pointer to struct &poll_table_struct * |
4781646c1 [media] v4l2-mem2... |
274 275 276 277 278 |
* Call from the driver's poll() function. Will poll both queues. If a buffer * is available to dequeue (with dqbuf) from the source queue, this will * indicate that a non-blocking write can be performed, while read will be * returned in case of the destination queue. */ |
7f98639de V4L/DVB: add memo... |
279 280 |
unsigned int v4l2_m2m_poll(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, struct poll_table_struct *wait); |
4781646c1 [media] v4l2-mem2... |
281 282 283 |
/** * v4l2_m2m_mmap() - source and destination queues-aware mmap multiplexer * |
dcbd87358 [media] v4l2-mem2... |
284 285 286 287 |
* @file: pointer to struct &file * @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx * @vma: pointer to struct &vm_area_struct * |
4781646c1 [media] v4l2-mem2... |
288 289 290 291 292 293 294 |
* Call from driver's mmap() function. Will handle mmap() for both queues * seamlessly for videobuffer, which will receive normal per-queue offsets and * proper videobuf queue pointers. The differentiation is made outside videobuf * by adding a predefined offset to buffers from one of the queues and * subtracting it before passing it back to videobuf. Only drivers (and * thus applications) receive modified offsets. */ |
7f98639de V4L/DVB: add memo... |
295 296 |
int v4l2_m2m_mmap(struct file *file, struct v4l2_m2m_ctx *m2m_ctx, struct vm_area_struct *vma); |
4781646c1 [media] v4l2-mem2... |
297 298 299 |
/** * v4l2_m2m_init() - initialize per-driver m2m data * |
dcbd87358 [media] v4l2-mem2... |
300 301 |
* @m2m_ops: pointer to struct v4l2_m2m_ops * |
5fa5edbe5 [media] v4l2-mem2... |
302 303 304 |
* Usually called from driver's ``probe()`` function. * * Return: returns an opaque pointer to the internal data to handle M2M context |
4781646c1 [media] v4l2-mem2... |
305 |
*/ |
b1252eb83 [media] media: me... |
306 |
struct v4l2_m2m_dev *v4l2_m2m_init(const struct v4l2_m2m_ops *m2m_ops); |
4781646c1 [media] v4l2-mem2... |
307 308 309 310 |
/** * v4l2_m2m_release() - cleans up and frees a m2m_dev structure * |
9f8d3a2ee [media] v4l2-mem2... |
311 |
* @m2m_dev: opaque pointer to the internal data to handle M2M context |
dcbd87358 [media] v4l2-mem2... |
312 |
* |
5fa5edbe5 [media] v4l2-mem2... |
313 |
* Usually called from driver's ``remove()`` function. |
4781646c1 [media] v4l2-mem2... |
314 |
*/ |
7f98639de V4L/DVB: add memo... |
315 |
void v4l2_m2m_release(struct v4l2_m2m_dev *m2m_dev); |
4781646c1 [media] v4l2-mem2... |
316 317 |
/** * v4l2_m2m_ctx_init() - allocate and initialize a m2m context |
dcbd87358 [media] v4l2-mem2... |
318 |
* |
9f8d3a2ee [media] v4l2-mem2... |
319 |
* @m2m_dev: opaque pointer to the internal data to handle M2M context |
dcbd87358 [media] v4l2-mem2... |
320 321 322 |
* @drv_priv: driver's instance private data * @queue_init: a callback for queue type-specific initialization function * to be used for initializing videobuf_queues |
4781646c1 [media] v4l2-mem2... |
323 |
* |
5fa5edbe5 [media] v4l2-mem2... |
324 |
* Usually called from driver's ``open()`` function. |
4781646c1 [media] v4l2-mem2... |
325 |
*/ |
908a0d7c5 [media] v4l: mem2... |
326 327 328 |
struct v4l2_m2m_ctx *v4l2_m2m_ctx_init(struct v4l2_m2m_dev *m2m_dev, void *drv_priv, int (*queue_init)(void *priv, struct vb2_queue *src_vq, struct vb2_queue *dst_vq)); |
33bdd5a88 [media] mem2mem: ... |
329 330 331 332 333 334 335 336 337 338 339 |
static inline void v4l2_m2m_set_src_buffered(struct v4l2_m2m_ctx *m2m_ctx, bool buffered) { m2m_ctx->out_q_ctx.buffered = buffered; } static inline void v4l2_m2m_set_dst_buffered(struct v4l2_m2m_ctx *m2m_ctx, bool buffered) { m2m_ctx->cap_q_ctx.buffered = buffered; } |
4781646c1 [media] v4l2-mem2... |
340 341 342 |
/** * v4l2_m2m_ctx_release() - release m2m context * |
dcbd87358 [media] v4l2-mem2... |
343 344 |
* @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx * |
4781646c1 [media] v4l2-mem2... |
345 346 |
* Usually called from driver's release() function. */ |
7f98639de V4L/DVB: add memo... |
347 |
void v4l2_m2m_ctx_release(struct v4l2_m2m_ctx *m2m_ctx); |
4781646c1 [media] v4l2-mem2... |
348 349 350 |
/** * v4l2_m2m_buf_queue() - add a buffer to the proper ready buffers list. * |
dcbd87358 [media] v4l2-mem2... |
351 352 353 |
* @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx * @vbuf: pointer to struct &vb2_v4l2_buffer * |
5fa5edbe5 [media] v4l2-mem2... |
354 |
* Call from videobuf_queue_ops->ops->buf_queue, videobuf_queue_ops callback. |
4781646c1 [media] v4l2-mem2... |
355 |
*/ |
2d7007153 [media] media: vi... |
356 357 |
void v4l2_m2m_buf_queue(struct v4l2_m2m_ctx *m2m_ctx, struct vb2_v4l2_buffer *vbuf); |
7f98639de V4L/DVB: add memo... |
358 359 360 361 |
/** * v4l2_m2m_num_src_bufs_ready() - return the number of source buffers ready for * use |
62c0d016d [media] Docbook: ... |
362 |
* |
dcbd87358 [media] v4l2-mem2... |
363 |
* @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx |
7f98639de V4L/DVB: add memo... |
364 365 366 367 |
*/ static inline unsigned int v4l2_m2m_num_src_bufs_ready(struct v4l2_m2m_ctx *m2m_ctx) { |
961ae4498 [media] media v4l... |
368 |
return m2m_ctx->out_q_ctx.num_rdy; |
7f98639de V4L/DVB: add memo... |
369 370 371 |
} /** |
e383ce073 [media] get rid o... |
372 |
* v4l2_m2m_num_dst_bufs_ready() - return the number of destination buffers |
7f98639de V4L/DVB: add memo... |
373 |
* ready for use |
62c0d016d [media] Docbook: ... |
374 |
* |
dcbd87358 [media] v4l2-mem2... |
375 |
* @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx |
7f98639de V4L/DVB: add memo... |
376 377 378 379 |
*/ static inline unsigned int v4l2_m2m_num_dst_bufs_ready(struct v4l2_m2m_ctx *m2m_ctx) { |
961ae4498 [media] media v4l... |
380 |
return m2m_ctx->cap_q_ctx.num_rdy; |
7f98639de V4L/DVB: add memo... |
381 |
} |
4781646c1 [media] v4l2-mem2... |
382 383 |
/** * v4l2_m2m_next_buf() - return next buffer from the list of ready buffers |
dcbd87358 [media] v4l2-mem2... |
384 385 |
* * @q_ctx: pointer to struct @v4l2_m2m_queue_ctx |
4781646c1 [media] v4l2-mem2... |
386 |
*/ |
908a0d7c5 [media] v4l: mem2... |
387 |
void *v4l2_m2m_next_buf(struct v4l2_m2m_queue_ctx *q_ctx); |
7f98639de V4L/DVB: add memo... |
388 389 390 391 |
/** * v4l2_m2m_next_src_buf() - return next source buffer from the list of ready * buffers |
62c0d016d [media] Docbook: ... |
392 |
* |
dcbd87358 [media] v4l2-mem2... |
393 |
* @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx |
7f98639de V4L/DVB: add memo... |
394 395 396 |
*/ static inline void *v4l2_m2m_next_src_buf(struct v4l2_m2m_ctx *m2m_ctx) { |
908a0d7c5 [media] v4l: mem2... |
397 |
return v4l2_m2m_next_buf(&m2m_ctx->out_q_ctx); |
7f98639de V4L/DVB: add memo... |
398 399 400 401 402 |
} /** * v4l2_m2m_next_dst_buf() - return next destination buffer from the list of * ready buffers |
62c0d016d [media] Docbook: ... |
403 |
* |
dcbd87358 [media] v4l2-mem2... |
404 |
* @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx |
7f98639de V4L/DVB: add memo... |
405 406 407 |
*/ static inline void *v4l2_m2m_next_dst_buf(struct v4l2_m2m_ctx *m2m_ctx) { |
908a0d7c5 [media] v4l: mem2... |
408 |
return v4l2_m2m_next_buf(&m2m_ctx->cap_q_ctx); |
7f98639de V4L/DVB: add memo... |
409 410 411 |
} /** |
908a0d7c5 [media] v4l: mem2... |
412 |
* v4l2_m2m_get_src_vq() - return vb2_queue for source buffers |
62c0d016d [media] Docbook: ... |
413 |
* |
dcbd87358 [media] v4l2-mem2... |
414 |
* @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx |
7f98639de V4L/DVB: add memo... |
415 416 |
*/ static inline |
908a0d7c5 [media] v4l: mem2... |
417 |
struct vb2_queue *v4l2_m2m_get_src_vq(struct v4l2_m2m_ctx *m2m_ctx) |
7f98639de V4L/DVB: add memo... |
418 |
{ |
908a0d7c5 [media] v4l: mem2... |
419 |
return &m2m_ctx->out_q_ctx.q; |
7f98639de V4L/DVB: add memo... |
420 421 422 |
} /** |
908a0d7c5 [media] v4l: mem2... |
423 |
* v4l2_m2m_get_dst_vq() - return vb2_queue for destination buffers |
62c0d016d [media] Docbook: ... |
424 |
* |
dcbd87358 [media] v4l2-mem2... |
425 |
* @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx |
7f98639de V4L/DVB: add memo... |
426 427 |
*/ static inline |
908a0d7c5 [media] v4l: mem2... |
428 |
struct vb2_queue *v4l2_m2m_get_dst_vq(struct v4l2_m2m_ctx *m2m_ctx) |
7f98639de V4L/DVB: add memo... |
429 |
{ |
908a0d7c5 [media] v4l: mem2... |
430 |
return &m2m_ctx->cap_q_ctx.q; |
7f98639de V4L/DVB: add memo... |
431 |
} |
4781646c1 [media] v4l2-mem2... |
432 433 434 |
/** * v4l2_m2m_buf_remove() - take off a buffer from the list of ready buffers and * return it |
dcbd87358 [media] v4l2-mem2... |
435 436 |
* * @q_ctx: pointer to struct @v4l2_m2m_queue_ctx |
4781646c1 [media] v4l2-mem2... |
437 |
*/ |
908a0d7c5 [media] v4l: mem2... |
438 |
void *v4l2_m2m_buf_remove(struct v4l2_m2m_queue_ctx *q_ctx); |
7f98639de V4L/DVB: add memo... |
439 440 441 442 |
/** * v4l2_m2m_src_buf_remove() - take off a source buffer from the list of ready * buffers and return it |
62c0d016d [media] Docbook: ... |
443 |
* |
dcbd87358 [media] v4l2-mem2... |
444 |
* @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx |
7f98639de V4L/DVB: add memo... |
445 446 447 |
*/ static inline void *v4l2_m2m_src_buf_remove(struct v4l2_m2m_ctx *m2m_ctx) { |
908a0d7c5 [media] v4l: mem2... |
448 |
return v4l2_m2m_buf_remove(&m2m_ctx->out_q_ctx); |
7f98639de V4L/DVB: add memo... |
449 450 451 452 453 |
} /** * v4l2_m2m_dst_buf_remove() - take off a destination buffer from the list of * ready buffers and return it |
62c0d016d [media] Docbook: ... |
454 |
* |
dcbd87358 [media] v4l2-mem2... |
455 |
* @m2m_ctx: m2m context assigned to the instance given by struct &v4l2_m2m_ctx |
7f98639de V4L/DVB: add memo... |
456 457 458 |
*/ static inline void *v4l2_m2m_dst_buf_remove(struct v4l2_m2m_ctx *m2m_ctx) { |
908a0d7c5 [media] v4l: mem2... |
459 |
return v4l2_m2m_buf_remove(&m2m_ctx->cap_q_ctx); |
7f98639de V4L/DVB: add memo... |
460 |
} |
8e6e8f93f [media] V4L: Add ... |
461 462 463 464 465 466 467 468 469 470 471 472 473 474 |
/* v4l2 ioctl helpers */ int v4l2_m2m_ioctl_reqbufs(struct file *file, void *priv, struct v4l2_requestbuffers *rb); int v4l2_m2m_ioctl_create_bufs(struct file *file, void *fh, struct v4l2_create_buffers *create); int v4l2_m2m_ioctl_querybuf(struct file *file, void *fh, struct v4l2_buffer *buf); int v4l2_m2m_ioctl_expbuf(struct file *file, void *fh, struct v4l2_exportbuffer *eb); int v4l2_m2m_ioctl_qbuf(struct file *file, void *fh, struct v4l2_buffer *buf); int v4l2_m2m_ioctl_dqbuf(struct file *file, void *fh, struct v4l2_buffer *buf); |
e68cf471e [media] v4l2-mem2... |
475 476 |
int v4l2_m2m_ioctl_prepare_buf(struct file *file, void *fh, struct v4l2_buffer *buf); |
8e6e8f93f [media] V4L: Add ... |
477 478 479 480 481 482 |
int v4l2_m2m_ioctl_streamon(struct file *file, void *fh, enum v4l2_buf_type type); int v4l2_m2m_ioctl_streamoff(struct file *file, void *fh, enum v4l2_buf_type type); int v4l2_m2m_fop_mmap(struct file *file, struct vm_area_struct *vma); unsigned int v4l2_m2m_fop_poll(struct file *file, poll_table *wait); |
7f98639de V4L/DVB: add memo... |
483 |
#endif /* _MEDIA_V4L2_MEM2MEM_H */ |