16eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal/* Copyright (c) 2012 - 2013, The Linux Foundation. All rights reserved. 2c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George * 3c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George * redistribution and use in source and binary forms, with or without 4c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George * modification, are permitted provided that the following conditions are 5c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George * met: 6c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George * * redistributions of source code must retain the above copyright 7c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George * notice, this list of conditions and the following disclaimer. 8c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George * * redistributions in binary form must reproduce the above 9c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George * copyright notice, this list of conditions and the following 10c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George * disclaimer in the documentation and/or other materials provided 11c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George * with the distribution. 126eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal * * neither the name of The Linux Foundation nor the names of its 13c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George * contributors may be used to endorse or promote products derived 14c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George * from this software without specific prior written permission. 15c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George * 16c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George * this software is provided "as is" and any express or implied 17c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George * warranties, including, but not limited to, the implied warranties of 18c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George * merchantability, fitness for a particular purpose and non-infringement 19c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George * are disclaimed. in no event shall the copyright owner or contributors 20c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George * be liable for any direct, indirect, incidental, special, exemplary, or 21c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George * consequential damages (including, but not limited to, procurement of 22c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George * substitute goods or services; loss of use, data, or profits; or 23c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George * business interruption) however caused and on any theory of liability, 24c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George * whether in contract, strict liability, or tort (including negligence 25c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George * or otherwise) arising in any way out of the use of this software, even 26c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George * if advised of the possibility of such damage. 27c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George * 28c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George */ 29c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 30c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George#include <C2DColorConverter.h> 31c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George#include <stdlib.h> 32c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George#include <fcntl.h> 33c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George#include <linux/msm_kgsl.h> 34c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George#include <sys/ioctl.h> 35c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George#include <utils/Log.h> 36c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George#include <dlfcn.h> 37c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 38c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George#undef LOG_TAG 39c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George#define LOG_TAG "C2DColorConvert" 40c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George#define ALIGN( num, to ) (((num) + (to-1)) & (~(to-1))) 41c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George#define ALIGN8K 8192 42c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George#define ALIGN4K 4096 43c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George#define ALIGN2K 2048 44c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George#define ALIGN128 128 45c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George#define ALIGN32 32 46c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George#define ALIGN16 16 47c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 48c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George//----------------------------------------------------- 49c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew Georgenamespace android { 50c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 51c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew Georgeclass C2DColorConverter : public C2DColorConverterBase { 52c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 53c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew Georgepublic: 5461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan C2DColorConverter(size_t srcWidth, size_t srcHeight, size_t dstWidth, size_t dstHeight, ColorConvertFormat srcFormat, ColorConvertFormat dstFormat, int32_t flags,size_t srcStride); 55484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George int32_t getBuffReq(int32_t port, C2DBuffReq *req); 56484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George int32_t dumpOutput(char * filename, char mode); 57c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew Georgeprotected: 58c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George virtual ~C2DColorConverter(); 5961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan virtual int convertC2D(int srcFd, void *srcBase, void * srcData, int dstFd, void *dstBase, void * dstData); 60c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 61c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew Georgeprivate: 62a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan bool isYUVSurface(ColorConvertFormat format); 63a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan void *getDummySurfaceDef(ColorConvertFormat format, size_t width, size_t height, bool isSource); 64a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan C2D_STATUS updateYUVSurfaceDef(int fd, void *base, void * data, bool isSource); 65a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan C2D_STATUS updateRGBSurfaceDef(int fd, void * data, bool isSource); 66a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan uint32_t getC2DFormat(ColorConvertFormat format); 67a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan size_t calcStride(ColorConvertFormat format, size_t width); 68a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan size_t calcYSize(ColorConvertFormat format, size_t width, size_t height); 69a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan size_t calcSize(ColorConvertFormat format, size_t width, size_t height); 70a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan void *getMappedGPUAddr(int bufFD, void *bufPtr, size_t bufLen); 71a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan bool unmapGPUAddr(unsigned long gAddr); 72a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan size_t calcLumaAlign(ColorConvertFormat format); 73a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan size_t calcSizeAlign(ColorConvertFormat format); 74a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan C2DBytesPerPixel calcBytesPerPixel(ColorConvertFormat format); 75c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 76c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George void *mC2DLibHandle; 77c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George LINK_c2dCreateSurface mC2DCreateSurface; 78c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George LINK_c2dUpdateSurface mC2DUpdateSurface; 79c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George LINK_c2dReadSurface mC2DReadSurface; 80c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George LINK_c2dDraw mC2DDraw; 81c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George LINK_c2dFlush mC2DFlush; 82c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George LINK_c2dFinish mC2DFinish; 83c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George LINK_c2dWaitTimestamp mC2DWaitTimestamp; 84c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George LINK_c2dDestroySurface mC2DDestroySurface; 8561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan LINK_c2dMapAddr mC2DMapAddr; 8661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan LINK_c2dUnMapAddr mC2DUnMapAddr; 87c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 88c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George uint32_t mSrcSurface, mDstSurface; 89c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George void * mSrcSurfaceDef; 90c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George void * mDstSurfaceDef; 91c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 92c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George C2D_OBJECT mBlit; 93c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George size_t mSrcWidth; 94c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George size_t mSrcHeight; 9561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan size_t mSrcStride; 96c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George size_t mDstWidth; 97c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George size_t mDstHeight; 98c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George size_t mSrcSize; 99c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George size_t mDstSize; 100c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George size_t mSrcYSize; 101c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George size_t mDstYSize; 102c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George enum ColorConvertFormat mSrcFormat; 103c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George enum ColorConvertFormat mDstFormat; 104c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George int32_t mFlags; 105c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 106c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George int mError; 107c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George}; 108c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 10961a2c6a19dbd06a317a419623020e02056661876Praveen ChavanC2DColorConverter::C2DColorConverter(size_t srcWidth, size_t srcHeight, size_t dstWidth, size_t dstHeight, ColorConvertFormat srcFormat, ColorConvertFormat dstFormat, int32_t flags, size_t srcStride) 110c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George{ 111c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mError = 0; 112c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mC2DLibHandle = dlopen("libC2D2.so", RTLD_NOW); 113c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George if (!mC2DLibHandle) { 114c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George ALOGE("FATAL ERROR: could not dlopen libc2d2.so: %s", dlerror()); 115c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mError = -1; 116c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George return; 117c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George } 118c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mC2DCreateSurface = (LINK_c2dCreateSurface)dlsym(mC2DLibHandle, "c2dCreateSurface"); 119c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mC2DUpdateSurface = (LINK_c2dUpdateSurface)dlsym(mC2DLibHandle, "c2dUpdateSurface"); 120c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mC2DReadSurface = (LINK_c2dReadSurface)dlsym(mC2DLibHandle, "c2dReadSurface"); 121c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mC2DDraw = (LINK_c2dDraw)dlsym(mC2DLibHandle, "c2dDraw"); 122c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mC2DFlush = (LINK_c2dFlush)dlsym(mC2DLibHandle, "c2dFlush"); 123c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mC2DFinish = (LINK_c2dFinish)dlsym(mC2DLibHandle, "c2dFinish"); 124c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mC2DWaitTimestamp = (LINK_c2dWaitTimestamp)dlsym(mC2DLibHandle, "c2dWaitTimestamp"); 125c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mC2DDestroySurface = (LINK_c2dDestroySurface)dlsym(mC2DLibHandle, "c2dDestroySurface"); 12661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan mC2DMapAddr = (LINK_c2dMapAddr)dlsym(mC2DLibHandle, "c2dMapAddr"); 12761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan mC2DUnMapAddr = (LINK_c2dUnMapAddr)dlsym(mC2DLibHandle, "c2dUnMapAddr"); 128c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 129c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George if (!mC2DCreateSurface || !mC2DUpdateSurface || !mC2DReadSurface 130c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George || !mC2DDraw || !mC2DFlush || !mC2DFinish || !mC2DWaitTimestamp 13161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan || !mC2DDestroySurface || !mC2DMapAddr || !mC2DUnMapAddr) { 132c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George ALOGE("%s: dlsym ERROR", __FUNCTION__); 133c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mError = -1; 134c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George return; 135c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George } 136c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 137c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mSrcWidth = srcWidth; 138c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mSrcHeight = srcHeight; 13961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan mSrcStride = srcStride;; 140c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mDstWidth = dstWidth; 141c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mDstHeight = dstHeight; 142c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mSrcFormat = srcFormat; 143c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mDstFormat = dstFormat; 144c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mSrcSize = calcSize(srcFormat, srcWidth, srcHeight); 145c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mDstSize = calcSize(dstFormat, dstWidth, dstHeight); 146c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mSrcYSize = calcYSize(srcFormat, srcWidth, srcHeight); 147c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mDstYSize = calcYSize(dstFormat, dstWidth, dstHeight); 148c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 149c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mFlags = flags; // can be used for rotation 150c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 151c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mSrcSurfaceDef = getDummySurfaceDef(srcFormat, srcWidth, srcHeight, true); 152c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mDstSurfaceDef = getDummySurfaceDef(dstFormat, dstWidth, dstHeight, false); 153c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 154c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George memset((void*)&mBlit,0,sizeof(C2D_OBJECT)); 155c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mBlit.source_rect.x = 0 << 16; 156c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mBlit.source_rect.y = 0 << 16; 157c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mBlit.source_rect.width = srcWidth << 16; 158c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mBlit.source_rect.height = srcHeight << 16; 159c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mBlit.target_rect.x = 0 << 16; 160c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mBlit.target_rect.y = 0 << 16; 161c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mBlit.target_rect.width = dstWidth << 16; 162c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mBlit.target_rect.height = dstHeight << 16; 163c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mBlit.config_mask = C2D_ALPHA_BLEND_NONE | C2D_NO_BILINEAR_BIT | C2D_NO_ANTIALIASING_BIT | C2D_TARGET_RECT_BIT; 164c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mBlit.surface_id = mSrcSurface; 165c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George} 166c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 167c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew GeorgeC2DColorConverter::~C2DColorConverter() 168c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George{ 169c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George if (mError) { 170c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George if (mC2DLibHandle) { 171c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George dlclose(mC2DLibHandle); 172c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George } 173c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George return; 174c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George } 175c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 176c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mC2DDestroySurface(mDstSurface); 177c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mC2DDestroySurface(mSrcSurface); 178e5957fde919e5e4f5921d3f8224981a4607d8fb1Praveen Chavan 179e5957fde919e5e4f5921d3f8224981a4607d8fb1Praveen Chavan if (mSrcSurfaceDef) { 180e5957fde919e5e4f5921d3f8224981a4607d8fb1Praveen Chavan free(mSrcSurfaceDef); 181c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George } 182c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 183e5957fde919e5e4f5921d3f8224981a4607d8fb1Praveen Chavan if (mDstSurfaceDef) { 184e5957fde919e5e4f5921d3f8224981a4607d8fb1Praveen Chavan free(mDstSurfaceDef); 185c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George } 186c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 187c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George dlclose(mC2DLibHandle); 188c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George} 189c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 19061a2c6a19dbd06a317a419623020e02056661876Praveen Chavanint C2DColorConverter::convertC2D(int srcFd, void *srcBase, void * srcData, int dstFd, void *dstBase, void * dstData) 191c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George{ 192c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George C2D_STATUS ret; 193c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 194c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George if (mError) { 195c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George ALOGE("C2D library initialization failed\n"); 196c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George return mError; 197c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George } 198c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 199c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George if ((srcFd < 0) || (dstFd < 0) || (srcData == NULL) || (dstData == NULL)) { 200c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George ALOGE("Incorrect input parameters\n"); 201c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George return -1; 202c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George } 203c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 204c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George if (isYUVSurface(mSrcFormat)) { 20561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = updateYUVSurfaceDef(srcFd, srcBase, srcData, true); 206c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George } else { 207c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George ret = updateRGBSurfaceDef(srcFd, srcData, true); 208c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George } 209c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 210c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George if (ret != C2D_STATUS_OK) { 211c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George ALOGE("Update src surface def failed\n"); 212c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George return -ret; 213c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George } 214c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 215c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George if (isYUVSurface(mDstFormat)) { 21661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ret = updateYUVSurfaceDef(dstFd, dstBase, dstData, false); 217c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George } else { 218c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George ret = updateRGBSurfaceDef(dstFd, dstData, false); 219c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George } 220c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 221c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George if (ret != C2D_STATUS_OK) { 222c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George ALOGE("Update dst surface def failed\n"); 223c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George return -ret; 224c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George } 225c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 226c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mBlit.surface_id = mSrcSurface; 227c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George ret = mC2DDraw(mDstSurface, C2D_TARGET_ROTATE_0, 0, 0, 0, &mBlit, 1); 228c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mC2DFinish(mDstSurface); 229c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 230c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George bool unmappedSrcSuccess; 231c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George if (isYUVSurface(mSrcFormat)) { 2328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan unmappedSrcSuccess = unmapGPUAddr((unsigned long)((C2D_YUV_SURFACE_DEF *)mSrcSurfaceDef)->phys0); 233c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George } else { 2348767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan unmappedSrcSuccess = unmapGPUAddr((unsigned long)((C2D_RGB_SURFACE_DEF *)mSrcSurfaceDef)->phys); 235c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George } 236c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 237c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George bool unmappedDstSuccess; 238c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George if (isYUVSurface(mDstFormat)) { 2398767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan unmappedDstSuccess = unmapGPUAddr((unsigned long)((C2D_YUV_SURFACE_DEF *)mDstSurfaceDef)->phys0); 240c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George } else { 2418767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan unmappedDstSuccess = unmapGPUAddr((unsigned long)((C2D_RGB_SURFACE_DEF *)mDstSurfaceDef)->phys); 242c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George } 243c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 244c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George if (ret != C2D_STATUS_OK) { 245c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George ALOGE("C2D Draw failed\n"); 246c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George return -ret; //c2d err values are positive 247c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George } else { 248c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George if (!unmappedSrcSuccess || !unmappedDstSuccess) { 249c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George ALOGE("unmapping GPU address failed\n"); 250c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George return -1; 251c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George } 252c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George return ret; 253c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George } 254c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George} 255c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 256c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew Georgebool C2DColorConverter::isYUVSurface(ColorConvertFormat format) 257c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George{ 258c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George switch (format) { 25919afafb391255a960f9da204ea55b7d628688946Haynes Mathew George case YCbCr420Tile: 260c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George case YCbCr420SP: 261c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George case YCbCr420P: 262c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George case YCrCb420P: 263484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George case NV12_2K: 2646eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal case NV12_128m: 265c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George return true; 266c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George case RGB565: 267c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George case RGBA8888: 268c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George default: 269c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George return false; 270c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George } 271c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George} 272c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 273c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew Georgevoid* C2DColorConverter::getDummySurfaceDef(ColorConvertFormat format, size_t width, size_t height, bool isSource) 274c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George{ 275c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George if (isYUVSurface(format)) { 276e5957fde919e5e4f5921d3f8224981a4607d8fb1Praveen Chavan C2D_YUV_SURFACE_DEF * surfaceDef = (C2D_YUV_SURFACE_DEF *)malloc(sizeof(C2D_YUV_SURFACE_DEF)); 277e5957fde919e5e4f5921d3f8224981a4607d8fb1Praveen Chavan memset(surfaceDef, 0x0, sizeof(C2D_YUV_SURFACE_DEF)); 278c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George surfaceDef->format = getC2DFormat(format); 279c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George surfaceDef->width = width; 280c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George surfaceDef->height = height; 281c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George surfaceDef->plane0 = (void *)0xaaaaaaaa; 282c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George surfaceDef->phys0 = (void *)0xaaaaaaaa; 283c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George surfaceDef->stride0 = calcStride(format, width); 284c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George surfaceDef->plane1 = (void *)0xaaaaaaaa; 285c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George surfaceDef->phys1 = (void *)0xaaaaaaaa; 286c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George surfaceDef->stride1 = calcStride(format, width); 287a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George 288a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George if (format == YCbCr420P || 289a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George format == YCrCb420P) { 290a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George printf("half stride for Cb Cr planes \n"); 291a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George surfaceDef->stride1 = calcStride(format, width) / 2; 292a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George surfaceDef->phys2 = (void *)0xaaaaaaaa; 293a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George surfaceDef->stride2 = calcStride(format, width) / 2; 294a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George } 295c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mC2DCreateSurface(isSource ? &mSrcSurface : &mDstSurface, isSource ? C2D_SOURCE : C2D_TARGET, 296c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George (C2D_SURFACE_TYPE)(C2D_SURFACE_YUV_HOST | C2D_SURFACE_WITH_PHYS | C2D_SURFACE_WITH_PHYS_DUMMY), 297c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George &(*surfaceDef)); 298c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George return ((void *)surfaceDef); 299c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George } else { 300e5957fde919e5e4f5921d3f8224981a4607d8fb1Praveen Chavan C2D_RGB_SURFACE_DEF * surfaceDef = (C2D_RGB_SURFACE_DEF *)malloc(sizeof(C2D_RGB_SURFACE_DEF)); 301e5957fde919e5e4f5921d3f8224981a4607d8fb1Praveen Chavan memset(surfaceDef, 0x0, sizeof(C2D_RGB_SURFACE_DEF)); 302c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George surfaceDef->format = getC2DFormat(format); 303c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George surfaceDef->width = width; 304c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George surfaceDef->height = height; 305c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George surfaceDef->buffer = (void *)0xaaaaaaaa; 306c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George surfaceDef->phys = (void *)0xaaaaaaaa; 307c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George surfaceDef->stride = calcStride(format, width); 308c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George mC2DCreateSurface(isSource ? &mSrcSurface : &mDstSurface, isSource ? C2D_SOURCE : C2D_TARGET, 309c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George (C2D_SURFACE_TYPE)(C2D_SURFACE_RGB_HOST | C2D_SURFACE_WITH_PHYS | C2D_SURFACE_WITH_PHYS_DUMMY), 310c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George &(*surfaceDef)); 311c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George return ((void *)surfaceDef); 312c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George } 313c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George} 314c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 31561a2c6a19dbd06a317a419623020e02056661876Praveen ChavanC2D_STATUS C2DColorConverter::updateYUVSurfaceDef(int fd, void *base, void *data, bool isSource) 316c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George{ 317c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George if (isSource) { 318c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George C2D_YUV_SURFACE_DEF * srcSurfaceDef = (C2D_YUV_SURFACE_DEF *)mSrcSurfaceDef; 319c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George srcSurfaceDef->plane0 = data; 3208767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan srcSurfaceDef->phys0 = (uint8_t *)getMappedGPUAddr(fd, data, mSrcSize) + ((uint8_t *)data - (uint8_t *)base); 321c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George srcSurfaceDef->plane1 = (uint8_t *)data + mSrcYSize; 322c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George srcSurfaceDef->phys1 = (uint8_t *)srcSurfaceDef->phys0 + mSrcYSize; 323a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George srcSurfaceDef->plane2 = (uint8_t *)srcSurfaceDef->plane1 + mSrcYSize/4; 324a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George srcSurfaceDef->phys2 = (uint8_t *)srcSurfaceDef->phys1 + mSrcYSize/4; 325a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George 326c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George return mC2DUpdateSurface(mSrcSurface, C2D_SOURCE, 327c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George (C2D_SURFACE_TYPE)(C2D_SURFACE_YUV_HOST | C2D_SURFACE_WITH_PHYS), 328c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George &(*srcSurfaceDef)); 329c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George } else { 330c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George C2D_YUV_SURFACE_DEF * dstSurfaceDef = (C2D_YUV_SURFACE_DEF *)mDstSurfaceDef; 331c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George dstSurfaceDef->plane0 = data; 3328767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan dstSurfaceDef->phys0 = (uint8_t *)getMappedGPUAddr(fd, data, mDstSize) + ((uint8_t *)data - (uint8_t *)base); 333c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George dstSurfaceDef->plane1 = (uint8_t *)data + mDstYSize; 334c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George dstSurfaceDef->phys1 = (uint8_t *)dstSurfaceDef->phys0 + mDstYSize; 335a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George dstSurfaceDef->plane2 = (uint8_t *)dstSurfaceDef->plane1 + mDstYSize/4; 336a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George dstSurfaceDef->phys2 = (uint8_t *)dstSurfaceDef->phys1 + mDstYSize/4; 337a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George 338c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George return mC2DUpdateSurface(mDstSurface, C2D_TARGET, 339c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George (C2D_SURFACE_TYPE)(C2D_SURFACE_YUV_HOST | C2D_SURFACE_WITH_PHYS), 340c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George &(*dstSurfaceDef)); 341c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George } 342c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George} 343c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 344c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew GeorgeC2D_STATUS C2DColorConverter::updateRGBSurfaceDef(int fd, void * data, bool isSource) 345c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George{ 346c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George if (isSource) { 347c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George C2D_RGB_SURFACE_DEF * srcSurfaceDef = (C2D_RGB_SURFACE_DEF *)mSrcSurfaceDef; 348c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George srcSurfaceDef->buffer = data; 349c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George srcSurfaceDef->phys = getMappedGPUAddr(fd, data, mSrcSize); 350c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George return mC2DUpdateSurface(mSrcSurface, C2D_SOURCE, 351c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George (C2D_SURFACE_TYPE)(C2D_SURFACE_RGB_HOST | C2D_SURFACE_WITH_PHYS), 352c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George &(*srcSurfaceDef)); 353c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George } else { 354c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George C2D_RGB_SURFACE_DEF * dstSurfaceDef = (C2D_RGB_SURFACE_DEF *)mDstSurfaceDef; 355c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George dstSurfaceDef->buffer = data; 356484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George ALOGV("dstSurfaceDef->buffer = %p\n", data); 357c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George dstSurfaceDef->phys = getMappedGPUAddr(fd, data, mDstSize); 358c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George return mC2DUpdateSurface(mDstSurface, C2D_TARGET, 359c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George (C2D_SURFACE_TYPE)(C2D_SURFACE_RGB_HOST | C2D_SURFACE_WITH_PHYS), 360c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George &(*dstSurfaceDef)); 361c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George } 362c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George} 363c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 364c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew Georgeuint32_t C2DColorConverter::getC2DFormat(ColorConvertFormat format) 365c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George{ 366c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George switch (format) { 367c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George case RGB565: 368c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George return C2D_COLOR_FORMAT_565_RGB; 369c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George case RGBA8888: 37090c7926e64742b91ea81ad70b1572ef721ddf4ccPraveen Chavan return C2D_COLOR_FORMAT_8888_RGBA | C2D_FORMAT_SWAP_ENDIANNESS | C2D_FORMAT_PREMULTIPLIED; 37119afafb391255a960f9da204ea55b7d628688946Haynes Mathew George case YCbCr420Tile: 37219afafb391255a960f9da204ea55b7d628688946Haynes Mathew George return (C2D_COLOR_FORMAT_420_NV12 | C2D_FORMAT_MACROTILED); 373c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George case YCbCr420SP: 374484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George case NV12_2K: 3756eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal case NV12_128m: 376c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George return C2D_COLOR_FORMAT_420_NV12; 377c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George case YCbCr420P: 378c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George return C2D_COLOR_FORMAT_420_I420; 379c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George case YCrCb420P: 380c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George return C2D_COLOR_FORMAT_420_YV12; 381c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George default: 382c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George ALOGE("Format not supported , %d\n", format); 383c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George return -1; 384c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George } 385c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George} 386c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 387c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew Georgesize_t C2DColorConverter::calcStride(ColorConvertFormat format, size_t width) 388c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George{ 389c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George switch (format) { 390c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George case RGB565: 391c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George return ALIGN(width, ALIGN32) * 2; // RGB565 has width as twice 392c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George case RGBA8888: 39361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (mSrcStride) 39461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return mSrcStride * 4; 39561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 39661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return ALIGN(width, ALIGN32) * 4; 39719afafb391255a960f9da204ea55b7d628688946Haynes Mathew George case YCbCr420Tile: 39819afafb391255a960f9da204ea55b7d628688946Haynes Mathew George return ALIGN(width, ALIGN128); 399c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George case YCbCr420SP: 4008767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan return ALIGN(width, ALIGN16); 4012a914b33529b826083ff39ec764426680367b157Haynes Mathew George case NV12_2K: 4022a914b33529b826083ff39ec764426680367b157Haynes Mathew George return ALIGN(width, ALIGN16); 4036eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal case NV12_128m: 4046eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return ALIGN(width, ALIGN128); 405c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George case YCbCr420P: 406c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George return width; 407c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George case YCrCb420P: 408c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George return ALIGN(width, ALIGN16); 409c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George default: 410c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George return 0; 411c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George } 412c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George} 413c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 414c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew Georgesize_t C2DColorConverter::calcYSize(ColorConvertFormat format, size_t width, size_t height) 415c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George{ 416c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George switch (format) { 417c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George case YCbCr420SP: 4188767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan return (ALIGN(width, ALIGN16) * height); 419c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George case YCbCr420P: 420c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George return width * height; 421c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George case YCrCb420P: 422c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George return ALIGN(width, ALIGN16) * height; 42319afafb391255a960f9da204ea55b7d628688946Haynes Mathew George case YCbCr420Tile: 42419afafb391255a960f9da204ea55b7d628688946Haynes Mathew George return ALIGN(ALIGN(width, ALIGN128) * ALIGN(height, ALIGN32), ALIGN8K); 4252a914b33529b826083ff39ec764426680367b157Haynes Mathew George case NV12_2K: { 4262a914b33529b826083ff39ec764426680367b157Haynes Mathew George size_t alignedw = ALIGN(width, ALIGN16); 4272a914b33529b826083ff39ec764426680367b157Haynes Mathew George size_t lumaSize = ALIGN(alignedw * height, ALIGN2K); 4282a914b33529b826083ff39ec764426680367b157Haynes Mathew George return lumaSize; 4292a914b33529b826083ff39ec764426680367b157Haynes Mathew George } 4306eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal case NV12_128m: 4316eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return ALIGN(width, ALIGN128) * ALIGN(height, ALIGN32); 432c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George default: 433c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George return 0; 434c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George } 435c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George} 436c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 437c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew Georgesize_t C2DColorConverter::calcSize(ColorConvertFormat format, size_t width, size_t height) 438c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George{ 439c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George int32_t alignedw = 0; 440c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George int32_t alignedh = 0; 441c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George int32_t size = 0; 442c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 443c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George switch (format) { 444c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George case RGB565: 445c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George size = ALIGN(width, ALIGN32) * ALIGN(height, ALIGN32) * 2; 446484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George size = ALIGN(size, ALIGN4K); 447c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George break; 448c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George case RGBA8888: 44961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (mSrcStride) 45061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan size = mSrcStride * ALIGN(height, ALIGN32) * 4; 45161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan else 45261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan size = ALIGN(width, ALIGN32) * ALIGN(height, ALIGN32) * 4; 453484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George size = ALIGN(size, ALIGN4K); 454c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George break; 455c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George case YCbCr420SP: 4568767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan alignedw = ALIGN(width, ALIGN16); 457c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George size = ALIGN((alignedw * height) + (ALIGN(width/2, ALIGN32) * (height/2) * 2), ALIGN4K); 458c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George break; 459c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George case YCbCr420P: 460c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George size = ALIGN((width * height * 3 / 2), ALIGN4K); 461c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George break; 462c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George case YCrCb420P: 463c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George alignedw = ALIGN(width, ALIGN16); 464c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George size = ALIGN((alignedw * height) + (ALIGN(width/2, ALIGN16) * (height/2) * 2), ALIGN4K); 465c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George break; 46619afafb391255a960f9da204ea55b7d628688946Haynes Mathew George case YCbCr420Tile: 46719afafb391255a960f9da204ea55b7d628688946Haynes Mathew George alignedw = ALIGN(width, ALIGN128); 46819afafb391255a960f9da204ea55b7d628688946Haynes Mathew George alignedh = ALIGN(height, ALIGN32); 46919afafb391255a960f9da204ea55b7d628688946Haynes Mathew George size = ALIGN(alignedw * alignedh, ALIGN8K) + ALIGN(alignedw * ALIGN(height/2, ALIGN32), ALIGN8K); 47019afafb391255a960f9da204ea55b7d628688946Haynes Mathew George break; 471484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George case NV12_2K: { 4722a914b33529b826083ff39ec764426680367b157Haynes Mathew George alignedw = ALIGN(width, ALIGN16); 473484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George size_t lumaSize = ALIGN(alignedw * height, ALIGN2K); 4742a914b33529b826083ff39ec764426680367b157Haynes Mathew George size_t chromaSize = ALIGN((alignedw * height)/2, ALIGN2K); 4752a914b33529b826083ff39ec764426680367b157Haynes Mathew George size = ALIGN(lumaSize + chromaSize, ALIGN4K); 4762a914b33529b826083ff39ec764426680367b157Haynes Mathew George ALOGV("NV12_2k, width = %d, height = %d, size = %d", width, height, size); 477484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George } 478484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George break; 4796eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal case NV12_128m: 4806eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal alignedw = ALIGN(width, ALIGN128); 4816eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal alignedh = ALIGN(height, ALIGN32); 4826eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal size = ALIGN(alignedw * alignedh + (alignedw * ALIGN(height/2, ALIGN16)), ALIGN4K); 4836eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal break; 484c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George default: 485c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George break; 486c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George } 487c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George return size; 488c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George} 489c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George/* 490c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George * Tells GPU to map given buffer and returns a physical address of mapped buffer 491c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George */ 492c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew Georgevoid * C2DColorConverter::getMappedGPUAddr(int bufFD, void *bufPtr, size_t bufLen) 493c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George{ 49461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan C2D_STATUS status; 49561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan void *gpuaddr = NULL; 49661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 49761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status = mC2DMapAddr(bufFD, bufPtr, bufLen, 0, KGSL_USER_MEM_TYPE_ION, 49861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan &gpuaddr); 49961a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (status != C2D_STATUS_OK) { 50061a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ALOGE("c2dMapAddr failed: status %d fd %d ptr %p len %d flags %d\n", 50161a2c6a19dbd06a317a419623020e02056661876Praveen Chavan status, bufFD, bufPtr, bufLen, KGSL_USER_MEM_TYPE_ION); 50261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return NULL; 503c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George } 50461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan ALOGV("c2d mapping created: gpuaddr %p fd %d ptr %p len %d\n", 50561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan gpuaddr, bufFD, bufPtr, bufLen); 50661a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 50761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return gpuaddr; 508c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George} 509c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 5108767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavanbool C2DColorConverter::unmapGPUAddr(unsigned long gAddr) 511c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George{ 51261a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 51361a2c6a19dbd06a317a419623020e02056661876Praveen Chavan C2D_STATUS status = mC2DUnMapAddr((void*)gAddr); 51461a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 51561a2c6a19dbd06a317a419623020e02056661876Praveen Chavan if (status != C2D_STATUS_OK) 5168767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan ALOGE("c2dUnMapAddr failed: status %d gpuaddr %08lx\n", status, gAddr); 51761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan 51861a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return (status == C2D_STATUS_OK); 519c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George} 520c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 521484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew Georgeint32_t C2DColorConverter::getBuffReq(int32_t port, C2DBuffReq *req) { 522484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George if (!req) return -1; 523484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George 524484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George if (port != C2D_INPUT && port != C2D_OUTPUT) return -1; 525484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George 526484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George memset(req, 0, sizeof(C2DBuffReq)); 527484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George if (port == C2D_INPUT) { 528484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George req->width = mSrcWidth; 529484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George req->height = mSrcHeight; 530484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George req->stride = calcStride(mSrcFormat, mSrcWidth); 531484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George req->sliceHeight = mSrcHeight; 532484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George req->lumaAlign = calcLumaAlign(mSrcFormat); 533484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George req->sizeAlign = calcSizeAlign(mSrcFormat); 534484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George req->size = calcSize(mSrcFormat, mSrcWidth, mSrcHeight); 535a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan req->bpp = calcBytesPerPixel(mSrcFormat); 5362d1936c1b3a89f95bc155d306a76a3384797da00Haynes Mathew George ALOGV("input req->size = %d\n", req->size); 537484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George } else if (port == C2D_OUTPUT) { 538484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George req->width = mDstWidth; 539484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George req->height = mDstHeight; 540484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George req->stride = calcStride(mDstFormat, mDstWidth); 541484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George req->sliceHeight = mDstHeight; 542484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George req->lumaAlign = calcLumaAlign(mDstFormat); 543484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George req->sizeAlign = calcSizeAlign(mDstFormat); 544484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George req->size = calcSize(mDstFormat, mDstWidth, mDstHeight); 545a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan req->bpp = calcBytesPerPixel(mDstFormat); 5462d1936c1b3a89f95bc155d306a76a3384797da00Haynes Mathew George ALOGV("output req->size = %d\n", req->size); 547484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George } 548484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George return 0; 549484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George} 550484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George 551484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew Georgesize_t C2DColorConverter::calcLumaAlign(ColorConvertFormat format) { 552484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George if (!isYUVSurface(format)) return 1; //no requirement 553484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George 554484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George switch (format) { 555484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George case NV12_2K: 556484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George return ALIGN2K; 5576eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal case NV12_128m: 5588767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case YCbCr420SP: //OR NV12 5598767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan case YCbCr420P: 5606eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal return 1; 561484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George default: 562484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George ALOGE("unknown format passed for luma alignment number"); 563484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George return 1; 564484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George } 565484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George} 566484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George 567484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew Georgesize_t C2DColorConverter::calcSizeAlign(ColorConvertFormat format) { 568484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George if (!isYUVSurface(format)) return 1; //no requirement 569484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George 570484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George switch (format) { 571484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George case YCbCr420SP: //OR NV12 572484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George case YCbCr420P: 573484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George case NV12_2K: 5746eec4d1ea65df853450a6e158718981cba900bf6Shashank Mittal case NV12_128m: 575484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George return ALIGN4K; 576484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George default: 577484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George ALOGE("unknown format passed for size alignment number"); 578484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George return 1; 579484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George } 580484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George} 581484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George 582a19e2b5f4746d249b2910e577792336739cd5672Praveen ChavanC2DBytesPerPixel C2DColorConverter::calcBytesPerPixel(ColorConvertFormat format) { 583a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan C2DBytesPerPixel bpp; 584a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan bpp.numerator = 0; 585a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan bpp.denominator = 1; 586a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan 587a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan switch (format) { 588a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan case RGB565: 589a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan bpp.numerator = 2; 590a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan break; 591a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan case RGBA8888: 592a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan bpp.numerator = 4; 593a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan break; 594a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan case YCbCr420SP: 595a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan case YCbCr420P: 596a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan case YCrCb420P: 597a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan case YCbCr420Tile: 598a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan case NV12_2K: 599a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan case NV12_128m: 600a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan bpp.numerator = 3; 601a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan bpp.denominator = 2; 602a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan break; 603a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan default: 604a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan break; 605a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan } 606a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan return bpp; 607a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan} 608a19e2b5f4746d249b2910e577792336739cd5672Praveen Chavan 609484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew Georgeint32_t C2DColorConverter::dumpOutput(char * filename, char mode) { 610484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George int fd; 611484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George size_t stride, sliceHeight; 612484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George if (!filename) return -1; 613484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George 614484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George int flags = O_RDWR | O_CREAT; 615484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George if (mode == 'a') { 616484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George flags |= O_APPEND; 617484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George } 618484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George 619484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George if ((fd = open(filename, flags)) < 0) { 620484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George ALOGE("open dump file failed w/ errno %s", strerror(errno)); 621484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George return -1; 622484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George } 623484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George 624484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George int ret = 0; 625484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George if (isYUVSurface(mDstFormat)) { 626484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George C2D_YUV_SURFACE_DEF * dstSurfaceDef = (C2D_YUV_SURFACE_DEF *)mDstSurfaceDef; 627484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George uint8_t * base = (uint8_t *)dstSurfaceDef->plane0; 628484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George stride = dstSurfaceDef->stride0; 629484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George sliceHeight = dstSurfaceDef->height; 630484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George /* dump luma */ 631484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George for (size_t i = 0; i < sliceHeight; i++) { 632484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George ret = write(fd, base, mDstWidth); //will work only for the 420 ones 633484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George if (ret < 0) goto cleanup; 634484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George base += stride; 635484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George } 636484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George 637a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George if (mDstFormat == YCbCr420P || 638a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George mDstFormat == YCrCb420P) { 639a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George printf("Dump Cb and Cr separately for Planar\n"); 640a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George //dump Cb/Cr 641a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George base = (uint8_t *)dstSurfaceDef->plane1; 642a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George stride = dstSurfaceDef->stride1; 643a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George for (size_t i = 0; i < sliceHeight/2;i++) { //will work only for the 420 ones 644a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George ret = write(fd, base, mDstWidth/2); 645a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George if (ret < 0) goto cleanup; 646a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George base += stride; 647a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George } 648a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George 649a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George //dump Cr/Cb 650a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George base = (uint8_t *)dstSurfaceDef->plane2; 651a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George stride = dstSurfaceDef->stride2; 652a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George 653a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George for (size_t i = 0; i < sliceHeight/2;i++) { //will work only for the 420 ones 654a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George ret = write(fd, base, mDstWidth/2); 655a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George if (ret < 0) goto cleanup; 656a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George base += stride; 657a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George } 658a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George 659a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George } else { 660a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George /* dump chroma */ 661a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George base = (uint8_t *)dstSurfaceDef->plane1; 662a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George stride = dstSurfaceDef->stride1; 663a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George for (size_t i = 0; i < sliceHeight/2;i++) { //will work only for the 420 ones 664a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George ret = write(fd, base, mDstWidth); 665a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George if (ret < 0) goto cleanup; 666a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George base += stride; 667a01b803ceb4959ceac2cbed8e099653de546e169Haynes Mathew George } 668484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George } 669484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George } else { 670484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George C2D_RGB_SURFACE_DEF * dstSurfaceDef = (C2D_RGB_SURFACE_DEF *)mDstSurfaceDef; 671484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George uint8_t * base = (uint8_t *)dstSurfaceDef->buffer; 672484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George stride = dstSurfaceDef->stride; 673484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George sliceHeight = dstSurfaceDef->height; 674484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George 675484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George printf("rgb surface base is %p", base); 6768767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan printf("rgb surface dumpsslice height is %lu\n", (unsigned long)sliceHeight); 6778767726b6d6b2194cbb3704d7d82f0c7ef34eeb3Praveen Chavan printf("rgb surface dump stride is %lu\n", (unsigned long)stride); 678484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George 679484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George int bpp = 1; //bytes per pixel 680484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George if (mDstFormat == RGB565) { 681484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George bpp = 2; 682484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George } else if (mDstFormat == RGBA8888) { 683484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George bpp = 4; 684484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George } 685484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George 686484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George int count = 0; 687484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George for (size_t i = 0; i < sliceHeight; i++) { 688484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George ret = write(fd, base, mDstWidth*bpp); 689484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George if (ret < 0) { 690484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George printf("write failed, count = %d\n", count); 691484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George goto cleanup; 692484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George } 693484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George base += stride; 694484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George count += stride; 695484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George } 696484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George } 697484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George cleanup: 698484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George if (ret < 0) { 699484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George ALOGE("file write failed w/ errno %s", strerror(errno)); 700484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George } 701484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George close(fd); 702484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George return ret < 0 ? ret : 0; 703484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George} 704484f1df7f1e765c66ca73f37511a0ad090820b74Haynes Mathew George 70561a2c6a19dbd06a317a419623020e02056661876Praveen Chavanextern "C" C2DColorConverterBase* createC2DColorConverter(size_t srcWidth, size_t srcHeight, size_t dstWidth, size_t dstHeight, ColorConvertFormat srcFormat, ColorConvertFormat dstFormat, int32_t flags, size_t srcStride) 706c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George{ 70761a2c6a19dbd06a317a419623020e02056661876Praveen Chavan return new C2DColorConverter(srcWidth, srcHeight, dstWidth, dstHeight, srcFormat, dstFormat, flags, srcStride); 708c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George} 709c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 710c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew Georgeextern "C" void destroyC2DColorConverter(C2DColorConverterBase* C2DCC) 711c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George{ 712c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George delete C2DCC; 713c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George} 714c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George 715c124ee03788d734aba7b4d79d8ee5e45a3ece26cHaynes Mathew George} 716