summaryrefslogtreecommitdiffstats
path: root/include/media/dvb_vb2.h
blob: 056adc860272483ae576f00cb255b931dceb1104 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
/*
 * SPDX-License-Identifier: GPL-2.0
 *
 * dvb-vb2.h - DVB driver helper framework for streaming I/O
 *
 * Copyright (C) 2015 Samsung Electronics
 *
 * Author: jh1009.sung@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.
 */

#ifndef _DVB_VB2_H
#define _DVB_VB2_H

#include <linux/mutex.h>
#include <linux/poll.h>
#include <linux/dvb/dmx.h>
#include <media/videobuf2-core.h>
#include <media/videobuf2-dma-contig.h>
#include <media/videobuf2-vmalloc.h>

/**
 * enum dvb_buf_type - types of Digital TV memory-mapped buffers
 *
 * @DVB_BUF_TYPE_CAPTURE: buffer is filled by the Kernel,
 *			  with a received Digital TV stream
 */
enum dvb_buf_type {
	DVB_BUF_TYPE_CAPTURE        = 1,
};

/**
 * enum dvb_vb2_states - states to control VB2 state machine
 * @DVB_VB2_STATE_NONE:
 *	VB2 engine not initialized yet, init failed or VB2 was released.
 * @DVB_VB2_STATE_INIT:
 *	VB2 engine initialized.
 * @DVB_VB2_STATE_REQBUFS:
 *	Buffers were requested
 * @DVB_VB2_STATE_STREAMON:
 *	VB2 is streaming. Callers should not check it directly. Instead,
 *	they should use dvb_vb2_is_streaming().
 *
 * Note:
 *
 * Callers should not touch at the state machine directly. This
 * is handled inside dvb_vb2.c.
 */
enum dvb_vb2_states {
	DVB_VB2_STATE_NONE	= 0x0,
	DVB_VB2_STATE_INIT	= 0x1,
	DVB_VB2_STATE_REQBUFS	= 0x2,
	DVB_VB2_STATE_STREAMON	= 0x4,
};

#define DVB_VB2_NAME_MAX (20)

/**
 * struct dvb_buffer - video buffer information for v4l2.
 *
 * @vb:		embedded struct &vb2_buffer.
 * @list:	list of &struct dvb_buffer.
 */
struct dvb_buffer {
	struct vb2_buffer	vb;
	struct list_head	list;
};

/**
 * struct dvb_vb2_ctx - control struct for VB2 handler
 * @vb_q:	pointer to &struct vb2_queue with videobuf2 queue.
 * @mutex:	mutex to serialize vb2 operations. Used by
 *		vb2 core %wait_prepare and %wait_finish operations.
 * @slock:	spin lock used to protect buffer filling at dvb_vb2.c.
 * @dvb_q:	List of buffers that are not filled yet.
 * @buf:	Pointer to the buffer that are currently being filled.
 * @offset:	index to the next position at the @buf to be filled.
 * @remain:	How many bytes are left to be filled at @buf.
 * @state:	bitmask of buffer states as defined by &enum dvb_vb2_states.
 * @buf_siz:	size of each VB2 buffer.
 * @buf_cnt:	number of VB2 buffers.
 * @nonblocking:
 *		If different than zero, device is operating on non-blocking
 *		mode.
 * @name:	name of the device type. Currently, it can either be
 *		"dvr" or "demux_filter".
 */
struct dvb_vb2_ctx {
	struct vb2_queue	vb_q;
	struct mutex		mutex;
	spinlock_t		slock;
	struct list_head	dvb_q;
	struct dvb_buffer	*buf;
	int	offset;
	int	remain;
	int	state;
	int	buf_siz;
	int	buf_cnt;
	int	nonblocking;
	char	name[DVB_VB2_NAME_MAX + 1];
};

#ifndef CONFIG_DVB_MMAP
static inline int dvb_vb2_init(struct dvb_vb2_ctx *ctx,
			       const char *name, int non_blocking)
{
	return 0;
};
static inline int dvb_vb2_release(struct dvb_vb2_ctx *ctx)
{
	return 0;
};
#define dvb_vb2_is_streaming(ctx) (0)
#define dvb_vb2_fill_buffer(ctx, file, wait) (0)

static inline __poll_t dvb_vb2_poll(struct dvb_vb2_ctx *ctx,
				    struct file *file,
				    poll_table *wait)
{
	return 0;
}
#else
/**
 * dvb_vb2_init - initializes VB2 handler
 *
 * @ctx:	control struct for VB2 handler
 * @name:	name for the VB2 handler
 * @non_blocking:
 *		if not zero, it means that the device is at non-blocking mode
 */
int dvb_vb2_init(struct dvb_vb2_ctx *ctx, const char *name, int non_blocking);

/**
 * dvb_vb2_release - Releases the VB2 handler allocated resources and
 *	put @ctx at DVB_VB2_STATE_NONE state.
 * @ctx:	control struct for VB2 handler
 */
int dvb_vb2_release(struct dvb_vb2_ctx *ctx);

/**
 * dvb_vb2_is_streaming - checks if the VB2 handler is streaming
 * @ctx:	control struct for VB2 handler
 *
 * Return: 0 if not streaming, 1 otherwise.
 */
int dvb_vb2_is_streaming(struct dvb_vb2_ctx *ctx);

/**
 * dvb_vb2_fill_buffer - fills a VB2 buffer
 * @ctx:	control struct for VB2 handler
 * @src:	place where the data is stored
 * @len:	number of bytes to be copied from @src
 */
int dvb_vb2_fill_buffer(struct dvb_vb2_ctx *ctx,
			const unsigned char *src, int len);

/**
 * dvb_vb2_poll - Wrapper to vb2_core_streamon() for Digital TV
 *      buffer handling.
 *
 * @ctx:	control struct for VB2 handler
 * @file:	&struct file argument passed to the poll
 *		file operation handler.
 * @wait:	&poll_table wait argument passed to the poll
 *		file operation handler.
 *
 * Implements poll syscall() logic.
 */
__poll_t dvb_vb2_poll(struct dvb_vb2_ctx *ctx, struct file *file,
		      poll_table *wait);
#endif

/**
 * dvb_vb2_stream_on() - Wrapper to vb2_core_streamon() for Digital TV
 *	buffer handling.
 *
 * @ctx:	control struct for VB2 handler
 *
 * Starts dvb streaming
 */
int dvb_vb2_stream_on(struct dvb_vb2_ctx *ctx);
/**
 * dvb_vb2_stream_off() - Wrapper to vb2_core_streamoff() for Digital TV
 *	buffer handling.
 *
 * @ctx:	control struct for VB2 handler
 *
 * Stops dvb streaming
 */
int dvb_vb2_stream_off(struct dvb_vb2_ctx *ctx);

/**
 * dvb_vb2_reqbufs() - Wrapper to vb2_core_reqbufs() for Digital TV
 *	buffer handling.
 *
 * @ctx:	control struct for VB2 handler
 * @req:	&struct dmx_requestbuffers passed from userspace in
 *		order to handle &DMX_REQBUFS.
 *
 * Initiate streaming by requesting a number of buffers. Also used to
 * free previously requested buffers, is ``req->count`` is zero.
 */
int dvb_vb2_reqbufs(struct dvb_vb2_ctx *ctx, struct dmx_requestbuffers *req);

/**
 * dvb_vb2_querybuf() - Wrapper to vb2_core_querybuf() for Digital TV
 *	buffer handling.
 *
 * @ctx:	control struct for VB2 handler
 * @b:		&struct dmx_buffer passed from userspace in
 *		order to handle &DMX_QUERYBUF.
 *
 *
 */
int dvb_vb2_querybuf(struct dvb_vb2_ctx *ctx, struct dmx_buffer *b);

/**
 * dvb_vb2_expbuf() - Wrapper to vb2_core_expbuf() for Digital TV
 *	buffer handling.
 *
 * @ctx:	control struct for VB2 handler
 * @exp:	&struct dmx_exportbuffer passed from userspace in
 *		order to handle &DMX_EXPBUF.
 *
 * Export a buffer as a file descriptor.
 */
int dvb_vb2_expbuf(struct dvb_vb2_ctx *ctx, struct dmx_exportbuffer *exp);

/**
 * dvb_vb2_qbuf() - Wrapper to vb2_core_qbuf() for Digital TV buffer handling.
 *
 * @ctx:	control struct for VB2 handler
 * @b:		&struct dmx_buffer passed from userspace in
 *		order to handle &DMX_QBUF.
 *
 * Queue a Digital TV buffer as requested by userspace
 */
int dvb_vb2_qbuf(struct dvb_vb2_ctx *ctx, struct dmx_buffer *b);

/**
 * dvb_vb2_dqbuf() - Wrapper to vb2_core_dqbuf() for Digital TV
 *	buffer handling.
 *
 * @ctx:	control struct for VB2 handler
 * @b:		&struct dmx_buffer passed from userspace in
 *		order to handle &DMX_DQBUF.
 *
 * Dequeue a Digital TV buffer to the userspace
 */
int dvb_vb2_dqbuf(struct dvb_vb2_ctx *ctx, struct dmx_buffer *b);

/**
 * dvb_vb2_mmap() - Wrapper to vb2_mmap() for Digital TV buffer handling.
 *
 * @ctx:	control struct for VB2 handler
 * @vma:        pointer to &struct vm_area_struct with the vma passed
 *              to the mmap file operation handler in the driver.
 *
 * map Digital TV video buffers into application address space.
 */
int dvb_vb2_mmap(struct dvb_vb2_ctx *ctx, struct vm_area_struct *vma);

#endif /* _DVB_VB2_H */