/* Copyright (c) 2012 - 2013, 2015, 2018 The Linux Foundation. All rights reserved. * * redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * neither the name of The Linux Foundation nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * this software is provided "as is" and any express or implied * warranties, including, but not limited to, the implied warranties of * merchantability, fitness for a particular purpose and non-infringement * are disclaimed. in no event shall the copyright owner or contributors * be liable for any direct, indirect, incidental, special, exemplary, or * consequential damages (including, but not limited to, procurement of * substitute goods or services; loss of use, data, or profits; or * business interruption) however caused and on any theory of liability, * whether in contract, strict liability, or tort (including negligence * or otherwise) arising in any way out of the use of this software, even * if advised of the possibility of such damage. * */ #ifndef C2D_ColorConverter_H_ #define C2D_ColorConverter_H_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #undef LOG_TAG #define LOG_TAG "C2DColorConvert" #define ALIGN( num, to ) (((num) + (to-1)) & (~(to-1))) #define ALIGN8K 8192 #define ALIGN4K 4096 #define ALIGN2K 2048 #define ALIGN512 512 #define ALIGN256 256 #define ALIGN128 128 #define ALIGN64 64 #define ALIGN32 32 #define ALIGN16 16 #define ADRENO_PIXELFORMAT_R8G8B8A8 28 #define ADRENO_PIXELFORMAT_B5G6R5 85 typedef C2D_STATUS (*LINK_c2dCreateSurface)( uint32 *surface_id, uint32 surface_bits, C2D_SURFACE_TYPE surface_type, void *surface_definition ); typedef C2D_STATUS (*LINK_c2dUpdateSurface)( uint32 surface_id, uint32 surface_bits, C2D_SURFACE_TYPE surface_type, void *surface_definition ); typedef C2D_STATUS (*LINK_c2dReadSurface)( uint32 surface_id, C2D_SURFACE_TYPE surface_type, void *surface_definition, int32 x, int32 y ); typedef C2D_STATUS (*LINK_c2dDraw)( uint32 target_id, uint32 target_config, C2D_RECT *target_scissor, uint32 target_mask_id, uint32 target_color_key, C2D_OBJECT *objects_list, uint32 num_objects ); typedef C2D_STATUS (*LINK_c2dFlush)( uint32 target_id, c2d_ts_handle *timestamp); typedef C2D_STATUS (*LINK_c2dFinish)( uint32 target_id); typedef C2D_STATUS (*LINK_c2dWaitTimestamp)( c2d_ts_handle timestamp ); typedef C2D_STATUS (*LINK_c2dDestroySurface)( uint32 surface_id ); typedef C2D_STATUS (*LINK_c2dMapAddr)( int mem_fd, void * hostptr, uint32 len, uint32 offset, uint32 flags, void ** gpuaddr); typedef C2D_STATUS (*LINK_c2dUnMapAddr)(void * gpuaddr); typedef void (*LINK_adreno_compute_fmt_aligned_width_and_height)(int width, int height, int plane_id, int format, int num_samples, int tile_mode, int raster_mode, int padding_threshold, int *aligned_w, int *aligned_h); /*TODO: THIS NEEDS TO ENABLED FOR JB PLUS*/ enum ColorConvertFormat { RGB565 = 1, YCbCr420Tile, YCbCr420SP, YCbCr420P, YCrCb420P, RGBA8888, RGBA8888_UBWC, NV12_2K, NV12_512, NV12_128m, NV12_UBWC, TP10_UBWC, YCbCr420_VENUS_P010, CbYCrY, NO_COLOR_FORMAT }; typedef struct { int32_t numerator; int32_t denominator; } C2DBytesPerPixel; typedef struct { int32_t width; int32_t height; int32_t stride; int32_t sliceHeight; int32_t lumaAlign; int32_t sizeAlign; int32_t size; C2DBytesPerPixel bpp; } C2DBuffReq; typedef enum { C2D_INPUT = 0, C2D_OUTPUT, } C2D_PORT; typedef std::unordered_map ColorMapping; class C2DColorConverter{ void *mC2DLibHandle; LINK_c2dCreateSurface mC2DCreateSurface; LINK_c2dUpdateSurface mC2DUpdateSurface; LINK_c2dReadSurface mC2DReadSurface; LINK_c2dDraw mC2DDraw; LINK_c2dFlush mC2DFlush; LINK_c2dFinish mC2DFinish; LINK_c2dWaitTimestamp mC2DWaitTimestamp; LINK_c2dDestroySurface mC2DDestroySurface; LINK_c2dMapAddr mC2DMapAddr; LINK_c2dUnMapAddr mC2DUnMapAddr; void *mAdrenoUtilsHandle; LINK_adreno_compute_fmt_aligned_width_and_height mAdrenoComputeFmtAlignedWidthAndHeight; uint32_t mSrcSurface, mDstSurface; void * mSrcSurfaceDef; void * mDstSurfaceDef; C2D_OBJECT mBlit; size_t mSrcWidth; size_t mSrcHeight; size_t mSrcStride; size_t mDstWidth; size_t mDstHeight; size_t mSrcSize; size_t mDstSize; size_t mSrcYSize; size_t mDstYSize; ColorConvertFormat mSrcFormat; ColorConvertFormat mDstFormat; int32_t mFlags; bool enabled; bool mConversionNeeded; pthread_mutex_t mLock; public: C2DColorConverter(); ~C2DColorConverter(); bool getConversionNeeded() { return mConversionNeeded; } void setConversionNeeded(bool needed) { mConversionNeeded = needed; } bool isPropChanged(size_t srcWidth, size_t srcHeight, size_t dstWidth, size_t dstHeight, ColorConvertFormat srcFormat, ColorConvertFormat dstFormat, int32_t flags, size_t srcStride); bool setResolution(size_t srcWidth, size_t srcHeight, size_t dstWidth, size_t dstHeight, ColorConvertFormat srcFormat, ColorConvertFormat dstFormat, int32_t flags, size_t srcStride); int32_t getBuffSize(int32_t port); bool getBuffFilledLen(int32_t port, unsigned int &filled_length); bool getBuffReq(int32_t port, C2DBuffReq *req); int32_t dumpOutput(char * filename, char mode); bool convertC2D(int srcFd, void *srcBase, void * srcData, int dstFd, void *dstBase, void * dstData); bool isYUVSurface(ColorConvertFormat format); int32_t getDummySurfaceDef(ColorConvertFormat format, size_t width, size_t height, bool isSource); C2D_STATUS updateYUVSurfaceDef(uint8_t *addr, void *base, void * data, bool isSource); C2D_STATUS updateRGBSurfaceDef(uint8_t *addr, void * data, bool isSource); uint32_t getC2DFormat(ColorConvertFormat format, bool isSource); size_t calcStride(ColorConvertFormat format, size_t width); size_t calcYSize(ColorConvertFormat format, size_t width, size_t height); size_t calcSize(ColorConvertFormat format, size_t width, size_t height); void *getMappedGPUAddr(int bufFD, void *bufPtr, size_t bufLen); bool unmapGPUAddr(unsigned long gAddr); size_t calcLumaAlign(ColorConvertFormat format); size_t calcSizeAlign(ColorConvertFormat format); C2DBytesPerPixel calcBytesPerPixel(ColorConvertFormat format); }; #endif // C2D_ColorConverter_H_