From 2ed8844684c86806bbd2d4df5c414bc41aa18889 Mon Sep 17 00:00:00 2001 From: Gokul S Date: Fri, 28 Nov 2025 18:38:45 +0530 Subject: [PATCH] final Signed-off-by: Gokul S --- apps/dl_demos/app_tidl_avp4/app_common.h | 2 +- apps/dl_demos/app_tidl_avp4/main.c | 194 +++++++++++++++++++---- 2 files changed, 166 insertions(+), 30 deletions(-) diff --git a/apps/dl_demos/app_tidl_avp4/app_common.h b/apps/dl_demos/app_tidl_avp4/app_common.h index e2f2450..e0b9654 100644 --- a/apps/dl_demos/app_tidl_avp4/app_common.h +++ b/apps/dl_demos/app_tidl_avp4/app_common.h @@ -70,7 +70,7 @@ // #define APP_DEBUG //#define APP_WRITE_INTERMEDIATE_OUTPUTS -#define APP_TIVX_LOG_RT_ENABLE +// #define APP_TIVX_LOG_RT_ENABLE #define APP_MAX_FILE_PATH (256u) #define APP_ASSERT(x) assert((x)) diff --git a/apps/dl_demos/app_tidl_avp4/main.c b/apps/dl_demos/app_tidl_avp4/main.c index 795cd09..9da490b 100644 --- a/apps/dl_demos/app_tidl_avp4/main.c +++ b/apps/dl_demos/app_tidl_avp4/main.c @@ -107,6 +107,11 @@ typedef struct { ImgHistObj imgHistObj; PyramidObj pyramidObj; DofProcObj dofProcObj; + vx_object_array viss_output_arr[APP_BUFFER_Q_DEPTH]; + vx_image viss_output_img[APP_BUFFER_Q_DEPTH]; + uint32_t viss_graph_parameter_index; + uint32_t ldc_graph_parameter_index; + uint32_t srv_graph_parameter_index; vx_char input_file_path[APP_MAX_FILE_PATH]; vx_char output_file_path[APP_MAX_FILE_PATH]; @@ -114,7 +119,8 @@ typedef struct { /* OpenVX references */ vx_context context; vx_graph graph; - + vx_graph od_graph; + vx_graph srv_graph; vx_uint32 is_interactive; vx_uint32 num_frames_to_run; @@ -123,6 +129,7 @@ typedef struct { vx_uint32 num_frames_to_skip; tivx_task task; + tivx_task od_graph_task; vx_uint32 stop_task; vx_uint32 stop_task_done; @@ -135,6 +142,7 @@ typedef struct { int32_t pipeline; int32_t enqueueCnt; int32_t dequeueCnt; + int32_t od_pipeline; int32_t enable_capture; int32_t enable_viss; @@ -269,6 +277,8 @@ static vx_status app_run_graph_interactive(AppObj *obj) case 'p': appPerfStatsPrintAll(); tivx_utils_graph_perf_print(obj->graph); + tivx_utils_graph_perf_print(obj->od_graph); + tivx_utils_graph_perf_print(obj->srv_graph); appPerfPointPrint(&obj->fileio_perf); appPerfPointPrint(&obj->total_perf); printf("\n"); @@ -1122,6 +1132,11 @@ static void app_deinit(AppObj *obj) APP_PRINTF("Capture deinit done!\n"); } + for(int i=0;i< APP_BUFFER_Q_DEPTH; i++){ + vxReleaseObjectArray(&obj->viss_output_arr[i]); + vxReleaseImage(&obj->viss_output_img[i]); + } + if(obj->enable_viss == 1) { app_deinit_viss(&obj->vissObj); @@ -1304,6 +1319,8 @@ static void app_delete_graph(AppObj *obj) #endif vxReleaseGraph(&obj->graph); + vxReleaseGraph(&obj->od_graph); + vxReleaseGraph(&obj->srv_graph); APP_PRINTF("Graph delete done!\n"); } @@ -1311,11 +1328,23 @@ static vx_status app_create_graph(AppObj *obj) { vx_status status = VX_SUCCESS; vx_graph_parameter_queue_params_t graph_parameters_queue_params_list[2]; + vx_graph_parameter_queue_params_t od_graph_parameters_queue_params_list[2]; + vx_graph_parameter_queue_params_t srv_graph_parameters_queue_params_list[2]; vx_int32 graph_parameter_index; + vx_int32 od_graph_parameter_index; + vx_int32 srv_graph_parameter_index; obj->graph = vxCreateGraph(obj->context); status = vxGetStatus((vx_reference)obj->graph); - vxSetReferenceName((vx_reference)obj->graph, "app_tidl_avp4_graph"); + vxSetReferenceName((vx_reference)obj->graph, "app_capture_avp4_graph"); + obj->od_graph = vxCreateGraph(obj->context); + status = vxGetStatus((vx_reference)obj->od_graph); + vxSetReferenceName((vx_reference)obj->od_graph, "app_tidl_avp4_graph"); + obj->srv_graph = vxCreateGraph(obj->context); + status = vxGetStatus((vx_reference)obj->srv_graph); + vxSetReferenceName((vx_reference)obj->srv_graph, "app_srv_avp4_graph"); + + APP_PRINTF("Graph create done!\n"); if((status == VX_SUCCESS) && (obj->enable_capture == 1)) @@ -1323,7 +1352,26 @@ static vx_status app_create_graph(AppObj *obj) status = app_create_graph_capture(obj->graph, &obj->captureObj); APP_PRINTF("Capture graph done!\n"); } + uint32_t img_width = obj->sensorObj.sensorParams.sensorInfo.raw_params.width; + uint32_t img_height = obj->sensorObj.sensorParams.sensorInfo.raw_params.height; + vx_image viss_output_img = vxCreateImage(obj->context, img_width, img_height, VX_DF_IMAGE_NV12); + status = vxGetStatus((vx_reference)viss_output_img); + for(int i=0;i< APP_BUFFER_Q_DEPTH; i++){ + if(status == VX_SUCCESS) + { + obj->viss_output_arr[i] = vxCreateObjectArray(obj->context, (vx_reference)viss_output_img, obj->sensorObj.num_cameras_enabled); + obj->viss_output_img[i] = (vx_image)vxGetObjectArrayItem(obj->viss_output_arr[i], 0); + status = vxGetStatus((vx_reference)obj->viss_output_arr[i]); + if(status != VX_SUCCESS) + { + printf("ERROR \n"); + } + } + } + vxReleaseImage(&viss_output_img); + vxReleaseObjectArray(&obj->vissObj.output_arr); + obj->vissObj.output_arr = obj->viss_output_arr[0]; if((status == VX_SUCCESS) && (obj->enable_viss == 1)) { status = app_create_graph_viss(obj->graph, &obj->vissObj, obj->captureObj.raw_image_arr[0], TIVX_TARGET_VPAC_VISS1); @@ -1338,7 +1386,7 @@ static vx_status app_create_graph(AppObj *obj) if((status == VX_SUCCESS) && (obj->enable_srv == 1)) { - status = app_create_graph_srv(obj->context, obj->graph, &obj->srvObj, obj->vissObj.output_arr); + status = app_create_graph_srv(obj->context, obj->srv_graph, &obj->srvObj, obj->vissObj.output_arr); APP_PRINTF("SRV graph done!\n"); } @@ -1346,7 +1394,7 @@ static vx_status app_create_graph(AppObj *obj) { if(status == VX_SUCCESS) { - status = app_create_graph_ldc(obj->graph, &obj->ldcObj, obj->vissObj.output_arr, TIVX_TARGET_VPAC_LDC1); + status = app_create_graph_ldc(obj->od_graph, &obj->ldcObj, obj->viss_output_arr[0], TIVX_TARGET_VPAC_LDC1); APP_PRINTF("LDC graph done!\n"); } } @@ -1355,11 +1403,11 @@ static vx_status app_create_graph(AppObj *obj) { if(obj->enable_ldc == 1) { - app_create_graph_scaler(obj->context, obj->graph, &obj->scalerObj, obj->ldcObj.output_arr); + app_create_graph_scaler(obj->context, obj->od_graph, &obj->scalerObj, obj->ldcObj.output_arr); } else { - app_create_graph_scaler(obj->context, obj->graph, &obj->scalerObj, obj->vissObj.output_arr); + app_create_graph_scaler(obj->context, obj->od_graph, &obj->scalerObj, obj->vissObj.output_arr); } APP_PRINTF("Scaler graph done!\n"); } @@ -1368,11 +1416,11 @@ static vx_status app_create_graph(AppObj *obj) { if(obj->enable_ldc == 1) { - app_create_graph_img_hist(obj->graph, &obj->imgHistObj, obj->ldcObj.output_arr); + app_create_graph_img_hist(obj->od_graph, &obj->imgHistObj, obj->ldcObj.output_arr); } else { - app_create_graph_img_hist(obj->graph, &obj->imgHistObj, obj->vissObj.output_arr); + app_create_graph_img_hist(obj->od_graph, &obj->imgHistObj, obj->vissObj.output_arr); } APP_PRINTF("Img Hist graph done!\n"); } @@ -1386,10 +1434,10 @@ static vx_status app_create_graph(AppObj *obj) #endif if(obj->dofProcObj.enable_temporal_predicton_flow_vector == 1) { - vxRegisterAutoAging(obj->graph, obj->dofProcObj.flow_vector_field_delay); + vxRegisterAutoAging(obj->od_graph, obj->dofProcObj.flow_vector_field_delay); } - app_create_graph_dof_proc(obj->graph, &obj->dofProcObj, obj->pyramidObj.pyramid_delay); + app_create_graph_dof_proc(obj->od_graph, &obj->dofProcObj, obj->pyramidObj.pyramid_delay); APP_PRINTF("DOF graph done!\n"); @@ -1397,19 +1445,19 @@ static vx_status app_create_graph(AppObj *obj) if((status == VX_SUCCESS) && (obj->enable_pre_proc == 1)) { - app_create_graph_pre_proc(obj->graph, &obj->preProcObj, obj->scalerObj.output[0].arr); + app_create_graph_pre_proc(obj->od_graph, &obj->preProcObj, obj->scalerObj.output[0].arr); APP_PRINTF("Pre proc graph done!\n"); } if((status == VX_SUCCESS) && (obj->enable_tidl == 1)) { - app_create_graph_tidl(obj->context, obj->graph, &obj->tidlObj, obj->preProcObj.output_tensor_arr); + app_create_graph_tidl(obj->context, obj->od_graph, &obj->tidlObj, obj->preProcObj.output_tensor_arr); APP_PRINTF("TIDL graph done!\n"); } if((status == VX_SUCCESS) && (obj->enable_post_proc == 1)) { - app_create_graph_post_proc(obj->graph, &obj->postProcObj, obj->scalerObj.output[0].arr, obj->tidlObj.out_args_arr, obj->tidlObj.output_tensor_arr[0]); + app_create_graph_post_proc(obj->od_graph, &obj->postProcObj, obj->scalerObj.output[0].arr, obj->tidlObj.out_args_arr, obj->tidlObj.output_tensor_arr[0]); APP_PRINTF("Post proc graph done!\n"); } @@ -1431,13 +1479,13 @@ static vx_status app_create_graph(AppObj *obj) obj->imgMosaicObj.num_inputs = idx; } - status = app_create_graph_img_mosaic(obj->graph, &obj->imgMosaicObj, NULL); + status = app_create_graph_img_mosaic(obj->od_graph, &obj->imgMosaicObj, NULL); APP_PRINTF("Img Mosaic graph done!\n"); } if((status == VX_SUCCESS) && (obj->enable_display == 1)) { - status = app_create_graph_display(obj->graph, &obj->displayObj, obj->imgMosaicObj.output_image[0]); + status = app_create_graph_display(obj->od_graph, &obj->displayObj, obj->imgMosaicObj.output_image[0]); APP_PRINTF("Display graph done!\n"); } @@ -1454,6 +1502,15 @@ static vx_status app_create_graph(AppObj *obj) graph_parameters_queue_params_list[graph_parameter_index].refs_list = (vx_reference*)&obj->captureObj.raw_image_arr[0]; graph_parameter_index++; } + if(obj->enable_viss){ + // viss output as graph parameter + add_graph_parameter_by_node_index(obj->graph, obj->vissObj.node, 6); + obj->viss_graph_parameter_index = graph_parameter_index; + graph_parameters_queue_params_list[graph_parameter_index].graph_parameter_index = graph_parameter_index; + graph_parameters_queue_params_list[graph_parameter_index].refs_list_size = APP_BUFFER_Q_DEPTH; + graph_parameters_queue_params_list[graph_parameter_index].refs_list = (vx_reference*)&obj->viss_output_img[0]; + graph_parameter_index++; + } vxSetGraphScheduleConfig(obj->graph, VX_GRAPH_SCHEDULE_MODE_QUEUE_AUTO, @@ -1464,7 +1521,7 @@ static vx_status app_create_graph(AppObj *obj) if(obj->enable_viss == 1) { - tivxSetNodeParameterNumBufByIndex(obj->vissObj.node, 6, APP_BUFFER_Q_DEPTH); + // tivxSetNodeParameterNumBufByIndex(obj->vissObj.node, 6, APP_BUFFER_Q_DEPTH); // output set as graph parameter tivxSetNodeParameterNumBufByIndex(obj->vissObj.node, 9, APP_BUFFER_Q_DEPTH); } @@ -1473,6 +1530,37 @@ static vx_status app_create_graph(AppObj *obj) tivxSetNodeParameterNumBufByIndex(obj->aewbObj.node, 4, APP_BUFFER_Q_DEPTH); } + od_graph_parameter_index = 0; + // ldc_input as graph parameter + add_graph_parameter_by_node_index(obj->od_graph, obj->ldcObj.node, 6); //6th parameter is input + obj->ldc_graph_parameter_index = od_graph_parameter_index; + od_graph_parameters_queue_params_list[od_graph_parameter_index].graph_parameter_index = od_graph_parameter_index; + od_graph_parameters_queue_params_list[od_graph_parameter_index].refs_list_size = APP_BUFFER_Q_DEPTH; + od_graph_parameters_queue_params_list[od_graph_parameter_index].refs_list = (vx_reference*)&obj->viss_output_img[0]; + od_graph_parameter_index++; + + vxSetGraphScheduleConfig(obj->od_graph, + VX_GRAPH_SCHEDULE_MODE_QUEUE_AUTO, + od_graph_parameter_index, + od_graph_parameters_queue_params_list); + + srv_graph_parameter_index = 0; + // ldc_input as graph parameter + add_graph_parameter_by_node_index(obj->srv_graph, obj->srvObj.node, 1); //1st parameter is input + obj->srv_graph_parameter_index = srv_graph_parameter_index; + srv_graph_parameters_queue_params_list[srv_graph_parameter_index].graph_parameter_index = srv_graph_parameter_index; + srv_graph_parameters_queue_params_list[srv_graph_parameter_index].refs_list_size = APP_BUFFER_Q_DEPTH; + srv_graph_parameters_queue_params_list[srv_graph_parameter_index].refs_list = (vx_reference*)&obj->viss_output_arr[0]; + srv_graph_parameter_index++; + + vxSetGraphScheduleConfig(obj->srv_graph, + VX_GRAPH_SCHEDULE_MODE_QUEUE_AUTO, + srv_graph_parameter_index, + srv_graph_parameters_queue_params_list); + + tivxSetGraphPipelineDepth(obj->od_graph, APP_PIPELINE_DEPTH); + tivxSetGraphPipelineDepth(obj->srv_graph, APP_PIPELINE_DEPTH); + if(obj->enable_ldc == 1) { tivxSetNodeParameterNumBufByIndex(obj->ldcObj.node, 7, APP_BUFFER_Q_DEPTH); @@ -1522,6 +1610,8 @@ static vx_status app_verify_graph(AppObj *obj) vx_status status = VX_SUCCESS; status = vxVerifyGraph(obj->graph); + status = vxVerifyGraph(obj->od_graph); + status = vxVerifyGraph(obj->srv_graph); if(status == VX_SUCCESS) { @@ -1531,12 +1621,17 @@ static vx_status app_verify_graph(AppObj *obj) #if 1 if(VX_SUCCESS == status) { - status = tivxExportGraphToDot(obj->graph,".", "vx_app_tidl_avp4"); + status = tivxExportGraphToDot(obj->graph,".", "vx_app_tidl_avp4_srv"); } #endif + if(VX_SUCCESS == status) + { + status = tivxExportGraphToDot(obj->od_graph,".", "vx_app_tidl_avp4_od"); + } #ifdef APP_TIVX_LOG_RT_ENABLE tivxLogRtTraceEnable(obj->graph); + tivxLogRtTraceEnable(obj->od_graph); #endif if (obj->captureObj.enable_error_detection) @@ -1576,6 +1671,7 @@ static vx_status app_run_graph_for_one_frame_sequential(AppObj *obj, vx_int32 fr static vx_status app_run_graph_for_one_frame_pipeline(AppObj *obj, vx_int32 frame_id) { vx_status status = VX_SUCCESS; + static uint32_t share_buf_count; appPerfPointBegin(&obj->total_perf); @@ -1590,6 +1686,10 @@ static vx_status app_run_graph_for_one_frame_pipeline(AppObj *obj, vx_int32 fram { vxGraphParameterEnqueueReadyRef(obj->graph, captureObj->graph_parameter_index, (vx_reference*)&captureObj->raw_image_arr[obj->enqueueCnt], 1); } + if(obj->enable_viss == 1) + { + vxGraphParameterEnqueueReadyRef(obj->graph, obj->viss_graph_parameter_index, (vx_reference*)&obj->viss_output_img[obj->enqueueCnt], 1); + } obj->enqueueCnt++; obj->enqueueCnt = (obj->enqueueCnt >= APP_BUFFER_Q_DEPTH)? 0 : obj->enqueueCnt; @@ -1603,6 +1703,11 @@ static vx_status app_run_graph_for_one_frame_pipeline(AppObj *obj, vx_int32 fram { vxGraphParameterEnqueueReadyRef(obj->graph, captureObj->graph_parameter_index, (vx_reference*)&captureObj->raw_image_arr[obj->enqueueCnt], 1); } + if(obj->enable_viss == 1) + { + vxGraphParameterEnqueueReadyRef(obj->graph, obj->viss_graph_parameter_index, (vx_reference*)&obj->viss_output_img[obj->enqueueCnt], 1); + } + obj->enqueueCnt++; obj->enqueueCnt = (obj->enqueueCnt >= APP_BUFFER_Q_DEPTH)? 0 : obj->enqueueCnt; obj->pipeline++; @@ -1611,27 +1716,57 @@ static vx_status app_run_graph_for_one_frame_pipeline(AppObj *obj, vx_int32 fram if(obj->pipeline > 0) { vx_reference raw_image; + vx_reference viss_output_img, viss_output_obj_arr; uint32_t num_refs; if(obj->enable_capture == 1) { /* Dequeue input */ - vxGraphParameterDequeueDoneRef(obj->graph, captureObj->graph_parameter_index, (vx_reference*)&raw_image, 1, &num_refs); + vxGraphParameterDequeueDoneRef(obj->graph, obj->captureObj.graph_parameter_index, (vx_reference*)&raw_image, 1, &num_refs); } - if(obj->enable_capture == 1) - { - /* Enqueue input - start execution */ - vxGraphParameterEnqueueReadyRef(obj->graph, captureObj->graph_parameter_index, &raw_image, 1); - } + if(obj->enable_capture == 1) + { + /* Enqueue input - start execution */ + vxGraphParameterEnqueueReadyRef(obj->graph, obj->captureObj.graph_parameter_index, &raw_image, 1); + } - obj->enqueueCnt++; - obj->dequeueCnt++; + vxGraphParameterDequeueDoneRef(obj->graph, obj->viss_graph_parameter_index, (vx_reference*)&viss_output_img, 1, &num_refs); - obj->enqueueCnt = (obj->enqueueCnt >= APP_BUFFER_Q_DEPTH)? 0 : obj->enqueueCnt; - obj->dequeueCnt = (obj->dequeueCnt >= APP_BUFFER_Q_DEPTH)? 0 : obj->dequeueCnt; + if(share_buf_count < APP_BUFFER_Q_DEPTH/2) + { + // just enqueue the buffers to srv_graph and od_graph so that all 3 graphs have buffers to process + // if APP_BUFFER_Q_DEPTH == 2 then 2 buffers are given for main_graph and the 2 buffers are given for other 2 (od, srv) graph + // increase the APP_BUFFER_Q_DEPTH if more buffers are needed across different graphs + //viss_output is a image get the parent and then enqueue because srv_node input is obj_array + viss_output_obj_arr = tivxGetReferenceParent(viss_output_img ); + vxGraphParameterEnqueueReadyRef(obj->srv_graph, obj->srv_graph_parameter_index, &viss_output_obj_arr, 1); + vxGraphParameterEnqueueReadyRef(obj->od_graph, obj->ldc_graph_parameter_index, &viss_output_img, 1); + + share_buf_count++; + } + else + { + // here dequeue the buffers from (od,srv) graph and enqueue it back to main_graph to circulate the buffers b/w graphs + //viss_output is a image get the parent and then enqueue because srv_node input is obj_array + viss_output_obj_arr = tivxGetReferenceParent(viss_output_img ); + vxGraphParameterEnqueueReadyRef(obj->srv_graph, obj->srv_graph_parameter_index, &viss_output_obj_arr, 1); + vxGraphParameterEnqueueReadyRef(obj->od_graph, obj->ldc_graph_parameter_index, &viss_output_img, 1); + + vxGraphParameterDequeueDoneRef(obj->srv_graph, obj->srv_graph_parameter_index, (vx_reference*)&viss_output_obj_arr, 1, &num_refs); // simply dequeue as we are dequeuing the reference from do_graph + vxGraphParameterDequeueDoneRef(obj->od_graph, obj->ldc_graph_parameter_index, (vx_reference*)&viss_output_img, 1, &num_refs); + + // viss_output_img = vxGetObjectArrayItem((vx_object_array)viss_output_obj_arr, 0 ); // get element from obj_arr because srv node dequeues an obj_array + vxGraphParameterEnqueueReadyRef(obj->graph, obj->viss_graph_parameter_index, &viss_output_img, 1); + } + + obj->enqueueCnt++; + obj->dequeueCnt++; + + obj->enqueueCnt = (obj->enqueueCnt >= APP_BUFFER_Q_DEPTH)? 0 : obj->enqueueCnt; + obj->dequeueCnt = (obj->dequeueCnt >= APP_BUFFER_Q_DEPTH)? 0 : obj->dequeueCnt; - } + } appPerfPointEnd(&obj->total_perf); @@ -1700,7 +1835,7 @@ static vx_status app_run_graph(AppObj *obj) } obj->stop_task = 1; - + tivxTaskWaitMsecs(100); if(obj->enable_capture == 1) { status = appStopImageSensor(obj->sensorObj.sensor_name, ((1 << sensorObj->num_cameras_enabled) - 1)); @@ -1726,6 +1861,7 @@ static void app_pipeline_params_defaults(AppObj *obj) obj->pipeline = -APP_BUFFER_Q_DEPTH + 1; obj->enqueueCnt = 0; obj->dequeueCnt = 0; + obj->od_pipeline = -APP_BUFFER_Q_DEPTH + 1; } static void set_sensor_defaults(SensorObj *sensorObj) -- 2.34.1