diff --git a/kernels/img_proc/c66/vx_image_preprocessing_target.c b/kernels/img_proc/c66/vx_image_preprocessing_target.c index 56d27ca..757b532 100644 --- a/kernels/img_proc/c66/vx_image_preprocessing_target.c +++ b/kernels/img_proc/c66/vx_image_preprocessing_target.c @@ -61,7 +61,7 @@ */ - +#include #include #include #include @@ -129,6 +129,9 @@ typedef struct { uint32_t l2_heap_id; uint64_t l2_global_base; + /**< Id of active channel */ + uint32_t active_channel; + } tivxImgPreProcKernelParams; static vx_status img_proc_pipeline_blocks_nv12ToRgbp @@ -192,6 +195,51 @@ static vx_status img_proc_execute_16bit_RgbiToRgbp void *out_tensor_target_ptr ); +static vx_status tivxPreProcSwitchChannel(tivxImgPreProcKernelParams *preproc, + const tivx_obj_desc_user_data_object_t *usr_data_obj) +{ + vx_status status = (vx_status)VX_SUCCESS; + tivx_preproc_select_channel_params_t *ch_prms = NULL; + void *target_ptr; + + // printf("-----start switch channel ----- \n"); + if (NULL != usr_data_obj) + { + target_ptr = tivxMemShared2TargetPtr(&usr_data_obj->mem_ptr); + + tivxCheckStatus(&status, tivxMemBufferMap(target_ptr, usr_data_obj->mem_size, + (vx_enum)VX_MEMORY_TYPE_HOST, (vx_enum)VX_READ_ONLY)); + + if (sizeof(tivx_preproc_select_channel_params_t) == + usr_data_obj->mem_size) + { + ch_prms = (tivx_preproc_select_channel_params_t *)target_ptr; + preproc->active_channel = ch_prms->active_preproc_channel_id; + } + else + { + VX_PRINT(VX_ZONE_ERROR, "Invalid Size \n"); + status = (vx_status)VX_ERROR_INVALID_PARAMETERS; + } + + tivxCheckStatus(&status, tivxMemBufferUnmap(target_ptr, usr_data_obj->mem_size, + (vx_enum)VX_MEMORY_TYPE_HOST, (vx_enum)VX_READ_ONLY)); + } + else + { + VX_PRINT(VX_ZONE_ERROR, "User Data Object is NULL \n"); + status = (vx_status)VX_ERROR_INVALID_PARAMETERS; + } + + return (status); +} + +static vx_status VX_CALLBACK tivxKernelImgPreProcControl( + tivx_target_kernel_instance kernel, + uint32_t node_cmd_id, tivx_obj_desc_t *obj_desc[], + uint16_t num_params, void *priv_arg); + + static vx_status dma_create(DMAObj *dmaObj, vx_size transfer_type, vx_uint32 dma_ch) { vx_status status = VX_SUCCESS; @@ -637,6 +685,58 @@ static vx_status VX_CALLBACK tivxKernelImgPreProcDelete( return (status); } +static vx_status VX_CALLBACK tivxKernelImgPreProcControl( + tivx_target_kernel_instance kernel, + uint32_t node_cmd_id, tivx_obj_desc_t *obj_desc[], + uint16_t num_params, void *priv_arg) +{ + vx_status status = (vx_status)VX_SUCCESS; + uint32_t size; + tivxImgPreProcKernelParams *preproc = NULL; + + status = tivxGetTargetKernelInstanceContext(kernel, + (void **)&preproc, &size); + + if ((vx_status)VX_SUCCESS != status) + { + VX_PRINT(VX_ZONE_ERROR, "Failed to Get Target Kernel Instance Context\n"); + } + else if ((NULL == preproc) || + (sizeof(tivxImgPreProcKernelParams) != size)) + { + VX_PRINT(VX_ZONE_ERROR, "Invalid Object Size\n"); + status = (vx_status)VX_FAILURE; + } + else + { + /* do nothing */ + // printf("Success to Get PreProc Target Kernel Instance Context\n"); + } + + if ((vx_status)VX_SUCCESS == status) + { + switch (node_cmd_id) + { + case TIVX_PREPROC_SELECT_CHANNEL: + { + // printf("hahahahhahhahahahahhahahahahhahaha"); + status = tivxPreProcSwitchChannel(preproc, + (tivx_obj_desc_user_data_object_t *)obj_desc[0U]); + break; + } + default: + { + VX_PRINT(VX_ZONE_ERROR, "Invalid Command Id\n"); + status = (vx_status)VX_FAILURE; + break; + } + } + } + + return (status); +} + + static vx_status VX_CALLBACK tivxKernelImgPreProcProcess ( tivx_target_kernel_instance kernel, @@ -691,6 +791,8 @@ static vx_status VX_CALLBACK tivxKernelImgPreProcProcess tivx_obj_desc_image_t *in_img_desc; void* in_image_target_ptr[2]; + uint32_t active_channel; + active_channel = prms->active_channel; tivx_obj_desc_tensor_t *out_tensor_desc; void *out_tensor_target_ptr; @@ -699,7 +801,14 @@ static vx_status VX_CALLBACK tivxKernelImgPreProcProcess configuration_target_ptr = tivxMemShared2TargetPtr(&configuration_desc->mem_ptr); tivxMemBufferMap(configuration_target_ptr, configuration_desc->mem_size, VX_MEMORY_TYPE_HOST,VX_READ_ONLY); - in_img_desc = (tivx_obj_desc_image_t *)obj_desc[TIVX_KERNEL_IMG_PREPROCESS_INPUT_IMAGE_IDX]; + // in_img_desc = (tivx_obj_desc_image_t *)obj_desc[TIVX_KERNEL_IMG_PREPROCESS_INPUT_IMAGE_IDX]; + in_img_desc = (tivx_obj_desc_image_t *) + tivxGetObjDescElement(obj_desc[TIVX_KERNEL_IMG_PREPROCESS_INPUT_IMAGE_IDX], + active_channel); + if (in_img_desc == NULL) + { + status = (vx_status)VX_FAILURE; + } in_image_target_ptr[0] = tivxMemShared2TargetPtr(&in_img_desc->mem_ptr[0]); tivxMemBufferMap(in_image_target_ptr[0], in_img_desc->mem_size[0], TIVX_MEMORY_TYPE_DMA, VX_READ_ONLY); in_image_target_ptr[1] = NULL; @@ -790,7 +899,7 @@ void tivxAddTargetKernelImgPreProc() tivxKernelImgPreProcProcess, tivxKernelImgPreProcCreate, tivxKernelImgPreProcDelete, - NULL, + tivxKernelImgPreProcControl, NULL ); } (END)