147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang/*
247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang *
347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang * Copyright 2012 Samsung Electronics S.LSI Co. LTD
447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang *
547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang * Licensed under the Apache License, Version 2.0 (the "License");
647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang * you may not use this file except in compliance with the License.
747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang * You may obtain a copy of the License at
847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang *
947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang *      http://www.apache.org/licenses/LICENSE-2.0
1047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang *
1147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang * Unless required by applicable law or agreed to in writing, software
1247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang * distributed under the License is distributed on an "AS IS" BASIS,
1347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang * See the License for the specific language governing permissions and
1547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang * limitations under the License.
1647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang */
1747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
1847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang/*
1947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang * @file        csc.c
2047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang *
2147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang * @brief       color space convertion abstract source
2247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang *
2347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang * @author      Pyoungjae Jung(pjet.jung@samsung.com)
2447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang *
2547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang * @version     1.0.0
2647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang *
2747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang * @history
2847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang *   2012.1.11 : Create
2947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang */
3047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang#define LOG_TAG "libcsc"
3147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang#include <cutils/log.h>
3247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
3347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang#include <stdio.h>
3447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang#include <stdlib.h>
3547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang#include <utils/Log.h>
363b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang#include <system/graphics.h>
3747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
3847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang#include "csc.h"
3947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang#include "exynos_format.h"
4047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang#include "swconverter.h"
4147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
4247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang#ifdef EXYNOS_OMX
4347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang#include "Exynos_OMX_Def.h"
4447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang#else
4547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang#include "SEC_OMX_Def.h"
4647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang#endif
4747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
483b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang#ifdef ENABLE_FIMC
4947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang#include "hwconverter_wrapper.h"
5047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang#endif
5147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
523b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang#ifdef ENABLE_GSCALER
5347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang#include "exynos_gscaler.h"
5447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang#endif
5547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
568f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann#ifdef ENABLE_G2D
578f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann#include <fcntl.h>
588f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann#include <sys/ioctl.h>
598f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann#include "fimg2d.h"
608f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann
618f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmanntypedef struct
628f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann{
638f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann    struct fimg2d_image src;
648f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann    struct fimg2d_image dst;
658f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann    int fd;
668f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann} g2d_data;
678f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann#endif
688f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann
6947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang#define GSCALER_IMG_ALIGN 16
7047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang#define ALIGN(x, a)       (((x) + (a) - 1) & ~((a) - 1))
7147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
7247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Changtypedef enum _CSC_PLANE {
7347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_Y_PLANE = 0,
7447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_RGB_PLANE = 0,
7547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_U_PLANE = 1,
7647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_UV_PLANE = 1,
7747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_V_PLANE = 2
7847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang} CSC_PLANE;
7947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
8047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Changtypedef struct _CSC_FORMAT {
8147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int width;
8247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int height;
8347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int crop_left;
8447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int crop_top;
8547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int crop_width;
8647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int crop_height;
8747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int color_format;
8847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int cacheable;
893b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    unsigned int mode_drm;
9047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang} CSC_FORMAT;
9147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
9247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Changtypedef struct _CSC_BUFFER {
93f77a2a9dcd345a812c842087dfc2dd2687305fc2SeungBeom Kim    void *planes[CSC_MAX_PLANES];
9447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang} CSC_BUFFER;
9547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
963b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Changtypedef struct _CSC_HW_PROPERTY {
973b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    int fixed_node;
983b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    int mode_drm;
993b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang} CSC_HW_PROPERTY;
1003b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang
10147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Changtypedef struct _CSC_HANDLE {
10247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_FORMAT      dst_format;
10347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_FORMAT      src_format;
10447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_BUFFER      dst_buffer;
10547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_BUFFER      src_buffer;
10647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_METHOD      csc_method;
10747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_HW_TYPE     csc_hw_type;
10847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    void           *csc_hw_handle;
1093b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    CSC_HW_PROPERTY hw_property;
11047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang} CSC_HANDLE;
11147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
11247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang/* source is RGB888 */
11347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Changstatic CSC_ERRORCODE conv_sw_src_argb888(
11447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_HANDLE *handle)
11547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang{
11647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_ERRORCODE ret = CSC_ErrorNone;
11747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
11847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    switch (handle->dst_format.color_format) {
11947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    case HAL_PIXEL_FORMAT_YCbCr_420_P:
12047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        csc_ARGB8888_to_YUV420P(
12147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            (unsigned char *)handle->dst_buffer.planes[CSC_Y_PLANE],
12247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            (unsigned char *)handle->dst_buffer.planes[CSC_U_PLANE],
12347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            (unsigned char *)handle->dst_buffer.planes[CSC_V_PLANE],
12447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            (unsigned char *)handle->src_buffer.planes[CSC_RGB_PLANE],
12547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            handle->src_format.width,
12647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            handle->src_format.height);
12747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        ret = CSC_ErrorNone;
12847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        break;
12947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    case HAL_PIXEL_FORMAT_YCbCr_420_SP:
13047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        csc_ARGB8888_to_YUV420SP_NEON(
13147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            (unsigned char *)handle->dst_buffer.planes[CSC_Y_PLANE],
13247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            (unsigned char *)handle->dst_buffer.planes[CSC_UV_PLANE],
13347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            (unsigned char *)handle->src_buffer.planes[CSC_RGB_PLANE],
13447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            handle->src_format.width,
13547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            handle->src_format.height);
13647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        ret = CSC_ErrorNone;
13747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        break;
13847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    default:
13947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        ret = CSC_ErrorUnsupportFormat;
14047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        break;
14147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    }
14247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
14347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    return ret;
14447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang}
14547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
14647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang/* source is NV12T */
14747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Changstatic CSC_ERRORCODE conv_sw_src_nv12t(
14847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_HANDLE *handle)
14947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang{
15047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_ERRORCODE ret = CSC_ErrorNone;
15147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
15247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    switch (handle->dst_format.color_format) {
15347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    case HAL_PIXEL_FORMAT_YCbCr_420_P:
15447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        csc_tiled_to_linear_y_neon(
15547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            (unsigned char *)handle->dst_buffer.planes[CSC_Y_PLANE],
15647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            (unsigned char *)handle->src_buffer.planes[CSC_Y_PLANE],
15747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            handle->src_format.width,
15847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            handle->src_format.height);
15947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        csc_tiled_to_linear_uv_deinterleave_neon(
16047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            (unsigned char *)handle->dst_buffer.planes[CSC_U_PLANE],
16147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            (unsigned char *)handle->dst_buffer.planes[CSC_V_PLANE],
16247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            (unsigned char *)handle->src_buffer.planes[CSC_UV_PLANE],
16347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            handle->src_format.width,
16447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            handle->src_format.height / 2);
16547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        ret = CSC_ErrorNone;
16647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        break;
16747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    case HAL_PIXEL_FORMAT_YCbCr_420_SP:
16847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        csc_tiled_to_linear_y_neon(
16947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            (unsigned char *)handle->dst_buffer.planes[CSC_Y_PLANE],
17047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            (unsigned char *)handle->src_buffer.planes[CSC_Y_PLANE],
17147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            handle->src_format.width,
17247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            handle->src_format.height);
17347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        csc_tiled_to_linear_uv_neon(
17447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            (unsigned char *)handle->dst_buffer.planes[CSC_UV_PLANE],
17547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            (unsigned char *)handle->src_buffer.planes[CSC_UV_PLANE],
17647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            handle->src_format.width,
17747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            handle->src_format.height / 2);
17847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        ret = CSC_ErrorNone;
17947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        break;
18047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    default:
18147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        ret = CSC_ErrorUnsupportFormat;
18247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        break;
18347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    }
18447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
18547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    return ret;
18647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang}
18747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
18847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang/* source is YUV420P */
18947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Changstatic CSC_ERRORCODE conv_sw_src_yuv420p(
19047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_HANDLE *handle)
19147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang{
19247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_ERRORCODE ret = CSC_ErrorNone;
19347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
19447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    switch (handle->dst_format.color_format) {
19547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    case HAL_PIXEL_FORMAT_YCbCr_420_P:  /* bypass */
19647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        memcpy((unsigned char *)handle->dst_buffer.planes[CSC_Y_PLANE],
19747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang               (unsigned char *)handle->src_buffer.planes[CSC_Y_PLANE],
19847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang               handle->src_format.width * handle->src_format.height);
19947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        memcpy((unsigned char *)handle->dst_buffer.planes[CSC_U_PLANE],
20047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang               (unsigned char *)handle->src_buffer.planes[CSC_U_PLANE],
20147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang               (handle->src_format.width * handle->src_format.height) >> 2);
20247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        memcpy((unsigned char *)handle->dst_buffer.planes[CSC_V_PLANE],
20347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang               (unsigned char *)handle->src_buffer.planes[CSC_V_PLANE],
20447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang               (handle->src_format.width * handle->src_format.height) >> 2);
20547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        ret = CSC_ErrorNone;
20647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        break;
20747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    case HAL_PIXEL_FORMAT_YCbCr_420_SP:
20847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        memcpy((unsigned char *)handle->dst_buffer.planes[CSC_Y_PLANE],
20947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang               (unsigned char *)handle->src_buffer.planes[CSC_Y_PLANE],
21047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang               handle->src_format.width * handle->src_format.height);
21147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        csc_interleave_memcpy_neon(
21247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            (unsigned char *)handle->dst_buffer.planes[CSC_UV_PLANE],
21347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            (unsigned char *)handle->src_buffer.planes[CSC_U_PLANE],
21447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            (unsigned char *)handle->src_buffer.planes[CSC_V_PLANE],
21547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            (handle->src_format.width * handle->src_format.height) >> 2);
21647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        ret = CSC_ErrorNone;
21747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        break;
21847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    default:
21947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        ret = CSC_ErrorUnsupportFormat;
22047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        break;
22147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    }
22247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
22347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    return ret;
22447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang}
22547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
22647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang/* source is YUV420SP */
22747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Changstatic CSC_ERRORCODE conv_sw_src_yuv420sp(
22847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_HANDLE *handle)
22947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang{
23047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_ERRORCODE ret = CSC_ErrorNone;
23147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
23247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    switch (handle->dst_format.color_format) {
23347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    case HAL_PIXEL_FORMAT_YCbCr_420_P:
23447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        memcpy((unsigned char *)handle->dst_buffer.planes[CSC_Y_PLANE],
23547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang               (unsigned char *)handle->src_buffer.planes[CSC_Y_PLANE],
23647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang               handle->src_format.width * handle->src_format.height);
23747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        csc_deinterleave_memcpy(
23847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            (unsigned char *)handle->dst_buffer.planes[CSC_U_PLANE],
23947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            (unsigned char *)handle->dst_buffer.planes[CSC_V_PLANE],
24047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            (unsigned char *)handle->src_buffer.planes[CSC_UV_PLANE],
24147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            handle->src_format.width * handle->src_format.height >> 1);
24247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        ret = CSC_ErrorNone;
24347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        break;
24447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    case HAL_PIXEL_FORMAT_YCbCr_420_SP: /* bypass */
24547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        memcpy((unsigned char *)handle->dst_buffer.planes[CSC_Y_PLANE],
24647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang               (unsigned char *)handle->src_buffer.planes[CSC_Y_PLANE],
24747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang               handle->src_format.width * handle->src_format.height);
24847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        memcpy((unsigned char *)handle->dst_buffer.planes[CSC_UV_PLANE],
24947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang               (unsigned char *)handle->src_buffer.planes[CSC_UV_PLANE],
25047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang               handle->src_format.width * handle->src_format.height >> 1);
25147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        ret = CSC_ErrorNone;
25247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        break;
25347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    default:
25447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        ret = CSC_ErrorUnsupportFormat;
25547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        break;
25647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    }
25747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
25847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    return ret;
25947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang}
26047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
26147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Changstatic CSC_ERRORCODE conv_sw(
26247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_HANDLE *handle)
26347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang{
26447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_ERRORCODE ret = CSC_ErrorNone;
26547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
26647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    switch (handle->src_format.color_format) {
26747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED:
26847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        ret = conv_sw_src_nv12t(handle);
26947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        break;
27047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    case HAL_PIXEL_FORMAT_YCbCr_420_P:
27147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        ret = conv_sw_src_yuv420p(handle);
27247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        break;
27347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    case HAL_PIXEL_FORMAT_YCbCr_420_SP:
27447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        ret = conv_sw_src_yuv420sp(handle);
27547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        break;
276ae570c5d1b371aca69f7391c9dcdad74ac0202dbGreg Hackmann    case HAL_PIXEL_FORMAT_CUSTOM_ARGB_8888:
27747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        ret = conv_sw_src_argb888(handle);
27847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        break;
27947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    default:
28047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        ret = CSC_ErrorUnsupportFormat;
28147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        break;
28247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    }
28347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
28447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    return ret;
28547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang}
28647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
28747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Changstatic CSC_ERRORCODE conv_hw(
28847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_HANDLE *handle)
28947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang{
29047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_ERRORCODE ret = CSC_ErrorNone;
29147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    switch (handle->csc_hw_type) {
2923b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang#ifdef ENABLE_FIMC
29347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    case CSC_HW_TYPE_FIMC:
29447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    {
29547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        void *src_addr[3];
29647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        void *dst_addr[3];
2973b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang        OMX_COLOR_FORMATTYPE src_omx_format;
2983b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang        OMX_COLOR_FORMATTYPE dst_omx_format;
29947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        src_addr[0] = handle->src_buffer.planes[CSC_Y_PLANE];
30047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        src_addr[1] = handle->src_buffer.planes[CSC_UV_PLANE];
30147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        dst_addr[0] = handle->dst_buffer.planes[CSC_Y_PLANE];
30247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        dst_addr[1] = handle->dst_buffer.planes[CSC_U_PLANE];
30347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        dst_addr[2] = handle->dst_buffer.planes[CSC_V_PLANE];
3043b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang        src_omx_format = hal_2_omx_pixel_format(handle->src_format.color_format);
3053b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang        dst_omx_format = hal_2_omx_pixel_format(handle->dst_format.color_format);
30647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        csc_hwconverter_convert_nv12t(
30747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            handle->csc_hw_handle,
30847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            dst_addr,
30947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            src_addr,
31047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            handle->dst_format.width,
31147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            handle->dst_format.height,
3123b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang            dst_omx_format,
3133b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang            src_omx_format);
31447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        break;
31547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    }
31647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang#endif
3173b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang#ifdef ENABLE_GSCALER
31847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    case CSC_HW_TYPE_GSCALER:
3193b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang        if (exynos_gsc_convert(handle->csc_hw_handle) != 0) {
3203b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang            ALOGE("%s:: exynos_gsc_convert() fail", __func__);
3213b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang            ret = CSC_Error;
3223b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang        }
32347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        break;
32447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang#endif
3258f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann#ifdef ENABLE_G2D
3268f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann    case CSC_HW_TYPE_G2D:
3278f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann    {
3288f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann        g2d_data *g2d = (g2d_data *)handle->csc_hw_handle;
3298f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann        struct fimg2d_blit blit;
3308f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann        int err;
3318f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann
3328f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann        memset(&blit, 0, sizeof(blit));
3338f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann        blit.op = BLIT_OP_SRC_COPY;
3348f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann        blit.param.g_alpha = 0xFF;
3358f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann        blit.src = &g2d->src;
3368f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann        blit.dst = &g2d->dst;
3378f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann        blit.sync = BLIT_SYNC;
3388f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann
3398f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann        err = ioctl(g2d->fd, FIMG2D_BITBLT_BLIT, &blit);
3408f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann        if (err < 0) {
3418f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            ALOGE("FIMG2D_BITBLT_BLIT ioctl failed: %s", strerror(errno));
3428f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            ret = CSC_Error;
3438f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann        }
3448f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann
3458f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann        break;
3468f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann    }
3478f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann#endif
34847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    default:
3493b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang        ALOGE("%s:: unsupported csc_hw_type(%d)", __func__, handle->csc_hw_type);
3503b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang        ret = CSC_ErrorNotImplemented;
35147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        break;
35247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    }
35347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
3543b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    return ret;
35547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang}
35647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
3573b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Changstatic CSC_ERRORCODE csc_init_hw(
3583b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    void *handle)
35947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang{
36047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_HANDLE *csc_handle;
3613b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    CSC_ERRORCODE ret = CSC_ErrorNone;
36247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
3633b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    csc_handle = (CSC_HANDLE *)handle;
3643b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    if (csc_handle->csc_method == CSC_METHOD_HW) {
36547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        switch (csc_handle->csc_hw_type) {
3663b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang#ifdef ENABLE_FIMC
36747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        case CSC_HW_TYPE_FIMC:
36847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            csc_handle->csc_hw_handle = csc_hwconverter_open();
3693b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang            ALOGV("%s:: CSC_HW_TYPE_FIMC", __func__);
37047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            break;
37147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang#endif
3723b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang#ifdef ENABLE_GSCALER
37347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        case CSC_HW_TYPE_GSCALER:
3743b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang            if (csc_handle->hw_property.fixed_node >= 0)
37533aa35f1c81c92e5b44ddc898fed85ad39e1908bDima Zavin                csc_handle->csc_hw_handle = exynos_gsc_create_exclusive(csc_handle->hw_property.fixed_node, GSC_M2M_MODE, 0, 0);
3763b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang            else
37747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            csc_handle->csc_hw_handle = exynos_gsc_create();
3783b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang            ALOGV("%s:: CSC_HW_TYPE_GSCALER", __func__);
37947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            break;
38047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang#endif
3818f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann#ifdef ENABLE_G2D
3828f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann        case CSC_HW_TYPE_G2D:
3838f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann        {
3848f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            g2d_data *g2d = calloc(1, sizeof(g2d_data));
3858f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            if (!g2d) {
3868f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann                ALOGE("failed to allocate G2D data");
3878f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann                break;
3888f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            }
3898f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            g2d->fd = open("/dev/fimg2d", O_RDWR);
3908f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            if (g2d->fd < 0) {
3918f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann                ALOGE("failed to open G2D: %s", strerror(errno));
3928f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann                free(g2d);
3938f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            } else {
3948f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann                csc_handle->csc_hw_handle = g2d;
3958f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            }
3968f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            break;
3978f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann        }
3988f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann#endif
39947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        default:
400baa53d4c62b2c77d2dc058ade3ce8e7be5f6262dDima Zavin            ALOGE("%s:: unsupported csc_hw_type, csc use sw", __func__);
4018f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            csc_handle->csc_hw_handle = NULL;
40247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            break;
40347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        }
40447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    }
40547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
40647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    if (csc_handle->csc_method == CSC_METHOD_HW) {
40747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        if (csc_handle->csc_hw_handle == NULL) {
408baa53d4c62b2c77d2dc058ade3ce8e7be5f6262dDima Zavin            ALOGE("%s:: CSC_METHOD_HW can't open HW", __func__);
4094328d3947562a17ab929b0ac2bfe67497f9e1d07Greg Hackmann            ret = CSC_Error;
41047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        }
41147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    }
41247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
4133b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    ALOGV("%s:: CSC_METHOD=%d", __func__, csc_handle->csc_method);
4143b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang
4153b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    return ret;
4163b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang}
4173b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang
4183b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Changstatic CSC_ERRORCODE csc_set_format(
4193b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    void *handle)
4203b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang{
4213b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    CSC_HANDLE *csc_handle;
4223b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    CSC_ERRORCODE ret = CSC_ErrorNone;
4233b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang
4243b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    if (handle == NULL)
4253b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang        return CSC_ErrorNotInit;
4263b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang
4273b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    csc_handle = (CSC_HANDLE *)handle;
4283b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    if (csc_handle->csc_method == CSC_METHOD_HW) {
4293b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang        switch (csc_handle->csc_hw_type) {
4303b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang        case CSC_HW_TYPE_FIMC:
4313b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang            break;
4323b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang#ifdef ENABLE_GSCALER
4333b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang        case CSC_HW_TYPE_GSCALER:
4343b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang            exynos_gsc_set_src_format(
4353b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang                csc_handle->csc_hw_handle,
4363b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang                ALIGN(csc_handle->src_format.width, GSCALER_IMG_ALIGN),
4373b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang                ALIGN(csc_handle->src_format.height, GSCALER_IMG_ALIGN),
4383b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang                csc_handle->src_format.crop_left,
4393b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang                csc_handle->src_format.crop_top,
440d50f650bbb4691ec209ec4090b32ecc332cf2234Jiho Chang                csc_handle->src_format.crop_width,
441d50f650bbb4691ec209ec4090b32ecc332cf2234Jiho Chang                csc_handle->src_format.crop_height,
4423b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang                HAL_PIXEL_FORMAT_2_V4L2_PIX(csc_handle->src_format.color_format),
4433b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang                csc_handle->src_format.cacheable,
4443b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang                csc_handle->hw_property.mode_drm);
4453b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang
4463b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang            exynos_gsc_set_dst_format(
4473b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang                csc_handle->csc_hw_handle,
4483b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang                ALIGN(csc_handle->dst_format.width, GSCALER_IMG_ALIGN),
4493b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang                ALIGN(csc_handle->dst_format.height, GSCALER_IMG_ALIGN),
4503b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang                csc_handle->dst_format.crop_left,
4513b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang                csc_handle->dst_format.crop_top,
452d50f650bbb4691ec209ec4090b32ecc332cf2234Jiho Chang                csc_handle->dst_format.crop_width,
453d50f650bbb4691ec209ec4090b32ecc332cf2234Jiho Chang                csc_handle->dst_format.crop_height,
4543b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang                HAL_PIXEL_FORMAT_2_V4L2_PIX(csc_handle->dst_format.color_format),
4553b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang                csc_handle->dst_format.cacheable,
456bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann                csc_handle->hw_property.mode_drm,
457bcd3f11d136665f5f508aa802d27e9f4ed888b4eGreg Hackmann                0);
4583b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang            break;
4593b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang#endif
4608f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann#ifdef ENABLE_G2D
4618f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann        case CSC_HW_TYPE_G2D:
4628f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann        {
4638f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            g2d_data *g2d = (g2d_data *)csc_handle->csc_hw_handle;
4648f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann
4658f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            g2d->src.width = ALIGN(csc_handle->src_format.width,
4668f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann                    GSCALER_IMG_ALIGN);
4678f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            g2d->src.height = csc_handle->src_format.height;
4688f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            g2d->src.stride = g2d->src.width *
4698f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann                    hal_2_g2d_bpp(csc_handle->src_format.color_format) >> 3;
4708f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            g2d->src.order = hal_2_g2d_pixel_order(csc_handle->src_format.color_format);
4718f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            g2d->src.fmt = hal_2_g2d_color_format(csc_handle->src_format.color_format);
4728f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            g2d->src.rect.x1 = csc_handle->src_format.crop_left;
4738f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            g2d->src.rect.y1 = csc_handle->src_format.crop_top;
4748f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            g2d->src.rect.x2 = csc_handle->src_format.crop_left +
4758f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann                    csc_handle->src_format.crop_width;
4768f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            g2d->src.rect.y2 = csc_handle->src_format.crop_top +
4778f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann                    csc_handle->src_format.crop_height;
4788f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann
4798f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            g2d->dst.width = ALIGN(csc_handle->dst_format.width,
4808f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann                    GSCALER_IMG_ALIGN);
4818f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            g2d->dst.height = csc_handle->dst_format.height;
4828f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            g2d->dst.stride = g2d->dst.width *
4838f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann                    hal_2_g2d_bpp(csc_handle->dst_format.color_format) >> 3;
4848f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            g2d->dst.order = hal_2_g2d_pixel_order(csc_handle->dst_format.color_format);
4858f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            g2d->dst.fmt = hal_2_g2d_color_format(csc_handle->dst_format.color_format);
4868f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            g2d->dst.rect.x1 = csc_handle->dst_format.crop_left;
4878f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            g2d->dst.rect.y1 = csc_handle->dst_format.crop_top;
4888f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            g2d->dst.rect.x2 = csc_handle->dst_format.crop_left +
4898f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann                    csc_handle->dst_format.crop_width;
4908f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            g2d->dst.rect.y2 = csc_handle->dst_format.crop_top +
4918f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann                    csc_handle->dst_format.crop_height;
4928f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann
4938f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            break;
4948f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann        }
4958f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann#endif
4963b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang        default:
4973b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang            ALOGE("%s:: unsupported csc_hw_type", __func__);
4983b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang            break;
4993b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang        }
5003b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    }
5013b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang
5023b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    return ret;
5033b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang}
5043b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang
5053b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Changstatic CSC_ERRORCODE csc_set_buffer(
5063b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    void *handle)
5073b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang{
5083b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    CSC_HANDLE *csc_handle;
5093b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    CSC_ERRORCODE ret = CSC_ErrorNone;
5103b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang
5113b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    if (handle == NULL)
5123b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang        return CSC_ErrorNotInit;
5133b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang
5143b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    csc_handle = (CSC_HANDLE *)handle;
5153b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    if (csc_handle->csc_method == CSC_METHOD_HW) {
5163b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang        switch (csc_handle->csc_hw_type) {
5173b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang        case CSC_HW_TYPE_FIMC:
5183b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang            break;
5193b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang#ifdef ENABLE_GSCALER
5203b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang        case CSC_HW_TYPE_GSCALER:
5219f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby            exynos_gsc_set_src_addr(csc_handle->csc_hw_handle, csc_handle->src_buffer.planes, -1);
5229f6d828714b4b232205235a1c75f24ec23f8b888Benoit Goby            exynos_gsc_set_dst_addr(csc_handle->csc_hw_handle, csc_handle->dst_buffer.planes, -1);
5233b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang            break;
5243b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang#endif
5258f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann#ifdef ENABLE_G2D
5268f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann        case CSC_HW_TYPE_G2D:
5278f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann        {
5288f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            g2d_data *g2d = (g2d_data *)csc_handle->csc_hw_handle;
5298f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann
5308f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            g2d->src.addr.type = ADDR_DMA_BUF;
5318f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            g2d->src.addr.fd[0] = (int)csc_handle->src_buffer.planes[0];
5328f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            g2d->src.addr.fd[1] = (int)csc_handle->src_buffer.planes[1];
5338f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann
5348f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            g2d->dst.addr.type = ADDR_DMA_BUF;
5358f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            g2d->dst.addr.fd[0] = (int)csc_handle->dst_buffer.planes[0];
5368f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            g2d->dst.addr.fd[1] = (int)csc_handle->dst_buffer.planes[1];
5378f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann
5388f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            break;
5398f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann        }
5408f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann#endif
5413b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang        default:
5423b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang            ALOGE("%s:: unsupported csc_hw_type", __func__);
5433b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang            break;
5443b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang        }
5453b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    }
5463b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang
5473b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    return ret;
5483b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang}
5493b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang
5503b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Changvoid *csc_init(
5513b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    CSC_METHOD method)
5523b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang{
5533b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    CSC_HANDLE *csc_handle;
5543b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    csc_handle = (CSC_HANDLE *)malloc(sizeof(CSC_HANDLE));
5553b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    if (csc_handle == NULL)
5563b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang        return NULL;
5573b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang
5583b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    memset(csc_handle, 0, sizeof(CSC_HANDLE));
5593b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    csc_handle->hw_property.fixed_node = -1;
5603b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    csc_handle->hw_property.mode_drm = 0;
5613b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    csc_handle->csc_method = method;
56247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
56347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    return (void *)csc_handle;
56447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang}
56547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
56647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho ChangCSC_ERRORCODE csc_deinit(
56747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    void *handle)
56847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang{
56947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_ERRORCODE ret = CSC_ErrorNone;
57047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_HANDLE *csc_handle;
57147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
57247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    csc_handle = (CSC_HANDLE *)handle;
5734f74fdadbd9c8ac886935e144862cbe1e2cbf2e3Greg Hackmann    if (csc_handle->csc_hw_handle) {
57447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        switch (csc_handle->csc_hw_type) {
5753b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang#ifdef ENABLE_FIMC
57647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        case CSC_HW_TYPE_FIMC:
57747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            csc_hwconverter_close(csc_handle->csc_hw_handle);
57847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            break;
57947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang#endif
5803b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang#ifdef ENABLE_GSCALER
58147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        case CSC_HW_TYPE_GSCALER:
58247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            exynos_gsc_destroy(csc_handle->csc_hw_handle);
58347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            break;
58447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang#endif
5858f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann#ifdef ENABLE_G2D
5868f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann        case CSC_HW_TYPE_G2D:
5878f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann        {
5888f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            g2d_data *g2d = (g2d_data *)csc_handle->csc_hw_handle;
5898f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            close(g2d->fd);
5908f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            free(g2d);
5918f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann            break;
5928f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann        }
5938f10f92ba026b460bb068beaebe279fb3b31f854Greg Hackmann#endif
59447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        default:
595baa53d4c62b2c77d2dc058ade3ce8e7be5f6262dDima Zavin            ALOGE("%s:: unsupported csc_hw_type", __func__);
59647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang            break;
59747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        }
59847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    }
59947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
60047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    if (csc_handle != NULL) {
60147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        free(csc_handle);
60247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        ret = CSC_ErrorNone;
60347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    }
60447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
60547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    return ret;
60647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang}
60747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
60847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho ChangCSC_ERRORCODE csc_get_method(
60947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    void           *handle,
61047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_METHOD     *method)
61147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang{
61247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_HANDLE *csc_handle;
61347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_ERRORCODE ret = CSC_ErrorNone;
61447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
61547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    if (handle == NULL)
61647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        return CSC_ErrorNotInit;
61747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
61847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    csc_handle = (CSC_HANDLE *)handle;
61947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    *method = csc_handle->csc_method;
62047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
62147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    return ret;
62247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang}
62347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
6244f74fdadbd9c8ac886935e144862cbe1e2cbf2e3Greg HackmannCSC_ERRORCODE csc_set_method(
6254f74fdadbd9c8ac886935e144862cbe1e2cbf2e3Greg Hackmann    void           *handle,
6264f74fdadbd9c8ac886935e144862cbe1e2cbf2e3Greg Hackmann    CSC_METHOD     method)
6274f74fdadbd9c8ac886935e144862cbe1e2cbf2e3Greg Hackmann{
6284f74fdadbd9c8ac886935e144862cbe1e2cbf2e3Greg Hackmann    CSC_HANDLE *csc_handle;
6294f74fdadbd9c8ac886935e144862cbe1e2cbf2e3Greg Hackmann    CSC_ERRORCODE ret = CSC_ErrorNone;
6304f74fdadbd9c8ac886935e144862cbe1e2cbf2e3Greg Hackmann
6314f74fdadbd9c8ac886935e144862cbe1e2cbf2e3Greg Hackmann    if (handle == NULL)
6324f74fdadbd9c8ac886935e144862cbe1e2cbf2e3Greg Hackmann        return CSC_ErrorNotInit;
6334f74fdadbd9c8ac886935e144862cbe1e2cbf2e3Greg Hackmann
6344f74fdadbd9c8ac886935e144862cbe1e2cbf2e3Greg Hackmann    csc_handle = (CSC_HANDLE *)handle;
6354f74fdadbd9c8ac886935e144862cbe1e2cbf2e3Greg Hackmann    csc_handle->csc_method = method;
6364f74fdadbd9c8ac886935e144862cbe1e2cbf2e3Greg Hackmann
6374f74fdadbd9c8ac886935e144862cbe1e2cbf2e3Greg Hackmann    return ret;
6384f74fdadbd9c8ac886935e144862cbe1e2cbf2e3Greg Hackmann}
6394f74fdadbd9c8ac886935e144862cbe1e2cbf2e3Greg Hackmann
6403b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho ChangCSC_ERRORCODE csc_set_hw_property(
6413b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    void                *handle,
6423b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    CSC_HW_PROPERTY_TYPE property,
6433b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    int                  value)
6443b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang{
6453b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    CSC_HANDLE *csc_handle;
6463b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    CSC_ERRORCODE ret = CSC_ErrorNone;
6473b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang
6483b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    if (handle == NULL)
6493b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang        return CSC_ErrorNotInit;
6503b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang
6513b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    csc_handle = (CSC_HANDLE *)handle;
652c3fb36ed7a4d3d0a5a54f32b1113894651d3b9feGreg Hackmann
653c3fb36ed7a4d3d0a5a54f32b1113894651d3b9feGreg Hackmann    if (csc_handle->csc_hw_handle) {
654c3fb36ed7a4d3d0a5a54f32b1113894651d3b9feGreg Hackmann        ALOGE("%s:: cannot set hw property after hw is already initialized", __func__);
655c3fb36ed7a4d3d0a5a54f32b1113894651d3b9feGreg Hackmann        return CSC_ErrorUnsupportFormat;
656c3fb36ed7a4d3d0a5a54f32b1113894651d3b9feGreg Hackmann    }
657c3fb36ed7a4d3d0a5a54f32b1113894651d3b9feGreg Hackmann
6583b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    switch (property) {
6593b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    case CSC_HW_PROPERTY_FIXED_NODE:
6603b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang        csc_handle->hw_property.fixed_node = value;
6613b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang        break;
6623b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    case CSC_HW_PROPERTY_MODE_DRM:
6633b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang        csc_handle->hw_property.mode_drm = value;
6643b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang        break;
665c3fb36ed7a4d3d0a5a54f32b1113894651d3b9feGreg Hackmann    case CSC_HW_PROPERTY_HW_TYPE:
666c3fb36ed7a4d3d0a5a54f32b1113894651d3b9feGreg Hackmann        csc_handle->csc_hw_type = value;
667c3fb36ed7a4d3d0a5a54f32b1113894651d3b9feGreg Hackmann        break;
6683b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    default:
6693b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang        ALOGE("%s:: not supported hw property", __func__);
6703b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang        ret = CSC_ErrorUnsupportFormat;
6713b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    }
6723b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang
6733b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    return ret;
6743b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang}
6753b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang
67647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho ChangCSC_ERRORCODE csc_get_src_format(
67747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    void           *handle,
67847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int   *width,
67947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int   *height,
68047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int   *crop_left,
68147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int   *crop_top,
68247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int   *crop_width,
68347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int   *crop_height,
68447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int   *color_format,
68547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int   *cacheable)
68647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang{
68747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_HANDLE *csc_handle;
68847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_ERRORCODE ret = CSC_ErrorNone;
68947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
69047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    if (handle == NULL)
69147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        return CSC_ErrorNotInit;
69247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
69347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    csc_handle = (CSC_HANDLE *)handle;
69447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    *width = csc_handle->src_format.width;
69547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    *height = csc_handle->src_format.height;
69647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    *crop_left = csc_handle->src_format.crop_left;
69747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    *crop_top = csc_handle->src_format.crop_top;
69847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    *crop_width = csc_handle->src_format.crop_width;
69947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    *crop_height = csc_handle->src_format.crop_height;
70047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    *color_format = csc_handle->src_format.color_format;
70147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    *cacheable = csc_handle->src_format.cacheable;
70247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
70347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    return ret;
70447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang}
70547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
70647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho ChangCSC_ERRORCODE csc_set_src_format(
70747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    void           *handle,
70847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int    width,
70947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int    height,
71047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int    crop_left,
71147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int    crop_top,
71247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int    crop_width,
71347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int    crop_height,
71447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int    color_format,
71547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int    cacheable)
71647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang{
71747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_HANDLE *csc_handle;
71847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_ERRORCODE ret = CSC_ErrorNone;
71947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
72047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    if (handle == NULL)
72147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        return CSC_ErrorNotInit;
72247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
72347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    csc_handle = (CSC_HANDLE *)handle;
72447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    csc_handle->src_format.width = width;
72547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    csc_handle->src_format.height = height;
72647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    csc_handle->src_format.crop_left = crop_left;
72747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    csc_handle->src_format.crop_top = crop_top;
72847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    csc_handle->src_format.crop_width = crop_width;
72947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    csc_handle->src_format.crop_height = crop_height;
73047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    csc_handle->src_format.color_format = color_format;
73147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    csc_handle->src_format.cacheable = cacheable;
73247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
73347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    return ret;
73447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang}
73547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
73647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho ChangCSC_ERRORCODE csc_get_dst_format(
73747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    void           *handle,
73847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int   *width,
73947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int   *height,
74047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int   *crop_left,
74147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int   *crop_top,
74247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int   *crop_width,
74347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int   *crop_height,
74447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int   *color_format,
74547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int   *cacheable)
74647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang{
74747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_HANDLE *csc_handle;
74847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_ERRORCODE ret = CSC_ErrorNone;
74947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
75047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    if (handle == NULL)
75147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        return CSC_ErrorNotInit;
75247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
75347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    csc_handle = (CSC_HANDLE *)handle;
75447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    *width = csc_handle->dst_format.width;
75547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    *height = csc_handle->dst_format.height;
75647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    *crop_left = csc_handle->dst_format.crop_left;
75747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    *crop_top = csc_handle->dst_format.crop_top;
75847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    *crop_width = csc_handle->dst_format.crop_width;
75947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    *crop_height = csc_handle->dst_format.crop_height;
76047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    *color_format = csc_handle->dst_format.color_format;
76147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    *cacheable = csc_handle->dst_format.cacheable;
76247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
76347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    return ret;
76447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang}
76547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
76647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho ChangCSC_ERRORCODE csc_set_dst_format(
76747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    void           *handle,
76847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int    width,
76947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int    height,
77047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int    crop_left,
77147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int    crop_top,
77247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int    crop_width,
77347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int    crop_height,
77447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int    color_format,
77547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    unsigned int    cacheable)
77647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang{
77747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_HANDLE *csc_handle;
77847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_ERRORCODE ret = CSC_ErrorNone;
77947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
78047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    if (handle == NULL)
78147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        return CSC_ErrorNotInit;
78247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
78347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    csc_handle = (CSC_HANDLE *)handle;
78447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    csc_handle->dst_format.width = width;
78547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    csc_handle->dst_format.height = height;
78647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    csc_handle->dst_format.crop_left = crop_left;
78747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    csc_handle->dst_format.crop_top = crop_top;
78847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    csc_handle->dst_format.crop_width = crop_width;
78947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    csc_handle->dst_format.crop_height = crop_height;
79047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    csc_handle->dst_format.color_format = color_format;
79147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    csc_handle->dst_format.cacheable = cacheable;
79247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
79347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    return ret;
79447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang}
79547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
79647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho ChangCSC_ERRORCODE csc_set_src_buffer(
797f77a2a9dcd345a812c842087dfc2dd2687305fc2SeungBeom Kim    void *handle,
798f77a2a9dcd345a812c842087dfc2dd2687305fc2SeungBeom Kim    void *addr[3])
79947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang{
80047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_HANDLE *csc_handle;
80147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_ERRORCODE ret = CSC_ErrorNone;
80247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
80347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    if (handle == NULL)
80447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        return CSC_ErrorNotInit;
80547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
80647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    csc_handle = (CSC_HANDLE *)handle;
807f77a2a9dcd345a812c842087dfc2dd2687305fc2SeungBeom Kim    csc_handle->src_buffer.planes[CSC_Y_PLANE] = addr[0];
808f77a2a9dcd345a812c842087dfc2dd2687305fc2SeungBeom Kim    csc_handle->src_buffer.planes[CSC_U_PLANE] = addr[1];
809f77a2a9dcd345a812c842087dfc2dd2687305fc2SeungBeom Kim    csc_handle->src_buffer.planes[CSC_V_PLANE] = addr[2];
81047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
81147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    return ret;
81247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang}
81347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
81447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho ChangCSC_ERRORCODE csc_set_dst_buffer(
815f77a2a9dcd345a812c842087dfc2dd2687305fc2SeungBeom Kim    void *handle,
816f77a2a9dcd345a812c842087dfc2dd2687305fc2SeungBeom Kim    void *addr[3])
81747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang{
81847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_HANDLE *csc_handle;
81947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_ERRORCODE ret = CSC_ErrorNone;
82047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
82147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    if (handle == NULL)
82247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        return CSC_ErrorNotInit;
82347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
82447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    csc_handle = (CSC_HANDLE *)handle;
825f77a2a9dcd345a812c842087dfc2dd2687305fc2SeungBeom Kim    csc_handle->dst_buffer.planes[CSC_Y_PLANE] = addr[0];
826f77a2a9dcd345a812c842087dfc2dd2687305fc2SeungBeom Kim    csc_handle->dst_buffer.planes[CSC_U_PLANE] = addr[1];
827f77a2a9dcd345a812c842087dfc2dd2687305fc2SeungBeom Kim    csc_handle->dst_buffer.planes[CSC_V_PLANE] = addr[2];
82847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
82947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    return ret;
83047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang}
83147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
83247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho ChangCSC_ERRORCODE csc_convert(
83347bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    void *handle)
83447bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang{
83547bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_HANDLE *csc_handle = (CSC_HANDLE *)handle;
83647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    CSC_ERRORCODE ret = CSC_ErrorNone;
83747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
83847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    if (csc_handle == NULL)
83947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        return CSC_ErrorNotInit;
84047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
8413b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang    if ((csc_handle->csc_method == CSC_METHOD_HW) &&
8424328d3947562a17ab929b0ac2bfe67497f9e1d07Greg Hackmann        (csc_handle->csc_hw_handle == NULL)) {
8434328d3947562a17ab929b0ac2bfe67497f9e1d07Greg Hackmann        ret = csc_init_hw(handle);
8444328d3947562a17ab929b0ac2bfe67497f9e1d07Greg Hackmann        if (ret != CSC_ErrorNone)
8454328d3947562a17ab929b0ac2bfe67497f9e1d07Greg Hackmann            return ret;
8464328d3947562a17ab929b0ac2bfe67497f9e1d07Greg Hackmann    }
8474328d3947562a17ab929b0ac2bfe67497f9e1d07Greg Hackmann
8484328d3947562a17ab929b0ac2bfe67497f9e1d07Greg Hackmann    ret = csc_set_format(csc_handle);
8494328d3947562a17ab929b0ac2bfe67497f9e1d07Greg Hackmann    if (ret != CSC_ErrorNone)
8504328d3947562a17ab929b0ac2bfe67497f9e1d07Greg Hackmann        return ret;
8513b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang
8524328d3947562a17ab929b0ac2bfe67497f9e1d07Greg Hackmann    ret = csc_set_buffer(csc_handle);
8534328d3947562a17ab929b0ac2bfe67497f9e1d07Greg Hackmann    if (ret != CSC_ErrorNone)
8544328d3947562a17ab929b0ac2bfe67497f9e1d07Greg Hackmann        return ret;
8553b540849e185b82b8bc60b4b0d62d49d476a1cfdJiho Chang
85647bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    if (csc_handle->csc_method == CSC_METHOD_HW)
85747bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        ret = conv_hw(csc_handle);
85847bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    else
85947bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang        ret = conv_sw(csc_handle);
86047bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang
86147bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang    return ret;
86247bd95305f14b3b8e2a52fcf817f112b1e9bb92fJiho Chang}
863