1 #ifndef _MSM_VDEC_H_
2 #define _MSM_VDEC_H_
3 
4 #include <linux/types.h>
5 
6 #define VDEC_IOCTL_MAGIC 'v'
7 
8 #define VDEC_IOCTL_INITIALIZE   _IOWR(VDEC_IOCTL_MAGIC, 1, struct vdec_init)
9 #define VDEC_IOCTL_SETBUFFERS   _IOW(VDEC_IOCTL_MAGIC, 2, struct vdec_buffer)
10 #define VDEC_IOCTL_QUEUE        _IOWR(VDEC_IOCTL_MAGIC, 3, \
11 					struct vdec_input_buf)
12 #define VDEC_IOCTL_REUSEFRAMEBUFFER  _IOW(VDEC_IOCTL_MAGIC, 4, unsigned int)
13 #define VDEC_IOCTL_FLUSH        _IOW(VDEC_IOCTL_MAGIC, 5, unsigned int)
14 #define VDEC_IOCTL_EOS          _IO(VDEC_IOCTL_MAGIC, 6)
15 #define VDEC_IOCTL_GETMSG       _IOR(VDEC_IOCTL_MAGIC, 7, struct vdec_msg)
16 #define VDEC_IOCTL_CLOSE        _IO(VDEC_IOCTL_MAGIC, 8)
17 #define VDEC_IOCTL_FREEBUFFERS  _IOW(VDEC_IOCTL_MAGIC, 9, struct vdec_buf_info)
18 #define VDEC_IOCTL_GETDECATTRIBUTES   _IOR(VDEC_IOCTL_MAGIC, 10, \
19 						struct vdec_dec_attributes)
20 #define VDEC_IOCTL_GETVERSION   _IOR(VDEC_IOCTL_MAGIC, 11, struct vdec_version)
21 #define VDEC_IOCTL_SETPROPERTY _IOW \
22    (VDEC_IOCTL_MAGIC, 12, struct vdec_property_info)
23 #define VDEC_IOCTL_GETPROPERTY _IOR  \
24    (VDEC_IOCTL_MAGIC, 13, struct vdec_property_info)
25 #define VDEC_IOCTL_PERFORMANCE_CHANGE_REQ  _IOW(VDEC_IOCTL_MAGIC, 14, \
26 						unsigned int)
27 
28 enum {
29 	VDEC_FRAME_DECODE_OK,
30 	VDEC_FRAME_DECODE_ERR,
31 	VDEC_FATAL_ERR,
32 	VDEC_FLUSH_FINISH,
33 	VDEC_EOS,
34 	VDEC_FRAME_FLUSH,
35 	VDEC_STREAM_SWITCH,
36 	VDEC_SUSPEND_FINISH,
37 	VDEC_BUFFER_CONSUMED
38 };
39 
40 enum {
41 	VDEC_FLUSH_INPUT,
42 	VDEC_FLUSH_OUTPUT,
43 	VDEC_FLUSH_ALL
44 };
45 
46 enum {
47 	VDEC_BUFFER_TYPE_INPUT,
48 	VDEC_BUFFER_TYPE_OUTPUT,
49 	VDEC_BUFFER_TYPE_INTERNAL1,
50 	VDEC_BUFFER_TYPE_INTERNAL2,
51 };
52 
53 enum {
54 	VDEC_QUEUE_SUCCESS,
55 	VDEC_QUEUE_FAILED,
56 	VDEC_QUEUE_BADSTATE,
57 };
58 
59 enum {
60 	VDEC_COLOR_FORMAT_NV21 = 0x01,
61 	VDEC_COLOR_FORMAT_NV21_YAMOTO = 0x02
62    };
63 
64 enum vdec_property_id {
65 	VDEC_FOURCC,
66 	VDEC_PROFILE,
67 	VDEC_LEVEL,
68 	VDEC_DIMENSIONS,
69 	VDEC_CWIN,
70 	VDEC_INPUT_BUF_REQ,
71 	VDEC_OUTPUT_BUF_REQ,
72 	VDEC_LUMA_CHROMA_STRIDE,
73 	VDEC_NUM_DAL_PORTS,
74 	VDEC_PRIORITY,
75 	VDEC_FRAME_ALIGNMENT
76 };
77 
78 enum {
79 	PERF_REQUEST_SET_MIN = 0,
80 	PERF_REQUEST_LOWER,
81 	PERF_REQUEST_RAISE,
82 	PERF_REQUEST_SET_MAX
83 };
84 
85 struct vdec_input_buf_info {
86 	u32 offset;
87 	u32 data;
88 	u32 size;
89 	int timestamp_lo;
90 	int timestamp_hi;
91 	int avsync_state;
92 	u32 flags;
93 };
94 
95 struct vdec_buf_desc {
96 	u32 bufsize;
97 	u32 num_min_buffers;
98 	u32 num_max_buffers;
99 };
100 
101 struct vdec_buf_req {
102 	u32 max_input_queue_size;
103 	struct vdec_buf_desc input;
104 	struct vdec_buf_desc output;
105 	struct vdec_buf_desc dec_req1;
106 	struct vdec_buf_desc dec_req2;
107 };
108 
109 struct vdec_region_info {
110 	u32 src_id;
111 	u32 offset;
112 	u32 size;
113 };
114 
115 struct vdec_config {
116 	u32 fourcc;		/* video format */
117 	u32 width;		/* source width */
118 	u32 height;		/* source height */
119 	u32 order;		/* render decoder order */
120 	u32 notify_enable;	/* enable notify input buffer done event */
121 	u32 vc1_rowbase;
122 	u32 h264_startcode_detect;
123 	u32 h264_nal_len_size;
124 	u32 postproc_flag;
125 	u32 fruc_enable;
126 	u32 color_format;           /* used to set YUV color format */
127 };
128 
129 struct vdec_vc1_panscan_regions {
130 	int num;
131 	int width[4];
132 	int height[4];
133 	int xoffset[4];
134 	int yoffset[4];
135 };
136 
137 struct vdec_cropping_window {
138 	u32 x1;
139 	u32 y1;
140 	u32 x2;
141 	u32 y2;
142 };
143 
144 struct vdec_frame_info {
145 	u32 status;		/* video decode status */
146 	u32 offset;		/* buffer offset */
147 	u32 data1;		/* user data field 1 */
148 	u32 data2;		/* user data field 2 */
149 	int timestamp_lo;	/* lower 32 bits timestamp, in msec */
150 	int timestamp_hi;	/* higher 32 bits timestamp, in msec */
151 	int cal_timestamp_lo;	/* lower 32 bits cal timestamp, in msec */
152 	int cal_timestamp_hi;	/* higher  32 bits cal timestamp, in msec */
153 	u32 dec_width;		/* frame roi width */
154 	u32 dec_height;		/* frame roi height */
155 	struct vdec_cropping_window cwin;	/* The frame cropping window */
156 	u32 picture_type[2];	/* picture coding type */
157 	u32 picture_format;	/* picture coding format */
158 	u32 vc1_rangeY;		/* luma range mapping */
159 	u32 vc1_rangeUV;	/* chroma range mapping */
160 	u32 picture_resolution;	/* scaling factor */
161 	u32 frame_disp_repeat;	/* how often repeated by disp */
162 	u32 repeat_first_field;	/* repeat 1st field after 2nd */
163 	u32 top_field_first;	/* top field displayed first */
164 	u32 interframe_interp;	/* not for inter-frame interp */
165 	struct vdec_vc1_panscan_regions panscan;	/* pan region */
166 	u32 concealed_macblk_num;	/* number of concealed macro blk */
167 	u32 flags;		/* input flags */
168 	u32 performance_stats;	/* performance statistics returned by decoder */
169 	u32 data3;              /* user data field 3 */
170 };
171 
172 struct vdec_buf_info {
173 	u32 buf_type;
174 	struct vdec_region_info region;
175 	u32 num_buf;
176 	u32 islast;
177 };
178 
179 struct vdec_buffer {
180 	u32 pmem_id;
181 	struct vdec_buf_info buf;
182 };
183 
184 struct vdec_sequence {
185 	u8 *header;
186 	u32 len;
187 };
188 
189 struct vdec_config_sps {
190 	struct vdec_config cfg;
191 	struct vdec_sequence seq;
192 };
193 
194 #define VDEC_MSG_REUSEINPUTBUFFER 	1
195 #define VDEC_MSG_FRAMEDONE 		2
196 
197 struct vdec_msg {
198 	u32 id;
199 
200 	union {
201 		/* id = VDEC_MSG_REUSEINPUTBUFFER */
202 		u32 buf_id;
203 		/* id = VDEC_MSG_FRAMEDONE */
204 		struct vdec_frame_info vfr_info;
205 	};
206 };
207 
208 struct vdec_init {
209 	struct vdec_config_sps sps_cfg;
210 	struct vdec_buf_req *buf_req;
211 };
212 
213 struct vdec_input_buf {
214 	u32 pmem_id;
215 	struct vdec_input_buf_info buffer;
216 	struct vdec_queue_status *queue_status;
217 };
218 
219 struct vdec_queue_status {
220 	u32 status;
221 };
222 
223 struct vdec_dec_attributes {
224 	u32 fourcc;
225 	u32 profile;
226 	u32 level;
227 	u32 dec_pic_width;
228 	u32 dec_pic_height;
229 	struct vdec_buf_desc input;
230 	struct vdec_buf_desc output;
231 	struct vdec_buf_desc dec_req1;
232 	struct vdec_buf_desc dec_req2;
233 };
234 
235 struct vdec_version {
236 	u32 major;
237 	u32 minor;
238 };
239 
240 struct dal_vdec_rectangle {
241 	u32 width;
242 	u32 height;
243 };
244 
245 struct stride_type {
246 	u32 luma;
247 	u32 chroma;
248 };
249 
250 struct frame_alignment_type {
251 	u32 luma_width;
252 	u32 luma_height;
253 	u32 chroma_width;
254 	u32 chroma_height;
255 	u32 chroma_offset;
256 };
257 
258 union vdec_property {
259 	u32 fourcc;
260 	u32 profile;
261 	u32 level;
262 	struct dal_vdec_rectangle dim;
263 	struct vdec_cropping_window cw;
264 	struct vdec_buf_desc input_req;
265 	struct vdec_buf_desc output_req;
266 	struct stride_type stride;
267 	u32 num_dal_ports;
268 	u32 priority;
269 	struct frame_alignment_type frame_alignment;
270 	u32 def_type;
271 };
272 
273 struct vdec_property_info {
274 	enum vdec_property_id id;
275 	union vdec_property property;
276 };
277 #endif /* _MSM_VDEC_H_ */
278