luckfox-pico-sdk/media/samples/common/sample_comm_tde.c
2023-08-08 20:36:47 +08:00

175 lines
5.5 KiB
C

/*
* Copyright 2022 Rockchip Electronics Co. LTD
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif /* End of #ifdef __cplusplus */
#include <error.h>
#include <stdio.h>
#include "sample_comm.h"
RK_S32 SAMPLE_COMM_TDE_Create(SAMPLE_TDE_CTX_S *ctx) {
RK_S32 s32Ret = RK_FAILURE;
MB_POOL_CONFIG_S stMbPoolCfg;
PIC_BUF_ATTR_S stPicBufAttr;
MB_PIC_CAL_S stMbPicCalResult;
memset(&stMbPoolCfg, 0, sizeof(MB_POOL_CONFIG_S));
memset(&stPicBufAttr, 0, sizeof(PIC_BUF_ATTR_S));
memset(&stMbPicCalResult, 0, sizeof(MB_PIC_CAL_S));
stPicBufAttr.u32Width = ctx->u32TdeWidth;
stPicBufAttr.u32Height = ctx->u32TdeHeight;
stPicBufAttr.enPixelFormat = ctx->enSrcPixelFormat;
stPicBufAttr.enCompMode = ctx->enSrcPixelFormat;
s32Ret = RK_MPI_CAL_TDE_GetPicBufferSize(&stPicBufAttr, &stMbPicCalResult);
RK_LOGD("u32MBSize is %d", stMbPicCalResult.u32MBSize);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("RK_MPI_CAL_TDE_GetPicBufferSize Failure s32Ret:%#X", s32Ret);
return s32Ret;
}
memset(&stMbPoolCfg, 0, sizeof(MB_POOL_CONFIG_S));
stMbPoolCfg.u64MBSize = stMbPicCalResult.u32MBSize;
if (ctx->u32BufferPoolCnt) {
stMbPoolCfg.u32MBCnt = ctx->u32BufferPoolCnt;
} else {
stMbPoolCfg.u32MBCnt = 1;
}
stMbPoolCfg.enAllocType = MB_ALLOC_TYPE_DMA;
stMbPoolCfg.bPreAlloc = RK_FALSE;
RK_LOGE("buffer pool one size:%d", stMbPicCalResult.u32MBSize);
ctx->u32buffersize = stMbPicCalResult.u32MBSize;
ctx->stVideoFrames.stVFrame.u32Width = ctx->u32TdeWidth;
ctx->stVideoFrames.stVFrame.u32Height = ctx->u32TdeHeight;
ctx->stVideoFrames.stVFrame.u32VirWidth = ctx->u32TdeWidth;
ctx->stVideoFrames.stVFrame.u32VirHeight = ctx->u32TdeHeight;
ctx->stVideoFrames.stVFrame.enPixelFormat = ctx->enSrcPixelFormat;
ctx->stVideoFrames.stVFrame.enCompressMode = ctx->enSrcPixelFormat;
ctx->tde_frame_pool = RK_MPI_MB_CreatePool(&stMbPoolCfg);
if (ctx->tde_frame_pool == MB_INVALID_POOLID) {
RK_LOGE("RK_MPI_MB_CreatePool Failure, the pool is MB_INVALID_POOLID");
return RK_FAILURE;
}
ctx->pstSrc.u32Width = ctx->u32SrcWidth;
ctx->pstSrc.u32Height = ctx->u32SrcHeight;
ctx->pstSrc.enColorFmt = ctx->enSrcPixelFormat;
ctx->pstSrc.enComprocessMode = ctx->enSrcPixelFormat;
ctx->pstSrcRect.s32Xpos = 0;
ctx->pstSrcRect.s32Ypos = 0;
ctx->pstSrcRect.u32Width = ctx->u32TdeWidth;
ctx->pstSrcRect.u32Height = ctx->u32TdeHeight;
ctx->pstDst.u32Width = ctx->u32TdeWidth;
ctx->pstDst.u32Height = ctx->u32TdeHeight;
ctx->pstDst.enColorFmt = RK_FMT_YUV420SP;
ctx->pstDst.enComprocessMode = COMPRESS_MODE_NONE;
ctx->pstDstRect.s32Xpos = 0;
ctx->pstDstRect.s32Ypos = 0;
ctx->pstDstRect.u32Width = ctx->u32TdeWidth;
ctx->pstDstRect.u32Height = ctx->u32TdeHeight;
s32Ret = RK_TDE_Open();
if (s32Ret != RK_SUCCESS) {
RK_LOGE("RK_TDE_Open Failure s32Ret:%#X", s32Ret);
return s32Ret;
}
return s32Ret;
}
RK_S32 SAMPLE_COMM_TDE_Handle(SAMPLE_TDE_CTX_S *ctx, VIDEO_FRAME_S *pStVFrame) {
RK_S32 s32Ret = RK_FAILURE;
ctx->hHandle = RK_TDE_BeginJob();
if (RK_ERR_TDE_INVALID_HANDLE == ctx->hHandle) {
RK_LOGE("RK_TDE_BeginJob Failure chnid%d", ctx->u32ChnId);
return RK_FAILURE;
}
ctx->pstSrc.pMbBlk = pStVFrame->pMbBlk;
ctx->pstDst.pMbBlk = ctx->stVideoFrames.stVFrame.pMbBlk;
ctx->stVideoFrames.stVFrame.u32TimeRef = pStVFrame->u32TimeRef;
ctx->stVideoFrames.stVFrame.u64PTS = pStVFrame->u64PTS;
s32Ret = RK_TDE_QuickCopy(ctx->hHandle, &ctx->pstSrc, &ctx->pstSrcRect, &ctx->pstDst,
&ctx->pstDstRect);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("RK_TDE_QuickCopy Failure %#X chnid: %d", s32Ret, ctx->u32ChnId);
RK_TDE_CancelJob(ctx->hHandle);
return s32Ret;
}
s32Ret = RK_TDE_EndJob(ctx->hHandle, RK_FALSE, RK_TRUE, -1);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("RK_TDE_EndJob Failure %#X chnid: %d", s32Ret, ctx->u32ChnId);
RK_TDE_CancelJob(ctx->hHandle);
return s32Ret;
}
s32Ret = RK_TDE_WaitForDone(ctx->hHandle);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("RK_TDE_WaitForDone Failure s32Ret: %#X chnid:%d", s32Ret,
ctx->u32ChnId);
return s32Ret;
}
return s32Ret;
}
RK_S32 SAMPLE_COMM_TDE_GetMB(SAMPLE_TDE_CTX_S *ctx) {
ctx->stVideoFrames.stVFrame.pMbBlk =
RK_MPI_MB_GetMB(ctx->tde_frame_pool, ctx->u32buffersize, RK_TRUE);
if (ctx->stVideoFrames.stVFrame.pMbBlk == MB_INVALID_HANDLE) {
RK_LOGE("RK_MPI_MB_GetMB Failure pMbBlk is MB_INVALID_HANDLE tde:%d",
ctx->u32ChnId);
return RK_FAILURE;
}
return RK_SUCCESS;
}
RK_S32 SAMPLE_COMM_TDE_ReleaseMB(SAMPLE_TDE_CTX_S *ctx) {
RK_S32 s32Ret = RK_FAILURE;
s32Ret = RK_MPI_MB_ReleaseMB(ctx->stVideoFrames.stVFrame.pMbBlk);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("RK_MPI_MB_ReleaseMB Failure tde:%d s32Ret: %#X", ctx->u32ChnId, s32Ret);
return s32Ret;
}
return s32Ret;
}
RK_S32 SAMPLE_COMM_TDE_Destroy(SAMPLE_TDE_CTX_S *ctx) {
RK_S32 s32Ret = RK_FAILURE;
s32Ret = RK_MPI_MB_DestroyPool(ctx->tde_frame_pool);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("RK_MPI_MB_DestroyPool Failure s32Ret: %#X pool:%d", s32Ret,
ctx->tde_frame_pool);
return s32Ret;
}
RK_TDE_Close();
return s32Ret;
}