1 /* GPL-2.0 WITH Linux-syscall-note OR Apache 2.0 */ 2 /* Copyright (c) 2021 Fuzhou Rockchip Electronics Co., Ltd */ 3 4 #ifndef INCLUDE_RT_MPI_RK_COMM_RGN_H__ 5 #define INCLUDE_RT_MPI_RK_COMM_RGN_H__ 6 7 #include "rk_common.h" 8 #include "rk_comm_video.h" 9 #include "rk_errno.h" 10 11 #ifdef __cplusplus 12 #if __cplusplus 13 extern "C" { 14 #endif 15 #endif /* End of #ifdef __cplusplus */ 16 17 typedef RK_U32 RGN_HANDLE; 18 19 #define RGN_CLUT_NUM 256 20 #define RGN_MAX_BUF_NUM 2 21 #define RGN_COLOR_LUT_NUM 2 22 23 #define RGN_MIN_WIDTH 16 24 #define RGN_MIN_HEIGHT 16 25 26 #define RGN_COVER_MIN_X 0 27 #define RGN_COVER_MIN_Y 0 28 #define RGN_COVER_MAX_X 8192 29 #define RGN_COVER_MAX_Y 8192 30 #define RGN_COVER_MAX_WIDTH 8192 31 #define RGN_COVER_MAX_HEIGHT 8192 32 33 #define RGN_OVERLAY_MIN_X -8192 34 #define RGN_OVERLAY_MIN_Y -8192 35 #define RGN_OVERLAY_MAX_X 8192 36 #define RGN_OVERLAY_MAX_Y 8192 37 #define RGN_OVERLAY_MAX_WIDTH 8192 38 #define RGN_OVERLAY_MAX_HEIGHT 8192 39 40 #define RGN_MOSAIC_MIN_X 0 41 #define RGN_MOSAIC_MIN_Y 0 42 #define RGN_MOSAIC_MAX_X 8192 43 #define RGN_MOSAIC_MAX_Y 8192 44 #define RGN_MOSAIC_MIN_WIDTH 32 45 #define RGN_MOSAIC_MIN_HEIGHT 32 46 #define RGN_MOSAIC_MAX_WIDTH 8192 47 #define RGN_MOSAIC_MAX_HEIGHT 8192 48 49 #define RGN_LINE_MIN_X 0 50 #define RGN_LINE_MIN_Y 0 51 #define RGN_LINE_MAX_X 8192 52 #define RGN_LINE_MAX_Y 8192 53 #define RGN_LINE_MIN_THICK 1 54 #define RGN_LINE_MAX_THICK 32 55 56 /* type of video regions */ 57 typedef enum rkRGN_TYPE_E { 58 OVERLAY_RGN = 0, /* video overlay region */ 59 OVERLAY_EX_RGN, 60 COVER_RGN, 61 MOSAIC_RGN, 62 LINE_RGN, 63 RGN_BUTT 64 } RGN_TYPE_E; 65 66 /* overlay regions qp info (only support to venc) */ 67 typedef struct rkOVERLAY_QP_INFO { 68 /* qp protect is enable */ 69 RK_BOOL bEnable; 70 /* is abs qp, RK_TRUE: overlay regions set to the qp; RK_FALSE: regions set around the qp. */ 71 RK_BOOL bAbsQp; 72 /* flag of forced intra macroblock */ 73 RK_BOOL bForceIntra; 74 /* absolute / relative qp of macroblock */ 75 RK_S32 s32Qp; 76 } OVERLAY_QP_INFO_S; 77 78 typedef enum rkINVERT_COLOR_MODE_E { 79 LESSTHAN_LUM_THRESH = 0, 80 MORETHAN_LUM_THRESH, 81 INVERT_COLOR_BUTT 82 } INVERT_COLOR_MODE_E; 83 84 typedef struct rkOVERLAY_INVERT_COLOR_S { 85 SIZE_S stInvColArea; 86 RK_U32 u32LumThresh; 87 INVERT_COLOR_MODE_E enChgMod; 88 RK_BOOL bInvColEn; 89 } OVERLAY_INVERT_COLOR_S; 90 91 typedef struct rkOVERLAY_ATTR_S { 92 /* bitmap pixel format,now only support BGRA5551 or ARGB8888 */ 93 PIXEL_FORMAT_E enPixelFmt; 94 /* region size,W:[16,RGN_OVERLAY_MAX_WIDTH],align:16,H:[16,RGN_OVERLAY_MAX_HEIGHT],align:16 */ 95 SIZE_S stSize; 96 RK_U32 u32CanvasNum; /* canvas number, default 2. */ 97 /* color loop up table number, default 0. range:[0, RGN_CLUT_NUM) */ 98 RK_U32 u32ClutNum; 99 /* color loop up table, only support BGRA8888 format now. */ 100 RK_U32 u32Clut[RGN_CLUT_NUM]; 101 /* ex overlay fiter device type, now only support venc module*/ 102 VIDEO_PROC_DEV_TYPE_E enVProcDev; 103 } OVERLAY_ATTR_S; 104 105 typedef struct rkOVERLAY_CHN_ATTR_S { 106 /* X:[0,OVERLAY_MAX_X_VENC],align:16,Y:[0,OVERLAY_MAX_Y_VENC],align:16 */ 107 POINT_S stPoint; 108 109 /* background an foreground transparence when pixel format is BGRA5551 110 * the pixel format is BGRA5551,when the alpha bit is 1 this alpha is value! 111 * range:[0,255] 112 */ 113 RK_U32 u32FgAlpha; 114 115 /* background an foreground transparence when pixel format is BGRA5551 116 * the pixel format is BGRA5551,when the alpha bit is 0 this alpha is value! 117 * range:[0,255] 118 */ 119 RK_U32 u32BgAlpha; 120 121 RK_U32 u32Layer; /* OVERLAY region layer range:[0,7]*/ 122 123 /* overlay regions qp info (only support to venc) */ 124 OVERLAY_QP_INFO_S stQpInfo; 125 /* 2BPP color table*/ 126 RK_U32 u32ColorLUT[RGN_COLOR_LUT_NUM]; 127 128 OVERLAY_INVERT_COLOR_S stInvertColor; 129 } OVERLAY_CHN_ATTR_S; 130 131 typedef struct rkRGN_QUADRANGLE_S { 132 RK_BOOL bSolid; 133 RK_U32 u32Thick; 134 POINT_S stPoint[4]; 135 } RGN_QUADRANGLE_S; 136 137 typedef enum rkRGN_COORDINATE_E { 138 RGN_ABS_COOR = 0, /*Absolute coordinate*/ 139 RGN_RATIO_COOR /*Ratio coordinate*/ 140 } RGN_COORDINATE_E; 141 142 typedef enum rkRGN_AREA_TYPE_E { 143 AREA_RECT = 0, 144 AREA_QUAD_RANGLE, 145 AREA_BUTT 146 } RGN_COVER_TYPE_E; 147 148 typedef struct rkCOVER_CHN_ATTR_S { 149 RGN_COVER_TYPE_E enCoverType; 150 union { 151 RECT_S stRect; /* config of rect */ 152 RGN_QUADRANGLE_S stQuadRangle; 153 }; 154 RK_U32 u32Color; /* RGB888 format */ 155 RK_U32 u32Layer; /* COVER region layer */ 156 RGN_COORDINATE_E enCoordinate; /* ratio coordiante or abs coordinate */ 157 } COVER_CHN_ATTR_S; 158 159 typedef enum rkMOSAIC_BLK_SIZE_E { 160 MOSAIC_BLK_SIZE_8 = 0, /*block size 8*8 of MOSAIC*/ 161 MOSAIC_BLK_SIZE_16, /*block size 16*16 of MOSAIC*/ 162 MOSAIC_BLK_SIZE_32, /*block size 32*32 of MOSAIC*/ 163 MOSAIC_BLK_SIZE_64, /*block size 64*64 of MOSAIC*/ 164 MOSAIC_BLK_SIZE_BUTT 165 } MOSAIC_BLK_SIZE_E; 166 167 typedef struct rkMOSAIC_CHN_ATTR_S { 168 RECT_S stRect; /*location of MOSAIC*/ 169 MOSAIC_BLK_SIZE_E enBlkSize; /*block size of MOSAIC*/ 170 RK_U32 u32Layer; /*MOSAIC region layer range:[0,3] */ 171 } MOSAIC_CHN_ATTR_S; 172 173 typedef struct rkLINE_CHN_ATTR_S { 174 RK_U32 u32Thick; 175 RK_U32 u32Color; 176 POINT_S stStartPoint; 177 POINT_S stEndPoint; 178 } LINE_CHN_ATTR_S; 179 180 typedef union rkRGN_ATTR_U { 181 OVERLAY_ATTR_S stOverlay; /* attribute of overlay region */ 182 } RGN_ATTR_U; 183 184 typedef union rkRGN_CHN_ATTR_U { 185 OVERLAY_CHN_ATTR_S stOverlayChn; /* attribute of overlay region */ 186 COVER_CHN_ATTR_S stCoverChn; /* attribute of cover region */ 187 MOSAIC_CHN_ATTR_S stMosaicChn; /* attribute of mosaic region */ 188 LINE_CHN_ATTR_S stLineChn; /* attribute of draw line region */ 189 } RGN_CHN_ATTR_U; 190 191 /* attribute of a region */ 192 typedef struct rkRGN_ATTR_S { 193 RGN_TYPE_E enType; /* region type */ 194 RGN_ATTR_U unAttr; /* region attribute */ 195 } RGN_ATTR_S; 196 197 /* attribute of a region */ 198 typedef struct rkRGN_CHN_ATTR_S { 199 RK_BOOL bShow; 200 RGN_TYPE_E enType; /* region type */ 201 RGN_CHN_ATTR_U unChnAttr; /* region attribute */ 202 } RGN_CHN_ATTR_S; 203 204 typedef struct rkRGN_CANVAS_INFO_S { 205 MB_BLK canvasBlk; 206 RK_U64 u64VirAddr; 207 SIZE_S stSize; 208 RK_U32 u32VirWidth; 209 RK_U32 u32VirHeight; 210 PIXEL_FORMAT_E enPixelFmt; 211 } RGN_CANVAS_INFO_S; 212 213 /* PingPong buffer change when set attr, it needs to remap memory in mpi interface */ 214 #define RK_NOTICE_RGN_BUFFER_CHANGE RK_DEF_ERR(RK_ID_RGN, RK_ERR_LEVEL_NOTICE, RK_SUCCESS) 215 216 /* invlalid device ID */ 217 #define RK_ERR_RGN_INVALID_DEVID RK_DEF_ERR(RK_ID_RGN, RK_ERR_LEVEL_ERROR, RK_ERR_INVALID_DEVID) 218 /* invlalid channel ID */ 219 #define RK_ERR_RGN_INVALID_CHNID RK_DEF_ERR(RK_ID_RGN, RK_ERR_LEVEL_ERROR, RK_ERR_INVALID_CHNID) 220 /* at lease one parameter is illagal ,eg, an illegal enumeration value */ 221 #define RK_ERR_RGN_ILLEGAL_PARAM RK_DEF_ERR(RK_ID_RGN, RK_ERR_LEVEL_ERROR, RK_ERR_ILLEGAL_PARAM) 222 /* channel exists */ 223 #define RK_ERR_RGN_EXIST RK_DEF_ERR(RK_ID_RGN, RK_ERR_LEVEL_ERROR, RK_ERR_EXIST) 224 /*UN exist*/ 225 #define RK_ERR_RGN_UNEXIST RK_DEF_ERR(RK_ID_RGN, RK_ERR_LEVEL_ERROR, RK_ERR_UNEXIST) 226 /* using a NULL point */ 227 #define RK_ERR_RGN_NULL_PTR RK_DEF_ERR(RK_ID_RGN, RK_ERR_LEVEL_ERROR, RK_ERR_NULL_PTR) 228 /* try to enable or initialize system,device or channel, before configing attribute */ 229 #define RK_ERR_RGN_NOT_CONFIG RK_DEF_ERR(RK_ID_RGN, RK_ERR_LEVEL_ERROR, RK_ERR_NOT_CONFIG) 230 /* operation is not supported by NOW */ 231 #define RK_ERR_RGN_NOT_SUPPORT RK_DEF_ERR(RK_ID_RGN, RK_ERR_LEVEL_ERROR, RK_ERR_NOT_SUPPORT) 232 /* operation is not permitted ,eg, try to change stati attribute */ 233 #define RK_ERR_RGN_NOT_PERM RK_DEF_ERR(RK_ID_RGN, RK_ERR_LEVEL_ERROR, RK_ERR_NOT_PERM) 234 /* failure caused by malloc memory */ 235 #define RK_ERR_RGN_NOMEM RK_DEF_ERR(RK_ID_RGN, RK_ERR_LEVEL_ERROR, RK_ERR_NOMEM) 236 /* failure caused by malloc buffer */ 237 #define RK_ERR_RGN_NOBUF RK_DEF_ERR(RK_ID_RGN, RK_ERR_LEVEL_ERROR, RK_ERR_NOBUF) 238 /* no data in buffer */ 239 #define RK_ERR_RGN_BUF_EMPTY RK_DEF_ERR(RK_ID_RGN, RK_ERR_LEVEL_ERROR, RK_ERR_BUF_EMPTY) 240 /* no buffer for new data */ 241 #define RK_ERR_RGN_BUF_FULL RK_DEF_ERR(RK_ID_RGN, RK_ERR_LEVEL_ERROR, RK_ERR_BUF_FULL) 242 /* bad address, eg. used for copy_from_user & copy_to_user */ 243 #define RK_ERR_RGN_BADADDR RK_DEF_ERR(RK_ID_RGN, RK_ERR_LEVEL_ERROR, RK_ERR_BADADDR) 244 /* resource is busy, eg. destroy a venc chn without unregistering it */ 245 #define RK_ERR_RGN_BUSY RK_DEF_ERR(RK_ID_RGN, RK_ERR_LEVEL_ERROR, RK_ERR_BUSY) 246 /* System is not ready,maybe not initialed or loaded. 247 * Returning the error code when opening a device file failed. 248 */ 249 #define RK_ERR_RGN_NOTREADY RK_DEF_ERR(RK_ID_RGN, RK_ERR_LEVEL_ERROR, RK_ERR_NOTREADY) 250 251 #ifdef __cplusplus 252 #if __cplusplus 253 } 254 #endif 255 #endif /* __cplusplus */ 256 257 #endif /* INCLUDE_RT_MPI_RK_COMM_RGN_H__ */ 258 259