1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#ifndef _MEDIA_V4L2_MEM2MEM_H
18#define _MEDIA_V4L2_MEM2MEM_H
19
20#include <media/videobuf2-core.h>
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44struct v4l2_m2m_ops {
45 void (*device_run)(void *priv);
46 int (*job_ready)(void *priv);
47 void (*job_abort)(void *priv);
48 void (*lock)(void *priv);
49 void (*unlock)(void *priv);
50};
51
52struct v4l2_m2m_dev;
53
54struct v4l2_m2m_queue_ctx {
55
56 struct vb2_queue q;
57
58
59
60 struct list_head rdy_queue;
61 spinlock_t rdy_spinlock;
62 u8 num_rdy;
63};
64
65struct v4l2_m2m_ctx {
66
67 struct v4l2_m2m_dev *m2m_dev;
68
69
70 struct v4l2_m2m_queue_ctx cap_q_ctx;
71
72
73 struct v4l2_m2m_queue_ctx out_q_ctx;
74
75
76 struct list_head queue;
77 unsigned long job_flags;
78 wait_queue_head_t finished;
79
80
81 void *priv;
82};
83
84struct v4l2_m2m_buffer {
85 struct vb2_buffer vb;
86 struct list_head list;
87};
88
89void *v4l2_m2m_get_curr_priv(struct v4l2_m2m_dev *m2m_dev);
90
91struct vb2_queue *v4l2_m2m_get_vq(struct v4l2_m2m_ctx *m2m_ctx,
92 enum v4l2_buf_type type);
93
94void v4l2_m2m_job_finish(struct v4l2_m2m_dev *m2m_dev,
95 struct v4l2_m2m_ctx *m2m_ctx);
96
97static inline void
98v4l2_m2m_buf_done(struct vb2_buffer *buf, enum vb2_buffer_state state)
99{
100 vb2_buffer_done(buf, state);
101}
102
103int v4l2_m2m_reqbufs(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
104 struct v4l2_requestbuffers *reqbufs);
105
106int v4l2_m2m_querybuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
107 struct v4l2_buffer *buf);
108
109int v4l2_m2m_qbuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
110 struct v4l2_buffer *buf);
111int v4l2_m2m_dqbuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
112 struct v4l2_buffer *buf);
113int v4l2_m2m_create_bufs(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
114 struct v4l2_create_buffers *create);
115
116int v4l2_m2m_expbuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
117 struct v4l2_exportbuffer *eb);
118
119int v4l2_m2m_streamon(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
120 enum v4l2_buf_type type);
121int v4l2_m2m_streamoff(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
122 enum v4l2_buf_type type);
123
124unsigned int v4l2_m2m_poll(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
125 struct poll_table_struct *wait);
126
127int v4l2_m2m_mmap(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
128 struct vm_area_struct *vma);
129
130struct v4l2_m2m_dev *v4l2_m2m_init(const struct v4l2_m2m_ops *m2m_ops);
131void v4l2_m2m_release(struct v4l2_m2m_dev *m2m_dev);
132
133struct v4l2_m2m_ctx *v4l2_m2m_ctx_init(struct v4l2_m2m_dev *m2m_dev,
134 void *drv_priv,
135 int (*queue_init)(void *priv, struct vb2_queue *src_vq, struct vb2_queue *dst_vq));
136
137void v4l2_m2m_ctx_release(struct v4l2_m2m_ctx *m2m_ctx);
138
139void v4l2_m2m_buf_queue(struct v4l2_m2m_ctx *m2m_ctx, struct vb2_buffer *vb);
140
141
142
143
144
145static inline
146unsigned int v4l2_m2m_num_src_bufs_ready(struct v4l2_m2m_ctx *m2m_ctx)
147{
148 return m2m_ctx->out_q_ctx.num_rdy;
149}
150
151
152
153
154
155static inline
156unsigned int v4l2_m2m_num_dst_bufs_ready(struct v4l2_m2m_ctx *m2m_ctx)
157{
158 return m2m_ctx->cap_q_ctx.num_rdy;
159}
160
161void *v4l2_m2m_next_buf(struct v4l2_m2m_queue_ctx *q_ctx);
162
163
164
165
166
167static inline void *v4l2_m2m_next_src_buf(struct v4l2_m2m_ctx *m2m_ctx)
168{
169 return v4l2_m2m_next_buf(&m2m_ctx->out_q_ctx);
170}
171
172
173
174
175
176static inline void *v4l2_m2m_next_dst_buf(struct v4l2_m2m_ctx *m2m_ctx)
177{
178 return v4l2_m2m_next_buf(&m2m_ctx->cap_q_ctx);
179}
180
181
182
183
184static inline
185struct vb2_queue *v4l2_m2m_get_src_vq(struct v4l2_m2m_ctx *m2m_ctx)
186{
187 return &m2m_ctx->out_q_ctx.q;
188}
189
190
191
192
193static inline
194struct vb2_queue *v4l2_m2m_get_dst_vq(struct v4l2_m2m_ctx *m2m_ctx)
195{
196 return &m2m_ctx->cap_q_ctx.q;
197}
198
199void *v4l2_m2m_buf_remove(struct v4l2_m2m_queue_ctx *q_ctx);
200
201
202
203
204
205static inline void *v4l2_m2m_src_buf_remove(struct v4l2_m2m_ctx *m2m_ctx)
206{
207 return v4l2_m2m_buf_remove(&m2m_ctx->out_q_ctx);
208}
209
210
211
212
213
214static inline void *v4l2_m2m_dst_buf_remove(struct v4l2_m2m_ctx *m2m_ctx)
215{
216 return v4l2_m2m_buf_remove(&m2m_ctx->cap_q_ctx);
217}
218
219#endif
220
221