/*
 * 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_HW_TYPE,
} CSC_HW_PROPERTY_TYPE;

typedef enum _CSC_HW_TYPE {
    CSC_HW_TYPE_NONE = 0,
    CSC_HW_TYPE_FIMC,
    CSC_HW_TYPE_GSCALER,
    CSC_HW_TYPE_G2D,
} CSC_HW_TYPE;

/*
 * 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);

/*
 * change hal pixel format to g2d color format
 *
 * @param hal_format
 *   hal pixel format[in]
 *
 * @return
 *   g2d color format
 */
unsigned int hal_2_g2d_color_format(unsigned int hal_format);

/*
 * change hal pixel format to g2d pixel order
 *
 * @param hal_format
 *   hal pixel format[in]
 *
 * @return
 *   g2d pixel order
 */
unsigned int hal_2_g2d_pixel_order(unsigned int hal_format);

/*
 * change hal pixel format to g2d "bpp" (actual bpp for RGB formats, 8 bpp for
 * YUV formats)
 *
 * @param hal_format
 *   hal pixel format[in]
 *
 * @return
 *   g2d bpp
 */
size_t hal_2_g2d_bpp(unsigned int hal_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 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]);

/*
 * 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]);

/*
 * Convert color space with presetup color format
 *
 * @param handle
 *   CSC handle[in]
 *
 * @return
 *   error code
 */
CSC_ERRORCODE csc_convert(
    void *handle);

#ifdef __cplusplus
}
#endif

#endif