• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_*/
413