1*4882a593Smuzhiyun /* Copyright 2020 Rockchip Electronics Co. LTD
2*4882a593Smuzhiyun *
3*4882a593Smuzhiyun * Licensed under the Apache License, Version 2.0 (the "License");
4*4882a593Smuzhiyun * you may not use this file except in compliance with the License.
5*4882a593Smuzhiyun * You may obtain a copy of the License at
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * http://www.apache.org/licenses/LICENSE-2.0
8*4882a593Smuzhiyun *
9*4882a593Smuzhiyun * Unless required by applicable law or agreed to in writing, software
10*4882a593Smuzhiyun * distributed under the License is distributed on an "AS IS" BASIS,
11*4882a593Smuzhiyun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*4882a593Smuzhiyun * See the License for the specific language governing permissions and
13*4882a593Smuzhiyun * limitations under the License.
14*4882a593Smuzhiyun *
15*4882a593Smuzhiyun * author: rimon.xu@rock-chips.com
16*4882a593Smuzhiyun * date: 2020-11-06
17*4882a593Smuzhiyun */
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun #include <stdio.h>
20*4882a593Smuzhiyun #include <errno.h>
21*4882a593Smuzhiyun #include <unistd.h>
22*4882a593Smuzhiyun #include <string.h>
23*4882a593Smuzhiyun #include "rk_debug.h"
24*4882a593Smuzhiyun #include "rk_mpi_mb.h"
25*4882a593Smuzhiyun #include "rk_comm_tde.h"
26*4882a593Smuzhiyun #include "rk_comm_video.h"
27*4882a593Smuzhiyun #include "rk_mpi_tde.h"
28*4882a593Smuzhiyun #include "rk_mpi_sys.h"
29*4882a593Smuzhiyun #include "rk_mpi_cal.h"
30*4882a593Smuzhiyun #include "test_comm_argparse.h"
31*4882a593Smuzhiyun #include "test_comm_utils.h"
32*4882a593Smuzhiyun #include "test_comm_tde.h"
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun typedef struct _rkTDEOpMap {
35*4882a593Smuzhiyun RK_S32 op;
36*4882a593Smuzhiyun const char* strOp;
37*4882a593Smuzhiyun } TDE_OP_MAP_S;
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun const static TDE_OP_MAP_S gstTdeOpMaps[] = {
40*4882a593Smuzhiyun { TDE_OP_QUICK_COPY, "quick_copy" },
41*4882a593Smuzhiyun { TDE_OP_QUICK_RESIZE, "quick_resize" },
42*4882a593Smuzhiyun { TDE_OP_QUICK_FILL, "quick_fill" },
43*4882a593Smuzhiyun { TDE_OP_ROTATION, "rotation" },
44*4882a593Smuzhiyun { TDE_OP_MIRROR, "mirror" },
45*4882a593Smuzhiyun { TDE_OP_COLOR_KEY, "color_key" }
46*4882a593Smuzhiyun };
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun typedef struct _rkMpiTdeCtx {
49*4882a593Smuzhiyun const char *srcFilePath;
50*4882a593Smuzhiyun const char *dstFilePath;
51*4882a593Smuzhiyun const char *backgroundFile;
52*4882a593Smuzhiyun RK_S32 s32LoopCount;
53*4882a593Smuzhiyun RK_S32 s32JobNum;
54*4882a593Smuzhiyun RK_S32 s32TaskNum;
55*4882a593Smuzhiyun RK_S32 s32Rotation;
56*4882a593Smuzhiyun RK_S32 s32Operation;
57*4882a593Smuzhiyun TDE_SURFACE_S stSrcSurface;
58*4882a593Smuzhiyun TDE_SURFACE_S stDstSurface;
59*4882a593Smuzhiyun RECT_S stSrcRect;
60*4882a593Smuzhiyun RECT_S stDstRect;
61*4882a593Smuzhiyun RK_U32 u32SrcVirWidth;
62*4882a593Smuzhiyun RK_U32 u32SrcVirHeight;
63*4882a593Smuzhiyun RK_S32 s32SrcCompressMode;
64*4882a593Smuzhiyun RK_S32 s32DstCompressMode;
65*4882a593Smuzhiyun RK_S32 s32Color;
66*4882a593Smuzhiyun RK_S32 s32ColorKey;
67*4882a593Smuzhiyun RK_S32 s32Mirror;
68*4882a593Smuzhiyun RK_S32 s32ProcessTime;
69*4882a593Smuzhiyun RK_BOOL bPerformace;
70*4882a593Smuzhiyun } TEST_TDE_CTX_S;
71*4882a593Smuzhiyun
test_tde_str_op(RK_S32 op)72*4882a593Smuzhiyun static const char *test_tde_str_op(RK_S32 op) {
73*4882a593Smuzhiyun RK_S32 s32ElemLen = sizeof(gstTdeOpMaps) / sizeof(gstTdeOpMaps[0]);
74*4882a593Smuzhiyun for (size_t i = 0; i < s32ElemLen; i++) {
75*4882a593Smuzhiyun if (op == gstTdeOpMaps[i].op) {
76*4882a593Smuzhiyun return gstTdeOpMaps[i].strOp;
77*4882a593Smuzhiyun }
78*4882a593Smuzhiyun }
79*4882a593Smuzhiyun return RK_NULL;
80*4882a593Smuzhiyun }
81*4882a593Smuzhiyun
test_tde_save_result(TEST_TDE_CTX_S * ctx,TDE_SURFACE_S * pstDst,RK_S32 u32TaskId)82*4882a593Smuzhiyun RK_S32 test_tde_save_result(TEST_TDE_CTX_S *ctx, TDE_SURFACE_S *pstDst, RK_S32 u32TaskId) {
83*4882a593Smuzhiyun char yuv_out_path[1024] = {0};
84*4882a593Smuzhiyun RK_S32 s32Ret = RK_SUCCESS;
85*4882a593Smuzhiyun PIC_BUF_ATTR_S stPicBufAttr;
86*4882a593Smuzhiyun MB_PIC_CAL_S stMbPicCalResult;
87*4882a593Smuzhiyun MB_BLK dstBlk = pstDst->pMbBlk;
88*4882a593Smuzhiyun RK_VOID *pstFrame = RK_MPI_MB_Handle2VirAddr(dstBlk);
89*4882a593Smuzhiyun stPicBufAttr.u32Width = ctx->stDstSurface.u32Width;
90*4882a593Smuzhiyun stPicBufAttr.u32Height = ctx->stDstSurface.u32Height;
91*4882a593Smuzhiyun stPicBufAttr.enPixelFormat = ctx->stDstSurface.enColorFmt;
92*4882a593Smuzhiyun stPicBufAttr.enCompMode = COMPRESS_MODE_E(ctx->s32DstCompressMode);;
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun s32Ret = RK_MPI_CAL_TDE_GetPicBufferSize(&stPicBufAttr, &stMbPicCalResult);
95*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
96*4882a593Smuzhiyun RK_LOGE("get picture buffer size failed. err 0x%x", s32Ret);
97*4882a593Smuzhiyun return s32Ret;
98*4882a593Smuzhiyun }
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun snprintf(yuv_out_path, sizeof(yuv_out_path), "%s%s_%dx%d_%d.bin",
101*4882a593Smuzhiyun ctx->dstFilePath, test_tde_str_op(ctx->s32Operation),
102*4882a593Smuzhiyun stPicBufAttr.u32Width, stPicBufAttr.u32Height, u32TaskId);
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun FILE *file = fopen(yuv_out_path, "wb+");
105*4882a593Smuzhiyun if (file == RK_NULL) {
106*4882a593Smuzhiyun RK_LOGE("open path %s failed because %s.", yuv_out_path, strerror(errno));
107*4882a593Smuzhiyun return RK_FAILURE;
108*4882a593Smuzhiyun }
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun if (pstFrame) {
111*4882a593Smuzhiyun RK_LOGI("get frame:%p, size:%d, bBlk:%p", pstFrame, stMbPicCalResult.u32MBSize, dstBlk);
112*4882a593Smuzhiyun RK_MPI_SYS_MmzFlushCache(dstBlk, RK_TRUE);
113*4882a593Smuzhiyun fwrite(pstFrame, 1, stMbPicCalResult.u32MBSize, file);
114*4882a593Smuzhiyun fflush(file);
115*4882a593Smuzhiyun }
116*4882a593Smuzhiyun fclose(file);
117*4882a593Smuzhiyun file = NULL;
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun return RK_SUCCESS;
120*4882a593Smuzhiyun }
121*4882a593Smuzhiyun
unit_test_tde_get_size(TEST_TDE_CTX_S * ctx,RK_U32 * u32SrcSize)122*4882a593Smuzhiyun RK_S32 unit_test_tde_get_size(TEST_TDE_CTX_S *ctx, RK_U32 *u32SrcSize) {
123*4882a593Smuzhiyun RK_S32 s32Ret = RK_SUCCESS;
124*4882a593Smuzhiyun PIC_BUF_ATTR_S stPicBufAttr;
125*4882a593Smuzhiyun MB_PIC_CAL_S stMbPicCalResult;
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun stPicBufAttr.u32Width = ctx->stSrcSurface.u32Width;
128*4882a593Smuzhiyun stPicBufAttr.u32Height = ctx->stSrcSurface.u32Height;
129*4882a593Smuzhiyun stPicBufAttr.enPixelFormat = (PIXEL_FORMAT_E)ctx->stSrcSurface.enColorFmt;
130*4882a593Smuzhiyun stPicBufAttr.enCompMode = (COMPRESS_MODE_E)ctx->s32SrcCompressMode;
131*4882a593Smuzhiyun s32Ret = RK_MPI_CAL_TDE_GetPicBufferSize(&stPicBufAttr, &stMbPicCalResult);
132*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
133*4882a593Smuzhiyun RK_LOGE("get picture buffer size failed. err 0x%x", s32Ret);
134*4882a593Smuzhiyun return s32Ret;
135*4882a593Smuzhiyun }
136*4882a593Smuzhiyun *u32SrcSize = stMbPicCalResult.u32MBSize;
137*4882a593Smuzhiyun return s32Ret;
138*4882a593Smuzhiyun }
139*4882a593Smuzhiyun
test_tde_read_file(const char * path,void * pu8SrcData,RK_U32 u32ImgSize)140*4882a593Smuzhiyun RK_S32 test_tde_read_file(const char *path, void *pu8SrcData, RK_U32 u32ImgSize) {
141*4882a593Smuzhiyun FILE *pFile = RK_NULL;
142*4882a593Smuzhiyun RK_S32 s32Ret = RK_SUCCESS;
143*4882a593Smuzhiyun RK_U32 u32ReadSize = 0;
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun pFile = fopen(path, "rb+");
146*4882a593Smuzhiyun if (pFile == RK_NULL) {
147*4882a593Smuzhiyun RK_LOGE("open path %s failed because %s.", path, strerror(errno));
148*4882a593Smuzhiyun return RK_FAILURE;
149*4882a593Smuzhiyun }
150*4882a593Smuzhiyun if (pFile) {
151*4882a593Smuzhiyun u32ReadSize = fread(pu8SrcData, 1, u32ImgSize, pFile);
152*4882a593Smuzhiyun fflush(pFile);
153*4882a593Smuzhiyun fclose(pFile);
154*4882a593Smuzhiyun }
155*4882a593Smuzhiyun return s32Ret;
156*4882a593Smuzhiyun }
157*4882a593Smuzhiyun
test_tde_fill_src(TEST_TDE_CTX_S * ctx,TDE_SURFACE_S * pstSrcSurface,TDE_RECT_S * pstSrcRect)158*4882a593Smuzhiyun RK_S32 test_tde_fill_src(
159*4882a593Smuzhiyun TEST_TDE_CTX_S *ctx, TDE_SURFACE_S *pstSrcSurface, TDE_RECT_S *pstSrcRect) {
160*4882a593Smuzhiyun pstSrcSurface->u32Width = ctx->stSrcSurface.u32Width;
161*4882a593Smuzhiyun pstSrcSurface->u32Height = ctx->stSrcSurface.u32Height;
162*4882a593Smuzhiyun pstSrcSurface->enColorFmt = ctx->stSrcSurface.enColorFmt;
163*4882a593Smuzhiyun pstSrcSurface->enComprocessMode = ctx->stSrcSurface.enComprocessMode;
164*4882a593Smuzhiyun pstSrcRect->s32Xpos = ctx->stSrcRect.s32X;
165*4882a593Smuzhiyun pstSrcRect->s32Ypos = ctx->stSrcRect.s32Y;
166*4882a593Smuzhiyun pstSrcRect->u32Width = ctx->stSrcRect.u32Width;
167*4882a593Smuzhiyun pstSrcRect->u32Height = ctx->stSrcRect.u32Height;
168*4882a593Smuzhiyun return RK_SUCCESS;
169*4882a593Smuzhiyun }
170*4882a593Smuzhiyun
test_tde_fill_dst(TEST_TDE_CTX_S * ctx,TDE_SURFACE_S * pstDstSurface,TDE_RECT_S * pstDstRect)171*4882a593Smuzhiyun RK_S32 test_tde_fill_dst(
172*4882a593Smuzhiyun TEST_TDE_CTX_S *ctx, TDE_SURFACE_S *pstDstSurface, TDE_RECT_S *pstDstRect) {
173*4882a593Smuzhiyun pstDstSurface->u32Width = ctx->stDstSurface.u32Width;
174*4882a593Smuzhiyun pstDstSurface->u32Height = ctx->stDstSurface.u32Height;
175*4882a593Smuzhiyun pstDstSurface->enColorFmt = ctx->stDstSurface.enColorFmt;
176*4882a593Smuzhiyun pstDstSurface->enComprocessMode = ctx->stDstSurface.enComprocessMode;
177*4882a593Smuzhiyun pstDstRect->s32Xpos = ctx->stDstRect.s32X;
178*4882a593Smuzhiyun pstDstRect->s32Ypos = ctx->stDstRect.s32Y;
179*4882a593Smuzhiyun pstDstRect->u32Width = ctx->stDstRect.u32Width;
180*4882a593Smuzhiyun pstDstRect->u32Height = ctx->stDstRect.u32Height;
181*4882a593Smuzhiyun return RK_SUCCESS;
182*4882a593Smuzhiyun }
183*4882a593Smuzhiyun
test_tde_quick_copy_resize_rotate_task(TEST_TDE_CTX_S * ctx,TDE_SURFACE_S * pstSrc,TDE_RECT_S * pstSrcRect,TDE_SURFACE_S * pstDst,TDE_RECT_S * pstDstRect)184*4882a593Smuzhiyun RK_S32 test_tde_quick_copy_resize_rotate_task(TEST_TDE_CTX_S *ctx,
185*4882a593Smuzhiyun TDE_SURFACE_S *pstSrc, TDE_RECT_S *pstSrcRect,
186*4882a593Smuzhiyun TDE_SURFACE_S *pstDst, TDE_RECT_S *pstDstRect) {
187*4882a593Smuzhiyun test_tde_fill_src(ctx, pstSrc, pstSrcRect);
188*4882a593Smuzhiyun test_tde_fill_dst(ctx, pstDst, pstDstRect);
189*4882a593Smuzhiyun return RK_SUCCESS;
190*4882a593Smuzhiyun }
191*4882a593Smuzhiyun
test_tde_quick_fill_task(TEST_TDE_CTX_S * ctx,TDE_SURFACE_S * pstSrc,TDE_SURFACE_S * pstDst,TDE_RECT_S * pstDstRect)192*4882a593Smuzhiyun RK_S32 test_tde_quick_fill_task(TEST_TDE_CTX_S *ctx,
193*4882a593Smuzhiyun TDE_SURFACE_S *pstSrc, TDE_SURFACE_S *pstDst,
194*4882a593Smuzhiyun TDE_RECT_S *pstDstRect) {
195*4882a593Smuzhiyun test_tde_fill_dst(ctx, pstDst, pstDstRect);
196*4882a593Smuzhiyun memcpy(RK_MPI_MB_Handle2VirAddr(pstDst->pMbBlk),
197*4882a593Smuzhiyun RK_MPI_MB_Handle2VirAddr(pstSrc->pMbBlk),
198*4882a593Smuzhiyun RK_MPI_MB_GetSize(pstSrc->pMbBlk));
199*4882a593Smuzhiyun return RK_SUCCESS;
200*4882a593Smuzhiyun }
201*4882a593Smuzhiyun
test_tde_bit_blit_task(TEST_TDE_CTX_S * ctx,TDE_SURFACE_S * pstSrc,TDE_RECT_S * pstSrcRect,TDE_SURFACE_S * pstDst,TDE_RECT_S * pstDstRect,TDE_OPT_S * stOpt,RK_S32 s32Operation)202*4882a593Smuzhiyun RK_S32 test_tde_bit_blit_task(TEST_TDE_CTX_S *ctx,
203*4882a593Smuzhiyun TDE_SURFACE_S *pstSrc, TDE_RECT_S *pstSrcRect,
204*4882a593Smuzhiyun TDE_SURFACE_S *pstDst, TDE_RECT_S *pstDstRect,
205*4882a593Smuzhiyun TDE_OPT_S *stOpt, RK_S32 s32Operation) {
206*4882a593Smuzhiyun if (s32Operation == TDE_OP_MIRROR) {
207*4882a593Smuzhiyun // test case : mirror and clip
208*4882a593Smuzhiyun stOpt->enMirror = (MIRROR_E)ctx->s32Mirror;
209*4882a593Smuzhiyun stOpt->stClipRect.s32Xpos = ctx->stSrcRect.s32X;
210*4882a593Smuzhiyun stOpt->stClipRect.s32Ypos = ctx->stSrcRect.s32Y;
211*4882a593Smuzhiyun stOpt->stClipRect.u32Width = ctx->stSrcRect.u32Width;
212*4882a593Smuzhiyun stOpt->stClipRect.u32Height = ctx->stSrcRect.u32Height;
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun test_tde_fill_src(ctx, pstSrc, pstSrcRect);
215*4882a593Smuzhiyun test_tde_fill_dst(ctx, pstDst, pstDstRect);
216*4882a593Smuzhiyun } else if (s32Operation == TDE_OP_COLOR_KEY) {
217*4882a593Smuzhiyun // test case : colorkey
218*4882a593Smuzhiyun test_tde_fill_src(ctx, pstSrc, pstSrcRect);
219*4882a593Smuzhiyun test_tde_fill_dst(ctx, pstDst, pstDstRect);
220*4882a593Smuzhiyun stOpt->unColorKeyValue = ctx->s32ColorKey;
221*4882a593Smuzhiyun stOpt->enColorKeyMode = TDE_COLORKEY_MODE_FOREGROUND;
222*4882a593Smuzhiyun }
223*4882a593Smuzhiyun return RK_SUCCESS;
224*4882a593Smuzhiyun }
225*4882a593Smuzhiyun
test_tde_add_task(TEST_TDE_CTX_S * ctx,TDE_HANDLE hHandle,TDE_SURFACE_S * pstSrc,TDE_RECT_S * pstSrcRect,TDE_SURFACE_S * pstDst,TDE_RECT_S * pstDstRect)226*4882a593Smuzhiyun RK_S32 test_tde_add_task(TEST_TDE_CTX_S *ctx, TDE_HANDLE hHandle,
227*4882a593Smuzhiyun TDE_SURFACE_S *pstSrc, TDE_RECT_S *pstSrcRect,
228*4882a593Smuzhiyun TDE_SURFACE_S *pstDst, TDE_RECT_S *pstDstRect) {
229*4882a593Smuzhiyun RK_S32 s32Ret = RK_SUCCESS;
230*4882a593Smuzhiyun ROTATION_E enRotateAngle = (ROTATION_E)ctx->s32Rotation;
231*4882a593Smuzhiyun RK_U32 u32FillData = ctx->s32Color;
232*4882a593Smuzhiyun RK_S32 s32Operation = ctx->s32Operation;
233*4882a593Smuzhiyun RK_S32 s32SrcCompressMode = ctx->s32SrcCompressMode;
234*4882a593Smuzhiyun TDE_OPT_S stOpt;
235*4882a593Smuzhiyun memset(&stOpt, 0, sizeof(TDE_OPT_S));
236*4882a593Smuzhiyun
237*4882a593Smuzhiyun switch (s32Operation) {
238*4882a593Smuzhiyun case TDE_OP_QUICK_COPY: {
239*4882a593Smuzhiyun s32Ret = test_tde_quick_copy_resize_rotate_task(ctx,
240*4882a593Smuzhiyun pstSrc, pstSrcRect, pstDst, pstDstRect);
241*4882a593Smuzhiyun s32Ret = RK_TDE_QuickCopy(hHandle,
242*4882a593Smuzhiyun pstSrc, pstSrcRect, pstDst, pstDstRect);
243*4882a593Smuzhiyun } break;
244*4882a593Smuzhiyun case TDE_OP_QUICK_RESIZE: {
245*4882a593Smuzhiyun s32Ret = test_tde_quick_copy_resize_rotate_task(ctx,
246*4882a593Smuzhiyun pstSrc, pstSrcRect, pstDst, pstDstRect);
247*4882a593Smuzhiyun s32Ret = RK_TDE_QuickResize(hHandle,
248*4882a593Smuzhiyun pstSrc, pstSrcRect, pstDst, pstDstRect);
249*4882a593Smuzhiyun } break;
250*4882a593Smuzhiyun case TDE_OP_QUICK_FILL: {
251*4882a593Smuzhiyun s32Ret = test_tde_quick_fill_task(ctx,
252*4882a593Smuzhiyun pstSrc, pstDst, pstDstRect);
253*4882a593Smuzhiyun s32Ret = RK_TDE_QuickFill(hHandle,
254*4882a593Smuzhiyun pstDst, pstDstRect, u32FillData);
255*4882a593Smuzhiyun } break;
256*4882a593Smuzhiyun case TDE_OP_ROTATION: {
257*4882a593Smuzhiyun s32Ret = test_tde_quick_copy_resize_rotate_task(ctx,
258*4882a593Smuzhiyun pstSrc, pstSrcRect, pstDst, pstDstRect);
259*4882a593Smuzhiyun s32Ret = RK_TDE_Rotate(hHandle,
260*4882a593Smuzhiyun pstSrc, pstSrcRect, pstDst, pstDstRect,
261*4882a593Smuzhiyun enRotateAngle);
262*4882a593Smuzhiyun } break;
263*4882a593Smuzhiyun case TDE_OP_COLOR_KEY:
264*4882a593Smuzhiyun case TDE_OP_MIRROR: {
265*4882a593Smuzhiyun s32Ret = test_tde_bit_blit_task(ctx,
266*4882a593Smuzhiyun pstSrc, pstSrcRect, pstDst, pstDstRect,
267*4882a593Smuzhiyun &stOpt, s32Operation);
268*4882a593Smuzhiyun s32Ret = RK_TDE_Bitblit(hHandle,
269*4882a593Smuzhiyun pstDst, pstDstRect, pstSrc, pstSrcRect,
270*4882a593Smuzhiyun pstDst, pstDstRect, &stOpt);
271*4882a593Smuzhiyun } break;
272*4882a593Smuzhiyun default: {
273*4882a593Smuzhiyun RK_LOGE("unknown operation type %d", ctx->s32Operation);
274*4882a593Smuzhiyun break;
275*4882a593Smuzhiyun }
276*4882a593Smuzhiyun }
277*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
278*4882a593Smuzhiyun RK_TDE_CancelJob(hHandle);
279*4882a593Smuzhiyun return RK_FAILURE;
280*4882a593Smuzhiyun }
281*4882a593Smuzhiyun return s32Ret;
282*4882a593Smuzhiyun }
283*4882a593Smuzhiyun
test_tde_load_src_file(TEST_TDE_CTX_S * ctx,MB_BLK * pstSrcBlk)284*4882a593Smuzhiyun RK_S32 test_tde_load_src_file(TEST_TDE_CTX_S *ctx, MB_BLK *pstSrcBlk) {
285*4882a593Smuzhiyun RK_S32 s32Ret = RK_SUCCESS;
286*4882a593Smuzhiyun RK_U32 u32SrcSize = 0;
287*4882a593Smuzhiyun FILE *file = RK_NULL;
288*4882a593Smuzhiyun void *pSrcData = RK_NULL;
289*4882a593Smuzhiyun MB_BLK srcBlk;
290*4882a593Smuzhiyun
291*4882a593Smuzhiyun s32Ret = unit_test_tde_get_size(ctx, &u32SrcSize);
292*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
293*4882a593Smuzhiyun return s32Ret;
294*4882a593Smuzhiyun }
295*4882a593Smuzhiyun
296*4882a593Smuzhiyun s32Ret = RK_MPI_SYS_MmzAlloc(pstSrcBlk, RK_NULL, RK_NULL, u32SrcSize);
297*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
298*4882a593Smuzhiyun return s32Ret;
299*4882a593Smuzhiyun }
300*4882a593Smuzhiyun
301*4882a593Smuzhiyun srcBlk = *pstSrcBlk;
302*4882a593Smuzhiyun
303*4882a593Smuzhiyun pSrcData = RK_MPI_MB_Handle2VirAddr(srcBlk);
304*4882a593Smuzhiyun s32Ret = test_tde_read_file(ctx->srcFilePath, pSrcData, u32SrcSize);
305*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
306*4882a593Smuzhiyun return s32Ret;
307*4882a593Smuzhiyun }
308*4882a593Smuzhiyun RK_MPI_SYS_MmzFlushCache(srcBlk, RK_FALSE);
309*4882a593Smuzhiyun
310*4882a593Smuzhiyun RK_U32 u32SrcVirWidth = ctx->u32SrcVirWidth;
311*4882a593Smuzhiyun PIXEL_FORMAT_E srcFmt = ctx->stSrcSurface.enColorFmt;
312*4882a593Smuzhiyun RK_U32 u32HorStride = RK_MPI_CAL_COMM_GetHorStride(u32SrcVirWidth, srcFmt);
313*4882a593Smuzhiyun RK_U32 u32VerStride = ctx->u32SrcVirHeight;
314*4882a593Smuzhiyun RK_S32 s32SrcCompressMode = ctx->s32SrcCompressMode;
315*4882a593Smuzhiyun if (s32SrcCompressMode != COMPRESS_AFBC_16x16) {
316*4882a593Smuzhiyun s32Ret = RK_MPI_MB_SetBufferStride(srcBlk, u32HorStride, u32VerStride);
317*4882a593Smuzhiyun }
318*4882a593Smuzhiyun return s32Ret;
319*4882a593Smuzhiyun }
320*4882a593Smuzhiyun
test_tde_create_dstBlk(TEST_TDE_CTX_S * ctx,MB_BLK * pstDstBlk)321*4882a593Smuzhiyun RK_S32 test_tde_create_dstBlk(TEST_TDE_CTX_S *ctx, MB_BLK *pstDstBlk) {
322*4882a593Smuzhiyun RK_S32 s32Ret = RK_SUCCESS;
323*4882a593Smuzhiyun PIC_BUF_ATTR_S stPicBufAttr;
324*4882a593Smuzhiyun MB_PIC_CAL_S stMbPicCalResult;
325*4882a593Smuzhiyun
326*4882a593Smuzhiyun stPicBufAttr.u32Width = ctx->stDstSurface.u32Width;
327*4882a593Smuzhiyun stPicBufAttr.u32Height = ctx->stDstSurface.u32Height;
328*4882a593Smuzhiyun stPicBufAttr.enPixelFormat = ctx->stDstSurface.enColorFmt;
329*4882a593Smuzhiyun stPicBufAttr.enCompMode = COMPRESS_MODE_E(ctx->s32DstCompressMode);
330*4882a593Smuzhiyun s32Ret = RK_MPI_CAL_TDE_GetPicBufferSize(&stPicBufAttr, &stMbPicCalResult);
331*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
332*4882a593Smuzhiyun return s32Ret;
333*4882a593Smuzhiyun }
334*4882a593Smuzhiyun s32Ret = RK_MPI_SYS_MmzAlloc(pstDstBlk, RK_NULL, RK_NULL, stMbPicCalResult.u32MBSize);
335*4882a593Smuzhiyun
336*4882a593Smuzhiyun if (ctx->backgroundFile) {
337*4882a593Smuzhiyun void *pDstData = RK_MPI_MB_Handle2VirAddr(*pstDstBlk);
338*4882a593Smuzhiyun test_tde_read_file(ctx->backgroundFile, pDstData, stMbPicCalResult.u32MBSize);
339*4882a593Smuzhiyun RK_MPI_SYS_MmzFlushCache(*pstDstBlk, RK_FALSE);
340*4882a593Smuzhiyun }
341*4882a593Smuzhiyun
342*4882a593Smuzhiyun return s32Ret;
343*4882a593Smuzhiyun }
344*4882a593Smuzhiyun
test_tde_job(TEST_TDE_CTX_S * ctx)345*4882a593Smuzhiyun RK_S32 test_tde_job(TEST_TDE_CTX_S *ctx) {
346*4882a593Smuzhiyun RK_S32 s32Ret = RK_SUCCESS;
347*4882a593Smuzhiyun MB_BLK srcBlk = RK_NULL;
348*4882a593Smuzhiyun MB_BLK dstBlk = RK_NULL;
349*4882a593Smuzhiyun RK_U32 u32TaskIndex = 0;
350*4882a593Smuzhiyun TDE_HANDLE hHandle[TDE_MAX_JOB_NUM];
351*4882a593Smuzhiyun TDE_SURFACE_S pstSrc[TDE_MAX_TASK_NUM];
352*4882a593Smuzhiyun TDE_RECT_S pstSrcRect[TDE_MAX_TASK_NUM];
353*4882a593Smuzhiyun TDE_SURFACE_S pstDst[TDE_MAX_TASK_NUM];
354*4882a593Smuzhiyun TDE_RECT_S pstDstRect[TDE_MAX_TASK_NUM];
355*4882a593Smuzhiyun
356*4882a593Smuzhiyun s32Ret = test_tde_load_src_file(ctx, &srcBlk);
357*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
358*4882a593Smuzhiyun goto __FAILED;
359*4882a593Smuzhiyun }
360*4882a593Smuzhiyun
361*4882a593Smuzhiyun s32Ret = test_tde_create_dstBlk(ctx, &dstBlk);
362*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
363*4882a593Smuzhiyun goto __FAILED;
364*4882a593Smuzhiyun }
365*4882a593Smuzhiyun
366*4882a593Smuzhiyun for (RK_S32 u32JobIdx = 0; u32JobIdx < ctx->s32JobNum; u32JobIdx++) {
367*4882a593Smuzhiyun hHandle[u32JobIdx] = RK_TDE_BeginJob();
368*4882a593Smuzhiyun if (RK_ERR_TDE_INVALID_HANDLE == hHandle[u32JobIdx]) {
369*4882a593Smuzhiyun RK_LOGE("start job fail");
370*4882a593Smuzhiyun goto __FAILED;
371*4882a593Smuzhiyun }
372*4882a593Smuzhiyun for (u32TaskIndex = 0; u32TaskIndex < ctx->s32TaskNum; u32TaskIndex++) {
373*4882a593Smuzhiyun pstSrc[u32TaskIndex].pMbBlk = srcBlk;
374*4882a593Smuzhiyun pstDst[u32TaskIndex].pMbBlk = dstBlk;
375*4882a593Smuzhiyun s32Ret = test_tde_add_task(ctx, hHandle[u32JobIdx],
376*4882a593Smuzhiyun &pstSrc[u32TaskIndex], &pstSrcRect[u32TaskIndex],
377*4882a593Smuzhiyun &pstDst[u32TaskIndex], &pstDstRect[u32TaskIndex]);
378*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
379*4882a593Smuzhiyun goto __FAILED;
380*4882a593Smuzhiyun }
381*4882a593Smuzhiyun }
382*4882a593Smuzhiyun s32Ret = RK_TDE_EndJob(hHandle[u32JobIdx], RK_FALSE, RK_TRUE, 10);
383*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
384*4882a593Smuzhiyun RK_TDE_CancelJob(hHandle[u32JobIdx]);
385*4882a593Smuzhiyun goto __FAILED;
386*4882a593Smuzhiyun }
387*4882a593Smuzhiyun RK_TDE_WaitForDone(hHandle[u32JobIdx]);
388*4882a593Smuzhiyun }
389*4882a593Smuzhiyun
390*4882a593Smuzhiyun for (RK_S32 u32TaskIdx = 0; u32TaskIdx < ctx->s32TaskNum; u32TaskIdx++) {
391*4882a593Smuzhiyun s32Ret = test_tde_save_result(ctx, &(pstDst[u32TaskIdx]), u32TaskIdx);
392*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
393*4882a593Smuzhiyun goto __FAILED;
394*4882a593Smuzhiyun }
395*4882a593Smuzhiyun }
396*4882a593Smuzhiyun
397*4882a593Smuzhiyun __FAILED:
398*4882a593Smuzhiyun if (dstBlk) {
399*4882a593Smuzhiyun RK_MPI_SYS_Free(dstBlk);
400*4882a593Smuzhiyun }
401*4882a593Smuzhiyun
402*4882a593Smuzhiyun if (srcBlk) {
403*4882a593Smuzhiyun RK_MPI_SYS_Free(srcBlk);
404*4882a593Smuzhiyun }
405*4882a593Smuzhiyun return s32Ret;
406*4882a593Smuzhiyun }
407*4882a593Smuzhiyun
unit_test_mpi_tde(TEST_TDE_CTX_S * ctx)408*4882a593Smuzhiyun RK_S32 unit_test_mpi_tde(TEST_TDE_CTX_S *ctx) {
409*4882a593Smuzhiyun RK_S32 s32Ret = RK_SUCCESS;
410*4882a593Smuzhiyun
411*4882a593Smuzhiyun s32Ret = RK_TDE_Open();
412*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
413*4882a593Smuzhiyun return RK_FAILURE;
414*4882a593Smuzhiyun }
415*4882a593Smuzhiyun for (RK_S32 i = 0; i < ctx->s32LoopCount; i++) {
416*4882a593Smuzhiyun s32Ret = test_tde_job(ctx);
417*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
418*4882a593Smuzhiyun return s32Ret;
419*4882a593Smuzhiyun }
420*4882a593Smuzhiyun RK_LOGI("Running mpi tde test loop count %d.", i + 1);
421*4882a593Smuzhiyun }
422*4882a593Smuzhiyun RK_TDE_Close();
423*4882a593Smuzhiyun return s32Ret;
424*4882a593Smuzhiyun }
425*4882a593Smuzhiyun
test_tde_set_default_parameter(TEST_TDE_CTX_S * ctx)426*4882a593Smuzhiyun RK_S32 test_tde_set_default_parameter(TEST_TDE_CTX_S *ctx) {
427*4882a593Smuzhiyun if (ctx->stSrcRect.u32Width == 0) {
428*4882a593Smuzhiyun ctx->stSrcRect.u32Width = ctx->stSrcSurface.u32Width;
429*4882a593Smuzhiyun }
430*4882a593Smuzhiyun if (ctx->stSrcRect.u32Height == 0) {
431*4882a593Smuzhiyun ctx->stSrcRect.u32Height = ctx->stSrcSurface.u32Height;
432*4882a593Smuzhiyun }
433*4882a593Smuzhiyun if (ctx->stDstRect.u32Width == 0) {
434*4882a593Smuzhiyun ctx->stDstRect.u32Width = ctx->stDstSurface.u32Width;
435*4882a593Smuzhiyun }
436*4882a593Smuzhiyun if (ctx->stDstRect.u32Height == 0) {
437*4882a593Smuzhiyun ctx->stDstRect.u32Height = ctx->stDstSurface.u32Height;
438*4882a593Smuzhiyun }
439*4882a593Smuzhiyun if (ctx->u32SrcVirWidth == 0) {
440*4882a593Smuzhiyun ctx->u32SrcVirWidth = ctx->stSrcSurface.u32Width;
441*4882a593Smuzhiyun }
442*4882a593Smuzhiyun if (ctx->u32SrcVirHeight == 0) {
443*4882a593Smuzhiyun ctx->u32SrcVirHeight = ctx->stSrcSurface.u32Height;
444*4882a593Smuzhiyun }
445*4882a593Smuzhiyun return RK_SUCCESS;
446*4882a593Smuzhiyun }
447*4882a593Smuzhiyun
test_tde_set_proc_parameter(TEST_TDE_CTX_S * ctx,TEST_TDE_PROC_CTX_S * tdeTestCtx)448*4882a593Smuzhiyun RK_S32 test_tde_set_proc_parameter(TEST_TDE_CTX_S *ctx, TEST_TDE_PROC_CTX_S *tdeTestCtx) {
449*4882a593Smuzhiyun memset(tdeTestCtx, 0, sizeof(TEST_TDE_PROC_CTX_S));
450*4882a593Smuzhiyun tdeTestCtx->pstSrc.u32Width = ctx->stSrcSurface.u32Width;
451*4882a593Smuzhiyun tdeTestCtx->pstSrc.u32Height = ctx->stSrcSurface.u32Height;
452*4882a593Smuzhiyun tdeTestCtx->pstSrc.enColorFmt = ctx->stSrcSurface.enColorFmt;
453*4882a593Smuzhiyun tdeTestCtx->pstSrcRect.s32Xpos = ctx->stSrcRect.s32X;
454*4882a593Smuzhiyun tdeTestCtx->pstSrcRect.s32Ypos = ctx->stSrcRect.s32Y;
455*4882a593Smuzhiyun tdeTestCtx->pstSrcRect.u32Width = ctx->stSrcRect.u32Width;
456*4882a593Smuzhiyun tdeTestCtx->pstSrcRect.u32Height = ctx->stSrcRect.u32Height;
457*4882a593Smuzhiyun tdeTestCtx->pstDst.u32Width = ctx->stDstSurface.u32Width;
458*4882a593Smuzhiyun tdeTestCtx->pstDst.u32Height = ctx->stDstSurface.u32Height;
459*4882a593Smuzhiyun tdeTestCtx->pstDst.enColorFmt = ctx->stDstSurface.enColorFmt;
460*4882a593Smuzhiyun tdeTestCtx->pstDstRect.s32Xpos = ctx->stDstRect.s32X;
461*4882a593Smuzhiyun tdeTestCtx->pstDstRect.s32Ypos = ctx->stDstRect.s32Y;
462*4882a593Smuzhiyun tdeTestCtx->pstDstRect.u32Width = ctx->stDstRect.u32Width;
463*4882a593Smuzhiyun tdeTestCtx->pstDstRect.u32Height = ctx->stDstRect.u32Height;
464*4882a593Smuzhiyun tdeTestCtx->opType = ctx->s32Operation;
465*4882a593Smuzhiyun tdeTestCtx->s32ProcessTimes = ctx->s32ProcessTime;
466*4882a593Smuzhiyun tdeTestCtx->s32JobNum = ctx->s32JobNum;
467*4882a593Smuzhiyun tdeTestCtx->s32TaskNum = ctx->s32TaskNum;
468*4882a593Smuzhiyun return RK_SUCCESS;
469*4882a593Smuzhiyun }
470*4882a593Smuzhiyun
471*4882a593Smuzhiyun
472*4882a593Smuzhiyun static const char *const usages[] = {
473*4882a593Smuzhiyun "./rk_mpi_tde_test [-i SRC_PATH] [-w SRC_WIDTH] [-h SRC_HEIGHT] [-W DST_WIDTH] [-H DST_HEIGHT]...",
474*4882a593Smuzhiyun NULL,
475*4882a593Smuzhiyun };
476*4882a593Smuzhiyun
mpi_tde_test_show_options(const TEST_TDE_CTX_S * ctx)477*4882a593Smuzhiyun static void mpi_tde_test_show_options(const TEST_TDE_CTX_S *ctx) {
478*4882a593Smuzhiyun RK_PRINT("cmd parse result: \n");
479*4882a593Smuzhiyun RK_PRINT("input file name : %s\n", ctx->srcFilePath);
480*4882a593Smuzhiyun RK_PRINT("output file name : %s\n", ctx->dstFilePath);
481*4882a593Smuzhiyun RK_PRINT("loop count : %d\n", ctx->s32LoopCount);
482*4882a593Smuzhiyun RK_PRINT("job number : %d\n", ctx->s32JobNum);
483*4882a593Smuzhiyun RK_PRINT("task number : %d\n", ctx->s32TaskNum);
484*4882a593Smuzhiyun RK_PRINT("input width : %d\n", ctx->stSrcSurface.u32Width);
485*4882a593Smuzhiyun RK_PRINT("input height : %d\n", ctx->stSrcSurface.u32Height);
486*4882a593Smuzhiyun RK_PRINT("input vir width : %d\n", ctx->u32SrcVirWidth);
487*4882a593Smuzhiyun RK_PRINT("input vir height : %d\n", ctx->u32SrcVirHeight);
488*4882a593Smuzhiyun RK_PRINT("src compress mode : %d\n", ctx->s32SrcCompressMode);
489*4882a593Smuzhiyun RK_PRINT("dst compress mode : %d\n", ctx->s32DstCompressMode);
490*4882a593Smuzhiyun RK_PRINT("input pixel format : %d\n", ctx->stSrcSurface.enColorFmt);
491*4882a593Smuzhiyun RK_PRINT("output width : %d\n", ctx->stDstSurface.u32Width);
492*4882a593Smuzhiyun RK_PRINT("output height : %d\n", ctx->stDstSurface.u32Height);
493*4882a593Smuzhiyun RK_PRINT("output pixel format : %d\n", ctx->stDstSurface.enColorFmt);
494*4882a593Smuzhiyun RK_PRINT("operation type : %d\n", ctx->s32Operation);
495*4882a593Smuzhiyun }
496*4882a593Smuzhiyun
main(int argc,const char ** argv)497*4882a593Smuzhiyun int main(int argc, const char **argv) {
498*4882a593Smuzhiyun TEST_TDE_CTX_S ctx;
499*4882a593Smuzhiyun RK_S32 s32Ret = RK_SUCCESS;
500*4882a593Smuzhiyun
501*4882a593Smuzhiyun memset(&ctx, 0, sizeof(TEST_TDE_CTX_S));
502*4882a593Smuzhiyun
503*4882a593Smuzhiyun // set default params.
504*4882a593Smuzhiyun ctx.dstFilePath = RK_NULL;
505*4882a593Smuzhiyun ctx.s32LoopCount = 1;
506*4882a593Smuzhiyun ctx.s32JobNum = 1;
507*4882a593Smuzhiyun ctx.s32TaskNum = 1;
508*4882a593Smuzhiyun ctx.s32Operation = 0;
509*4882a593Smuzhiyun ctx.stSrcSurface.enColorFmt = RK_FMT_YUV420SP;
510*4882a593Smuzhiyun ctx.stSrcSurface.enComprocessMode = COMPRESS_MODE_NONE;
511*4882a593Smuzhiyun ctx.stDstSurface.enColorFmt = RK_FMT_YUV420SP;
512*4882a593Smuzhiyun ctx.stDstSurface.enComprocessMode = COMPRESS_MODE_NONE;
513*4882a593Smuzhiyun ctx.bPerformace = RK_FALSE;
514*4882a593Smuzhiyun ctx.s32ProcessTime = 800;
515*4882a593Smuzhiyun
516*4882a593Smuzhiyun struct argparse_option options[] = {
517*4882a593Smuzhiyun OPT_HELP(),
518*4882a593Smuzhiyun OPT_GROUP("basic options:"),
519*4882a593Smuzhiyun OPT_STRING('i', "input", &(ctx.srcFilePath),
520*4882a593Smuzhiyun "input file name. e.g.(/userdata/1080p.nv12). <required>", NULL, 0, 0),
521*4882a593Smuzhiyun OPT_INTEGER('w', "src_width", &(ctx.stSrcSurface.u32Width),
522*4882a593Smuzhiyun "src width. e.g.(1920). <required>", NULL, 0, 0),
523*4882a593Smuzhiyun OPT_INTEGER('h', "src_height", &(ctx.stSrcSurface.u32Height),
524*4882a593Smuzhiyun "src height. e.g.(1080). <required>", NULL, 0, 0),
525*4882a593Smuzhiyun OPT_INTEGER('\0', "src_vir_width", &(ctx.u32SrcVirWidth),
526*4882a593Smuzhiyun "src vir width. e.g.(1920).", NULL, 0, 0),
527*4882a593Smuzhiyun OPT_INTEGER('\0', "src_vir_height", &(ctx.u32SrcVirHeight),
528*4882a593Smuzhiyun "src vir height. e.g.(1080).", NULL, 0, 0),
529*4882a593Smuzhiyun OPT_INTEGER('\0', "src_compress", &(ctx.s32SrcCompressMode),
530*4882a593Smuzhiyun "src compress mode. e.g.(1).", NULL, 0, 0),
531*4882a593Smuzhiyun OPT_INTEGER('W', "dst_width", &(ctx.stDstSurface.u32Width),
532*4882a593Smuzhiyun "dst width. e.g.(1920). <required>", NULL, 0, 0),
533*4882a593Smuzhiyun OPT_INTEGER('H', "dst_height", &(ctx.stDstSurface.u32Height),
534*4882a593Smuzhiyun "dst height. e.g.(1080). <required>", NULL, 0, 0),
535*4882a593Smuzhiyun OPT_INTEGER('\0', "dst_compress", &(ctx.s32DstCompressMode),
536*4882a593Smuzhiyun "dst compress mode. e.g.(1).", NULL, 0, 0),
537*4882a593Smuzhiyun OPT_STRING('o', "output", &(ctx.dstFilePath),
538*4882a593Smuzhiyun "output file path. e.g.(/userdata/tde/). default(NULL).", NULL, 0, 0),
539*4882a593Smuzhiyun OPT_STRING('\0', "background", &(ctx.backgroundFile),
540*4882a593Smuzhiyun "background file. e.g.(/userdata/tde/xxx.bin). default(NULL).", NULL, 0, 0),
541*4882a593Smuzhiyun OPT_INTEGER('n', "loop_count", &(ctx.s32LoopCount),
542*4882a593Smuzhiyun "loop running count. can be any count. default(1)", NULL, 0, 0),
543*4882a593Smuzhiyun OPT_INTEGER('j', "job_number", &(ctx.s32JobNum),
544*4882a593Smuzhiyun "the job number of vgs. default(1).", NULL, 0, 0),
545*4882a593Smuzhiyun OPT_INTEGER('t', "task_number", &(ctx.s32TaskNum),
546*4882a593Smuzhiyun "the task number of one job. default(1).", NULL, 0, 0),
547*4882a593Smuzhiyun OPT_INTEGER('f', "src_format", &(ctx.stSrcSurface.enColorFmt),
548*4882a593Smuzhiyun "src pixel format. default(0. 0 is NV12).", NULL, 0, 0),
549*4882a593Smuzhiyun OPT_INTEGER('F', "dst_format", &(ctx.stDstSurface.enColorFmt),
550*4882a593Smuzhiyun "dst pixel format. default(0. 0 is NV12).", NULL, 0, 0),
551*4882a593Smuzhiyun OPT_INTEGER('p', "operation", &(ctx.s32Operation),
552*4882a593Smuzhiyun "operation type. default(0).\n\t\t\t\t\t0: quick copy.\n\t\t\t\t\t1: quick resize."
553*4882a593Smuzhiyun "\n\t\t\t\t\t2: quick fill.\n\t\t\t\t\t3: rotation.\n\t\t\t\t\t4: mirror and flip."
554*4882a593Smuzhiyun "\n\t\t\t\t\t5: colorkey.", NULL, 0, 0),
555*4882a593Smuzhiyun OPT_INTEGER('\0', "src_rect_x", &(ctx.stSrcRect.s32X),
556*4882a593Smuzhiyun "src rect x. default(0).", NULL, 0, 0),
557*4882a593Smuzhiyun OPT_INTEGER('\0', "src_rect_y", &(ctx.stSrcRect.s32Y),
558*4882a593Smuzhiyun "src rect y. default(0).", NULL, 0, 0),
559*4882a593Smuzhiyun OPT_INTEGER('\0', "src_rect_w", &(ctx.stSrcRect.u32Width),
560*4882a593Smuzhiyun "src rect width. default(src_width).", NULL, 0, 0),
561*4882a593Smuzhiyun OPT_INTEGER('\0', "src_rect_h", &(ctx.stSrcRect.u32Height),
562*4882a593Smuzhiyun "src rect height. default(src_height).", NULL, 0, 0),
563*4882a593Smuzhiyun OPT_INTEGER('\0', "dst_rect_x", &(ctx.stDstRect.s32X),
564*4882a593Smuzhiyun "dst rect x. default(0).", NULL, 0, 0),
565*4882a593Smuzhiyun OPT_INTEGER('\0', "dst_rect_y", &(ctx.stDstRect.s32Y),
566*4882a593Smuzhiyun "dst rect y. default(0).", NULL, 0, 0),
567*4882a593Smuzhiyun OPT_INTEGER('\0', "dst_rect_w", &(ctx.stDstRect.u32Width),
568*4882a593Smuzhiyun "dst rect width. default(dst_width).", NULL, 0, 0),
569*4882a593Smuzhiyun OPT_INTEGER('\0', "dst_rect_h", &(ctx.stDstRect.u32Height),
570*4882a593Smuzhiyun "dst rect height. default(dst_height).", NULL, 0, 0),
571*4882a593Smuzhiyun OPT_INTEGER('\0', "performace", &(ctx.bPerformace),
572*4882a593Smuzhiyun "test performace mode. default(0).", NULL, 0, 0),
573*4882a593Smuzhiyun OPT_INTEGER('\0', "proc_time", &(ctx.s32ProcessTime),
574*4882a593Smuzhiyun "ProcessTime. default(800).", NULL, 0, 0),
575*4882a593Smuzhiyun OPT_INTEGER('\0', "colorkey", &(ctx.s32ColorKey),
576*4882a593Smuzhiyun "colorkey value. default(0).", NULL, 0, 0),
577*4882a593Smuzhiyun OPT_INTEGER('c', "fill color", &(ctx.s32Color),
578*4882a593Smuzhiyun "fill color. default(0).", NULL, 0, 0),
579*4882a593Smuzhiyun OPT_INTEGER('r', "rotation", &(ctx.s32Rotation),
580*4882a593Smuzhiyun "rotation angle. default(0). 0: 0. 1: 90. 2: 180. 3: 270", NULL, 0, 0),
581*4882a593Smuzhiyun OPT_INTEGER('m', "mirror", &(ctx.s32Mirror),
582*4882a593Smuzhiyun "mirror or flip. default(0). 0: none. 1: flip. 2: mirror. 3: both", NULL, 0, 0),
583*4882a593Smuzhiyun OPT_END(),
584*4882a593Smuzhiyun };
585*4882a593Smuzhiyun
586*4882a593Smuzhiyun struct argparse argparse;
587*4882a593Smuzhiyun argparse_init(&argparse, options, usages, 0);
588*4882a593Smuzhiyun argparse_describe(&argparse, "\nselect a test case to run.",
589*4882a593Smuzhiyun "\nuse --help for details.");
590*4882a593Smuzhiyun
591*4882a593Smuzhiyun argc = argparse_parse(&argparse, argc, argv);
592*4882a593Smuzhiyun
593*4882a593Smuzhiyun test_tde_set_default_parameter(&ctx);
594*4882a593Smuzhiyun mpi_tde_test_show_options(&ctx);
595*4882a593Smuzhiyun
596*4882a593Smuzhiyun if (ctx.stSrcSurface.u32Width <= 0
597*4882a593Smuzhiyun || ctx.stSrcSurface.u32Height <= 0
598*4882a593Smuzhiyun || ctx.stDstSurface.u32Width <= 0
599*4882a593Smuzhiyun || ctx.stDstSurface.u32Height <= 0) {
600*4882a593Smuzhiyun argparse_usage(&argparse);
601*4882a593Smuzhiyun goto __FAILED;
602*4882a593Smuzhiyun }
603*4882a593Smuzhiyun
604*4882a593Smuzhiyun s32Ret = RK_MPI_SYS_Init();
605*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
606*4882a593Smuzhiyun goto __FAILED;
607*4882a593Smuzhiyun }
608*4882a593Smuzhiyun
609*4882a593Smuzhiyun if (ctx.bPerformace) {
610*4882a593Smuzhiyun TEST_TDE_PROC_CTX_S tdeTestCtx;
611*4882a593Smuzhiyun test_tde_set_proc_parameter(&ctx, &tdeTestCtx);
612*4882a593Smuzhiyun s32Ret = TEST_TDE_MultiTest(&tdeTestCtx);
613*4882a593Smuzhiyun } else {
614*4882a593Smuzhiyun s32Ret = unit_test_mpi_tde(&ctx);
615*4882a593Smuzhiyun }
616*4882a593Smuzhiyun
617*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
618*4882a593Smuzhiyun goto __FAILED;
619*4882a593Smuzhiyun }
620*4882a593Smuzhiyun
621*4882a593Smuzhiyun s32Ret = RK_MPI_SYS_Exit();
622*4882a593Smuzhiyun if (s32Ret != RK_SUCCESS) {
623*4882a593Smuzhiyun goto __FAILED;
624*4882a593Smuzhiyun }
625*4882a593Smuzhiyun
626*4882a593Smuzhiyun RK_LOGI("test running ok!");
627*4882a593Smuzhiyun return 0;
628*4882a593Smuzhiyun __FAILED:
629*4882a593Smuzhiyun RK_LOGI("test runnning failed!");
630*4882a593Smuzhiyun return -1;
631*4882a593Smuzhiyun }
632*4882a593Smuzhiyun
633