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