luckfox-pico-sdk/media/samples/example/test/sample_demo_aiisp_stresstest.c
luckfox-eng29 8f34c2760d project:build.sh: Added fastboot support; custom modifications to U-Boot and kernel implemented using patches.
project:cfg:BoardConfig_IPC: Added fastboot BoardConfig file and firmware post-scripts, distinguishing between
the BoardConfigs for Luckfox Pico Pro and Luckfox Pico Max. project:app: Added fastboot_client and rk_smart_door
for quick boot applications; updated rkipc app to adapt to the latest media library. media:samples: Added more
usage examples. media:rockit: Fixed bugs; removed support for retrieving data frames from VPSS. media:isp:
Updated rkaiq library and related tools to support connection to RKISP_Tuner. sysdrv:Makefile: Added support for
compiling drv_ko on Luckfox Pico Ultra W using Ubuntu; added support for custom root filesystem.
sysdrv:tools:board: Updated Buildroot optional mirror sources, updated some software versions, and stored device
tree files and configuration files that undergo multiple modifications for U-Boot and kernel separately.
sysdrv:source:mcu: Used RISC-V MCU SDK with RT-Thread system, mainly for initializing camera AE during quick
boot. sysdrv:source:uboot: Added support for fastboot; added high baud rate DDR bin for serial firmware upgrades.
sysdrv:source:kernel: Upgraded to version 5.10.160; increased NPU frequency for RV1106G3; added support for
fastboot.

Signed-off-by: luckfox-eng29 <eng29@luckfox.com>
2024-10-14 09:47:04 +08:00

2219 lines
70 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif /* End of #ifdef __cplusplus */
#include <assert.h>
#include <errno.h>
#include <fcntl.h>
#include <getopt.h>
#include <pthread.h>
#include <semaphore.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/prctl.h>
#include <sys/syscall.h>
#include <time.h>
#include <unistd.h>
#include "rtsp_demo.h"
#include "sample_comm.h"
#ifdef ROCKIVA
#include "rockiva/rockiva_ba_api.h"
#endif
#define VENC_CHN_MAX 3
#define BUFFER_SIZE 255
#define RGN_NUM_MAX 4
#define GET_STREAM_TIMEOUT 2000
#define SEND_STREAM_TIMEOUT 2000
#define RGN_ATTACH_VPSS 0
#define RGN_ATTACH_VENC 1
typedef struct _rkModeTest {
RK_BOOL bIfMainThreadQuit;
RK_BOOL bIfVencThreadQuit[VENC_CHN_MAX];
RK_BOOL bIfModuleTestThreadQuit;
RK_BOOL bIfIvsDetectThreadQuit;
RK_BOOL bIfVpssIvaTHreadQuit;
RK_BOOL bIfModuleTestopen;
RK_BOOL bIfenable_ai_isp;
RK_BOOL bIfenable_iva;
RK_BOOL bMultictx;
RK_BOOL aiisp_force_type;
RK_BOOL bIfaiisp_force_switch;
RK_S32 s32CamId;
RK_U32 rgn_attach_module;
RK_S32 s32ModuleTestType;
RK_U32 u32ModuleTestLoop;
RK_U32 u32TestFrameCount;
RK_U32 u32VencGetFrameCount[VENC_CHN_MAX];
RK_CHAR *inputBmp1Path;
RK_CHAR *inputBmp2Path;
RK_CHAR *pIqFileDir;
rk_aiq_working_mode_t eHdrMode;
CODEC_TYPE_E enCodecType;
pthread_t vpss_iva_thread_id;
} g_mode_test;
typedef struct _rkMpiCtx {
SAMPLE_VI_CTX_S vi;
SAMPLE_VENC_CTX_S venc[VENC_CHN_MAX];
SAMPLE_RGN_CTX_S rgn[RGN_NUM_MAX];
SAMPLE_VPSS_CTX_S vpss;
#ifdef ROCKIT_IVS
SAMPLE_IVS_CTX_S ivs;
#endif
#ifdef ROCKIVA
SAMPLE_IVA_CTX_S iva;
#endif
} SAMPLE_MPI_CTX_S;
/* global param */
static SAMPLE_MPI_CTX_S *ctx;
static g_mode_test *gModeTest = RK_NULL;
static RK_S32 g_exit_result = RK_SUCCESS;
static sem_t g_sem_module_test[VENC_CHN_MAX];
static pthread_mutex_t g_rtsp_mutex = {0};
static pthread_mutex_t g_frame_count_mutex[VENC_CHN_MAX];
static RK_BOOL g_rtsp_ifenbale = RK_FALSE;
rtsp_demo_handle g_rtsplive = RK_NULL;
static rtsp_session_handle g_rtsp_session[VENC_CHN_MAX] = {RK_NULL};
static pthread_t ivs_detect_thread_id;
static RK_S32 aiisp_callback(RK_VOID *pAinrParam, RK_VOID *pPrivateData) {
if (pAinrParam == RK_NULL) {
return RK_FAILURE;
}
memset(pAinrParam, 0, sizeof(rk_ainr_param));
SAMPLE_COMM_ISP_GetAINrParams(0, pAinrParam);
if (gModeTest->s32ModuleTestType == 11 && gModeTest->bIfaiisp_force_switch) {
((rk_ainr_param *)pAinrParam)->enable = gModeTest->aiisp_force_type;
}
return RK_SUCCESS;
}
static void program_handle_error(const char *func, RK_U32 line) {
RK_LOGE("func: <%s> line: <%d> error exit!", func, line);
g_exit_result = RK_FAILURE;
gModeTest->bIfMainThreadQuit = RK_TRUE;
}
static void program_normal_exit(const char *func, RK_U32 line) {
RK_LOGE("func: <%s> line: <%d> normal exit!", func, line);
gModeTest->bIfMainThreadQuit = RK_TRUE;
}
static void sigterm_handler(int sig) {
fprintf(stderr, "signal %d\n", sig);
program_normal_exit(__func__, __LINE__);
}
static RK_CHAR optstr[] = "?::a::w:h:o:l:b:f:c:t:l:n:r:v:e:m:i:I:";
static const struct option long_options[] = {
{"aiq", optional_argument, RK_NULL, 'a'},
{"width", required_argument, RK_NULL, 'w'},
{"height", required_argument, RK_NULL, 'h'},
{"encode", required_argument, RK_NULL, 'e'},
{"mode_test_type", required_argument, RK_NULL, 'm'},
{"output_path", required_argument, RK_NULL, 'o'},
{"loop_count", required_argument, RK_NULL, 'l'},
{"bitrate", required_argument, NULL, 'b'},
{"fps", required_argument, RK_NULL, 'f'},
{"test_frame_count", required_argument, RK_NULL, 'c'},
{"mode_test_loop", required_argument, RK_NULL, 't' + 'l'},
{"enable_npu", required_argument, NULL, 'n'},
{"vi_buff_cnt", required_argument, RK_NULL, 'v'},
{"vi_chnid", required_argument, RK_NULL, 'v' + 'i'},
{"iva_detect_speed", required_argument, RK_NULL, 'd'},
{"iva_model_path", required_argument, RK_NULL, 'i' + 'm'},
{"enable_aiisp", required_argument, RK_NULL, 'e' + 'a'},
{"enable_iva", required_argument, RK_NULL, 'e' + 'i'},
{"inputBmpPath1", required_argument, RK_NULL, 'i'},
{"inputBmpPath2", required_argument, RK_NULL, 'I'},
{"help", optional_argument, RK_NULL, '?'},
{RK_NULL, 0, RK_NULL, 0},
};
/******************************************************************************
* function : show usage
******************************************************************************/
static void print_usage(const RK_CHAR *name) {
printf("RV1126 example:\n");
printf("\t%s -w 2688 -h 1520 -a /etc/iqfiles/ -e h264cbr -b 4096 --enable_aiisp 1 -m "
"0 --test_frame_count 10 --mode_test_loop 50\n",
name);
printf("RV1106 example:\n");
printf("\t%s -w 2560 -h 1440 -a /etc/iqfiles/ -e h264cbr -b 2048 --enable_aiisp 1 -m "
"0 --test_frame_count 10 --mode_test_loop 50 --vi_buff_cnt 2\n",
name);
#ifdef RKAIQ
printf("\t-a | --aiq : enable aiq with dirpath provided, eg:-a /etc/iqfiles/, \n"
"\t set dirpath empty to using path by default, without "
"this option aiq \n"
"\t should run in other application\n");
#endif
printf("\t-w | --width : mainStream width, must is sensor width\n");
printf("\t-h | --height : mainStream height, must is sensor height\n");
printf("\t-e | --encode: encode type, Default:h264cbr, Value:h264cbr, "
"h264vbr, h264avbr "
"h265cbr, h265vbr, h265avbr, mjpegcbr, mjpegvbr\n");
printf(
"\t-m | --mode_test_type : test type, 0:none, 1: pn_mode_test 2: hdr_mode_test \n"
" \t 3: framerate_switch_test, 4: vpss_ai_isp_switchTest, 5:"
"vpss_chn0_resolution_switch_test, 6: vpss_venc_chn0_resolution_switch_test\n"
"\t 7: encode_type_switch, 8: vpss_rgn_init_and_deinit, 9: "
"venc_rgn_init_and_deinit, 10: Media_deinit_and_init, 11: "
"aiisp_force_switch_test. Default: 0\n");
printf("\t-b | --bitrate: encode bitrate, Default 4096\n");
printf("\t-o | --output_path : encode output file path, Default: RK_NULL\n");
printf("\t-l | --loop_count : when encoder output frameCounts equal to "
"<loop_count>, "
"process will exit. Default: -1\n");
printf("\t-v | --vi_buff_cnt : main stream vi buffer num, Default: 6\n");
printf("\t--vi_chnid : vi channel id, default: 0\n");
printf("\t--test_frame_count : when encoder outputs frameCount equal to "
"<test_frame_count>, mode_test start next loop, default: 50\n");
printf("\t--mode_test_loop : module test loop, default: -1\n");
printf("\t-i | --inputpathbmp1 : input bmp file path. default: RK_NULL\n");
printf("\t-I | --inputpathbmp2 : input bmp file path. default: RK_NULL\n");
printf("\t-f | --fps : set fps, default: 25\n");
printf("\t-n | --enable_npu: enable npu, 0: close, 1: enable. Default 1\n");
printf("\t--enable_aiisp : enable ai isp, 0: close, 1: enable. default: 1\n");
printf("\t--enable_iva : enable iva, 0: close, 1: enable. default: 1\n");
printf("\t--iva_detect_speed : iva detect framerate. default: 10\n");
printf("\t--iva_model_path : iva model data path, default: /oem/usr/lib\n");
}
static void *venc_get_stream(void *pArgs) {
SAMPLE_VENC_CTX_S *ctx = (SAMPLE_VENC_CTX_S *)pArgs;
RK_S32 s32Ret = RK_FAILURE;
FILE *fp = RK_NULL;
RK_S32 s32fd = 0;
RK_S32 loopCount = 0;
RK_VOID *pData = RK_NULL;
RK_CHAR name[BUFFER_SIZE] = {0};
sprintf(name, "venc_%d_get_stream", ctx->s32ChnId);
prctl(PR_SET_NAME, name);
if (ctx->dstFilePath) {
memset(name, 0, BUFFER_SIZE);
snprintf(name, sizeof(name), "/%s/venc_%d.bin", ctx->dstFilePath, ctx->s32ChnId);
fp = fopen(name, "wb");
if (fp == RK_NULL) {
RK_LOGE("chn %d can't open %s file !\n", ctx->s32ChnId, ctx->dstFilePath);
program_handle_error(__func__, __LINE__);
return RK_NULL;
}
s32fd = fileno(fp);
}
while (!gModeTest->bIfVencThreadQuit[ctx->s32ChnId]) {
s32Ret = SAMPLE_COMM_VENC_GetStream(ctx, &pData);
if (s32Ret == RK_SUCCESS) {
if (ctx->s32loopCount > 0) {
if (loopCount >= ctx->s32loopCount) {
SAMPLE_COMM_VENC_ReleaseStream(ctx);
program_normal_exit(__func__, __LINE__);
break;
}
}
if (fp && !gModeTest->bIfMainThreadQuit) {
fwrite(pData, 1, ctx->stFrame.pstPack->u32Len, fp);
fflush(fp);
}
// PrintStreamDetails(ctx->s32ChnId, ctx->stFrame.pstPack->u32Len);
if (g_rtsp_ifenbale) {
pthread_mutex_lock(&g_rtsp_mutex);
rtsp_tx_video(g_rtsp_session[ctx->s32ChnId], pData,
ctx->stFrame.pstPack->u32Len, ctx->stFrame.pstPack->u64PTS);
rtsp_do_event(g_rtsplive);
pthread_mutex_unlock(&g_rtsp_mutex);
} else {
RK_LOGD("venc %d get_stream count: %d", ctx->s32ChnId, loopCount);
}
if (gModeTest->bIfModuleTestopen) {
pthread_mutex_lock(&g_frame_count_mutex[ctx->s32ChnId]);
gModeTest->u32VencGetFrameCount[ctx->s32ChnId]++;
pthread_mutex_unlock(&g_frame_count_mutex[ctx->s32ChnId]);
if (gModeTest->u32VencGetFrameCount[ctx->s32ChnId] >=
gModeTest->u32TestFrameCount) {
sem_post(&g_sem_module_test[ctx->s32ChnId]);
}
}
RK_LOGI("venc %d get_stream count: %d", ctx->s32ChnId, loopCount);
SAMPLE_COMM_VENC_ReleaseStream(ctx);
loopCount++;
}
}
if (fp) {
fsync(s32fd);
fclose(fp);
fp = RK_NULL;
}
RK_LOGE("venc_get_stream chnid:%d exit", ctx->s32ChnId);
return RK_NULL;
}
static RK_S32 rgn_init(RK_CHAR *bmp1_file_path, RK_CHAR *bmp2_file_path,
SAMPLE_MPI_CTX_S *ctx, RK_S32 rgn_attach_module) {
RK_S32 s32Ret = RK_FAILURE;
MPP_CHN_S RGN_CHN;
RK_U32 u32Width = 0;
RK_U32 u32Height = 0;
if (rgn_attach_module == RGN_ATTACH_VENC) {
RGN_CHN.enModId = RK_ID_VENC;
RGN_CHN.s32ChnId = 0;
RGN_CHN.s32DevId = 0;
} else if (rgn_attach_module == RGN_ATTACH_VPSS) {
RGN_CHN.enModId = RK_ID_VPSS;
RGN_CHN.s32ChnId = VPSS_MAX_CHN_NUM;
RGN_CHN.s32DevId = ctx->vpss.s32GrpId;
} else {
return 0;
}
/* Init RGN[0] */
ctx->rgn[0].rgnHandle = 0;
ctx->rgn[0].stRgnAttr.enType = COVER_RGN;
ctx->rgn[0].stMppChn.enModId = RGN_CHN.enModId;
ctx->rgn[0].stMppChn.s32ChnId = RGN_CHN.s32ChnId;
ctx->rgn[0].stMppChn.s32DevId = RGN_CHN.s32DevId;
ctx->rgn[0].stRegion.s32X = 0; // must be 16 aligned
ctx->rgn[0].stRegion.s32Y = 0; // must be 16 aligned
ctx->rgn[0].stRegion.u32Width = 256; // must be 16 aligned
ctx->rgn[0].stRegion.u32Height = 256; // must be 16 aligned
ctx->rgn[0].u32Color = 0x00f800;
ctx->rgn[0].u32Layer = 1;
s32Ret = SAMPLE_COMM_RGN_CreateChn(&ctx->rgn[0]);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("SAMPLE_COMM_RGN_CreateChn Failure s32Ret:%#X rgn handle:%d", s32Ret,
ctx->rgn[0].rgnHandle);
return s32Ret;
}
ctx->rgn[1].rgnHandle = 1;
ctx->rgn[1].stRgnAttr.enType = COVER_RGN;
ctx->rgn[1].stMppChn.enModId = RGN_CHN.enModId;
ctx->rgn[1].stMppChn.s32ChnId = RGN_CHN.s32ChnId;
ctx->rgn[1].stMppChn.s32DevId = RGN_CHN.s32DevId;
ctx->rgn[1].stRegion.s32X = 0;
; // must be 16 aligned
ctx->rgn[1].stRegion.s32Y = 0; // must be 16 aligned
ctx->rgn[1].stRegion.u32Width = 128; // must be 16 aligned
ctx->rgn[1].stRegion.u32Height = 128; // must be 16 aligned
ctx->rgn[1].u32Color = 0x00ffff;
ctx->rgn[1].u32Layer = 2;
s32Ret = SAMPLE_COMM_RGN_CreateChn(&ctx->rgn[1]);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("SAMPLE_COMM_RGN_CreateChn Failure s32Ret:%#X rgn handle:%d", s32Ret,
ctx->rgn[1].rgnHandle);
return s32Ret;
}
s32Ret = SAMPLE_COMM_GetBmpResolution(bmp1_file_path, &u32Width, &u32Height);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("SAMPLE_COMM_GetBmpResolution failure");
u32Width = 256;
u32Height = 256;
}
ctx->rgn[2].rgnHandle = 2;
ctx->rgn[2].stRgnAttr.unAttr.stOverlay.u32CanvasNum = 2;
ctx->rgn[2].stRgnAttr.enType = OVERLAY_RGN;
ctx->rgn[2].stMppChn.enModId = RGN_CHN.enModId;
ctx->rgn[2].stMppChn.s32ChnId = RGN_CHN.s32ChnId;
ctx->rgn[2].stMppChn.s32DevId = RGN_CHN.s32DevId;
ctx->rgn[2].stRegion.s32X = 256; // must be 16 aligned
ctx->rgn[2].stRegion.s32Y = 256; // must be 16 aligned
ctx->rgn[2].stRegion.u32Width = u32Width; // must be 8 aligned
ctx->rgn[2].stRegion.u32Height = u32Height; // must be 8 aligned
ctx->rgn[2].u32BmpFormat = RK_FMT_BGRA5551;
ctx->rgn[2].u32BgAlpha = 128;
ctx->rgn[2].u32FgAlpha = 128;
ctx->rgn[2].u32Layer = 3;
ctx->rgn[2].srcFileBmpName = bmp1_file_path;
if (bmp1_file_path) {
s32Ret = SAMPLE_COMM_RGN_CreateChn(&ctx->rgn[2]);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("SAMPLE_COMM_RGN_CreateChn Failure s32Ret:%#X rgn handle:%d", s32Ret,
ctx->rgn[2].rgnHandle);
return s32Ret;
}
} else {
RK_LOGE("vpss_bmp1 file is NULL, overlay rgn skips");
}
s32Ret = SAMPLE_COMM_GetBmpResolution(bmp2_file_path, &u32Width, &u32Height);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("SAMPLE_COMM_GetBmpResolution failure");
u32Width = 128;
u32Height = 128;
}
/* Init RGN[3] */
ctx->rgn[3].rgnHandle = 3;
ctx->rgn[3].stRgnAttr.unAttr.stOverlay.u32CanvasNum = 2;
ctx->rgn[3].stRgnAttr.enType = OVERLAY_RGN;
ctx->rgn[3].stMppChn.enModId = RGN_CHN.enModId;
ctx->rgn[3].stMppChn.s32ChnId = RGN_CHN.s32ChnId;
ctx->rgn[3].stMppChn.s32DevId = RGN_CHN.s32DevId;
ctx->rgn[3].stRegion.s32X = 512; // must be 16 aligned
ctx->rgn[3].stRegion.s32Y = 512; // must be 16 aligned
ctx->rgn[3].stRegion.u32Width = u32Width; // must be 8 aligned
ctx->rgn[3].stRegion.u32Height = u32Height; // must be 8 aligned
ctx->rgn[3].u32BmpFormat = RK_FMT_BGRA5551;
ctx->rgn[3].u32BgAlpha = 128;
ctx->rgn[3].u32FgAlpha = 128;
ctx->rgn[3].u32Layer = 4;
ctx->rgn[3].srcFileBmpName = bmp2_file_path;
if (bmp2_file_path) {
s32Ret = SAMPLE_COMM_RGN_CreateChn(&ctx->rgn[3]);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("SAMPLE_COMM_RGN_CreateChn Failure s32Ret:%#X rgn handle:%d", s32Ret,
ctx->rgn[3].rgnHandle);
return s32Ret;
}
} else {
RK_LOGE("vpss_bmp2 file is NULL, overlay rgn skips");
}
return s32Ret;
}
static RK_S32 rgn_deinit(SAMPLE_MPI_CTX_S *ctx, RK_S32 rgn_attach_module) {
RK_S32 s32Ret = RK_SUCCESS;
if (rgn_attach_module != RGN_ATTACH_VENC && rgn_attach_module != RGN_ATTACH_VPSS) {
RK_LOGW("RGN not attach to a valid node!");
return 0;
}
for (RK_S32 i = 0; i < RGN_NUM_MAX; i++) {
if (!ctx->rgn[i].srcFileBmpName && ctx->rgn[i].stRgnAttr.enType == OVERLAY_RGN) {
continue;
}
s32Ret = SAMPLE_COMM_RGN_DestroyChn(&ctx->rgn[i]);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("SAMPLE_COMM_RGN_DestroyChn Failure s32Ret:%#X rgn handle:%d", s32Ret,
ctx->rgn[i].rgnHandle);
}
}
return s32Ret;
}
static RK_S32 pnMode_stressTest(RK_S32 s32CamId, rk_aiq_working_mode_t WDRMode,
RK_BOOL MultiCam, const char *iq_file_dir) {
RK_S32 s32Ret = RK_FAILURE;
RK_MPI_VI_PauseChn(ctx->vi.u32PipeId, ctx->vi.s32ChnId);
SAMPLE_COMM_ISP_Stop(s32CamId);
s32Ret = SAMPLE_COMM_ISP_Init(s32CamId, WDRMode, MultiCam, iq_file_dir);
s32Ret |= SAMPLE_COMM_ISP_Run(s32CamId);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("SAMPLE_COMM_ISP_Init_Run failure\n");
return s32Ret;
}
RK_MPI_VI_ResumeChn(ctx->vi.u32PipeId, ctx->vi.s32ChnId);
RK_LOGE("<--------------PN mode switch success---------->");
return RK_SUCCESS;
}
static RK_S32 hdrMode_stressTest(RK_S32 s32CamId, RK_BOOL MultiCam,
const char *iq_file_dir) {
RK_S32 s32Ret = RK_FAILURE;
// static rk_aiq_working_mode_t eNowHdrMode = RK_AIQ_WORKING_MODE_NORMAL;
#if defined(RV1106)
RK_MPI_VI_PauseChn(ctx->vi.u32PipeId, ctx->vi.s32ChnId);
SAMPLE_COMM_ISP_Stop(s32CamId);
if (gModeTest->eHdrMode == RK_AIQ_WORKING_MODE_NORMAL) {
gModeTest->eHdrMode = RK_AIQ_WORKING_MODE_ISP_HDR2;
} else if (gModeTest->eHdrMode == RK_AIQ_WORKING_MODE_ISP_HDR2) {
gModeTest->eHdrMode = RK_AIQ_WORKING_MODE_NORMAL;
} else {
gModeTest->eHdrMode = RK_AIQ_WORKING_MODE_NORMAL;
}
s32Ret = SAMPLE_COMM_ISP_Init(s32CamId, gModeTest->eHdrMode, MultiCam, iq_file_dir);
s32Ret |= SAMPLE_COMM_ISP_Run(s32CamId);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("ISP init failure\n");
return s32Ret;
}
RK_MPI_VI_ResumeChn(ctx->vi.u32PipeId, ctx->vi.s32ChnId);
#elif defined(RV1126)
if (gModeTest->eHdrMode == RK_AIQ_WORKING_MODE_NORMAL) {
gModeTest->eHdrMode = RK_AIQ_WORKING_MODE_ISP_HDR2;
} else if (gModeTest->eHdrMode == RK_AIQ_WORKING_MODE_ISP_HDR2) {
gModeTest->eHdrMode = RK_AIQ_WORKING_MODE_NORMAL;
} else {
gModeTest->eHdrMode = RK_AIQ_WORKING_MODE_NORMAL;
}
s32Ret = SAMPLE_COMM_ISP_SetWDRModeDyn(s32CamId, gModeTest->eHdrMode);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("SAMPLE_COMM_ISP_SetWDRModeDyn failure:%#X cam:%d hdrmodr:%d", s32Ret,
gModeTest->s32CamId, gModeTest->eHdrMode);
return s32Ret;
}
#endif
RK_LOGE("<------------switch to %d(normal:0 HDR2:16)--------------->",
gModeTest->eHdrMode);
return s32Ret;
}
static RK_S32 frameRate_switchTest(SAMPLE_VI_CTX_S *ctx) {
RK_S32 s32Ret = RK_FAILURE;
VI_CHN_ATTR_S pstChnAttr;
memset(&pstChnAttr, 0, sizeof(VI_CHN_ATTR_S));
s32Ret = RK_MPI_VI_GetChnAttr(ctx->u32PipeId, ctx->s32ChnId, &pstChnAttr);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("RK_MPI_VI_GetChnAttr failure:%X", s32Ret);
return s32Ret;
}
srand(time(NULL));
pstChnAttr.stFrameRate.s32DstFrameRate = rand() % 25 + 3;
pstChnAttr.stFrameRate.s32SrcFrameRate = 25;
s32Ret = RK_MPI_VI_SetChnAttr(ctx->u32PipeId, ctx->s32ChnId, &pstChnAttr);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("RK_MPI_VI_GetChnAttr failure:%X", s32Ret);
return s32Ret;
}
RK_LOGE("---------------Framerate switch to: %d",
pstChnAttr.stFrameRate.s32DstFrameRate);
return RK_SUCCESS;
}
static RK_S32 ai_isp_force_switchTest(SAMPLE_VPSS_CTX_S *ctx) {
gModeTest->aiisp_force_type = !gModeTest->aiisp_force_type;
RK_LOGE("---------------AIISP force switch to: %d(0->close, 1->enable)",
gModeTest->aiisp_force_type);
return RK_SUCCESS;
}
static RK_S32 vpss_ai_isp_switchTest(SAMPLE_VPSS_CTX_S *ctx) {
RK_S32 s32Ret = RK_FAILURE;
AIISP_ATTR_S pstAIISPAttr;
memset(&pstAIISPAttr, 0, sizeof(AIISP_ATTR_S));
s32Ret = RK_MPI_VPSS_GetGrpAIISPAttr(ctx->s32GrpId, &pstAIISPAttr);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("RK_MPI_VPSS_GetGrpAIISPAttr failure:%X", s32Ret);
return s32Ret;
}
if (pstAIISPAttr.bEnable == RK_TRUE) {
pstAIISPAttr.bEnable = RK_FALSE;
} else {
pstAIISPAttr.bEnable = RK_TRUE;
}
pstAIISPAttr.stAiIspCallback.pfUpdateCallback = aiisp_callback;
pstAIISPAttr.stAiIspCallback.pPrivateData = RK_NULL;
pstAIISPAttr.pModelFilePath = "/oem/usr/lib/";
#if defined(RV1106)
pstAIISPAttr.u32FrameBufCnt = 1;
#else
pstAIISPAttr.u32FrameBufCnt = 2;
#endif
s32Ret = RK_MPI_VPSS_SetGrpAIISPAttr(ctx->s32GrpId, &pstAIISPAttr);
if (RK_SUCCESS != s32Ret) {
RK_LOGE("VPSS GRP 0 RK_MPI_VPSS_SetGrpAIISPAttr failed with %#x!", s32Ret);
return s32Ret;
}
RK_LOGE("---------------AIISP switch to: %d(0->close, 1->enable)",
pstAIISPAttr.bEnable);
return RK_SUCCESS;
}
static RK_S32 vpss_chn0_resolution_switch_test(SAMPLE_VPSS_CTX_S *ctx) {
RK_S32 s32Ret = RK_FAILURE;
VPSS_CHN_ATTR_S pstChnAttr;
RK_U32 u32SrcWidth = ctx->stVpssChnAttr[0].u32Width;
RK_U32 u32SrcHeight = ctx->stVpssChnAttr[0].u32Height;
RK_U32 u32DstWidth = 1280;
RK_U32 u32DstHeight = 720;
memset(&pstChnAttr, 0, sizeof(VPSS_CHN_ATTR_S));
s32Ret = RK_MPI_VPSS_GetChnAttr(ctx->s32GrpId, 0, &pstChnAttr);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("RK_MPI_VPSS_GetChnAttr failure:%X", s32Ret);
return s32Ret;
}
if (pstChnAttr.u32Width == u32SrcWidth) {
pstChnAttr.u32Width = u32DstWidth;
pstChnAttr.u32Height = u32DstHeight;
} else {
pstChnAttr.u32Width = u32SrcWidth;
pstChnAttr.u32Height = u32SrcHeight;
}
s32Ret = RK_MPI_VPSS_SetChnAttr(ctx->s32GrpId, 0, &pstChnAttr);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("vpss set chn resolution failure");
return s32Ret;
}
RK_LOGE("---------------VPSS resolution switch to: %dx%d", pstChnAttr.u32Width,
pstChnAttr.u32Height);
return RK_SUCCESS;
}
static RK_S32 vpss_venc_chn0_resolution_switch_test(SAMPLE_VPSS_CTX_S *pVpssCtx,
SAMPLE_VENC_CTX_S *pVencCtx,
RK_U32 rgn_attach_module) {
RK_S32 s32Ret = RK_FAILURE;
RK_U32 u32SrcWidth = pVpssCtx->stVpssChnAttr[0].u32Width;
RK_U32 u32SrcHeight = pVpssCtx->stVpssChnAttr[0].u32Height;
RK_U32 u32DstWidth = 1280;
RK_U32 u32DstHeight = 720;
VPSS_CHN_ATTR_S VpsspstChnAttr;
VENC_CHN_ATTR_S VencChnAttr;
MPP_CHN_S stSrcChn, stDestChn;
// rgn detach venc
if (rgn_attach_module == RGN_ATTACH_VENC) {
s32Ret = rgn_deinit(ctx, rgn_attach_module);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("venc_rgn_detach failure");
return s32Ret;
}
}
// unBind vpss and venc
stSrcChn.enModId = RK_ID_VPSS;
stSrcChn.s32DevId = pVpssCtx->s32GrpId;
stSrcChn.s32ChnId = 0;
stDestChn.enModId = RK_ID_VENC;
stDestChn.s32DevId = 0;
stDestChn.s32ChnId = pVencCtx->s32ChnId;
s32Ret = SAMPLE_COMM_UnBind(&stSrcChn, &stDestChn);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("vpss unbind to venc[0] failure");
return s32Ret;
}
memset(&VpsspstChnAttr, 0, sizeof(VPSS_CHN_ATTR_S));
/* vpss reset resolution */
s32Ret = RK_MPI_VPSS_GetChnAttr(pVpssCtx->s32GrpId, 0, &VpsspstChnAttr);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("RK_MPI_VPSS_GetChnAttr failure:%X", s32Ret);
return s32Ret;
}
if (VpsspstChnAttr.u32Width == u32SrcWidth) {
VpsspstChnAttr.u32Width = u32DstWidth;
VpsspstChnAttr.u32Height = u32DstHeight;
} else {
VpsspstChnAttr.u32Width = u32SrcWidth;
VpsspstChnAttr.u32Height = u32SrcHeight;
}
s32Ret = RK_MPI_VPSS_SetChnAttr(pVpssCtx->s32GrpId, 0, &VpsspstChnAttr);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("vpss set chn resolution failure");
return s32Ret;
}
RK_LOGE("vpss set chn resolution %dx%d-----\n", VpsspstChnAttr.u32Width,
VpsspstChnAttr.u32Height);
memset(&VencChnAttr, 0, sizeof(VENC_CHN_ATTR_S));
/* venc reset resolution */
s32Ret = RK_MPI_VENC_GetChnAttr(pVencCtx->s32ChnId, &VencChnAttr);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("RK_MPI_VENC_GetChnAttr failure:%X", s32Ret);
return s32Ret;
}
pVencCtx->u32Width = VpsspstChnAttr.u32Width;
pVencCtx->u32Height = VpsspstChnAttr.u32Height;
VencChnAttr.stVencAttr.u32PicWidth = VpsspstChnAttr.u32Width;
VencChnAttr.stVencAttr.u32VirWidth = VpsspstChnAttr.u32Width;
VencChnAttr.stVencAttr.u32PicHeight = VpsspstChnAttr.u32Height;
VencChnAttr.stVencAttr.u32VirHeight = VpsspstChnAttr.u32Height;
s32Ret = RK_MPI_VENC_SetChnAttr(pVencCtx->s32ChnId, &VencChnAttr);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("venc set chn resolution failure");
return s32Ret;
}
RK_LOGE("venc set chn resolution %dx%d-----\n", VpsspstChnAttr.u32Width,
VpsspstChnAttr.u32Height);
// Bind vpss and venc
stSrcChn.enModId = RK_ID_VPSS;
stSrcChn.s32DevId = pVpssCtx->s32GrpId;
stSrcChn.s32ChnId = 0;
stDestChn.enModId = RK_ID_VENC;
stDestChn.s32DevId = 0;
stDestChn.s32ChnId = pVencCtx->s32ChnId;
s32Ret = SAMPLE_COMM_Bind(&stSrcChn, &stDestChn);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("vpss bind to venc[0] failure");
return s32Ret;
}
// rgn attach venc
if (rgn_attach_module == RGN_ATTACH_VENC) {
s32Ret = rgn_init(gModeTest->inputBmp1Path, gModeTest->inputBmp2Path, ctx,
rgn_attach_module);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("venc_rgn_attach failure");
return s32Ret;
}
}
return RK_SUCCESS;
}
static RK_S32 encode_destroy_and_restart(CODEC_TYPE_E enCodecType,
VENC_RC_MODE_E enRcMode, RK_U32 u32Profile,
RK_BOOL bIfSliceSplit,
SAMPLE_VENC_CTX_S *pVencCtx) {
RK_S32 s32Ret = RK_FAILURE;
MPP_CHN_S stSrcChn, stDestChn;
RK_S32 Chnid = pVencCtx->s32ChnId;
// rgn detach venc
if (gModeTest->rgn_attach_module == RGN_ATTACH_VENC) {
s32Ret = rgn_deinit(ctx, gModeTest->rgn_attach_module);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("venc_rgn_detach failure");
return s32Ret;
}
}
gModeTest->bIfVencThreadQuit[Chnid] = RK_TRUE;
if (ctx->venc[Chnid].getStreamCbFunc) {
pthread_join(ctx->venc[Chnid].getStreamThread, RK_NULL);
}
// unBind vpss and venc
stSrcChn.enModId = RK_ID_VPSS;
stSrcChn.s32DevId = ctx->vpss.s32GrpId;
stSrcChn.s32ChnId = 0;
stDestChn.enModId = RK_ID_VENC;
stDestChn.s32DevId = 0;
stDestChn.s32ChnId = ctx->venc[Chnid].s32ChnId;
s32Ret = SAMPLE_COMM_UnBind(&stSrcChn, &stDestChn);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("vpss unbind to venc[%d] failure", Chnid);
program_handle_error(__func__, __LINE__);
return s32Ret;
}
// Destroy venc
s32Ret = SAMPLE_COMM_VENC_DestroyChn(&ctx->venc[Chnid]);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("SAMPLE_COMM_VENC_DestroyChn %d Failure s32Ret:%#X", Chnid, s32Ret);
program_handle_error(__func__, __LINE__);
return s32Ret;
}
ctx->venc[Chnid].enCodecType = enCodecType;
ctx->venc[Chnid].enRcMode = enRcMode;
ctx->venc[Chnid].stChnAttr.stVencAttr.u32Profile = u32Profile;
gModeTest->bIfVencThreadQuit[Chnid] = RK_FALSE;
// Init VENC
s32Ret = SAMPLE_COMM_VENC_CreateChn(&ctx->venc[Chnid]);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("SAMPLE_COMM_VENC_DestroyChn %d Failure s32Ret:%#X", Chnid, s32Ret);
program_handle_error(__func__, __LINE__);
return s32Ret;
}
// Bind vpss and venc
stSrcChn.enModId = RK_ID_VPSS;
stSrcChn.s32DevId = ctx->vpss.s32GrpId;
stSrcChn.s32ChnId = 0;
stDestChn.enModId = RK_ID_VENC;
stDestChn.s32DevId = 0;
stDestChn.s32ChnId = ctx->venc[Chnid].s32ChnId;
s32Ret = SAMPLE_COMM_Bind(&stSrcChn, &stDestChn);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("vpss unbind to venc[%d] failure", Chnid);
program_handle_error(__func__, __LINE__);
return s32Ret;
}
// rgn attach venc
if (gModeTest->rgn_attach_module == RGN_ATTACH_VENC) {
s32Ret = rgn_init(gModeTest->inputBmp1Path, gModeTest->inputBmp2Path, ctx,
gModeTest->rgn_attach_module);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("venc_rgn_attach failure");
return s32Ret;
}
}
return s32Ret;
}
static RK_S32 encode_type_switch(SAMPLE_VENC_CTX_S *pVencCtx) {
RK_S32 s32Ret = RK_FAILURE;
static RK_U32 now_test_loop = 0;
switch (now_test_loop % 2) {
case 0: /* H264 CBR */
RK_LOGE("-------------Switch To H264CBR---------------");
s32Ret = encode_destroy_and_restart(RK_CODEC_TYPE_H264, VENC_RC_MODE_H264CBR, 100,
RK_FALSE, pVencCtx);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("switch to 264_cbr failure");
program_handle_error(__func__, __LINE__);
return RK_FAILURE;
}
case 1: /* H265 CBR */
RK_LOGE("-------------Switch To H265CBR---------------");
s32Ret = encode_destroy_and_restart(RK_CODEC_TYPE_H265, VENC_RC_MODE_H265CBR, 0,
RK_FALSE, pVencCtx);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("switch to 265_cbr failure");
program_handle_error(__func__, __LINE__);
return RK_FAILURE;
}
default:
return RK_SUCCESS;
}
now_test_loop++;
RK_LOGE("encode_type_switch-------------");
return RK_SUCCESS;
}
static RK_S32 rgn_change_posit(RK_S32 rgn_attach_module) {
RK_S32 s32Ret = RK_FAILURE;
RGN_CHN_ATTR_S stChnAttr;
RK_U32 posit_max_width;
RK_U32 posit_max_height;
memset(&stChnAttr, 0, sizeof(RGN_CHN_ATTR_S));
if (rgn_attach_module == RGN_ATTACH_VENC) {
posit_max_width = ctx->venc[0].u32Width;
posit_max_height = ctx->venc[0].u32Height;
} else if (rgn_attach_module == RGN_ATTACH_VPSS) {
posit_max_width = ctx->vpss.stVpssChnAttr[2].u32Width;
posit_max_height = ctx->vpss.stVpssChnAttr[2].u32Height;
} else {
RK_LOGE("RGN is not enabled");
return RK_SUCCESS;
}
/* change rgn[0] posit */
s32Ret = RK_MPI_RGN_GetDisplayAttr(ctx->rgn[0].rgnHandle, &ctx->rgn[0].stMppChn,
&stChnAttr);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("Change RGN[0] position ----RK_MPI_RGN_GetDisplayAttr failure:%X",
s32Ret);
return s32Ret;
}
stChnAttr.unChnAttr.stCoverChn.stRect.s32X =
RK_ALIGN_16(stChnAttr.unChnAttr.stCoverChn.stRect.s32X + 16);
if (stChnAttr.unChnAttr.stCoverChn.stRect.s32X >
posit_max_width - ctx->rgn[0].stRegion.u32Width - 50) {
stChnAttr.unChnAttr.stCoverChn.stRect.s32X =
RK_ALIGN_16(ctx->rgn[0].stRegion.s32X);
}
s32Ret = RK_MPI_RGN_SetDisplayAttr(ctx->rgn[0].rgnHandle, &ctx->rgn[0].stMppChn,
&stChnAttr);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("Change RGN[0] position ----RK_MPI_RGN_SetDisplayAttr Failure:%X",
s32Ret);
return s32Ret;
}
/* change rgn[1] posit*/
s32Ret = RK_MPI_RGN_GetDisplayAttr(ctx->rgn[1].rgnHandle, &ctx->rgn[1].stMppChn,
&stChnAttr);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("Change RGN[1] position ----RK_MPI_RGN_GetDisplayAttr Failure:%X",
s32Ret);
return s32Ret;
}
stChnAttr.unChnAttr.stCoverChn.stRect.s32X =
RK_ALIGN_16(stChnAttr.unChnAttr.stCoverChn.stRect.s32X + 8);
if (stChnAttr.unChnAttr.stCoverChn.stRect.s32X >
posit_max_width - ctx->rgn[1].stRegion.u32Width - 50) {
stChnAttr.unChnAttr.stCoverChn.stRect.s32X =
RK_ALIGN_16(ctx->rgn[1].stRegion.s32X);
}
s32Ret = RK_MPI_RGN_SetDisplayAttr(ctx->rgn[1].rgnHandle, &ctx->rgn[1].stMppChn,
&stChnAttr);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("Change RGN[1] position ----RK_MPI_RGN_SetDisplayAttr Failure:%X",
s32Ret);
return s32Ret;
}
/* change rgn[2] posit*/
if (ctx->rgn[2].srcFileBmpName) {
s32Ret = RK_MPI_RGN_GetDisplayAttr(ctx->rgn[2].rgnHandle, &ctx->rgn[2].stMppChn,
&stChnAttr);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("Change RGN[2] position ----RK_MPI_RGN_GetDisplayAttr Failure:%X",
s32Ret);
return s32Ret;
}
stChnAttr.unChnAttr.stOverlayChn.stPoint.s32Y =
RK_ALIGN_16(stChnAttr.unChnAttr.stOverlayChn.stPoint.s32Y + 10);
if (stChnAttr.unChnAttr.stOverlayChn.stPoint.s32Y >
posit_max_height - ctx->rgn[2].stRegion.u32Height - 50) {
stChnAttr.unChnAttr.stOverlayChn.stPoint.s32Y =
RK_ALIGN_16(ctx->rgn[2].stRegion.s32Y);
}
s32Ret = RK_MPI_RGN_SetDisplayAttr(ctx->rgn[2].rgnHandle, &ctx->rgn[2].stMppChn,
&stChnAttr);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("Change RGN[2] position ----RK_MPI_RGN_SetDisplayAttr Failure:%X",
s32Ret);
return s32Ret;
}
}
/* change rgn[3] posit*/
if (ctx->rgn[3].srcFileBmpName) {
s32Ret = RK_MPI_RGN_GetDisplayAttr(ctx->rgn[3].rgnHandle, &ctx->rgn[3].stMppChn,
&stChnAttr);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("Change RGN[3] position ----RK_MPI_RGN_GetDisplayAttr Failure:%X",
s32Ret);
return s32Ret;
}
stChnAttr.unChnAttr.stOverlayChn.stPoint.s32Y =
RK_ALIGN_16(stChnAttr.unChnAttr.stOverlayChn.stPoint.s32Y + 10);
if (stChnAttr.unChnAttr.stOverlayChn.stPoint.s32Y >
posit_max_height - ctx->rgn[3].stRegion.u32Height - 50) {
stChnAttr.unChnAttr.stOverlayChn.stPoint.s32Y =
RK_ALIGN_16(ctx->rgn[3].stRegion.s32Y);
}
s32Ret = RK_MPI_RGN_SetDisplayAttr(ctx->rgn[3].rgnHandle, &ctx->rgn[3].stMppChn,
&stChnAttr);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("Change RGN[3] position ----RK_MPI_RGN_SetDisplayAttr Failure:%X",
s32Ret);
return s32Ret;
}
}
return RK_SUCCESS;
}
static RK_S32 rgn_CreateAndDestory(RK_S32 rgn_attach_module) {
RK_S32 s32Ret = RK_FAILURE;
RK_S32 i = 0;
for (i = 0; i < RGN_NUM_MAX; i++) {
if (!ctx->rgn[i].srcFileBmpName && ctx->rgn[i].stRgnAttr.enType == OVERLAY_RGN) {
continue;
}
s32Ret = SAMPLE_COMM_RGN_DestroyChn(&ctx->rgn[i]);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("SAMPLE_COMM_RGN_DestroyChn Failure s32Ret:%#X rgn handle:%d", s32Ret,
ctx->rgn[i].rgnHandle);
}
}
/* rgn attach */
for (RK_S32 i = 0; i < RGN_NUM_MAX; i++) {
if (!ctx->rgn[i].srcFileBmpName && ctx->rgn[i].stRgnAttr.enType == OVERLAY_RGN) {
continue;
}
s32Ret = SAMPLE_COMM_RGN_CreateChn(&ctx->rgn[i]);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("SAMPLE_COMM_RGN_CreateChn Handle:%d Failure Ret:%#X",
ctx->rgn[i].rgnHandle, s32Ret);
}
}
RK_LOGE("module %d(0->vpss,1->venc)rgn_initAndDeinit switch test", rgn_attach_module);
return s32Ret;
}
static RK_S32 rtsp_init(CODEC_TYPE_E enCodecType) {
RK_S32 i = 0;
g_rtsplive = create_rtsp_demo(554);
RK_CHAR rtspAddr[BUFFER_SIZE] = {0};
for (i = 0; i < VENC_CHN_MAX; i++) {
sprintf(rtspAddr, "/live/%d", i);
g_rtsp_session[i] = rtsp_new_session(g_rtsplive, rtspAddr);
if (enCodecType == RK_CODEC_TYPE_H264) {
rtsp_set_video(g_rtsp_session[i], RTSP_CODEC_ID_VIDEO_H264, RK_NULL, 0);
} else if (enCodecType == RK_CODEC_TYPE_H265) {
rtsp_set_video(g_rtsp_session[i], RTSP_CODEC_ID_VIDEO_H265, RK_NULL, 0);
} else {
RK_LOGE("not support other type\n");
g_rtsp_ifenbale = RK_FALSE;
return RK_SUCCESS;
}
rtsp_sync_video_ts(g_rtsp_session[i], rtsp_get_reltime(), rtsp_get_ntptime());
RK_LOGE("rtsp <%s> init success", rtspAddr);
}
g_rtsp_ifenbale = RK_TRUE;
return RK_SUCCESS;
}
static RK_S32 rtsp_deinit(void) {
if (g_rtsplive)
rtsp_del_demo(g_rtsplive);
return RK_SUCCESS;
}
static RK_S32 global_param_init(void) {
ctx = (SAMPLE_MPI_CTX_S *)(malloc(sizeof(SAMPLE_MPI_CTX_S)));
if (!ctx) {
RK_LOGE("ctx is null, malloc failure");
return RK_FAILURE;
}
memset(ctx, 0, sizeof(SAMPLE_MPI_CTX_S));
gModeTest = (g_mode_test *)malloc(sizeof(g_mode_test));
if (!gModeTest) {
printf("malloc for gModeTest failure\n");
return RK_FAILURE;
}
memset(gModeTest, 0, sizeof(g_mode_test));
gModeTest->u32ModuleTestLoop = -1;
gModeTest->s32ModuleTestType = 0;
gModeTest->u32TestFrameCount = 50;
gModeTest->inputBmp1Path = NULL;
gModeTest->inputBmp2Path = NULL;
gModeTest->bIfenable_iva = RK_TRUE;
gModeTest->bIfaiisp_force_switch = RK_FALSE;
for (RK_S32 i = 0; i < VENC_CHN_MAX; i++) {
sem_init(&g_sem_module_test[i], 0, 0);
if (pthread_mutex_init(&g_frame_count_mutex[i], RK_NULL) != 0) {
RK_LOGE("mutex init failure \n");
return RK_FAILURE;
}
}
if (RK_SUCCESS != pthread_mutex_init(&g_rtsp_mutex, RK_NULL)) {
RK_LOGE("pthread_mutex_init failure");
return RK_FAILURE;
}
return RK_SUCCESS;
}
static RK_S32 global_param_deinit(void) {
if (ctx) {
free(ctx);
ctx = RK_NULL;
}
if (gModeTest) {
free(gModeTest);
gModeTest = RK_NULL;
}
for (RK_S32 i = 0; i < VENC_CHN_MAX; i++) {
sem_destroy(&g_sem_module_test[i]);
pthread_mutex_destroy(&g_frame_count_mutex[i]);
}
pthread_mutex_destroy(&g_rtsp_mutex);
return RK_SUCCESS;
}
#ifdef ROCKIVA
static void rkIvaEvent_callback(const RockIvaBaResult *result,
const RockIvaExecuteStatus status, void *userData) {
if (result->objNum == 0)
return;
for (int i = 0; i < result->objNum; i++) {
RK_LOGD("topLeft:[%d,%d], bottomRight:[%d,%d],"
"objId is %d, frameId is %d, score is %d, type is %d\n",
result->triggerObjects[i].objInfo.rect.topLeft.x,
result->triggerObjects[i].objInfo.rect.topLeft.y,
result->triggerObjects[i].objInfo.rect.bottomRight.x,
result->triggerObjects[i].objInfo.rect.bottomRight.y,
result->triggerObjects[i].objInfo.objId,
result->triggerObjects[i].objInfo.frameId,
result->triggerObjects[i].objInfo.score,
result->triggerObjects[i].objInfo.type);
}
}
static void rkIvaFrame_releaseCallBack(const RockIvaReleaseFrames *releaseFrames,
void *userdata) {
/* when iva handle out of the video framethis func will be called*/
RK_S32 s32Ret = RK_SUCCESS;
for (RK_S32 i = 0; i < releaseFrames->count; i++) {
if (!releaseFrames->frames[i].extData) {
RK_LOGE("---------error release frame is null");
program_handle_error(__func__, __LINE__);
continue;
}
s32Ret = RK_MPI_VPSS_ReleaseChnFrame(0, 3, releaseFrames->frames[i].extData);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("RK_MPI_VI_ReleaseChnFrame failure:%#X", s32Ret);
program_handle_error(__func__, __LINE__);
}
free(releaseFrames->frames[i].extData);
}
}
static void *vpss_iva_thread(void *pArgs) {
prctl(PR_SET_NAME, "vpss_iva_thread");
RK_LOGI("vpss_iva_thread start");
SAMPLE_MPI_CTX_S *ctx = (SAMPLE_MPI_CTX_S *)pArgs;
RK_S32 s32Ret = RK_FAILURE;
RK_S32 s32Fd = 0;
RockIvaImage ivaImage;
RK_U32 u32Loopcount = 0;
RK_U32 u32GetOneFrameTime = 1000 / ctx->iva.u32IvaDetectFrameRate;
VIDEO_FRAME_INFO_S *stVpssFrame = NULL;
while (!gModeTest->bIfVpssIvaTHreadQuit) {
s32Ret = RK_MPI_VPSS_GetChnFrame(0, 3, &ctx->vpss.stChnFrameInfos, -1);
if (s32Ret == RK_SUCCESS) {
stVpssFrame = (VIDEO_FRAME_INFO_S *)malloc(sizeof(VIDEO_FRAME_INFO_S));
if (!stVpssFrame) {
RK_LOGE("-----error malloc fail for stVpssFrame");
RK_MPI_VPSS_ReleaseChnFrame(ctx->vpss.s32GrpId, 3,
&ctx->vpss.stChnFrameInfos);
continue;
}
memcpy(stVpssFrame, &ctx->vpss.stChnFrameInfos, sizeof(VIDEO_FRAME_INFO_S));
s32Fd = RK_MPI_MB_Handle2Fd(stVpssFrame->stVFrame.pMbBlk);
memset(&ivaImage, 0, sizeof(RockIvaImage));
ivaImage.info.transformMode = ctx->iva.eImageTransform;
ivaImage.info.width = stVpssFrame->stVFrame.u32Width;
ivaImage.info.height = stVpssFrame->stVFrame.u32Height;
ivaImage.info.format = ctx->iva.eImageFormat;
ivaImage.frameId = u32Loopcount;
ivaImage.dataAddr = NULL;
ivaImage.dataPhyAddr = NULL;
ivaImage.dataFd = s32Fd;
ivaImage.extData = stVpssFrame;
s32Ret = ROCKIVA_PushFrame(ctx->iva.ivahandle, &ivaImage, NULL);
u32Loopcount++;
}
usleep(u32GetOneFrameTime * 1000);
}
RK_LOGE("vpss_iva_thread exit !!!");
return RK_NULL;
}
#endif
#ifdef ROCKIT_IVS
static void *ivs_detect_thread(void *pArgs) {
printf("enter ive detect thread------------>\n");
prctl(PR_SET_NAME, "ivs_detect_thread");
SAMPLE_IVS_CTX_S *ctx = (SAMPLE_IVS_CTX_S *)pArgs;
RK_S32 s32Ret = RK_FAILURE;
IVS_RESULT_INFO_S stResults;
RK_U32 u32IvsDetectCount = 0;
IVS_CHN_ATTR_S pstAttr;
memset(&pstAttr, 0, sizeof(IVS_CHN_ATTR_S));
RK_MPI_IVS_GetChnAttr(ctx->s32ChnId, &pstAttr);
RK_LOGE("odIfEnable:%d ", pstAttr.bODEnable);
while (!gModeTest->bIfIvsDetectThreadQuit) {
memset(&stResults, 0, sizeof(IVS_RESULT_INFO_S));
s32Ret = RK_MPI_IVS_GetResults(ctx->s32ChnId, &stResults, GET_STREAM_TIMEOUT);
if (s32Ret == RK_SUCCESS) {
u32IvsDetectCount++;
// RK_LOGD("s32ReNum: %d", stResults.s32ResultNum);
if (stResults.s32ResultNum == 1) {
for (int i = 0; i < stResults.pstResults->stMdInfo.u32RectNum; i++) {
RK_LOGD("%d: [%d, %d, %d, %d]\n", i,
stResults.pstResults->stMdInfo.stRect[i].s32X,
stResults.pstResults->stMdInfo.stRect[i].s32Y,
stResults.pstResults->stMdInfo.stRect[i].u32Width,
stResults.pstResults->stMdInfo.stRect[i].u32Height);
}
}
RK_MPI_IVS_ReleaseResults(ctx->s32ChnId, &stResults);
} else {
RK_LOGE("RK_MPI_IVS_GetResults failure:%X", s32Ret);
}
}
RK_LOGE("ivs_detect_thread exit");
return RK_NULL;
}
#endif
static RK_S32 media_init(RK_CHAR *pIqFileDir, RK_S32 rgn_attach_module) {
MPP_CHN_S stSrcChn, stDestChn;
RK_S32 s32Ret = RK_FAILURE;
if (pIqFileDir) {
s32Ret = SAMPLE_COMM_ISP_Init(gModeTest->s32CamId, gModeTest->eHdrMode,
gModeTest->bMultictx, gModeTest->pIqFileDir);
s32Ret |= SAMPLE_COMM_ISP_Run(gModeTest->s32CamId);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("ISP init failure");
return s32Ret;
}
}
if (RK_MPI_SYS_Init() != RK_SUCCESS) {
RK_LOGE("RK_MPI_SYS_Init failure");
return RK_FAILURE;
}
s32Ret = rtsp_init(gModeTest->enCodecType);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("rtsp_init failure");
return s32Ret;
}
#ifdef ROCKIVA
if (gModeTest->bIfenable_iva) {
s32Ret = SAMPLE_COMM_IVA_Create(&ctx->iva);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("SAMPLE_COMM_IVA_Create failure:%#X", s32Ret);
return s32Ret;
}
}
#endif
s32Ret = SAMPLE_COMM_VI_CreateChn(&ctx->vi);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("SAMPLE_COMM_VI_CreateChn failure:%#X", s32Ret);
return s32Ret;
}
s32Ret = SAMPLE_COMM_VPSS_CreateChn(&ctx->vpss);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("SAMPLE_COMM_VPSS_CreateChn failure:%#X", s32Ret);
return s32Ret;
}
#if defined(ROCKIT_IVS)
s32Ret = SAMPLE_COMM_IVS_Create(&ctx->ivs);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("SAMPLE_COMM_IVS_Create failure:%#X", s32Ret);
return s32Ret;
}
#endif
gModeTest->bIfVencThreadQuit[0] = RK_FALSE;
SAMPLE_COMM_VENC_CreateChn(&ctx->venc[0]);
gModeTest->bIfVencThreadQuit[1] = RK_FALSE;
SAMPLE_COMM_VENC_CreateChn(&ctx->venc[1]);
gModeTest->bIfVencThreadQuit[2] = RK_FALSE;
SAMPLE_COMM_VENC_CreateChn(&ctx->venc[2]);
/* rgn init*/
rgn_init(gModeTest->inputBmp1Path, gModeTest->inputBmp2Path, ctx, rgn_attach_module);
// Bind VI and VPSS[0]
stSrcChn.enModId = RK_ID_VI;
stSrcChn.s32DevId = ctx->vi.s32DevId;
stSrcChn.s32ChnId = ctx->vi.s32ChnId;
stDestChn.enModId = RK_ID_VPSS;
stDestChn.s32DevId = ctx->vpss.s32GrpId;
stDestChn.s32ChnId = ctx->vpss.s32ChnId;
SAMPLE_COMM_Bind(&stSrcChn, &stDestChn);
/* Bind VPSS and VENC[0] */
stSrcChn.enModId = RK_ID_VPSS;
stSrcChn.s32DevId = ctx->vpss.s32GrpId;
stSrcChn.s32ChnId = ctx->vpss.s32ChnId;
stDestChn.enModId = RK_ID_VENC;
stDestChn.s32DevId = 0;
stDestChn.s32ChnId = ctx->venc[0].s32ChnId;
SAMPLE_COMM_Bind(&stSrcChn, &stDestChn);
/* Bind VPSS and VENC[1] */
stSrcChn.enModId = RK_ID_VPSS;
stSrcChn.s32DevId = ctx->vpss.s32GrpId;
stSrcChn.s32ChnId = 1;
stDestChn.enModId = RK_ID_VENC;
stDestChn.s32DevId = 0;
stDestChn.s32ChnId = ctx->venc[1].s32ChnId;
SAMPLE_COMM_Bind(&stSrcChn, &stDestChn);
/* Bind VPSS and VENC[2] */
stSrcChn.enModId = RK_ID_VPSS;
stSrcChn.s32DevId = ctx->vpss.s32GrpId;
stSrcChn.s32ChnId = 2;
stDestChn.enModId = RK_ID_VENC;
stDestChn.s32DevId = 0;
stDestChn.s32ChnId = ctx->venc[2].s32ChnId;
SAMPLE_COMM_Bind(&stSrcChn, &stDestChn);
#ifdef ROCKIT_IVS
/* VPSS bind IVS[0]*/
stSrcChn.enModId = RK_ID_VPSS;
stSrcChn.s32DevId = ctx->vpss.s32GrpId;
stSrcChn.s32ChnId = 3;
stDestChn.enModId = RK_ID_IVS;
stDestChn.s32DevId = 0;
stDestChn.s32ChnId = ctx->ivs.s32ChnId;
SAMPLE_COMM_Bind(&stSrcChn, &stDestChn);
#endif
#ifdef ROCKIT_IVS
/* ivs detect thread launch */
gModeTest->bIfIvsDetectThreadQuit = RK_FALSE;
pthread_create(&ivs_detect_thread_id, 0, ivs_detect_thread, (void *)&ctx->ivs);
#endif
#ifdef ROCKIVA
if (gModeTest->bIfenable_iva) {
gModeTest->bIfVpssIvaTHreadQuit = RK_FALSE;
pthread_create(&gModeTest->vpss_iva_thread_id, 0, vpss_iva_thread, (void *)ctx);
}
#endif
return s32Ret;
}
static RK_S32 media_deinit(RK_S32 rgn_attach_module) {
RK_S32 s32Ret = RK_FAILURE;
MPP_CHN_S stSrcChn, stDestChn;
/* rgn deinit*/
rgn_deinit(ctx, rgn_attach_module);
#ifdef ROCKIVA
/* Destroy IVA */
if (gModeTest->bIfenable_iva) {
gModeTest->bIfVpssIvaTHreadQuit = RK_TRUE;
pthread_join(gModeTest->vpss_iva_thread_id, RK_NULL);
SAMPLE_COMM_IVA_Destroy(&ctx->iva);
}
#endif
#ifdef ROCKIT_IVS
/* ivs detect thread exit*/
gModeTest->bIfIvsDetectThreadQuit = RK_TRUE;
pthread_join(ivs_detect_thread_id, RK_NULL);
/* VPSS[3] unbind IVS[0]*/
stSrcChn.enModId = RK_ID_VPSS;
stSrcChn.s32DevId = ctx->vpss.s32GrpId;
stSrcChn.s32ChnId = 3;
stDestChn.enModId = RK_ID_IVS;
stDestChn.s32DevId = 0;
stDestChn.s32ChnId = ctx->ivs.s32ChnId;
s32Ret = SAMPLE_COMM_UnBind(&stSrcChn, &stDestChn);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("VPSS and IVS bind failure:%X", s32Ret);
return s32Ret;
}
/* ivs chn destroy*/
s32Ret = RK_MPI_IVS_DestroyChn(ctx->ivs.s32ChnId);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("RK_MPI_IVS_DestroyChn failure:%X", s32Ret);
return s32Ret;
}
#endif
for (int i = 0; i < VENC_CHN_MAX; i++) {
gModeTest->bIfVencThreadQuit[i] = RK_TRUE;
pthread_join(ctx->venc[i].getStreamThread, RK_NULL);
}
/* Venc[0] unbind VPSS[0,0]*/
stSrcChn.enModId = RK_ID_VPSS;
stSrcChn.s32DevId = ctx->vpss.s32GrpId;
stSrcChn.s32ChnId = ctx->vpss.s32ChnId;
stDestChn.enModId = RK_ID_VENC;
stDestChn.s32DevId = 0;
stDestChn.s32ChnId = ctx->venc[0].s32ChnId;
s32Ret = SAMPLE_COMM_UnBind(&stSrcChn, &stDestChn);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("venc[0] and Vpss unbind failure:%X", s32Ret);
g_exit_result = RK_FAILURE;
}
/* Venc[1] unbind VPSS[0,1]*/
stSrcChn.enModId = RK_ID_VPSS;
stSrcChn.s32DevId = ctx->vpss.s32GrpId;
stSrcChn.s32ChnId = 1;
stDestChn.enModId = RK_ID_VENC;
stDestChn.s32DevId = 0;
stDestChn.s32ChnId = ctx->venc[1].s32ChnId;
s32Ret = SAMPLE_COMM_UnBind(&stSrcChn, &stDestChn);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("Venc[1] and Vpss unbind failure:%X", s32Ret);
g_exit_result = RK_FAILURE;
}
/* Venc[2] unbind VPSS[0,2]*/
stSrcChn.enModId = RK_ID_VPSS;
stSrcChn.s32DevId = ctx->vpss.s32GrpId;
stSrcChn.s32ChnId = 2;
stDestChn.enModId = RK_ID_VENC;
stDestChn.s32DevId = 0;
stDestChn.s32ChnId = ctx->venc[2].s32ChnId;
s32Ret = SAMPLE_COMM_UnBind(&stSrcChn, &stDestChn);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("Venc[2] and Vpss unbind failure:%X", s32Ret);
g_exit_result = RK_FAILURE;
}
SAMPLE_COMM_VENC_DestroyChn(&ctx->venc[0]);
SAMPLE_COMM_VENC_DestroyChn(&ctx->venc[1]);
SAMPLE_COMM_VENC_DestroyChn(&ctx->venc[2]);
// UnBind VI and VPSS
stSrcChn.enModId = RK_ID_VI;
stSrcChn.s32DevId = ctx->vi.s32DevId;
stSrcChn.s32ChnId = ctx->vi.s32ChnId;
stDestChn.enModId = RK_ID_VPSS;
stDestChn.s32DevId = ctx->vpss.s32GrpId;
stDestChn.s32ChnId = ctx->vpss.s32ChnId;
s32Ret = SAMPLE_COMM_UnBind(&stSrcChn, &stDestChn);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("VI and Vpss unbind failure:%X", s32Ret);
g_exit_result = RK_FAILURE;
}
// Destroy VPSS
SAMPLE_COMM_VPSS_DestroyChn(&ctx->vpss);
// Destroy VI
SAMPLE_COMM_VI_DestroyChn(&ctx->vi);
/* rtsp deinit */
rtsp_deinit();
s32Ret = RK_MPI_SYS_Exit();
if (s32Ret != RK_SUCCESS) {
RK_LOGE("RK_MPI_SYS_Exit failure s32Ret:%#X", s32Ret);
return s32Ret;
}
s32Ret = SAMPLE_COMM_ISP_Stop(gModeTest->s32CamId);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("SAMPLE_COMM_ISP_Stop failure s32Ret:%#X", s32Ret);
return s32Ret;
}
return s32Ret;
}
static RK_S32 media_deinit_init(void) {
RK_S32 s32Ret = RK_FAILURE;
s32Ret = media_deinit(gModeTest->rgn_attach_module);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("media_deinit failure");
return s32Ret;
}
s32Ret = media_init(gModeTest->pIqFileDir, gModeTest->rgn_attach_module);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("media_init failure");
return s32Ret;
}
RK_LOGE("---------------------media_deinit_init StressTest");
return s32Ret;
}
static void wait_module_test_switch_success(void) {
for (RK_U32 i = 0; i < VENC_CHN_MAX; i++) {
pthread_mutex_lock(&g_frame_count_mutex[i]);
gModeTest->u32VencGetFrameCount[i] = 0;
pthread_mutex_unlock(&g_frame_count_mutex[i]);
sem_wait(&g_sem_module_test[i]);
}
}
static void *sample_demo_stresstest(void *pArgs) {
prctl(PR_SET_NAME, "sample_demo_stress");
RK_CHAR *pCTestModel = RK_NULL;
RK_S32 s32Ret = RK_FAILURE;
RK_U32 u32TestCount = 0;
wait_module_test_switch_success();
SAMPLE_COMM_DumpMeminfo("Enter sample_demo_stresstest", gModeTest->s32ModuleTestType);
while (!gModeTest->bIfModuleTestThreadQuit) {
switch (gModeTest->s32ModuleTestType) {
case 1:
s32Ret = pnMode_stressTest(gModeTest->s32CamId, gModeTest->eHdrMode,
gModeTest->bMultictx, gModeTest->pIqFileDir);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("pnMode_stressTest failure %X", s32Ret);
program_handle_error(__func__, __LINE__);
return RK_NULL;
}
pCTestModel = "pnMode_stressTest";
break;
case 2:
s32Ret = hdrMode_stressTest(gModeTest->s32CamId, gModeTest->bMultictx,
gModeTest->pIqFileDir);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("hdrMode_stressTest failure %X", s32Ret);
program_handle_error(__func__, __LINE__);
return RK_NULL;
}
pCTestModel = "hdrMode_stressTest";
break;
case 3:
s32Ret = frameRate_switchTest(&ctx->vi);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("frameRate_switchTest failure %X", s32Ret);
program_handle_error(__func__, __LINE__);
return RK_NULL;
}
pCTestModel = "frameRate_switchTest";
break;
case 4:
s32Ret = vpss_ai_isp_switchTest(&ctx->vpss);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("vpss_aiisp switchTest failure %X", s32Ret);
program_handle_error(__func__, __LINE__);
return RK_NULL;
}
pCTestModel = "vpss_ai_isp_switchTest";
break;
case 5:
s32Ret = vpss_chn0_resolution_switch_test(&ctx->vpss);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("vpss_chn0_resolution_switch_test failure %X", s32Ret);
program_handle_error(__func__, __LINE__);
return RK_NULL;
}
pCTestModel = "vpss_chn0_resolution_switch_test";
break;
case 6:
g_rtsp_ifenbale = RK_FALSE;
s32Ret = vpss_venc_chn0_resolution_switch_test(&ctx->vpss, (SAMPLE_VENC_CTX_S *)&ctx->venc,
gModeTest->rgn_attach_module);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("vpss_venc_chn0_resolution_switch_test failure %X", s32Ret);
program_handle_error(__func__, __LINE__);
return RK_NULL;
}
pCTestModel = "vpss_venc_chn0_resolution_switch_test";
break;
case 7:
s32Ret = encode_type_switch(&ctx->venc[0]);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("encode_type_switch failure %X", s32Ret);
program_handle_error(__func__, __LINE__);
return RK_NULL;
}
pCTestModel = "encode_type_switch";
break;
case 8:
s32Ret = rgn_CreateAndDestory(gModeTest->rgn_attach_module);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("vpss rgn_initAndDeinit failure %X", s32Ret);
program_handle_error(__func__, __LINE__);
return RK_NULL;
}
pCTestModel = "rgn_initAndDeinit_test";
break;
case 9:
s32Ret = rgn_CreateAndDestory(gModeTest->rgn_attach_module);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("venc rgn_initAndDeinit failure %X", s32Ret);
program_handle_error(__func__, __LINE__);
return RK_NULL;
}
pCTestModel = "rgn_initAndDeinit_test";
break;
case 10:
s32Ret = media_deinit_init();
if (s32Ret != RK_SUCCESS) {
RK_LOGE("Media_deinit_and_init failure %X", s32Ret);
program_handle_error(__func__, __LINE__);
return RK_NULL;
}
pCTestModel = "Media_deinit_and_init";
break;
case 11:
gModeTest->bIfaiisp_force_switch = RK_TRUE;
ai_isp_force_switchTest(&ctx->vpss);
pCTestModel = "ai_isp_force_switchTest";
break;
default:
RK_LOGE("this test type is not support");
}
wait_module_test_switch_success();
u32TestCount++;
RK_LOGE("-----------------moduleTest:%s switch success total:%d now_count:%d",
pCTestModel, gModeTest->u32ModuleTestLoop, u32TestCount);
if (gModeTest->u32ModuleTestLoop > 0 &&
u32TestCount >= gModeTest->u32ModuleTestLoop) {
RK_LOGE("------------------moduleTest: %s end(pass)", pCTestModel);
gModeTest->bIfModuleTestopen = RK_FALSE;
program_normal_exit(__func__, __LINE__);
break;
}
}
SAMPLE_COMM_DumpMeminfo("Exit sample_demo_stresstest", gModeTest->s32ModuleTestType);
RK_LOGE("sample_demo_stresstest exit!!!");
return RK_NULL;
}
/******************************************************************************
* function : main()
* Description : main
******************************************************************************/
int main(int argc, char *argv[]) {
RK_U32 u32VideoWidth = 2688;
RK_U32 u32VideoHeight = 1520;
RK_U32 u32SubVideoWidth = 1280;
RK_U32 u32SubVideoHeight = 720;
RK_U32 u32ThirdVideoWidth = 704;
RK_U32 u32ThirdVideoHeight = 576;
RK_U32 u32ViBuffCnt = 5;
#if defined(RV1106)
u32ViBuffCnt = 2;
#endif
RK_U32 u32IvsWidth = 704;
RK_U32 u32IvsHeight = 576;
RK_U32 u32IvaDetectFrameRate = 10;
RK_S32 s32Ret = RK_FAILURE;
RK_CHAR *pOutPathVenc = NULL;
RK_CHAR *pIvaModelPath = "/oem/usr/lib/";
RK_CHAR *pIqFileDir = RK_NULL;
RK_BOOL bMultictx = RK_FALSE;
CODEC_TYPE_E enCodecType = RK_CODEC_TYPE_H264;
VENC_RC_MODE_E enRcMode = VENC_RC_MODE_H264CBR;
RK_CHAR *pCodecName = "H264";
RK_S32 s32CamId = 0;
RK_S32 s32loopCnt = -1;
RK_BOOL enable_ai_isp = RK_TRUE;
RK_BOOL enable_iva = RK_TRUE;
RK_BOOL enable_npu = RK_TRUE;
RK_S32 s32BitRate = 4 * 1024;
RK_U32 u32VencFps = 25;
rk_aiq_working_mode_t eHdrMode = RK_AIQ_WORKING_MODE_NORMAL;
RK_U32 rgn_module = 1; // if not test rgn ,rgn dafault attach to venc
MPP_CHN_S stSrcChn, stDestChn;
pthread_t modeTest_thread_id;
if (argc < 2) {
print_usage(argv[0]);
g_exit_result = RK_FAILURE;
goto __PARAM_INIT_FAILED;
}
ctx = (SAMPLE_MPI_CTX_S *)(malloc(sizeof(SAMPLE_MPI_CTX_S)));
if (!ctx) {
RK_LOGE("ctx is null, malloc failure");
return RK_FAILURE;
}
memset(ctx, 0, sizeof(SAMPLE_MPI_CTX_S));
s32Ret = global_param_init();
if (s32Ret != RK_SUCCESS) {
RK_LOGE("global_param_init failure");
g_exit_result = RK_FAILURE;
goto __PARAM_INIT_FAILED;
}
signal(SIGINT, sigterm_handler);
signal(SIGTERM, sigterm_handler);
RK_S32 c = 0;
while ((c = getopt_long(argc, argv, optstr, long_options, RK_NULL)) != -1) {
const char *tmp_optarg = optarg;
switch (c) {
case 'a':
if (!optarg && RK_NULL != argv[optind] && '-' != argv[optind][0]) {
tmp_optarg = argv[optind++];
}
if (tmp_optarg) {
pIqFileDir = (char *)tmp_optarg;
} else {
pIqFileDir = RK_NULL;
}
break;
case 'w':
u32VideoWidth = atoi(optarg);
break;
case 'h':
u32VideoHeight = atoi(optarg);
break;
case 'b':
s32BitRate = atoi(optarg);
break;
case 'm':
gModeTest->s32ModuleTestType = atoi(optarg);
break;
case 'c':
gModeTest->u32TestFrameCount = atoi(optarg);
break;
case 't' + 'l':
gModeTest->u32ModuleTestLoop = atoi(optarg);
break;
case 'e':
if (!strcmp(optarg, "h264cbr")) {
enCodecType = RK_CODEC_TYPE_H264;
enRcMode = VENC_RC_MODE_H264CBR;
} else if (!strcmp(optarg, "h264vbr")) {
enCodecType = RK_CODEC_TYPE_H264;
enRcMode = VENC_RC_MODE_H264VBR;
} else if (!strcmp(optarg, "h264avbr")) {
enCodecType = RK_CODEC_TYPE_H264;
enRcMode = VENC_RC_MODE_H264AVBR;
} else if (!strcmp(optarg, "h265cbr")) {
enCodecType = RK_CODEC_TYPE_H265;
enRcMode = VENC_RC_MODE_H265CBR;
} else if (!strcmp(optarg, "h265vbr")) {
enCodecType = RK_CODEC_TYPE_H265;
enRcMode = VENC_RC_MODE_H265VBR;
} else if (!strcmp(optarg, "h265avbr")) {
enCodecType = RK_CODEC_TYPE_H265;
enRcMode = VENC_RC_MODE_H265AVBR;
} else {
printf("ERROR: Invalid encoder type.\n");
print_usage(argv[0]);
g_exit_result = RK_FAILURE;
goto __PARAM_INIT_FAILED;
}
break;
case 'i' + 'm':
pIvaModelPath = optarg;
break;
case 'd':
u32IvaDetectFrameRate = atoi(optarg);
break;
case 'o':
pOutPathVenc = optarg;
break;
case 'l':
s32loopCnt = atoi(optarg);
break;
case 'f':
u32VencFps = atoi(optarg);
break;
case 'n':
enable_npu = atoi(optarg);
break;
case 'v':
u32ViBuffCnt = atoi(optarg);
break;
case 'e' + 'a':
enable_ai_isp = atoi(optarg);
gModeTest->bIfenable_ai_isp = enable_ai_isp;
break;
case 'e' + 'i':
enable_iva = atoi(optarg);
gModeTest->bIfenable_iva = enable_iva;
break;
case 'i':
gModeTest->inputBmp1Path = optarg;
break;
case 'I':
gModeTest->inputBmp2Path = optarg;
break;
case '?':
default:
print_usage(argv[0]);
return 0;
}
}
printf("#CameraIdx: %d\n", s32CamId);
printf("#CodecName:%s\n", pCodecName);
printf("#Output Path: %s\n", pOutPathVenc);
printf("#IQ Path: %s\n", pIqFileDir);
printf("bIfenable_iva: %d\n", gModeTest->bIfenable_iva);
if (pIqFileDir) {
#ifdef RKAIQ
printf("#Rkaiq XML DirPath: %s\n", pIqFileDir);
printf("#bMultictx: %d\n\n", bMultictx);
gModeTest->s32CamId = s32CamId;
gModeTest->eHdrMode = eHdrMode;
gModeTest->bMultictx = bMultictx;
gModeTest->pIqFileDir = pIqFileDir;
gModeTest->enCodecType = enCodecType;
s32Ret = SAMPLE_COMM_ISP_Init(s32CamId, eHdrMode, bMultictx, pIqFileDir);
s32Ret |= SAMPLE_COMM_ISP_Run(s32CamId);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("ISP init failure");
g_exit_result = RK_FAILURE;
goto __FAILED2;
}
#endif
}
if (RK_MPI_SYS_Init() != RK_SUCCESS) {
RK_LOGE("RK_MPI_SYS_Init failure");
g_exit_result = RK_FAILURE;
goto __FAILED;
}
s32Ret = rtsp_init(enCodecType);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("rtsp_init failure");
g_exit_result = RK_FAILURE;
goto __FAILED;
}
#ifdef ROCKIVA
/* Init iva */
ctx->iva.pModelDataPath = pIvaModelPath;
ctx->iva.u32ImageHeight = u32IvsWidth;
ctx->iva.u32ImageWidth = u32IvsHeight;
ctx->iva.u32DetectStartX = 0;
ctx->iva.u32DetectStartY = 0;
ctx->iva.u32DetectWidth = u32IvsWidth;
ctx->iva.u32DetectHight = u32IvsHeight;
ctx->iva.eImageTransform = ROCKIVA_IMAGE_TRANSFORM_NONE;
ctx->iva.eImageFormat = ROCKIVA_IMAGE_FORMAT_YUV420SP_NV12;
ctx->iva.eModeType = ROCKIVA_DET_MODEL_PFP;
ctx->iva.u32IvaDetectFrameRate = u32IvaDetectFrameRate;
ctx->iva.resultCallback = rkIvaEvent_callback;
ctx->iva.releaseCallback = rkIvaFrame_releaseCallBack;
s32Ret = SAMPLE_COMM_IVA_Create(&ctx->iva);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("SAMPLE_COMM_IVA_Create failure:%#X", s32Ret);
goto __FAILED;
}
#endif
/* Init VI[0] */
ctx->vi.u32Width = u32VideoWidth;
ctx->vi.u32Height = u32VideoHeight;
ctx->vi.s32DevId = 0;
ctx->vi.u32PipeId = ctx->vi.s32DevId;
ctx->vi.s32ChnId = 0;
ctx->vi.stChnAttr.stIspOpt.stMaxSize.u32Width = u32VideoWidth;
ctx->vi.stChnAttr.stIspOpt.stMaxSize.u32Height = u32VideoHeight;
ctx->vi.stChnAttr.stIspOpt.u32BufCount = u32ViBuffCnt;
ctx->vi.stChnAttr.stIspOpt.enMemoryType = VI_V4L2_MEMORY_TYPE_DMABUF;
// ctx->vi.stChnAttr.u32Depth = 4;
ctx->vi.stChnAttr.enPixelFormat = RK_FMT_YUV420SP;
ctx->vi.stChnAttr.enCompressMode = COMPRESS_MODE_NONE;
ctx->vi.stChnAttr.stFrameRate.s32SrcFrameRate = -1;
ctx->vi.stChnAttr.stFrameRate.s32DstFrameRate = -1;
s32Ret = SAMPLE_COMM_VI_CreateChn(&ctx->vi);
if (s32Ret != RK_SUCCESS) {
g_exit_result = RK_FAILURE;
RK_LOGE("SAMPLE_COMM_VI_CreateChn failure:%d", s32Ret);
goto __FAILED;
}
// Init VPSS[0]
ctx->vpss.s32GrpId = 0;
ctx->vpss.s32ChnId = 0;
ctx->vpss.enVProcDevType = VIDEO_PROC_DEV_RGA;
ctx->vpss.stGrpVpssAttr.enPixelFormat = RK_FMT_YUV420SP;
ctx->vpss.stGrpVpssAttr.enCompressMode = COMPRESS_MODE_NONE; // no compress
ctx->vpss.s32ChnRotation[0] = ROTATION_0;
// SET VPSS[0,0]
ctx->vpss.stVpssChnAttr[0].enChnMode = VPSS_CHN_MODE_USER;
ctx->vpss.stVpssChnAttr[0].enCompressMode = COMPRESS_MODE_NONE;
ctx->vpss.stVpssChnAttr[0].enDynamicRange = DYNAMIC_RANGE_SDR8;
ctx->vpss.stVpssChnAttr[0].enPixelFormat = RK_FMT_YUV420SP;
ctx->vpss.stVpssChnAttr[0].stFrameRate.s32SrcFrameRate = -1;
ctx->vpss.stVpssChnAttr[0].stFrameRate.s32DstFrameRate = -1;
ctx->vpss.stVpssChnAttr[0].u32Width = u32VideoWidth;
ctx->vpss.stVpssChnAttr[0].u32Height = u32VideoHeight;
ctx->vpss.stVpssChnAttr[0].u32Depth = 0;
// SET VPSS[0,1]
ctx->vpss.stVpssChnAttr[1].enChnMode = VPSS_CHN_MODE_USER;
ctx->vpss.stVpssChnAttr[1].enCompressMode = COMPRESS_MODE_NONE;
ctx->vpss.stVpssChnAttr[1].enDynamicRange = DYNAMIC_RANGE_SDR8;
ctx->vpss.stVpssChnAttr[1].enPixelFormat = RK_FMT_YUV420SP;
ctx->vpss.stVpssChnAttr[1].stFrameRate.s32SrcFrameRate = -1;
ctx->vpss.stVpssChnAttr[1].stFrameRate.s32DstFrameRate = -1;
ctx->vpss.stVpssChnAttr[1].u32Width = u32SubVideoWidth;
ctx->vpss.stVpssChnAttr[1].u32Height = u32SubVideoHeight;
ctx->vpss.stVpssChnAttr[1].u32Depth = 0;
// SET VPSS[0,2]
ctx->vpss.stVpssChnAttr[2].enChnMode = VPSS_CHN_MODE_USER;
ctx->vpss.stVpssChnAttr[2].enCompressMode = COMPRESS_MODE_NONE;
ctx->vpss.stVpssChnAttr[2].enDynamicRange = DYNAMIC_RANGE_SDR8;
ctx->vpss.stVpssChnAttr[2].enPixelFormat = RK_FMT_YUV420SP;
ctx->vpss.stVpssChnAttr[2].stFrameRate.s32SrcFrameRate = -1;
ctx->vpss.stVpssChnAttr[2].stFrameRate.s32DstFrameRate = -1;
ctx->vpss.stVpssChnAttr[2].u32Width = u32ThirdVideoWidth;
ctx->vpss.stVpssChnAttr[2].u32Height = u32ThirdVideoHeight;
ctx->vpss.stVpssChnAttr[2].u32Depth = 0;
#if (defined ROCKIT_IVS) || (defined ROCKIVA)
// SET VPSS[0,3]
ctx->vpss.stVpssChnAttr[3].enChnMode = VPSS_CHN_MODE_USER;
ctx->vpss.stVpssChnAttr[3].enCompressMode = COMPRESS_MODE_NONE;
ctx->vpss.stVpssChnAttr[3].enDynamicRange = DYNAMIC_RANGE_SDR8;
ctx->vpss.stVpssChnAttr[3].enPixelFormat = RK_FMT_YUV420SP;
ctx->vpss.stVpssChnAttr[3].stFrameRate.s32SrcFrameRate = 25;
ctx->vpss.stVpssChnAttr[3].stFrameRate.s32DstFrameRate = 5;
ctx->vpss.stVpssChnAttr[3].u32Width = u32IvsWidth;
ctx->vpss.stVpssChnAttr[3].u32Height = u32IvsHeight;
ctx->vpss.stVpssChnAttr[3].u32Depth = 0;
ctx->vpss.stVpssChnAttr[3].u32FrameBufCnt = 0;
if (enable_npu) {
ctx->vpss.stVpssChnAttr[3].u32Depth += 1;
ctx->vpss.stVpssChnAttr[3].u32FrameBufCnt += 1;
}
if (enable_iva) {
ctx->vpss.stVpssChnAttr[3].u32FrameBufCnt += 1;
}
#endif
SAMPLE_COMM_VPSS_CreateChn(&ctx->vpss);
// set ai isp mode
if (enable_ai_isp) {
AIISP_ATTR_S stAIISPAttr;
memset(&stAIISPAttr, 0, sizeof(AIISP_ATTR_S));
stAIISPAttr.bEnable = RK_TRUE;
stAIISPAttr.stAiIspCallback.pfUpdateCallback = aiisp_callback;
stAIISPAttr.stAiIspCallback.pPrivateData = RK_NULL;
stAIISPAttr.pModelFilePath = "/oem/usr/lib/";
#if defined(RV1106)
stAIISPAttr.u32FrameBufCnt = 1;
#else
stAIISPAttr.u32FrameBufCnt = 2;
#endif
s32Ret = RK_MPI_VPSS_SetGrpAIISPAttr(0, &stAIISPAttr);
if (RK_SUCCESS != s32Ret) {
RK_LOGE("VPSS GRP 0 RK_MPI_VPSS_SetGrpAIISPAttr failed with %#x!", s32Ret);
goto __FAILED;
}
RK_LOGD("VPSS GRP 0 RK_MPI_VPSS_SetGrpAIISPAttr success.");
}
// Init VENC[0]
ctx->venc[0].s32ChnId = 0;
ctx->venc[0].u32Width = u32VideoWidth;
ctx->venc[0].u32Height = u32VideoHeight;
ctx->venc[0].u32Fps = u32VencFps;
ctx->venc[0].u32Gop = 50;
ctx->venc[0].u32BitRate = s32BitRate;
ctx->venc[0].enCodecType = enCodecType;
ctx->venc[0].enRcMode = enRcMode;
ctx->venc[0].getStreamCbFunc = venc_get_stream;
ctx->venc[0].s32loopCount = s32loopCnt;
ctx->venc[0].dstFilePath = pOutPathVenc;
ctx->venc[0].u32BuffSize = u32VideoWidth * u32VideoHeight / 2;
ctx->venc[0].enable_buf_share = RK_TRUE;
// H264 66Baseline 77Main Profile 100High Profile
// H265 0Main Profile 1Main 10 Profile
// MJPEG 0Baseline
ctx->venc[0].stChnAttr.stGopAttr.enGopMode =
VENC_GOPMODE_NORMALP; // VENC_GOPMODE_SMARTP
if (RK_CODEC_TYPE_H264 != enCodecType) {
ctx->venc[0].stChnAttr.stVencAttr.u32Profile = 0;
} else {
ctx->venc[0].stChnAttr.stVencAttr.u32Profile = 100;
}
SAMPLE_COMM_VENC_CreateChn(&ctx->venc[0]);
// Init VENC[1]
ctx->venc[1].s32ChnId = 1;
ctx->venc[1].u32Width = u32SubVideoWidth;
ctx->venc[1].u32Height = u32SubVideoHeight;
ctx->venc[1].u32Fps = u32VencFps;
ctx->venc[1].u32Gop = 50;
ctx->venc[1].u32BitRate = s32BitRate;
ctx->venc[1].enCodecType = enCodecType;
ctx->venc[1].enRcMode = enRcMode;
ctx->venc[1].getStreamCbFunc = venc_get_stream;
ctx->venc[1].s32loopCount = s32loopCnt;
ctx->venc[1].dstFilePath = pOutPathVenc;
ctx->venc[1].u32BuffSize = u32SubVideoWidth * u32SubVideoHeight / 2;
ctx->venc[1].enable_buf_share = RK_TRUE;
// H264 66Baseline 77Main Profile 100High Profile
// H265 0Main Profile 1Main 10 Profile
// MJPEG 0Baseline
ctx->venc[1].stChnAttr.stGopAttr.enGopMode =
VENC_GOPMODE_NORMALP; // VENC_GOPMODE_SMARTP
if (RK_CODEC_TYPE_H264 != enCodecType) {
ctx->venc[1].stChnAttr.stVencAttr.u32Profile = 0;
} else {
ctx->venc[1].stChnAttr.stVencAttr.u32Profile = 100;
}
SAMPLE_COMM_VENC_CreateChn(&ctx->venc[1]);
// Init VENC[2]
ctx->venc[2].s32ChnId = 2;
ctx->venc[2].u32Width = u32ThirdVideoWidth;
ctx->venc[2].u32Height = u32ThirdVideoHeight;
ctx->venc[2].u32Fps = u32VencFps;
ctx->venc[2].u32Gop = 50;
ctx->venc[2].u32BitRate = s32BitRate;
ctx->venc[2].enCodecType = enCodecType;
ctx->venc[2].enRcMode = enRcMode;
ctx->venc[2].getStreamCbFunc = venc_get_stream;
ctx->venc[2].s32loopCount = s32loopCnt;
ctx->venc[2].dstFilePath = pOutPathVenc;
ctx->venc[2].u32BuffSize = u32ThirdVideoWidth * u32ThirdVideoHeight / 2;
ctx->venc[2].enable_buf_share = RK_TRUE;
// H264 66Baseline 77Main Profile 100High Profile
// H265 0Main Profile 1Main 10 Profile
// MJPEG 0Baseline
ctx->venc[2].stChnAttr.stGopAttr.enGopMode =
VENC_GOPMODE_NORMALP; // VENC_GOPMODE_SMARTP
if (RK_CODEC_TYPE_H264 != enCodecType) {
ctx->venc[2].stChnAttr.stVencAttr.u32Profile = 0;
} else {
ctx->venc[2].stChnAttr.stVencAttr.u32Profile = 100;
}
SAMPLE_COMM_VENC_CreateChn(&ctx->venc[2]);
#ifdef ROCKIT_IVS
/* Init ivs */
ctx->ivs.s32ChnId = 0;
ctx->ivs.stIvsAttr.enMode = IVS_MODE_MD_OD;
ctx->ivs.stIvsAttr.u32PicWidth = u32IvsWidth;
ctx->ivs.stIvsAttr.u32PicHeight = u32IvsHeight;
ctx->ivs.stIvsAttr.enPixelFormat = RK_FMT_YUV420SP;
ctx->ivs.stIvsAttr.s32Gop = 30;
ctx->ivs.stIvsAttr.bSmearEnable = RK_FALSE;
ctx->ivs.stIvsAttr.bWeightpEnable = RK_FALSE;
ctx->ivs.stIvsAttr.bMDEnable = RK_TRUE;
ctx->ivs.stIvsAttr.s32MDInterval = 5;
ctx->ivs.stIvsAttr.bMDNightMode = RK_TRUE;
ctx->ivs.stIvsAttr.u32MDSensibility = 3;
ctx->ivs.stIvsAttr.bODEnable = RK_TRUE;
ctx->ivs.stIvsAttr.s32ODInterval = 1;
ctx->ivs.stIvsAttr.s32ODPercent = 7;
s32Ret = SAMPLE_COMM_IVS_Create(&ctx->ivs);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("SAMPLE_COMM_IVS_Create failure:%X", s32Ret);
program_handle_error(__func__, __LINE__);
} else {
RK_LOGI("SAMPLE_COMM_IVS_Create success");
}
#endif
// rgn test case
if (gModeTest->s32ModuleTestType == 8) {
gModeTest->rgn_attach_module = 0;
rgn_module = 0;
} else if (gModeTest->s32ModuleTestType == 9) {
gModeTest->rgn_attach_module = 1;
rgn_module = 1;
} else {
gModeTest->rgn_attach_module = 1;
}
/*rgn init*/
rgn_init(gModeTest->inputBmp1Path, gModeTest->inputBmp2Path, ctx, rgn_module);
// Bind VI and VPSS[0]
stSrcChn.enModId = RK_ID_VI;
stSrcChn.s32DevId = ctx->vi.s32DevId;
stSrcChn.s32ChnId = ctx->vi.s32ChnId;
stDestChn.enModId = RK_ID_VPSS;
stDestChn.s32DevId = ctx->vpss.s32GrpId;
stDestChn.s32ChnId = ctx->vpss.s32ChnId;
SAMPLE_COMM_Bind(&stSrcChn, &stDestChn);
/* Bind VPSS and VENC[0] */
stSrcChn.enModId = RK_ID_VPSS;
stSrcChn.s32DevId = ctx->vpss.s32GrpId;
stSrcChn.s32ChnId = ctx->vpss.s32ChnId;
stDestChn.enModId = RK_ID_VENC;
stDestChn.s32DevId = 0;
stDestChn.s32ChnId = ctx->venc[0].s32ChnId;
SAMPLE_COMM_Bind(&stSrcChn, &stDestChn);
/* Bind VPSS and VENC[1] */
stSrcChn.enModId = RK_ID_VPSS;
stSrcChn.s32DevId = ctx->vpss.s32GrpId;
stSrcChn.s32ChnId = 1;
stDestChn.enModId = RK_ID_VENC;
stDestChn.s32DevId = 0;
stDestChn.s32ChnId = ctx->venc[1].s32ChnId;
SAMPLE_COMM_Bind(&stSrcChn, &stDestChn);
/* Bind VPSS and VENC[2] */
stSrcChn.enModId = RK_ID_VPSS;
stSrcChn.s32DevId = ctx->vpss.s32GrpId;
stSrcChn.s32ChnId = 2;
stDestChn.enModId = RK_ID_VENC;
stDestChn.s32DevId = 0;
stDestChn.s32ChnId = ctx->venc[2].s32ChnId;
SAMPLE_COMM_Bind(&stSrcChn, &stDestChn);
#ifdef ROCKIT_IVS
/* VPSS bind IVS[0]*/
stSrcChn.enModId = RK_ID_VPSS;
stSrcChn.s32DevId = ctx->vpss.s32GrpId;
stSrcChn.s32ChnId = 3;
stDestChn.enModId = RK_ID_IVS;
stDestChn.s32DevId = 0;
stDestChn.s32ChnId = ctx->ivs.s32ChnId;
s32Ret = SAMPLE_COMM_Bind(&stSrcChn, &stDestChn);
if (s32Ret != RK_NULL)
RK_LOGE("IVS bind to VPSS error %#X!", s32Ret);
else
RK_LOGI("IVS bind to VPSS success!");
#endif
#ifdef ROCKIT_IVS
/* ivs detect thread launch */
pthread_create(&ivs_detect_thread_id, 0, ivs_detect_thread, (void *)&ctx->ivs);
#endif
#ifdef ROCKIVA
// vpss iva thread launch
if (gModeTest->bIfenable_iva) {
gModeTest->bIfVpssIvaTHreadQuit = RK_FALSE;
pthread_create(&gModeTest->vpss_iva_thread_id, 0, vpss_iva_thread, (void *)ctx);
}
#endif
if (gModeTest->s32ModuleTestType) {
gModeTest->bIfModuleTestopen = RK_TRUE;
pthread_create(&modeTest_thread_id, 0, sample_demo_stresstest,
(void *)(gModeTest));
}
printf("%s initial finish\n", __func__);
while (!gModeTest->bIfMainThreadQuit) {
sleep(1);
if (!gModeTest->s32ModuleTestType) {
rgn_change_posit(gModeTest->rgn_attach_module);
}
}
printf("%s exit!\n", __func__);
/* mode_test_deinit */
if (gModeTest->s32ModuleTestType) {
gModeTest->bIfModuleTestThreadQuit = RK_TRUE;
pthread_join(modeTest_thread_id, RK_NULL);
}
rgn_deinit(ctx, rgn_module);
#ifdef ROCKIVA
/* Destroy IVA */
if (gModeTest->bIfenable_iva) {
gModeTest->bIfVpssIvaTHreadQuit = RK_TRUE;
pthread_join(gModeTest->vpss_iva_thread_id, RK_NULL);
SAMPLE_COMM_IVA_Destroy(&ctx->iva);
}
#endif
#ifdef ROCKIT_IVS
/* ivs detect thread exit*/
gModeTest->bIfIvsDetectThreadQuit = RK_TRUE;
pthread_join(ivs_detect_thread_id, RK_NULL);
/* VPSS[3] unbind IVS[0]*/
stSrcChn.enModId = RK_ID_VPSS;
stSrcChn.s32DevId = ctx->vpss.s32GrpId;
stSrcChn.s32ChnId = 3;
stDestChn.enModId = RK_ID_IVS;
stDestChn.s32DevId = 0;
stDestChn.s32ChnId = ctx->ivs.s32ChnId;
s32Ret = SAMPLE_COMM_UnBind(&stSrcChn, &stDestChn);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("VPSS and IVS bind failure:%X", s32Ret);
g_exit_result = RK_FAILURE;
}
/* ivs chn destroy*/
SAMPLE_COMM_IVS_Destroy(ctx->ivs.s32ChnId);
#endif
for (int i = 0; i < VENC_CHN_MAX; i++) {
gModeTest->bIfVencThreadQuit[i] = true;
pthread_join(ctx->venc[i].getStreamThread, RK_NULL);
}
/* Venc[0] unbind VPSS[0,0]*/
stSrcChn.enModId = RK_ID_VPSS;
stSrcChn.s32DevId = ctx->vpss.s32GrpId;
stSrcChn.s32ChnId = ctx->vpss.s32ChnId;
stDestChn.enModId = RK_ID_VENC;
stDestChn.s32DevId = 0;
stDestChn.s32ChnId = ctx->venc[0].s32ChnId;
s32Ret = SAMPLE_COMM_UnBind(&stSrcChn, &stDestChn);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("venc[0] and Vpss unbind failure:%X", s32Ret);
g_exit_result = RK_FAILURE;
}
/* Venc[1] unbind VPSS[0,1]*/
stSrcChn.enModId = RK_ID_VPSS;
stSrcChn.s32DevId = ctx->vpss.s32GrpId;
stSrcChn.s32ChnId = 1;
stDestChn.enModId = RK_ID_VENC;
stDestChn.s32DevId = 0;
stDestChn.s32ChnId = ctx->venc[1].s32ChnId;
s32Ret = SAMPLE_COMM_UnBind(&stSrcChn, &stDestChn);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("Venc[1] and Vpss unbind failure:%X", s32Ret);
g_exit_result = RK_FAILURE;
}
/* Venc[2] unbind VPSS[0,2]*/
stSrcChn.enModId = RK_ID_VPSS;
stSrcChn.s32DevId = ctx->vpss.s32GrpId;
stSrcChn.s32ChnId = 2;
stDestChn.enModId = RK_ID_VENC;
stDestChn.s32DevId = 0;
stDestChn.s32ChnId = ctx->venc[2].s32ChnId;
s32Ret = SAMPLE_COMM_UnBind(&stSrcChn, &stDestChn);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("Venc[2] and Vpss unbind failure:%X", s32Ret);
g_exit_result = RK_FAILURE;
}
SAMPLE_COMM_VENC_DestroyChn(&ctx->venc[0]);
SAMPLE_COMM_VENC_DestroyChn(&ctx->venc[1]);
SAMPLE_COMM_VENC_DestroyChn(&ctx->venc[2]);
// UnBind VI and VPSS
stSrcChn.enModId = RK_ID_VI;
stSrcChn.s32DevId = ctx->vi.s32DevId;
stSrcChn.s32ChnId = ctx->vi.s32ChnId;
stDestChn.enModId = RK_ID_VPSS;
stDestChn.s32DevId = ctx->vpss.s32GrpId;
stDestChn.s32ChnId = ctx->vpss.s32ChnId;
s32Ret = SAMPLE_COMM_UnBind(&stSrcChn, &stDestChn);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("VI and Vpss unbind failure:%X", s32Ret);
g_exit_result = RK_FAILURE;
}
// Destroy VPSS
SAMPLE_COMM_VPSS_DestroyChn(&ctx->vpss);
// Destroy VI
SAMPLE_COMM_VI_DestroyChn(&ctx->vi);
rtsp_deinit();
__FAILED:
RK_MPI_SYS_Exit();
if (pIqFileDir) {
#ifdef RKAIQ
SAMPLE_COMM_ISP_Stop(s32CamId);
#endif
}
__FAILED2:
global_param_deinit();
__PARAM_INIT_FAILED:
return g_exit_result;
}
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* End of #ifdef __cplusplus */