/* * Copyright (C) 2012 The Android Open Source Project * * 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 csc.h * * @brief color space convertion abstract header * * @author Pyoungjae Jung (pjet.jung@samsung.com) * * @version 1.0 * * @history * 2011.12.27 : Create */ #ifndef CSC_H #define CSC_H #ifdef __cplusplus extern "C" { #endif #define CSC_MAX_PLANES 3 typedef enum _CSC_ERRORCODE { CSC_ErrorNone = 0, CSC_Error, CSC_ErrorNotInit, CSC_ErrorInvalidAddress, CSC_ErrorUnsupportFormat, CSC_ErrorNotImplemented } CSC_ERRORCODE; typedef enum _CSC_METHOD { CSC_METHOD_SW = 0, CSC_METHOD_HW } CSC_METHOD; typedef enum _CSC_HW_PROPERTY_TYPE { CSC_HW_PROPERTY_FIXED_NODE = 0, CSC_HW_PROPERTY_MODE_DRM, } CSC_HW_PROPERTY_TYPE; typedef enum _CSC_MEMTYPE { CSC_MEMORY_MMAP = 1, CSC_MEMORY_USERPTR, CSC_MEMORY_OVERLAY, CSC_MEMORY_DMABUF, CSC_MEMORY_MFC, } CSC_MEMTYPE; typedef enum _CSC_HW_ID { CSC_HW_GSC0 = 0, CSC_HW_GSC1, CSC_HW_GSC2, CSC_HW_GSC3, CSC_HW_SC0, CSC_HW_SC1, CSC_HW_SC2, CSC_HW_MAX, } CSC_HW_ID; typedef enum _CSC_PLANE { CSC_Y_PLANE = 0, CSC_RGB_PLANE = 0, CSC_U_PLANE = 1, CSC_UV_PLANE = 1, CSC_V_PLANE = 2 } CSC_PLANE; typedef enum _CSC_HW_TYPE { CSC_HW_TYPE_FIMC = 0, CSC_HW_TYPE_GSCALER } CSC_HW_TYPE; typedef enum _CSC_EQ_MODE { CSC_EQ_MODE_USER = 0, CSC_EQ_MODE_AUTO } CSC_EQ_MODE; typedef enum _CSC_EQ_COLORSPACE { CSC_EQ_COLORSPACE_SMPTE170M = 1, CSC_EQ_COLORSPACE_SMPTE240M, CSC_EQ_COLORSPACE_REC709, CSC_EQ_COLORSPACE_BT878, CSC_EQ_COLORSPACE_470_SYSTEM_M, CSC_EQ_COLORSPACE_470_SYSTEM_BG } CSC_EQ_COLORSPACE; typedef enum _CSC_EQ_RANGE { CSC_EQ_RANGE_NARROW = 0, CSC_EQ_RANGE_FULL } CSC_EQ_RANGE; typedef enum _CSC_HW_FILTER { CSC_FT_NONE = 0, CSC_FT_BLUR, CSC_FT_240, CSC_FT_480, CSC_FT_720, CSC_FT_1080, CSC_FT_MAX } CSC_HW_FILTER; typedef struct _CSC_FORMAT { unsigned int width; unsigned int height; unsigned int crop_left; unsigned int crop_top; unsigned int crop_width; unsigned int crop_height; unsigned int color_format; unsigned int cacheable; unsigned int mode_drm; } CSC_FORMAT; typedef struct _CSC_BUFFER { void *planes[CSC_MAX_PLANES]; int mem_type; } CSC_BUFFER; typedef struct _CSC_HW_PROPERTY { int fixed_node; int mode_drm; } CSC_HW_PROPERTY; typedef struct _CSC_HANDLE { CSC_FORMAT dst_format; CSC_FORMAT src_format; CSC_BUFFER dst_buffer; CSC_BUFFER src_buffer; CSC_METHOD csc_method; CSC_HW_TYPE csc_hw_type; void *csc_hw_handle; CSC_HW_PROPERTY hw_property; /* CSC Equation */ CSC_EQ_MODE csc_mode; CSC_EQ_RANGE csc_range; CSC_EQ_COLORSPACE colorspace; /* Denoising filter */ CSC_HW_FILTER filter; } CSC_HANDLE; /* * change hal pixel format to omx pixel format * * @param hal_format * hal pixel format[in] * * @return * omx pixel format */ unsigned int hal_2_omx_pixel_format( unsigned int hal_format); /* * change omx pixel format to hal pixel format * * @param hal_format * omx pixel format[in] * * @return * hal pixel format */ unsigned int omx_2_hal_pixel_format( unsigned int omx_format); /* * Init CSC handle * * @return * csc handle */ void *csc_init( CSC_METHOD method); /* * Deinit CSC handle * * @param handle * CSC handle[in] * * @return * error code */ CSC_ERRORCODE csc_deinit( void *handle); /* * get color space converter method * * @param handle * CSC handle[in] * * @param method * CSC method[out] * * @return * error code */ CSC_ERRORCODE csc_get_method( void *handle, CSC_METHOD *method); /* * set color space converter method * * @param handle * CSC handle[in] * * @param method * CSC method[in] * * @return * error code */ CSC_ERRORCODE csc_set_method( void *handle, CSC_METHOD method); /* * Set hw property * * @param handle * CSC handle[in] * * @param property * csc hw property[in] * * @param value * csc hw property value[in] * * @return * csc handle */ CSC_ERRORCODE csc_set_hw_property( void *handle, CSC_HW_PROPERTY_TYPE property, int value); /* * Get csc equation property. * * @param handle * CSC handle[in] * * @param mode * csc equation mode[out] * * @param colorspace * csc color space[out] * * @param range * csc equation range[out] * * @return * error code */ CSC_ERRORCODE csc_get_eq_property( void *handle, CSC_EQ_MODE *csc_mode, CSC_EQ_RANGE *csc_range, CSC_EQ_COLORSPACE *colorspace); /* * Set csc equation property. * * @param handle * CSC handle[in] * * @param mode * csc equation mode[in] * * @param colorspace * csc color space[in] * * @param range * csc equation range[in] * * @return * error code */ CSC_ERRORCODE csc_set_eq_property( void *handle, CSC_EQ_MODE csc_mode, CSC_EQ_RANGE csc_range, CSC_EQ_COLORSPACE colorspace); /* * Set csc filter property. * * @param handle * CSC handle[in] * * @param filter * csc filter info[in] * * @return * error code */ CSC_ERRORCODE csc_set_filter_property( void *handle, CSC_HW_FILTER filter); /* * Get source format. * * @param handle * CSC handle[in] * * @param width * address of image width[out] * * @param height * address of image height[out] * * @param crop_left * address of image left crop size[out] * * @param crop_top * address of image top crop size[out] * * @param crop_width * address of cropped image width[out] * * @param crop_height * address of cropped image height[out] * * @param color_format * address of source color format(HAL format)[out] * * @return * error code */ CSC_ERRORCODE csc_get_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 *color_format, unsigned int *cacheable); /* * Set source format. * Don't call each converting time. * Pls call this function as below. * 1. first converting time * 2. format is changed * * @param handle * CSC 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 color_format * source color format(HAL format)[in] * * @return * error code */ CSC_ERRORCODE csc_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 color_format, unsigned int cacheable); /* * Get destination format. * * @param handle * CSC handle[in] * * @param width * address of image width[out] * * @param height * address of image height[out] * * @param crop_left * address of image left crop size[out] * * @param crop_top * address of image top crop size[out] * * @param crop_width * address of cropped image width[out] * * @param crop_height * address of cropped image height[out] * * @param color_format * address of color format(HAL format)[out] * * @return * error code */ CSC_ERRORCODE csc_get_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 *color_format, unsigned int *cacheable); /* * Set destination format * Don't call each converting time. * Pls call this function as below. * 1. first converting time * 2. format is changed * * @param handle * CSC 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 color_format * destination color format(HAL format)[in] * * @return * error code */ CSC_ERRORCODE csc_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 color_format, unsigned int cacheable); /* * Setup source buffer * set_format func should be called before this this func. * * @param handle * CSC handle[in] * * @param src_buffer * source buffer pointer array[in] * * @param y * y or RGB destination pointer[in] * * @param u * u or uv destination pointer[in] * * @param v * v or none destination pointer[in] * * @return * error code */ CSC_ERRORCODE csc_set_src_buffer( void *handle, void *addr[CSC_MAX_PLANES], int mem_type); /* * Setup destination buffer * * @param handle * CSC handle[in] * * @param y * y or RGB destination pointer[in] * * @param u * u or uv destination pointer[in] * * @param v * v or none destination pointer[in] * * @return * error code */ CSC_ERRORCODE csc_set_dst_buffer( void *handle, void *addr[CSC_MAX_PLANES], int mem_type); /* * Convert color space with presetup color format * * @param handle * CSC handle[in] * * @return * error code */ CSC_ERRORCODE csc_convert( void *handle); CSC_ERRORCODE csc_convert_with_rotation( void *handle, int rotation, int flip_horizontal, int flip_vertical); #ifdef __cplusplus } #endif #endif