資料的位置
源代碼在luckfox-pico/project/app/rkipc/rkipc/src/rv1106_ipc/video/video.c中,使用了rkmpi庫,參考資料為"doc/zh/media/Rockchip_Developer_Guide_MPI.pdf"
通道設置設置
H265的通道設置主要由rkipc_pipe_0_init完成,之前要設置好isp,調用RK_MPI_SYS_Init()初始化好rkmpi系統
根據ini文件將參數填上
int rkipc_pipe_0_init() {int ret;//int video_width = rk_param_get_int("video.0:width", -1);video_width = 1920;//int video_height = rk_param_get_int("video.0:height", -1);video_height = 1080;//int buffer_line = rk_param_get_int("video.source:buffer_line", video_height / 4);int buffer_line = 1080;//int rotation = rk_param_get_int("video.source:rotation", 0);int rotation = 180;int buf_cnt = 2;//int frame_min_i_qp = rk_param_get_int("video.0:frame_min_i_qp", 26);int frame_min_i_qp = 26;//int frame_min_qp = rk_param_get_int("video.0:frame_min_qp", 28);int frame_min_qp = 28;//int frame_max_i_qp = rk_param_get_int("video.0:frame_max_i_qp", 51);int frame_max_i_qp = 51;//int frame_max_qp = rk_param_get_int("video.0:frame_max_qp", 51);int frame_max_qp = 51;//int scalinglist = rk_param_get_int("video.0:scalinglist", 0);int scalinglist = 0;// VI//VI輸入通道//輸入通道的參數VI_CHN_ATTR_S vi_chn_attr;memset(&vi_chn_attr, 0, sizeof(vi_chn_attr));//VI_ISP_OPT_S 獲取圖像為isp處理/直通數據的參數設置。//RW;輸出通道總的緩存塊數。2vi_chn_attr.stIspOpt.u32BufCount = buf_cnt;//獲取圖像的V4L2內存類型。vi_chn_attr.stIspOpt.enMemoryType = VI_V4L2_MEMORY_TYPE_DMABUF;//ISP的最大寬度//vi_chn_attr.stIspOpt.stMaxSize.u32Width = rk_param_get_int("video.0:max_width", 2560);vi_chn_attr.stIspOpt.stMaxSize.u32Width = 1920;//ISP的最大高度//vi_chn_attr.stIspOpt.stMaxSize.u32Height = rk_param_get_int("video.0:max_height", 1440);vi_chn_attr.stIspOpt.stMaxSize.u32Height = 1080;//通道的寬度 1920vi_chn_attr.stSize.u32Width = video_width;//通道高度 1080vi_chn_attr.stSize.u32Height = video_height;//目標圖像像素格式。vi_chn_attr.enPixelFormat = RK_FMT_YUV420SP;//用戶獲取圖像的隊列深度。取值范圍:[0,8];0不能手動獲取vi_chn_attr.u32Depth = 0;//目標圖像壓縮格式。無壓縮vi_chn_attr.enCompressMode = COMPRESS_MODE_NONE;//設置VI通道ret = RK_MPI_VI_SetChnAttr(pipe_id_, VIDEO_PIPE_0, &vi_chn_attr);if (ret) {LOG_ERROR("ERROR: create VI error! ret=%d\n", ret);return ret;}//使能VI通道ret = RK_MPI_VI_EnableChn(pipe_id_, VIDEO_PIPE_0);if (ret) {LOG_ERROR("ERROR: create VI error! ret=%d\n", ret);return ret;}// VENC//編碼器//編碼器屬性結構體VENC_CHN_ATTR_S venc_chn_attr;memset(&venc_chn_attr, 0, sizeof(venc_chn_attr));//tmp_output_data_type = rk_param_get_string("video.0:output_data_type", NULL);tmp_output_data_type = H.265;//tmp_rc_mode = rk_param_get_string("video.0:rc_mode", NULL);//恒定碼率tmp_rc_mode = CBR;//tmp_h264_profile = rk_param_get_string("video.0:h264_profile", NULL);tmp_h264_profile = high;//tmp_rc_mode, tmp_output_data_type 必填if ((tmp_output_data_type == NULL) || (tmp_rc_mode == NULL)) {LOG_ERROR("tmp_output_data_type or tmp_rc_mode is NULL\n");return -1;}LOG_DEBUG("tmp_output_data_type is %s, tmp_rc_mode is %s, tmp_h264_profile is %s\n",tmp_output_data_type, tmp_rc_mode, tmp_h264_profile);//h264模式的設置if (!strcmp(tmp_output_data_type, "H.264")) {//h264的格式 RK_VIDEO_ID_AVCvenc_chn_attr.stVencAttr.enType = RK_VIDEO_ID_AVC;//圖像級別,高100, 主77,基礎66,其它的錯誤if (!strcmp(tmp_h264_profile, "high"))venc_chn_attr.stVencAttr.u32Profile = 100;else if (!strcmp(tmp_h264_profile, "main"))venc_chn_attr.stVencAttr.u32Profile = 77;else if (!strcmp(tmp_h264_profile, "baseline"))venc_chn_attr.stVencAttr.u32Profile = 66;elseLOG_ERROR("tmp_h264_profile is %s\n", tmp_h264_profile);//tmp_rc_mode CBR 碼率控制為恒定碼率if (!strcmp(tmp_rc_mode, "CBR")) {//碼率控制//模式恒定碼率venc_chn_attr.stRcAttr.enRcMode = VENC_RC_MODE_H264CBR;//venc_chn_attr.stRcAttr.stH264Cbr.u32Gop = rk_param_get_int("video.0:gop", -1);//I幀間隔venc_chn_attr.stRcAttr.stH264Cbr.u32Gop = 50;//venc_chn_attr.stRcAttr.stH264Cbr.u32BitRate = rk_param_get_int("video.0:max_rate", -1);//平均 bitrate,以 kbps 為單位。venc_chn_attr.stRcAttr.stH264Cbr.u32BitRate = 2048;//venc_chn_attr.stRcAttr.stH264Cbr.fr32DstFrameRateDen = rk_param_get_int("video.0:dst_frame_rate_den", -1);//輸出幀率分母venc_chn_attr.stRcAttr.stH264Cbr.fr32DstFrameRateDen = 25;//venc_chn_attr.stRcAttr.stH264Cbr.fr32DstFrameRateNum = rk_param_get_int("video.0:dst_frame_rate_num", -1);//輸出幀率分子venc_chn_attr.stRcAttr.stH264Cbr.fr32DstFrameRateNum = 1;//venc_chn_attr.stRcAttr.stH264Cbr.u32SrcFrameRateDen = rk_param_get_int("video.0:src_frame_rate_den", -1);//輸入幀率分母venc_chn_attr.stRcAttr.stH264Cbr.u32SrcFrameRateDen = 25;//venc_chn_attr.stRcAttr.stH264Cbr.u32SrcFrameRateNum = rk_param_get_int("video.0:src_frame_rate_num", -1);//輸入幀率分子venc_chn_attr.stRcAttr.stH264Cbr.u32SrcFrameRateNum = 1;} else { //可變碼率 多了最大碼率和最小碼率venc_chn_attr.stRcAttr.enRcMode = VENC_RC_MODE_H264VBR;venc_chn_attr.stRcAttr.stH264Vbr.u32Gop = rk_param_get_int("video.0:gop", -1);venc_chn_attr.stRcAttr.stH264Vbr.u32BitRate = rk_param_get_int("video.0:mid_rate", -1);venc_chn_attr.stRcAttr.stH264Vbr.u32MaxBitRate =rk_param_get_int("video.0:max_rate", -1);venc_chn_attr.stRcAttr.stH264Vbr.u32MinBitRate =rk_param_get_int("video.0:min_rate", -1);venc_chn_attr.stRcAttr.stH264Vbr.fr32DstFrameRateDen =rk_param_get_int("video.0:dst_frame_rate_den", -1);venc_chn_attr.stRcAttr.stH264Vbr.fr32DstFrameRateNum =rk_param_get_int("video.0:dst_frame_rate_num", -1);venc_chn_attr.stRcAttr.stH264Vbr.u32SrcFrameRateDen =rk_param_get_int("video.0:src_frame_rate_den", -1);venc_chn_attr.stRcAttr.stH264Vbr.u32SrcFrameRateNum =rk_param_get_int("video.0:src_frame_rate_num", -1);}} else if (!strcmp(tmp_output_data_type, "H.265")) { //h265設置 和h264差不多venc_chn_attr.stVencAttr.enType = RK_VIDEO_ID_HEVC;if (!strcmp(tmp_rc_mode, "CBR")) {venc_chn_attr.stRcAttr.enRcMode = VENC_RC_MODE_H265CBR;venc_chn_attr.stRcAttr.stH265Cbr.u32Gop = rk_param_get_int("video.0:gop", -1);venc_chn_attr.stRcAttr.stH265Cbr.u32BitRate = rk_param_get_int("video.0:max_rate", -1);venc_chn_attr.stRcAttr.stH265Cbr.fr32DstFrameRateDen =rk_param_get_int("video.0:dst_frame_rate_den", -1);venc_chn_attr.stRcAttr.stH265Cbr.fr32DstFrameRateNum =rk_param_get_int("video.0:dst_frame_rate_num", -1);venc_chn_attr.stRcAttr.stH265Cbr.u32SrcFrameRateDen =rk_param_get_int("video.0:src_frame_rate_den", -1);venc_chn_attr.stRcAttr.stH265Cbr.u32SrcFrameRateNum =rk_param_get_int("video.0:src_frame_rate_num", -1);} else { venc_chn_attr.stRcAttr.enRcMode = VENC_RC_MODE_H265VBR;venc_chn_attr.stRcAttr.stH265Vbr.u32Gop = rk_param_get_int("video.0:gop", -1);venc_chn_attr.stRcAttr.stH265Vbr.u32BitRate = rk_param_get_int("video.0:mid_rate", -1);venc_chn_attr.stRcAttr.stH265Vbr.u32MaxBitRate =rk_param_get_int("video.0:max_rate", -1);venc_chn_attr.stRcAttr.stH265Vbr.u32MinBitRate =rk_param_get_int("video.0:min_rate", -1);venc_chn_attr.stRcAttr.stH265Vbr.fr32DstFrameRateDen =rk_param_get_int("video.0:dst_frame_rate_den", -1);venc_chn_attr.stRcAttr.stH265Vbr.fr32DstFrameRateNum =rk_param_get_int("video.0:dst_frame_rate_num", -1);venc_chn_attr.stRcAttr.stH265Vbr.u32SrcFrameRateDen =rk_param_get_int("video.0:src_frame_rate_den", -1);venc_chn_attr.stRcAttr.stH265Vbr.u32SrcFrameRateNum =rk_param_get_int("video.0:src_frame_rate_num", -1);}} else { //不是h264, h265則錯誤格式LOG_ERROR("tmp_output_data_type is %s, not support\n", tmp_output_data_type);return -1;}//tmp_gop_mode = rk_param_get_string("video.0:gop_mode", NULL);//P幀的設置,一般,智能tmp_gop_mode = "normalP";if (!strcmp(tmp_gop_mode, "normalP")) {venc_chn_attr.stGopAttr.enGopMode = VENC_GOPMODE_NORMALP;} else if (!strcmp(tmp_gop_mode, "smartP")) {venc_chn_attr.stGopAttr.enGopMode = VENC_GOPMODE_SMARTP;venc_chn_attr.stGopAttr.s32VirIdrLen = rk_param_get_int("video.0:smartp_viridrlen", 25);venc_chn_attr.stGopAttr.u32MaxLtrCount = 1; // long-term reference frame ltr is fixed to 1} else if (!strcmp(tmp_gop_mode, "TSVC4")) {venc_chn_attr.stGopAttr.enGopMode = VENC_GOPMODE_TSVC4;}// venc_chn_attr.stGopAttr.u32GopSize = rk_param_get_int("video.0:gop", -1);venc_chn_attr.stVencAttr.enPixelFormat = RK_FMT_YUV420SP;venc_chn_attr.stVencAttr.u32MaxPicWidth = rk_param_get_int("video.0:max_width", 2560);venc_chn_attr.stVencAttr.u32MaxPicHeight = rk_param_get_int("video.0:max_height", 1440);venc_chn_attr.stVencAttr.u32PicWidth = video_width;venc_chn_attr.stVencAttr.u32PicHeight = video_height;venc_chn_attr.stVencAttr.u32VirWidth = video_width;venc_chn_attr.stVencAttr.u32VirHeight = video_height;venc_chn_attr.stVencAttr.u32StreamBufCnt = rk_param_get_int("video.0:buffer_count", 4);venc_chn_attr.stVencAttr.u32BufSize = rk_param_get_int("video.0:buffer_size", 1843200);// venc_chn_attr.stVencAttr.u32Depth = 1;//創建ENC通道ret = RK_MPI_VENC_CreateChn(VIDEO_PIPE_0, &venc_chn_attr);if (ret) {LOG_ERROR("ERROR: create VENC error! ret=%#x\n", ret);return -1;}//智能編碼,看文檔,這里是closetmp_smart = rk_param_get_string("video.0:smart", "close");if (!strcmp(tmp_smart, "open"))RK_MPI_VENC_EnableSvc(VIDEO_PIPE_0, 1);//使能運動去模糊。這里為1 開啟智能編碼自動開啟if (rk_param_get_int("video.0:enable_motion_deblur", 0)) {ret = RK_MPI_VENC_EnableMotionDeblur(VIDEO_PIPE_0, true);if (ret)LOG_ERROR("RK_MPI_VENC_EnableMotionDeblur error! ret=%#x\n", ret);}//靜態開關,這里為1if (rk_param_get_int("video.0:enable_motion_static_switch", 0)) {ret = RK_MPI_VENC_EnableMotionStaticSwitch(VIDEO_PIPE_0, true);if (ret)LOG_ERROR("RK_MPI_VENC_EnableMotionStaticSwitch error! ret=%#x\n", ret);}//去除呼吸效應是否使能VENC_DEBREATHEFFECT_S debfrath_effect;memset(&debfrath_effect, 0, sizeof(VENC_DEBREATHEFFECT_S));//這里為關if (rk_param_get_int("video.0:enable_debreath_effect", 0)) {debfrath_effect.bEnable = true;debfrath_effect.s32Strength1 = rk_param_get_int("video.0:debreath_effect_strength", 16);//設置呼吸效應ret = RK_MPI_VENC_SetDeBreathEffect(VIDEO_PIPE_0, &debfrath_effect);if (ret)LOG_ERROR("RK_MPI_VENC_SetDeBreathEffect error! ret=%#x\n", ret);}// VENC_RC_PARAM_S h265_RcParam;// RK_MPI_VENC_GetRcParam(VIDEO_PIPE_0, &h265_RcParam);// h265_RcParam.s32FirstFrameStartQp = 26;// h265_RcParam.stParamH265.u32StepQp = 8;// h265_RcParam.stParamH265.u32MaxQp = 51;// h265_RcParam.stParamH265.u32MinQp = 10;// h265_RcParam.stParamH265.u32MaxIQp = 46;// h265_RcParam.stParamH265.u32MinIQp = 24;// h265_RcParam.stParamH265.s32DeltIpQp = -4;// RK_MPI_VENC_SetRcParam(VIDEO_PIPE_0, &h265_RcParam);tmp_rc_quality = rk_param_get_string("video.0:rc_quality", NULL);VENC_RC_PARAM_S venc_rc_param;RK_MPI_VENC_GetRcParam(VIDEO_PIPE_0, &venc_rc_param);if (!strcmp(tmp_output_data_type, "H.264")) {if (!strcmp(tmp_rc_quality, "highest")) {venc_rc_param.stParamH264.u32MinQp = 10;} else if (!strcmp(tmp_rc_quality, "higher")) {venc_rc_param.stParamH264.u32MinQp = 15;} else if (!strcmp(tmp_rc_quality, "high")) {venc_rc_param.stParamH264.u32MinQp = 20;} else if (!strcmp(tmp_rc_quality, "medium")) {venc_rc_param.stParamH264.u32MinQp = 25;} else if (!strcmp(tmp_rc_quality, "low")) {venc_rc_param.stParamH264.u32MinQp = 30;} else if (!strcmp(tmp_rc_quality, "lower")) {venc_rc_param.stParamH264.u32MinQp = 35;} else {venc_rc_param.stParamH264.u32MinQp = 40;}venc_rc_param.stParamH264.u32FrmMinIQp = frame_min_i_qp;venc_rc_param.stParamH264.u32FrmMinQp = frame_min_qp;venc_rc_param.stParamH264.u32FrmMaxIQp = frame_max_i_qp;venc_rc_param.stParamH264.u32FrmMaxQp = frame_max_qp;} else if (!strcmp(tmp_output_data_type, "H.265")) {if (!strcmp(tmp_rc_quality, "highest")) {venc_rc_param.stParamH265.u32MinQp = 10;} else if (!strcmp(tmp_rc_quality, "higher")) {venc_rc_param.stParamH265.u32MinQp = 15;} else if (!strcmp(tmp_rc_quality, "high")) {venc_rc_param.stParamH265.u32MinQp = 20;} else if (!strcmp(tmp_rc_quality, "medium")) {venc_rc_param.stParamH265.u32MinQp = 25;} else if (!strcmp(tmp_rc_quality, "low")) {venc_rc_param.stParamH265.u32MinQp = 30;} else if (!strcmp(tmp_rc_quality, "lower")) {venc_rc_param.stParamH265.u32MinQp = 35;} else {venc_rc_param.stParamH265.u32MinQp = 40;}venc_rc_param.stParamH265.u32FrmMinIQp = frame_min_i_qp;venc_rc_param.stParamH265.u32FrmMinQp = frame_min_qp;venc_rc_param.stParamH265.u32FrmMaxIQp = frame_max_i_qp;venc_rc_param.stParamH265.u32FrmMaxQp = frame_max_qp;} else {LOG_ERROR("tmp_output_data_type is %s, not support\n", tmp_output_data_type);return -1;}//設置編碼通道碼率控制器的高級參數。 qpRK_MPI_VENC_SetRcParam(VIDEO_PIPE_0, &venc_rc_param);//設置H.264協議編碼通道的變換、量化屬性。if (!strcmp(tmp_output_data_type, "H.264")) {VENC_H264_TRANS_S pstH264Trans;RK_MPI_VENC_GetH264Trans(VIDEO_PIPE_0, &pstH264Trans);pstH264Trans.bScalingListValid = scalinglist;RK_MPI_VENC_SetH264Trans(VIDEO_PIPE_0, &pstH264Trans);} else if (!strcmp(tmp_output_data_type, "H.265")) {VENC_H265_TRANS_S pstH265Trans;RK_MPI_VENC_GetH265Trans(VIDEO_PIPE_0, &pstH265Trans);pstH265Trans.bScalingListEnabled = scalinglist;RK_MPI_VENC_SetH265Trans(VIDEO_PIPE_0, &pstH265Trans);}//設置編碼通道參考幀共享屬性。節省內存VENC_CHN_REF_BUF_SHARE_S stVencChnRefBufShare;memset(&stVencChnRefBufShare, 0, sizeof(VENC_CHN_REF_BUF_SHARE_S));stVencChnRefBufShare.bEnable = rk_param_get_int("video.0:enable_refer_buffer_share", 0);RK_MPI_VENC_SetChnRefBufShareAttr(VIDEO_PIPE_0, &stVencChnRefBufShare);//旋轉if (rotation == 0) {RK_MPI_VENC_SetChnRotation(VIDEO_PIPE_0, ROTATION_0);} else if (rotation == 90) {RK_MPI_VENC_SetChnRotation(VIDEO_PIPE_0, ROTATION_90);} else if (rotation == 180) {RK_MPI_VENC_SetChnRotation(VIDEO_PIPE_0, ROTATION_180);} else if (rotation == 270) {RK_MPI_VENC_SetChnRotation(VIDEO_PIPE_0, ROTATION_270);}//開始編碼通道接收輸入圖像。VENC_RECV_PIC_PARAM_S stRecvParam;memset(&stRecvParam, 0, sizeof(VENC_RECV_PIC_PARAM_S));//接收幀數,-1表示自動接收不停止stRecvParam.s32RecvPicNum = -1;RK_MPI_VENC_StartRecvFrame(VIDEO_PIPE_0, &stRecvParam);//創建線程獲取venc輸出數據pthread_create(&venc_thread_0, NULL, rkipc_get_venc_0, NULL);// bindvi_chn.enModId = RK_ID_VI;vi_chn.s32DevId = 0;vi_chn.s32ChnId = VIDEO_PIPE_0;venc_chn.enModId = RK_ID_VENC;venc_chn.s32DevId = 0;venc_chn.s32ChnId = VIDEO_PIPE_0;//vi綁定vencret = RK_MPI_SYS_Bind(&vi_chn, &venc_chn);if (ret)LOG_ERROR("Bind VI and VENC error! ret=%#x\n", ret);elseLOG_DEBUG("Bind VI and VENC success\n");return 0;
}
獲取venc0的數據
static void *rkipc_get_venc_0(void *arg) {LOG_DEBUG("#Start %s thread, arg:%p\n", __func__, arg);prctl(PR_SET_NAME, "RkipcVenc0", 0, 0, 0);
/*
typedef struct rkVENC_STREAM_S {
VENC_PACK_S ATTRIBUTE* pstPack; //幀碼流包結構。
RK_U32 ATTRIBUTE u32PackCount; //一幀碼流的所有包的個數。
RK_U32 u32Seq; //碼流序列號。按幀獲取幀序號;按包獲取包序號。
//碼流特征信息。
union {
VENC_STREAM_INFO_H264_S stH264Info;
VENC_STREAM_INFO_JPEG_S stJpegInfo;
VENC_STREAM_INFO_H265_S stH265Info;
VENC_STREAM_INFO_PRORES_S stProresInfo;
};
//碼流高級特征信息。
union {
VENC_STREAM_ADVANCE_INFO_H264_S stAdvanceH264Info;
VENC_STREAM_ADVANCE_INFO_JPEG_S stAdvanceJpegInfo;
VENC_STREAM_ADVANCE_INFO_H265_S stAdvanceH265Info;
VENC_STREAM_ADVANCE_INFO_PRORES_S stAdvanceProresInfo;
};
} VENC_STREAM_S;typedef struct rkVENC_PACK_S {
MB_BLK pMbBlk; //碼流包緩存塊句柄。
RK_U32 u32Len; //碼流包長度。
RK_U64 u64PTS; //時間戳。單位:us。
RK_BOOL bFrameEnd; //幀結束標識。取值范圍:RK_TRUE:該碼流包是該幀的最后一個包RK_FALSE:該碼流包不是該幀的最后一個包。
RK_BOOL bStreamEnd; //流結束標識。取值范圍:RK_TRUE:該碼流包是數據流的最后一個包,編碼器將輸出編碼圖像最后一幀碼流。RK_FALSE:該碼流包不是數據流的最后一個包。
VENC_DATA_TYPE_U DataType; //碼流類型,支持 H.264/JPEG/ H.265 協議類型的數據包。
RK_U32 u32Offset; //沒用
RK_U32 u32DataNum; //沒用
VENC_PACK_INFO_S stPackInfo[8]; //沒用
} VENC_PACK_S;DataType
typedef enum rkH264E_NALU_TYPE_E {
H264E_NALU_BSLICE = 0,
H264E_NALU_PSLICE = 1,
H264E_NALU_ISLICE = 2,
H264E_NALU_IDRSLICE = 5,
H264E_NALU_SEI = 6,
H264E_NALU_SPS = 7,
H264E_NALU_PPS = 8,
H264E_NALU_BUTT
} H264E_NALU_TYPE_E;*/VENC_STREAM_S stFrame;VI_CHN_STATUS_S stChnStatus;int loopCount = 0;int ret = 0;// FILE *fp = fopen("/data/venc.h265", "wb");stFrame.pstPack = malloc(sizeof(VENC_PACK_S));while (g_video_run_) {// 5.get the frame//獲取數據ret = RK_MPI_VENC_GetStream(VIDEO_PIPE_0, &stFrame, 1000);if (ret == RK_SUCCESS) {//獲取內存地址void *data = RK_MPI_MB_Handle2VirAddr(stFrame.pstPack->pMbBlk);// fwrite(data, 1, stFrame.pstPack->u32Len, fp);// fflush(fp);// LOG_DEBUG("Count:%d, Len:%d, PTS is %" PRId64", enH264EType is %d\n", loopCount,// stFrame.pstPack->u32Len, stFrame.pstPack->u64PTS,// stFrame.pstPack->DataType.enH264EType);//發送數據if (g_rtsplive && g_rtsp_session_0) {pthread_mutex_lock(&g_rtsp_mutex);rtsp_tx_video(g_rtsp_session_0, data, stFrame.pstPack->u32Len,stFrame.pstPack->u64PTS);rtsp_do_event(g_rtsplive);pthread_mutex_unlock(&g_rtsp_mutex);}if ((stFrame.pstPack->DataType.enH264EType == H264E_NALU_IDRSLICE) ||(stFrame.pstPack->DataType.enH264EType == H264E_NALU_ISLICE) ||(stFrame.pstPack->DataType.enH265EType == H265E_NALU_IDRSLICE) ||(stFrame.pstPack->DataType.enH265EType == H265E_NALU_ISLICE)) {rk_storage_write_video_frame(0, data, stFrame.pstPack->u32Len,stFrame.pstPack->u64PTS, 1);if (enable_rtmp)rk_rtmp_write_video_frame(0, data, stFrame.pstPack->u32Len,stFrame.pstPack->u64PTS, 1);} else {rk_storage_write_video_frame(0, data, stFrame.pstPack->u32Len,stFrame.pstPack->u64PTS, 0);if (enable_rtmp)rk_rtmp_write_video_frame(0, data, stFrame.pstPack->u32Len,stFrame.pstPack->u64PTS, 0);}// 7.release the frameret = RK_MPI_VENC_ReleaseStream(VIDEO_PIPE_0, &stFrame);if (ret != RK_SUCCESS) {LOG_ERROR("RK_MPI_VENC_ReleaseStream fail %x\n", ret);}loopCount++;} else {LOG_ERROR("RK_MPI_VENC_GetStream timeout %x\n", ret);}}if (stFrame.pstPack)free(stFrame.pstPack);// if (fp)// fclose(fp);return 0;
}