/*
* Copyright (C) 2013 The Android Open Source Project
* Copyright@ Samsung Electronics 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_scaler.c
* \brief header file for Scaler HAL
* \author Sunyoung Kang (sy0816.kang@samsung.com)
* \date 2013/02/01
*
* Revision History:
* - 2013.02.01 : Sunyoung Kang (sy0816.kang@samsung.com) \n
* Create
*
* - 2013.04.26 : Cho KyongHo (pullip.cho@samsung.com \n
* Library rewrite
*
*/
#ifndef _EXYNOS_SCALER_H_
#define _EXYNOS_SCALER_H_
#include
#include
#include "exynos_format.h"
#define SC_DEV_NODE "/dev/video"
#define SC_NODE(x) (50 + x)
#define SC_NUM_OF_PLANES (3)
#define V4L2_PIX_FMT_NV12_RGB32 v4l2_fourcc('N', 'V', '1', 'R')
#define V4L2_PIX_FMT_NV12N_RGB32 v4l2_fourcc('N', 'N', '1', 'R')
#define V4L2_PIX_FMT_NV12M_RGB32 v4l2_fourcc('N', 'V', 'R', 'G')
#define V4L2_PIX_FMT_NV12M_BGR32 v4l2_fourcc('N', 'V', 'B', 'G')
#define V4L2_PIX_FMT_NV12M_RGB565 v4l2_fourcc('N', 'V', 'R', '6')
#define V4L2_PIX_FMT_NV12M_RGB444 v4l2_fourcc('N', 'V', 'R', '4')
#define V4L2_PIX_FMT_NV12M_RGB555X v4l2_fourcc('N', 'V', 'R', '5')
#define V4L2_PIX_FMT_NV12MT_16X16_RGB32 v4l2_fourcc('V', 'M', 'R', 'G')
#define V4L2_PIX_FMT_NV21M_RGB32 v4l2_fourcc('V', 'N', 'R', 'G')
#define V4L2_PIX_FMT_NV21M_BGR32 v4l2_fourcc('V', 'N', 'B', 'G')
#define V4L2_PIX_FMT_NV21_RGB32 v4l2_fourcc('V', 'N', '1', 'R')
#define V4L2_PIX_FMT_YVU420_RGB32 v4l2_fourcc('Y', 'V', 'R', 'G')
#define V4L2_PIX_FMT_NV12M_P010 v4l2_fourcc('P', 'M', '1', '2')
// libgscaler's internal use only
typedef enum _HW_SCAL_ID {
HW_SCAL0 = 4,
HW_SCAL1,
HW_SCAL2,
HW_SCAL_MAX,
} HW_SCAL_ID;
// argument of non-blocking api
typedef struct {
uint32_t x;
uint32_t y;
uint32_t w;
uint32_t h;
uint32_t fw;
uint32_t fh;
uint32_t format;
unsigned long yaddr;
unsigned long uaddr;
unsigned long vaddr;
uint32_t rot;
uint32_t cacheable;
uint32_t drmMode;
uint32_t narrowRgb;
int acquireFenceFd;
int releaseFenceFd;
int mem_type;
uint32_t pre_multi;
} exynos_sc_img;
enum colorspace {
COLORSPACE_SMPTE170M,
COLORSPACE_SMPTE240M,
COLORSPACE_REC709,
COLORSPACE_BT878,
COLORSPACE_470_SYSTEM_M,
COLORSPACE_470_SYSTEM_BG,
COLORSPACE_JPEG,
COLORSPACE_SRGB,
};
struct CSC_Spec{
uint32_t enable; // set 'true' for user-defined
enum colorspace space;
uint32_t wide;
};
enum SRC_BL_OP {
/* [0, 0] */
SRC_BL_OP_CLR = 1,
/* [Sa, Sc] */
SRC_BL_OP_SRC,
/* [Da, Dc] */
SRC_BL_OP_DST,
/* [Sa + (1 - Sa)*Da, Rc = Sc + (1 - Sa)*Dc] */
SRC_BL_OP_SRC_OVER,
/* [Sa + (1 - Sa)*Da, Rc = Dc + (1 - Da)*Sc] */
SRC_BL_OP_DST_OVER,
/* [Sa * Da, Sc * Da] */
SRC_BL_OP_SRC_IN,
/* [Sa * Da, Sa * Dc] */
SRC_BL_OP_DST_IN,
/* [Sa * (1 - Da), Sc * (1 - Da)] */
SRC_BL_OP_SRC_OUT,
/* [Da * (1 - Sa), Dc * (1 - Sa)] */
SRC_BL_OP_DST_OUT,
/* [Da, Sc * Da + (1 - Sa) * Dc] */
SRC_BL_OP_SRC_ATOP,
/* [Sa, Sc * (1 - Da) + Sa * Dc ] */
SRC_BL_OP_DST_ATOP,
/* [-(Sa * Da), Sc * (1 - Da) + (1 - Sa) * Dc] */
SRC_BL_OP_XOR,
/* [Sa + Da - Sa*Da, Sc*(1 - Da) + Dc*(1 - Sa) + min(Sc, Dc)] */
SRC_BL_OP_DARKEN,
/* [Sa + Da - Sa*Da, Sc*(1 - Da) + Dc*(1 - Sa) + max(Sc, Dc)] */
SRC_BL_OP_LIGHTEN,
/** [Sa * Da, Sc * Dc] */
SRC_BL_OP_MULTIPLY,
/* [Sa + Da - Sa * Da, Sc + Dc - Sc * Dc] */
SRC_BL_OP_SCREEN,
/* Saturate(S + D) */
SRC_BL_OP_ADD
};
struct SrcGlobalAlpha {
uint32_t enable;
unsigned int val;
};
struct SrcBlendInfo {
enum SRC_BL_OP blop;
unsigned int srcblendfmt;
unsigned int srcblendhpos;
unsigned int srcblendvpos;
unsigned int srcblendpremulti;
unsigned int srcblendstride;
unsigned int srcblendwidth;
unsigned int srcblendheight;
struct SrcGlobalAlpha globalalpha;
struct CSC_Spec cscspec;
};
#ifdef __cplusplus
extern "C" {
#endif
/*!
* Create libscaler handle
*
* \ingroup exynos_scaler
*
* \param dev_num
* scaler dev_num[in]
*
* \return
* libscaler handle
*/
void *exynos_sc_create(int dev_num);
/*!
* Destroy libscaler handle
*
* \ingroup exynos_scaler
*
* \param handle
* libscaler handle[in]
*/
int exynos_sc_destroy(void *handle);
/*!
* Convert color space with presetup color format
*
* \ingroup exynos_scaler
*
* \param handle
* libscaler handle[in]
*
* \return
* error code
*/
int exynos_sc_convert(void *handle);
/*!
* Convert color space with presetup color format
*
* \ingroup exynos_scaler
*
* \param handle
* libscaler handle
*
* \param csc_range
* csc narrow/wide property
*
* \param v4l2_colorspace
* csc equation property
*
* \param filter
* denoise filter info
*
* \return
* error code
*/
int exynos_sc_set_csc_property(
void *handle,
unsigned int csc_range,
unsigned int v4l2_colorspace,
unsigned int filter);
/*!
* Set source format.
*
* \ingroup exynos_scaler
*
* \param handle
* libscaler 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 premultiplied
* pre-multiplied format[in]
*
* \return
* error code
*/
int exynos_sc_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,
unsigned int premultiplied);
/*!
* Set destination format.
*
* \ingroup exynos_scaler
*
* \param handle
* libscaler 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 premultiplied
* pre-multiplied format[in]
*
* \return
* error code
*/
int exynos_sc_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 premultiplied);
/*!
* Set source buffer
*
* \ingroup exynos_scaler
*
* \param handle
* libscaler handle[in]
*
* \param addr
* buffer pointer array[in]
*
* \param mem_type
* memory type[in]
*
* \param acquireFenceFd
* acquire fence fd for the buffer or -1[in]
*
* \return
* error code
*/
int exynos_sc_set_src_addr(
void *handle,
void *addr[SC_NUM_OF_PLANES],
int mem_type,
int acquireFenceFd);
/*!
* Set destination buffer
*
* \param handle
* libscaler handle[in]
*
* \param addr
* buffer pointer array[in]
*
* \param mem_type
* memory type[in]
*
* \param acquireFenceFd
* acquire fence fd for the buffer or -1[in]
*
* \return
* error code
*/
int exynos_sc_set_dst_addr(
void *handle,
void *addr[SC_NUM_OF_PLANES],
int mem_type,
int acquireFenceFd);
/*!
* Set rotation.
*
* \ingroup exynos_scaler
*
* \param handle
* libscaler handle[in]
*
* \param rot
* image rotation. It should be multiple of 90[in]
*
* \param flip_h
* image flip_horizontal[in]
*
* \param flip_v
* image flip_vertical[in]
*
* \return
* error code
*/
int exynos_sc_set_rotation(
void *handle,
int rot,
int flip_h,
int flip_v);
/*!
* Set framerate (optional).
*
* \ingroup exynos_scaler
*
* \param handle
* libscaler handle[in]
*
* \param framerate
* frame rate[in]
*/
void exynos_sc_set_framerate(
void *handle,
int framerate);
////// non-blocking /////
void *exynos_sc_create_exclusive(
int dev_num,
int allow_drm);
int exynos_sc_csc_exclusive(void *handle,
unsigned int range_full,
unsigned int v4l2_colorspace);
int exynos_sc_config_exclusive(
void *handle,
exynos_sc_img *src_img,
exynos_sc_img *dst_img);
int exynos_sc_run_exclusive(
void *handle,
exynos_sc_img *src_img,
exynos_sc_img *dst_img);
void *exynos_sc_create_blend_exclusive(
int dev_num,
int allow_drm);
int exynos_sc_config_blend_exclusive(
void *handle,
exynos_sc_img *src_img,
exynos_sc_img *dst_img,
struct SrcBlendInfo *srcblendinfo);
int exynos_sc_wait_frame_done_exclusive
(void *handle);
int exynos_sc_stop_exclusive
(void *handle);
int exynos_sc_free_and_close
(void *handle);
/******************************************************************************
******** API for Copy Pixels between RGB data ********************************
******************************************************************************/
/*!
* Description of an image for both of the source and the destination.
*
* \ingroup exynos_scaler
*/
struct exynos_sc_pxinfo_img
{
void *addr;
unsigned int width;
unsigned int height;
unsigned int crop_left;
unsigned int crop_top;
unsigned int crop_width;
unsigned int crop_height;
unsigned int pxfmt; // enum EXYNOS_SC_FMT_PXINFO
};
/*!
* Description of a pixel copy
*
* \ingroup exynos_scaler
*/
struct exynos_sc_pxinfo {
struct exynos_sc_pxinfo_img src;
struct exynos_sc_pxinfo_img dst;
unsigned short rotate; // 0 ~ 360
char hflip; // non-zero value for hflip
char vflip; // non-zero value for vflip
};
/*!
* Pixel format definition for pixel copy
*
* \ingroup exynos_scaler
*/
enum SC_FMT_PXINFO {
EXYNOS_SC_FMT_RGB32 = 0x10,
EXYNOS_SC_FMT_BGR32,
EXYNOS_SC_FMT_RGB565,
EXYNOS_SC_FMT_RGB555X,
EXYNOS_SC_FMT_RGB444,
};
/*!
* Copy pixel data from RGB to RGB
*
* \ingroup exynos_scaler
*
* \param pxinfo
* information for pixel data copy [in]
*
* \param dev_num
* Scaler H/W instance number. Starts from 0 [in]
*
* \return
* true on success in copying pixel data.
* false on failure.
*/
bool exynos_sc_copy_pixels(
struct exynos_sc_pxinfo *pxinfo,
int dev_num);
int hal_pixfmt_to_v4l2(int hal_pixel_format);
#ifdef __cplusplus
}
#endif
#endif /* _EXYNOS_SCALER_H_ */