xref: /OK3568_Linux_fs/external/rockit/mpi/example/common/test_comm_avs.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: 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 #include <random>
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun #ifdef __cplusplus
20*4882a593Smuzhiyun #if __cplusplus
21*4882a593Smuzhiyun extern "C" {
22*4882a593Smuzhiyun #endif
23*4882a593Smuzhiyun #endif /* End of #ifdef __cplusplus */
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #include <string.h>
26*4882a593Smuzhiyun #include <stdlib.h>
27*4882a593Smuzhiyun #include <unistd.h>
28*4882a593Smuzhiyun #include <string>
29*4882a593Smuzhiyun #include <pthread.h>
30*4882a593Smuzhiyun #include <unistd.h>
31*4882a593Smuzhiyun #include <sys/stat.h>
32*4882a593Smuzhiyun #include <sys/types.h>
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun #include "rk_debug.h"
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun #include "test_common.h"
37*4882a593Smuzhiyun #include "test_comm_avs.h"
38*4882a593Smuzhiyun #include "test_comm_sys.h"
39*4882a593Smuzhiyun #include "test_comm_imgproc.h"
40*4882a593Smuzhiyun #include "test_comm_utils.h"
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun #include "rk_mpi_avs.h"
43*4882a593Smuzhiyun #include "rk_mpi_cal.h"
44*4882a593Smuzhiyun #include "rk_mpi_mb.h"
45*4882a593Smuzhiyun #include "rk_mpi_mmz.h"
46*4882a593Smuzhiyun #include "rk_mpi_sys.h"
47*4882a593Smuzhiyun 
TEST_AVS_Start(AVS_GRP AvsGrp,RK_U32 s32ChnNum,AVS_GRP_ATTR_S * pstAvsGrpAttr,AVS_CHN_ATTR_S * pstAvsChnAttr)48*4882a593Smuzhiyun RK_S32 TEST_AVS_Start(
49*4882a593Smuzhiyun         AVS_GRP AvsGrp,
50*4882a593Smuzhiyun         RK_U32 s32ChnNum,
51*4882a593Smuzhiyun         AVS_GRP_ATTR_S *pstAvsGrpAttr,
52*4882a593Smuzhiyun         AVS_CHN_ATTR_S *pstAvsChnAttr) {
53*4882a593Smuzhiyun     AVS_CHN AvsChn = 0;
54*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun     s32Ret = RK_MPI_AVS_CreateGrp(AvsGrp, pstAvsGrpAttr);
57*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
58*4882a593Smuzhiyun         RK_LOGE("avs [%d, %d] RK_MPI_AVS_CreateGrp failed: %#x!",
59*4882a593Smuzhiyun                 AvsGrp, 0, s32Ret);
60*4882a593Smuzhiyun         return s32Ret;
61*4882a593Smuzhiyun     }
62*4882a593Smuzhiyun     RK_LOGV("avs [%d, %d] RK_MPI_AVS_CreateGrp already.", AvsGrp, 0);
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun     for (AvsChn = 0; AvsChn < s32ChnNum; AvsChn++) {
65*4882a593Smuzhiyun         s32Ret = RK_MPI_AVS_SetChnAttr(AvsGrp, AvsChn, &pstAvsChnAttr[AvsChn]);
66*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
67*4882a593Smuzhiyun             RK_LOGE("avs [%d, %d]RK_MPI_AVS_SetChnAttr failed: %#x!",
68*4882a593Smuzhiyun                     AvsGrp, AvsChn, s32Ret);
69*4882a593Smuzhiyun             return s32Ret;
70*4882a593Smuzhiyun         }
71*4882a593Smuzhiyun         RK_LOGV("avs [%d, %d] RK_MPI_AVS_SetChnAttr already.", AvsGrp, AvsChn);
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun         s32Ret = RK_MPI_AVS_EnableChn(AvsGrp, AvsChn);
74*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
75*4882a593Smuzhiyun             RK_LOGE("RK_MPI_AVS_EnableChn failed: %#x!", AvsChn, s32Ret);
76*4882a593Smuzhiyun             return s32Ret;
77*4882a593Smuzhiyun         }
78*4882a593Smuzhiyun         RK_LOGV("avs [%d, %d] RK_MPI_AVS_EnableChn already.", AvsGrp, AvsChn);
79*4882a593Smuzhiyun     }
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun     s32Ret = RK_MPI_AVS_StartGrp(AvsGrp);
82*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
83*4882a593Smuzhiyun         RK_LOGE("RK_MPI_AVS_StartGrp failed: %#x!", AvsGrp, s32Ret);
84*4882a593Smuzhiyun         return s32Ret;
85*4882a593Smuzhiyun     }
86*4882a593Smuzhiyun     RK_LOGV("avs [%d, %d] RK_MPI_AVS_StartGrp already.", AvsGrp, 0);
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun     s32Ret = RK_MPI_AVS_ResetGrp(AvsGrp);
90*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
91*4882a593Smuzhiyun         RK_LOGE("RK_MPI_AVS_ResetGrp failed: %#x!", AvsGrp, s32Ret);
92*4882a593Smuzhiyun         return s32Ret;
93*4882a593Smuzhiyun     }
94*4882a593Smuzhiyun     RK_LOGV("avs [%d, %d] RK_MPI_AVS_ResetGrp already.", AvsGrp, 0);
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun     return s32Ret;
97*4882a593Smuzhiyun }
98*4882a593Smuzhiyun 
TEST_AVS_Stop(AVS_GRP AvsGrp,RK_U32 s32ChnNum)99*4882a593Smuzhiyun RK_S32 TEST_AVS_Stop(AVS_GRP AvsGrp, RK_U32 s32ChnNum) {
100*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
101*4882a593Smuzhiyun     AVS_CHN AvsChn = 0;
102*4882a593Smuzhiyun     AVS_GRP_ATTR_S tmpGrpAttr;
103*4882a593Smuzhiyun     MB_BLK tmpLutBlk;
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun     for (AvsChn = 0; AvsChn < s32ChnNum; AvsChn++) {
106*4882a593Smuzhiyun         s32Ret = RK_MPI_AVS_DisableChn(AvsGrp, AvsChn);
107*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
108*4882a593Smuzhiyun             RK_LOGE("avs [%d, %d] RK_MPI_AVS_DisableChn failed: %#x!!",
109*4882a593Smuzhiyun                 AvsGrp, AvsChn, s32Ret);
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun             goto __FAILED;
112*4882a593Smuzhiyun         }
113*4882a593Smuzhiyun         RK_LOGV("avs [%d, %d] RK_MPI_AVS_DisableChn already.", AvsGrp, AvsChn);
114*4882a593Smuzhiyun     }
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun     s32Ret = RK_MPI_AVS_GetGrpAttr(AvsGrp, &tmpGrpAttr);
117*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
118*4882a593Smuzhiyun         RK_LOGE("avs [%d, %d] RK_MPI_AVS_GetGrpAttr failed: %#x!!",
119*4882a593Smuzhiyun                 AvsGrp, 0, s32Ret);
120*4882a593Smuzhiyun         goto __FAILED;
121*4882a593Smuzhiyun     }
122*4882a593Smuzhiyun     RK_LOGV("avs [%d, %d] RK_MPI_AVS_GetGrpAttr already.", AvsGrp, 0);
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun     for (RK_S32 AvsPipe = 0; AvsPipe < tmpGrpAttr.u32PipeNum; AvsPipe++) {
125*4882a593Smuzhiyun         if (AVS_MODE_BLEND == tmpGrpAttr.enMode &&
126*4882a593Smuzhiyun             AVS_PARAM_SOURCE_LUT == tmpGrpAttr.stInAttr.enParamSource &&
127*4882a593Smuzhiyun             tmpGrpAttr.stInAttr.stLUT.pVirAddr[AvsPipe]) {
128*4882a593Smuzhiyun             tmpLutBlk = RK_MPI_MB_VirAddr2Handle(tmpGrpAttr.stInAttr.stLUT.pVirAddr[AvsPipe]);
129*4882a593Smuzhiyun             if (tmpLutBlk) {
130*4882a593Smuzhiyun                 s32Ret = RK_MPI_MB_ReleaseMB(tmpLutBlk);
131*4882a593Smuzhiyun                 if (s32Ret != RK_SUCCESS) {
132*4882a593Smuzhiyun                     RK_LOGE("avs [%d, %d] release Lut Blk %p virAddr %p failed: %#x!!",
133*4882a593Smuzhiyun                         AvsGrp, AvsPipe, tmpLutBlk,
134*4882a593Smuzhiyun                         tmpGrpAttr.stInAttr.stLUT.pVirAddr[AvsPipe], s32Ret);
135*4882a593Smuzhiyun                 }
136*4882a593Smuzhiyun                 RK_LOGV("avs [%d, %d] release Lut Blk %p virAddr %p already.",
137*4882a593Smuzhiyun                         AvsGrp, AvsPipe, tmpLutBlk,
138*4882a593Smuzhiyun                         tmpGrpAttr.stInAttr.stLUT.pVirAddr[AvsPipe]);
139*4882a593Smuzhiyun                 tmpGrpAttr.stInAttr.stLUT.pVirAddr[AvsPipe] = RK_NULL;
140*4882a593Smuzhiyun                 tmpLutBlk = RK_NULL;
141*4882a593Smuzhiyun             }
142*4882a593Smuzhiyun         }
143*4882a593Smuzhiyun     }
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun     s32Ret = RK_MPI_AVS_StopGrp(AvsGrp);
146*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
147*4882a593Smuzhiyun         RK_LOGE("avs [%d, %d] RK_MPI_AVS_StopGrp failed: %#x!!",
148*4882a593Smuzhiyun                 AvsGrp, 0, s32Ret);
149*4882a593Smuzhiyun         goto __FAILED;
150*4882a593Smuzhiyun     }
151*4882a593Smuzhiyun     RK_LOGV("avs [%d, %d] RK_MPI_AVS_StopGrp already.", AvsGrp, 0);
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun     s32Ret = RK_MPI_AVS_DestroyGrp(AvsGrp);
154*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
155*4882a593Smuzhiyun         RK_LOGE("avs [%d, %d] RK_MPI_AVS_DestroyGrp failed: %#x!!",
156*4882a593Smuzhiyun                 AvsGrp, 0, s32Ret);
157*4882a593Smuzhiyun         goto __FAILED;
158*4882a593Smuzhiyun     }
159*4882a593Smuzhiyun     RK_LOGV("avs [%d, %d] RK_MPI_AVS_DestroyGrp already.", AvsGrp, 0);
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun __FAILED:
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun     return s32Ret;
164*4882a593Smuzhiyun }
165*4882a593Smuzhiyun 
TEST_AVS_ModCreateFramePool(TEST_AVS_CTX_S * pstCtx)166*4882a593Smuzhiyun RK_S32 TEST_AVS_ModCreateFramePool(TEST_AVS_CTX_S *pstCtx) {
167*4882a593Smuzhiyun     RK_S32   s32Ret  = RK_SUCCESS;
168*4882a593Smuzhiyun     MB_POOL_CONFIG_S     stMbPoolCfg;
169*4882a593Smuzhiyun     PIC_BUF_ATTR_S       stPicBufAttr;
170*4882a593Smuzhiyun     MB_PIC_CAL_S         stMbPicCalResult;
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun     stPicBufAttr.u32Width      = pstCtx->u32SrcWidth;
173*4882a593Smuzhiyun     stPicBufAttr.u32Height     = pstCtx->u32SrcHeight;
174*4882a593Smuzhiyun     stPicBufAttr.enCompMode    = pstCtx->enSrcCompressMode;
175*4882a593Smuzhiyun     stPicBufAttr.enPixelFormat = pstCtx->enSrcPixFormat;
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun     s32Ret = RK_MPI_CAL_COMM_GetPicBufferSize(&stPicBufAttr, &stMbPicCalResult);
178*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
179*4882a593Smuzhiyun         RK_LOGE("get picture buffer size failed: %#x", s32Ret);
180*4882a593Smuzhiyun         return s32Ret;
181*4882a593Smuzhiyun     }
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun     for (RK_S32 AvsPipe = 0; AvsPipe < AVS_PIPE_NUM; AvsPipe++) {
184*4882a593Smuzhiyun         memset(&stMbPoolCfg, 0, sizeof(MB_POOL_CONFIG_S));
185*4882a593Smuzhiyun         stMbPoolCfg.u64MBSize = stMbPicCalResult.u32MBSize;
186*4882a593Smuzhiyun         stMbPoolCfg.u32MBCnt  = 2;
187*4882a593Smuzhiyun         stMbPoolCfg.enAllocType = MB_ALLOC_TYPE_DMA;
188*4882a593Smuzhiyun         stMbPoolCfg.bPreAlloc = RK_TRUE;
189*4882a593Smuzhiyun         pstCtx->srcVFramePools[AvsPipe] = RK_MPI_MB_CreatePool(&stMbPoolCfg);
190*4882a593Smuzhiyun     }
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun     return s32Ret;
193*4882a593Smuzhiyun }
194*4882a593Smuzhiyun 
TEST_AVS_ModDestroyFramePool(TEST_AVS_CTX_S * pstCtx)195*4882a593Smuzhiyun RK_S32 TEST_AVS_ModDestroyFramePool(TEST_AVS_CTX_S *pstCtx) {
196*4882a593Smuzhiyun     RK_S32   s32Ret  = RK_SUCCESS;
197*4882a593Smuzhiyun     for (RK_S32 AvsPipe = 0; AvsPipe < AVS_PIPE_NUM; AvsPipe++) {
198*4882a593Smuzhiyun         if (MB_INVALID_POOLID != pstCtx->srcVFramePools[AvsPipe]) {
199*4882a593Smuzhiyun             RK_MPI_MB_DestroyPool(pstCtx->srcVFramePools[AvsPipe]);
200*4882a593Smuzhiyun         }
201*4882a593Smuzhiyun     }
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun     return s32Ret;
204*4882a593Smuzhiyun }
205*4882a593Smuzhiyun 
TEST_AVS_ModGetFrameFromPool(TEST_AVS_CTX_S * pstCtx,VIDEO_FRAME_INFO_S ** pstVideoFrames)206*4882a593Smuzhiyun RK_S32 TEST_AVS_ModGetFrameFromPool(TEST_AVS_CTX_S *pstCtx,
207*4882a593Smuzhiyun                                 VIDEO_FRAME_INFO_S **pstVideoFrames) {
208*4882a593Smuzhiyun     RK_S32   s32Ret  = RK_SUCCESS;
209*4882a593Smuzhiyun     MB_BLK   blk     = RK_NULL;
210*4882a593Smuzhiyun     RK_U32   u32BufferSize   = 0;
211*4882a593Smuzhiyun     static RK_S32 s32LoopCnt = 0;
212*4882a593Smuzhiyun     RK_CHAR  cWritePath[MAX_FILE_PATH_LEN] = {0};
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun     PIC_BUF_ATTR_S pstBufAttr;
215*4882a593Smuzhiyun     MB_PIC_CAL_S   stMbPicCalResult;
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun     pstBufAttr.u32Width      = pstCtx->u32SrcWidth;
218*4882a593Smuzhiyun     pstBufAttr.u32Height     = pstCtx->u32SrcHeight;
219*4882a593Smuzhiyun     pstBufAttr.enCompMode    = pstCtx->enSrcCompressMode;
220*4882a593Smuzhiyun     pstBufAttr.enPixelFormat = pstCtx->enSrcPixFormat;
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun     s32Ret = RK_MPI_CAL_COMM_GetPicBufferSize(&pstBufAttr, &stMbPicCalResult);
223*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
224*4882a593Smuzhiyun         RK_LOGE("get picture buffer size failed: %#x", s32Ret);
225*4882a593Smuzhiyun         return s32Ret;
226*4882a593Smuzhiyun     }
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun     u32BufferSize = stMbPicCalResult.u32MBSize;
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun     for (RK_S32 AvsPipe = 0; AvsPipe < pstCtx->s32PipeNum; AvsPipe++) {
231*4882a593Smuzhiyun         if (MB_INVALID_POOLID == pstCtx->srcVFramePools[AvsPipe]) {
232*4882a593Smuzhiyun             RK_LOGE("avs [%d, %d] srcVFramePool unexist %d!",
233*4882a593Smuzhiyun                     pstCtx->s32GrpIndex, AvsPipe, pstCtx->srcVFramePools[AvsPipe]);
234*4882a593Smuzhiyun             continue;
235*4882a593Smuzhiyun         }
236*4882a593Smuzhiyun         blk = RK_MPI_MB_GetMB(pstCtx->srcVFramePools[AvsPipe], u32BufferSize, RK_TRUE);
237*4882a593Smuzhiyun         if (!blk) {
238*4882a593Smuzhiyun             continue;
239*4882a593Smuzhiyun         }
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun         pstVideoFrames[AvsPipe]->stVFrame.pMbBlk = blk;
242*4882a593Smuzhiyun         pstVideoFrames[AvsPipe]->stVFrame.u32Width = pstBufAttr.u32Width;
243*4882a593Smuzhiyun         pstVideoFrames[AvsPipe]->stVFrame.u32Height = pstBufAttr.u32Height;
244*4882a593Smuzhiyun         pstVideoFrames[AvsPipe]->stVFrame.u32VirWidth = stMbPicCalResult.u32VirWidth;
245*4882a593Smuzhiyun         pstVideoFrames[AvsPipe]->stVFrame.u32VirHeight = stMbPicCalResult.u32VirHeight;
246*4882a593Smuzhiyun         pstVideoFrames[AvsPipe]->stVFrame.enPixelFormat = pstBufAttr.enPixelFormat;
247*4882a593Smuzhiyun         pstVideoFrames[AvsPipe]->stVFrame.enCompressMode = pstBufAttr.enCompMode;
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun         if (RK_NULL != pstCtx->srcFilePath) {
250*4882a593Smuzhiyun             if (COMPRESS_MODE_NONE == pstBufAttr.enCompMode) {
251*4882a593Smuzhiyun                 snprintf(cWritePath, sizeof(cWritePath),
252*4882a593Smuzhiyun                         "%simage_data/camera%d_%dx%d_nv12.yuv",
253*4882a593Smuzhiyun                         pstCtx->srcFilePath, AvsPipe,
254*4882a593Smuzhiyun                         pstBufAttr.u32Width, pstBufAttr.u32Height);
255*4882a593Smuzhiyun             } else if (COMPRESS_AFBC_16x16 == pstBufAttr.enCompMode) {
256*4882a593Smuzhiyun                 snprintf(cWritePath, sizeof(cWritePath),
257*4882a593Smuzhiyun                         "%safbc_image_data/camera%d_%dx%d_nv12_afbc.yuv",
258*4882a593Smuzhiyun                         pstCtx->srcFilePath, AvsPipe,
259*4882a593Smuzhiyun                         pstBufAttr.u32Width, pstBufAttr.u32Height);
260*4882a593Smuzhiyun             }
261*4882a593Smuzhiyun 
262*4882a593Smuzhiyun             s32Ret = TEST_COMM_FileReadOneFrame(cWritePath, pstVideoFrames[AvsPipe]);
263*4882a593Smuzhiyun             if (s32Ret != RK_SUCCESS) {
264*4882a593Smuzhiyun                 RK_LOGE("avs [%d, %d] pipe frame %p fread file: %s failed: %#x!",
265*4882a593Smuzhiyun                         pstCtx->s32GrpIndex, AvsPipe,
266*4882a593Smuzhiyun                         pstVideoFrames[AvsPipe], cWritePath, s32Ret);
267*4882a593Smuzhiyun             }
268*4882a593Smuzhiyun             RK_LOGV("avs [%d, %d] pipe frame %p fread file: %s already.",
269*4882a593Smuzhiyun                     pstCtx->s32GrpIndex, AvsPipe, pstVideoFrames[AvsPipe], cWritePath);
270*4882a593Smuzhiyun         } else {
271*4882a593Smuzhiyun             if (COMPRESS_MODE_NONE == pstBufAttr.enCompMode) {
272*4882a593Smuzhiyun                 s32Ret = TEST_COMM_FillImage(
273*4882a593Smuzhiyun                             (RK_U8 *)RK_MPI_MB_Handle2VirAddr(pstVideoFrames[AvsPipe]->stVFrame.pMbBlk),
274*4882a593Smuzhiyun                             pstBufAttr.u32Width,
275*4882a593Smuzhiyun                             pstBufAttr.u32Height,
276*4882a593Smuzhiyun                             RK_MPI_CAL_COMM_GetHorStride(pstVideoFrames[AvsPipe]->stVFrame.u32Width,
277*4882a593Smuzhiyun                                     pstVideoFrames[AvsPipe]->stVFrame.enPixelFormat),
278*4882a593Smuzhiyun                             pstVideoFrames[AvsPipe]->stVFrame.u32VirHeight,
279*4882a593Smuzhiyun                             pstVideoFrames[AvsPipe]->stVFrame.enPixelFormat,
280*4882a593Smuzhiyun                             s32LoopCnt + AvsPipe);
281*4882a593Smuzhiyun                 if (s32Ret != RK_SUCCESS) {
282*4882a593Smuzhiyun                     RK_LOGE("fill COMPRESS_MODE_NONE data into pipe %d buf %p failed: %#x!",
283*4882a593Smuzhiyun                             AvsPipe, pstVideoFrames[AvsPipe], s32Ret);
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun                 }
286*4882a593Smuzhiyun                 s32LoopCnt++;
287*4882a593Smuzhiyun             } else if (COMPRESS_AFBC_16x16 == pstBufAttr.enCompMode) {
288*4882a593Smuzhiyun                 RK_LOGE("unsupport fill COMPRESS_AFBC_16x16 data into buf generated by CPU!");
289*4882a593Smuzhiyun             }
290*4882a593Smuzhiyun         }
291*4882a593Smuzhiyun         RK_MPI_SYS_MmzFlushCache(pstVideoFrames[AvsPipe]->stVFrame.pMbBlk, RK_FALSE);
292*4882a593Smuzhiyun     }
293*4882a593Smuzhiyun 
294*4882a593Smuzhiyun     return s32Ret;
295*4882a593Smuzhiyun }
296*4882a593Smuzhiyun 
TEST_AVS_ModReleaseFrameToPool(TEST_AVS_CTX_S * pstCtx,VIDEO_FRAME_INFO_S ** pstVideoFrames)297*4882a593Smuzhiyun RK_S32 TEST_AVS_ModReleaseFrameToPool(TEST_AVS_CTX_S *pstCtx,
298*4882a593Smuzhiyun                                 VIDEO_FRAME_INFO_S **pstVideoFrames) {
299*4882a593Smuzhiyun     RK_S32   s32Ret  = RK_SUCCESS;
300*4882a593Smuzhiyun     for (RK_S32 AvsPipe = 0; AvsPipe < AVS_PIPE_NUM; AvsPipe++) {
301*4882a593Smuzhiyun         if (pstVideoFrames[AvsPipe] && pstVideoFrames[AvsPipe]->stVFrame.pMbBlk) {
302*4882a593Smuzhiyun             s32Ret = RK_MPI_MB_ReleaseMB(pstVideoFrames[AvsPipe]->stVFrame.pMbBlk);
303*4882a593Smuzhiyun             pstVideoFrames[AvsPipe]->stVFrame.pMbBlk = RK_NULL;
304*4882a593Smuzhiyun         }
305*4882a593Smuzhiyun     }
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun     return s32Ret;
308*4882a593Smuzhiyun }
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun 
TEST_AVS_ModCreateFrame(TEST_AVS_CTX_S * pstCtx,VIDEO_FRAME_INFO_S ** pstVideoFrames)311*4882a593Smuzhiyun RK_S32 TEST_AVS_ModCreateFrame(TEST_AVS_CTX_S *pstCtx,
312*4882a593Smuzhiyun                                VIDEO_FRAME_INFO_S **pstVideoFrames) {
313*4882a593Smuzhiyun     RK_S32   s32Ret  = RK_SUCCESS;
314*4882a593Smuzhiyun     AVS_PIPE AvsPipe = 0;
315*4882a593Smuzhiyun     static RK_S32 s32LoopCnt = 0;
316*4882a593Smuzhiyun     RK_CHAR  cWritePath[MAX_FILE_PATH_LEN] = {0};
317*4882a593Smuzhiyun     PIC_BUF_ATTR_S pstBufAttr;
318*4882a593Smuzhiyun 
319*4882a593Smuzhiyun     pstBufAttr.u32Width      = pstCtx->u32SrcWidth;
320*4882a593Smuzhiyun     pstBufAttr.u32Height     = pstCtx->u32SrcHeight;
321*4882a593Smuzhiyun     pstBufAttr.enCompMode    = pstCtx->enSrcCompressMode;
322*4882a593Smuzhiyun     pstBufAttr.enPixelFormat = pstCtx->enSrcPixFormat;
323*4882a593Smuzhiyun 
324*4882a593Smuzhiyun     for (; AvsPipe < pstCtx->s32PipeNum; AvsPipe++) {
325*4882a593Smuzhiyun         s32Ret = TEST_SYS_CreateVideoFrame(&pstBufAttr, pstVideoFrames[AvsPipe]);
326*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
327*4882a593Smuzhiyun             goto __FAILED;
328*4882a593Smuzhiyun         }
329*4882a593Smuzhiyun         RK_LOGV("avs [%d, %d] create pipe frame %p already.",
330*4882a593Smuzhiyun                 pstCtx->s32GrpIndex, AvsPipe, pstVideoFrames[AvsPipe]);
331*4882a593Smuzhiyun 
332*4882a593Smuzhiyun         if (RK_NULL != pstCtx->srcFilePath) {
333*4882a593Smuzhiyun             if (COMPRESS_MODE_NONE == pstBufAttr.enCompMode) {
334*4882a593Smuzhiyun                 snprintf(cWritePath, sizeof(cWritePath),
335*4882a593Smuzhiyun                         "%simage_data/camera%d_%dx%d_nv12.yuv",
336*4882a593Smuzhiyun                         pstCtx->srcFilePath, AvsPipe,
337*4882a593Smuzhiyun                         pstBufAttr.u32Width, pstBufAttr.u32Height);
338*4882a593Smuzhiyun             } else if (COMPRESS_AFBC_16x16 == pstBufAttr.enCompMode) {
339*4882a593Smuzhiyun                 snprintf(cWritePath, sizeof(cWritePath),
340*4882a593Smuzhiyun                         "%safbc_image_data/camera%d_%dx%d_nv12_afbc.yuv",
341*4882a593Smuzhiyun                         pstCtx->srcFilePath, AvsPipe,
342*4882a593Smuzhiyun                         pstBufAttr.u32Width, pstBufAttr.u32Height);
343*4882a593Smuzhiyun             }
344*4882a593Smuzhiyun             RK_LOGV("avs [%d, %d] pipe frame %p fread file: %s.",
345*4882a593Smuzhiyun                     pstCtx->s32GrpIndex, AvsPipe, pstVideoFrames[AvsPipe], cWritePath);
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun             s32Ret = TEST_COMM_FileReadOneFrame(cWritePath, pstVideoFrames[AvsPipe]);
348*4882a593Smuzhiyun             if (s32Ret != RK_SUCCESS) {
349*4882a593Smuzhiyun                 goto __FAILED;
350*4882a593Smuzhiyun             }
351*4882a593Smuzhiyun         } else {
352*4882a593Smuzhiyun             if (COMPRESS_MODE_NONE == pstBufAttr.enCompMode) {
353*4882a593Smuzhiyun                 s32Ret = TEST_COMM_FillImage(
354*4882a593Smuzhiyun                             (RK_U8 *)RK_MPI_MB_Handle2VirAddr(pstVideoFrames[AvsPipe]->stVFrame.pMbBlk),
355*4882a593Smuzhiyun                             pstBufAttr.u32Width,
356*4882a593Smuzhiyun                             pstBufAttr.u32Height,
357*4882a593Smuzhiyun                             RK_MPI_CAL_COMM_GetHorStride(pstVideoFrames[AvsPipe]->stVFrame.u32Width,
358*4882a593Smuzhiyun                                     pstVideoFrames[AvsPipe]->stVFrame.enPixelFormat),
359*4882a593Smuzhiyun                             pstVideoFrames[AvsPipe]->stVFrame.u32VirHeight,
360*4882a593Smuzhiyun                             pstVideoFrames[AvsPipe]->stVFrame.enPixelFormat,
361*4882a593Smuzhiyun                             s32LoopCnt + AvsPipe);
362*4882a593Smuzhiyun                 if (s32Ret != RK_SUCCESS) {
363*4882a593Smuzhiyun                     RK_LOGE("fill COMPRESS_MODE_NONE data into pipe %d buf %p failed: %#x!",
364*4882a593Smuzhiyun                             AvsPipe, pstVideoFrames[AvsPipe], s32Ret);
365*4882a593Smuzhiyun 
366*4882a593Smuzhiyun                     goto __FAILED;
367*4882a593Smuzhiyun                 }
368*4882a593Smuzhiyun                 s32LoopCnt++;
369*4882a593Smuzhiyun             } else if (COMPRESS_AFBC_16x16 == pstBufAttr.enCompMode) {
370*4882a593Smuzhiyun                 RK_LOGE("unsupport fill COMPRESS_AFBC_16x16 data into buf generated by CPU!");
371*4882a593Smuzhiyun             }
372*4882a593Smuzhiyun         }
373*4882a593Smuzhiyun         RK_MPI_SYS_MmzFlushCache(pstVideoFrames[AvsPipe]->stVFrame.pMbBlk, RK_FALSE);
374*4882a593Smuzhiyun     }
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun     return s32Ret;
377*4882a593Smuzhiyun 
378*4882a593Smuzhiyun __FAILED:
379*4882a593Smuzhiyun     for (; AvsPipe >= 0; AvsPipe--) {
380*4882a593Smuzhiyun         RK_MPI_MB_ReleaseMB(pstVideoFrames[AvsPipe]->stVFrame.pMbBlk);
381*4882a593Smuzhiyun     }
382*4882a593Smuzhiyun 
383*4882a593Smuzhiyun     return s32Ret;
384*4882a593Smuzhiyun }
385*4882a593Smuzhiyun 
TEST_AVS_ModSendFrame(AVS_GRP AvsGrp,RK_U32 s32PipeNum,VIDEO_FRAME_INFO_S ** pstVideoFrames)386*4882a593Smuzhiyun RK_S32 TEST_AVS_ModSendFrame(AVS_GRP AvsGrp,
387*4882a593Smuzhiyun                              RK_U32 s32PipeNum,
388*4882a593Smuzhiyun                              VIDEO_FRAME_INFO_S **pstVideoFrames) {
389*4882a593Smuzhiyun     RK_S32 s32Ret    = RK_SUCCESS;
390*4882a593Smuzhiyun     AVS_PIPE AvsPipe = 0;
391*4882a593Smuzhiyun 
392*4882a593Smuzhiyun     for (; AvsPipe < s32PipeNum; AvsPipe++) {
393*4882a593Smuzhiyun         s32Ret = RK_MPI_AVS_SendPipeFrame(AvsGrp, AvsPipe, pstVideoFrames[AvsPipe], -1);
394*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
395*4882a593Smuzhiyun             RK_LOGE("avs [%d, %d] RK_MPI_AVS_SendPipeFrame %p failed: %#x!",
396*4882a593Smuzhiyun                     AvsGrp, AvsPipe, pstVideoFrames[AvsPipe]->stVFrame.pMbBlk, s32Ret);
397*4882a593Smuzhiyun         }
398*4882a593Smuzhiyun     }
399*4882a593Smuzhiyun 
400*4882a593Smuzhiyun     return s32Ret;
401*4882a593Smuzhiyun }
402*4882a593Smuzhiyun 
TEST_AVS_ModGetChnFrame(AVS_GRP AvsGrp,RK_U32 s32ChnNum,VIDEO_FRAME_INFO_S ** pstVideoFrames)403*4882a593Smuzhiyun RK_S32 TEST_AVS_ModGetChnFrame(AVS_GRP AvsGrp,
404*4882a593Smuzhiyun                                RK_U32 s32ChnNum,
405*4882a593Smuzhiyun                                VIDEO_FRAME_INFO_S **pstVideoFrames) {
406*4882a593Smuzhiyun     RK_S32 s32Ret  = RK_SUCCESS;
407*4882a593Smuzhiyun     AVS_CHN AvsChn = 0;
408*4882a593Smuzhiyun 
409*4882a593Smuzhiyun     for (; AvsChn < s32ChnNum; AvsChn++) {
410*4882a593Smuzhiyun         s32Ret = RK_MPI_AVS_GetChnFrame(AvsGrp, AvsChn,
411*4882a593Smuzhiyun                                         pstVideoFrames[AvsChn], 40);
412*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
413*4882a593Smuzhiyun             RK_LOGE("avs [%d, %d] RK_MPI_AVS_GetChnFrame failed: %#x!",
414*4882a593Smuzhiyun                     AvsGrp, AvsChn, s32Ret);
415*4882a593Smuzhiyun         }
416*4882a593Smuzhiyun     }
417*4882a593Smuzhiyun 
418*4882a593Smuzhiyun     return s32Ret;
419*4882a593Smuzhiyun }
420*4882a593Smuzhiyun 
TEST_AVS_ModSaveChnFrame(AVS_GRP AvsGrp,RK_U32 s32ChnNum,const RK_CHAR * dstFilePath,VIDEO_FRAME_INFO_S ** pstVideoFrames)421*4882a593Smuzhiyun RK_S32 TEST_AVS_ModSaveChnFrame(AVS_GRP AvsGrp,
422*4882a593Smuzhiyun                                 RK_U32 s32ChnNum,
423*4882a593Smuzhiyun                                 const RK_CHAR *dstFilePath,
424*4882a593Smuzhiyun                                 VIDEO_FRAME_INFO_S **pstVideoFrames) {
425*4882a593Smuzhiyun     RK_S32 s32Ret  = RK_SUCCESS;
426*4882a593Smuzhiyun     AVS_CHN AvsChn = 0;
427*4882a593Smuzhiyun 
428*4882a593Smuzhiyun     for (; AvsChn < s32ChnNum; AvsChn++) {
429*4882a593Smuzhiyun         if (!pstVideoFrames[AvsChn]) {
430*4882a593Smuzhiyun             continue;
431*4882a593Smuzhiyun         }
432*4882a593Smuzhiyun 
433*4882a593Smuzhiyun         RK_CHAR pWritePath[MAX_FILE_PATH_LEN]       = {RK_NULL};
434*4882a593Smuzhiyun         snprintf(pWritePath, sizeof(pWritePath), "%schn_out_%dx%d_%d_%d_%s.bin",
435*4882a593Smuzhiyun                     dstFilePath, pstVideoFrames[AvsChn]->stVFrame.u32Width,
436*4882a593Smuzhiyun                     pstVideoFrames[AvsChn]->stVFrame.u32Height, AvsGrp, AvsChn,
437*4882a593Smuzhiyun                     pstVideoFrames[AvsChn]->stVFrame.enCompressMode ? "afbc": "none");
438*4882a593Smuzhiyun 
439*4882a593Smuzhiyun         s32Ret = TEST_COMM_FileWriteOneFrame(pWritePath, pstVideoFrames[AvsChn]);
440*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
441*4882a593Smuzhiyun             RK_LOGE("avs [%d, %d] save chn frame %p to file %s failed: %#x!",
442*4882a593Smuzhiyun                     AvsGrp, AvsChn, pstVideoFrames[AvsChn],
443*4882a593Smuzhiyun                     pWritePath, s32Ret);
444*4882a593Smuzhiyun         }
445*4882a593Smuzhiyun     }
446*4882a593Smuzhiyun 
447*4882a593Smuzhiyun     return s32Ret;
448*4882a593Smuzhiyun }
449*4882a593Smuzhiyun 
TEST_AVS_ModReleaseChnFrame(AVS_GRP AvsGrp,RK_U32 s32ChnNum,VIDEO_FRAME_INFO_S ** pstVideoFrames)450*4882a593Smuzhiyun RK_S32 TEST_AVS_ModReleaseChnFrame(AVS_GRP AvsGrp,
451*4882a593Smuzhiyun                                    RK_U32 s32ChnNum,
452*4882a593Smuzhiyun                                    VIDEO_FRAME_INFO_S **pstVideoFrames) {
453*4882a593Smuzhiyun     RK_S32 s32Ret  = RK_SUCCESS;
454*4882a593Smuzhiyun     AVS_CHN AvsChn = 0;
455*4882a593Smuzhiyun 
456*4882a593Smuzhiyun     for (; AvsChn < s32ChnNum; AvsChn++) {
457*4882a593Smuzhiyun         s32Ret = RK_MPI_AVS_ReleaseChnFrame(AvsGrp, AvsChn,
458*4882a593Smuzhiyun                                         pstVideoFrames[AvsChn]);
459*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
460*4882a593Smuzhiyun             RK_LOGE("avs [%d, %d] RK_MPI_AVS_ReleaseChnFrame failed: %#x!",
461*4882a593Smuzhiyun                     AvsGrp, AvsChn, s32Ret);
462*4882a593Smuzhiyun         }
463*4882a593Smuzhiyun     }
464*4882a593Smuzhiyun 
465*4882a593Smuzhiyun     return s32Ret;
466*4882a593Smuzhiyun }
467*4882a593Smuzhiyun 
TEST_AVS_UnitTest(TEST_AVS_CTX_S * pstCtx)468*4882a593Smuzhiyun RK_S32 TEST_AVS_UnitTest(TEST_AVS_CTX_S *pstCtx) {
469*4882a593Smuzhiyun     RK_S32      s32Ret = RK_SUCCESS;
470*4882a593Smuzhiyun 
471*4882a593Smuzhiyun     VIDEO_FRAME_INFO_S **pstPipeFrames;
472*4882a593Smuzhiyun     VIDEO_FRAME_INFO_S **pstChnFrames;
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun     pstPipeFrames = reinterpret_cast<VIDEO_FRAME_INFO_S **>(
475*4882a593Smuzhiyun                         malloc(sizeof(VIDEO_FRAME_INFO_S *) * AVS_PIPE_NUM));
476*4882a593Smuzhiyun     pstChnFrames = reinterpret_cast<VIDEO_FRAME_INFO_S **>(
477*4882a593Smuzhiyun                         malloc(sizeof(VIDEO_FRAME_INFO_S *) * AVS_MAX_CHN_NUM));
478*4882a593Smuzhiyun     for (RK_S32 i = 0; i < AVS_PIPE_NUM; i++) {
479*4882a593Smuzhiyun         pstPipeFrames[i] = reinterpret_cast<VIDEO_FRAME_INFO_S *>(malloc(sizeof(VIDEO_FRAME_INFO_S)));
480*4882a593Smuzhiyun         memset(pstPipeFrames[i], 0, sizeof(VIDEO_FRAME_INFO_S));
481*4882a593Smuzhiyun     }
482*4882a593Smuzhiyun     for (RK_S32 i = 0; i < AVS_MAX_CHN_NUM; i++) {
483*4882a593Smuzhiyun         pstChnFrames[i] = reinterpret_cast<VIDEO_FRAME_INFO_S *>(malloc(sizeof(VIDEO_FRAME_INFO_S)));
484*4882a593Smuzhiyun         memset(pstChnFrames[i], 0, sizeof(VIDEO_FRAME_INFO_S));
485*4882a593Smuzhiyun     }
486*4882a593Smuzhiyun 
487*4882a593Smuzhiyun     s32Ret = TEST_AVS_ModCreateFrame(pstCtx, pstPipeFrames);
488*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
489*4882a593Smuzhiyun         goto __FREE_PIPE_FRAME;
490*4882a593Smuzhiyun     }
491*4882a593Smuzhiyun 
492*4882a593Smuzhiyun     s32Ret = TEST_AVS_ModInit(pstCtx);
493*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
494*4882a593Smuzhiyun         goto __FREE_PIPE_FRAME;
495*4882a593Smuzhiyun     }
496*4882a593Smuzhiyun 
497*4882a593Smuzhiyun     for (RK_S32 i = 0; i < pstCtx->s32LoopCount; i++) {
498*4882a593Smuzhiyun         s32Ret = TEST_AVS_ModSendFrame(pstCtx->s32GrpIndex, pstCtx->s32PipeNum, pstPipeFrames);
499*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
500*4882a593Smuzhiyun             continue;
501*4882a593Smuzhiyun         }
502*4882a593Smuzhiyun 
503*4882a593Smuzhiyun         s32Ret = TEST_AVS_ModGetChnFrame(pstCtx->s32GrpIndex, pstCtx->s32ChnNum, pstChnFrames);
504*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
505*4882a593Smuzhiyun             continue;
506*4882a593Smuzhiyun         }
507*4882a593Smuzhiyun 
508*4882a593Smuzhiyun         if (pstCtx->dstFilePath != RK_NULL) {
509*4882a593Smuzhiyun             s32Ret = TEST_AVS_ModSaveChnFrame(pstCtx->s32GrpIndex, pstCtx->s32ChnNum,
510*4882a593Smuzhiyun                                               pstCtx->dstFilePath, pstChnFrames);
511*4882a593Smuzhiyun             if (s32Ret != RK_SUCCESS) {
512*4882a593Smuzhiyun                 goto __FAILED;
513*4882a593Smuzhiyun             }
514*4882a593Smuzhiyun         }
515*4882a593Smuzhiyun 
516*4882a593Smuzhiyun         s32Ret = TEST_AVS_ModReleaseChnFrame(pstCtx->s32GrpIndex, pstCtx->s32ChnNum, pstChnFrames);
517*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
518*4882a593Smuzhiyun             goto __FAILED;
519*4882a593Smuzhiyun         }
520*4882a593Smuzhiyun         usleep(40 * 1000);
521*4882a593Smuzhiyun     }
522*4882a593Smuzhiyun 
523*4882a593Smuzhiyun __FAILED:
524*4882a593Smuzhiyun     s32Ret = TEST_AVS_ModDeInit(pstCtx);
525*4882a593Smuzhiyun 
526*4882a593Smuzhiyun __FREE_PIPE_FRAME:
527*4882a593Smuzhiyun     for (RK_S32 i = 0; i < AVS_PIPE_NUM; i++) {
528*4882a593Smuzhiyun         if (i < pstCtx->s32PipeNum) {
529*4882a593Smuzhiyun             if (pstPipeFrames[i] &&
530*4882a593Smuzhiyun                 pstPipeFrames[i]->stVFrame.pMbBlk) {
531*4882a593Smuzhiyun                 RK_MPI_MB_ReleaseMB(pstPipeFrames[i]->stVFrame.pMbBlk);
532*4882a593Smuzhiyun             }
533*4882a593Smuzhiyun         }
534*4882a593Smuzhiyun         RK_SAFE_FREE(pstPipeFrames[i]);
535*4882a593Smuzhiyun     }
536*4882a593Smuzhiyun 
537*4882a593Smuzhiyun     for (RK_S32 i = 0; i < AVS_MAX_CHN_NUM; i++)
538*4882a593Smuzhiyun         RK_SAFE_FREE(pstChnFrames[i]);
539*4882a593Smuzhiyun 
540*4882a593Smuzhiyun     RK_SAFE_FREE(pstPipeFrames);
541*4882a593Smuzhiyun     RK_SAFE_FREE(pstChnFrames);
542*4882a593Smuzhiyun 
543*4882a593Smuzhiyun     return s32Ret;
544*4882a593Smuzhiyun }
545*4882a593Smuzhiyun 
TEST_AVS_InitAttr(TEST_AVS_CTX_S * pstCtx,AVS_GRP_ATTR_S * pstAvsGrpAttr,AVS_CHN_ATTR_S * pstAvsChnAttrs)546*4882a593Smuzhiyun RK_S32 TEST_AVS_InitAttr(TEST_AVS_CTX_S *pstCtx,
547*4882a593Smuzhiyun                        AVS_GRP_ATTR_S *pstAvsGrpAttr,
548*4882a593Smuzhiyun                        AVS_CHN_ATTR_S *pstAvsChnAttrs) {
549*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
550*4882a593Smuzhiyun 
551*4882a593Smuzhiyun     if (AVS_MODE_BLEND == pstCtx->enAvsWorkMode) {
552*4882a593Smuzhiyun         if (AVS_PARAM_SOURCE_LUT == pstCtx->enParamSource) {
553*4882a593Smuzhiyun             s32Ret = TEST_AVS_InitAttr_Blend_Lut(pstCtx, pstAvsGrpAttr, pstAvsChnAttrs);
554*4882a593Smuzhiyun         } else if (AVS_PARAM_SOURCE_CALIB == pstCtx->enParamSource) {
555*4882a593Smuzhiyun             s32Ret = TEST_AVS_InitAttr_Blend_Calib(pstCtx, pstAvsGrpAttr, pstAvsChnAttrs);
556*4882a593Smuzhiyun         }
557*4882a593Smuzhiyun     } else if (pstCtx->enAvsWorkMode > AVS_MODE_BLEND && pstCtx->enAvsWorkMode < AVS_MODE_BUTT) {
558*4882a593Smuzhiyun         s32Ret = TEST_AVS_InitAttr_NoBlend(pstCtx, pstAvsGrpAttr, pstAvsChnAttrs);
559*4882a593Smuzhiyun     }
560*4882a593Smuzhiyun 
561*4882a593Smuzhiyun     if (RK_TRUE == pstCtx->bGrpExSize) {
562*4882a593Smuzhiyun         pstAvsGrpAttr->stOutAttr.stSize.u32Width  = pstCtx->u32GrpWidth;
563*4882a593Smuzhiyun         pstAvsGrpAttr->stOutAttr.stSize.u32Height = pstCtx->u32GrpHeight;
564*4882a593Smuzhiyun     }
565*4882a593Smuzhiyun 
566*4882a593Smuzhiyun     pstAvsGrpAttr->stInAttr.stSize.u32Width  = pstCtx->u32SrcWidth;
567*4882a593Smuzhiyun     pstAvsGrpAttr->stInAttr.stSize.u32Height = pstCtx->u32SrcHeight;
568*4882a593Smuzhiyun 
569*4882a593Smuzhiyun     return s32Ret;
570*4882a593Smuzhiyun }
571*4882a593Smuzhiyun 
TEST_AVS_InitAttr_Blend_Lut(TEST_AVS_CTX_S * pstCtx,AVS_GRP_ATTR_S * pstAvsGrpAttr,AVS_CHN_ATTR_S * pstAvsChnAttrs)572*4882a593Smuzhiyun RK_S32 TEST_AVS_InitAttr_Blend_Lut(TEST_AVS_CTX_S *pstCtx,
573*4882a593Smuzhiyun                        AVS_GRP_ATTR_S *pstAvsGrpAttr,
574*4882a593Smuzhiyun                        AVS_CHN_ATTR_S *pstAvsChnAttrs) {
575*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
576*4882a593Smuzhiyun     RK_VOID   **pLUTVirAddr = RK_NULL;
577*4882a593Smuzhiyun 
578*4882a593Smuzhiyun     if (!pstCtx->lutFilePath) {
579*4882a593Smuzhiyun         return RK_ERR_NULL_PTR;
580*4882a593Smuzhiyun     }
581*4882a593Smuzhiyun 
582*4882a593Smuzhiyun     memset(pstAvsGrpAttr, 0, sizeof(AVS_GRP_ATTR_S));
583*4882a593Smuzhiyun     memset(pstAvsChnAttrs, 0, sizeof(AVS_CHN_ATTR_S) * AVS_MAX_CHN_NUM);
584*4882a593Smuzhiyun 
585*4882a593Smuzhiyun     s32Ret = TEST_AVS_MallocLutBuf(pstCtx, &pLUTVirAddr);
586*4882a593Smuzhiyun     if (RK_SUCCESS != s32Ret) {
587*4882a593Smuzhiyun         return s32Ret;
588*4882a593Smuzhiyun     }
589*4882a593Smuzhiyun 
590*4882a593Smuzhiyun     pstAvsGrpAttr->enMode                           = pstCtx->enAvsWorkMode;
591*4882a593Smuzhiyun     pstAvsGrpAttr->u32PipeNum                       = pstCtx->s32PipeNum;
592*4882a593Smuzhiyun     pstAvsGrpAttr->bSyncPipe                        = pstCtx->bFrameSync;
593*4882a593Smuzhiyun 
594*4882a593Smuzhiyun     pstAvsGrpAttr->stInAttr.enParamSource           = pstCtx->enParamSource;
595*4882a593Smuzhiyun     pstAvsGrpAttr->stInAttr.stLUT.enAccuracy        = pstCtx->enLutAccuracy;
596*4882a593Smuzhiyun     pstAvsGrpAttr->stInAttr.stLUT.enFuseWidth       = pstCtx->enLutFuseWidth;
597*4882a593Smuzhiyun     pstAvsGrpAttr->stInAttr.stLUT.stLutStep.enStepX = pstCtx->stLutStep.enStepX;
598*4882a593Smuzhiyun     pstAvsGrpAttr->stInAttr.stLUT.stLutStep.enStepY = pstCtx->stLutStep.enStepY;
599*4882a593Smuzhiyun     for (RK_S32 i = 0; i < pstCtx->s32PipeNum; i++) {
600*4882a593Smuzhiyun         pstAvsGrpAttr->stInAttr.stLUT.pVirAddr[i] = pLUTVirAddr[i];
601*4882a593Smuzhiyun     }
602*4882a593Smuzhiyun 
603*4882a593Smuzhiyun     pstAvsGrpAttr->stOutAttr.enPrjMode              = pstCtx->enAvsProjMode;
604*4882a593Smuzhiyun     pstAvsGrpAttr->stOutAttr.stCenter.s32X          = pstCtx->stCenter.s32X;
605*4882a593Smuzhiyun     pstAvsGrpAttr->stOutAttr.stCenter.s32Y          = pstCtx->stCenter.s32Y;
606*4882a593Smuzhiyun     pstAvsGrpAttr->stOutAttr.stFOV.u32FOVX          = pstCtx->stFov.u32FOVX;
607*4882a593Smuzhiyun     pstAvsGrpAttr->stOutAttr.stFOV.u32FOVY          = pstCtx->stFov.u32FOVY;
608*4882a593Smuzhiyun     pstAvsGrpAttr->stOutAttr.stORIRotation.s32Roll  = pstCtx->stOriRotation.s32Roll;
609*4882a593Smuzhiyun     pstAvsGrpAttr->stOutAttr.stORIRotation.s32Pitch = pstCtx->stOriRotation.s32Pitch;
610*4882a593Smuzhiyun     pstAvsGrpAttr->stOutAttr.stORIRotation.s32Yaw   = pstCtx->stOriRotation.s32Yaw;
611*4882a593Smuzhiyun     pstAvsGrpAttr->stOutAttr.stRotation.s32Roll     = pstCtx->stRotation.s32Roll;
612*4882a593Smuzhiyun     pstAvsGrpAttr->stOutAttr.stRotation.s32Pitch    = pstCtx->stRotation.s32Pitch;
613*4882a593Smuzhiyun     pstAvsGrpAttr->stOutAttr.stRotation.s32Yaw      = pstCtx->stRotation.s32Yaw;
614*4882a593Smuzhiyun     pstAvsGrpAttr->stFrameRate.s32SrcFrameRate      = pstCtx->s32SrcGrpRate;
615*4882a593Smuzhiyun     pstAvsGrpAttr->stFrameRate.s32DstFrameRate      = pstCtx->s32DstGrpRate;
616*4882a593Smuzhiyun 
617*4882a593Smuzhiyun     for (RK_S32 i = 0; i < AVS_MAX_CHN_NUM; i++) {
618*4882a593Smuzhiyun         if (0 == i) {
619*4882a593Smuzhiyun             pstAvsChnAttrs[i].u32Width                = pstCtx->u32DstWidth;
620*4882a593Smuzhiyun             pstAvsChnAttrs[i].u32Height               = pstCtx->u32DstHeight;
621*4882a593Smuzhiyun             pstAvsChnAttrs[i].enCompressMode          = pstCtx->enDstCompressMode;
622*4882a593Smuzhiyun         } else {
623*4882a593Smuzhiyun             pstAvsChnAttrs[i].u32Width                = RK_ALIGN(pstCtx->u32DstWidth / 2, 16);
624*4882a593Smuzhiyun             pstAvsChnAttrs[i].u32Height               = RK_ALIGN(pstCtx->u32DstHeight / 2, 2);
625*4882a593Smuzhiyun             pstAvsChnAttrs[i].enCompressMode          = COMPRESS_MODE_NONE;
626*4882a593Smuzhiyun         }
627*4882a593Smuzhiyun         pstAvsChnAttrs[i].enDynamicRange              = DYNAMIC_RANGE_SDR8;
628*4882a593Smuzhiyun         pstAvsChnAttrs[i].u32Depth                    = pstCtx->u32ChnDepth;
629*4882a593Smuzhiyun         pstAvsChnAttrs[i].stFrameRate.s32SrcFrameRate = pstCtx->s32SrcChnRate;
630*4882a593Smuzhiyun         pstAvsChnAttrs[i].stFrameRate.s32DstFrameRate = pstCtx->s32DstChnRate;
631*4882a593Smuzhiyun         pstAvsChnAttrs[i].u32FrameBufCnt              = pstCtx->u32FrameBufCnt;
632*4882a593Smuzhiyun     }
633*4882a593Smuzhiyun 
634*4882a593Smuzhiyun     return s32Ret;
635*4882a593Smuzhiyun }
636*4882a593Smuzhiyun 
TEST_AVS_InitAttr_Blend_Calib(TEST_AVS_CTX_S * pstCtx,AVS_GRP_ATTR_S * pstAvsGrpAttr,AVS_CHN_ATTR_S * pstAvsChnAttrs)637*4882a593Smuzhiyun RK_S32 TEST_AVS_InitAttr_Blend_Calib(TEST_AVS_CTX_S *pstCtx,
638*4882a593Smuzhiyun                        AVS_GRP_ATTR_S *pstAvsGrpAttr,
639*4882a593Smuzhiyun                        AVS_CHN_ATTR_S *pstAvsChnAttrs) {
640*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
641*4882a593Smuzhiyun 
642*4882a593Smuzhiyun     memset(pstAvsGrpAttr, 0, sizeof(AVS_GRP_ATTR_S));
643*4882a593Smuzhiyun     memset(pstAvsChnAttrs, 0, sizeof(AVS_CHN_ATTR_S) * AVS_MAX_CHN_NUM);
644*4882a593Smuzhiyun 
645*4882a593Smuzhiyun     pstAvsGrpAttr->enMode                           = pstCtx->enAvsWorkMode;
646*4882a593Smuzhiyun     pstAvsGrpAttr->u32PipeNum                       = pstCtx->s32PipeNum;
647*4882a593Smuzhiyun     pstAvsGrpAttr->bSyncPipe                        = pstCtx->bFrameSync;
648*4882a593Smuzhiyun 
649*4882a593Smuzhiyun     pstAvsGrpAttr->stInAttr.enParamSource           = pstCtx->enParamSource;
650*4882a593Smuzhiyun     if (pstCtx->calibFileName) {
651*4882a593Smuzhiyun         pstAvsGrpAttr->stInAttr.stCalib.pCalibFilePath = pstCtx->calibFileName;
652*4882a593Smuzhiyun     }
653*4882a593Smuzhiyun     if (pstCtx->meshFilePath) {
654*4882a593Smuzhiyun         pstAvsGrpAttr->stInAttr.stCalib.pMeshAlphaPath = pstCtx->meshFilePath;
655*4882a593Smuzhiyun     }
656*4882a593Smuzhiyun 
657*4882a593Smuzhiyun     pstAvsGrpAttr->stOutAttr.enPrjMode              = pstCtx->enAvsProjMode;
658*4882a593Smuzhiyun     pstAvsGrpAttr->stOutAttr.stCenter.s32X          = pstCtx->stCenter.s32X;
659*4882a593Smuzhiyun     pstAvsGrpAttr->stOutAttr.stCenter.s32Y          = pstCtx->stCenter.s32Y;
660*4882a593Smuzhiyun     pstAvsGrpAttr->stOutAttr.stFOV.u32FOVX          = pstCtx->stFov.u32FOVX;
661*4882a593Smuzhiyun     pstAvsGrpAttr->stOutAttr.stFOV.u32FOVY          = pstCtx->stFov.u32FOVY;
662*4882a593Smuzhiyun     pstAvsGrpAttr->stOutAttr.stORIRotation.s32Roll  = pstCtx->stOriRotation.s32Roll;
663*4882a593Smuzhiyun     pstAvsGrpAttr->stOutAttr.stORIRotation.s32Pitch = pstCtx->stOriRotation.s32Pitch;
664*4882a593Smuzhiyun     pstAvsGrpAttr->stOutAttr.stORIRotation.s32Yaw   = pstCtx->stOriRotation.s32Yaw;
665*4882a593Smuzhiyun     pstAvsGrpAttr->stOutAttr.stRotation.s32Roll     = pstCtx->stRotation.s32Roll;
666*4882a593Smuzhiyun     pstAvsGrpAttr->stOutAttr.stRotation.s32Pitch    = pstCtx->stRotation.s32Pitch;
667*4882a593Smuzhiyun     pstAvsGrpAttr->stOutAttr.stRotation.s32Yaw      = pstCtx->stRotation.s32Yaw;
668*4882a593Smuzhiyun     pstAvsGrpAttr->stOutAttr.fDistance              = pstCtx->fDistance;
669*4882a593Smuzhiyun     pstAvsGrpAttr->stFrameRate.s32SrcFrameRate      = pstCtx->s32SrcGrpRate;
670*4882a593Smuzhiyun     pstAvsGrpAttr->stFrameRate.s32DstFrameRate      = pstCtx->s32DstGrpRate;
671*4882a593Smuzhiyun 
672*4882a593Smuzhiyun     for (RK_S32 i = 0; i < pstCtx->s32ChnNum; i++) {
673*4882a593Smuzhiyun         if (0 == i) {
674*4882a593Smuzhiyun             pstAvsChnAttrs[i].u32Width                = pstCtx->u32DstWidth;
675*4882a593Smuzhiyun             pstAvsChnAttrs[i].u32Height               = pstCtx->u32DstHeight;
676*4882a593Smuzhiyun             pstAvsChnAttrs[i].enCompressMode          = pstCtx->enDstCompressMode;
677*4882a593Smuzhiyun         } else {
678*4882a593Smuzhiyun             pstAvsChnAttrs[i].u32Width                = RK_ALIGN(pstCtx->u32DstWidth / 2, 16);
679*4882a593Smuzhiyun             pstAvsChnAttrs[i].u32Height               = RK_ALIGN(pstCtx->u32DstHeight / 2, 2);
680*4882a593Smuzhiyun             pstAvsChnAttrs[i].enCompressMode          = COMPRESS_MODE_NONE;
681*4882a593Smuzhiyun         }
682*4882a593Smuzhiyun         pstAvsChnAttrs[i].enCompressMode              = pstCtx->enDstCompressMode;
683*4882a593Smuzhiyun         pstAvsChnAttrs[i].enDynamicRange              = DYNAMIC_RANGE_SDR8;
684*4882a593Smuzhiyun         pstAvsChnAttrs[i].u32Depth                    = pstCtx->u32ChnDepth;
685*4882a593Smuzhiyun         pstAvsChnAttrs[i].stFrameRate.s32SrcFrameRate = pstCtx->s32SrcChnRate;
686*4882a593Smuzhiyun         pstAvsChnAttrs[i].stFrameRate.s32DstFrameRate = pstCtx->s32DstChnRate;
687*4882a593Smuzhiyun         pstAvsChnAttrs[i].u32FrameBufCnt              = pstCtx->u32FrameBufCnt;
688*4882a593Smuzhiyun     }
689*4882a593Smuzhiyun 
690*4882a593Smuzhiyun     return s32Ret;
691*4882a593Smuzhiyun }
692*4882a593Smuzhiyun 
TEST_AVS_InitAttr_NoBlend(TEST_AVS_CTX_S * pstCtx,AVS_GRP_ATTR_S * pstAvsGrpAttr,AVS_CHN_ATTR_S * pstAvsChnAttrs)693*4882a593Smuzhiyun RK_S32 TEST_AVS_InitAttr_NoBlend(TEST_AVS_CTX_S *pstCtx,
694*4882a593Smuzhiyun                        AVS_GRP_ATTR_S *pstAvsGrpAttr,
695*4882a593Smuzhiyun                        AVS_CHN_ATTR_S *pstAvsChnAttrs) {
696*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
697*4882a593Smuzhiyun 
698*4882a593Smuzhiyun     memset(pstAvsGrpAttr, 0, sizeof(AVS_GRP_ATTR_S));
699*4882a593Smuzhiyun     memset(pstAvsChnAttrs, 0, sizeof(AVS_CHN_ATTR_S) * AVS_MAX_CHN_NUM);
700*4882a593Smuzhiyun 
701*4882a593Smuzhiyun     pstAvsGrpAttr->enMode                           = pstCtx->enAvsWorkMode;
702*4882a593Smuzhiyun     pstAvsGrpAttr->u32PipeNum                       = pstCtx->s32PipeNum;
703*4882a593Smuzhiyun     pstAvsGrpAttr->bSyncPipe                        = pstCtx->bFrameSync;
704*4882a593Smuzhiyun 
705*4882a593Smuzhiyun     pstAvsGrpAttr->stFrameRate.s32SrcFrameRate      = pstCtx->s32SrcGrpRate;
706*4882a593Smuzhiyun     pstAvsGrpAttr->stFrameRate.s32DstFrameRate      = pstCtx->s32DstGrpRate;
707*4882a593Smuzhiyun 
708*4882a593Smuzhiyun     for (RK_S32 i = 0; i < pstCtx->s32ChnNum; i++) {
709*4882a593Smuzhiyun         if (0 == i) {
710*4882a593Smuzhiyun             pstAvsChnAttrs[i].u32Width                = pstCtx->u32DstWidth;
711*4882a593Smuzhiyun             pstAvsChnAttrs[i].u32Height               = pstCtx->u32DstHeight;
712*4882a593Smuzhiyun             pstAvsChnAttrs[i].enCompressMode          = pstCtx->enDstCompressMode;
713*4882a593Smuzhiyun         } else {
714*4882a593Smuzhiyun             pstAvsChnAttrs[i].u32Width                = RK_ALIGN(pstCtx->u32DstWidth / 2, 16);
715*4882a593Smuzhiyun             pstAvsChnAttrs[i].u32Height               = RK_ALIGN(pstCtx->u32DstHeight / 2, 2);
716*4882a593Smuzhiyun             pstAvsChnAttrs[i].enCompressMode          = COMPRESS_MODE_NONE;
717*4882a593Smuzhiyun         }
718*4882a593Smuzhiyun         pstAvsChnAttrs[i].enDynamicRange              = DYNAMIC_RANGE_SDR8;
719*4882a593Smuzhiyun         pstAvsChnAttrs[i].u32Depth                    = pstCtx->u32ChnDepth;
720*4882a593Smuzhiyun         pstAvsChnAttrs[i].stFrameRate.s32SrcFrameRate = pstCtx->s32SrcChnRate;
721*4882a593Smuzhiyun         pstAvsChnAttrs[i].stFrameRate.s32DstFrameRate = pstCtx->s32DstChnRate;
722*4882a593Smuzhiyun         pstAvsChnAttrs[i].u32FrameBufCnt              = pstCtx->u32FrameBufCnt;
723*4882a593Smuzhiyun     }
724*4882a593Smuzhiyun 
725*4882a593Smuzhiyun     return s32Ret;
726*4882a593Smuzhiyun }
727*4882a593Smuzhiyun 
TEST_AVS_ModInit(TEST_AVS_CTX_S * pstCtx)728*4882a593Smuzhiyun RK_S32 TEST_AVS_ModInit(TEST_AVS_CTX_S *pstCtx) {
729*4882a593Smuzhiyun     RK_S32           s32Ret = RK_SUCCESS;
730*4882a593Smuzhiyun     MB_BLK           srcBlk = MB_INVALID_HANDLE;
731*4882a593Smuzhiyun     AVS_GRP_ATTR_S stAvsGrpAttr;
732*4882a593Smuzhiyun     AVS_CHN_ATTR_S stAvsChnAttr[AVS_MAX_CHN_NUM];
733*4882a593Smuzhiyun 
734*4882a593Smuzhiyun     s32Ret = TEST_AVS_InitAttr(pstCtx, &stAvsGrpAttr, stAvsChnAttr);
735*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
736*4882a593Smuzhiyun         RK_LOGE("avs [%d, %d] TEST_AVS_InitAttr failed: %#x!",
737*4882a593Smuzhiyun                 pstCtx->s32GrpIndex, 0, s32Ret);
738*4882a593Smuzhiyun         return s32Ret;
739*4882a593Smuzhiyun     }
740*4882a593Smuzhiyun 
741*4882a593Smuzhiyun     if (pstCtx->bGetFinalLut) {
742*4882a593Smuzhiyun         s32Ret = TEST_AVS_GetFinalLut(pstCtx->s32GrpIndex, &stAvsGrpAttr);
743*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
744*4882a593Smuzhiyun             RK_LOGE("avs [%d, %d] TEST_AVS_GetFinalLut failed: %#x!",
745*4882a593Smuzhiyun                     pstCtx->s32GrpIndex, 0, s32Ret);
746*4882a593Smuzhiyun             goto __FAILED;
747*4882a593Smuzhiyun         }
748*4882a593Smuzhiyun     }
749*4882a593Smuzhiyun 
750*4882a593Smuzhiyun     s32Ret = TEST_AVS_Start(pstCtx->s32GrpIndex, pstCtx->s32ChnNum,
751*4882a593Smuzhiyun                              &stAvsGrpAttr, stAvsChnAttr);
752*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
753*4882a593Smuzhiyun         RK_LOGE("avs [%d, %d] TEST_AVS_Start failed: %#x!",
754*4882a593Smuzhiyun                 pstCtx->s32GrpIndex, 0, s32Ret);
755*4882a593Smuzhiyun         goto __FAILED;
756*4882a593Smuzhiyun     }
757*4882a593Smuzhiyun 
758*4882a593Smuzhiyun     return RK_SUCCESS;
759*4882a593Smuzhiyun 
760*4882a593Smuzhiyun __FAILED:
761*4882a593Smuzhiyun     return s32Ret;
762*4882a593Smuzhiyun }
763*4882a593Smuzhiyun 
TEST_AVS_ModDeInit(TEST_AVS_CTX_S * pstCtx)764*4882a593Smuzhiyun RK_S32 TEST_AVS_ModDeInit(TEST_AVS_CTX_S *pstCtx) {
765*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
766*4882a593Smuzhiyun 
767*4882a593Smuzhiyun     s32Ret = TEST_AVS_Stop(pstCtx->s32GrpIndex, pstCtx->s32ChnNum);
768*4882a593Smuzhiyun 
769*4882a593Smuzhiyun     return s32Ret;
770*4882a593Smuzhiyun }
771*4882a593Smuzhiyun 
TEST_AVS_GetFileLen(const RK_CHAR * File)772*4882a593Smuzhiyun RK_U32 TEST_AVS_GetFileLen(const RK_CHAR* File) {
773*4882a593Smuzhiyun     FILE* FILE;
774*4882a593Smuzhiyun     RK_U32 u32FileLen;
775*4882a593Smuzhiyun     RK_S32 s32Ret;
776*4882a593Smuzhiyun 
777*4882a593Smuzhiyun     FILE = fopen(File, "rb");
778*4882a593Smuzhiyun     if (NULL != FILE) {
779*4882a593Smuzhiyun         s32Ret = fseek(FILE, 0L, SEEK_END);
780*4882a593Smuzhiyun         if (0 != s32Ret) {
781*4882a593Smuzhiyun             RK_LOGE("fseek err!");
782*4882a593Smuzhiyun             fclose(FILE);
783*4882a593Smuzhiyun             return 0;
784*4882a593Smuzhiyun         }
785*4882a593Smuzhiyun 
786*4882a593Smuzhiyun         u32FileLen = ftell(FILE);
787*4882a593Smuzhiyun 
788*4882a593Smuzhiyun         s32Ret = fseek(FILE, 0L, SEEK_SET);
789*4882a593Smuzhiyun         if (0 != s32Ret) {
790*4882a593Smuzhiyun             RK_LOGE("fseek err!");
791*4882a593Smuzhiyun             fclose(FILE);
792*4882a593Smuzhiyun             return 0;
793*4882a593Smuzhiyun         }
794*4882a593Smuzhiyun 
795*4882a593Smuzhiyun         fclose(FILE);
796*4882a593Smuzhiyun     } else {
797*4882a593Smuzhiyun         RK_LOGE("open file %s fail!", File);
798*4882a593Smuzhiyun         u32FileLen = 0;
799*4882a593Smuzhiyun     }
800*4882a593Smuzhiyun 
801*4882a593Smuzhiyun     return u32FileLen;
802*4882a593Smuzhiyun }
803*4882a593Smuzhiyun 
TEST_AVS_LoadFile(const RK_CHAR * File,RK_VOID * Addr,RK_U32 u32Size)804*4882a593Smuzhiyun RK_S32 TEST_AVS_LoadFile(const RK_CHAR* File, RK_VOID* Addr, RK_U32 u32Size) {
805*4882a593Smuzhiyun     FILE* FILE;
806*4882a593Smuzhiyun     RK_U32 u32ReadBytes;
807*4882a593Smuzhiyun 
808*4882a593Smuzhiyun     FILE = fopen(File, "rb");
809*4882a593Smuzhiyun     if (FILE != NULL) {
810*4882a593Smuzhiyun         u32ReadBytes = fread(Addr, u32Size, 1, FILE);
811*4882a593Smuzhiyun         fclose(FILE);
812*4882a593Smuzhiyun     } else {
813*4882a593Smuzhiyun         RK_LOGE("open file of %s failed!", File);
814*4882a593Smuzhiyun         return RK_FAILURE;
815*4882a593Smuzhiyun     }
816*4882a593Smuzhiyun 
817*4882a593Smuzhiyun     return RK_SUCCESS;
818*4882a593Smuzhiyun }
819*4882a593Smuzhiyun 
TEST_AVS_MallocLutBuf(TEST_AVS_CTX_S * pstCtx,RK_VOID *** lutBufsVirAddr)820*4882a593Smuzhiyun RK_S32 TEST_AVS_MallocLutBuf(TEST_AVS_CTX_S *pstCtx, RK_VOID ***lutBufsVirAddr) {
821*4882a593Smuzhiyun     RK_S32     s32Ret = RK_SUCCESS;
822*4882a593Smuzhiyun     RK_U32     u32LUTSize = 0;
823*4882a593Smuzhiyun     RK_CHAR    pLUTPath[AVS_PIPE_NUM][MAX_FILE_PATH_LEN] = {RK_NULL};
824*4882a593Smuzhiyun     MB_BLK     pLUTBlk[AVS_PIPE_NUM]            = {RK_NULL};
825*4882a593Smuzhiyun     RK_VOID  **pLUTVirAddr = reinterpret_cast<RK_VOID **>(
826*4882a593Smuzhiyun                         malloc(sizeof(RK_VOID*) * AVS_PIPE_NUM));
827*4882a593Smuzhiyun 
828*4882a593Smuzhiyun     for (RK_S32 i = 0; i < pstCtx->s32PipeNum; i++) {
829*4882a593Smuzhiyun         snprintf(pLUTPath[i], sizeof(pLUTPath[i]), "%s%s%d%s",
830*4882a593Smuzhiyun                     pstCtx->lutFilePath, "rk_ps_lut_", i, ".bin");
831*4882a593Smuzhiyun 
832*4882a593Smuzhiyun         u32LUTSize = TEST_AVS_GetFileLen(pLUTPath[i]);
833*4882a593Smuzhiyun         if (0 == u32LUTSize) {
834*4882a593Smuzhiyun             RK_LOGE("avs [%d, %d] open lut file %s failed!",
835*4882a593Smuzhiyun                     pstCtx->s32GrpIndex, i, pLUTPath[i]);
836*4882a593Smuzhiyun             s32Ret = RK_FAILURE;
837*4882a593Smuzhiyun 
838*4882a593Smuzhiyun             goto __FREE_LUT;
839*4882a593Smuzhiyun         }
840*4882a593Smuzhiyun 
841*4882a593Smuzhiyun         u32LUTSize = RK_ALIGN_256(u32LUTSize);
842*4882a593Smuzhiyun 
843*4882a593Smuzhiyun         s32Ret = RK_MPI_SYS_MmzAllocEx(&pLUTBlk[i], NULL, NULL,
844*4882a593Smuzhiyun                                     u32LUTSize,
845*4882a593Smuzhiyun                                     MB_REMAP_MODE_CACHED);
846*4882a593Smuzhiyun         if (RK_SUCCESS != s32Ret) {
847*4882a593Smuzhiyun             RK_LOGE("avs [%d, %d] alloc LUT buf failed with %#x!",
848*4882a593Smuzhiyun                     pstCtx->s32GrpIndex, i, s32Ret);
849*4882a593Smuzhiyun             goto __FREE_LUT;
850*4882a593Smuzhiyun         }
851*4882a593Smuzhiyun         pLUTVirAddr[i] = RK_MPI_MMZ_Handle2VirAddr(pLUTBlk[i]);
852*4882a593Smuzhiyun 
853*4882a593Smuzhiyun         RK_LOGV("avs [%d, %d] pipe lut buf size %d viraddr %p fread lut file: %s.",
854*4882a593Smuzhiyun                     pstCtx->s32GrpIndex, i, u32LUTSize, pLUTVirAddr[i], pLUTPath[i]);
855*4882a593Smuzhiyun         s32Ret = TEST_AVS_LoadFile(pLUTPath[i], pLUTVirAddr[i], u32LUTSize);
856*4882a593Smuzhiyun         if (RK_SUCCESS != s32Ret) {
857*4882a593Smuzhiyun             goto __FREE_LUT;
858*4882a593Smuzhiyun         }
859*4882a593Smuzhiyun     }
860*4882a593Smuzhiyun 
861*4882a593Smuzhiyun     *lutBufsVirAddr = pLUTVirAddr;
862*4882a593Smuzhiyun 
863*4882a593Smuzhiyun     return s32Ret;
864*4882a593Smuzhiyun 
865*4882a593Smuzhiyun __FREE_LUT:
866*4882a593Smuzhiyun 
867*4882a593Smuzhiyun     for (RK_S32 i = 0; i < AVS_PIPE_NUM; i++) {
868*4882a593Smuzhiyun         RK_SAFE_FREE(pLUTVirAddr[i]);
869*4882a593Smuzhiyun     }
870*4882a593Smuzhiyun     RK_SAFE_FREE(pLUTVirAddr);
871*4882a593Smuzhiyun 
872*4882a593Smuzhiyun     return s32Ret;
873*4882a593Smuzhiyun }
874*4882a593Smuzhiyun 
TEST_AVS_FreeLutBuf(AVS_GRP_ATTR_S * pstAvsGrpAttr)875*4882a593Smuzhiyun RK_S32 TEST_AVS_FreeLutBuf(AVS_GRP_ATTR_S *pstAvsGrpAttr) {
876*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
877*4882a593Smuzhiyun     MB_BLK pLUTBlk = RK_NULL;
878*4882a593Smuzhiyun 
879*4882a593Smuzhiyun     for (RK_S32 i = 0; i < AVS_PIPE_NUM; i++) {
880*4882a593Smuzhiyun         pLUTBlk = RK_MPI_MMZ_VirAddr2Handle(pstAvsGrpAttr->stInAttr.stLUT.pVirAddr[i]);
881*4882a593Smuzhiyun         if (RK_NULL != pLUTBlk) {
882*4882a593Smuzhiyun             s32Ret = RK_MPI_SYS_MmzFree(pLUTBlk);
883*4882a593Smuzhiyun             if (RK_SUCCESS != s32Ret) {
884*4882a593Smuzhiyun                 RK_LOGE("pipe %d Lut buf RK_MPI_SYS_MmzFree failed: %#x!", i, s32Ret);
885*4882a593Smuzhiyun             }
886*4882a593Smuzhiyun             pLUTBlk = RK_NULL;
887*4882a593Smuzhiyun         }
888*4882a593Smuzhiyun     }
889*4882a593Smuzhiyun 
890*4882a593Smuzhiyun     return s32Ret;
891*4882a593Smuzhiyun }
892*4882a593Smuzhiyun 
TEST_AVS_ComChnSetScale(TEST_AVS_CTX_S * pstCtx)893*4882a593Smuzhiyun RK_S32 TEST_AVS_ComChnSetScale(TEST_AVS_CTX_S *pstCtx) {
894*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
895*4882a593Smuzhiyun     AVS_CHN_ATTR_S tmpChnAttr;
896*4882a593Smuzhiyun 
897*4882a593Smuzhiyun     for (RK_S32 AvsChn = 0; AvsChn < pstCtx->s32ChnNum; AvsChn++) {
898*4882a593Smuzhiyun         s32Ret = RK_MPI_AVS_GetChnAttr(pstCtx->s32GrpIndex, AvsChn, &tmpChnAttr);
899*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
900*4882a593Smuzhiyun             RK_LOGE("avs [%d, %d] RK_MPI_AVS_GetChnAttr failed: %#x!",
901*4882a593Smuzhiyun                     pstCtx->s32GrpIndex, AvsChn, s32Ret);
902*4882a593Smuzhiyun             return s32Ret;
903*4882a593Smuzhiyun         }
904*4882a593Smuzhiyun 
905*4882a593Smuzhiyun         tmpChnAttr.u32Width = pstCtx->u32DstWidth;
906*4882a593Smuzhiyun         tmpChnAttr.u32Height = pstCtx->u32DstHeight;
907*4882a593Smuzhiyun         RK_LOGV("set new chn attr u32Width: %d, u32Height: %d.",
908*4882a593Smuzhiyun                 tmpChnAttr.u32Width, tmpChnAttr.u32Height);
909*4882a593Smuzhiyun 
910*4882a593Smuzhiyun         s32Ret = RK_MPI_AVS_SetChnAttr(pstCtx->s32GrpIndex, AvsChn, &tmpChnAttr);
911*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
912*4882a593Smuzhiyun             RK_LOGE("avs [%d, %d] RK_MPI_AVS_SetChnAttr failed: %#x!",
913*4882a593Smuzhiyun                     pstCtx->s32GrpIndex, AvsChn, s32Ret);
914*4882a593Smuzhiyun             return s32Ret;
915*4882a593Smuzhiyun         }
916*4882a593Smuzhiyun     }
917*4882a593Smuzhiyun 
918*4882a593Smuzhiyun     return s32Ret;
919*4882a593Smuzhiyun }
920*4882a593Smuzhiyun 
TEST_AVS_ComGrpChnSetScale(TEST_AVS_CTX_S * pstCtx)921*4882a593Smuzhiyun RK_S32 TEST_AVS_ComGrpChnSetScale(TEST_AVS_CTX_S *pstCtx) {
922*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
923*4882a593Smuzhiyun     AVS_GRP_ATTR_S tmpGrpAttr;
924*4882a593Smuzhiyun     AVS_CHN_ATTR_S tmpChnAttr;
925*4882a593Smuzhiyun 
926*4882a593Smuzhiyun     s32Ret = RK_MPI_AVS_GetGrpAttr(pstCtx->s32GrpIndex, &tmpGrpAttr);
927*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
928*4882a593Smuzhiyun         RK_LOGE("avs [%d] RK_MPI_AVS_GetGrpAttr failed: %#x!",
929*4882a593Smuzhiyun                     pstCtx->s32GrpIndex, s32Ret);
930*4882a593Smuzhiyun         return s32Ret;
931*4882a593Smuzhiyun     }
932*4882a593Smuzhiyun 
933*4882a593Smuzhiyun     tmpGrpAttr.stOutAttr.stCenter.s32X = pstCtx->stCenter.s32X;
934*4882a593Smuzhiyun     tmpGrpAttr.stOutAttr.stCenter.s32Y = pstCtx->stCenter.s32Y;
935*4882a593Smuzhiyun     RK_LOGV("set new grp attr centerX: %d, centerY: %d.",
936*4882a593Smuzhiyun             tmpGrpAttr.stOutAttr.stCenter.s32X, tmpGrpAttr.stOutAttr.stCenter.s32Y);
937*4882a593Smuzhiyun 
938*4882a593Smuzhiyun     s32Ret = RK_MPI_AVS_SetGrpAttr(pstCtx->s32GrpIndex, &tmpGrpAttr);
939*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
940*4882a593Smuzhiyun         RK_LOGE("avs [%d] RK_MPI_AVS_SetGrpAttr failed: %#x!",
941*4882a593Smuzhiyun                     pstCtx->s32GrpIndex, s32Ret);
942*4882a593Smuzhiyun         return s32Ret;
943*4882a593Smuzhiyun     }
944*4882a593Smuzhiyun 
945*4882a593Smuzhiyun     for (RK_S32 AvsChn = 0; AvsChn < pstCtx->s32ChnNum; AvsChn++) {
946*4882a593Smuzhiyun         s32Ret = RK_MPI_AVS_GetChnAttr(pstCtx->s32GrpIndex, AvsChn, &tmpChnAttr);
947*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
948*4882a593Smuzhiyun             RK_LOGE("avs [%d, %d] RK_MPI_AVS_GetChnAttr failed: %#x!",
949*4882a593Smuzhiyun                     pstCtx->s32GrpIndex, AvsChn, s32Ret);
950*4882a593Smuzhiyun             return s32Ret;
951*4882a593Smuzhiyun         }
952*4882a593Smuzhiyun 
953*4882a593Smuzhiyun         tmpChnAttr.u32Width = pstCtx->u32DstWidth;
954*4882a593Smuzhiyun         tmpChnAttr.u32Height = pstCtx->u32DstHeight;
955*4882a593Smuzhiyun         RK_LOGV("set new chn attr u32Width: %d, u32Height: %d.",
956*4882a593Smuzhiyun                 tmpChnAttr.u32Width, tmpChnAttr.u32Height);
957*4882a593Smuzhiyun 
958*4882a593Smuzhiyun         s32Ret = RK_MPI_AVS_SetChnAttr(pstCtx->s32GrpIndex, AvsChn, &tmpChnAttr);
959*4882a593Smuzhiyun         if (s32Ret != RK_SUCCESS) {
960*4882a593Smuzhiyun             RK_LOGE("avs [%d, %d] RK_MPI_AVS_SetChnAttr failed: %#x!",
961*4882a593Smuzhiyun                     pstCtx->s32GrpIndex, AvsChn, s32Ret);
962*4882a593Smuzhiyun             return s32Ret;
963*4882a593Smuzhiyun         }
964*4882a593Smuzhiyun     }
965*4882a593Smuzhiyun 
966*4882a593Smuzhiyun     return s32Ret;
967*4882a593Smuzhiyun }
968*4882a593Smuzhiyun 
TEST_AVS_GetFinalLut(AVS_GRP AvsGrp,AVS_GRP_ATTR_S * pstAvsGrpAttr)969*4882a593Smuzhiyun RK_S32 TEST_AVS_GetFinalLut(AVS_GRP AvsGrp, AVS_GRP_ATTR_S *pstAvsGrpAttr) {
970*4882a593Smuzhiyun     RK_S32 s32Ret = RK_SUCCESS;
971*4882a593Smuzhiyun 
972*4882a593Smuzhiyun     s32Ret = RK_MPI_AVS_CreateGrp(AvsGrp, pstAvsGrpAttr);
973*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
974*4882a593Smuzhiyun         RK_LOGE("avs [%d, %d] RK_MPI_AVS_CreateGrp failed: %#x!",
975*4882a593Smuzhiyun                 AvsGrp, 0, s32Ret);
976*4882a593Smuzhiyun         return s32Ret;
977*4882a593Smuzhiyun     }
978*4882a593Smuzhiyun     RK_LOGV("avs [%d, %d] RK_MPI_AVS_CreateGrp already.", AvsGrp, 0);
979*4882a593Smuzhiyun 
980*4882a593Smuzhiyun     RK_U16 *u16LdchData[AVS_PIPE_NUM] = {RK_NULL};
981*4882a593Smuzhiyun     AVS_FINAL_LUT_S pstFinalLut;
982*4882a593Smuzhiyun 
983*4882a593Smuzhiyun     MB_EXT_CONFIG_S stMbExtConfig;
984*4882a593Smuzhiyun     for (RK_S32 i = 0; i < pstAvsGrpAttr->u32PipeNum; i++) {
985*4882a593Smuzhiyun         u16LdchData[i] = (RK_U16 *)(malloc(61896));
986*4882a593Smuzhiyun 
987*4882a593Smuzhiyun         memset(&stMbExtConfig, 0, sizeof(MB_EXT_CONFIG_S));
988*4882a593Smuzhiyun         stMbExtConfig.pOpaque = u16LdchData[i];
989*4882a593Smuzhiyun         stMbExtConfig.pu8VirAddr = (RK_U8 *)u16LdchData[i];
990*4882a593Smuzhiyun         stMbExtConfig.u64Size = 61896;
991*4882a593Smuzhiyun 
992*4882a593Smuzhiyun         s32Ret = RK_MPI_SYS_CreateMB(&(pstFinalLut.pLdchBlk[i]), &stMbExtConfig);
993*4882a593Smuzhiyun         if (RK_SUCCESS != s32Ret) {
994*4882a593Smuzhiyun             RK_LOGE("avs [%d, %d] create ldch blk failed with %#x!",
995*4882a593Smuzhiyun                     AvsGrp, i, s32Ret);
996*4882a593Smuzhiyun         }
997*4882a593Smuzhiyun     }
998*4882a593Smuzhiyun 
999*4882a593Smuzhiyun     s32Ret = RK_MPI_AVS_GetFinalLut(AvsGrp, &pstFinalLut);
1000*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
1001*4882a593Smuzhiyun         RK_LOGE("avs [%d, %d] RK_MPI_AVS_GetFinalLut failed: %#x!",
1002*4882a593Smuzhiyun                 AvsGrp, 0, s32Ret);
1003*4882a593Smuzhiyun         goto __FAILED;
1004*4882a593Smuzhiyun     }
1005*4882a593Smuzhiyun     RK_LOGV("avs [%d, %d] RK_MPI_AVS_GetFinalLut already.", AvsGrp, 0);
1006*4882a593Smuzhiyun 
1007*4882a593Smuzhiyun __FAILED:
1008*4882a593Smuzhiyun     for (RK_S32 i = 0; i < pstAvsGrpAttr->u32PipeNum; i++) {
1009*4882a593Smuzhiyun         RK_MPI_SYS_Free(pstFinalLut.pLdchBlk[i]);
1010*4882a593Smuzhiyun         if (u16LdchData[i]) {
1011*4882a593Smuzhiyun             free(u16LdchData[i]);
1012*4882a593Smuzhiyun         }
1013*4882a593Smuzhiyun     }
1014*4882a593Smuzhiyun 
1015*4882a593Smuzhiyun     s32Ret = RK_MPI_AVS_DestroyGrp(AvsGrp);
1016*4882a593Smuzhiyun     if (s32Ret != RK_SUCCESS) {
1017*4882a593Smuzhiyun         RK_LOGE("avs [%d, %d] RK_MPI_AVS_DestroyGrp failed: %#x!!",
1018*4882a593Smuzhiyun                 AvsGrp, 0, s32Ret);
1019*4882a593Smuzhiyun     }
1020*4882a593Smuzhiyun     RK_LOGV("avs [%d, %d] RK_MPI_AVS_DestroyGrp already.", AvsGrp, 0);
1021*4882a593Smuzhiyun 
1022*4882a593Smuzhiyun     return s32Ret;
1023*4882a593Smuzhiyun }
1024*4882a593Smuzhiyun 
1025*4882a593Smuzhiyun 
1026*4882a593Smuzhiyun #ifdef __cplusplus
1027*4882a593Smuzhiyun #if __cplusplus
1028*4882a593Smuzhiyun }
1029*4882a593Smuzhiyun #endif
1030*4882a593Smuzhiyun #endif /* End of #ifdef __cplusplus */
1031*4882a593Smuzhiyun 
1032