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);
113
114int v4l2_m2m_streamon(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
115 enum v4l2_buf_type type);
116int v4l2_m2m_streamoff(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
117 enum v4l2_buf_type type);
118
119unsigned int v4l2_m2m_poll(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
120 struct poll_table_struct *wait);
121
122int v4l2_m2m_mmap(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
123 struct vm_area_struct *vma);
124
125struct v4l2_m2m_dev *v4l2_m2m_init(struct v4l2_m2m_ops *m2m_ops);
126void v4l2_m2m_release(struct v4l2_m2m_dev *m2m_dev);
127
128struct v4l2_m2m_ctx *v4l2_m2m_ctx_init(struct v4l2_m2m_dev *m2m_dev,
129 void *drv_priv,
130 int (*queue_init)(void *priv, struct vb2_queue *src_vq, struct vb2_queue *dst_vq));
131
132void v4l2_m2m_ctx_release(struct v4l2_m2m_ctx *m2m_ctx);
133
134void v4l2_m2m_buf_queue(struct v4l2_m2m_ctx *m2m_ctx, struct vb2_buffer *vb);
135
136
137
138
139
140static inline
141unsigned int v4l2_m2m_num_src_bufs_ready(struct v4l2_m2m_ctx *m2m_ctx)
142{
143 return m2m_ctx->cap_q_ctx.num_rdy;
144}
145
146
147
148
149
150static inline
151unsigned int v4l2_m2m_num_dst_bufs_ready(struct v4l2_m2m_ctx *m2m_ctx)
152{
153 return m2m_ctx->out_q_ctx.num_rdy;
154}
155
156void *v4l2_m2m_next_buf(struct v4l2_m2m_queue_ctx *q_ctx);
157
158
159
160
161
162static inline void *v4l2_m2m_next_src_buf(struct v4l2_m2m_ctx *m2m_ctx)
163{
164 return v4l2_m2m_next_buf(&m2m_ctx->out_q_ctx);
165}
166
167
168
169
170
171static inline void *v4l2_m2m_next_dst_buf(struct v4l2_m2m_ctx *m2m_ctx)
172{
173 return v4l2_m2m_next_buf(&m2m_ctx->cap_q_ctx);
174}
175
176
177
178
179static inline
180struct vb2_queue *v4l2_m2m_get_src_vq(struct v4l2_m2m_ctx *m2m_ctx)
181{
182 return &m2m_ctx->out_q_ctx.q;
183}
184
185
186
187
188static inline
189struct vb2_queue *v4l2_m2m_get_dst_vq(struct v4l2_m2m_ctx *m2m_ctx)
190{
191 return &m2m_ctx->cap_q_ctx.q;
192}
193
194void *v4l2_m2m_buf_remove(struct v4l2_m2m_queue_ctx *q_ctx);
195
196
197
198
199
200static inline void *v4l2_m2m_src_buf_remove(struct v4l2_m2m_ctx *m2m_ctx)
201{
202 return v4l2_m2m_buf_remove(&m2m_ctx->out_q_ctx);
203}
204
205
206
207
208
209static inline void *v4l2_m2m_dst_buf_remove(struct v4l2_m2m_ctx *m2m_ctx)
210{
211 return v4l2_m2m_buf_remove(&m2m_ctx->cap_q_ctx);
212}
213
214#endif
215
216