blob: 401bc3f20b3ea2089b1134533e2193d5ca175124 [file] [log] [blame]
/*
*
* Copyright 2012 Samsung Electronics S.LSI Co. LTD
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*!
* \file exynos_gscaler.h
* \brief header file for Gscaler HAL
* \author ShinWon Lee (shinwon.lee@samsung.com)
* \date 2012/01/09
*
* <b>Revision History: </b>
* - 2012/01/09 : ShinWon Lee(shinwon.lee@samsung.com) \n
* Create
*
* - 2012/02/07 : ShinWon Lee(shinwon.lee@samsung.com) \n
* Change file name to exynos_gscaler.h
*
* - 2012/02/09 : Sangwoo, Parkk(sw5771.park@samsung.com) \n
* Use Multiple Gscaler by Multiple Process
*
* - 2012/02/20 : Sangwoo, Park(sw5771.park@samsung.com) \n
* Add exynos_gsc_set_rotation() API
*
* - 2012/02/20 : ShinWon Lee(shinwon.lee@samsung.com) \n
* Add size constrain
*
*/
/*!
* \defgroup exynos_gscaler
* \brief API for gscaler
* \addtogroup Exynos
*/
#include "Exynos_log.h"
#ifndef EXYNOS_GSCALER_H_
#define EXYNOS_GSCALER_H_
#ifdef __cplusplus
extern "C" {
#endif
//#define EXYNOS_GSC_TRACE 0
#ifdef EXYNOS_GSC_TRACE
#define EXYNOS_GSC_LOG_TAG "Exynos_gscaler"
#define Exynos_gsc_In() Exynos_Log(EXYNOS_DEV_LOG_DEBUG, EXYNOS_GSC_LOG_TAG, "%s In , Line: %d", __FUNCTION__, __LINE__)
#define Exynos_gsc_Out() Exynos_Log(EXYNOS_DEV_LOG_DEBUG, EXYNOS_GSC_LOG_TAG, "%s Out , Line: %d", __FUNCTION__, __LINE__)
#else
#define Exynos_gsc_In() ((void *)0)
#define Exynos_gsc_Out() ((void *)0)
#endif
typedef struct {
uint32_t x;
uint32_t y;
uint32_t w;
uint32_t h;
uint32_t fw;
uint32_t fh;
uint32_t format;
uint32_t yaddr;
uint32_t uaddr;
uint32_t vaddr;
uint32_t rot;
uint32_t cacheable;
uint32_t drmMode;
uint32_t narrowRgb;
int acquireFenceFd;
int releaseFenceFd;
} exynos_gsc_img;
/*
* Create libgscaler handle.
* Gscaler dev_num is dynamically changed.
*
* \ingroup exynos_gscaler
*
* \return
* libgscaler handle
*/
void *exynos_gsc_create(
void);
/*!
* Create exclusive libgscaler handle.
* Other module can't use dev_num of Gscaler.
*
* \ingroup exynos_gscaler
*
* \param dev_num
* gscaler dev_num[in]
* \param gsc_mode
*It should be set to GSC_M2M_MODE or GSC_OUTPUT_MODE.
*
*\param out_mode
*It should be set to GSC_OUT_FIMD or GSC_OUT_TV.
*
* \return
* libgscaler handle
*/
void *exynos_gsc_create_exclusive(
int dev_num,
int gsc_mode,
int out_mode,
int allow_drm);
/*!
* Destroy libgscaler handle
*
* \ingroup exynos_gscaler
*
* \param handle
* libgscaler handle[in]
*/
void exynos_gsc_destroy(
void *handle);
/*!
* Set source format.
*
* \ingroup exynos_gscaler
*
* \param handle
* libgscaler handle[in]
*
* \param width
* image width[in]
*
* \param height
* image height[in]
*
* \param crop_left
* image left crop size[in]
*
* \param crop_top
* image top crop size[in]
*
* \param crop_width
* cropped image width[in]
*
* \param crop_height
* cropped image height[in]
*
* \param v4l2_colorformat
* color format[in]
*
* \param cacheable
* ccacheable[in]
*
* \param mode_drm
* mode_drm[in]
*
* \return
* error code
*/
int exynos_gsc_set_src_format(
void *handle,
unsigned int width,
unsigned int height,
unsigned int crop_left,
unsigned int crop_top,
unsigned int crop_width,
unsigned int crop_height,
unsigned int v4l2_colorformat,
unsigned int cacheable,
unsigned int mode_drm);
/*!
* Set destination format.
*
* \ingroup exynos_gscaler
*
* \param handle
* libgscaler handle[in]
*
* \param width
* image width[in]
*
* \param height
* image height[in]
*
* \param crop_left
* image left crop size[in]
*
* \param crop_top
* image top crop size[in]
*
* \param crop_width
* cropped image width[in]
*
* \param crop_height
* cropped image height[in]
*
* \param v4l2_colorformat
* color format[in]
*
* \param cacheable
* ccacheable[in]
*
* \param mode_drm
* mode_drm[in]
*
* \param narrowRgb
* narrow RGB range[in]
*
* \return
* error code
*/
int exynos_gsc_set_dst_format(
void *handle,
unsigned int width,
unsigned int height,
unsigned int crop_left,
unsigned int crop_top,
unsigned int crop_width,
unsigned int crop_height,
unsigned int v4l2_colorformat,
unsigned int cacheable,
unsigned int mode_drm,
unsigned int narrowRgb);
/*!
* Set rotation.
*
* \ingroup exynos_gscaler
*
* \param handle
* libgscaler handle[in]
*
* \param rotation
* image rotation. It should be multiple of 90[in]
*
* \param flip_horizontal
* image flip_horizontal[in]
*
* \param flip_vertical
* image flip_vertical[in]
*
* \return
* error code
*/
int exynos_gsc_set_rotation(
void *handle,
int rotation,
int flip_horizontal,
int flip_vertical);
/*!
* Set source buffer
*
* \ingroup exynos_gscaler
*
* \param handle
* libgscaler handle[in]
*
* \param addr
* buffer pointer array[in]
*
* \param acquireFenceFd
* acquire fence fd for the buffer or -1[in]
*
* \return
* error code
*/
int exynos_gsc_set_src_addr(
void *handle,
void *addr[3],
int acquireFenceFd);
/*!
* Set destination buffer
*
* \param handle
* libgscaler handle[in]
*
* \param addr
* buffer pointer array[in]
*
* \param acquireFenceFd
* acquire fence fd for the buffer or -1[in]
*
* \return
* error code
*/
int exynos_gsc_set_dst_addr(
void *handle,
void *addr[3],
int acquireFenceFd);
/*!
* Convert color space with presetup color format
*
* \ingroup exynos_gscaler
*
* \param handle
* libgscaler handle[in]
*
* \return
* error code
*/
int exynos_gsc_convert(
void *handle);
/*!
* api for local path gscaler. Not yet support.
*
* \ingroup exynos_gscaler
*/
int exynos_gsc_connect(
void *handle,
void *hw);
/*!
* api for local path gscaler. Not yet support.
*
* \ingroup exynos_gscaler
*/
int exynos_gsc_disconnect(
void *handle,
void *hw);
/*!
* api for reserving a specific gscaler.
* This API could be used from any module that
*wants to control the gscalar privately. By calling this function any
*module can let the libgscaler know that GSC is used privately.
*
* \ingroup exynos_gsc_reserve
*/
void *exynos_gsc_reserve
(int dev_num);
/*!
* api for releasing the gscaler that was reserved with
*exynos_gsc_reserve.
* \ingroup exynos_gsc_reserve
*/
void exynos_gsc_release
(void *handle);
/*
*api for setting the GSC config.
It configures the GSC for given config
*/
int exynos_gsc_config_exclusive(
void *handle,
exynos_gsc_img *src_img,
exynos_gsc_img *dst_img);
/*
*api for GSC-OUT run.
It queues the srcBuf to GSC and deques a buf from driver.
It should be called after configuring the GSC.
*/
int exynos_gsc_run_exclusive(
void *handle,
exynos_gsc_img *src_img,
exynos_gsc_img *dst_img);
/*
* Blocks until the current frame is done processing.
*/
int exynos_gsc_wait_frame_done_exclusive
(void *handle);
/*
*api for GSC stop.
It stops the GSC OUT streaming.
*/
int exynos_gsc_stop_exclusive
(void *handle);
enum {
GSC_M2M_MODE = 0,
GSC_OUTPUT_MODE,
GSC_CAPTURE_MODE,
GSC_RESERVED_MODE,
};
/*flag info */
enum {
GSC_DUMMY = 0,
GSC_OUT_FIMD,
GSC_OUT_TV,
GSC_RESERVED,
};
enum {
GSC_DONE_CNG_CFG = 0,
GSC_NEED_CNG_CFG,
};
#ifdef __cplusplus
}
#endif
#endif /*EXYNOS_GSCALER_H_*/