1 #ifndef _MSM_VENC_H_
2 #define _MSM_VENC_H_
3 
4 #include <linux/types.h>
5 
6 #define VENC_MAX_RECON_BUFFERS 2
7 
8 #define VENC_FLAG_EOS                   0x00000001
9 #define VENC_FLAG_END_OF_FRAME          0x00000010
10 #define VENC_FLAG_SYNC_FRAME            0x00000020
11 #define VENC_FLAG_EXTRA_DATA            0x00000040
12 #define VENC_FLAG_CODEC_CONFIG          0x00000080
13 
14 enum venc_flush_type {
15 	VENC_FLUSH_INPUT,
16 	VENC_FLUSH_OUTPUT,
17 	VENC_FLUSH_ALL
18 };
19 
20 enum venc_state_type {
21 	VENC_STATE_PAUSE = 0x1,
22 	VENC_STATE_START = 0x2,
23 	VENC_STATE_STOP = 0x4
24 };
25 
26 enum venc_event_type_enum {
27 	VENC_EVENT_START_STATUS,
28 	VENC_EVENT_STOP_STATUS,
29 	VENC_EVENT_SUSPEND_STATUS,
30 	VENC_EVENT_RESUME_STATUS,
31 	VENC_EVENT_FLUSH_STATUS,
32 	VENC_EVENT_RELEASE_INPUT,
33 	VENC_EVENT_DELIVER_OUTPUT,
34 	VENC_EVENT_UNKNOWN_STATUS
35 };
36 
37 enum venc_status_code {
38 	VENC_STATUS_SUCCESS,
39 	VENC_STATUS_ERROR,
40 	VENC_STATUS_INVALID_STATE,
41 	VENC_STATUS_FLUSHING,
42 	VENC_STATUS_INVALID_PARAM,
43 	VENC_STATUS_CMD_QUEUE_FULL,
44 	VENC_STATUS_CRITICAL,
45 	VENC_STATUS_INSUFFICIENT_RESOURCES,
46 	VENC_STATUS_TIMEOUT
47 };
48 
49 enum venc_msg_code {
50 	VENC_MSG_INDICATION,
51 	VENC_MSG_INPUT_BUFFER_DONE,
52 	VENC_MSG_OUTPUT_BUFFER_DONE,
53 	VENC_MSG_NEED_OUTPUT_BUFFER,
54 	VENC_MSG_FLUSH,
55 	VENC_MSG_START,
56 	VENC_MSG_STOP,
57 	VENC_MSG_PAUSE,
58 	VENC_MSG_RESUME,
59 	VENC_MSG_STOP_READING_MSG
60 };
61 
62 enum venc_error_code {
63 	VENC_S_SUCCESS,
64 	VENC_S_EFAIL,
65 	VENC_S_EFATAL,
66 	VENC_S_EBADPARAM,
67 	VENC_S_EINVALSTATE,
68 	VENC_S_ENOSWRES,
69 	VENC_S_ENOHWRES,
70 	VENC_S_EBUFFREQ,
71 	VENC_S_EINVALCMD,
72 	VENC_S_ETIMEOUT,
73 	VENC_S_ENOREATMPT,
74 	VENC_S_ENOPREREQ,
75 	VENC_S_ECMDQFULL,
76 	VENC_S_ENOTSUPP,
77 	VENC_S_ENOTIMPL,
78 	VENC_S_ENOTPMEM,
79 	VENC_S_EFLUSHED,
80 	VENC_S_EINSUFBUF,
81 	VENC_S_ESAMESTATE,
82 	VENC_S_EINVALTRANS
83 };
84 
85 enum venc_mem_region_enum {
86 	VENC_PMEM_EBI1,
87 	VENC_PMEM_SMI
88 };
89 
90 struct venc_buf_type {
91 	u32 region;
92 	u32 phys;
93 	u32 size;
94 	int offset;
95 };
96 
97 struct venc_qp_range {
98 	u32 min_qp;
99 	u32 max_qp;
100 };
101 
102 struct venc_frame_rate {
103 	u32 frame_rate_num;
104 	u32 frame_rate_den;
105 };
106 
107 struct venc_slice_info {
108 	u32 slice_mode;
109 	u32 units_per_slice;
110 };
111 
112 struct venc_extra_data {
113 	u32 slice_extra_data_flag;
114 	u32 slice_client_data1;
115 	u32 slice_client_data2;
116 	u32 slice_client_data3;
117 	u32 none_extra_data_flag;
118 	u32 none_client_data1;
119 	u32 none_client_data2;
120 	u32 none_client_data3;
121 };
122 
123 struct venc_common_config {
124 	u32 standard;
125 	u32 input_frame_height;
126 	u32 input_frame_width;
127 	u32 output_frame_height;
128 	u32 output_frame_width;
129 	u32 rotation_angle;
130 	u32 intra_period;
131 	u32 rate_control;
132 	struct venc_frame_rate frame_rate;
133 	u32 bitrate;
134 	struct venc_qp_range qp_range;
135 	u32 iframe_qp;
136 	u32 pframe_qp;
137 	struct venc_slice_info slice_config;
138 	struct venc_extra_data extra_data;
139 };
140 
141 struct venc_nonio_buf_config {
142 	struct venc_buf_type recon_buf1;
143 	struct venc_buf_type recon_buf2;
144 	struct venc_buf_type wb_buf;
145 	struct venc_buf_type cmd_buf;
146 	struct venc_buf_type vlc_buf;
147 };
148 
149 struct venc_mpeg4_config {
150 	u32 profile;
151 	u32 level;
152 	u32 time_resolution;
153 	u32 ac_prediction;
154 	u32 hec_interval;
155 	u32 data_partition;
156 	u32 short_header;
157 	u32 rvlc_enable;
158 };
159 
160 struct venc_h263_config {
161 	u32 profile;
162 	u32 level;
163 };
164 
165 struct venc_h264_config {
166 	u32 profile;
167 	u32 level;
168 	u32 max_nal;
169 	u32 idr_period;
170 };
171 
172 struct venc_pmem {
173 	int src;
174 	int fd;
175 	u32 offset;
176 	void *virt;
177 	void *phys;
178 	u32 size;
179 };
180 
181 struct venc_buffer {
182 	unsigned char *ptr_buffer;
183 	u32 size;
184 	u32 len;
185 	u32 offset;
186 	long long time_stamp;
187 	u32 flags;
188 	u32 client_data;
189 
190 };
191 
192 struct venc_buffers {
193 	struct venc_pmem recon_buf[VENC_MAX_RECON_BUFFERS];
194 	struct venc_pmem wb_buf;
195 	struct venc_pmem cmd_buf;
196 	struct venc_pmem vlc_buf;
197 };
198 
199 struct venc_buffer_flush {
200 	u32 flush_mode;
201 };
202 
203 union venc_msg_data {
204 	struct venc_buffer buf;
205 	struct venc_buffer_flush flush_ret;
206 
207 };
208 
209 struct venc_msg {
210 	u32 status_code;
211 	u32 msg_code;
212 	u32 msg_data_size;
213 	union venc_msg_data msg_data;
214 };
215 
216 union venc_codec_config {
217 	struct venc_mpeg4_config mpeg4_params;
218 	struct venc_h263_config h263_params;
219 	struct venc_h264_config h264_params;
220 };
221 
222 struct venc_q6_config {
223 	struct venc_common_config config_params;
224 	union venc_codec_config codec_params;
225 	struct venc_nonio_buf_config buf_params;
226 	void *callback_event;
227 };
228 
229 struct venc_hdr_config {
230 	struct venc_common_config config_params;
231 	union venc_codec_config codec_params;
232 };
233 
234 struct venc_init_config {
235 	struct venc_q6_config q6_config;
236 	struct venc_buffers q6_bufs;
237 };
238 
239 struct venc_seq_config {
240 	int size;
241 	struct venc_pmem buf;
242 	struct venc_q6_config q6_config;
243 };
244 
245 struct venc_version {
246 	u32 major;
247 	u32 minor;
248 };
249 
250 #define VENC_IOCTL_MAGIC 'V'
251 
252 #define VENC_IOCTL_CMD_READ_NEXT_MSG \
253 	_IOWR(VENC_IOCTL_MAGIC, 1, struct venc_msg)
254 
255 #define VENC_IOCTL_CMD_STOP_READ_MSG  _IO(VENC_IOCTL_MAGIC, 2)
256 
257 #define VENC_IOCTL_SET_INPUT_BUFFER \
258 	_IOW(VENC_IOCTL_MAGIC, 3, struct venc_pmem)
259 
260 #define VENC_IOCTL_SET_OUTPUT_BUFFER \
261 	_IOW(VENC_IOCTL_MAGIC, 4, struct venc_pmem)
262 
263 #define VENC_IOCTL_CMD_START _IOW(VENC_IOCTL_MAGIC, 5, struct venc_init_config)
264 
265 #define VENC_IOCTL_CMD_ENCODE_FRAME \
266 	_IOW(VENC_IOCTL_MAGIC, 6, struct venc_buffer)
267 
268 #define VENC_IOCTL_CMD_FILL_OUTPUT_BUFFER \
269 	_IOW(VENC_IOCTL_MAGIC, 7, struct venc_buffer)
270 
271 #define VENC_IOCTL_CMD_FLUSH \
272 	_IOW(VENC_IOCTL_MAGIC, 8, struct venc_buffer_flush)
273 
274 #define VENC_IOCTL_CMD_PAUSE _IO(VENC_IOCTL_MAGIC, 9)
275 
276 #define VENC_IOCTL_CMD_RESUME _IO(VENC_IOCTL_MAGIC, 10)
277 
278 #define VENC_IOCTL_CMD_STOP _IO(VENC_IOCTL_MAGIC, 11)
279 
280 #define VENC_IOCTL_SET_INTRA_PERIOD \
281 	_IOW(VENC_IOCTL_MAGIC, 12, int)
282 
283 #define VENC_IOCTL_CMD_REQUEST_IFRAME _IO(VENC_IOCTL_MAGIC, 13)
284 
285 #define VENC_IOCTL_GET_SEQUENCE_HDR \
286 	_IOWR(VENC_IOCTL_MAGIC, 14, struct venc_seq_config)
287 
288 #define VENC_IOCTL_SET_INTRA_REFRESH \
289 	_IOW(VENC_IOCTL_MAGIC, 15, int)
290 
291 #define VENC_IOCTL_SET_FRAME_RATE \
292 	_IOW(VENC_IOCTL_MAGIC, 16, struct venc_frame_rate)
293 
294 #define VENC_IOCTL_SET_TARGET_BITRATE \
295 	_IOW(VENC_IOCTL_MAGIC, 17, int)
296 
297 #define VENC_IOCTL_SET_QP_RANGE \
298 	_IOW(VENC_IOCTL_MAGIC, 18, struct venc_qp_range)
299 
300 #define VENC_IOCTL_GET_VERSION \
301 	 _IOR(VENC_IOCTL_MAGIC, 19, struct venc_version)
302 
303 #endif
304