static vx_status VX_CALLBACK vxCopyArrayOutputValidator(vx_node node, vx_uint32 index, vx_meta_format meta) { vx_status status = VX_ERROR_INVALID_PARAMETERS; if (index > 0) { vx_parameter param = vxGetParameterByIndex(node, 0); if (param) { vx_array input; vxQueryParameter(param, VX_PARAMETER_ATTRIBUTE_REF, &input, sizeof(vx_array)); if (input) { vx_enum item_type = VX_TYPE_INVALID; vx_size capacity = 0ul; status = VX_SUCCESS; status |= vxQueryArray(input, VX_ARRAY_ATTRIBUTE_ITEMTYPE, &item_type, sizeof(item_type)); status |= vxQueryArray(input, VX_ARRAY_ATTRIBUTE_CAPACITY, &capacity, sizeof(capacity)); status |= vxSetMetaFormatAttribute(meta, VX_ARRAY_ATTRIBUTE_ITEMTYPE, &item_type, sizeof(item_type)); status |= vxSetMetaFormatAttribute(meta, VX_ARRAY_ATTRIBUTE_CAPACITY, &capacity, sizeof(capacity)); vxReleaseArray(&input); } vxReleaseParameter(¶m); } } return status; }
/************************************************************************************************************ output parameter validator. *************************************************************************************************************/ static vx_status VX_CALLBACK CV_transpose_OutputValidator(vx_node node, vx_uint32 index, vx_meta_format meta) { vx_status status = VX_SUCCESS; if (index == 1) { vx_parameter output_param = vxGetParameterByIndex(node, 1); vx_image output; vx_uint32 width = 0, height = 0; vx_df_image format = VX_DF_IMAGE_VIRT; STATUS_ERROR_CHECK(vxQueryParameter(output_param, VX_PARAMETER_ATTRIBUTE_REF, &output, sizeof(vx_image))); STATUS_ERROR_CHECK(vxQueryImage(output, VX_IMAGE_ATTRIBUTE_FORMAT, &format, sizeof(format))); STATUS_ERROR_CHECK(vxQueryImage(output, VX_IMAGE_ATTRIBUTE_WIDTH, &width, sizeof(width))); STATUS_ERROR_CHECK(vxQueryImage(output, VX_IMAGE_ATTRIBUTE_HEIGHT, &height, sizeof(height))); if (format != VX_DF_IMAGE_U8 && format != VX_DF_IMAGE_S16) status = VX_ERROR_INVALID_VALUE; STATUS_ERROR_CHECK(vxSetMetaFormatAttribute(meta, VX_IMAGE_ATTRIBUTE_WIDTH, &width, sizeof(width))); STATUS_ERROR_CHECK(vxSetMetaFormatAttribute(meta, VX_IMAGE_ATTRIBUTE_HEIGHT, &height, sizeof(height))); STATUS_ERROR_CHECK(vxSetMetaFormatAttribute(meta, VX_IMAGE_ATTRIBUTE_FORMAT, &format, sizeof(format))); vxReleaseImage(&output); vxReleaseParameter(&output_param); } return status; }
static vx_status VX_CALLBACK validateROIPoolingLayer(vx_node node, const vx_reference parameters[], vx_uint32 num, vx_meta_format metas[]) { // check scalar type vx_enum type; ERROR_CHECK_STATUS(vxQueryScalar((vx_scalar)parameters[2], VX_SCALAR_TYPE, &type, sizeof(type))); if(type != VX_TYPE_NN_ROI_POOL_PARAMS) return VX_ERROR_INVALID_TYPE; // check tensor dimensions vx_size num_dims; vx_size input_dims[4], rois_dims[4], output_dims[4]; ERROR_CHECK_STATUS(vxQueryTensor((vx_tensor)parameters[0], VX_TENSOR_NUMBER_OF_DIMS, &num_dims, sizeof(num_dims))); ERROR_CHECK_STATUS(vxQueryTensor((vx_tensor)parameters[0], VX_TENSOR_DATA_TYPE, &type, sizeof(type))); if(num_dims != 4) return VX_ERROR_INVALID_DIMENSION; if(type != VX_TYPE_FLOAT32) return VX_ERROR_INVALID_TYPE; ERROR_CHECK_STATUS(vxQueryTensor((vx_tensor)parameters[1], VX_TENSOR_NUMBER_OF_DIMS, &num_dims, sizeof(num_dims))); ERROR_CHECK_STATUS(vxQueryTensor((vx_tensor)parameters[1], VX_TENSOR_DATA_TYPE, &type, sizeof(type))); if(num_dims != 4) return VX_ERROR_INVALID_DIMENSION; if(type != VX_TYPE_FLOAT32) return VX_ERROR_INVALID_TYPE; ERROR_CHECK_STATUS(vxQueryTensor((vx_tensor)parameters[1], VX_TENSOR_DIMS, rois_dims, sizeof(rois_dims))); ERROR_CHECK_STATUS(vxQueryTensor((vx_tensor)parameters[3], VX_TENSOR_NUMBER_OF_DIMS, &num_dims, sizeof(num_dims))); ERROR_CHECK_STATUS(vxQueryTensor((vx_tensor)parameters[3], VX_TENSOR_DATA_TYPE, &type, sizeof(type))); if(num_dims != 4) return VX_ERROR_INVALID_DIMENSION; if(type != VX_TYPE_FLOAT32) return VX_ERROR_INVALID_TYPE; ERROR_CHECK_STATUS(vxQueryTensor((vx_tensor)parameters[3], VX_TENSOR_DIMS, output_dims, sizeof(output_dims))); if(output_dims[3] != input_dims[3]) return VX_ERROR_INVALID_DIMENSION; // output tensor configuration type = VX_TYPE_FLOAT32; num_dims = 4; ERROR_CHECK_STATUS(vxSetMetaFormatAttribute(metas[3], VX_TENSOR_DATA_TYPE, &type, sizeof(type))); ERROR_CHECK_STATUS(vxSetMetaFormatAttribute(metas[3], VX_TENSOR_NUMBER_OF_DIMS, &num_dims, sizeof(num_dims))); ERROR_CHECK_STATUS(vxSetMetaFormatAttribute(metas[3], VX_TENSOR_DIMS, output_dims, sizeof(output_dims))); return VX_SUCCESS; }
static vx_status VX_CALLBACK vxCopyImageOutputValidator(vx_node node, vx_uint32 index, vx_meta_format meta) { vx_status status = VX_ERROR_INVALID_PARAMETERS; if (index == 1) { vx_parameter param = vxGetParameterByIndex(node, 0); /* input image */ if (param) { vx_image input = 0; vxQueryParameter(param, VX_PARAMETER_ATTRIBUTE_REF, &input, sizeof(vx_image)); if (input) { vx_uint32 width = 0, height = 0; vx_df_image format = VX_DF_IMAGE_VIRT; status = VX_SUCCESS; status |= vxQueryImage(input, VX_IMAGE_ATTRIBUTE_WIDTH, &width, sizeof(width)); status |= vxQueryImage(input, VX_IMAGE_ATTRIBUTE_HEIGHT, &height, sizeof(height)); status |= vxQueryImage(input, VX_IMAGE_ATTRIBUTE_FORMAT, &format, sizeof(format)); status |= vxSetMetaFormatAttribute(meta, VX_IMAGE_ATTRIBUTE_WIDTH, &width, sizeof(width)); status |= vxSetMetaFormatAttribute(meta, VX_IMAGE_ATTRIBUTE_HEIGHT, &height, sizeof(height)); status |= vxSetMetaFormatAttribute(meta, VX_IMAGE_ATTRIBUTE_FORMAT, &format, sizeof(format)); vxReleaseImage(&input); } vxReleaseParameter(¶m); } } return status; }
//////// // The user kernel validator callback should check to make sure that all the input // parameters have correct data types and set meta format for the output parameters. // The input parameters to be validated are: // parameter #0 -- input tensor of format VX_TYPE_INT16 // The output parameters that requires setting meta format is: // parameter #1 -- output tebsor of format VX_TYPE_INT16 with the same dimensions as input // TODO:******** // 1. Query the input tensor for the dimensions and format. // 2. Check to make sure that the input tensor format is VX_TYPE_INT16. // 3. Set the required output tensor meta data as following: // - output tensor dimensions should be same as input tensor // - output tensor format should be VX_TYPE_INT16 // - output tensor fixed-point position can be whatever the user requested // * query the output tensor for the fixed-point position value // * set the same value in output tensor meta data vx_status VX_CALLBACK tensor_cos_validator( vx_node node, const vx_reference parameters[], vx_uint32 num, vx_meta_format metas[] ) { // parameter #0 -- query dimensions and format vx_size num_of_dims; ERROR_CHECK_STATUS( vxQueryTensor( ( vx_tensor )parameters[0], VX_TENSOR_NUMBER_OF_DIMS, &num_of_dims, sizeof( num_of_dims ) ) ); if( num_of_dims > 4 ) // sanity check to avoid stack corruption with querying VX_TENSOR_DIMS below { return VX_ERROR_INVALID_DIMENSION; } vx_size dims[4]; ERROR_CHECK_STATUS( vxQueryTensor( ( vx_tensor )parameters[0], VX_TENSOR_DIMS, &dims, num_of_dims * sizeof(vx_size) ) ); vx_enum data_type; ERROR_CHECK_STATUS( vxQueryTensor( ( vx_tensor )parameters[0], VX_TENSOR_DATA_TYPE, &data_type, sizeof( data_type ) ) ); // parameter #0 -- check input tensor format to be VX_TYPE_INF16 if( data_type != VX_TYPE_INT16 ) { return VX_ERROR_INVALID_FORMAT; } // parameter #1 -- query fixed-point position vx_uint8 fixed_point_pos; ERROR_CHECK_STATUS( vxQueryTensor( ( vx_tensor )parameters[1], VX_TENSOR_FIXED_POINT_POSITION, &fixed_point_pos, sizeof( fixed_point_pos ) ) ); // parameter #1 -- set required output tensor meta data ERROR_CHECK_STATUS( vxSetMetaFormatAttribute( metas[1], VX_TENSOR_NUMBER_OF_DIMS, &num_of_dims, sizeof( num_of_dims ) ) ); ERROR_CHECK_STATUS( vxSetMetaFormatAttribute( metas[1], VX_TENSOR_DIMS, &dims, sizeof( dims ) ) ); ERROR_CHECK_STATUS( vxSetMetaFormatAttribute( metas[1], VX_TENSOR_DATA_TYPE, &data_type, sizeof( data_type ) ) ); ERROR_CHECK_STATUS( vxSetMetaFormatAttribute( metas[1], VX_TENSOR_FIXED_POINT_POSITION, &fixed_point_pos, sizeof( fixed_point_pos ) ) ); return VX_SUCCESS; }
static vx_status VX_CALLBACK vxEdgeTraceOutputValidator(vx_node node, vx_uint32 index, vx_meta_format meta) { vx_status status = VX_ERROR_INVALID_PARAMETERS; if (index == 2) { vx_parameter src_param = vxGetParameterByIndex(node, 0); if (src_param) { vx_image src = 0; vxQueryParameter(src_param, VX_PARAMETER_ATTRIBUTE_REF, &src, sizeof(src)); if (src) { vx_uint32 width = 0, height = 0; vx_df_image format = VX_DF_IMAGE_U8; vxQueryImage(src, VX_IMAGE_ATTRIBUTE_WIDTH, &width, sizeof(height)); vxQueryImage(src, VX_IMAGE_ATTRIBUTE_HEIGHT, &height, sizeof(height)); //vxQueryImage(src, VX_IMAGE_ATTRIBUTE_FORMAT, &format, sizeof(format)); vxSetMetaFormatAttribute(meta, VX_IMAGE_ATTRIBUTE_FORMAT, &format, sizeof(format)); vxSetMetaFormatAttribute(meta, VX_IMAGE_ATTRIBUTE_WIDTH, &width, sizeof(width)); vxSetMetaFormatAttribute(meta, VX_IMAGE_ATTRIBUTE_HEIGHT, &height, sizeof(height)); status = VX_SUCCESS; vxReleaseImage(&src); } vxReleaseParameter(&src_param); } } return status; }
static vx_status VX_CALLBACK validateTensorToImageKernel(vx_node node, const vx_reference parameters[], vx_uint32 num, vx_meta_format metas[]) { // check input configuration vx_enum type; vx_size num_dims, input_dims[4] = { 1, 1, 1, 1 }; ERROR_CHECK_STATUS(vxQueryTensor((vx_tensor)parameters[0], VX_TENSOR_DATA_TYPE, &type, sizeof(type))); ERROR_CHECK_STATUS(vxQueryTensor((vx_tensor)parameters[0], VX_TENSOR_NUMBER_OF_DIMS, &num_dims, sizeof(num_dims))); if (num_dims != 4) return VX_ERROR_INVALID_DIMENSION; if (type != VX_TYPE_FLOAT32) return VX_ERROR_INVALID_TYPE; ERROR_CHECK_STATUS(vxQueryTensor((vx_tensor)parameters[0], VX_TENSOR_DIMS, input_dims, sizeof(input_dims[0])*num_dims)); if ((input_dims[2] != 3 && input_dims[2] != 1) || ((input_dims[0] & 3) != 0)) return VX_ERROR_INVALID_DIMENSION; vx_enum scalar_type; ERROR_CHECK_STATUS(vxQueryScalar((vx_scalar)parameters[2], VX_SCALAR_TYPE, &scalar_type, sizeof(scalar_type))); if(scalar_type != VX_TYPE_FLOAT32) return VX_ERROR_INVALID_TYPE; ERROR_CHECK_STATUS(vxQueryScalar((vx_scalar)parameters[3], VX_SCALAR_TYPE, &scalar_type, sizeof(scalar_type))); if(scalar_type != VX_TYPE_FLOAT32) return VX_ERROR_INVALID_TYPE; ERROR_CHECK_STATUS(vxQueryScalar((vx_scalar)parameters[4], VX_SCALAR_TYPE, &scalar_type, sizeof(scalar_type))); if(scalar_type != VX_TYPE_BOOL) return VX_ERROR_INVALID_TYPE; // set output image configuration vx_uint32 width = (vx_uint32)input_dims[0]; vx_uint32 height = (vx_uint32)(input_dims[1]*input_dims[3]); vx_df_image format = (input_dims[2] == 3) ? VX_DF_IMAGE_RGB : VX_DF_IMAGE_U8; ERROR_CHECK_STATUS(vxSetMetaFormatAttribute(metas[1], VX_IMAGE_WIDTH, &width, sizeof(width))); ERROR_CHECK_STATUS(vxSetMetaFormatAttribute(metas[1], VX_IMAGE_HEIGHT, &height, sizeof(height))); ERROR_CHECK_STATUS(vxSetMetaFormatAttribute(metas[1], VX_IMAGE_FORMAT, &format, sizeof(format))); return VX_SUCCESS; }
static vx_status VX_CALLBACK validateImageToTensorKernel(vx_node node, const vx_reference parameters[], vx_uint32 num, vx_meta_format metas[]) { // check input configuration vx_uint32 width, height; vx_df_image format; ERROR_CHECK_STATUS(vxQueryImage((vx_image)parameters[0], VX_IMAGE_WIDTH, &width, sizeof(width))); ERROR_CHECK_STATUS(vxQueryImage((vx_image)parameters[0], VX_IMAGE_HEIGHT, &height, sizeof(height))); ERROR_CHECK_STATUS(vxQueryImage((vx_image)parameters[0], VX_IMAGE_FORMAT, &format, sizeof(format))); if(format != VX_DF_IMAGE_RGB && format != VX_DF_IMAGE_U8) return VX_ERROR_INVALID_FORMAT; vx_enum scalar_type; ERROR_CHECK_STATUS(vxQueryScalar((vx_scalar)parameters[2], VX_SCALAR_TYPE, &scalar_type, sizeof(scalar_type))); if(scalar_type != VX_TYPE_FLOAT32) return VX_ERROR_INVALID_TYPE; ERROR_CHECK_STATUS(vxQueryScalar((vx_scalar)parameters[3], VX_SCALAR_TYPE, &scalar_type, sizeof(scalar_type))); if(scalar_type != VX_TYPE_FLOAT32) return VX_ERROR_INVALID_TYPE; ERROR_CHECK_STATUS(vxQueryScalar((vx_scalar)parameters[4], VX_SCALAR_TYPE, &scalar_type, sizeof(scalar_type))); if(scalar_type != VX_TYPE_BOOL) return VX_ERROR_INVALID_TYPE; // check output dimensions vx_enum type; vx_size num_dims, output_dims[4] = { 1, 1, 1, 1 }; ERROR_CHECK_STATUS(vxQueryTensor((vx_tensor)parameters[1], VX_TENSOR_DATA_TYPE, &type, sizeof(type))); ERROR_CHECK_STATUS(vxQueryTensor((vx_tensor)parameters[1], VX_TENSOR_NUMBER_OF_DIMS, &num_dims, sizeof(num_dims))); if (type != VX_TYPE_FLOAT32) return VX_ERROR_INVALID_TYPE; if (num_dims != 4) return VX_ERROR_INVALID_DIMENSION; ERROR_CHECK_STATUS(vxQueryTensor((vx_tensor)parameters[1], VX_TENSOR_DIMS, output_dims, sizeof(output_dims[0])*num_dims)); if ((output_dims[2] != 3 && output_dims[2] != 1) || output_dims[0] != (size_t)width || (output_dims[1] * output_dims[3]) != (size_t)height) return VX_ERROR_INVALID_DIMENSION; // set output tensor configuration ERROR_CHECK_STATUS(vxSetMetaFormatAttribute(metas[1], VX_TENSOR_DATA_TYPE, &type, sizeof(type))); ERROR_CHECK_STATUS(vxSetMetaFormatAttribute(metas[1], VX_TENSOR_NUMBER_OF_DIMS, &num_dims, sizeof(num_dims))); ERROR_CHECK_STATUS(vxSetMetaFormatAttribute(metas[1], VX_TENSOR_DIMS, output_dims, sizeof(output_dims))); return VX_SUCCESS; }
static vx_status VX_CALLBACK validateKernel(vx_node node, const vx_reference parameters[], vx_uint32 num, vx_meta_format metas[]) { // check input configuration vx_enum type, format; vx_size num_dims, input_dims[4] = { 1, 1, 1, 1 }; ERROR_CHECK_STATUS(vxQueryTensor((vx_tensor)parameters[0], VX_TENSOR_DATA_TYPE, &type, sizeof(type))); ERROR_CHECK_STATUS(vxQueryTensor((vx_tensor)parameters[0], VX_TENSOR_NUMBER_OF_DIMS, &num_dims, sizeof(num_dims))); ERROR_CHECK_STATUS(vxQueryTensor((vx_tensor)parameters[0], VX_TENSOR_DIMS, input_dims, sizeof(input_dims[0])*num_dims)); if ((num_dims != 4 && num_dims != 3) || ((input_dims[0] & 3) != 0)) return VX_ERROR_INVALID_DIMENSION; if (type != VX_TYPE_FLOAT32) return VX_ERROR_INVALID_TYPE; // check output object type and set configuration ERROR_CHECK_STATUS(vxQueryReference(parameters[1], VX_REFERENCE_TYPE, &type, sizeof(type))); if (type == VX_TYPE_IMAGE) { vx_df_image format; ERROR_CHECK_STATUS(vxQueryImage((vx_image)parameters[1], VX_IMAGE_FORMAT, &format, sizeof(format))); if(format == VX_DF_IMAGE_U8 && input_dims[2] > 255) return VX_ERROR_INVALID_FORMAT; if(format == VX_DF_IMAGE_VIRT) format = (input_dims[2] < 256) ? VX_DF_IMAGE_U8 : VX_DF_IMAGE_U16; vx_uint32 width = (vx_uint32)input_dims[0]; vx_uint32 height = (vx_uint32)(input_dims[1]*input_dims[3]); ERROR_CHECK_STATUS(vxSetMetaFormatAttribute(metas[1], VX_IMAGE_WIDTH, &width, sizeof(width))); ERROR_CHECK_STATUS(vxSetMetaFormatAttribute(metas[1], VX_IMAGE_HEIGHT, &height, sizeof(height))); ERROR_CHECK_STATUS(vxSetMetaFormatAttribute(metas[1], VX_IMAGE_FORMAT, &format, sizeof(format))); } else if (type == VX_TYPE_TENSOR) { vx_size output_num_dims, output_dims[4] = { 1, 1, 1, 1 }; ERROR_CHECK_STATUS(vxQueryTensor((vx_tensor)parameters[1], VX_TENSOR_DATA_TYPE, &type, sizeof(type))); ERROR_CHECK_STATUS(vxQueryTensor((vx_tensor)parameters[1], VX_TENSOR_NUMBER_OF_DIMS, &output_num_dims, sizeof(output_num_dims))); ERROR_CHECK_STATUS(vxQueryTensor((vx_tensor)parameters[1], VX_TENSOR_DIMS, output_dims, sizeof(output_dims[0])*output_num_dims)); if (output_dims[2] != 1 && output_dims[2] != 2) // top_k must be 1 or 2 return VX_ERROR_INVALID_DIMENSION; if(type == VX_TYPE_UINT8 && input_dims[2] > 255) return VX_ERROR_INVALID_FORMAT; if(type != VX_TYPE_UINT8 && type != VX_TYPE_UINT16 && type != VX_TYPE_INT16) return VX_ERROR_INVALID_FORMAT; ERROR_CHECK_STATUS(vxSetMetaFormatAttribute(metas[1], VX_TENSOR_DATA_TYPE, &type, sizeof(type))); ERROR_CHECK_STATUS(vxSetMetaFormatAttribute(metas[1], VX_TENSOR_NUMBER_OF_DIMS, &output_num_dims, sizeof(output_num_dims))); ERROR_CHECK_STATUS(vxSetMetaFormatAttribute(metas[1], VX_TENSOR_DIMS, output_dims, sizeof(output_dims[0])*output_num_dims)); } else return VX_ERROR_INVALID_PARAMETERS; return VX_SUCCESS; }