161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan/*--------------------------------------------------------------------------
261a2c6a19dbd06a317a419623020e02056661876Praveen ChavanCopyright (c) 2012-2013, The Linux Foundation. All rights reserved.
361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
461a2c6a19dbd06a317a419623020e02056661876Praveen ChavanRedistribution and use in source and binary forms, with or without
561a2c6a19dbd06a317a419623020e02056661876Praveen Chavanmodification, are permitted provided that the following conditions are
661a2c6a19dbd06a317a419623020e02056661876Praveen Chavanmet:
761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    * Redistributions of source code must retain the above copyright
861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan      notice, this list of conditions and the following disclaimer.
961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    * Redistributions in binary form must reproduce the above
1061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan      copyright notice, this list of conditions and the following
1161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan      disclaimer in the documentation and/or other materials provided
1261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan      with the distribution.
1361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    * Neither the name of The Linux Foundation nor the names of its
1461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan      contributors may be used to endorse or promote products derived
1561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan      from this software without specific prior written permission.
1661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
1761a2c6a19dbd06a317a419623020e02056661876Praveen ChavanTHIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
1861a2c6a19dbd06a317a419623020e02056661876Praveen ChavanWARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
1961a2c6a19dbd06a317a419623020e02056661876Praveen ChavanMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
2061a2c6a19dbd06a317a419623020e02056661876Praveen ChavanARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
2161a2c6a19dbd06a317a419623020e02056661876Praveen ChavanBE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2261a2c6a19dbd06a317a419623020e02056661876Praveen ChavanCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2361a2c6a19dbd06a317a419623020e02056661876Praveen ChavanSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
2461a2c6a19dbd06a317a419623020e02056661876Praveen ChavanBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
2561a2c6a19dbd06a317a419623020e02056661876Praveen ChavanWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
2661a2c6a19dbd06a317a419623020e02056661876Praveen ChavanOR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
2761a2c6a19dbd06a317a419623020e02056661876Praveen ChavanIF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan--------------------------------------------------------------------------*/
2961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#include <utils/Log.h>
3061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#include <gralloc_priv.h>
3161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#include "vidc_color_converter.h"
3261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#undef DEBUG_PRINT_LOW
3361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#undef DEBUG_PRINT_HIGH
3461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#undef DEBUG_PRINT_ERROR
3561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
3661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#define DEBUG_PRINT_LOW ALOGV
3761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#define DEBUG_PRINT_HIGH ALOGE
3861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan#define DEBUG_PRINT_ERROR ALOGE
3961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
4061a2c6a19dbd06a317a419623020e02056661876Praveen Chavanomx_c2d_conv::omx_c2d_conv()
4161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
4261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    c2dcc = NULL;
4361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    mLibHandle = NULL;
4461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    mConvertOpen = NULL;
4561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    mConvertClose = NULL;
4661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    src_format = NV12_2K;
4761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
4861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
4961a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool omx_c2d_conv::init()
5061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
5161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = true;
5261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
5361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (mLibHandle || mConvertOpen || mConvertClose) {
5461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n omx_c2d_conv::init called twice");
5561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        status = false;
5661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
5761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
5861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (status) {
5961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        mLibHandle = dlopen("libc2dcolorconvert.so", RTLD_LAZY);
6061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
6161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (mLibHandle) {
6261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            mConvertOpen = (createC2DColorConverter_t *)
6361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                dlsym(mLibHandle,"createC2DColorConverter");
6461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            mConvertClose = (destroyC2DColorConverter_t *)
6561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                dlsym(mLibHandle,"destroyC2DColorConverter");
6661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
6761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            if (!mConvertOpen || !mConvertClose)
6861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                status = false;
6961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else
7061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = false;
7161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
7261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
7361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!status && mLibHandle) {
7461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dlclose(mLibHandle);
7561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        mLibHandle = NULL;
7661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        mConvertOpen = NULL;
7761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        mConvertClose = NULL;
7861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
7961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
8061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
8161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
8261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
8361a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool omx_c2d_conv::convert(int src_fd, void *src_base, void *src_viraddr,
8461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        int dest_fd, void *dest_base, void *dest_viraddr)
8561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
8661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int result;
8761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
8861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!src_viraddr || !dest_viraddr || !c2dcc || !dest_base || !src_base) {
8961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_ERROR("\n Invalid arguments omx_c2d_conv::convert");
9061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        return false;
9161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
9261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
9361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    result =  c2dcc->convertC2D(src_fd, src_base, src_viraddr,
9461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            dest_fd, dest_base, dest_viraddr);
9561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_LOW("\n Color convert status %d",result);
9661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ((result < 0)?false:true);
9761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
9861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
9961a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool omx_c2d_conv::open(unsigned int height,unsigned int width,
10061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ColorConvertFormat src, ColorConvertFormat dest)
10161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
10261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool status = false;
10361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
10461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (!c2dcc) {
10561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        c2dcc = mConvertOpen(width, height, width, height,
10661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan                src,dest,0,0);
10761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
10861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (c2dcc) {
10961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            src_format = src;
11061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            status = true;
11161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        } else
11261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            DEBUG_PRINT_ERROR("\n mConvertOpen failed");
11361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
11461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
11561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return status;
11661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
11761a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid omx_c2d_conv::close()
11861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
11961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (mLibHandle) {
12061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (mConvertClose && c2dcc)
12161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            mConvertClose(c2dcc);
12261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
12361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        c2dcc = NULL;
12461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
12561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
12661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
12761a2c6a19dbd06a317a419623020e02056661876Praveen Chavanvoid omx_c2d_conv::destroy()
12861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
12961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    DEBUG_PRINT_ERROR("\n Destroy C2D instance");
13061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
13161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (mLibHandle) {
13261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        if (mConvertClose && c2dcc)
13361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan            mConvertClose(c2dcc);
13461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
13561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        dlclose(mLibHandle);
13661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
13761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
13861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    c2dcc = NULL;
13961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    mLibHandle = NULL;
14061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    mConvertOpen = NULL;
14161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    mConvertClose = NULL;
14261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
14361a2c6a19dbd06a317a419623020e02056661876Praveen Chavanomx_c2d_conv::~omx_c2d_conv()
14461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
14561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    destroy();
14661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
14761a2c6a19dbd06a317a419623020e02056661876Praveen Chavanint omx_c2d_conv::get_src_format()
14861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
14961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int format = -1;
15061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
15161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (src_format == NV12_2K) {
15261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        format = HAL_PIXEL_FORMAT_NV12_ENCODEABLE;
15361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    } else if (src_format == RGBA8888) {
15461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        format = HAL_PIXEL_FORMAT_RGBA_8888;
15561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
15661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
15761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return format;
15861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
15961a2c6a19dbd06a317a419623020e02056661876Praveen Chavanbool omx_c2d_conv::get_buffer_size(int port,unsigned int &buf_size)
16061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan{
16161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    int cret = 0;
16261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    bool ret = false;
16361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    C2DBuffReq bufferreq;
16461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
16561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    if (c2dcc) {
16661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        bufferreq.size = 0;
16761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        cret = c2dcc->getBuffReq(port,&bufferreq);
16861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        DEBUG_PRINT_LOW("\n Status of getbuffer is %d", cret);
16961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        ret = (cret)?false:true;
17061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan        buf_size = bufferreq.size;
17161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    }
17261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan
17361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan    return ret;
17461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan}
175