xref: /OK3568_Linux_fs/external/rockit/mpi/example/mod/test_mpi_rgn.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright 2021 Rockchip Electronics Co. LTD
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Licensed under the Apache License, Version 2.0 (the "License");
5*4882a593Smuzhiyun  * you may not use this file except in compliance with the License.
6*4882a593Smuzhiyun  * You may obtain a copy of the License at
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  *      http://www.apache.org/licenses/LICENSE-2.0
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * Unless required by applicable law or agreed to in writing, software
11*4882a593Smuzhiyun  * distributed under the License is distributed on an "AS IS" BASIS,
12*4882a593Smuzhiyun  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4882a593Smuzhiyun  * See the License for the specific language governing permissions and
14*4882a593Smuzhiyun  * limitations under the License.
15*4882a593Smuzhiyun  *
16*4882a593Smuzhiyun  */
17*4882a593Smuzhiyun #undef DBG_MOD_ID
18*4882a593Smuzhiyun #define DBG_MOD_ID       RK_ID_RGN
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #include <unistd.h>
21*4882a593Smuzhiyun #include <string.h>
22*4882a593Smuzhiyun #include <stdlib.h>
23*4882a593Smuzhiyun #include <pthread.h>
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #include "rk_debug.h"
26*4882a593Smuzhiyun #include "rk_type.h"
27*4882a593Smuzhiyun #include "rk_mpi_rgn.h"
28*4882a593Smuzhiyun #include "rk_mpi_sys.h"
29*4882a593Smuzhiyun #include "rk_mpi_cal.h"
30*4882a593Smuzhiyun #include "rk_comm_vpss.h"
31*4882a593Smuzhiyun #include "rk_mpi_vpss.h"
32*4882a593Smuzhiyun #include "rk_mpi_mmz.h"
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun #include "test_comm_bmp.h"
35*4882a593Smuzhiyun #include "test_comm_argparse.h"
36*4882a593Smuzhiyun #include "test_comm_utils.h"
37*4882a593Smuzhiyun #include "test_comm_rgn.h"
38*4882a593Smuzhiyun #include "test_comm_venc.h"
39*4882a593Smuzhiyun #include "test_comm_vpss.h"
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun /* PixFormat: big-edian:BGRA8888 => A:bit31~bit24 R:bit23~bit16 G:bit15~bit8 B:bit7~bit0 */
42*4882a593Smuzhiyun const RK_U32 u32BGRA8888ColorTblUser[RGN_CLUT_NUM] = {
43*4882a593Smuzhiyun     // transparency/gray/red/earthy yellow /blue
44*4882a593Smuzhiyun     0x00ffffff, 0xff5e6060, 0xffe9491e, 0xfff4bc1f, 0xff1ca2dd, 0xff87bd43,
45*4882a593Smuzhiyun     0xffff1f1f, 0xff0000af, 0xff0000d7, 0xff0000ff, 0xff005f00, 0xff005f5f,
46*4882a593Smuzhiyun     0xff005f87, 0xff005faf, 0xff005fd7, 0xff005fff, 0xff008000, 0xff008080,
47*4882a593Smuzhiyun     0xff008700, 0xff00875f, 0xff008787, 0xff0087af, 0xff0087d7, 0xff0087ff,
48*4882a593Smuzhiyun     0xff00af00, 0xff00af5f, 0xff00af87, 0xff00afaf, 0xff00afd7, 0xff00afff,
49*4882a593Smuzhiyun     0xff00d700, 0xff00d75f, 0xff00d787, 0xff00d7af, 0xff00d7d7, 0xff00d7ff,
50*4882a593Smuzhiyun     0xff00ff00, 0xff00ff28, 0xff00ff5f, 0xff00ff87, 0xff00ffaf, 0xff00ffd7,
51*4882a593Smuzhiyun     0xff00ffff, 0xff00ffff, 0xff080808, 0xff121212, 0xff1c1c1c, 0xff262626,
52*4882a593Smuzhiyun     0xff303030, 0xff3a3a3a, 0xff444444, 0xff4e4e4e, 0xff585858, 0xff5f0000,
53*4882a593Smuzhiyun     0xff5f005f, 0xff5f0087, 0xff5f00af, 0xff5f00d7, 0xff5f00ff, 0xff5f5f00,
54*4882a593Smuzhiyun     0xff5f5f5f, 0xff5f5f87, 0xff5f5faf, 0xff5f5fd7, 0xff5f5fff, 0xff5f8700,
55*4882a593Smuzhiyun     0xff5f875f, 0xff5f8787, 0xff5f87af, 0xff5f87d7, 0xff5f87ff, 0xff5faf00,
56*4882a593Smuzhiyun     0xff5faf5f, 0xff5faf87, 0xff5fafaf, 0xff5fafd7, 0xff5fafff, 0xff5fd700,
57*4882a593Smuzhiyun     0xff5fd75f, 0xff5fd787, 0xff5fd7af, 0xff5fd7d7, 0xff5fd7ff, 0xff5fff00,
58*4882a593Smuzhiyun     0xff5fff5f, 0xff5fff87, 0xff5fffaf, 0xff5fffd7, 0xff5fffff, 0xff626262,
59*4882a593Smuzhiyun     0xff6c6c6c, 0xff767676, 0xff800000, 0xff800080, 0xff808000, 0xff808080,
60*4882a593Smuzhiyun     0xff808080, 0xff870000, 0xff87005f, 0xff870087, 0xff8700af, 0xff8700d7,
61*4882a593Smuzhiyun     0xff8700ff, 0xff875f00, 0xff875f5f, 0xff875f87, 0xff875faf, 0xff875fd7,
62*4882a593Smuzhiyun     0xff875fff, 0xff878700, 0xff87875f, 0xff878787, 0xff8787af, 0xff8787d7,
63*4882a593Smuzhiyun     0xff8787ff, 0xff87af00, 0xff87af5f, 0xff87af87, 0xff87afaf, 0xff87afd7,
64*4882a593Smuzhiyun     0xff87afff, 0xff87d700, 0xff87d75f, 0xff87d787, 0xff87d7af, 0xff87d7d7,
65*4882a593Smuzhiyun     0xff87d7ff, 0xff87ff00, 0xff87ff5f, 0xff87ff87, 0xff87ffaf, 0xff87ffd7,
66*4882a593Smuzhiyun     0xff87ffff, 0xff8a8a8a, 0xff949494, 0xff9e9e9e, 0xffa8a8a8, 0xffaf0000,
67*4882a593Smuzhiyun     0xffaf005f, 0xffaf0087, 0xffaf00af, 0xffaf00d7, 0xffaf00ff, 0xffaf5f00,
68*4882a593Smuzhiyun     0xffaf5f5f, 0xffaf5f87, 0xffaf5faf, 0xffaf5fd7, 0xffaf5fff, 0xffaf8700,
69*4882a593Smuzhiyun     0xffaf875f, 0xffaf8787, 0xffaf87af, 0xffaf87d7, 0xffaf87ff, 0xffafaf00,
70*4882a593Smuzhiyun     0xffafaf5f, 0xffafaf87, 0xffafafaf, 0xffafafd7, 0xffafafff, 0xffafd700,
71*4882a593Smuzhiyun     0xffafd75f, 0xffafd787, 0xffafd7af, 0xffafd7d7, 0xffafd7ff, 0xffafff00,
72*4882a593Smuzhiyun     0xffafff5f, 0xffafff87, 0xffafffaf, 0xffafffd7, 0xffafffff, 0xffb2b2b2,
73*4882a593Smuzhiyun     0xffbcbcbc, 0xffc0c0c0, 0xffc6c6c6, 0xffd0d0d0, 0xffd70000, 0xffd7005f,
74*4882a593Smuzhiyun     0xffd70087, 0xffd700af, 0xffd700d7, 0xffd700ff, 0xffd75f00, 0xffd75f5f,
75*4882a593Smuzhiyun     0xffd75f87, 0xffd75faf, 0xffd75fd7, 0xffd75fff, 0xffd78700, 0xffd7875f,
76*4882a593Smuzhiyun     0xffd78787, 0xffd787af, 0xffd787d7, 0xffd787ff, 0xffd7af00, 0xffd7af5f,
77*4882a593Smuzhiyun     0xffd7af87, 0xffd7afaf, 0xffd7afd7, 0xffd7afff, 0xffd7d700, 0xffd7d75f,
78*4882a593Smuzhiyun     0xffd7d787, 0xffd7d7af, 0xffd7d7d7, 0xffd7d7ff, 0xffd7ff00, 0xffd7ff5f,
79*4882a593Smuzhiyun     0xffd7ff87, 0xffd7ffaf, 0xffd7ffd7, 0xffd7ffff, 0xffdadada, 0xffe4e4e4,
80*4882a593Smuzhiyun     0xffeeeeee, 0xffff0000, 0xffff0028, 0xffff005f, 0xffff0087, 0xffff00af,
81*4882a593Smuzhiyun     0xffff00d7, 0xffff00ff, 0xffff00ff, 0xffff5f00, 0xffff5f5f, 0xffff5f87,
82*4882a593Smuzhiyun     0xffff5faf, 0xffff5fd7, 0xffff5fff, 0xffff8700, 0xffff875f, 0xffff8787,
83*4882a593Smuzhiyun     0xffff87af, 0xffff87d7, 0xffff87ff, 0xffffaf00, 0xffffaf5f, 0xffffaf87,
84*4882a593Smuzhiyun     0xffffafaf, 0xffffafd7, 0xffffafff, 0xffffd700, 0xffffd75f, 0xffffd787,
85*4882a593Smuzhiyun     0xffffd7af, 0xffffd7d7, 0xffffd7ff, 0xffffff00, 0xffffff28, 0xffffff5f,
86*4882a593Smuzhiyun     0xffffff87, 0xffffffaf, 0xffffffd7, 0xffffffff,
87*4882a593Smuzhiyun };
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun typedef struct _rkTestRGNCtx {
90*4882a593Smuzhiyun     const char *srcFileRawName;
91*4882a593Smuzhiyun     const char *srcFileBmpName;
92*4882a593Smuzhiyun     const char *dstSaveFileName;
93*4882a593Smuzhiyun     RK_S32      s32Operation;
94*4882a593Smuzhiyun     RK_S32      s32LoopCount;
95*4882a593Smuzhiyun     RK_S32      s32RgnCount;
96*4882a593Smuzhiyun     RECT_S      stRegion;
97*4882a593Smuzhiyun     RK_U32      u32RawWidth;
98*4882a593Smuzhiyun     RK_U32      u32RawHeight;
99*4882a593Smuzhiyun     RK_U32      u32RawFormat;
100*4882a593Smuzhiyun     RK_U32      u32BmpFormat;
101*4882a593Smuzhiyun     RK_BOOL     bRgnQp;
102*4882a593Smuzhiyun     RK_U32      u32ClutNum;
103*4882a593Smuzhiyun     pthread_t   vencSendFrameTid;
104*4882a593Smuzhiyun     pthread_t   vencGetStreamTid;
105*4882a593Smuzhiyun     RK_U32      u32AttachMod;
106*4882a593Smuzhiyun     RK_U32      u32CoverType;
107*4882a593Smuzhiyun } TEST_RGN_CTX_S;
108*4882a593Smuzhiyun 
test_rgn_overlay_process(TEST_RGN_CTX_S * pstRgnCtx,MPP_CHN_S * pstMppChn)109*4882a593Smuzhiyun RK_S32 test_rgn_overlay_process(TEST_RGN_CTX_S *pstRgnCtx, MPP_CHN_S *pstMppChn) {
110*4882a593Smuzhiyun     RK_S32          s32Ret       = RK_SUCCESS;
111*4882a593Smuzhiyun     RGN_HANDLE      RgnHandle    = 0;
112*4882a593Smuzhiyun     VENC_CHN        VencChn      = 0;
113*4882a593Smuzhiyun     POINT_S         stPoint      = {0};
114*4882a593Smuzhiyun     BITMAP_S        stBitmap;
115*4882a593Smuzhiyun     RGN_ATTR_S      stRgnAttr;
116*4882a593Smuzhiyun     RGN_CHN_ATTR_S  stRgnChnAttr;
117*4882a593Smuzhiyun     VENC_ATTR_S     stVencAttr;
118*4882a593Smuzhiyun     RK_BOOL         bShow;
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun     /****************************************
121*4882a593Smuzhiyun      step 1: create overlay regions
122*4882a593Smuzhiyun     ****************************************/
123*4882a593Smuzhiyun     for (RK_S32 i = 0; i < pstRgnCtx->s32RgnCount; i++) {
124*4882a593Smuzhiyun         stRgnAttr.enType = OVERLAY_RGN;
125*4882a593Smuzhiyun         stRgnAttr.unAttr.stOverlay.enPixelFmt = (PIXEL_FORMAT_E)pstRgnCtx->u32BmpFormat;
126*4882a593Smuzhiyun         stRgnAttr.unAttr.stOverlay.stSize.u32Width  = pstRgnCtx->stRegion.u32Width;
127*4882a593Smuzhiyun         stRgnAttr.unAttr.stOverlay.stSize.u32Height = pstRgnCtx->stRegion.u32Height;
128*4882a593Smuzhiyun         stRgnAttr.unAttr.stOverlay.u32ClutNum = pstRgnCtx->u32ClutNum;
129*4882a593Smuzhiyun         if (pstRgnCtx->u32ClutNum)
130*4882a593Smuzhiyun             memcpy(stRgnAttr.unAttr.stOverlay.u32Clut, u32BGRA8888ColorTblUser, sizeof(u32BGRA8888ColorTblUser));
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun         RgnHandle = i;
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun         s32Ret = RK_MPI_RGN_Create(RgnHandle, &stRgnAttr);
135*4882a593Smuzhiyun         if (RK_SUCCESS != s32Ret) {
136*4882a593Smuzhiyun             RK_LOGE("RK_MPI_RGN_Create (%d) failed with %#x!", RgnHandle, s32Ret);
137*4882a593Smuzhiyun             RK_MPI_RGN_Destroy(RgnHandle);
138*4882a593Smuzhiyun             return RK_FAILURE;
139*4882a593Smuzhiyun         }
140*4882a593Smuzhiyun         RK_LOGI("The handle: %d, create success!", RgnHandle);
141*4882a593Smuzhiyun     }
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun     /*********************************************
144*4882a593Smuzhiyun      step 2: display overlay regions to groups
145*4882a593Smuzhiyun     *********************************************/
146*4882a593Smuzhiyun     for (RK_S32 i = 0; i < pstRgnCtx->s32RgnCount; i++) {
147*4882a593Smuzhiyun         RgnHandle = i;
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun         memset(&stRgnChnAttr, 0, sizeof(stRgnChnAttr));
150*4882a593Smuzhiyun         stRgnChnAttr.bShow = RK_TRUE;
151*4882a593Smuzhiyun         stRgnChnAttr.enType = OVERLAY_RGN;
152*4882a593Smuzhiyun         stRgnChnAttr.unChnAttr.stOverlayChn.stPoint.s32X = pstRgnCtx->stRegion.s32X + 48 * i;
153*4882a593Smuzhiyun         stRgnChnAttr.unChnAttr.stOverlayChn.stPoint.s32Y = pstRgnCtx->stRegion.s32Y + 48 * i;
154*4882a593Smuzhiyun         stRgnChnAttr.unChnAttr.stOverlayChn.u32BgAlpha = 0;
155*4882a593Smuzhiyun         stRgnChnAttr.unChnAttr.stOverlayChn.u32FgAlpha = 255;
156*4882a593Smuzhiyun         stRgnChnAttr.unChnAttr.stOverlayChn.u32Layer = i;
157*4882a593Smuzhiyun         stRgnChnAttr.unChnAttr.stOverlayChn.stQpInfo.bEnable = pstRgnCtx->bRgnQp;
158*4882a593Smuzhiyun         stRgnChnAttr.unChnAttr.stOverlayChn.stQpInfo.bForceIntra = RK_TRUE;
159*4882a593Smuzhiyun         stRgnChnAttr.unChnAttr.stOverlayChn.stQpInfo.bAbsQp = RK_FALSE;
160*4882a593Smuzhiyun         stRgnChnAttr.unChnAttr.stOverlayChn.stQpInfo.s32Qp = -10 * (i + 1);
161*4882a593Smuzhiyun         s32Ret = RK_MPI_RGN_AttachToChn(RgnHandle, pstMppChn, &stRgnChnAttr);
162*4882a593Smuzhiyun         if (RK_SUCCESS != s32Ret) {
163*4882a593Smuzhiyun             RK_LOGE("RK_MPI_RGN_AttachToChn (%d) failed with %#x!", RgnHandle, s32Ret);
164*4882a593Smuzhiyun             return RK_FAILURE;
165*4882a593Smuzhiyun         }
166*4882a593Smuzhiyun     }
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun     RK_LOGI("Display region to chn success!");
169*4882a593Smuzhiyun     usleep(5000);
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun     /*********************************************
172*4882a593Smuzhiyun      step 3: show bitmap
173*4882a593Smuzhiyun     *********************************************/
174*4882a593Smuzhiyun     RK_S64 s64ShowBmpStart = TEST_COMM_GetNowUs();
175*4882a593Smuzhiyun     s32Ret = TEST_RGN_LoadBmp(pstRgnCtx->srcFileBmpName, &stBitmap,
176*4882a593Smuzhiyun                              (PIXEL_FORMAT_E)pstRgnCtx->u32BmpFormat);
177*4882a593Smuzhiyun     if (RK_SUCCESS != s32Ret) {
178*4882a593Smuzhiyun         RK_LOGE("Load bmp failed with %#x!", s32Ret);
179*4882a593Smuzhiyun         return RK_FAILURE;
180*4882a593Smuzhiyun     }
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun     for (RK_S32 i = 0; i < pstRgnCtx->s32RgnCount; i++) {
183*4882a593Smuzhiyun         RgnHandle = i;
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun         s32Ret = RK_MPI_RGN_SetBitMap(RgnHandle, &stBitmap);
186*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
187*4882a593Smuzhiyun             RK_LOGE("RK_MPI_RGN_SetBitMap failed with %#x!", s32Ret);
188*4882a593Smuzhiyun             return RK_FAILURE;
189*4882a593Smuzhiyun         }
190*4882a593Smuzhiyun     }
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun     if (RK_NULL != stBitmap.pData) {
193*4882a593Smuzhiyun         free(stBitmap.pData);
194*4882a593Smuzhiyun         stBitmap.pData = NULL;
195*4882a593Smuzhiyun     }
196*4882a593Smuzhiyun     RK_S64 s64ShowBmpEnd = TEST_COMM_GetNowUs();
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun     RK_LOGI("Handle:%d, space time %lld us, load bmp success!", RgnHandle, s64ShowBmpEnd - s64ShowBmpStart);
199*4882a593Smuzhiyun     usleep(1000000);
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun     /*********************************************
202*4882a593Smuzhiyun      step 4: use update canvas interface
203*4882a593Smuzhiyun     *********************************************/
204*4882a593Smuzhiyun     s64ShowBmpStart = TEST_COMM_GetNowUs();
205*4882a593Smuzhiyun     for (RK_S32 i = 0; i < pstRgnCtx->s32RgnCount; i++) {
206*4882a593Smuzhiyun         RGN_CANVAS_INFO_S stCanvasInfo;
207*4882a593Smuzhiyun         RgnHandle = i;
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun         memset(&stCanvasInfo, 0, sizeof(RGN_CANVAS_INFO_S));
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun         s32Ret = RK_MPI_RGN_GetCanvasInfo(RgnHandle, &stCanvasInfo);
212*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
213*4882a593Smuzhiyun             RK_LOGE("RK_MPI_RGN_GetCanvasInfo failed with %#x!", s32Ret);
214*4882a593Smuzhiyun             return RK_FAILURE;
215*4882a593Smuzhiyun         }
216*4882a593Smuzhiyun         memset(reinterpret_cast<void *>(stCanvasInfo.u64VirAddr), 0xff,
217*4882a593Smuzhiyun                 stCanvasInfo.u32VirWidth * 16 * (i + 1));
218*4882a593Smuzhiyun         s32Ret = RK_MPI_RGN_UpdateCanvas(RgnHandle);
219*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
220*4882a593Smuzhiyun             RK_LOGE("RK_MPI_RGN_UpdateCanvas failed with %#x!", s32Ret);
221*4882a593Smuzhiyun             return RK_FAILURE;
222*4882a593Smuzhiyun         }
223*4882a593Smuzhiyun     }
224*4882a593Smuzhiyun     s64ShowBmpEnd = TEST_COMM_GetNowUs();
225*4882a593Smuzhiyun     RK_LOGI("Handle:%d, space time %lld us, update canvas success!", RgnHandle, s64ShowBmpEnd - s64ShowBmpStart);
226*4882a593Smuzhiyun     usleep(1000000);
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun     /*********************************************
229*4882a593Smuzhiyun      step 5: change overlay regions' position
230*4882a593Smuzhiyun     *********************************************/
231*4882a593Smuzhiyun     RK_S64 s64ChgPosStart = TEST_COMM_GetNowUs();
232*4882a593Smuzhiyun     RgnHandle = 0;
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun     stPoint.s32X = 64;
235*4882a593Smuzhiyun     stPoint.s32Y = 0;
236*4882a593Smuzhiyun     s32Ret = TEST_RGN_ChangePosition(RgnHandle, pstMppChn, stPoint.s32X, stPoint.s32Y);
237*4882a593Smuzhiyun     if (RK_SUCCESS != s32Ret) {
238*4882a593Smuzhiyun         RK_LOGE("Change region(%d) position failed with %#x!", RgnHandle, s32Ret);
239*4882a593Smuzhiyun         return RK_FAILURE;
240*4882a593Smuzhiyun     }
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun     RK_S64 s64ChgPosEnd = TEST_COMM_GetNowUs();
243*4882a593Smuzhiyun 
244*4882a593Smuzhiyun     RK_LOGI("Handle:%d, space time %lld us, change point success,new point(x:%d,y:%d)!",
245*4882a593Smuzhiyun         RgnHandle, s64ChgPosEnd - s64ChgPosStart, stPoint.s32X, stPoint.s32Y);
246*4882a593Smuzhiyun     usleep(5000);
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun     /*********************************************
249*4882a593Smuzhiyun      step 6: show or hide overlay regions
250*4882a593Smuzhiyun     *********************************************/
251*4882a593Smuzhiyun     RgnHandle = 0;
252*4882a593Smuzhiyun     bShow = RK_FALSE;
253*4882a593Smuzhiyun 
254*4882a593Smuzhiyun     for (RK_S32 i = 0; i < 4; i++) {
255*4882a593Smuzhiyun         s32Ret = TEST_RGN_ShowOrHide(RgnHandle, pstMppChn, bShow);
256*4882a593Smuzhiyun         if (RK_SUCCESS != s32Ret) {
257*4882a593Smuzhiyun             RK_LOGE("Region(%d) show failed with %#x!", RgnHandle, s32Ret);
258*4882a593Smuzhiyun             return RK_FAILURE;
259*4882a593Smuzhiyun         }
260*4882a593Smuzhiyun         RK_LOGI("Handle:%d, %s osd success", RgnHandle, bShow ? "show" : "hide");
261*4882a593Smuzhiyun 
262*4882a593Smuzhiyun         bShow = bShow ? RK_FALSE : RK_TRUE;
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun         usleep(300000);
265*4882a593Smuzhiyun     }
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun     /*********************************************
268*4882a593Smuzhiyun      step 7: Detach osd from chn
269*4882a593Smuzhiyun     *********************************************/
270*4882a593Smuzhiyun     for (RK_S32 i = 0; i < pstRgnCtx->s32RgnCount; i++) {
271*4882a593Smuzhiyun         RgnHandle = i;
272*4882a593Smuzhiyun         s32Ret = RK_MPI_RGN_DetachFromChn(RgnHandle, pstMppChn);
273*4882a593Smuzhiyun         if (RK_SUCCESS != s32Ret) {
274*4882a593Smuzhiyun             RK_LOGE("RK_MPI_RGN_DetachFrmChn (%d) failed with %#x!", RgnHandle, s32Ret);
275*4882a593Smuzhiyun             return RK_FAILURE;
276*4882a593Smuzhiyun         }
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun         RK_LOGI("Detach handle:%d from chn success", RgnHandle);
279*4882a593Smuzhiyun         usleep(5000);
280*4882a593Smuzhiyun     }
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun     /*********************************************
283*4882a593Smuzhiyun      step 8: destory region
284*4882a593Smuzhiyun     *********************************************/
285*4882a593Smuzhiyun     for (RK_S32 i = 0; i < pstRgnCtx->s32RgnCount; i++) {
286*4882a593Smuzhiyun         RgnHandle = i;
287*4882a593Smuzhiyun         s32Ret = RK_MPI_RGN_Destroy(RgnHandle);
288*4882a593Smuzhiyun         if (RK_SUCCESS != s32Ret) {
289*4882a593Smuzhiyun             RK_LOGE("RK_MPI_RGN_Destroy [%d] failed with %#x", RgnHandle, s32Ret);
290*4882a593Smuzhiyun         }
291*4882a593Smuzhiyun         RK_LOGI("Destory handle:%d success", RgnHandle);
292*4882a593Smuzhiyun     }
293*4882a593Smuzhiyun 
294*4882a593Smuzhiyun     return s32Ret;
295*4882a593Smuzhiyun }
296*4882a593Smuzhiyun 
test_rgn_cover_process(TEST_RGN_CTX_S * pstRgnCtx,MPP_CHN_S * pstMppChn)297*4882a593Smuzhiyun RK_S32 test_rgn_cover_process(TEST_RGN_CTX_S *pstRgnCtx, MPP_CHN_S *pstMppChn) {
298*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
299*4882a593Smuzhiyun     RGN_HANDLE coverHandle;
300*4882a593Smuzhiyun     RGN_ATTR_S stCoverAttr;
301*4882a593Smuzhiyun     RGN_CHN_ATTR_S stCoverChnAttr;
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun     memset(&stCoverAttr, 0, sizeof(stCoverAttr));
304*4882a593Smuzhiyun     memset(&stCoverChnAttr, 0, sizeof(RGN_CHN_ATTR_S));
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun     for (RK_S32 i = 0; i < pstRgnCtx->s32RgnCount; i++) {
307*4882a593Smuzhiyun         coverHandle = i;
308*4882a593Smuzhiyun         stCoverAttr.enType = COVER_RGN;
309*4882a593Smuzhiyun         s32Ret = RK_MPI_RGN_Create(coverHandle, &stCoverAttr);
310*4882a593Smuzhiyun         if (RK_SUCCESS != s32Ret) {
311*4882a593Smuzhiyun             RK_LOGE("failed with %#x!", s32Ret);
312*4882a593Smuzhiyun             return RK_FAILURE;
313*4882a593Smuzhiyun         }
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun         stCoverChnAttr.bShow = RK_TRUE;
316*4882a593Smuzhiyun         stCoverChnAttr.enType = COVER_RGN;
317*4882a593Smuzhiyun         stCoverChnAttr.unChnAttr.stCoverChn.enCoverType = (RGN_COVER_TYPE_E)pstRgnCtx->u32CoverType;
318*4882a593Smuzhiyun         if (pstRgnCtx->u32CoverType == AREA_RECT) {
319*4882a593Smuzhiyun             stCoverChnAttr.unChnAttr.stCoverChn.stRect.s32X = pstRgnCtx->stRegion.s32X;
320*4882a593Smuzhiyun             stCoverChnAttr.unChnAttr.stCoverChn.stRect.s32Y = pstRgnCtx->stRegion.s32Y;
321*4882a593Smuzhiyun             stCoverChnAttr.unChnAttr.stCoverChn.stRect.u32Width = pstRgnCtx->stRegion.u32Width;
322*4882a593Smuzhiyun             stCoverChnAttr.unChnAttr.stCoverChn.stRect.u32Height = pstRgnCtx->stRegion.u32Height;
323*4882a593Smuzhiyun         } else {
324*4882a593Smuzhiyun             stCoverChnAttr.unChnAttr.stCoverChn.stQuadRangle.stPoint[0].s32X =
325*4882a593Smuzhiyun                                                             pstRgnCtx->stRegion.s32X;
326*4882a593Smuzhiyun             stCoverChnAttr.unChnAttr.stCoverChn.stQuadRangle.stPoint[0].s32Y =
327*4882a593Smuzhiyun                                                             pstRgnCtx->stRegion.s32Y;
328*4882a593Smuzhiyun             stCoverChnAttr.unChnAttr.stCoverChn.stQuadRangle.stPoint[1].s32X =
329*4882a593Smuzhiyun                                                             pstRgnCtx->stRegion.s32X + pstRgnCtx->stRegion.u32Width;
330*4882a593Smuzhiyun             stCoverChnAttr.unChnAttr.stCoverChn.stQuadRangle.stPoint[1].s32Y =
331*4882a593Smuzhiyun                                                             pstRgnCtx->stRegion.s32Y;
332*4882a593Smuzhiyun             stCoverChnAttr.unChnAttr.stCoverChn.stQuadRangle.stPoint[2].s32X =
333*4882a593Smuzhiyun                                                             pstRgnCtx->stRegion.s32X + pstRgnCtx->stRegion.u32Width;
334*4882a593Smuzhiyun             stCoverChnAttr.unChnAttr.stCoverChn.stQuadRangle.stPoint[2].s32Y =
335*4882a593Smuzhiyun                                                             pstRgnCtx->stRegion.s32Y + pstRgnCtx->stRegion.u32Height;
336*4882a593Smuzhiyun             stCoverChnAttr.unChnAttr.stCoverChn.stQuadRangle.stPoint[3].s32X =
337*4882a593Smuzhiyun                                                             pstRgnCtx->stRegion.s32X + pstRgnCtx->stRegion.u32Width * 2;
338*4882a593Smuzhiyun             stCoverChnAttr.unChnAttr.stCoverChn.stQuadRangle.stPoint[3].s32Y =
339*4882a593Smuzhiyun                                                             pstRgnCtx->stRegion.s32Y + pstRgnCtx->stRegion.u32Height;
340*4882a593Smuzhiyun             stCoverChnAttr.unChnAttr.stCoverChn.stQuadRangle.bSolid = RK_TRUE;
341*4882a593Smuzhiyun             stCoverChnAttr.unChnAttr.stCoverChn.stQuadRangle.u32Thick = 1;
342*4882a593Smuzhiyun         }
343*4882a593Smuzhiyun         stCoverChnAttr.unChnAttr.stCoverChn.u32Color = 0x00f800;
344*4882a593Smuzhiyun         stCoverChnAttr.unChnAttr.stCoverChn.u32Layer = i;
345*4882a593Smuzhiyun         s32Ret = RK_MPI_RGN_AttachToChn(coverHandle, pstMppChn, &stCoverChnAttr);
346*4882a593Smuzhiyun         if (RK_SUCCESS != s32Ret) {
347*4882a593Smuzhiyun             RK_LOGE("failed with %#x!", s32Ret);
348*4882a593Smuzhiyun             goto AttachCover_failed;
349*4882a593Smuzhiyun         }
350*4882a593Smuzhiyun     }
351*4882a593Smuzhiyun 
352*4882a593Smuzhiyun     RK_LOGI("create an cover region and attach it to chn0");
353*4882a593Smuzhiyun     usleep(1000000);
354*4882a593Smuzhiyun 
355*4882a593Smuzhiyun     for (RK_S32 i = 0; i < pstRgnCtx->s32RgnCount; i++) {
356*4882a593Smuzhiyun         coverHandle = i;
357*4882a593Smuzhiyun         s32Ret = RK_MPI_RGN_GetDisplayAttr(coverHandle, pstMppChn, &stCoverChnAttr);
358*4882a593Smuzhiyun         if (RK_SUCCESS != s32Ret) {
359*4882a593Smuzhiyun             RK_LOGE("failed with %#x!", s32Ret);
360*4882a593Smuzhiyun             goto exit;
361*4882a593Smuzhiyun         }
362*4882a593Smuzhiyun         if (pstRgnCtx->u32CoverType == AREA_RECT) {
363*4882a593Smuzhiyun             stCoverChnAttr.unChnAttr.stCoverChn.stRect.s32X = 64 * i;
364*4882a593Smuzhiyun             stCoverChnAttr.unChnAttr.stCoverChn.stRect.s32Y = 64 * i;
365*4882a593Smuzhiyun             stCoverChnAttr.unChnAttr.stCoverChn.stRect.u32Width = 256;
366*4882a593Smuzhiyun             stCoverChnAttr.unChnAttr.stCoverChn.stRect.u32Height = 256;
367*4882a593Smuzhiyun         }
368*4882a593Smuzhiyun         stCoverChnAttr.unChnAttr.stCoverChn.u32Color = 0x0000f8;
369*4882a593Smuzhiyun         stCoverChnAttr.unChnAttr.stCoverChn.u32Layer = 1;
370*4882a593Smuzhiyun         s32Ret = RK_MPI_RGN_SetDisplayAttr(coverHandle, pstMppChn, &stCoverChnAttr);
371*4882a593Smuzhiyun         if (RK_SUCCESS != s32Ret) {
372*4882a593Smuzhiyun             RK_LOGE("failed with %#x!", s32Ret);
373*4882a593Smuzhiyun             goto exit;
374*4882a593Smuzhiyun         }
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun         if (pstRgnCtx->u32CoverType == AREA_RECT) {
377*4882a593Smuzhiyun             RK_LOGI("resize the cover region %d to <%d, %d, %d, %d>, color<0x%x>",
378*4882a593Smuzhiyun                 i,
379*4882a593Smuzhiyun                 stCoverChnAttr.unChnAttr.stCoverChn.stRect.s32X,
380*4882a593Smuzhiyun                 stCoverChnAttr.unChnAttr.stCoverChn.stRect.s32Y,
381*4882a593Smuzhiyun                 stCoverChnAttr.unChnAttr.stCoverChn.stRect.u32Width,
382*4882a593Smuzhiyun                 stCoverChnAttr.unChnAttr.stCoverChn.stRect.u32Height,
383*4882a593Smuzhiyun                 stCoverChnAttr.unChnAttr.stCoverChn.u32Color);
384*4882a593Smuzhiyun         }
385*4882a593Smuzhiyun     }
386*4882a593Smuzhiyun     usleep(500000);
387*4882a593Smuzhiyun 
388*4882a593Smuzhiyun     for (RK_S32 i = 0; i < pstRgnCtx->s32RgnCount; i++) {
389*4882a593Smuzhiyun         coverHandle = i;
390*4882a593Smuzhiyun         s32Ret = TEST_RGN_ShowOrHide(coverHandle, pstMppChn, RK_FALSE);
391*4882a593Smuzhiyun     }
392*4882a593Smuzhiyun     RK_LOGI("hide the cover and the overlay success");
393*4882a593Smuzhiyun     usleep(500000);
394*4882a593Smuzhiyun 
395*4882a593Smuzhiyun     for (RK_S32 i = 0; i < pstRgnCtx->s32RgnCount; i++) {
396*4882a593Smuzhiyun         coverHandle = i;
397*4882a593Smuzhiyun         s32Ret = TEST_RGN_ShowOrHide(coverHandle, pstMppChn, RK_TRUE);
398*4882a593Smuzhiyun         if (RK_SUCCESS != s32Ret) {
399*4882a593Smuzhiyun             RK_LOGE("failed with %#x!", s32Ret);
400*4882a593Smuzhiyun             goto exit;
401*4882a593Smuzhiyun         }
402*4882a593Smuzhiyun     }
403*4882a593Smuzhiyun 
404*4882a593Smuzhiyun     RK_LOGI("show the cover and the overlay success");
405*4882a593Smuzhiyun     usleep(500000);
406*4882a593Smuzhiyun 
407*4882a593Smuzhiyun exit:
408*4882a593Smuzhiyun     for (RK_S32 i = 0; i < pstRgnCtx->s32RgnCount; i++) {
409*4882a593Smuzhiyun         coverHandle = i;
410*4882a593Smuzhiyun         RK_MPI_RGN_DetachFromChn(coverHandle, pstMppChn);
411*4882a593Smuzhiyun     }
412*4882a593Smuzhiyun 
413*4882a593Smuzhiyun AttachCover_failed:
414*4882a593Smuzhiyun     for (RK_S32 i = 0; i < pstRgnCtx->s32RgnCount; i++) {
415*4882a593Smuzhiyun         coverHandle = i;
416*4882a593Smuzhiyun         RK_MPI_RGN_Destroy(coverHandle);
417*4882a593Smuzhiyun     }
418*4882a593Smuzhiyun     return s32Ret;
419*4882a593Smuzhiyun }
420*4882a593Smuzhiyun 
test_rgn_mosaic_process(TEST_RGN_CTX_S * pstRgnCtx,MPP_CHN_S * pstMppChn)421*4882a593Smuzhiyun RK_S32 test_rgn_mosaic_process(TEST_RGN_CTX_S *pstRgnCtx, MPP_CHN_S *pstMppChn) {
422*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
423*4882a593Smuzhiyun     RGN_HANDLE Handle;
424*4882a593Smuzhiyun     RGN_ATTR_S stAttr;
425*4882a593Smuzhiyun     RGN_CHN_ATTR_S stChnAttr;
426*4882a593Smuzhiyun 
427*4882a593Smuzhiyun     memset(&stAttr, 0, sizeof(RGN_ATTR_S));
428*4882a593Smuzhiyun     memset(&stChnAttr, 0, sizeof(RGN_CHN_ATTR_S));
429*4882a593Smuzhiyun 
430*4882a593Smuzhiyun     for (RK_S32 i = 0; i < pstRgnCtx->s32RgnCount; i++) {
431*4882a593Smuzhiyun         Handle = i;
432*4882a593Smuzhiyun         stAttr.enType = MOSAIC_RGN;
433*4882a593Smuzhiyun         s32Ret = RK_MPI_RGN_Create(Handle, &stAttr);
434*4882a593Smuzhiyun         if (RK_SUCCESS != s32Ret) {
435*4882a593Smuzhiyun             RK_LOGE("failed with %#x!", s32Ret);
436*4882a593Smuzhiyun             return RK_FAILURE;
437*4882a593Smuzhiyun         }
438*4882a593Smuzhiyun 
439*4882a593Smuzhiyun         stChnAttr.bShow = RK_TRUE;
440*4882a593Smuzhiyun         stChnAttr.enType = MOSAIC_RGN;
441*4882a593Smuzhiyun         stChnAttr.unChnAttr.stMosaicChn.stRect.s32X = pstRgnCtx->stRegion.s32X;
442*4882a593Smuzhiyun         stChnAttr.unChnAttr.stMosaicChn.stRect.s32Y = pstRgnCtx->stRegion.s32Y;
443*4882a593Smuzhiyun         stChnAttr.unChnAttr.stMosaicChn.stRect.u32Width = pstRgnCtx->stRegion.u32Width;
444*4882a593Smuzhiyun         stChnAttr.unChnAttr.stMosaicChn.stRect.u32Height = pstRgnCtx->stRegion.u32Height;
445*4882a593Smuzhiyun         stChnAttr.unChnAttr.stMosaicChn.enBlkSize = MOSAIC_BLK_SIZE_8;
446*4882a593Smuzhiyun         stChnAttr.unChnAttr.stMosaicChn.u32Layer = i;
447*4882a593Smuzhiyun         s32Ret = RK_MPI_RGN_AttachToChn(Handle, pstMppChn, &stChnAttr);
448*4882a593Smuzhiyun         if (RK_SUCCESS != s32Ret) {
449*4882a593Smuzhiyun             RK_LOGE("failed with %#x!", s32Ret);
450*4882a593Smuzhiyun             goto AttachCover_failed;
451*4882a593Smuzhiyun         }
452*4882a593Smuzhiyun     }
453*4882a593Smuzhiyun 
454*4882a593Smuzhiyun     RK_LOGI("create an cover region and attach it to chn0");
455*4882a593Smuzhiyun     usleep(1000000);
456*4882a593Smuzhiyun 
457*4882a593Smuzhiyun     for (RK_S32 i = 0; i < pstRgnCtx->s32RgnCount; i++) {
458*4882a593Smuzhiyun         Handle = i;
459*4882a593Smuzhiyun         RK_S32 s32Ret = TEST_RGN_ChangePosition(Handle, pstMppChn, 64 * i, 64 * i);
460*4882a593Smuzhiyun         if (RK_SUCCESS != s32Ret) {
461*4882a593Smuzhiyun             RK_LOGE("failed with %#x!", s32Ret);
462*4882a593Smuzhiyun             goto exit;
463*4882a593Smuzhiyun         }
464*4882a593Smuzhiyun 
465*4882a593Smuzhiyun         RK_LOGI("move the cover region %d to <%d, %d, %d, %d>, blk size<0x%x>",
466*4882a593Smuzhiyun             i,
467*4882a593Smuzhiyun             stChnAttr.unChnAttr.stCoverChn.stRect.s32X,
468*4882a593Smuzhiyun             stChnAttr.unChnAttr.stCoverChn.stRect.s32Y,
469*4882a593Smuzhiyun             stChnAttr.unChnAttr.stCoverChn.stRect.u32Width,
470*4882a593Smuzhiyun             stChnAttr.unChnAttr.stCoverChn.stRect.u32Height,
471*4882a593Smuzhiyun             stChnAttr.unChnAttr.stMosaicChn.enBlkSize);
472*4882a593Smuzhiyun     }
473*4882a593Smuzhiyun     usleep(500000);
474*4882a593Smuzhiyun 
475*4882a593Smuzhiyun     for (RK_S32 i = 0; i < pstRgnCtx->s32RgnCount; i++) {
476*4882a593Smuzhiyun         Handle = i;
477*4882a593Smuzhiyun         s32Ret = TEST_RGN_ShowOrHide(Handle, pstMppChn, RK_FALSE);
478*4882a593Smuzhiyun         if (RK_SUCCESS != s32Ret) {
479*4882a593Smuzhiyun             RK_LOGE("failed with %#x!", s32Ret);
480*4882a593Smuzhiyun             goto exit;
481*4882a593Smuzhiyun         }
482*4882a593Smuzhiyun     }
483*4882a593Smuzhiyun     RK_LOGI("hide the cover and the overlay success");
484*4882a593Smuzhiyun     usleep(500000);
485*4882a593Smuzhiyun 
486*4882a593Smuzhiyun     for (RK_S32 i = 0; i < pstRgnCtx->s32RgnCount; i++) {
487*4882a593Smuzhiyun         Handle = i;
488*4882a593Smuzhiyun         s32Ret = TEST_RGN_ShowOrHide(Handle, pstMppChn, RK_TRUE);
489*4882a593Smuzhiyun         if (RK_SUCCESS != s32Ret) {
490*4882a593Smuzhiyun             RK_LOGE("failed with %#x!", s32Ret);
491*4882a593Smuzhiyun             goto exit;
492*4882a593Smuzhiyun         }
493*4882a593Smuzhiyun     }
494*4882a593Smuzhiyun 
495*4882a593Smuzhiyun     RK_LOGI("show the cover and the overlay success");
496*4882a593Smuzhiyun     usleep(500000);
497*4882a593Smuzhiyun 
498*4882a593Smuzhiyun exit:
499*4882a593Smuzhiyun     for (RK_S32 i = 0; i < pstRgnCtx->s32RgnCount; i++) {
500*4882a593Smuzhiyun         Handle = i;
501*4882a593Smuzhiyun         RK_MPI_RGN_DetachFromChn(Handle, pstMppChn);
502*4882a593Smuzhiyun     }
503*4882a593Smuzhiyun AttachCover_failed:
504*4882a593Smuzhiyun     for (RK_S32 i = 0; i < pstRgnCtx->s32RgnCount; i++) {
505*4882a593Smuzhiyun         Handle = i;
506*4882a593Smuzhiyun         RK_MPI_RGN_Destroy(Handle);
507*4882a593Smuzhiyun     }
508*4882a593Smuzhiyun     return s32Ret;
509*4882a593Smuzhiyun }
510*4882a593Smuzhiyun 
test_rgn_draw_line_process(TEST_RGN_CTX_S * pstRgnCtx,MPP_CHN_S * pstMppChn)511*4882a593Smuzhiyun RK_S32 test_rgn_draw_line_process(TEST_RGN_CTX_S *pstRgnCtx, MPP_CHN_S *pstMppChn) {
512*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
513*4882a593Smuzhiyun     RGN_HANDLE Handle;
514*4882a593Smuzhiyun     RGN_ATTR_S stAttr;
515*4882a593Smuzhiyun     RGN_CHN_ATTR_S stChnAttr;
516*4882a593Smuzhiyun 
517*4882a593Smuzhiyun     memset(&stAttr, 0, sizeof(RGN_ATTR_S));
518*4882a593Smuzhiyun     memset(&stChnAttr, 0, sizeof(RGN_CHN_ATTR_S));
519*4882a593Smuzhiyun 
520*4882a593Smuzhiyun     for (RK_S32 i = 0; i < pstRgnCtx->s32RgnCount; i++) {
521*4882a593Smuzhiyun         Handle = i;
522*4882a593Smuzhiyun         stAttr.enType = LINE_RGN;
523*4882a593Smuzhiyun         s32Ret = RK_MPI_RGN_Create(Handle, &stAttr);
524*4882a593Smuzhiyun         if (RK_SUCCESS != s32Ret) {
525*4882a593Smuzhiyun             RK_LOGE("failed with %#x!", s32Ret);
526*4882a593Smuzhiyun             return RK_FAILURE;
527*4882a593Smuzhiyun         }
528*4882a593Smuzhiyun 
529*4882a593Smuzhiyun         stChnAttr.bShow = RK_TRUE;
530*4882a593Smuzhiyun         stChnAttr.enType = LINE_RGN;
531*4882a593Smuzhiyun         stChnAttr.unChnAttr.stLineChn.stStartPoint.s32X = 0;
532*4882a593Smuzhiyun         stChnAttr.unChnAttr.stLineChn.stStartPoint.s32Y = 0;
533*4882a593Smuzhiyun         stChnAttr.unChnAttr.stLineChn.stEndPoint.s32X = 512;
534*4882a593Smuzhiyun         stChnAttr.unChnAttr.stLineChn.stEndPoint.s32Y = 512;
535*4882a593Smuzhiyun         stChnAttr.unChnAttr.stLineChn.u32Color = 0x00f800;
536*4882a593Smuzhiyun         stChnAttr.unChnAttr.stLineChn.u32Thick = 10;
537*4882a593Smuzhiyun         s32Ret = RK_MPI_RGN_AttachToChn(Handle, pstMppChn, &stChnAttr);
538*4882a593Smuzhiyun         if (RK_SUCCESS != s32Ret) {
539*4882a593Smuzhiyun             RK_LOGE("failed with %#x!", s32Ret);
540*4882a593Smuzhiyun             goto AttachCover_failed;
541*4882a593Smuzhiyun         }
542*4882a593Smuzhiyun     }
543*4882a593Smuzhiyun 
544*4882a593Smuzhiyun     RK_LOGI("create an cover region and attach it to chn0");
545*4882a593Smuzhiyun     usleep(1000000);
546*4882a593Smuzhiyun 
547*4882a593Smuzhiyun     for (RK_S32 i = 0; i < pstRgnCtx->s32RgnCount; i++) {
548*4882a593Smuzhiyun         Handle = i;
549*4882a593Smuzhiyun         s32Ret = TEST_RGN_ShowOrHide(Handle, pstMppChn, RK_FALSE);
550*4882a593Smuzhiyun         if (RK_SUCCESS != s32Ret) {
551*4882a593Smuzhiyun             RK_LOGE("failed with %#x!", s32Ret);
552*4882a593Smuzhiyun             goto exit;
553*4882a593Smuzhiyun         }
554*4882a593Smuzhiyun     }
555*4882a593Smuzhiyun     RK_LOGI("hide the cover and the overlay success");
556*4882a593Smuzhiyun     usleep(500000);
557*4882a593Smuzhiyun 
558*4882a593Smuzhiyun     for (RK_S32 i = 0; i < pstRgnCtx->s32RgnCount; i++) {
559*4882a593Smuzhiyun         Handle = i;
560*4882a593Smuzhiyun         s32Ret = TEST_RGN_ShowOrHide(Handle, pstMppChn, RK_TRUE);
561*4882a593Smuzhiyun         if (RK_SUCCESS != s32Ret) {
562*4882a593Smuzhiyun             RK_LOGE("failed with %#x!", s32Ret);
563*4882a593Smuzhiyun             goto exit;
564*4882a593Smuzhiyun         }
565*4882a593Smuzhiyun     }
566*4882a593Smuzhiyun 
567*4882a593Smuzhiyun     RK_LOGI("show the cover and the overlay success");
568*4882a593Smuzhiyun     usleep(500000);
569*4882a593Smuzhiyun 
570*4882a593Smuzhiyun exit:
571*4882a593Smuzhiyun     for (RK_S32 i = 0; i < pstRgnCtx->s32RgnCount; i++) {
572*4882a593Smuzhiyun         Handle = i;
573*4882a593Smuzhiyun         RK_MPI_RGN_DetachFromChn(Handle, pstMppChn);
574*4882a593Smuzhiyun     }
575*4882a593Smuzhiyun 
576*4882a593Smuzhiyun AttachCover_failed:
577*4882a593Smuzhiyun     for (RK_S32 i = 0; i < pstRgnCtx->s32RgnCount; i++) {
578*4882a593Smuzhiyun         Handle = i;
579*4882a593Smuzhiyun         RK_MPI_RGN_Destroy(Handle);
580*4882a593Smuzhiyun     }
581*4882a593Smuzhiyun     return s32Ret;
582*4882a593Smuzhiyun }
583*4882a593Smuzhiyun 
584*4882a593Smuzhiyun 
unit_test_mpi_rgn_venc(TEST_RGN_CTX_S * pstRgnCtx)585*4882a593Smuzhiyun RK_S32 unit_test_mpi_rgn_venc(TEST_RGN_CTX_S *pstRgnCtx) {
586*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
587*4882a593Smuzhiyun     VENC_CHN VencChn = 0;
588*4882a593Smuzhiyun     MPP_CHN_S stMppChn;
589*4882a593Smuzhiyun     COMMON_TEST_VENC_CTX_S stVencCtx;
590*4882a593Smuzhiyun 
591*4882a593Smuzhiyun     stMppChn.enModId = RK_ID_VENC;
592*4882a593Smuzhiyun     stMppChn.s32DevId = 0;
593*4882a593Smuzhiyun     stMppChn.s32ChnId = VencChn;
594*4882a593Smuzhiyun 
595*4882a593Smuzhiyun     memset(&stVencCtx, 0, sizeof(COMMON_TEST_VENC_CTX_S));
596*4882a593Smuzhiyun 
597*4882a593Smuzhiyun     stVencCtx.u32Width = pstRgnCtx->u32RawWidth;
598*4882a593Smuzhiyun     stVencCtx.u32Height = pstRgnCtx->u32RawHeight;
599*4882a593Smuzhiyun     stVencCtx.enPixFmt = RK_FMT_YUV420SP;
600*4882a593Smuzhiyun     stVencCtx.enType = RK_VIDEO_ID_AVC;
601*4882a593Smuzhiyun     stVencCtx.VencChn = VencChn;
602*4882a593Smuzhiyun     stVencCtx.u32StreamBufCnt = 4;
603*4882a593Smuzhiyun     stVencCtx.pSrcFramePath = pstRgnCtx->srcFileRawName;
604*4882a593Smuzhiyun     stVencCtx.pSaveStreamPath = pstRgnCtx->dstSaveFileName;
605*4882a593Smuzhiyun 
606*4882a593Smuzhiyun     s32Ret = TEST_VENC_Start(&stVencCtx);
607*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
608*4882a593Smuzhiyun         return s32Ret;
609*4882a593Smuzhiyun     }
610*4882a593Smuzhiyun 
611*4882a593Smuzhiyun     switch (pstRgnCtx->s32Operation) {
612*4882a593Smuzhiyun       case OVERLAY_RGN: {
613*4882a593Smuzhiyun         s32Ret = test_rgn_overlay_process(pstRgnCtx, &stMppChn);
614*4882a593Smuzhiyun       } break;
615*4882a593Smuzhiyun       case COVER_RGN: {
616*4882a593Smuzhiyun         s32Ret = test_rgn_cover_process(pstRgnCtx, &stMppChn);
617*4882a593Smuzhiyun       } break;
618*4882a593Smuzhiyun       default:
619*4882a593Smuzhiyun         RK_LOGE("unsupport operation %d.", pstRgnCtx->s32Operation);
620*4882a593Smuzhiyun         s32Ret = RK_FAILURE;
621*4882a593Smuzhiyun     }
622*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
623*4882a593Smuzhiyun         return s32Ret;
624*4882a593Smuzhiyun     }
625*4882a593Smuzhiyun 
626*4882a593Smuzhiyun     s32Ret = TEST_VENC_Stop(VencChn);
627*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
628*4882a593Smuzhiyun         return s32Ret;
629*4882a593Smuzhiyun     }
630*4882a593Smuzhiyun 
631*4882a593Smuzhiyun     return s32Ret;
632*4882a593Smuzhiyun }
633*4882a593Smuzhiyun 
unit_test_mpi_rgn_vpss(TEST_RGN_CTX_S * pstRgnCtx)634*4882a593Smuzhiyun RK_S32 unit_test_mpi_rgn_vpss(TEST_RGN_CTX_S *pstRgnCtx) {
635*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
636*4882a593Smuzhiyun     VPSS_GRP VpssGrp = 0;
637*4882a593Smuzhiyun     MPP_CHN_S stMppChn;
638*4882a593Smuzhiyun     VPSS_GRP_ATTR_S stGrpAttr;
639*4882a593Smuzhiyun     VPSS_CHN_ATTR_S stChnAttr;
640*4882a593Smuzhiyun     TEST_VPSS_PROC_CTX_S stProcCtx;
641*4882a593Smuzhiyun 
642*4882a593Smuzhiyun     stMppChn.enModId = RK_ID_VPSS;
643*4882a593Smuzhiyun     stMppChn.s32DevId = VpssGrp;
644*4882a593Smuzhiyun     stMppChn.s32ChnId = 0;
645*4882a593Smuzhiyun 
646*4882a593Smuzhiyun     memset(&stGrpAttr, 0, sizeof(VPSS_GRP_ATTR_S));
647*4882a593Smuzhiyun     memset(&stChnAttr, 0, sizeof(VPSS_CHN_ATTR_S));
648*4882a593Smuzhiyun     memset(&stProcCtx, 0, sizeof(TEST_VPSS_PROC_CTX_S));
649*4882a593Smuzhiyun 
650*4882a593Smuzhiyun     stGrpAttr.u32MaxW = 4096;
651*4882a593Smuzhiyun     stGrpAttr.u32MaxH = 4096;
652*4882a593Smuzhiyun     stGrpAttr.enPixelFormat = (PIXEL_FORMAT_E)pstRgnCtx->u32RawFormat;
653*4882a593Smuzhiyun     stGrpAttr.enCompressMode = COMPRESS_MODE_NONE;
654*4882a593Smuzhiyun     stGrpAttr.stFrameRate.s32SrcFrameRate = -1;
655*4882a593Smuzhiyun     stGrpAttr.stFrameRate.s32DstFrameRate = -1;
656*4882a593Smuzhiyun     stChnAttr.enChnMode = VPSS_CHN_MODE_USER;
657*4882a593Smuzhiyun     stChnAttr.enCompressMode = COMPRESS_MODE_NONE;
658*4882a593Smuzhiyun     stChnAttr.enDynamicRange = DYNAMIC_RANGE_SDR8;
659*4882a593Smuzhiyun     stChnAttr.enPixelFormat = (PIXEL_FORMAT_E)pstRgnCtx->u32RawFormat;
660*4882a593Smuzhiyun     stChnAttr.stFrameRate.s32SrcFrameRate = -1;
661*4882a593Smuzhiyun     stChnAttr.stFrameRate.s32DstFrameRate = -1;
662*4882a593Smuzhiyun     stChnAttr.u32Width = pstRgnCtx->u32RawWidth;
663*4882a593Smuzhiyun     stChnAttr.u32Height = pstRgnCtx->u32RawHeight;
664*4882a593Smuzhiyun     stChnAttr.u32Depth = 8;
665*4882a593Smuzhiyun     s32Ret = TEST_VPSS_Start(VpssGrp, 1, &stGrpAttr, &stChnAttr);
666*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
667*4882a593Smuzhiyun         return s32Ret;
668*4882a593Smuzhiyun     }
669*4882a593Smuzhiyun 
670*4882a593Smuzhiyun     stProcCtx.srcFileName = pstRgnCtx->srcFileRawName;
671*4882a593Smuzhiyun     stProcCtx.dstSaveFileName = pstRgnCtx->dstSaveFileName;
672*4882a593Smuzhiyun     stProcCtx.u32RawWidth = pstRgnCtx->u32RawWidth;
673*4882a593Smuzhiyun     stProcCtx.u32RawHeight = pstRgnCtx->u32RawHeight;
674*4882a593Smuzhiyun     stProcCtx.u32RawPixelFmt = pstRgnCtx->u32RawFormat;
675*4882a593Smuzhiyun     stProcCtx.u32SendFrameRate = 30;
676*4882a593Smuzhiyun     s32Ret = TEST_VPSS_StartProc(VpssGrp, 1, &stProcCtx);
677*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
678*4882a593Smuzhiyun         return s32Ret;
679*4882a593Smuzhiyun     }
680*4882a593Smuzhiyun 
681*4882a593Smuzhiyun     switch (pstRgnCtx->s32Operation) {
682*4882a593Smuzhiyun       case OVERLAY_RGN: {
683*4882a593Smuzhiyun         s32Ret = test_rgn_overlay_process(pstRgnCtx, &stMppChn);
684*4882a593Smuzhiyun       } break;
685*4882a593Smuzhiyun       case COVER_RGN: {
686*4882a593Smuzhiyun         s32Ret = test_rgn_cover_process(pstRgnCtx, &stMppChn);
687*4882a593Smuzhiyun       } break;
688*4882a593Smuzhiyun       case MOSAIC_RGN: {
689*4882a593Smuzhiyun         s32Ret = test_rgn_mosaic_process(pstRgnCtx, &stMppChn);
690*4882a593Smuzhiyun       } break;
691*4882a593Smuzhiyun       case LINE_RGN: {
692*4882a593Smuzhiyun         s32Ret = test_rgn_draw_line_process(pstRgnCtx, &stMppChn);
693*4882a593Smuzhiyun       } break;
694*4882a593Smuzhiyun       default:
695*4882a593Smuzhiyun         RK_LOGE("unsupport operation %d.", pstRgnCtx->s32Operation);
696*4882a593Smuzhiyun         s32Ret = RK_FAILURE;
697*4882a593Smuzhiyun     }
698*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
699*4882a593Smuzhiyun         return s32Ret;
700*4882a593Smuzhiyun     }
701*4882a593Smuzhiyun 
702*4882a593Smuzhiyun     s32Ret = TEST_VPSS_StopProc(VpssGrp);
703*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
704*4882a593Smuzhiyun         return s32Ret;
705*4882a593Smuzhiyun     }
706*4882a593Smuzhiyun     s32Ret = TEST_VPSS_Stop(VpssGrp, 1);
707*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
708*4882a593Smuzhiyun         return s32Ret;
709*4882a593Smuzhiyun     }
710*4882a593Smuzhiyun 
711*4882a593Smuzhiyun     return s32Ret;
712*4882a593Smuzhiyun }
713*4882a593Smuzhiyun 
714*4882a593Smuzhiyun 
mpi_rgn_test_show_options(const TEST_RGN_CTX_S * ctx)715*4882a593Smuzhiyun static void mpi_rgn_test_show_options(const TEST_RGN_CTX_S *ctx) {
716*4882a593Smuzhiyun     RK_PRINT("cmd parse result:\n");
717*4882a593Smuzhiyun     RK_PRINT("rgn input raw file name   : %s\n", ctx->srcFileRawName);
718*4882a593Smuzhiyun     RK_PRINT("rgn input bmp file name   : %s\n", ctx->srcFileBmpName);
719*4882a593Smuzhiyun     RK_PRINT("rgn output file name      : %s\n", ctx->dstSaveFileName);
720*4882a593Smuzhiyun     RK_PRINT("rgn count                 : %d\n", ctx->s32RgnCount);
721*4882a593Smuzhiyun     RK_PRINT("rgn operation             : %d\n", ctx->s32Operation);
722*4882a593Smuzhiyun     RK_PRINT("rgn region pos x          : %d\n", ctx->stRegion.s32X);
723*4882a593Smuzhiyun     RK_PRINT("rgn region pos y          : %d\n", ctx->stRegion.s32Y);
724*4882a593Smuzhiyun     RK_PRINT("rgn canvas width          : %d\n", ctx->stRegion.u32Width);
725*4882a593Smuzhiyun     RK_PRINT("rgn canvas height         : %d\n", ctx->stRegion.u32Height);
726*4882a593Smuzhiyun     RK_PRINT("rgn raw width             : %d\n", ctx->u32RawWidth);
727*4882a593Smuzhiyun     RK_PRINT("rgn raw height            : %d\n", ctx->u32RawHeight);
728*4882a593Smuzhiyun     RK_PRINT("clut num                  : %d\n", ctx->u32ClutNum);
729*4882a593Smuzhiyun }
730*4882a593Smuzhiyun 
731*4882a593Smuzhiyun static const char *const usages[] = {
732*4882a593Smuzhiyun     "./rk_mpi_rgn_test [-w RECT_W] [-h RECT_H]...",
733*4882a593Smuzhiyun     NULL,
734*4882a593Smuzhiyun };
735*4882a593Smuzhiyun 
main(int argc,const char ** argv)736*4882a593Smuzhiyun int main(int argc, const char **argv) {
737*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
738*4882a593Smuzhiyun     TEST_RGN_CTX_S stRgnCtx;
739*4882a593Smuzhiyun 
740*4882a593Smuzhiyun     memset(&stRgnCtx, 0, sizeof(TEST_RGN_CTX_S));
741*4882a593Smuzhiyun     stRgnCtx.s32Operation   = OVERLAY_RGN;
742*4882a593Smuzhiyun     stRgnCtx.s32LoopCount   = 1;
743*4882a593Smuzhiyun     stRgnCtx.s32RgnCount    = 1;
744*4882a593Smuzhiyun     stRgnCtx.u32BmpFormat   = RK_FMT_BGRA5551;
745*4882a593Smuzhiyun     stRgnCtx.bRgnQp         = RK_FALSE;
746*4882a593Smuzhiyun     stRgnCtx.u32RawFormat   = RK_FMT_YUV420SP;
747*4882a593Smuzhiyun     stRgnCtx.u32AttachMod   = RK_ID_VENC;
748*4882a593Smuzhiyun     stRgnCtx.u32CoverType   = AREA_RECT;
749*4882a593Smuzhiyun 
750*4882a593Smuzhiyun     struct argparse_option options[] = {
751*4882a593Smuzhiyun         OPT_HELP(),
752*4882a593Smuzhiyun         OPT_GROUP("basic options:"),
753*4882a593Smuzhiyun         OPT_STRING('i', "input_raw_name", &(stRgnCtx.srcFileRawName),
754*4882a593Smuzhiyun                     "input raw data file name. default(RK_NULL)", NULL, 0, 0),
755*4882a593Smuzhiyun         OPT_STRING('\0', "input_bmp_name", &(stRgnCtx.srcFileBmpName),
756*4882a593Smuzhiyun                     "input bmp data file name. <required>", NULL, 0, 0),
757*4882a593Smuzhiyun         OPT_STRING('o', "output_name", &(stRgnCtx.dstSaveFileName),
758*4882a593Smuzhiyun                     "output stream file name. default(RK_NULL).", NULL, 0, 0),
759*4882a593Smuzhiyun         OPT_INTEGER('r', "rgn_count", &(stRgnCtx.s32RgnCount),
760*4882a593Smuzhiyun                     "the number of rgn handle. default(1).", NULL, 0, 0),
761*4882a593Smuzhiyun         OPT_INTEGER('p', "operation", &(stRgnCtx.s32Operation),
762*4882a593Smuzhiyun                     "RGN operation. default(0). 0: overlay. 1: cover. 2: mosaic. 3: line", NULL, 0, 0),
763*4882a593Smuzhiyun         OPT_INTEGER('x', "rect_x", &(stRgnCtx.stRegion.s32X),
764*4882a593Smuzhiyun                     "RGN region pos x. default(0).", NULL, 0, 0),
765*4882a593Smuzhiyun         OPT_INTEGER('y', "rect_y", &(stRgnCtx.stRegion.s32Y),
766*4882a593Smuzhiyun                     "RGN region pos x. default(0).", NULL, 0, 0),
767*4882a593Smuzhiyun         OPT_INTEGER('w', "bmp_w", &(stRgnCtx.stRegion.u32Width),
768*4882a593Smuzhiyun                     "bmp width. default(0). <required>", NULL, 0, 0),
769*4882a593Smuzhiyun         OPT_INTEGER('h', "bmp_h", &(stRgnCtx.stRegion.u32Height),
770*4882a593Smuzhiyun                     "bmp height. default(0). <required>", NULL, 0, 0),
771*4882a593Smuzhiyun         OPT_INTEGER('q', "rgn_qp", &(stRgnCtx.bRgnQp),
772*4882a593Smuzhiyun                     "rgn roi qp. default(0). ", NULL, 0, 0),
773*4882a593Smuzhiyun         OPT_INTEGER('W', "raw_w", &(stRgnCtx.u32RawWidth),
774*4882a593Smuzhiyun                     "raw width. default(0). <required>", NULL, 0, 0),
775*4882a593Smuzhiyun         OPT_INTEGER('H', "raw_h", &(stRgnCtx.u32RawHeight),
776*4882a593Smuzhiyun                     "raw height. default(0). <required>", NULL, 0, 0),
777*4882a593Smuzhiyun         OPT_INTEGER('F', "raw_fmt", &(stRgnCtx.u32RawFormat),
778*4882a593Smuzhiyun                     "raw pixel format. default(0). 0: NV12", NULL, 0, 0),
779*4882a593Smuzhiyun         OPT_INTEGER('f', "format", &(stRgnCtx.u32BmpFormat),
780*4882a593Smuzhiyun                     "bmp pixel format. default(65557). 65546: ARGB1555, 65557: BGRA5551", NULL, 0, 0),
781*4882a593Smuzhiyun         OPT_INTEGER('\0', "clut_num", &(stRgnCtx.u32ClutNum),
782*4882a593Smuzhiyun                     "set color loop up table num. default(0). range[0, 255].", NULL, 0, 0),
783*4882a593Smuzhiyun         OPT_INTEGER('\0', "mod", &(stRgnCtx.u32AttachMod),
784*4882a593Smuzhiyun                     "attach module. default(4), 4: VENC, 6: VPSS"),
785*4882a593Smuzhiyun         OPT_INTEGER('\0', "cover_type", &(stRgnCtx.u32CoverType),
786*4882a593Smuzhiyun                     "cover type. default(0), 0: rect, 1: quad"),
787*4882a593Smuzhiyun         OPT_END(),
788*4882a593Smuzhiyun     };
789*4882a593Smuzhiyun 
790*4882a593Smuzhiyun     struct argparse argparse;
791*4882a593Smuzhiyun     argparse_init(&argparse, options, usages, 0);
792*4882a593Smuzhiyun     argparse_describe(&argparse, "\nselect a test case to run.",
793*4882a593Smuzhiyun                                  "\nuse --help for details.");
794*4882a593Smuzhiyun 
795*4882a593Smuzhiyun     argc = argparse_parse(&argparse, argc, argv);
796*4882a593Smuzhiyun     mpi_rgn_test_show_options(&stRgnCtx);
797*4882a593Smuzhiyun 
798*4882a593Smuzhiyun     if (stRgnCtx.stRegion.u32Width <= 0 ||
799*4882a593Smuzhiyun           stRgnCtx.stRegion.u32Height <= 0 ||
800*4882a593Smuzhiyun           stRgnCtx.u32RawWidth <= 0 ||
801*4882a593Smuzhiyun           stRgnCtx.u32RawHeight <= 0 ||
802*4882a593Smuzhiyun           stRgnCtx.srcFileBmpName == RK_NULL) {
803*4882a593Smuzhiyun         argparse_usage(&argparse);
804*4882a593Smuzhiyun         return RK_FAILURE;
805*4882a593Smuzhiyun     }
806*4882a593Smuzhiyun 
807*4882a593Smuzhiyun     s32Ret = RK_MPI_SYS_Init();
808*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
809*4882a593Smuzhiyun         return s32Ret;
810*4882a593Smuzhiyun     }
811*4882a593Smuzhiyun 
812*4882a593Smuzhiyun     switch (stRgnCtx.u32AttachMod) {
813*4882a593Smuzhiyun       case RK_ID_VENC: {
814*4882a593Smuzhiyun         s32Ret = unit_test_mpi_rgn_venc(&stRgnCtx);
815*4882a593Smuzhiyun       } break;
816*4882a593Smuzhiyun       case RK_ID_VPSS: {
817*4882a593Smuzhiyun         s32Ret = unit_test_mpi_rgn_vpss(&stRgnCtx);
818*4882a593Smuzhiyun       } break;
819*4882a593Smuzhiyun       default:
820*4882a593Smuzhiyun       break;
821*4882a593Smuzhiyun     }
822*4882a593Smuzhiyun 
823*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
824*4882a593Smuzhiyun         goto __FAILED;
825*4882a593Smuzhiyun     }
826*4882a593Smuzhiyun 
827*4882a593Smuzhiyun     s32Ret = RK_MPI_SYS_Exit();
828*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
829*4882a593Smuzhiyun         return s32Ret;
830*4882a593Smuzhiyun     }
831*4882a593Smuzhiyun     RK_LOGI("test running ok.");
832*4882a593Smuzhiyun     return RK_SUCCESS;
833*4882a593Smuzhiyun 
834*4882a593Smuzhiyun __FAILED:
835*4882a593Smuzhiyun     RK_MPI_SYS_Exit();
836*4882a593Smuzhiyun     RK_LOGE("test running failed!");
837*4882a593Smuzhiyun     return s32Ret;
838*4882a593Smuzhiyun }
839