E_OK,S_FALSE,E_FAIL

本文介绍了S_OK、S_FALSE及E_FAIL这三个返回值的区别。S_OK和S_FALSE都表示成功,但S_FALSE提示方法未完全执行,不影响后续操作;而E_FAIL表示方法错误,需处理。

S_OK 和 S_FALSE 都表示成功。

S_FALSE:则可以不处理,程序也可以正常运行,说明调用的方法没有顺利执行完成而已,不影响后面的操作。

E_FAIL:是必须处理的返回值,否则程序出错,表示调用的方法出现错误,你需要处理错误。

S32 __video_stream_support_hdr_init(TP_STRM_ID_E strm_id, const TP_STREAM_ATTR_S *pAttr) { #ifdef FISHEYE_CORRECTION return __video_stream_support_hdr_init_for_fisheye(strm_id, pAttr); #endif #ifdef BINOCULOR_AVS return __video_stream_support_hdr_init_for_avs(strm_id, pAttr); #endif HD_RESULT ret; UINT32 framerate=1; /************************************************ Step3: init enc, bind & start proc *************************************************/ // bind video_record modules (main) if(strm_id == STRM_ID_MAIN){ /* HD_DIM ref_dim; ref_dim.w = VDO_SIZE_W; ref_dim.h = VDO_SIZE_H; ret = set_proc_param(g_video_avdc_stream[0][strm_id].proc_path_ref, strm_id, &ref_dim); if (ret != HD_OK) { MPP_ERROR("set proc fail=%d\n", ret); return -1; } */ /************************************************ 3dnr参考帧分辨率需与vcap out一致 *************************************************/ if(g_videocap_start == FALSE) { ret = set_hdr_cfg(pAttr->hdr); if (ret != HD_OK) { MPP_ERROR("set hdr cfg=%d\n", ret); return HD_ERR_NG; } // set videocap config ret = set_cap_cfg(&g_video_avdc_stream[0][0].cap_ctrl); if (ret != HD_OK) { MPP_ERROR("set cap-cfg fail=%d\n", ret); return HD_ERR_NG; } //open capture module ret = hd_videocap_open(HD_VIDEOCAP_0_IN_0, HD_VIDEOCAP_0_OUT_0, &g_video_avdc_stream[0][0].cap_path); if (ret != HD_OK) { MPP_ERROR("hd_videocap_open fail=%d\n", ret); return HD_ERR_NG; } // get videocap capability ret = get_cap_caps(g_video_avdc_stream[0][0].cap_ctrl, &g_video_avdc_stream[0][0].cap_syscaps); if (ret != HD_OK) { MPP_ERROR("get cap-caps fail=%d\n", ret); return HD_ERR_NG; } // set videocap parameter ret = set_cap_param(g_video_avdc_stream[0][0].cap_path, &g_video_avdc_stream[0][0].cap_dim, NULL); if (ret != HD_OK) { MPP_ERROR("set cap fail=%d\n", ret); return HD_ERR_NG; } // set videoproc config #ifdef AIISP_ENABLED if(VDO_SIZE_W != pAttr->strm_res.res_w && VDO_SIZE_H != pAttr->strm_res.res_h) { g_video_avdc_stream[0][0].proc_max_dim.w = pAttr->strm_res.res_w; g_video_avdc_stream[0][0].proc_max_dim.h = pAttr->strm_res.res_h; printf("1.main stream res changed w:%d, h:%d\r\n", g_video_avdc_stream[0][0].proc_max_dim.w, g_video_avdc_stream[0][0].proc_max_dim.h); } else { g_video_avdc_stream[0][0].proc_max_dim.w = VDO_SIZE_W; g_video_avdc_stream[0][0].proc_max_dim.h = VDO_SIZE_H; } #endif ret = set_proc_cfg(&g_video_avdc_stream[0][0].proc_ctrl, &g_video_avdc_stream[0][0].proc_max_dim); if (ret != HD_OK) { MPP_ERROR("set proc-cfg fail=%d\n", ret); return HD_ERR_NG; } } #ifdef AIISP_ENABLED aiisp_isp(get_hdr_cfg()); if(g_aiisp_init_stat == FALSE) { aiisp_init(); } #endif g_strm_param[0][strm_id].u32CapHeight = pAttr->strm_res.res_h; g_strm_param[0][strm_id].u32CapWidth = pAttr->strm_res.res_w; { // set videocap parameter HD_DIM crop_dim; #ifdef DUAL_SENSOR crop_dim.w = VDO_SIZE_W; crop_dim.h = VDO_SIZE_H; #else crop_dim.w = pAttr->strm_res.res_w; crop_dim.h = pAttr->strm_res.res_h; #endif ret = set_cap_param(g_video_avdc_stream[0][0].cap_path, &g_video_avdc_stream[0][0].cap_dim,&crop_dim); if (ret != HD_OK) { MPP_ERROR("set cap fail=%d\n", ret); return -1; } HD_VIDEOCAP_OUT video_out_param = {0}; hd_videocap_get(g_video_avdc_stream[0][0].cap_path, HD_VIDEOCAP_PARAM_OUT, &video_out_param); if(video_out_param.dim.w != 0 && video_out_param.dim.h != 0 && video_out_param.dim.w == VDO_SIZE_W && video_out_param.dim.h != VDO_SIZE_H) { HD_VIDEOCAP_CROP video_crop_param = {0}; video_crop_param.mode = HD_CROP_ON; video_crop_param.win.rect.x = 0; video_crop_param.win.rect.y = 0; video_crop_param.win.rect.w = video_out_param.dim.w; video_crop_param.win.rect.h = video_out_param.dim.h; video_crop_param.align.w = 4; video_crop_param.align.h = 4; hd_videocap_set(g_video_avdc_stream[0][0].cap_path, HD_VIDEOCAP_PARAM_IN_CROP, &video_crop_param); } else { HD_VIDEOCAP_CROP video_crop_param = {0}; video_crop_param.mode = HD_CROP_OFF; hd_videocap_set(g_video_avdc_stream[0][0].cap_path, HD_VIDEOCAP_PARAM_IN_CROP, &video_crop_param); } } ret = set_enc_param(g_video_avdc_stream[0][strm_id].enc_path, pAttr, &venc_para, &g_video_avdc_stream[0][strm_id].is_reconfig_enc_para, 0); if (ret != HD_OK) { MPP_ERROR("set enc fail=%d\n", ret); return -1; } #if defined(AIISP_ENABLED) || defined(SENSOR_RESOLUTION_12MP) || defined(MEDIA_PIPELINE_BASE_PTZ5425) g_video_avdc_stream[0][0].proc_max_dim.w = pAttr->strm_res.res_w; g_video_avdc_stream[0][0].proc_max_dim.h = pAttr->strm_res.res_h; #endif #ifdef AIISP_ENABLED ret = set_proc_cfg(&g_video_avdc_stream[0][0].proc_ctrl, &g_video_avdc_stream[0][0].proc_max_dim); if (ret != HD_OK) { MPP_ERROR("set proc-cfg fail=%d\n", ret); return HD_ERR_NG; } #endif // 为鱼眼机型时HD_VIDEOPROC_0_OUT_0是鱼眼矫正的输入,vprc0仅需这一个out即可。 ret = hd_videoproc_open(HD_VIDEOPROC_0_IN_0, HD_VIDEOPROC_0_OUT_0, &g_video_avdc_stream[0][strm_id].proc_path); if (ret != HD_OK) { MPP_ERROR("hd_videoproc_open fail=%d\n", ret); return -1; } #if defined(AIISP_ENABLED) || defined(SENSOR_RESOLUTION_12MP) || defined(MEDIA_PIPELINE_BASE_PTZ5425) #ifdef AIISP_ENABLED ret = set_proc_param(g_video_avdc_stream[0][strm_id].proc_path, strm_id, &g_video_avdc_stream[0][0].proc_max_dim); #else ret = set_proc_param(g_video_avdc_stream[0][strm_id].proc_path, strm_id, NULL); #endif if (ret != HD_OK) { MPP_ERROR("set proc fail=%d\n", ret); return -1; } if ((ret = hd_videoproc_open(HD_VIDEOPROC_0_IN_0, HD_VIDEOPROC_0_OUT_4, &g_video_avdc_stream[0][strm_id].proc_path_ref)) != HD_OK)// for 3DNR ref NOTE : HW limit, this path MUST same as sensor resolution return ret; ret = set_proc_param_ref(g_video_avdc_stream[0][strm_id].proc_path_ref, strm_id, &g_video_avdc_stream[0][0].proc_max_dim); if (ret != HD_OK) { MPP_ERROR("set proc fail=%d\n", ret); return -1; } #else ret = set_proc_param(g_video_avdc_stream[0][strm_id].proc_path, strm_id, NULL); if (ret != HD_OK) { MPP_ERROR("set proc fail=%d\n", ret); return -1; } #endif HD_VIDEOPROC_FUNC_CONFIG video_path_param = {0}; hd_videoproc_get(g_video_avdc_stream[0][strm_id].proc_path, HD_VIDEOPROC_PARAM_FUNC_CONFIG, &video_path_param); #if (defined SENSOR_RESOLUTION_8MP) || (defined SENSOR_RESOLUTION_12MP) || (defined MEDIA_PIPELINE_BASE_PTZ5425) video_path_param.out_func = 0; video_path_param.out_func |= HD_VIDEOPROC_OUTFUNC_TWOBUF; #endif video_path_param.out_order = 1; ret = hd_videoproc_set(g_video_avdc_stream[0][strm_id].proc_path, HD_VIDEOPROC_PARAM_FUNC_CONFIG, &video_path_param); if(g_videocap_start == FALSE) { ret = hd_videocap_bind(HD_VIDEOCAP_0_OUT_0, HD_VIDEOPROC_0_IN_0); if (ret != HD_OK) { MPP_ERROR("hd_videocap_bind fail=%d\n", ret); return -1; } } ret = hd_videoproc_bind(HD_VIDEOPROC_0_OUT_0, HD_VIDEOENC_0_IN_0); if (ret != HD_OK) { MPP_ERROR("STRM_ID_MAIN 0 bind fail=%d\n", ret); return -1; } /* 3dnr参考帧同一路就不用重复启动 ret = hd_videoproc_start(g_video_avdc_stream[0][strm_id].proc_path_ref); if (ret != HD_OK) { MPP_ERROR("hd_videoproc_start fail=%d\n", ret); return -1; } */ } // bind video_record modules (sub) else if(strm_id == STRM_ID_MINOR){ g_strm_param[0][strm_id].u32CapHeight = pAttr->strm_res.res_h; g_strm_param[0][strm_id].u32CapWidth = pAttr->strm_res.res_w; ret = set_enc_param(g_video_avdc_stream[0][strm_id].enc_path, pAttr, &sub_venc_para, &g_video_avdc_stream[0][strm_id].is_reconfig_enc_para, 0); if (ret != HD_OK) { MPP_ERROR("set enc fail=%d\n", ret); return -1; } ret = hd_videoproc_open(HD_VIDEOPROC_0_IN_0, HD_VIDEOPROC_0_OUT_1, &g_video_avdc_stream[0][strm_id].proc_path); if (ret != HD_OK) { MPP_ERROR("hd_videoproc_open fail=%d\n", ret); return -1; } ret = set_proc_param(g_video_avdc_stream[0][strm_id].proc_path, strm_id, NULL); if (ret != HD_OK) { MPP_ERROR("set proc fail=%d\n", ret); return -1; } HD_VIDEOPROC_FUNC_CONFIG video_path_param = {0}; video_path_param.out_func = 0; video_path_param.out_func |= HD_VIDEOPROC_OUTFUNC_TWOBUF; video_path_param.out_order = 0; ret = hd_videoproc_set(g_video_avdc_stream[0][strm_id].proc_path, HD_VIDEOPROC_PARAM_FUNC_CONFIG, &video_path_param); ret = hd_videoproc_bind(HD_VIDEOPROC_0_OUT_1, HD_VIDEOENC_0_IN_1); if (ret != HD_OK) { MPP_ERROR("STRM_ID_MINOR bind fail=%d\n", ret); return -1; } } else if(strm_id == STRM_ID_JPEG){ #ifdef DLA_REC_STREAM_SUPPORT if (g_face_enabled || g_people_enabled || g_vehicle_enabled || g_head_detection_enabled) { HD_DIM jpeg_dim; jpeg_dim.w = pAttr->strm_res.res_w; jpeg_dim.h = pAttr->strm_res.res_h; framerate = pAttr->framerate.low / pAttr->framerate.high; // JPEG打开vprc扩展通道9 ret = hd_videoproc_open(HD_VIDEOPROC_0_IN_0, HD_VIDEOPROC_0_OUT_9, &g_video_avdc_stream[0][strm_id].proc_path); if (ret != HD_OK) { MPP_ERROR("hd_videoproc_open fail=%d\n", ret); return -1; } // 设置venc参数 ret = set_enc_param(g_video_avdc_stream[0][strm_id].enc_path, pAttr, NULL, &g_video_avdc_stream[0][strm_id].is_reconfig_enc_para, 0); if (ret != HD_OK) { MPP_ERROR("set venc fail=%d\n", ret); return -1; } /* 修改venc in帧率 */ HD_VIDEOENC_IN video_in_param = {0}; ret = hd_videoenc_get(g_video_avdc_stream[0][strm_id].enc_path, HD_VIDEOENC_PARAM_IN, &video_in_param); if (ret != HD_OK) { MPP_ERROR("hd_videoenc_get fail=%d\n", ret); return -1; } video_in_param.frc = HD_VIDEO_FRC_RATIO(framerate,framerate); ret = hd_videoenc_set(g_video_avdc_stream[0][strm_id].enc_path, HD_VIDEOENC_PARAM_IN, &video_in_param); if (ret != HD_OK) { MPP_ERROR("hd_videoenc_set fail=%d\n", ret); return -1; } // 将JPEG的扩展通道接入到物理通道2---DLA_REC通道 ret = set_proc_param_extend(g_video_avdc_stream[0][strm_id].proc_path, HD_VIDEOPROC_0_OUT_2, NULL, &jpeg_dim, HD_VIDEO_DIR_NONE, framerate); if (ret != HD_OK) { MPP_ERROR("set enc fail=%d\n", ret); return -1; } // 修改vprc out帧率 HD_VIDEOPROC_OUT_EX video_out_param = {0}; ret = hd_videoproc_get(g_video_avdc_stream[0][strm_id].proc_path, HD_VIDEOPROC_PARAM_OUT_EX, &video_out_param); video_out_param.frc = HD_VIDEO_FRC_RATIO(framerate, DLA_REC_FRAMERATE); ret = hd_videoproc_set(g_video_avdc_stream[0][strm_id].proc_path, HD_VIDEOPROC_PARAM_OUT_EX, &video_out_param); // vprc通道9绑定到venc通道2 ret = hd_videoproc_bind(HD_VIDEOPROC_0_OUT_9, HD_VIDEOENC_0_IN_2); if (ret != HD_OK) { MPP_ERROR("STRM_ID_JPEG bind fail=%d\n", ret); return -1; } } else { ret = set_enc_param(g_video_avdc_stream[0][strm_id].enc_path, pAttr, NULL, &g_video_avdc_stream[0][strm_id].is_reconfig_enc_para, 0); if (ret != HD_OK) { MPP_ERROR("set enc fail=%d\n", ret); return -1; } /* 修改venc in帧率 */ framerate = pAttr->framerate.low / pAttr->framerate.high; HD_VIDEOENC_IN video_in_param = {0}; ret = hd_videoenc_get(g_video_avdc_stream[0][strm_id].enc_path, HD_VIDEOENC_PARAM_IN, &video_in_param); if (ret != HD_OK) { MPP_ERROR("hd_videoenc_get fail=%d\n", ret); return -1; } video_in_param.frc = HD_VIDEO_FRC_RATIO(framerate, framerate); ret = hd_videoenc_set(g_video_avdc_stream[0][strm_id].enc_path, HD_VIDEOENC_PARAM_IN, &video_in_param); if (ret != HD_OK) { MPP_ERROR("hd_videoenc_set fail=%d\n", ret); return -1; } ret = hd_videoproc_open(HD_VIDEOPROC_0_IN_0, HD_VIDEOPROC_0_OUT_2, &g_video_avdc_stream[0][strm_id].proc_path); if (ret != HD_OK) { MPP_ERROR("hd_videoproc_open fail=%d\n", ret); return -1; } // 将JPEG接入到物理通道 ret = set_proc_param(g_video_avdc_stream[0][strm_id].proc_path, strm_id, NULL); if (ret != HD_OK) { MPP_ERROR("set proc fail=%d\n", ret); return -1; } // 修改vprc out帧率 ret = set_proc_param_framerate(g_video_avdc_stream[0][strm_id].proc_path, framerate); ret = hd_videoproc_bind(HD_VIDEOPROC_0_OUT_2, HD_VIDEOENC_0_IN_2); if (ret != HD_OK) { MPP_ERROR("STRM_ID_JPEG bind fail=%d\n", ret); return -1; } } #else ret = set_enc_param(g_video_avdc_stream[0][strm_id].enc_path, pAttr, NULL, &g_video_avdc_stream[0][strm_id].is_reconfig_enc_para, 0); if (ret != HD_OK) { MPP_ERROR("set enc fail=%d\n", ret); return -1; } /* 修改venc in帧率 */ framerate=pAttr->framerate.low / pAttr->framerate.high; HD_VIDEOENC_IN video_in_param = {0}; ret = hd_videoenc_get(g_video_avdc_stream[0][strm_id].enc_path, HD_VIDEOENC_PARAM_IN, &video_in_param); if (ret != HD_OK) { MPP_ERROR("hd_videoenc_get fail=%d\n", ret); return -1; } video_in_param.frc = HD_VIDEO_FRC_RATIO(framerate, framerate); ret = hd_videoenc_set(g_video_avdc_stream[0][strm_id].enc_path, HD_VIDEOENC_PARAM_IN, &video_in_param); if (ret != HD_OK) { MPP_ERROR("hd_videoenc_set fail=%d\n", ret); return -1; } ret = hd_videoproc_open(HD_VIDEOPROC_0_IN_0, HD_VIDEOPROC_0_OUT_2, &g_video_avdc_stream[0][strm_id].proc_path); if (ret != HD_OK) { MPP_ERROR("hd_videoproc_open fail=%d\n", ret); return -1; } // 将JPEG接入到物理通道 ret = set_proc_param(g_video_avdc_stream[0][strm_id].proc_path, strm_id, NULL); if (ret != HD_OK) { MPP_ERROR("set proc fail=%d\n", ret); return -1; } // 修改vprc out帧率 ret = set_proc_param_framerate(g_video_avdc_stream[0][strm_id].proc_path, framerate); ret = hd_videoproc_bind(HD_VIDEOPROC_0_OUT_2, HD_VIDEOENC_0_IN_2); if (ret != HD_OK) { MPP_ERROR("STRM_ID_JPEG bind fail=%d\n", ret); return -1; } #endif } else if(strm_id == STRM_ID_ISP) { ret = hd_videoproc_open(HD_VIDEOPROC_0_IN_0, HD_VIDEOPROC_0_OUT_5, &g_video_avdc_stream[0][strm_id].proc_path); if (ret != HD_OK) { MPP_ERROR("hd_videoproc_open fail=%d\n", ret); return -1; } HD_DIM isp_dim; isp_dim.w = ISP_FRAME_WIDTH; isp_dim.h = ISP_FRAME_HEIGHT; framerate=pAttr->framerate.low / pAttr->framerate.high; ret = set_proc_param_extend(g_video_avdc_stream[0][strm_id].proc_path,HD_VIDEOPROC_0_OUT_1, NULL, &isp_dim, HD_VIDEO_DIR_NONE,framerate); if (ret != HD_OK) { MPP_ERROR("set proc fail=%d\n", ret); return -1; } } else if(strm_id == STRM_ID_DLA){ if ((0 != g_video_attr[STRM_ID_DLA].strm_res.res_w) && (0 != g_video_attr[STRM_ID_DLA].strm_res.res_h) && (0 != pAttr->framerate.high)) { if (g_is_dla_hd_videoproc_open != TRUE) { ret = hd_videoproc_open(HD_VIDEOPROC_0_IN_0, HD_VIDEOPROC_0_OUT_6, &g_video_avdc_stream[0][strm_id].proc_path); if (ret != HD_OK) { MPP_ERROR("hd_videoproc_open fail=%d\n", ret); return -1; } } MPP_ERROR("DLA_DET width max: %d",DLA_FRAME_WIDTH); MPP_ERROR("DLA_DET height max: %d",DLA_FRAME_HEIGHT); MPP_ERROR("(pAttr + DLA_DET)->strm_res.res_w:%d", g_video_attr[STRM_ID_DLA].strm_res.res_w); MPP_ERROR("(pAttr + DLA_DET)->strm_res.res_h:%d", g_video_attr[STRM_ID_DLA].strm_res.res_h); MPP_ERROR("(pAttr + DLA_DET)->framerate.low:%d", g_video_attr[STRM_ID_DLA].framerate.low); MPP_ERROR("(pAttr + DLA_DET)->framerate.high:%d", g_video_attr[STRM_ID_DLA].framerate.high); if(g_video_attr[STRM_ID_DLA].strm_res.res_w > DLA_FRAME_WIDTH || g_video_attr[STRM_ID_DLA].strm_res.res_h > DLA_FRAME_HEIGHT) { MPP_ERROR("DLA_DET resolution out of range"); return -1; } HD_DIM dla_dim; dla_dim.w = g_video_attr[STRM_ID_DLA].strm_res.res_w; dla_dim.h = g_video_attr[STRM_ID_DLA].strm_res.res_h; framerate = pAttr->framerate.low / pAttr->framerate.high; ret = set_proc_param_extend(g_video_avdc_stream[0][strm_id].proc_path, HD_VIDEOPROC_0_OUT_1, NULL, &dla_dim, HD_VIDEO_DIR_NONE, framerate); if (ret != HD_OK) { MPP_ERROR("set proc fail=%d\n", ret); return -1; } } #ifdef DLA_REC_STREAM_SUPPORT if (g_face_enabled || g_people_enabled || g_vehicle_enabled || g_head_detection_enabled) { if (g_is_dla_hd_videoproc_open != TRUE) { ret = hd_videoproc_open(HD_VIDEOPROC_0_IN_0, HD_VIDEOPROC_0_OUT_2, &g_video_avdc_stream[0][STRM_ID_DLA_REC].proc_path); if (ret != HD_OK) { MPP_ERROR("hd_videoproc_open fail=%d\n", ret); return -1; } g_is_dla_hd_videoproc_open = TRUE; } if ((0 == g_video_attr[STRM_ID_DLA_REC].strm_res.res_w) || (0 == g_video_attr[STRM_ID_DLA_REC].strm_res.res_h) || (DLA_REC_FRAME_WIDTH < g_video_attr[STRM_ID_DLA_REC].strm_res.res_w) || (DLA_REC_FRAME_HEIGHT < g_video_attr[STRM_ID_DLA_REC].strm_res.res_h)) { g_strm_dla_rec_enabled = FALSE; } else { g_strm_dla_rec_enabled = TRUE; } MPP_ERROR("g_strm_dla_rec_enabled:%d", g_strm_dla_rec_enabled); MPP_ERROR("(pAttr + DLA_REC)->strm_res.res_w:%d", g_video_attr[STRM_ID_DLA_REC].strm_res.res_w); MPP_ERROR("(pAttr + DLA_REC)->strm_res.res_h:%d", g_video_attr[STRM_ID_DLA_REC].strm_res.res_h); MPP_ERROR("(pAttr + DLA_REC)->framerate.low:%d", g_video_attr[STRM_ID_DLA_REC].framerate.low); MPP_ERROR("(pAttr + DLA_REC)->framerate.high:%d", g_video_attr[STRM_ID_DLA_REC].framerate.high); if (g_strm_dla_rec_enabled == TRUE) { HD_DIM dla_rec_dim; dla_rec_dim.w = g_video_attr[STRM_ID_DLA_REC].strm_res.res_w; dla_rec_dim.h = g_video_attr[STRM_ID_DLA_REC].strm_res.res_h; framerate = g_video_attr[STRM_ID_DLA_REC].framerate.low / g_video_attr[STRM_ID_DLA_REC].framerate.high; // 扩展通道接入到副码流vprc // ret = set_proc_param_extend(g_video_avdc_stream[0][STRM_ID_DLA_REC].proc_path,HD_VIDEOPROC_0_OUT_1 , NULL, &dla_rec_dim, HD_VIDEO_DIR_NONE,framerate); // 设置物理通道参数 ret = set_proc_param(g_video_avdc_stream[0][STRM_ID_DLA_REC].proc_path, strm_id, &dla_rec_dim); if (ret != HD_OK) { MPP_ERROR("set proc fail=%d\n", ret); return -1; } // 修改vprc out帧率 ret = set_proc_param_framerate(g_video_avdc_stream[0][STRM_ID_DLA_REC].proc_path, framerate); if (ret != HD_OK) { MPP_ERROR("set proc fail=%d\n", ret); return -1; } } } #endif } memcpy(&g_strm_param[0][strm_id].roi_info, &pAttr->roi_info, sizeof(TP_STREAM_ROI_S)); #ifdef AIISP_ENABLED ret = hd_videocap_start(g_video_avdc_stream[0][0].cap_path); if (ret != HD_OK) { MPP_ERROR("hd_videocap_start fail=%d\n", ret); return -1; } g_videocap_start = TRUE; #endif ret = hd_videoproc_start(g_video_avdc_stream[0][strm_id].proc_path);//direct模式vproc要比vcap早 if (ret != HD_OK && strm_id != STRM_ID_DLA) { MPP_ERROR("hd_videoproc_start fail=%d\n", ret); return -1; } #if defined(AIISP_ENABLED) || defined(SENSOR_RESOLUTION_12MP) || defined(MEDIA_PIPELINE_BASE_PTZ5425) if(strm_id == STRM_ID_MAIN) { ret = hd_videoproc_start(g_video_avdc_stream[0][strm_id].proc_path_ref); if (ret != HD_OK) { MPP_ERROR("hd_videoproc_start fail=%d\n", ret); return -1; } } #endif #ifdef DLA_REC_STREAM_SUPPORT if(g_strm_dla_rec_enabled == TRUE && strm_id == STRM_ID_DLA) { ret = hd_videoproc_start(g_video_avdc_stream[0][STRM_ID_DLA_REC].proc_path); if (ret != HD_OK) { MPP_ERROR("hd_videoproc_start fail=%d\n", ret); return -1; } g_strm_param[0][STRM_ID_DLA_REC].video_stream_inited = TRUE; MPP_ERROR("video stream STRM_ID_DLA_REC init finish"); // 由于JPEG vprc接入到 DLA_REC vprc的扩展通道,重启JPEG vprc ret = hd_videoproc_stop(g_video_avdc_stream[0][STRM_ID_JPEG].proc_path); if (ret != HD_OK) { MPP_ERROR("hd_videoproc_stop fail=%d\n", ret); return -1; } ret = hd_videoproc_start(g_video_avdc_stream[0][STRM_ID_JPEG].proc_path); if (ret != HD_OK) { MPP_ERROR("hd_videoproc_stop fail=%d\n", ret); return -1; } } #endif if(strm_id == STRM_ID_MAIN){ if (g_c_gain.gain[0] != 0 && g_c_gain.gain[1] != 0 && g_c_gain.gain[2] != 0) { vendor_isp_set_common(ISPT_ITEM_C_GAIN, &g_c_gain); if (get_hdr_cfg() == TP_VIDEO_HDR_ON) { g_c_gain.id = 1; vendor_isp_set_common(ISPT_ITEM_C_GAIN, &g_c_gain); } } #ifdef AIISP_ENABLED if(g_aiisp_init_stat == FALSE) { aiisp_open(g_video_avdc_stream[0][0].proc_ctrl); aiisp_start(); } else { aiisp_update_param_name(get_hdr_cfg()); } #endif #ifndef AIISP_ENABLED ret = hd_videocap_start(g_video_avdc_stream[0][0].cap_path); if (ret != HD_OK) { MPP_ERROR("hd_videocap_start fail=%d\n", ret); return -1; } g_videocap_start = TRUE; #endif ret = set_cap_fps(g_video_avdc_stream[0][0].cap_ctrl); if (ret != HD_OK) { MPP_ERROR("set cap fps fail=%d\n", ret); return -1; } if(g_cur_sensor_id == 1) { ret = hd_videocap_stop(g_video_avdc_stream[0][0].cap_path); if (ret != HD_OK) { MPP_ERROR("hd_videocap_stop fail=%d\n", ret); return -1; } } } g_strm_param[0][strm_id].video_stream_inited = TRUE; MPP_DEBUG("video stream [%d] init finish",strm_id); return OK; } #endif 这是单目的pipeline 其中关于ai isp的关键步骤是 #ifdef AIISP_ENABLED if(VDO_SIZE_W != pAttr->strm_res.res_w && VDO_SIZE_H != pAttr->strm_res.res_h) { g_video_avdc_stream[0][0].proc_max_dim.w = pAttr->strm_res.res_w; g_video_avdc_stream[0][0].proc_max_dim.h = pAttr->strm_res.res_h; printf("1.main stream res changed w:%d, h:%d\r\n", g_video_avdc_stream[0][0].proc_max_dim.w, g_video_avdc_stream[0][0].proc_max_dim.h); } else { g_video_avdc_stream[0][0].proc_max_dim.w = VDO_SIZE_W; g_video_avdc_stream[0][0].proc_max_dim.h = VDO_SIZE_H; } #endif #ifdef AIISP_ENABLED aiisp_isp(get_hdr_cfg()); if(g_aiisp_init_stat == FALSE) { aiisp_init(); } #endif #if defined(AIISP_ENABLED) || defined(SENSOR_RESOLUTION_12MP) || defined(MEDIA_PIPELINE_BASE_PTZ5425) g_video_avdc_stream[0][0].proc_max_dim.w = pAttr->strm_res.res_w; g_video_avdc_stream[0][0].proc_max_dim.h = pAttr->strm_res.res_h; #endif #ifdef AIISP_ENABLED ret = set_proc_cfg(&g_video_avdc_stream[0][0].proc_ctrl, &g_video_avdc_stream[0][0].proc_max_dim); if (ret != HD_OK) { MPP_ERROR("set proc-cfg fail=%d\n", ret); return HD_ERR_NG; } #endif #if defined(AIISP_ENABLED) || defined(SENSOR_RESOLUTION_12MP) || defined(MEDIA_PIPELINE_BASE_PTZ5425) #ifdef AIISP_ENABLED ret = set_proc_param(g_video_avdc_stream[0][strm_id].proc_path, strm_id, &g_video_avdc_stream[0][0].proc_max_dim); #else ret = set_proc_param(g_video_avdc_stream[0][strm_id].proc_path, strm_id, NULL); #endif #ifdef AIISP_ENABLED ret = hd_videocap_start(g_video_avdc_stream[0][0].cap_path); if (ret != HD_OK) { MPP_ERROR("hd_videocap_start fail=%d\n", ret); return -1; } g_videocap_start = TRUE; #endif #if defined(AIISP_ENABLED) || defined(SENSOR_RESOLUTION_12MP) || defined(MEDIA_PIPELINE_BASE_PTZ5425) if(strm_id == STRM_ID_MAIN) { ret = hd_videoproc_start(g_video_avdc_stream[0][strm_id].proc_path_ref); if (ret != HD_OK) { MPP_ERROR("hd_videoproc_start fail=%d\n", ret); return -1; } } #endif #ifdef AIISP_ENABLED if(g_aiisp_init_stat == FALSE) { aiisp_open(g_video_avdc_stream[0][0].proc_ctrl); aiisp_start(); } else { aiisp_update_param_name(get_hdr_cfg()); } #endif #ifndef AIISP_ENABLED ret = hd_videocap_start(g_video_avdc_stream[0][0].cap_path); if (ret != HD_OK) { MPP_ERROR("hd_videocap_start fail=%d\n", ret); return -1; } g_videocap_start = TRUE; #endif 请你分析一下这些关键步骤在整个pipeline的流程中的位置,以及关键点
09-24
/* * Copyright (c) Huawei Technologies Co., Ltd. 2022-2025. All rights reserved. * Description: 掉电记忆相关功能 * Create: 2022-04-27 */ #include <stdio.h> #include <string.h> #include <unistd.h> #include "securec.h" #include "scene_panel_svc_defs.h" #include "common_define.h" #include "sys_log.h" #include "error_code.h" #include "assert_check.h" #include "os_adapter.h" #include "poweroff_memory.h" #define FIELDNUM_MIN 4 #define FIELDNUM_MAX 5 #define SWITCH_MAP_LEN 3 static AttrInfo *g_loadedAttrs = NULL; static unsigned short g_regAttrsNum = 0; AttrInfo *GetLoadCtx(void) { return g_loadedAttrs; } static int GetOneAttrInfo(AttrInfo *attrInfo) { CHECK_POINTER_RETURN(attrInfo, RET_INVALID_PARAM); const Tlv *tlv = ModelGetCharVal(attrInfo->svcId, attrInfo->attr); CHECK_POINTER_RETURN(tlv, RET_ERROR); attrInfo->type = tlv->type; attrInfo->len = tlv->len; if (memcpy_s(attrInfo->value, sizeof(attrInfo->value), tlv->val, tlv->len) != EOK) { return RET_ERROR; } return RET_OK; } static int PutOneAttrInfo(const AttrInfo *attrInfo) { CHECK_POINTER_RETURN(attrInfo, RET_INVALID_PARAM); CharKeyVal *kv = (CharKeyVal *)attrInfo; return ModelPutCharVal(kv->key.svcId, kv->key.attr, &kv->tlv); } static unsigned short PutAttrsInfo(const AttrInfo *attrInfo, unsigned short num, BOOL report, BOOL rollBack) { CHECK_POINTER_RETURN(attrInfo, 0); CHECK_RETURN(num > 0, 0); unsigned short count = 0; for (unsigned short i = 0; i < num; i++) { if (PutOneAttrInfo(attrInfo + i) == RET_OK) { count++; continue; } CharKeyVal *kv = (CharKeyVal *)&attrInfo[i]; CharKvShow(kv->key.svcId, kv->key.attr, &kv->tlv); } if (count != num) { SYS_LOG_E("put num[%u] result[%u]", num, count); } return count; } unsigned short Dev_PutAttrsInfo(const AttrInfo *attrInfo, unsigned short num, unsigned char needReport, BOOL rollBack) { CHECK_POINTER_RETURN(attrInfo, 0); CHECK_RETURN(num > 0, 0); CHECK_RETURN(num <= MEMORY_MAX_ATTR_NUM, 0); SYS_LOG_I("svcId:%s attr:%s type:%u len:%u num:%u report:%u", attrInfo->svcId, attrInfo->attr, attrInfo->type, attrInfo->len, num, needReport); int err = ModelLock(); CHECK_RETURN(err == RET_OK, 0); unsigned short count = PutAttrsInfo(attrInfo, num, (needReport > 0), rollBack); SYS_LOG_I("PutAttrsInfo count:%u", count); ModelSelectProfile(0); err = ModelUnlock(); CHECK_RETURN(err == RET_OK, 0); return count; } unsigned short GetAttrsNum(void) { unsigned short num = ModelCharsNum(); SYS_LOG_D("num:%u", num); return num; } static int SaveAllAttrsToFile(const AttrInfo *attrs, unsigned int num) { CHECK_POINTER_RETURN(attrs, RET_ERROR); FILE *fp = NULL; fp = fopen(SAVEATTRS_FILE, "w"); if (fp == NULL) { SYS_LOG_E("open attrs file fail"); return RET_ERROR; } int ret; for (unsigned int i = 0; i < num; i++) { char ctx[CHARS_LEN] = { 0 }; ret = snprintf_s(ctx, sizeof(ctx), sizeof(ctx) - 1, "%s,%s,%u,%u,%s\n", attrs[i].svcId, attrs[i].attr, attrs[i].type, attrs[i].len, attrs[i].value); if (ret <= 0) { ret = fclose(fp); CHECK_RETURN(ret == RET_OK, RET_ERROR); SYS_LOG_E("snprintf error."); return RET_ERROR; } unsigned int size = fwrite(ctx, 1, strlen(ctx), fp); if (size == 0) { ret = fclose(fp); CHECK_RETURN(ret == RET_OK, RET_ERROR); SYS_LOG_E("fwrite failed!, size: %d", size); return RET_ERROR; } } ret = fclose(fp); if (ret != RET_OK) { SYS_LOG_E("attrs file close failed"); return RET_ERROR; } return RET_OK; } static unsigned int GetFileAttrsNum(FILE *fp) { unsigned int fileAttrsNum = 0; for (int i = 0; i < MEMORY_MAX_ATTR_NUM; i++) { char ctx[CHARS_LEN] = { 0 }; if (fgets(ctx, sizeof(ctx), fp) == NULL) { break; } fileAttrsNum++; } return fileAttrsNum; } static void FillAttrValue(AttrInfo *attr, char type, char *value) { int valueInt = 0; BOOL isNeedConvert = FALSE; if ((value != NULL) && (type == TLV_TYPE_INT)) { if (strcmp(attr->svcId, "switchMap") == 0) { if (memcpy_s(attr->value, sizeof(attr->value), value, sizeof(char) * SWITCH_MAP_LEN) != EOK) { SYS_LOG_E("memcpy failed!"); } return; } else { valueInt = (int)(*value); isNeedConvert = TRUE; } } if ((value != NULL) && ((type == TLV_TYPE_ENUM) || (type == TLV_TYPE_BOOL))) { valueInt = (int)(*value); /* 当读出 BOOL和枚举类型的值为\n时,设置value值为0(默认值) */ if (*value == '\n') { valueInt = 0; } isNeedConvert = TRUE; } if (isNeedConvert) { attr->value[0] = (unsigned char)valueInt; } else { int ret = strncpy_s((char *)attr->value, CHAR_LEN, value, strlen(value)); if (ret != EOK) { SYS_LOG_E("strncpy_s failed ret:%d", ret); return; } } return; } static int SaveTypeAndLen(AttrInfo *attrs, const char *type, const char *len) { char *endPtr = NULL; long tmpType = strtol(type, &endPtr, 10); // 10进制 CHECK_RETURN((tmpType >= 0) && (tmpType <= 0xFFFF), RET_ERROR); // 0xFFFF为unsigned short最大值 attrs->type = tmpType; endPtr = NULL; long tmpLen = strtol(len, &endPtr, 10); // 10进制 CHECK_RETURN((tmpLen >= 0) && (tmpLen <= 0xFFFF), RET_ERROR); // 0xFFFF为unsigned short最大值 attrs->len = tmpLen; return RET_OK; } static unsigned int FillAttrInfoFromFile(FILE *fp, AttrInfo *attrs, unsigned int attrsNum) { unsigned int fileAttrsNum = GetFileAttrsNum(fp); if (fseek(fp, 0, SEEK_SET) != 0) { return 0; } unsigned int loadAttrsNum = 0; char *context = NULL; for (unsigned int i = 0; i < fileAttrsNum; i++) { char line[CHARS_LEN] = { 0 }; if (fgets(line, sizeof(line), fp) == NULL) { break; } char *fieldPtrs[FIELDNUM_MAX] = { 0 }; int fieldNum = 0; char *tok = strtok_s(line, ",", &context); while ((tok != NULL) && (fieldNum < FIELDNUM_MAX)) { fieldPtrs[fieldNum++] = tok; tok = strtok_s(NULL, ",", &context); } if ((fieldNum < FIELDNUM_MIN) || (fieldNum > FIELDNUM_MAX)) { SYS_LOG_I("Invalid number of fields: %d", fieldNum); continue; } int k = 0; char *svcId = fieldPtrs[k++]; char *attr = fieldPtrs[k++]; char *type = fieldPtrs[k++]; char *len = fieldPtrs[k++]; char *value = ((fieldNum == FIELDNUM_MAX) ? fieldPtrs[k] : NULL); SYS_LOG_D("svcId = %s, attr = %s, len = %s, type = %s,", svcId, attr, len, type); for (unsigned int j = 0; j < attrsNum; j++) { if ((strlen(attrs[j].svcId) != strlen(svcId)) || (strlen(attrs[j].attr) != strlen(attr)) || (strncmp(attrs[j].svcId, svcId, strlen(svcId)) != RET_OK) || (strncmp(attrs[j].attr, attr, strlen(attr)) != RET_OK)) { continue; } if (SaveTypeAndLen(&attrs[j], type, len) != RET_OK) { continue; } FillAttrValue(&(attrs[j]), attrs[j].type, value); loadAttrsNum++; break; } } return loadAttrsNum; } int LoadAttrsFromFile(AttrInfo *attrs, unsigned int attrsNum) { CHECK_POINTER_RETURN(attrs, RET_INVALID_PARAM); FILE *fp = NULL; fp = fopen(SAVEATTRS_FILE, "r"); if (fp == NULL) { SYS_LOG_E("open attrs file fail"); return RET_ERROR; } unsigned int loadAttrsNum = FillAttrInfoFromFile(fp, attrs, attrsNum); int ret = fclose(fp); if (ret != RET_OK) { SYS_LOG_E("attrs file close failed"); return RET_ERROR; } fp = NULL; if (loadAttrsNum == 0) { SYS_LOG_E("loadAttrsNum is 0"); return RET_ERROR; } if (attrsNum != loadAttrsNum) { SYS_LOG_E("some attrs load failed!"); } ret = PutAttrsToProfile(FALSE); CHECK_RETURN(ret == RET_OK, ret); return RET_OK; } int RegisterNeedSaveAttrs(AttrInfo *attrs, unsigned short num) { CHECK_POINTER_RETURN(attrs, RET_INVALID_PARAM); CHECK_POINTER_RETURN(attrs->svcId, RET_INVALID_PARAM); CHECK_POINTER_RETURN(attrs->attr, RET_INVALID_PARAM); CHECK_POINTER_RETURN(g_loadedAttrs, RET_ERROR); if (g_regAttrsNum >= MEMORY_MAX_ATTR_NUM) { return RET_ERROR; } int ret = strncpy_s(g_loadedAttrs[g_regAttrsNum].svcId, CHAR_LEN, attrs->svcId, strlen(attrs->svcId)); CHECK_RETURN(ret == RET_OK, ret); ret = strncpy_s(g_loadedAttrs[g_regAttrsNum].attr, CHAR_LEN, attrs->attr, strlen(attrs->attr)); CHECK_RETURN(ret == RET_OK, ret); g_regAttrsNum++; return RET_OK; } static void FreeLoadedAttrs(void) { for (int i = 0; i < MEMORY_MAX_ATTR_NUM; i++) { OS_Free(g_loadedAttrs[i].svcId); g_loadedAttrs[i].svcId = NULL; OS_Free(g_loadedAttrs[i].attr); g_loadedAttrs[i].attr = NULL; } OS_Free(g_loadedAttrs); g_loadedAttrs = NULL; } static int InitLoadedAttrs(void) { if (g_loadedAttrs != NULL) { return RET_ERROR; } unsigned short len = MEMORY_MAX_ATTR_NUM * sizeof(AttrInfo); g_loadedAttrs = (AttrInfo *)OS_Malloc(len); if (g_loadedAttrs == NULL) { SYS_LOG_E("g_loadedAttrs OS_Malloc failed!"); return RET_MALLOC_ERROR; } (void)memset_s(g_loadedAttrs, len, 0, len); len = CHAR_LEN; for (int i = 0; i < MEMORY_MAX_ATTR_NUM; i++) { g_loadedAttrs[i].svcId = (char *)OS_Malloc(len); if (g_loadedAttrs[i].svcId == NULL) { FreeLoadedAttrs(); SYS_LOG_E("svcId OS_Malloc failed!"); return RET_MALLOC_ERROR; } (void)memset_s(g_loadedAttrs[i].svcId, len, 0, len); g_loadedAttrs[i].attr = (char *)OS_Malloc(len); if (g_loadedAttrs[i].attr == NULL) { FreeLoadedAttrs(); SYS_LOG_E("attr OS_Malloc failed!"); return RET_MALLOC_ERROR; } (void)memset_s(g_loadedAttrs[i].attr, len, 0, len); } return RET_OK; } /* 通过注册过需要存储的掉电记忆svcId以及attr去获取tlv */ static int GetAllMemoryServices(void) { if (g_loadedAttrs == NULL) { return RET_ERROR; } int ret; FILE *fp = NULL; fp = fopen(SAVEATTRS_FILE, "r"); if (fp == NULL) { SYS_LOG_D("file %s not exit", SAVEATTRS_FILE); /* 第一次上电文件不存在 */ ret = ModelLock(); CHECK_RETURN(ret == RET_OK, RET_ERROR); for (unsigned short i = 0; i < g_regAttrsNum; i++) { ret = GetOneAttrInfo(&g_loadedAttrs[i]); if (ret != RET_OK) { ret = ModelUnlock(); CHECK_RETURN(ret == RET_OK, RET_ERROR); SYS_LOG_E("GetOneAttrInfo failed!"); return RET_ERROR; } } ret = ModelUnlock(); CHECK_RETURN(ret == RET_OK, RET_ERROR); return RET_OK; } SYS_LOG_D("file %s exists, close it", SAVEATTRS_FILE); ret = fclose(fp); if (ret != RET_OK) { SYS_LOG_E("file attrs close failed:%d", ret); return RET_ERROR; } return RET_OK; } static BOOL IsAttrRegistered(const char *svcId, const char *attr, const AttrInfo *array, unsigned short num) { unsigned short i; for (i = 0; i < num; ++i) { if ((strcmp(array[i].svcId, svcId) == RET_OK) && (strcmp(array[i].attr, attr) == RET_OK)) { return TRUE; } } return FALSE; } static int GetAttrIndex(const AttrInfo *attrs, const AttrInfo *array, unsigned short num, unsigned short *index) { CHECK_POINTER_RETURN(attrs, RET_INVALID_PARAM); CHECK_POINTER_RETURN(array, RET_INVALID_PARAM); CHECK_POINTER_RETURN(index, RET_INVALID_PARAM); unsigned short i; for (i = 0; i < num; ++i) { if ((strcmp(array[i].svcId, attrs->svcId) == 0) && (strcmp(array[i].attr, attrs->attr) == 0)) { *index = i; return RET_OK; } } return RET_ERROR; } int VisitorPowerOffMemory(const Svc *profSvc, const Char *profChar, BOOL *goOn, void *param) { CHECK_POINTER_RETURN(profSvc, RET_INVALID_PARAM); CHECK_POINTER_RETURN(profChar, RET_INVALID_PARAM); CHECK_POINTER_RETURN(goOn, RET_INVALID_PARAM); (void)param; *goOn = TRUE; AttrInfo attrInfo = { 0 }; switch (profChar->saveMode) { case CHAR_SAVE_MODE_NONE: return RET_OK; case CHAR_SAVE_MODE_SYNC: CHECK_POINTER_RETURN(profSvc->svcId, RET_INVALID_PARAM); CHECK_POINTER_RETURN(profChar->attr, RET_INVALID_PARAM); attrInfo.svcId = profSvc->svcId; attrInfo.attr = profChar->attr; /* 注册需要保存的掉电记忆svcId */ return RegisterNeedSaveAttrs(&attrInfo, 1); case CHAR_SAVE_MODE_DELAY: return RET_OK; default: return RET_OK; } } int PowerOffMemoryInit(void) { /* 分配内存 */ int ret = InitLoadedAttrs(); if (ret != RET_OK) { SYS_LOG_E("loaded attrs init ret[%d]", ret); } ret = ModelVisit(VisitorPowerOffMemory, NULL); if (ret != RET_OK) { SYS_LOG_E("regist poweroff memory failed !"); } ret = GetAllMemoryServices(); if (ret != RET_OK) { SYS_LOG_E("GetAllMemoryServices failed !"); } /* 第一次上电文件不存在这里会返回ERROR */ ret = LoadAttrsFromFile(GetLoadCtx(), g_regAttrsNum); if (ret != RET_OK) { SYS_LOG_E("load attrs form file failed, ret = %d", ret); } SetUpgradeRebootFlag(FALSE); return RET_OK; } int PutAttrsToProfile(BOOL rollBack) { if (g_loadedAttrs == NULL) { return RET_INVALID_PARAM; } unsigned short index; for (index = 0; index < g_regAttrsNum; ++index) { if ((g_loadedAttrs[index].svcId == NULL) || (g_loadedAttrs[index].attr == NULL)) { SYS_LOG_E("svcId or attr is null"); FreeLoadedAttrs(); return RET_INVALID_PARAM; } } unsigned short successNum = Dev_PutAttrsInfo(g_loadedAttrs, g_regAttrsNum, 0, rollBack); SYS_LOG_I("power-off memory load attrs [%u] success [%u]", g_regAttrsNum, successNum); return RET_OK; } int ReportAttrSync(AttrInfo *attrs) { CHECK_POINTER_RETURN(attrs, RET_INVALID_PARAM); CHECK_POINTER_RETURN(g_loadedAttrs, RET_INVALID_PARAM); CHECK_POINTER_RETURN(attrs->svcId, RET_INVALID_PARAM); CHECK_POINTER_RETURN(attrs->attr, RET_INVALID_PARAM); if (!IsAttrRegistered(attrs->svcId, attrs->attr, g_loadedAttrs, g_regAttrsNum)) { SYS_LOG_D("svcId[%s] attr[%s] not Registered", attrs->svcId, attrs->attr); return RET_OK; } unsigned short index = 0; int ret = GetAttrIndex(attrs, g_loadedAttrs, g_regAttrsNum, &index); CHECK_RETURN(ret == RET_OK, ret); g_loadedAttrs[index].type = attrs->type; g_loadedAttrs[index].len = attrs->len; ret = strncpy_s((char *)g_loadedAttrs[index].value, CHAR_LEN, (char *)attrs->value, strlen((char *)attrs->value)); CHECK_RETURN(ret == RET_OK, ret); ret = SaveAllAttrsToFile(g_loadedAttrs, g_regAttrsNum); if (ret != RET_OK) { SYS_LOG_E("save all attrs failed ret:%d", ret); return RET_ERROR; } return RET_OK; } 详细的分析代码
08-05
这操作数据库的添加landns函数,我是不是可以使用,就不用在CLI中去管ID的重复问题? APPL_ERRCODE dmDnsServerRuleAdd(const CFG_DNSSERVER_RULE_T *ent) { APPL_ERRCODE ret = ERR_NO_ERROR; TPCONFIG_SET_INPUT st = {0}; INT64 maxScore = 0; unsigned id; char key[TPDATA_KEY_MAX_LEN] = {0}; char id_buf[16]; PFM_ENSURE_RET_VAL(ent, ERR_APPL_C_PARAM_INVALID); PFM_IF_FAIL_DONE(ret, tpConfig_setResourceInit(&st, TPCONFIG_INIT_ENTRY)); /* 分配/确定 id(与 IPS 范式一致) */ tpConfig_getMaxScore(TPZSET_DNSPROXY_DNSSERVER, &maxScore); id = (ent->id && ent->id[0] != '\0') ? (unsigned)atoi(ent->id) : (unsigned)maxScore + 1; /* id→key,score=id */ dmDnsServerRuleKeyGetById(id, key, sizeof(key)); PFM_IF_FAIL_DONE(ret, tpConfig_objAddKeyScoreForSet(&st, TPCONFIG_INIT_ENTRY, key, id)); /* 字段写入(确保 id 字段非空) */ snprintf(id_buf, sizeof(id_buf), "%u", id); PFM_IF_FAIL_DONE(ret, tpConfig_objAddFieldStrForSet(&st, TPCONFIG_INIT_ENTRY, CFG_PROTO_DNSSERVER_F_ID, id_buf)); PFM_IF_FAIL_DONE(ret, tpConfig_objAddFieldStrForSet(&st, TPCONFIG_INIT_ENTRY, CFG_PROTO_DNSSERVER_F_NAME, ent->name)); PFM_IF_FAIL_DONE(ret, tpConfig_objAddFieldStrForSet(&st, TPCONFIG_INIT_ENTRY, CFG_PROTO_DNSSERVER_F_TYPE, ent->type)); PFM_IF_FAIL_DONE(ret, tpConfig_objAddFieldStrForSet(&st, TPCONFIG_INIT_ENTRY, CFG_PROTO_DNSSERVER_F_DOMAIN, ent->domain)); // PFM_IF_FAIL_DONE(ret, tpConfig_objAddFieldStrForSet(&st, TPCONFIG_INIT_ENTRY, CFG_PROTO_DNSSERVER_F_ALIASES, ent->aliases)); PFM_IF_FAIL_DONE(ret, tpConfig_objAddFieldStrForSet(&st, TPCONFIG_INIT_ENTRY, CFG_PROTO_DNSSERVER_F_STATUS, ent->status)); PFM_IF_FAIL_DONE(ret, tpConfig_objAddFieldStrForSet(&st, TPCONFIG_INIT_ENTRY, CFG_PROTO_DNSSERVER_F_LANS, ent->lan_networks)); // PFM_IF_FAIL_DONE(ret, tpConfig_objAddFieldStrForSet(&st, TPCONFIG_INIT_ENTRY, CFG_PROTO_DNSSERVER_F_DNSSERVER, ent->dns_server)); PFM_IF_FAIL_DONE(ret, tpConfig_objAddFieldNumU32ForSet(&st, TPCONFIG_INIT_ENTRY, CFG_PROTO_DNSSERVER_F_TTL, ent->ttl)); PFM_IF_FAIL_DONE(ret, tpConfig_objAddFieldStrForSet(&st, TPCONFIG_INIT_ENTRY, CFG_PROTO_DNSSERVER_F_CNAME, ent->cname)); PFM_IF_FAIL_DONE(ret, tpConfig_objAddFieldStrForSet(&st, TPCONFIG_INIT_ENTRY, CFG_PROTO_DNSSERVER_F_IPV4S, ent->ipv4_addrs)); PFM_IF_FAIL_DONE(ret, tpConfig_objAddFieldStrForSet(&st, TPCONFIG_INIT_ENTRY, CFG_PROTO_DNSSERVER_F_IPV6S, ent->ipv6_addrs)); if (ent->dns_server1[0]) { PFM_IF_FAIL_DONE(ret, tpConfig_objAddFieldStrForSet(&st, TPCONFIG_INIT_ENTRY, CFG_PROTO_DNSSERVER_F_DNSSERVER1, ent->dns_server1)); } if (ent->dns_server2[0]) { PFM_IF_FAIL_DONE(ret, tpConfig_objAddFieldStrForSet(&st, TPCONFIG_INIT_ENTRY, CFG_PROTO_DNSSERVER_F_DNSSERVER2, ent->dns_server2)); } PFM_IF_FAIL_DONE(ret, tpConfig_set(&st)); /* 解析并保存Alias映射 */ if (ent->aliases[0]) { char *dup = strdup(ent->aliases); char *save = NULL; char *tok = strtok_r(dup, ",", &save); uint32_t index = 0; while (tok && index < 7) { // 最多7个aliases while (*tok == ' ' || *tok == '\t') { tok++; } char *e = tok + strlen(tok); while (e > tok && (e[-1] == ' ' || e[-1] == '\t')) { e[-1] = '\0'; --e; } if (*tok) { dmDnsServerAliasMapAdd(id_buf, tok, index++); } tok = strtok_r(NULL, ",", &save); } free(dup); } /* 解析并保存LAN映射 */ if (ent->lan_networks[0]) { char *dup = strdup(ent->lan_networks); char *save = NULL; char *tok = strtok_r(dup, ",", &save); uint32_t index = 0; while (tok) { while (*tok == ' ' || *tok == '\t') { tok++; } char *e = tok + strlen(tok); while (e > tok && (e[-1] == ' ' || e[-1] == '\t')) { e[-1] = '\0'; --e; } if (*tok) { dmDnsServerLanMapAdd(id_buf, tok, index++); } tok = strtok_r(NULL, ",", &save); } free(dup); } // // tpConfig_addOperAndSubForSet(&st, TPCONFIG_OPER_ADD | TPCONFIG_OPER_PUB, CFG_DNSPROXYSHELL_M_NAME); // // tpConfig_addOperAndSubForSet(&st, TPCONFIG_OPER_ADD | TPCONFIG_OPER_PUB, "dnsProxyShell"); tpConfig_addOperAndSubForSet(&st, TPCONFIG_OPER_ADD | TPCONFIG_OPER_PUB, DNSPROXYSHELL_SUB_NAME); tpConfig_addZsetNameForSet(&st, TPZSET_DNSPROXY_DNSSERVER); PFM_IF_FAIL_DONE(ret, tpConfig_set(&st)); done: tpConfig_setResourceFree(&st); return (ret == PFM_ERR_C_OK) ? ERR_NO_ERROR : ret; } APPL_ERRCODE dmDnsServerRuleSet(const CFG_DNSSERVER_RULE_T *ent) { APPL_ERRCODE ret = ERR_NO_ERROR; TPCONFIG_SET_INPUT st = {0}; char key[TPDATA_KEY_MAX_LEN] = {0}; unsigned id; PFM_ENSURE_RET_VAL(ent, ERR_APPL_C_PARAM_INVALID); PFM_ENSURE_RET_VAL(ent->id && ent->id[0] != '\0', ERR_APPL_C_PARAM_INVALID); id = (unsigned)atoi(ent->id); dmDnsServerRuleKeyGetById(id, key, sizeof(key)); PFM_IF_FAIL_DONE(ret, tpConfig_setResourceInit(&st, TPCONFIG_INIT_ENTRY)); PFM_IF_FAIL_DONE(ret, tpConfig_objAddKeyScoreForSet(&st, TPCONFIG_INIT_ENTRY, key, id)); /* 全量/按需写字段,保持你原有风格 */ PFM_IF_FAIL_DONE(ret, tpConfig_objAddFieldStrForSet(&st, TPCONFIG_INIT_ENTRY, CFG_PROTO_DNSSERVER_F_ID, ent->id)); PFM_IF_FAIL_DONE(ret, tpConfig_objAddFieldStrForSet(&st, TPCONFIG_INIT_ENTRY, CFG_PROTO_DNSSERVER_F_NAME, ent->name)); PFM_IF_FAIL_DONE(ret, tpConfig_objAddFieldStrForSet(&st, TPCONFIG_INIT_ENTRY, CFG_PROTO_DNSSERVER_F_TYPE, ent->type)); PFM_IF_FAIL_DONE(ret, tpConfig_objAddFieldStrForSet(&st, TPCONFIG_INIT_ENTRY, CFG_PROTO_DNSSERVER_F_DOMAIN, ent->domain)); // PFM_IF_FAIL_DONE(ret, tpConfig_objAddFieldStrForSet(&st, TPCONFIG_INIT_ENTRY, CFG_PROTO_DNSSERVER_F_ALIASES, ent->aliases)); PFM_IF_FAIL_DONE(ret, tpConfig_objAddFieldStrForSet(&st, TPCONFIG_INIT_ENTRY, CFG_PROTO_DNSSERVER_F_STATUS, ent->status)); PFM_IF_FAIL_DONE(ret, tpConfig_objAddFieldStrForSet(&st, TPCONFIG_INIT_ENTRY, CFG_PROTO_DNSSERVER_F_LANS, ent->lan_networks)); // PFM_IF_FAIL_DONE(ret, tpConfig_objAddFieldStrForSet(&st, TPCONFIG_INIT_ENTRY, CFG_PROTO_DNSSERVER_F_DNSSERVER, ent->dns_server)); PFM_IF_FAIL_DONE(ret, tpConfig_objAddFieldNumU32ForSet(&st, TPCONFIG_INIT_ENTRY, CFG_PROTO_DNSSERVER_F_TTL, ent->ttl)); PFM_IF_FAIL_DONE(ret, tpConfig_objAddFieldStrForSet(&st, TPCONFIG_INIT_ENTRY, CFG_PROTO_DNSSERVER_F_CNAME, ent->cname)); PFM_IF_FAIL_DONE(ret, tpConfig_objAddFieldStrForSet(&st, TPCONFIG_INIT_ENTRY, CFG_PROTO_DNSSERVER_F_IPV4S, ent->ipv4_addrs)); PFM_IF_FAIL_DONE(ret, tpConfig_objAddFieldStrForSet(&st, TPCONFIG_INIT_ENTRY, CFG_PROTO_DNSSERVER_F_IPV6S, ent->ipv6_addrs)); if (ent->dns_server1) { PFM_IF_FAIL_DONE(ret, tpConfig_objAddFieldStrForSet(&st, TPCONFIG_INIT_ENTRY, CFG_PROTO_DNSSERVER_F_DNSSERVER1, ent->dns_server1)); } if (ent->dns_server2) { PFM_IF_FAIL_DONE(ret, tpConfig_objAddFieldStrForSet(&st, TPCONFIG_INIT_ENTRY, CFG_PROTO_DNSSERVER_F_DNSSERVER2, ent->dns_server2)); } PFM_IF_FAIL_DONE(ret, tpConfig_set(&st)); dmDnsServerAliasMapDelByRuleId(ent->id); dmDnsServerLanMapDelByRuleId(ent->id); /* 解析并保存Alias映射 */ if (ent->aliases[0]) { char *dup = strdup(ent->aliases); char *save = NULL; char *tok = strtok_r(dup, ",", &save); uint32_t index = 0; while (tok && index < 7) { // 最多7个aliases while (*tok == ' ' || *tok == '\t') { tok++; } char *e = tok + strlen(tok); while (e > tok && (e[-1] == ' ' || e[-1] == '\t')) { e[-1] = '\0'; --e; } if (*tok) { dmDnsServerAliasMapAdd(ent->id, tok, index++); } tok = strtok_r(NULL, ",", &save); } free(dup); } /* 解析并保存LAN映射 */ if (ent->lan_networks[0]) { char *dup = strdup(ent->lan_networks); char *save = NULL; char *tok = strtok_r(dup, ",", &save); uint32_t index = 0; while (tok) { while (*tok == ' ' || *tok == '\t') { tok++; } char *e = tok + strlen(tok); while (e > tok && (e[-1] == ' ' || e[-1] == '\t')) { e[-1] = '\0'; --e; } if (*tok) { dmDnsServerLanMapAdd(ent->id, tok, index++); } tok = strtok_r(NULL, ",", &save); } free(dup); } tpConfig_addOperAndSubForSet(&st, TPCONFIG_OPER_MOD | TPCONFIG_OPER_PUB, DNSPROXYSHELL_SUB_NAME); tpConfig_addZsetNameForSet(&st, TPZSET_DNSPROXY_DNSSERVER); PFM_IF_FAIL_DONE(ret, tpConfig_set(&st)); done: tpConfig_setResourceFree(&st); return (ret == PFM_ERR_C_OK) ? ERR_NO_ERROR : ret; }
最新发布
10-22
S32 __video_stream_support_hdr_init_for_avs(TP_STRM_ID_E strm_id, const TP_STREAM_ATTR_S *pAttr) { HD_RESULT ret = HD_OK; UINT32 framerate = 1; UINT32 vsp_cnt = 0, vprc_pipe = 0, vsp_base_pipe = 0; HD_DIM avs_max_dim = {0}; UINT16 vsp_out_w = 0, vsp_out_h = 0; LOCAL VENDOR_VIDEOPROC_VSP_CFG bak_vsp_cfg = {0}; g_distance_change_flag = FALSE; int i = 0, blk_size = 0; VIDEO_CAP_MAIN video_cap_main = {0}; int sensor_id = 0; int sensor_num = 2; vsp_cnt = g_strm_param[0][0].avs_para.max_chn_cnt; vsp_base_pipe = g_strm_param[0][0].avs_para.base_chn; vsp_out_w = g_strm_param[0][0].avs_para.avs_out_w; vsp_out_h = g_strm_param[0][0].avs_para.avs_out_h; if(strm_id == STRM_ID_MAIN) { if (0 == ds_read(VIDEO_CAP_MAIN_PATH, &video_cap_main, sizeof(VIDEO_CAP_MAIN))) { MPP_ERROR("ds read <%s> error.", VIDEO_CAP_MAIN_PATH); return HD_ERR_NG; } if(g_videocap_start == FALSE) { ret = set_hdr_cfg(pAttr->hdr); if (ret != HD_OK) { MPP_ERROR("set hdr cfg=%d\n", ret); return HD_ERR_NG; } /* VCAP0 dev open & path set*/ // set videocap config ret = set_cap_cfg(&g_video_avdc_stream[0][0].cap_ctrl); if (ret != HD_OK) { MPP_ERROR("set cap-cfg fail=%d\n", ret); return HD_ERR_NG; } //open capture module ret = hd_videocap_open(HD_VIDEOCAP_0_IN_0, HD_VIDEOCAP_0_OUT_0, &g_video_avdc_stream[0][0].cap_path); if (ret != HD_OK) { MPP_ERROR("hd_videocap_open fail=%d\n", ret); return HD_ERR_NG; } // get videocap capability ret = get_cap_caps(g_video_avdc_stream[0][0].cap_ctrl, &g_video_avdc_stream[0][0].cap_syscaps); if (ret != HD_OK) { MPP_ERROR("get cap-caps fail=%d\n", ret); return HD_ERR_NG; } // set videocap parameter ret = set_cap_param(g_video_avdc_stream[0][0].cap_path, &g_video_avdc_stream[0][0].cap_dim, NULL); if (ret != HD_OK) { MPP_ERROR("set cap fail=%d\n", ret); return HD_ERR_NG; } /* VCAP1 dev open & path set*/ // set videocap config ret = set_cap2_cfg(&g_video_avdc_stream[1][0].cap_ctrl); if (ret != HD_OK) { MPP_ERROR("set cap-cfg fail=%d\n", ret); return HD_ERR_NG; } //open capture module ret = hd_videocap_open(HD_VIDEOCAP_2_IN_0, HD_VIDEOCAP_2_OUT_0, &g_video_avdc_stream[1][0].cap_path); if (ret != HD_OK) { MPP_ERROR("hd_videocap_open fail=%d\n", ret); return HD_ERR_NG; } // get videocap capability ret = get_cap_caps(g_video_avdc_stream[1][0].cap_ctrl, &g_video_avdc_stream[1][0].cap_syscaps); if (ret != HD_OK) { MPP_ERROR("get cap-caps fail=%d\n", ret); return HD_ERR_NG; } // set videocap parameter ret = set_cap2_param(g_video_avdc_stream[1][0].cap_path, &g_video_avdc_stream[1][0].cap_dim, NULL); if (ret != HD_OK) { MPP_ERROR("set cap fail=%d\n", ret); return HD_ERR_NG; } //修改点一 if(VDO_SIZE_W != pAttr->strm_res.res_w && VDO_SIZE_H != pAttr->strm_res.res_h) /* VPRC0 & VPRC1 dev open */ // set videoproc0 config ret = set_proc_cfg(&g_video_avdc_stream[0][0].proc_ctrl, &g_video_avdc_stream[0][0].proc_max_dim); if (ret != HD_OK) { MPP_ERROR("set proc-cfg fail=%d\n", ret); return HD_ERR_NG; } // set videoproc1 config ret = set_proc2_cfg(&g_video_avdc_stream[1][0].proc_ctrl, &g_video_avdc_stream[1][0].proc_max_dim); if (ret != HD_OK) { MPP_ERROR("set proc-cfg fail=%d\n", ret); return HD_ERR_NG; } //修改点二 aiisp_isp(get_hdr_cfg()); /* set vsp cfg for any-view stiching */ // set vsp ctrl for avs vprc_pipe = vsp_base_pipe; avs_max_dim.w = vsp_out_w; avs_max_dim.h = vsp_out_h; ret = set_proc_cfg_for_avs(HD_VIDEOPROC_CTRL(vprc_pipe), &g_video_avdc_stream[0][0].avs_proc[0].proc_ctrl, &avs_max_dim, &g_video_avdc_stream[0][0].avs_proc[0], vsp_base_pipe, &bak_vsp_cfg); if (ret != HD_OK) { MPP_ERROR("set_proc_cfg_for_avs fail=%d\n", ret); return HD_ERR_NG; } // set scl for alg -- 需兼容深度学习算法流 vprc_pipe = vsp_base_pipe + 1; avs_max_dim.w = ALIGN_CEIL_8(atoi(video_cap_main.resolutions[1])); avs_max_dim.h = ALIGN_CEIL_8(atoi(strchr(video_cap_main.resolutions[1], '*') + 1)); ret = set_proc_cfg_for_scale(HD_VIDEOPROC_CTRL(vprc_pipe), &g_video_avdc_stream[0][0].avs_proc[0].scl_proc_ctrl, &avs_max_dim); if (ret != HD_OK) { MPP_ERROR("set_proc_cfg_for_scale(avs) fail=%d\n", ret); return HD_ERR_NG; } } MPP_ERROR("[VIDEO Attr]=====>"); MPP_ERROR("avs resolution: %d*%d.", pAttr->avs_out_res.res_w, pAttr->avs_out_res.res_h); MPP_ERROR("proj resolution: %d*%d.", pAttr->src_proj_res.res_w, pAttr->src_proj_res.res_h); MPP_ERROR("fusion overlay width: %d.", pAttr->fusion_overlay_w); #if SMART_STITCH /* 初始化时从ds配置读取smart stitch开关状态 */ SMART_STITCH_CONFIG smart_stitch_config = {0}; if (0 == ds_read(SMART_STITCH_CONFIG_PATH, &smart_stitch_config, sizeof(SMART_STITCH_CONFIG))) { MPP_ERROR("ds read <%s> error.", SMART_STITCH_CONFIG_PATH); return -1; } g_is_smart_stitch_open = (smart_stitch_config.enabled == SWITCH_ON) ? TRUE:FALSE; #endif ret = prepare_stitch_info(TRUE, &g_distance_change_flag); if (ret != HD_OK) { MPP_ERROR("prepare_stitch_info=%d\n", ret); return HD_ERR_NG; } /* 修改静态拼接距离距离导致overlap变化 需要reload fusion table */ if(g_distance_change_flag) { MPP_ERROR("overlap changed, reset vsp cfg! vsp_ovlp_w[0]=%d", vsp_ovlp_w[0]); for(i = 0; i < vsp_base_pipe; i++) { bak_vsp_cfg.ovlp_width[i] = vsp_ovlp_w[i]; bak_vsp_cfg.scale_out_size[i].w = vsp_vpe_out_w[i]; MPP_ERROR("ovlp_width=%d, scale_out_size.h=%d", bak_vsp_cfg.ovlp_width[i], bak_vsp_cfg.scale_out_size[i].h); if(bak_vsp_cfg.ovlp_width[i] != 0) { blk_size = VDO_YUV_BUFSIZE(bak_vsp_cfg.ovlp_width[i], bak_vsp_cfg.scale_out_size[i].h, HD_VIDEO_PXLFMT_Y8); // init fusion table init_fusion_tbl(g_video_avdc_stream[0][0].avs_proc[0].fusion_va[i], bak_vsp_cfg.ovlp_width[i], bak_vsp_cfg.scale_out_size[i].h); // flush cache hd_common_mem_flush_cache((void *)g_video_avdc_stream[0][0].avs_proc[0].fusion_va[i], blk_size); } } ret = vendor_videoproc_set(g_video_avdc_stream[0][0].avs_proc[0].proc_ctrl, VENDOR_VIDEOPROC_PARAM_VSP_CFG, &bak_vsp_cfg); if(HD_OK != ret) { MPP_ERROR("vendor_videoproc_set error %d", ret); return HD_ERR_NG; } MPP_ERROR("reset vsp cfg finished"); } // set vsp parameters for avts, needed in every single reload. avs_max_dim.w = VDO_SIZE_W; // 当前赋值暂无用。 avs_max_dim.h = VDO_SIZE_H; // 当前赋值暂无用。 ret = set_avs_effect_cfg(&g_video_avdc_stream[0][0].avs_proc[0], &avs_max_dim); if (ret != HD_OK) { MPP_ERROR("set_avs_effect_cfg fail=%d\n", ret); return HD_ERR_NG; } g_strm_param[0][strm_id].u32CapWidth = pAttr->strm_res.res_w; g_strm_param[0][strm_id].u32CapHeight = pAttr->strm_res.res_h; // set videocap parameter HD_DIM crop_dim; HD_VIDEOCAP_OUT video_out_param = {0}; crop_dim.w = VDO_SIZE_W; crop_dim.h = VDO_SIZE_H; ret = set_cap_param(g_video_avdc_stream[0][0].cap_path, &g_video_avdc_stream[0][0].cap_dim, &crop_dim); if (ret != HD_OK) { MPP_ERROR("set cap fail=%d\n", ret); return -1; } hd_videocap_get(g_video_avdc_stream[0][0].cap_path, HD_VIDEOCAP_PARAM_OUT, &video_out_param); if(video_out_param.dim.w != 0 && video_out_param.dim.h != 0 && video_out_param.dim.w == VDO_SIZE_W && video_out_param.dim.h != VDO_SIZE_H) { HD_VIDEOCAP_CROP video_crop_param = {0}; video_crop_param.mode = HD_CROP_ON; video_crop_param.win.rect.x = 0; video_crop_param.win.rect.y = 0; video_crop_param.win.rect.w = video_out_param.dim.w; video_crop_param.win.rect.h = video_out_param.dim.h; video_crop_param.align.w = 4; video_crop_param.align.h = 4; hd_videocap_set(g_video_avdc_stream[0][0].cap_path, HD_VIDEOCAP_PARAM_IN_CROP, &video_crop_param); } else { HD_VIDEOCAP_CROP video_crop_param = {0}; video_crop_param.mode = HD_CROP_OFF; hd_videocap_set(g_video_avdc_stream[0][0].cap_path, HD_VIDEOCAP_PARAM_IN_CROP, &video_crop_param); } ret = set_cap2_param(g_video_avdc_stream[1][0].cap_path, &g_video_avdc_stream[1][0].cap_dim, &crop_dim); if (ret != HD_OK) { MPP_ERROR("set cap fail=%d\n", ret); return -1; } hd_videocap_get(g_video_avdc_stream[1][0].cap_path, HD_VIDEOCAP_PARAM_OUT, &video_out_param); if(video_out_param.dim.w != 0 && video_out_param.dim.h != 0 && video_out_param.dim.w == VDO_SIZE_W && video_out_param.dim.h != VDO_SIZE_H) { HD_VIDEOCAP_CROP video_crop_param = {0}; video_crop_param.mode = HD_CROP_ON; video_crop_param.win.rect.x = 0; video_crop_param.win.rect.y = 0; video_crop_param.win.rect.w = video_out_param.dim.w; video_crop_param.win.rect.h = video_out_param.dim.h; video_crop_param.align.w = 4; video_crop_param.align.h = 4; hd_videocap_set(g_video_avdc_stream[1][0].cap_path, HD_VIDEOCAP_PARAM_IN_CROP, &video_crop_param); } else { HD_VIDEOCAP_CROP video_crop_param = {0}; video_crop_param.mode = HD_CROP_OFF; hd_videocap_set(g_video_avdc_stream[1][0].cap_path, HD_VIDEOCAP_PARAM_IN_CROP, &video_crop_param); } // set main encoder param ret = set_enc_param(g_video_avdc_stream[0][strm_id].enc_path, pAttr, &venc_para, &g_video_avdc_stream[0][strm_id].is_reconfig_enc_para, 0); if (ret != HD_OK) { MPP_ERROR("set enc fail=%d\n", ret); return -1; } //修改点三 g_video_avdc_stream[0][0].proc_max_dim.w = pAttr->strm_res.res_w;ret = set_proc_cfg(&g_video_avdc_stream[0][0].proc_ctrl, &g_video_avdc_stream[0][0].proc_max_dim); if(get_factory_mode()) { // 拼接产测模式下限制编码帧率,由于需额外出sensor0 1两路主码流,防止超过538 codec性能瓶颈 /* 修改venc in帧率 */ framerate = AVS_FACTORY_MAX_ENC_FRM_RATE; HD_VIDEOENC_IN video_in_param = {0}; ret = hd_videoenc_get(g_video_avdc_stream[0][strm_id].enc_path, HD_VIDEOENC_PARAM_IN, &video_in_param); if (ret != HD_OK) { MPP_ERROR("hd_videoenc_get fail=%d\n", ret); return -1; } video_in_param.frc = HD_VIDEO_FRC_RATIO(framerate, video_in_param.frc); ret = hd_videoenc_set(g_video_avdc_stream[0][strm_id].enc_path, HD_VIDEOENC_PARAM_IN, &video_in_param); if (ret != HD_OK) { MPP_ERROR("hd_videoenc_set fail=%d\n", ret); return -1; } } HD_DIM avs_src_dim; avs_src_dim.w = VDO_SIZE_W; avs_src_dim.h = VDO_SIZE_H; /* set VPRC0 OUT0 -- SENSOR1对应的vcap0设置、绑定vprc */ // open vprc out0 ret = hd_videoproc_open(HD_VIDEOPROC_0_IN_0, HD_VIDEOPROC_0_OUT_0, &g_video_avdc_stream[0][strm_id].proc_path); if (ret != HD_OK) { MPP_ERROR("hd_videoproc_open fail=%d\n", ret); return -1; } //修改点四 ret = set_proc_param(g_video_avdc_stream[0][strm_id].proc_path, strm_id, &g_video_avdc_stream[0][0].proc_max_dim); // 拼接src out需配置尺寸参数 ret = set_proc_param(g_video_avdc_stream[0][strm_id].proc_path, strm_id, &avs_src_dim); if (ret != HD_OK) { MPP_ERROR("set proc fail=%d\n", ret); return -1; } // 双目拼接机型需要使用左右目YUV420原图做色差校正检验(产测模式)和自动拼接,不压缩 ret = set_proc_pxlfmt_for_avs(g_video_avdc_stream[0][strm_id].proc_path); if(ret != HD_OK) { MPP_ERROR("set proc pxlfmt fail=%d\n", ret); return -1; } // vcap0和rawall pipe in绑定 if(g_videocap_start == FALSE) { ret = hd_videocap_bind(HD_VIDEOCAP_0_OUT_0, HD_VIDEOPROC_0_IN_0); if (ret != HD_OK) { MPP_ERROR("hd_videocap_bind fail=%d\n", ret); return -1; } } /* set VPRC1 OUT0 -- SENSOR2对应的vcap1设置、绑定vprc */ // open vprc out0 ret = hd_videoproc_open(HD_VIDEOPROC_1_IN_0, HD_VIDEOPROC_1_OUT_0, &g_video_avdc_stream[1][strm_id].proc_path); if (ret != HD_OK) { MPP_ERROR("hd_videoproc_open fail=%d\n", ret); return -1; } //修改点五 // 拼接src out需配置尺寸参数 ret = set_proc_param(g_video_avdc_stream[1][strm_id].proc_path, strm_id, &avs_src_dim); if (ret != HD_OK) { MPP_ERROR("set proc fail=%d\n", ret); return -1; } // 双目拼接机型需要使用左右目YUV420原图做色差校正检验(产测模式)和自动拼接,不压缩 ret = set_proc_pxlfmt_for_avs(g_video_avdc_stream[1][strm_id].proc_path); if(ret != HD_OK) { MPP_ERROR("set proc pxlfmt fail=%d\n", ret); return -1; } // vcap1和rawall pipe in绑定 if(g_videocap_start == FALSE) { ret = hd_videocap_bind(HD_VIDEOCAP_2_OUT_0, HD_VIDEOPROC_1_IN_0); if (ret != HD_OK) { MPP_ERROR("hd_videocap_bind fail=%d\n", ret); return -1; } } vprc_pipe = vsp_base_pipe; /* vsp 各out path设置与open */ // open拼接proc的主码流输出vprc path ret = hd_videoproc_open(HD_VIDEOPROC_IN(vprc_pipe, 0), HD_VIDEOPROC_OUT(vprc_pipe, AVS_PROC_ID_MAIN), &g_video_avdc_stream[0][0].avs_proc[0].proc_path_main); if (ret != HD_OK) { MPP_ERROR("hd_videoproc_open avs[main] fail=%d\n", ret); return -1; } // 设置vsp path out参数 HD_DIM avs_main_dim; avs_main_dim.w = AVS_OUT_DEF_W; avs_main_dim.h = AVS_OUT_DEF_H; ret = set_proc_param(g_video_avdc_stream[0][0].avs_proc[0].proc_path_main, strm_id, &avs_main_dim); if (ret != HD_OK) { MPP_ERROR("set proc fail=%d\n", ret); return -1; } #if SMART_STITCH /* 非产测模式下打开动态拼接通道 */ if(!get_factory_mode() /* && g_is_smart_stitch_open == TRUE*/) { // 初始化SMART_STITCH 双目base_chn=2,overlap id=0 ret = smart_stitch_initialize(&g_video_avdc_stream[0][0].avs_proc[0], g_strm_param[0][0].avs_para.base_chn, 0); if (ret != HD_OK) { MPP_ERROR("stitch_initialize fail=%d\n", ret); return -1; } } #endif // 处理主码流非最大分辨率情况 // open拼接的主码流输出vprc path if (pAttr->avs_out_res.res_w != AVS_OUT_DEF_W || pAttr->avs_out_res.res_h != AVS_OUT_DEF_H) { UINT32 scale_pipe = vprc_pipe + 1; ret = hd_videoproc_open(HD_VIDEOPROC_IN(scale_pipe, 0), HD_VIDEOPROC_OUT(scale_pipe, AVS_SCL_OUT_ID_SCL_MAIN), &g_video_avdc_stream[0][0].avs_proc[0].proc_path_scl_src); if (ret != HD_OK) { MPP_ERROR("hd_videoproc_open scale[main] fail=%d\n", ret); return -1; } // 设置avs scl path out参数 ret = set_proc_param(g_video_avdc_stream[0][0].avs_proc[0].proc_path_scl_src, strm_id, NULL); if (ret != HD_OK) { MPP_ERROR("set proc fail=%d\n", ret); return -1; } // 绑定对应的编码通道 ret = hd_videoproc_bind(HD_VIDEOPROC_OUT(scale_pipe, AVS_SCL_OUT_ID_SCL_MAIN), HD_VIDEOENC_IN(0, AVS_VENC_OUT_ID_MAIN)); if (ret != HD_OK) { MPP_ERROR("AVS_VENC_OUT_ID_MAIN bind fail=%d\n", ret); return -1; } g_video_main_is_max_res = FALSE; } else { // 绑定对应的编码通道 ret = hd_videoproc_bind(HD_VIDEOPROC_OUT(vprc_pipe, AVS_PROC_ID_MAIN), HD_VIDEOENC_IN(0, AVS_VENC_OUT_ID_MAIN)); if (ret != HD_OK) { MPP_ERROR("STRM_ID_MAIN 0 bind fail=%d\n", ret); return -1; } g_video_main_is_max_res = TRUE; } /* 设置stitch id */ for (sensor_id = 0; sensor_id < sensor_num; sensor_id++) { AET_STITCH_ID ae_stitch = {0}; AWBT_STITCH_ID awb_stitch = {0}; ae_stitch.id = g_isp_id[sensor_id]; awb_stitch.id = g_isp_id[sensor_id]; if (get_hdr_cfg() == TP_VIDEO_HDR_ON) { ae_stitch.stitch_id.stitch_id_1 = 0xffff0000 | (g_isp_id[0] + 1) | (g_isp_id[0] << 4) | ((g_isp_id[1] + 1) << 8) | (g_isp_id[1] << 12); ae_stitch.stitch_id.stitch_id_2 = 0xffffffff; awb_stitch.stitch_id.stitch_id_1 = ae_stitch.stitch_id.stitch_id_1; awb_stitch.stitch_id.stitch_id_2 = ae_stitch.stitch_id.stitch_id_2; } else { ae_stitch.stitch_id.stitch_id_1 = 0xffffff00 | g_isp_id[0] | (g_isp_id[1] << 4); ae_stitch.stitch_id.stitch_id_2 = 0xffffffff; awb_stitch.stitch_id.stitch_id_1 = ae_stitch.stitch_id.stitch_id_1; awb_stitch.stitch_id.stitch_id_2 = ae_stitch.stitch_id.stitch_id_2; } if (vendor_isp_set_ae(AET_ITEM_STITCH_ID, &ae_stitch) != HD_OK) { MPP_ERROR("set ae stitch_id error"); return ERROR; } if (vendor_isp_set_awb(AWBT_ITEM_STITCH_ID, &awb_stitch) != HD_OK) { MPP_ERROR("set awb stitch_id error"); return ERROR; } MPP_ERROR("id = %d, stitch id1 = 0x%x \n", awb_stitch.id, awb_stitch.stitch_id.stitch_id_1); } } else if(strm_id == STRM_ID_MINOR) { g_strm_param[0][strm_id].u32CapHeight = pAttr->strm_res.res_h; g_strm_param[0][strm_id].u32CapWidth = pAttr->strm_res.res_w; ret = set_enc_param(g_video_avdc_stream[0][strm_id].enc_path, pAttr, &sub_venc_para, &g_video_avdc_stream[0][strm_id].is_reconfig_enc_para, 0); if (ret != HD_OK) { MPP_ERROR("set enc fail=%d\n", ret); return -1; } if(get_factory_mode()) { // 拼接产测模式下限制编码帧率,由于需额外出sensor0 1两路主码流,防止超过538 codec性能瓶颈 /* 修改venc in帧率 */ framerate = AVS_FACTORY_MAX_ENC_FRM_RATE; HD_VIDEOENC_IN video_in_param = {0}; ret = hd_videoenc_get(g_video_avdc_stream[0][strm_id].enc_path, HD_VIDEOENC_PARAM_IN, &video_in_param); if (ret != HD_OK) { MPP_ERROR("hd_videoenc_get fail=%d\n", ret); return -1; } video_in_param.frc = HD_VIDEO_FRC_RATIO(framerate, video_in_param.frc); ret = hd_videoenc_set(g_video_avdc_stream[0][strm_id].enc_path, HD_VIDEOENC_PARAM_IN, &video_in_param); if (ret != HD_OK) { MPP_ERROR("hd_videoenc_set fail=%d\n", ret); return -1; } } vprc_pipe = vsp_base_pipe + vsp_cnt; // open拼接的子码流输出vprc path ret = hd_videoproc_open(HD_VIDEOPROC_IN(vprc_pipe, 0), HD_VIDEOPROC_OUT(vprc_pipe, AVS_SCL_OUT_ID_MINOR), &g_video_avdc_stream[0][strm_id].proc_path); if (ret != HD_OK) { MPP_ERROR("hd_videoproc_open avs[minor] fail=%d\n", ret); return -1; } // 设置avs scl path out参数 ret = set_proc_param(g_video_avdc_stream[0][strm_id].proc_path, strm_id, NULL); if (ret != HD_OK) { MPP_ERROR("set proc fail=%d\n", ret); return -1; } // 绑定对应的编码通道 ret = hd_videoproc_bind(HD_VIDEOPROC_OUT(vprc_pipe, AVS_SCL_OUT_ID_MINOR), HD_VIDEOENC_IN(0, AVS_VENC_OUT_ID_MINOR)); if (ret != HD_OK) { MPP_ERROR("STRM_ID_MINOR 1 bind fail=%d\n", ret); return -1; } } else if(strm_id == STRM_ID_JPEG) { ret = set_enc_param(g_video_avdc_stream[0][strm_id].enc_path, pAttr, NULL, &g_video_avdc_stream[0][strm_id].is_reconfig_enc_para, 0); if (ret != HD_OK) { MPP_ERROR("set enc fail=%d\n", ret); return -1; } /* 修改venc in帧率 */ framerate=pAttr->framerate.low / pAttr->framerate.high; HD_VIDEOENC_IN video_in_param = {0}; ret = hd_videoenc_get(g_video_avdc_stream[0][strm_id].enc_path, HD_VIDEOENC_PARAM_IN, &video_in_param); if (ret != HD_OK) { MPP_ERROR("hd_videoenc_get fail=%d\n", ret); return -1; } video_in_param.frc = HD_VIDEO_FRC_RATIO(framerate, framerate); ret = hd_videoenc_set(g_video_avdc_stream[0][strm_id].enc_path, HD_VIDEOENC_PARAM_IN, &video_in_param); if (ret != HD_OK) { MPP_ERROR("hd_videoenc_set fail=%d\n", ret); return -1; } vprc_pipe = vsp_base_pipe + vsp_cnt; // open拼接的第二子码流输出vprc path ret = hd_videoproc_open(HD_VIDEOPROC_IN(vprc_pipe, 0), HD_VIDEOPROC_OUT(vprc_pipe, AVS_SCL_OUT_ID_JPEG), &g_video_avdc_stream[0][strm_id].proc_path); if (ret != HD_OK) { MPP_ERROR("hd_videoproc_open avs[jpeg] fail=%d\n", ret); return -1; } // 设置vsp scl path out参数 ret = set_proc_param(g_video_avdc_stream[0][strm_id].proc_path, strm_id, NULL); if (ret != HD_OK) { MPP_ERROR("set proc fail=%d\n", ret); return -1; } // 修改vprc out帧率 ret = set_proc_param_framerate(g_video_avdc_stream[0][strm_id].proc_path, framerate); // 绑定对应的编码通道 ret = hd_videoproc_bind(HD_VIDEOPROC_OUT(vprc_pipe, AVS_SCL_OUT_ID_JPEG), HD_VIDEOENC_IN(0, AVS_VENC_OUT_ID_JPEG)); if (ret != HD_OK) { MPP_ERROR("STRM_ID_JPEG 2 bind fail=%d\n", ret); return -1; } } else if(strm_id == STRM_ID_ISP) { vprc_pipe = vsp_base_pipe + vsp_cnt; ret = hd_videoproc_open(HD_VIDEOPROC_IN(vprc_pipe, 0), HD_VIDEOPROC_OUT(vprc_pipe, AVS_SCL_OUT_ID_ISP), &g_video_avdc_stream[0][strm_id].proc_path); if (ret != HD_OK) { MPP_ERROR("hd_videoproc_open fail=%d\n", ret); return -1; } HD_DIM isp_dim = {0}; isp_dim.w = ISP_FRAME_WIDTH; isp_dim.h = ISP_FRAME_HEIGHT; framerate = pAttr->framerate.low / pAttr->framerate.high; ret = set_proc_param_extend(g_video_avdc_stream[0][strm_id].proc_path, HD_VIDEOPROC_OUT(vprc_pipe, AVS_SCL_OUT_ID_MINOR), NULL, &isp_dim, HD_VIDEO_DIR_NONE, framerate); if (ret != HD_OK) { MPP_ERROR("set proc avs isp fail=%d\n", ret); return -1; } } else if(strm_id == STRM_ID_DLA) { #ifdef DLA_REC_STREAM_SUPPORT /* 人车属性/人头/人脸模式下启动识别流 */ if (g_face_enabled || g_people_enabled || g_vehicle_enabled) { if (g_is_dla_hd_videoproc_open != TRUE) { vprc_pipe = vsp_base_pipe + vsp_cnt; ret = hd_videoproc_open(HD_VIDEOPROC_IN(vprc_pipe, 0), HD_VIDEOPROC_OUT(vprc_pipe, AVS_SCL_OUT_ID_DLA_REC_STRM), &g_video_avdc_stream[0][STRM_ID_DLA_REC].proc_path); if (ret != HD_OK) { MPP_ERROR("hd_videoproc_open fail=%d\n", ret); return -1; } } if ((0 == g_video_attr[STRM_ID_DLA_REC].strm_res.res_w) || (0 == g_video_attr[STRM_ID_DLA_REC].strm_res.res_h) || (DLA_REC_FRAME_WIDTH < g_video_attr[STRM_ID_DLA_REC].strm_res.res_w) || (DLA_REC_FRAME_HEIGHT < g_video_attr[STRM_ID_DLA_REC].strm_res.res_h)) { g_strm_dla_rec_enabled = FALSE; } else { g_strm_dla_rec_enabled = TRUE; } MPP_ERROR("g_strm_dla_rec_enabled:%d", g_strm_dla_rec_enabled); MPP_ERROR("(pAttr + DLA_REC)->strm_res.res_w:%d", g_video_attr[STRM_ID_DLA_REC].strm_res.res_w); MPP_ERROR("(pAttr + DLA_REC)->strm_res.res_h:%d", g_video_attr[STRM_ID_DLA_REC].strm_res.res_h); MPP_ERROR("(pAttr + DLA_REC)->framerate.low:%d", g_video_attr[STRM_ID_DLA_REC].framerate.low); MPP_ERROR("(pAttr + DLA_REC)->framerate.high:%d", g_video_attr[STRM_ID_DLA_REC].framerate.high); if (g_strm_dla_rec_enabled == TRUE) { HD_DIM dla_rec_dim; dla_rec_dim.w = g_video_attr[STRM_ID_DLA_REC].strm_res.res_w; dla_rec_dim.h = g_video_attr[STRM_ID_DLA_REC].strm_res.res_h; framerate = g_video_attr[STRM_ID_DLA_REC].framerate.low / g_video_attr[STRM_ID_DLA_REC].framerate.high; // 扩展通道接入到副码流vprc // ret = set_proc_param_extend(g_video_avdc_stream[0][STRM_ID_DLA_REC].proc_path,HD_VIDEOPROC_0_OUT_1 , NULL, &dla_rec_dim, HD_VIDEO_DIR_NONE,framerate); // 设置物理通道参数 ret = set_proc_param(g_video_avdc_stream[0][STRM_ID_DLA_REC].proc_path, HD_VIDEOPROC_OUT(vprc_pipe, AVS_SCL_OUT_ID_DLA_REC_STRM), &dla_rec_dim); if (ret != HD_OK) { MPP_ERROR("set proc fail=%d\n", ret); return -1; } // 修改vprc out帧率 ret = set_proc_param_framerate(g_video_avdc_stream[0][STRM_ID_DLA_REC].proc_path, framerate); if (ret != HD_OK) { MPP_ERROR("set proc fail=%d\n", ret); return -1; } // 修改识别流 depth为1 HD_VIDEOPROC_OUT video_out_param = {0}; ret = hd_videoproc_get(g_video_avdc_stream[0][STRM_ID_DLA_REC].proc_path, HD_VIDEOPROC_PARAM_OUT, &video_out_param); video_out_param.depth = 1; ret = hd_videoproc_set(g_video_avdc_stream[0][STRM_ID_DLA_REC].proc_path, HD_VIDEOPROC_PARAM_OUT, &video_out_param); } } #endif if ((0 != g_video_attr[STRM_ID_DLA].strm_res.res_w) && (0 != g_video_attr[STRM_ID_DLA].strm_res.res_h) && (0 != pAttr->framerate.high)) { vprc_pipe = vsp_base_pipe + vsp_cnt; if (g_is_dla_hd_videoproc_open != TRUE) { ret = hd_videoproc_open(HD_VIDEOPROC_IN(vprc_pipe, 0), HD_VIDEOPROC_OUT(vprc_pipe, AVS_SCL_OUT_ID_DLA), &g_video_avdc_stream[0][strm_id].proc_path); if (ret != HD_OK) { MPP_ERROR("hd_videoproc_open fail=%d\n", ret); return -1; } g_is_dla_hd_videoproc_open = TRUE; } MPP_ERROR("DLA_DET width max: %d",DLA_FRAME_WIDTH); MPP_ERROR("DLA_DET height max: %d",DLA_FRAME_HEIGHT); MPP_ERROR("(pAttr + DLA_DET)->strm_res.res_w:%d", g_video_attr[STRM_ID_DLA].strm_res.res_w); MPP_ERROR("(pAttr + DLA_DET)->strm_res.res_h:%d", g_video_attr[STRM_ID_DLA].strm_res.res_h); MPP_ERROR("(pAttr + DLA_DET)->framerate.low:%d", g_video_attr[STRM_ID_DLA].framerate.low); MPP_ERROR("(pAttr + DLA_DET)->framerate.high:%d", g_video_attr[STRM_ID_DLA].framerate.high); if(g_video_attr[STRM_ID_DLA].strm_res.res_w > DLA_FRAME_WIDTH || g_video_attr[STRM_ID_DLA].strm_res.res_h > DLA_FRAME_HEIGHT) { MPP_ERROR("DLA_DET resolution out of range"); return -1; } HD_DIM dla_dim = {0}; U32 src_path = AVS_SCL_OUT_ID_MINOR; dla_dim.w = g_video_attr[STRM_ID_DLA].strm_res.res_w; dla_dim.h = g_video_attr[STRM_ID_DLA].strm_res.res_h; framerate = pAttr->framerate.low / pAttr->framerate.high;; /*存在识别流时,将识别流作为检测流物理通道;否则将子码流作为检测流物理通道*/ if(TRUE == g_strm_dla_rec_enabled) { src_path = AVS_SCL_OUT_ID_DLA_REC_STRM; framerate = 0; } ret = set_proc_param_extend(g_video_avdc_stream[0][strm_id].proc_path, HD_VIDEOPROC_OUT(vprc_pipe, src_path), NULL, &dla_dim, HD_VIDEO_DIR_NONE,framerate); if (ret != HD_OK) { MPP_ERROR("set proc avs dla fail=%d\n", ret); return -1; } } } #ifdef MAIN_STREAM_SEC_ENABLE else if(strm_id == STRM_ID_MAIN_SEC) { if(get_factory_mode()) { g_strm_param[0][strm_id].u32CapHeight = pAttr->strm_res.res_h; g_strm_param[0][strm_id].u32CapWidth = pAttr->strm_res.res_w; ret = set_enc_param(g_video_avdc_stream[0][strm_id].enc_path, pAttr, &venc_para, &g_video_avdc_stream[0][strm_id].is_reconfig_enc_para, 0); if (ret != HD_OK) { MPP_ERROR("set enc fail=%d\n", ret); return -1; } /* 修改venc in帧率 */ framerate = pAttr->framerate.low / pAttr->framerate.high; HD_VIDEOENC_IN video_in_param = {0}; ret = hd_videoenc_get(g_video_avdc_stream[0][strm_id].enc_path, HD_VIDEOENC_PARAM_IN, &video_in_param); if (ret != HD_OK) { MPP_ERROR("hd_videoenc_get fail=%d\n", ret); return -1; } video_in_param.frc = HD_VIDEO_FRC_RATIO(framerate, video_in_param.frc); ret = hd_videoenc_set(g_video_avdc_stream[0][strm_id].enc_path, HD_VIDEOENC_PARAM_IN, &video_in_param); if (ret != HD_OK) { MPP_ERROR("hd_videoenc_set fail=%d\n", ret); return -1; } // 绑定对应的编码通道 ret = hd_videoproc_bind(HD_VIDEOPROC_OUT(0, 0), HD_VIDEOENC_IN(0, AVS_VENC_OUT_ID_MAIN_SEC)); if (ret != HD_OK) { MPP_ERROR("STRM_ID_MINOR 1 bind fail=%d\n", ret); return -1; } } } #endif #ifdef MINOR_STREAM_SEC_ENABLE else if(strm_id == STRM_ID_MINOR_SEC) { // TODO } #endif #ifdef MAIN_STREAM_THD_ENABLE else if(strm_id == STRM_ID_MAIN_THD) { if(get_factory_mode()) { g_strm_param[0][strm_id].u32CapHeight = pAttr->strm_res.res_h; g_strm_param[0][strm_id].u32CapWidth = pAttr->strm_res.res_w; ret = set_enc_param(g_video_avdc_stream[0][strm_id].enc_path, pAttr, &venc_para, &g_video_avdc_stream[0][strm_id].is_reconfig_enc_para, 0); if (ret != HD_OK) { MPP_ERROR("set enc fail=%d\n", ret); return -1; } /* 修改venc in帧率 */ framerate = pAttr->framerate.low / pAttr->framerate.high; HD_VIDEOENC_IN video_in_param = {0}; ret = hd_videoenc_get(g_video_avdc_stream[0][strm_id].enc_path, HD_VIDEOENC_PARAM_IN, &video_in_param); if (ret != HD_OK) { MPP_ERROR("hd_videoenc_get fail=%d\n", ret); return -1; } video_in_param.frc = HD_VIDEO_FRC_RATIO(framerate, video_in_param.frc); ret = hd_videoenc_set(g_video_avdc_stream[0][strm_id].enc_path, HD_VIDEOENC_PARAM_IN, &video_in_param); if (ret != HD_OK) { MPP_ERROR("hd_videoenc_set fail=%d\n", ret); return -1; } // 绑定对应的编码通道 ret = hd_videoproc_bind(HD_VIDEOPROC_OUT(1, 0), HD_VIDEOENC_IN(0, AVS_VENC_OUT_ID_MAIN_THD)); if (ret != HD_OK) { MPP_ERROR("STRM_ID_MINOR 1 bind fail=%d\n", ret); return -1; } } } #endif #ifdef MINOR_STREAM_THD_ENABLE else if(strm_id == STRM_ID_MINOR_THD) { // TODO } #endif memcpy(&g_strm_param[0][strm_id].roi_info, &pAttr->roi_info, sizeof(TP_STREAM_ROI_S)); if(strm_id != STRM_ID_MAIN_SEC && strm_id != STRM_ID_MAIN_THD) { ret = hd_videoproc_start(g_video_avdc_stream[0][strm_id].proc_path);//direct模式vproc要比vcap早 if (ret != HD_OK && strm_id != STRM_ID_DLA) { MPP_ERROR("hd_videoproc_start fail=%d\n", ret); return -1; } } #ifdef DLA_REC_STREAM_SUPPORT // todo -- start STRM_ID_DLA_REC_STREAM 的vprc if (g_strm_dla_rec_enabled == TRUE && strm_id == STRM_ID_DLA) { ret = hd_videoproc_start(g_video_avdc_stream[0][STRM_ID_DLA_REC].proc_path); if (ret != HD_OK) { MPP_ERROR("hd_videoproc_start fail=%d\n", ret); return -1; } g_strm_param[0][STRM_ID_DLA_REC].video_stream_inited = TRUE; MPP_ERROR("video stream STRM_ID_DLA_REC init finish"); // 由于JPEG vprc接入到 DLA_REC vprc的扩展通道,重启JPEG vprc ret = hd_videoproc_stop(g_video_avdc_stream[0][STRM_ID_JPEG].proc_path); if (ret != HD_OK) { MPP_ERROR("hd_videoproc_stop fail=%d\n", ret); return -1; } ret = hd_videoproc_start(g_video_avdc_stream[0][STRM_ID_JPEG].proc_path); if (ret != HD_OK) { MPP_ERROR("hd_videoproc_stop fail=%d\n", ret); return -1; } } #endif if(STRM_ID_MAIN == strm_id) { ret = hd_videoproc_start(g_video_avdc_stream[1][strm_id].proc_path); if (ret != HD_OK && strm_id != STRM_ID_DLA) { MPP_ERROR("hd_videoproc_start fail=%d\n", ret); return -1; } ret = hd_videoproc_start(g_video_avdc_stream[0][0].avs_proc[0].proc_path_main); if (ret != HD_OK) { MPP_ERROR("hd_videoproc_start avs[main] fail=%d\n", ret); return -1; } if (pAttr->avs_out_res.res_w != AVS_OUT_DEF_W || pAttr->avs_out_res.res_h != AVS_OUT_DEF_H) { ret = hd_videoproc_start(g_video_avdc_stream[0][0].avs_proc[0].proc_path_scl_src); if (ret != HD_OK) { MPP_ERROR("hd_videoproc_start scale[main] fail=%d\n", ret); return -1; } } #if SMART_STITCH /* 非产测模式下启动动态拼接通道 */ if(!get_factory_mode() /* && g_is_smart_stitch_open == TRUE */) { ret = hd_videoproc_start(g_video_avdc_stream[0][0].avs_proc[0].proc_path_ss); if (ret != HD_OK) { MPP_ERROR("hd_videoproc_start avs[ss] fail=%d\n", ret); return -1; } } #endif if (g_c_gain.gain[0] != 0 && g_c_gain.gain[1] != 0 && g_c_gain.gain[2] != 0) { g_c_gain.id = g_isp_id[0]; vendor_isp_set_common(ISPT_ITEM_C_GAIN, &g_c_gain); g_c_gain.id = g_isp_id[1]; vendor_isp_set_common(ISPT_ITEM_C_GAIN, &g_c_gain); if (get_hdr_cfg() == TP_VIDEO_HDR_ON) { g_c_gain.id = g_isp_id[0] + 1; vendor_isp_set_common(ISPT_ITEM_C_GAIN, &g_c_gain); g_c_gain.id = g_isp_id[1] + 1; vendor_isp_set_common(ISPT_ITEM_C_GAIN, &g_c_gain); } } // TODO -- 双目(均需要hdr)拼接:g_c_gain需要扩展为数组,下方设置的id,与实际使用的vcap id有关, // 暂时还没确定,后续完善。当前已在avts中屏蔽hdr开启。-- 20240515 wangjunzhe // TODO -- 预期:shdr sensor0为vcap0、3,sensor1为vcap1、4。 // 注: 开启shdr时,每个vap实际需要借用另一个vcap做长短帧融合。且sen0和sen1不能使用重复的vcap dev id。 /* ... ... */ ret = hd_videocap_start(g_video_avdc_stream[0][0].cap_path); if (ret != HD_OK) { MPP_ERROR("hd_videocap_start 0 fail=%d\n", ret); return -1; } ret = hd_videocap_start(g_video_avdc_stream[1][0].cap_path); if (ret != HD_OK) { MPP_ERROR("hd_videocap_start 1 fail=%d\n", ret); return -1; } ret = set_cap_fps(g_video_avdc_stream[0][0].cap_ctrl); if (ret != HD_OK) { MPP_ERROR("set cap fps 0 fail=%d\n", ret); return -1; } ret = set_cap_fps(g_video_avdc_stream[1][0].cap_ctrl); if (ret != HD_OK) { MPP_ERROR("set cap fps 1 fail=%d\n", ret); return -1; } g_videocap_start = TRUE; } g_strm_param[0][strm_id].video_stream_inited = TRUE; MPP_DEBUG("video stream [%d] init(for avs) finish", strm_id); return OK; } #endif 这是双目机型的pipeline流程,这些关于aiisp的关键点应该嵌入到这个pipeline的哪些位置,有什么注意事项
09-24
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值