111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*--------------------------------------------------------------------------
211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelCopyright (c) 2012-2013, The Linux Foundation. All rights reserved.
311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelRedistribution and use in source and binary forms, with or without
511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelmodification, are permitted provided that the following conditions are
611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelmet:
711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    * Redistributions of source code must retain the above copyright
811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      notice, this list of conditions and the following disclaimer.
911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    * Redistributions in binary form must reproduce the above
1011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      copyright notice, this list of conditions and the following
1111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      disclaimer in the documentation and/or other materials provided
1211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      with the distribution.
1311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    * Neither the name of The Linux Foundation nor the names of its
1411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      contributors may be used to endorse or promote products derived
1511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      from this software without specific prior written permission.
1611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelTHIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
1811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelWARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
1911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
2011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
2111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelBE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
2411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelBUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
2511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
2611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
2711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelIF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel--------------------------------------------------------------------------*/
2911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#define LOG_TAG "OMX_C2D"
3011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
3111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <utils/Log.h>
3211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <gralloc_priv.h>
3311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "vidc_color_converter.h"
3411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "vidc_debug.h"
3511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
3611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_c2d_conv::omx_c2d_conv()
3711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
3811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    c2dcc = NULL;
3911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    mLibHandle = NULL;
4011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    mConvertOpen = NULL;
4111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    mConvertClose = NULL;
4211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    src_format = NV12_2K;
4311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
4411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
4511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_c2d_conv::init()
4611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
4711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool status = true;
4811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
4911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (mLibHandle || mConvertOpen || mConvertClose) {
5011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("omx_c2d_conv::init called twice");
5111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        status = false;
5211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
5311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
5411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (status) {
5511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mLibHandle = dlopen("libc2dcolorconvert.so", RTLD_LAZY);
5611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
5711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (mLibHandle) {
5811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            mConvertOpen = (createC2DColorConverter_t *)
5911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                dlsym(mLibHandle,"createC2DColorConverter");
6011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            mConvertClose = (destroyC2DColorConverter_t *)
6111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                dlsym(mLibHandle,"destroyC2DColorConverter");
6211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
6311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            if (!mConvertOpen || !mConvertClose)
6411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                status = false;
6511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else
6611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            status = false;
6711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
6811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
6911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!status && mLibHandle) {
7011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dlclose(mLibHandle);
7111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mLibHandle = NULL;
7211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mConvertOpen = NULL;
7311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mConvertClose = NULL;
7411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
7511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
7611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return status;
7711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
7811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
7911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_c2d_conv::convert(int src_fd, void *src_base, void *src_viraddr,
8011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int dest_fd, void *dest_base, void *dest_viraddr)
8111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
8211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int result;
8311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
8411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!src_viraddr || !dest_viraddr || !c2dcc || !dest_base || !src_base) {
8511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_ERROR("Invalid arguments omx_c2d_conv::convert");
8611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return false;
8711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
8811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
8911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    result =  c2dcc->convertC2D(src_fd, src_base, src_viraddr,
9011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            dest_fd, dest_base, dest_viraddr);
9111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_LOW("Color convert status %d",result);
9211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return ((result < 0)?false:true);
9311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
9411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
9511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_c2d_conv::open(unsigned int height,unsigned int width,
9611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ColorConvertFormat src, ColorConvertFormat dest)
9711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
9811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool status = false;
9911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
10011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (!c2dcc) {
10111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        c2dcc = mConvertOpen(width, height, width, height,
10211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                src,dest,0,0);
10311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
10411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (c2dcc) {
10511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            src_format = src;
10611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            status = true;
10711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else
10811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            DEBUG_PRINT_ERROR("mConvertOpen failed");
10911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
11011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
11111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return status;
11211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
11311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_c2d_conv::close()
11411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
11511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (mLibHandle) {
11611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (mConvertClose && c2dcc)
11711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            mConvertClose(c2dcc);
11811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
11911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        c2dcc = NULL;
12011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
12111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
12211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
12311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelvoid omx_c2d_conv::destroy()
12411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
12511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    DEBUG_PRINT_HIGH("Destroy C2D instance");
12611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
12711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (mLibHandle) {
12811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (mConvertClose && c2dcc)
12911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            mConvertClose(c2dcc);
13011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
13111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dlclose(mLibHandle);
13211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
13311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
13411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    c2dcc = NULL;
13511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    mLibHandle = NULL;
13611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    mConvertOpen = NULL;
13711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    mConvertClose = NULL;
13811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
13911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelomx_c2d_conv::~omx_c2d_conv()
14011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
14111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    destroy();
14211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
14311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelint omx_c2d_conv::get_src_format()
14411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
14511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int format = -1;
14611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
14711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (src_format == NV12_2K) {
14811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        format = HAL_PIXEL_FORMAT_NV12_ENCODEABLE;
14911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    } else if (src_format == RGBA8888) {
15011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        format = HAL_PIXEL_FORMAT_RGBA_8888;
15111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
15211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
15311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return format;
15411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
15511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_c2d_conv::get_buffer_size(int port,unsigned int &buf_size)
15611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
15711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    int cret = 0;
15811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool ret = false;
15911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    C2DBuffReq bufferreq;
16011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
16111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (c2dcc) {
16211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        bufferreq.size = 0;
16311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        cret = c2dcc->getBuffReq(port,&bufferreq);
16411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Status of getbuffer is %d", cret);
16511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        ret = (cret)?false:true;
16611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        buf_size = bufferreq.size;
16711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
16811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
16911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return ret;
17011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
17111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
17211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelbool omx_c2d_conv::get_output_filled_length(unsigned int &filled_length)
17311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel{
17411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    bool ret = false;
17511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    C2DBuffReq req;
17611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    filled_length = 0;
17711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
17811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (c2dcc) {
17911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        int cret = c2dcc->getBuffReq(C2D_OUTPUT, &req);
18011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        DEBUG_PRINT_LOW("Status of getBuffReq is %d", cret);
18111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!cret && (req.bpp.denominator > 0)) {
18211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            filled_length = (req.stride * req.sliceHeight * req.bpp.numerator);
18311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            filled_length /= req.bpp.denominator;
18411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            ret = true;
18511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
18611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
18711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
18811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return ret;
18911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
190