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