am b39943bf: am a61de09c: Merge "Move videodev2.h to include/linux."
[GitHub/LineageOS/android_hardware_samsung_slsi_exynos5.git] / include / exynos_gscaler.h
1 /*
2 *
3 * Copyright 2012 Samsung Electronics S.LSI Co. LTD
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18 /*!
19 * \file exynos_gscaler.h
20 * \brief header file for Gscaler HAL
21 * \author ShinWon Lee (shinwon.lee@samsung.com)
22 * \date 2012/01/09
23 *
24 * <b>Revision History: </b>
25 * - 2012/01/09 : ShinWon Lee(shinwon.lee@samsung.com) \n
26 * Create
27 *
28 * - 2012/02/07 : ShinWon Lee(shinwon.lee@samsung.com) \n
29 * Change file name to exynos_gscaler.h
30 *
31 * - 2012/02/09 : Sangwoo, Parkk(sw5771.park@samsung.com) \n
32 * Use Multiple Gscaler by Multiple Process
33 *
34 * - 2012/02/20 : Sangwoo, Park(sw5771.park@samsung.com) \n
35 * Add exynos_gsc_set_rotation() API
36 *
37 * - 2012/02/20 : ShinWon Lee(shinwon.lee@samsung.com) \n
38 * Add size constrain
39 *
40 */
41
42 /*!
43 * \defgroup exynos_gscaler
44 * \brief API for gscaler
45 * \addtogroup Exynos
46 */
47 #include "Exynos_log.h"
48
49 #ifndef EXYNOS_GSCALER_H_
50 #define EXYNOS_GSCALER_H_
51
52 #ifdef __cplusplus
53 extern "C" {
54 #endif
55
56 //#define EXYNOS_GSC_TRACE 0
57 #ifdef EXYNOS_GSC_TRACE
58 #define EXYNOS_GSC_LOG_TAG "Exynos_gscaler"
59 #define Exynos_gsc_In() Exynos_Log(EXYNOS_DEV_LOG_DEBUG, EXYNOS_GSC_LOG_TAG, "%s In , Line: %d", __FUNCTION__, __LINE__)
60 #define Exynos_gsc_Out() Exynos_Log(EXYNOS_DEV_LOG_DEBUG, EXYNOS_GSC_LOG_TAG, "%s Out , Line: %d", __FUNCTION__, __LINE__)
61 #else
62 #define Exynos_gsc_In() ((void *)0)
63 #define Exynos_gsc_Out() ((void *)0)
64 #endif
65
66 typedef struct {
67 uint32_t x;
68 uint32_t y;
69 uint32_t w;
70 uint32_t h;
71 uint32_t fw;
72 uint32_t fh;
73 uint32_t format;
74 uint32_t yaddr;
75 uint32_t uaddr;
76 uint32_t vaddr;
77 uint32_t rot;
78 uint32_t cacheable;
79 uint32_t drmMode;
80 uint32_t narrowRgb;
81 int acquireFenceFd;
82 int releaseFenceFd;
83 } exynos_gsc_img;
84
85 /*
86 * Create libgscaler handle.
87 * Gscaler dev_num is dynamically changed.
88 *
89 * \ingroup exynos_gscaler
90 *
91 * \return
92 * libgscaler handle
93 */
94 void *exynos_gsc_create(
95 void);
96
97 /*!
98 * Create exclusive libgscaler handle.
99 * Other module can't use dev_num of Gscaler.
100 *
101 * \ingroup exynos_gscaler
102 *
103 * \param dev_num
104 * gscaler dev_num[in]
105 * \param gsc_mode
106 *It should be set to GSC_M2M_MODE or GSC_OUTPUT_MODE.
107 *
108 *\param out_mode
109 *It should be set to GSC_OUT_FIMD or GSC_OUT_TV.
110 *
111 * \return
112 * libgscaler handle
113 */
114 void *exynos_gsc_create_exclusive(
115 int dev_num,
116 int gsc_mode,
117 int out_mode,
118 int allow_drm);
119
120 /*!
121 * Destroy libgscaler handle
122 *
123 * \ingroup exynos_gscaler
124 *
125 * \param handle
126 * libgscaler handle[in]
127 */
128 void exynos_gsc_destroy(
129 void *handle);
130
131 /*!
132 * Set source format.
133 *
134 * \ingroup exynos_gscaler
135 *
136 * \param handle
137 * libgscaler handle[in]
138 *
139 * \param width
140 * image width[in]
141 *
142 * \param height
143 * image height[in]
144 *
145 * \param crop_left
146 * image left crop size[in]
147 *
148 * \param crop_top
149 * image top crop size[in]
150 *
151 * \param crop_width
152 * cropped image width[in]
153 *
154 * \param crop_height
155 * cropped image height[in]
156 *
157 * \param v4l2_colorformat
158 * color format[in]
159 *
160 * \param cacheable
161 * ccacheable[in]
162 *
163 * \param mode_drm
164 * mode_drm[in]
165 *
166 * \return
167 * error code
168 */
169 int exynos_gsc_set_src_format(
170 void *handle,
171 unsigned int width,
172 unsigned int height,
173 unsigned int crop_left,
174 unsigned int crop_top,
175 unsigned int crop_width,
176 unsigned int crop_height,
177 unsigned int v4l2_colorformat,
178 unsigned int cacheable,
179 unsigned int mode_drm);
180
181 /*!
182 * Set destination format.
183 *
184 * \ingroup exynos_gscaler
185 *
186 * \param handle
187 * libgscaler handle[in]
188 *
189 * \param width
190 * image width[in]
191 *
192 * \param height
193 * image height[in]
194 *
195 * \param crop_left
196 * image left crop size[in]
197 *
198 * \param crop_top
199 * image top crop size[in]
200 *
201 * \param crop_width
202 * cropped image width[in]
203 *
204 * \param crop_height
205 * cropped image height[in]
206 *
207 * \param v4l2_colorformat
208 * color format[in]
209 *
210 * \param cacheable
211 * ccacheable[in]
212 *
213 * \param mode_drm
214 * mode_drm[in]
215 *
216 * \param narrowRgb
217 * narrow RGB range[in]
218 *
219 * \return
220 * error code
221 */
222 int exynos_gsc_set_dst_format(
223 void *handle,
224 unsigned int width,
225 unsigned int height,
226 unsigned int crop_left,
227 unsigned int crop_top,
228 unsigned int crop_width,
229 unsigned int crop_height,
230 unsigned int v4l2_colorformat,
231 unsigned int cacheable,
232 unsigned int mode_drm,
233 unsigned int narrowRgb);
234
235 /*!
236 * Set rotation.
237 *
238 * \ingroup exynos_gscaler
239 *
240 * \param handle
241 * libgscaler handle[in]
242 *
243 * \param rotation
244 * image rotation. It should be multiple of 90[in]
245 *
246 * \param flip_horizontal
247 * image flip_horizontal[in]
248 *
249 * \param flip_vertical
250 * image flip_vertical[in]
251 *
252 * \return
253 * error code
254 */
255 int exynos_gsc_set_rotation(
256 void *handle,
257 int rotation,
258 int flip_horizontal,
259 int flip_vertical);
260
261 /*!
262 * Set source buffer
263 *
264 * \ingroup exynos_gscaler
265 *
266 * \param handle
267 * libgscaler handle[in]
268 *
269 * \param addr
270 * buffer pointer array[in]
271 *
272 * \param acquireFenceFd
273 * acquire fence fd for the buffer or -1[in]
274 *
275 * \return
276 * error code
277 */
278 int exynos_gsc_set_src_addr(
279 void *handle,
280 void *addr[3],
281 int acquireFenceFd);
282
283 /*!
284 * Set destination buffer
285 *
286 * \param handle
287 * libgscaler handle[in]
288 *
289 * \param addr
290 * buffer pointer array[in]
291 *
292 * \param acquireFenceFd
293 * acquire fence fd for the buffer or -1[in]
294 *
295 * \return
296 * error code
297 */
298 int exynos_gsc_set_dst_addr(
299 void *handle,
300 void *addr[3],
301 int acquireFenceFd);
302
303 /*!
304 * Convert color space with presetup color format
305 *
306 * \ingroup exynos_gscaler
307 *
308 * \param handle
309 * libgscaler handle[in]
310 *
311 * \return
312 * error code
313 */
314 int exynos_gsc_convert(
315 void *handle);
316
317 /*!
318 * api for local path gscaler. Not yet support.
319 *
320 * \ingroup exynos_gscaler
321 */
322 int exynos_gsc_connect(
323 void *handle,
324 void *hw);
325
326 /*!
327 * api for local path gscaler. Not yet support.
328 *
329 * \ingroup exynos_gscaler
330 */
331 int exynos_gsc_disconnect(
332 void *handle,
333 void *hw);
334
335 /*!
336 * api for reserving a specific gscaler.
337 * This API could be used from any module that
338 *wants to control the gscalar privately. By calling this function any
339 *module can let the libgscaler know that GSC is used privately.
340 *
341 * \ingroup exynos_gsc_reserve
342 */
343 void *exynos_gsc_reserve
344 (int dev_num);
345
346
347 /*!
348 * api for releasing the gscaler that was reserved with
349 *exynos_gsc_reserve.
350 * \ingroup exynos_gsc_reserve
351 */
352 void exynos_gsc_release
353 (void *handle);
354
355
356 /*
357 *api for setting the GSC config.
358 It configures the GSC for given config
359 */
360 int exynos_gsc_config_exclusive(
361 void *handle,
362 exynos_gsc_img *src_img,
363 exynos_gsc_img *dst_img);
364
365 /*
366 *api for GSC-OUT run.
367 It queues the srcBuf to GSC and deques a buf from driver.
368 It should be called after configuring the GSC.
369 */
370 int exynos_gsc_run_exclusive(
371 void *handle,
372 exynos_gsc_img *src_img,
373 exynos_gsc_img *dst_img);
374
375 /*
376 * Blocks until the current frame is done processing.
377 */
378 int exynos_gsc_wait_frame_done_exclusive
379 (void *handle);
380
381 /*
382 *api for GSC stop.
383 It stops the GSC OUT streaming.
384 */
385 int exynos_gsc_stop_exclusive
386 (void *handle);
387
388 enum {
389 GSC_M2M_MODE = 0,
390 GSC_OUTPUT_MODE,
391 GSC_CAPTURE_MODE,
392 GSC_RESERVED_MODE,
393 };
394
395 /*flag info */
396 enum {
397 GSC_DUMMY = 0,
398 GSC_OUT_FIMD,
399 GSC_OUT_TV,
400 GSC_RESERVED,
401 };
402
403 enum {
404 GSC_DONE_CNG_CFG = 0,
405 GSC_NEED_CNG_CFG,
406 };
407
408 #ifdef __cplusplus
409 }
410 #endif
411
412 #endif /*EXYNOS_GSCALER_H_*/