541 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			541 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
|  * 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
 | |
|  *
 | |
|  * <b>Revision History: </b>
 | |
|  * - 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 <linux/videodev2.h>
 | |
| #include <stdbool.h>
 | |
| 
 | |
| #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_ */
 |