diff --git a/kernels/img_proc/c66/vx_dl_pre_proc_target.c b/kernels/img_proc/c66/vx_dl_pre_proc_target.c index 9b9b892..4e64d79 100644 --- a/kernels/img_proc/c66/vx_dl_pre_proc_target.c +++ b/kernels/img_proc/c66/vx_dl_pre_proc_target.c @@ -111,8 +111,16 @@ typedef struct { uint64_t l2_global_base; uint32_t alloc_size; + /**< Id of active channel,duwei add*/ + uint32_t active_channel; + } tivxDLPreProcKernelParams; +static vx_status VX_CALLBACK tivxKernelDLPreProcControl( + tivx_target_kernel_instance kernel, + uint32_t node_cmd_id, tivx_obj_desc_t *obj_desc[], + uint16_t num_params, void *priv_arg); + static tivx_target_kernel vx_dl_pre_proc_target_kernel = NULL; static vx_status VX_CALLBACK tivxKernelDLPreProcCreate @@ -485,6 +493,96 @@ static vx_status VX_CALLBACK tivxKernelDLPreProcDelete( return (status); } + +static vx_status tivxPreProcSwitchChannel(tivxDLPreProcKernelParams *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; + + 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_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 tivxKernelDLPreProcControl( + 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; + tivxDLPreProcKernelParams *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(tivxDLPreProcKernelParams) != size)) + { + VX_PRINT(VX_ZONE_ERROR, "Invalid Object Size\n"); + status = (vx_status)VX_FAILURE; + } + else + { + /* do nothing */ + } + + if ((vx_status)VX_SUCCESS == status) + { + switch (node_cmd_id) + { + case TIVX_PREPROC_SELECT_CHANNEL: + { + 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 inline void convertYCbCrToRGB(int32_t Y, int32_t Cb, int32_t Cr, float *R, float *G, float *B, float min_val, float max_val) { Y = Y - 16; @@ -2390,7 +2488,7 @@ void tivxAddTargetKernelDLPreProc() tivxKernelDLPreProcProcess, tivxKernelDLPreProcCreate, tivxKernelDLPreProcDelete, - NULL, + tivxKernelDLPreProcControl, NULL ); } (END)