Dear Sir,
With reference to the thread.
The Application pipeline is as follows:
[vx_image buffer[4] -> vx_object Array myarr ] - > Scalar Node -> Pre-processing Node -> TIDL Node -> Post-Processing(Seg) Node -> Mosaic Node
No sensor and Capture node is present, we are getting output vx_image Buffer[4] from other applications.
This is the pipeline snippet
static vx_status app_run_graph_for_one_frame_pipeline_cam_buffer(AppObj *obj, vx_uint32* frame_id, vx_uint32 frame_last) { //printf("inside pipeline cam_buffer:%d\n",*frame_id); vx_status status = VX_SUCCESS; vx_status stat = VX_SUCCESS; static char camera_frame_name[128]; int enqueueCount = 0; #ifndef SINGLE_CAM vx_int32 obj_array_idx = -1; #endif #if OUT ImgMosaicObj *imgMosaicObj = &obj->imgMosaicObj; vx_image mosaic_output_image; uint32_t num_refs; #endif appPerfPointBegin(&obj->total_perf); if (obj->pipeline <= 0) { // make name makeCaptureFilename(camera_frame_name, 128, *frame_id); vx_char output_file_name[500]; fill_ObjectArray(obj->cdc.last_images[0],obj->input.myarr[0]); //vx_image to vx_object_array fill_ObjectArray(obj->cdc.last_images[1],obj->input.myarr[1]); fill_ObjectArray(obj->cdc.last_images[2],obj->input.myarr[2]); fill_ObjectArray(obj->cdc.last_images[2],obj->input.myarr[3]); /* Enqueue inputs during pipeup dont execute */ status = vxGraphParameterEnqueueReadyRef(obj->graph, obj->scalerObj.graph_parameter_index, (vx_reference*)&obj->myinput_images[obj->enqueueCnt], 1); #if OUT { status = vxGraphParameterEnqueueReadyRef(obj->graph, imgMosaicObj->graph_parameter_index, (vx_reference*)&imgMosaicObj->output_image[obj->enqueueCnt], 1); } #endif obj->enqueueCnt++; obj->enqueueCnt = (obj->enqueueCnt >= APP_BUFFER_Q_DEPTH)? 0 : obj->enqueueCnt; obj->pipeline++; enqueueCount++; } if (obj->pipeline > 0) { vx_image capture_input_image; uint32_t num_refs; vx_bool enqueueNext = vx_true_e; /* Dequeue input */ status = vxGraphParameterDequeueDoneRef(obj->graph, obj->scalerObj.graph_parameter_index, (vx_reference*)&capture_input_image, 1, &num_refs); #if OUT vx_char output_file_name[APP_MAX_FILE_PATH]; // Dequeue output / if (status == VX_SUCCESS) { status = vxGraphParameterDequeueDoneRef(obj->graph, imgMosaicObj->graph_parameter_index, (vx_reference*)&mosaic_output_image, 1, &num_refs); } APP_PRINTF("Mosaic App Writing Outputs Start...\n"); snprintf(output_file_name, APP_MAX_FILE_PATH, "mosaic_output_%010d_%dx%d.yuv", *frame_id,MOSAIC_DISPLAY_WIDTH,MOSAIC_DISPLAY_HEIGHT); printf("Output file name:%s\n",output_file_name); status = writeMosaicOutput(output_file_name, mosaic_output_image); APP_PRINTF("Mosaic App Writing Outputs Done!\n"); // Enqueue output / if(status == VX_SUCCESS) { status = vxGraphParameterEnqueueReadyRef(obj->graph, imgMosaicObj->graph_parameter_index, (vx_reference*)&mosaic_output_image, 1); } #endif // enqueue next frame if (enqueueNext == vx_true_e) { // make name makeCaptureFilename(camera_frame_name, 128, *frame_id); app_find_object_array_indexes(obj->input.myarr, (vx_reference)capture_input_image, 4, &obj_array_idx); //printf("obj_array_idx = %d\n",obj_array_idx); fill_ObjectArray(obj->cdc.last_images[0],obj->input.myarr[0]); fill_ObjectArray(obj->cdc.last_images[1],obj->input.myarr[1]); fill_ObjectArray(obj->cdc.last_images[2],obj->input.myarr[2]); fill_ObjectArray(obj->cdc.last_images[3],obj->input.myarr[3]); /* Enqueue input - start execution */ status = vxGraphParameterEnqueueReadyRef(obj->graph, obj->scalerObj.graph_parameter_index, (vx_reference*)&capture_input_image, 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); return status; }
I have tested that object array obj->input.myarr has all four channel outputs.
I am getting mosaic dumps
this is the first dump which has camera 0 output in all four images, the next dump has camera 1, and so on.
We are filling the post-proc output in the same way it is filled in other applications for multiple channel
vx_int32 idx = 0; obj->imgMosaicObj.input_arr[idx++] = obj->segpostProcObj.output_image_arr; obj->imgMosaicObj.num_inputs = idx; status = app_create_graph_img_mosaic(obj->graph, &obj->imgMosaicObj);
Please let me know your opinion on the pipeline snippet, possible reasons and guidance for debugging the same.
Thanks and Regards,
Vyom Mishra