Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Audio PR - Augmentation support [PreEmphasis Filter] #1314

Merged
merged 21 commits into from
Apr 29, 2024
Merged
Show file tree
Hide file tree
Changes from 20 commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
83d5cbf
Bump rocm-docs-core[api_reference] from 0.34.0 to 0.34.2 in /docs/sph…
dependabot[bot] Feb 16, 2024
886684e
Bump cryptography from 42.0.0 to 42.0.2 in /docs/sphinx (#1289)
dependabot[bot] Feb 18, 2024
cf47a7f
Merge branch 'develop' of https://github.com/ROCm/MIVisionX into develop
Mar 13, 2024
f196208
Add PreEmphasis filter support
Mar 13, 2024
1e89c02
Fix ROI - change from xy to width & height
swetha097 Mar 13, 2024
b19a9ad
PR comments resolution in the PreEmphais Filter
swetha097 Mar 19, 2024
e92ffe4
Minor Changes
swetha097 Mar 20, 2024
b94144c
Change the borderType enum to int32 from uint32 dtype
swetha097 Mar 21, 2024
5808d6b
Fix validation of preemphasis
swetha097 Mar 21, 2024
33eb1ce
Remove the memcopy of the src and dest rois as it can be handled in t…
swetha097 Mar 21, 2024
8c4a98e
Formatting change - minor
swetha097 Mar 21, 2024
e197789
Minor update - remove the 2nd instance of preemphasis filter
swetha097 Mar 22, 2024
6615b27
Remove roi_tensor_ptr_dst as its unused after latest changes
swetha097 Mar 22, 2024
84100bd
Remove the dst_roi arg from vxExtRppPreemphasisFilter call as its unused
swetha097 Mar 22, 2024
a592da3
Update CHANGELOG.md
swetha097 Apr 11, 2024
3a09b7f
Merge remote-tracking branch 'upstream/develop' into swbs_m1/audio/pr3
SundarRajan28 Apr 17, 2024
d0691b6
Update changelog
SundarRajan28 Apr 17, 2024
80b55a5
Merge remote-tracking branch 'upstream/develop' into HEAD
swetha097 Apr 18, 2024
1e92a6c
Merge branch 'develop' into swbs_m1/audio/pr3
swetha097 Apr 18, 2024
83991ea
Resolve minor PR comments
swetha097 Apr 18, 2024
d2cd027
Resolve PR comments
swetha097 Apr 26, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ Documentation for MIVisionX is available at
### Additions

* Support for advanced GPUs
* Support for PreEmphasis Filter augmentation in openVX extensions

### Optimizations

Expand Down
1 change: 1 addition & 0 deletions amd_openvx_extensions/amd_rpp/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@ list(APPEND SOURCES
source/tensor/Nop.cpp
source/tensor/Rotate.cpp
source/tensor/Pixelate.cpp
source/tensor/PreemphasisFilter.cpp
source/tensor/Rain.cpp
source/tensor/Resize.cpp
source/tensor/ResizeCrop.cpp
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,7 @@ vx_status LensCorrection_Register(vx_context);
vx_status Noise_Register(vx_context);
vx_status Nop_Register(vx_context);
vx_status Pixelate_Register(vx_context);
vx_status PreemphasisFilter_Register(vx_context);
vx_status Rain_Register(vx_context);
vx_status Resize_Register(vx_context);
vx_status ResizeCrop_Register(vx_context);
Expand Down Expand Up @@ -279,5 +280,6 @@ vx_status SequenceRearrange_Register(vx_context);
#define VX_KERNEL_RPP_NOP_NAME "org.rpp.Nop"
#define VX_KERNEL_RPP_RESIZE_NAME "org.rpp.Resize"
#define VX_KERNEL_RPP_SEQUENCEREARRANGE_NAME "org.rpp.SequenceRearrange"
#define VX_KERNEL_RPP_PREEMPHASISFILTER_NAME "org.rpp.PreemphasisFilter"

#endif //_AMDVX_EXT__PUBLISH_KERNELS_H_
1 change: 1 addition & 0 deletions amd_openvx_extensions/amd_rpp/include/internal_rpp.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ vx_node createNode(vx_graph graph, vx_enum kernelEnum, vx_reference params[], vx
vx_status createRPPHandle(vx_node node, vxRppHandle ** pHandle, Rpp32u batchSize, Rpp32u deviceType);
vx_status releaseRPPHandle(vx_node node, vxRppHandle * handle, Rpp32u deviceType);
void fillDescriptionPtrfromDims(RpptDescPtr &descPtr, vxTensorLayout layout, size_t *tensorDims);
void fillAudioDescriptionPtrFromDims(RpptDescPtr &descPtr, size_t *tensorDims);
RpptDataType getRpptDataType(vx_enum dataType);

class Kernellist
Expand Down
3 changes: 2 additions & 1 deletion amd_openvx_extensions/amd_rpp/include/kernels_rpp.h
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,8 @@ extern "C"
VX_KERNEL_RPP_SEQUENCEREARRANGE = VX_KERNEL_BASE(VX_ID_AMD, VX_LIBRARY_RPP) +0x70,
VX_KERNEL_RPP_SNOW = VX_KERNEL_BASE(VX_ID_AMD, VX_LIBRARY_RPP) + 0x71,
VX_KERNEL_RPP_VIGNETTE = VX_KERNEL_BASE(VX_ID_AMD, VX_LIBRARY_RPP) + 0x72,
VX_KERNEL_RPP_WARPAFFINE = VX_KERNEL_BASE(VX_ID_AMD, VX_LIBRARY_RPP) + 0x73
VX_KERNEL_RPP_WARPAFFINE = VX_KERNEL_BASE(VX_ID_AMD, VX_LIBRARY_RPP) + 0x73,
VX_KERNEL_RPP_PREEMPHASISFILTER = VX_KERNEL_BASE(VX_ID_AMD, VX_LIBRARY_RPP) + 0x74
};

#ifdef __cplusplus
Expand Down
12 changes: 12 additions & 0 deletions amd_openvx_extensions/amd_rpp/include/vx_ext_rpp.h
Original file line number Diff line number Diff line change
Expand Up @@ -1864,6 +1864,18 @@ extern "C"
* successful creation should be checked using <tt>\ref vxGetStatus</tt>.
*/
SHARED_PUBLIC vx_node VX_API_CALL vxExtRppSequenceRearrange(vx_graph graph, vx_tensor pSrc, vx_tensor pDst, vx_array pNewOrder, vx_scalar layout);

/*! \brief [Graph] Applies preemphasis filter to the input tensor.
* \ingroup group_amd_rpp
* \param [in] graph The handle to the graph.
* \param [in] pSrc The input tensor in <tt>\ref VX_TYPE_FLOAT32</tt> format data.
* \param [in] pSrcRoi The input tensor of batch size in <tt>unsigned int<tt> containing the roi values for the input in xywh (w- samples, h - channels) format.
swetha097 marked this conversation as resolved.
Show resolved Hide resolved
* \param [out] pDst The output tensor in <tt>\ref VX_TYPE_FLOAT32</tt> format data.
* \param [in] pPreemphCoeff The input array in <tt>\ref VX_TYPE_FLOAT32</tt> format containing the preEmphasis co-efficient.
* \param [in] borderType The type of border <tt>\ref VX_TYPE_INT32</tt> which can be "zero", "clamp", "reflect".
* \return A node reference <tt>\ref vx_node</tt>. Any possible errors preventing a successful creation should be checked using <tt>\ref vxGetStatus</tt>.
*/
SHARED_PUBLIC vx_node VX_API_CALL vxExtRppPreemphasisFilter(vx_graph graph, vx_tensor pSrc, vx_tensor pSrcRoi, vx_tensor pDst, vx_array pPreemphCoeff, vx_scalar borderType);
#ifdef __cplusplus
}
#endif
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,7 @@ vx_status get_kernels_to_publish()
STATUS_ERROR_CHECK(ADD_KERNEL(Noise_Register));
STATUS_ERROR_CHECK(ADD_KERNEL(Nop_Register));
STATUS_ERROR_CHECK(ADD_KERNEL(Pixelate_Register));
STATUS_ERROR_CHECK(ADD_KERNEL(PreemphasisFilter_Register));
STATUS_ERROR_CHECK(ADD_KERNEL(Rain_Register));
STATUS_ERROR_CHECK(ADD_KERNEL(Resize_Register));
STATUS_ERROR_CHECK(ADD_KERNEL(ResizeCrop_Register));
Expand Down
30 changes: 30 additions & 0 deletions amd_openvx_extensions/amd_rpp/source/kernel_rpp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2540,6 +2540,24 @@ VX_API_CALL vx_node VX_API_CALL vxExtRppSequenceRearrange(vx_graph graph, vx_ten
return node;
}

VX_API_ENTRY vx_node VX_API_CALL vxExtRppPreemphasisFilter(vx_graph graph, vx_tensor pSrc, vx_tensor pSrcRoi, vx_tensor pDst, vx_array pPreemphCoeff, vx_scalar borderType) {
vx_node node = NULL;
vx_context context = vxGetContext((vx_reference)graph);
if (vxGetStatus((vx_reference)context) == VX_SUCCESS) {
vx_uint32 devType = getGraphAffinity(graph);
vx_scalar deviceType = vxCreateScalar(vxGetContext((vx_reference)graph), VX_TYPE_UINT32, &devType);
vx_reference params[] = {
(vx_reference)pSrc,
(vx_reference)pSrcRoi,
(vx_reference)pDst,
(vx_reference)pPreemphCoeff,
(vx_reference)borderType,
(vx_reference)deviceType};
node = createNode(graph, VX_KERNEL_RPP_PREEMPHASISFILTER, params, 6);
}
return node;
}

RpptDataType getRpptDataType(vx_enum vxDataType) {
switch(vxDataType) {
case vx_type_e::VX_TYPE_FLOAT32:
Expand Down Expand Up @@ -2609,6 +2627,18 @@ void fillDescriptionPtrfromDims(RpptDescPtr &descPtr, vxTensorLayout layout, siz
}
}

void fillAudioDescriptionPtrFromDims(RpptDescPtr &descPtr, size_t *tensorDims) {
descPtr->n = tensorDims[0];
descPtr->h = tensorDims[2];
descPtr->w = tensorDims[1];
descPtr->c = 1;
descPtr->strides.nStride = descPtr->c * descPtr->w * descPtr->h;
descPtr->strides.hStride = descPtr->c * descPtr->w;
descPtr->strides.wStride = descPtr->c;
descPtr->strides.cStride = 1;
descPtr->numDims = 4;
}

// utility functions
vx_node createNode(vx_graph graph, vx_enum kernelEnum, vx_reference params[], vx_uint32 num)
{
Expand Down
211 changes: 211 additions & 0 deletions amd_openvx_extensions/amd_rpp/source/tensor/PreemphasisFilter.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,211 @@
/*
Copyright (c) 2024 Advanced Micro Devices, Inc. All rights reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/

#include "internal_publishKernels.h"

struct PreemphasisFilterLocalData {
vxRppHandle *handle;
Rpp32u deviceType;
RppPtr_t pSrc;
RppPtr_t pDst;
vx_int32 borderType;
Rpp32f *pPreemphCoeff;
RpptDescPtr pSrcDesc;
RpptDescPtr pDstDesc;
Rpp32u *pSampleSize;
size_t inputTensorDims[RPP_MAX_TENSOR_DIMS];
size_t outputTensorDims[RPP_MAX_TENSOR_DIMS];
};

static vx_status VX_CALLBACK refreshPreemphasisFilter(vx_node node, const vx_reference *parameters, PreemphasisFilterLocalData *data) {
vx_status status = VX_SUCCESS;
void *roi_tensor_ptr_src;
STATUS_ERROR_CHECK(vxCopyArrayRange((vx_array)parameters[3], 0, data->pSrcDesc->n, sizeof(float), data->pPreemphCoeff, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
if (data->deviceType == AGO_TARGET_AFFINITY_GPU) {
#if ENABLE_OPENCL || ENABLE_HIP
return VX_ERROR_NOT_IMPLEMENTED;
#endif
}
if (data->deviceType == AGO_TARGET_AFFINITY_CPU) {
STATUS_ERROR_CHECK(vxQueryTensor((vx_tensor)parameters[0], VX_TENSOR_BUFFER_HOST, &data->pSrc, sizeof(data->pSrc)));
STATUS_ERROR_CHECK(vxQueryTensor((vx_tensor)parameters[1], VX_TENSOR_BUFFER_HOST, &roi_tensor_ptr_src, sizeof(roi_tensor_ptr_src)));
STATUS_ERROR_CHECK(vxQueryTensor((vx_tensor)parameters[2], VX_TENSOR_BUFFER_HOST, &data->pDst, sizeof(data->pDst)));
}
RpptROI *src_roi = reinterpret_cast<RpptROI *>(roi_tensor_ptr_src);
for (int n = 0; n < data->inputTensorDims[0]; n++)
data->pSampleSize[n] = src_roi[n].xywhROI.roiWidth * src_roi[n].xywhROI.roiHeight;

return status;
}

static vx_status VX_CALLBACK validatePreemphasisFilter(vx_node node, const vx_reference parameters[], vx_uint32 num, vx_meta_format metas[]) {
vx_status status = VX_SUCCESS;
vx_enum scalar_type;
STATUS_ERROR_CHECK(vxQueryScalar((vx_scalar)parameters[4], VX_SCALAR_TYPE, &scalar_type, sizeof(scalar_type)));
if (scalar_type != VX_TYPE_INT32)
return ERRMSG(VX_ERROR_INVALID_TYPE, "validate: Paramter: #4 type=%d (must be size)\n", scalar_type);

// Check for input parameters
size_t num_tensor_dims;
STATUS_ERROR_CHECK(vxQueryTensor((vx_tensor)parameters[0], VX_TENSOR_NUMBER_OF_DIMS, &num_tensor_dims, sizeof(num_tensor_dims)));
if (num_tensor_dims < 3) return ERRMSG(VX_ERROR_INVALID_DIMENSION, "validate: PreemphasisFilter: tensor: #0 dimensions=%lu (must be greater than or equal to 3)\n", num_tensor_dims);

// Check for output parameters
vx_uint8 tensor_fixed_point_position;
size_t tensor_dims[RPP_MAX_TENSOR_DIMS];
vx_enum tensor_datatype;
STATUS_ERROR_CHECK(vxQueryTensor((vx_tensor)parameters[2], VX_TENSOR_NUMBER_OF_DIMS, &num_tensor_dims, sizeof(num_tensor_dims)));
if (num_tensor_dims < 3) return ERRMSG(VX_ERROR_INVALID_DIMENSION, "validate: PreemphasisFilter: tensor: #2 dimensions=%lu (must be greater than or equal to 3)\n", num_tensor_dims);

STATUS_ERROR_CHECK(vxQueryTensor((vx_tensor)parameters[2], VX_TENSOR_DIMS, &tensor_dims, sizeof(tensor_dims)));
STATUS_ERROR_CHECK(vxQueryTensor((vx_tensor)parameters[2], VX_TENSOR_DATA_TYPE, &tensor_datatype, sizeof(tensor_datatype)));
STATUS_ERROR_CHECK(vxQueryTensor((vx_tensor)parameters[2], VX_TENSOR_FIXED_POINT_POSITION, &tensor_fixed_point_position, sizeof(tensor_fixed_point_position)));
STATUS_ERROR_CHECK(vxSetMetaFormatAttribute(metas[2], VX_TENSOR_NUMBER_OF_DIMS, &num_tensor_dims, sizeof(num_tensor_dims)));
STATUS_ERROR_CHECK(vxSetMetaFormatAttribute(metas[2], VX_TENSOR_DIMS, &tensor_dims, sizeof(tensor_dims)));
STATUS_ERROR_CHECK(vxSetMetaFormatAttribute(metas[2], VX_TENSOR_DATA_TYPE, &tensor_datatype, sizeof(tensor_datatype)));
STATUS_ERROR_CHECK(vxSetMetaFormatAttribute(metas[2], VX_TENSOR_FIXED_POINT_POSITION, &tensor_fixed_point_position, sizeof(tensor_fixed_point_position)));
return status;
}

static vx_status VX_CALLBACK processPreemphasisFilter(vx_node node, const vx_reference *parameters, vx_uint32 num) {
RppStatus rpp_status = RPP_SUCCESS;
vx_status return_status = VX_SUCCESS;
PreemphasisFilterLocalData *data = NULL;
STATUS_ERROR_CHECK(vxQueryNode(node, VX_NODE_LOCAL_DATA_PTR, &data, sizeof(data)));
refreshPreemphasisFilter(node, parameters, data);
if (data->deviceType == AGO_TARGET_AFFINITY_GPU) {
#if ENABLE_OPENCL || ENABLE_HIP
return_status = VX_ERROR_NOT_IMPLEMENTED;
#endif
}
if (data->deviceType == AGO_TARGET_AFFINITY_CPU) {
rpp_status = rppt_pre_emphasis_filter_host((float *)data->pSrc, data->pSrcDesc, (float *)data->pDst, data->pDstDesc, (Rpp32s *)data->pSampleSize, data->pPreemphCoeff, RpptAudioBorderType(data->borderType), data->handle->rppHandle);
return_status = (rpp_status == RPP_SUCCESS) ? VX_SUCCESS : VX_FAILURE;
}
return return_status;
}

static vx_status VX_CALLBACK initializePreemphasisFilter(vx_node node, const vx_reference *parameters, vx_uint32 num) {
PreemphasisFilterLocalData *data = new PreemphasisFilterLocalData;
memset(data, 0, sizeof(PreemphasisFilterLocalData));
swetha097 marked this conversation as resolved.
Show resolved Hide resolved

vx_enum input_tensor_datatype, output_tensor_datatype;
STATUS_ERROR_CHECK(vxCopyScalar((vx_scalar)parameters[5], &data->deviceType, VX_READ_ONLY, VX_MEMORY_TYPE_HOST));
STATUS_ERROR_CHECK(vxReadScalarValue((vx_scalar)parameters[4], &data->borderType));

// Querying for input tensor
data->pSrcDesc = new RpptDesc;
STATUS_ERROR_CHECK(vxQueryTensor((vx_tensor)parameters[0], VX_TENSOR_NUMBER_OF_DIMS, &data->pSrcDesc->numDims, sizeof(data->pSrcDesc->numDims)));
STATUS_ERROR_CHECK(vxQueryTensor((vx_tensor)parameters[0], VX_TENSOR_DIMS, &data->inputTensorDims, sizeof(vx_size) * data->pSrcDesc->numDims));
STATUS_ERROR_CHECK(vxQueryTensor((vx_tensor)parameters[0], VX_TENSOR_DATA_TYPE, &input_tensor_datatype, sizeof(input_tensor_datatype)));
data->pSrcDesc->dataType = getRpptDataType(input_tensor_datatype);
data->pSrcDesc->offsetInBytes = 0;
fillAudioDescriptionPtrFromDims(data->pSrcDesc, data->inputTensorDims);

// Querying for output tensor
data->pDstDesc = new RpptDesc;
STATUS_ERROR_CHECK(vxQueryTensor((vx_tensor)parameters[2], VX_TENSOR_NUMBER_OF_DIMS, &data->pDstDesc->numDims, sizeof(data->pDstDesc->numDims)));
STATUS_ERROR_CHECK(vxQueryTensor((vx_tensor)parameters[2], VX_TENSOR_DIMS, &data->outputTensorDims, sizeof(vx_size) * data->pDstDesc->numDims));
STATUS_ERROR_CHECK(vxQueryTensor((vx_tensor)parameters[2], VX_TENSOR_DATA_TYPE, &output_tensor_datatype, sizeof(output_tensor_datatype)));
data->pDstDesc->dataType = getRpptDataType(output_tensor_datatype);
data->pDstDesc->offsetInBytes = 0;
fillAudioDescriptionPtrFromDims(data->pDstDesc, data->outputTensorDims);

data->pSampleSize = new unsigned[data->pSrcDesc->n];
data->pPreemphCoeff = new float[data->pSrcDesc->n];

refreshPreemphasisFilter(node, parameters, data);
STATUS_ERROR_CHECK(createRPPHandle(node, &data->handle, data->pSrcDesc->n, data->deviceType));
STATUS_ERROR_CHECK(vxSetNodeAttribute(node, VX_NODE_LOCAL_DATA_PTR, &data, sizeof(data)));
return VX_SUCCESS;
}

static vx_status VX_CALLBACK uninitializePreemphasisFilter(vx_node node, const vx_reference *parameters, vx_uint32 num) {
PreemphasisFilterLocalData *data;
STATUS_ERROR_CHECK(vxQueryNode(node, VX_NODE_LOCAL_DATA_PTR, &data, sizeof(data)));
delete[] data->pSampleSize;
swetha097 marked this conversation as resolved.
Show resolved Hide resolved
delete[] data->pPreemphCoeff;
delete data->pSrcDesc;
delete data->pDstDesc;
STATUS_ERROR_CHECK(releaseRPPHandle(node, data->handle, data->deviceType));
delete data;
return VX_SUCCESS;
}

//! \brief The kernel target support callback.
// TODO::currently the node is setting the same affinity as context. This needs to change when we have hybrid modes in the same graph
static vx_status VX_CALLBACK query_target_support(vx_graph graph, vx_node node,
vx_bool use_opencl_1_2, // [input] false: OpenCL driver is 2.0+; true: OpenCL driver is 1.2
vx_uint32 &supported_target_affinity // [output] must be set to AGO_TARGET_AFFINITY_CPU or AGO_TARGET_AFFINITY_GPU or (AGO_TARGET_AFFINITY_CPU | AGO_TARGET_AFFINITY_GPU)
) {
vx_context context = vxGetContext((vx_reference)graph);
AgoTargetAffinityInfo affinity;
vxQueryContext(context, VX_CONTEXT_ATTRIBUTE_AMD_AFFINITY, &affinity, sizeof(affinity));
if (affinity.device_type == AGO_TARGET_AFFINITY_GPU)
supported_target_affinity = AGO_TARGET_AFFINITY_GPU;
else
supported_target_affinity = AGO_TARGET_AFFINITY_CPU;

return VX_SUCCESS;
}

vx_status PreemphasisFilter_Register(vx_context context) {
vx_status status = VX_SUCCESS;
// Add kernel to the context with callbacks
vx_kernel kernel = vxAddUserKernel(context, "org.rpp.PreemphasisFilter",
VX_KERNEL_RPP_PREEMPHASISFILTER,
processPreemphasisFilter,
6,
validatePreemphasisFilter,
initializePreemphasisFilter,
uninitializePreemphasisFilter);
ERROR_CHECK_OBJECT(kernel);
AgoTargetAffinityInfo affinity;
vxQueryContext(context, VX_CONTEXT_ATTRIBUTE_AMD_AFFINITY, &affinity, sizeof(affinity));
#if ENABLE_OPENCL || ENABLE_HIP
// enable OpenCL buffer access since the kernel_f callback uses OpenCL buffers instead of host accessible buffers
vx_bool enableBufferAccess = vx_true_e;
if (affinity.device_type == AGO_TARGET_AFFINITY_GPU)
STATUS_ERROR_CHECK(vxSetKernelAttribute(kernel, VX_KERNEL_ATTRIBUTE_AMD_GPU_BUFFER_ACCESS_ENABLE, &enableBufferAccess, sizeof(enableBufferAccess)));
#else
vx_bool enableBufferAccess = vx_false_e;
#endif
amd_kernel_query_target_support_f query_target_support_f = query_target_support;

if (kernel) {
STATUS_ERROR_CHECK(vxSetKernelAttribute(kernel, VX_KERNEL_ATTRIBUTE_AMD_QUERY_TARGET_SUPPORT, &query_target_support_f, sizeof(query_target_support_f)));
PARAM_ERROR_CHECK(vxAddParameterToKernel(kernel, 0, VX_INPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
PARAM_ERROR_CHECK(vxAddParameterToKernel(kernel, 1, VX_INPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
PARAM_ERROR_CHECK(vxAddParameterToKernel(kernel, 2, VX_OUTPUT, VX_TYPE_TENSOR, VX_PARAMETER_STATE_REQUIRED));
PARAM_ERROR_CHECK(vxAddParameterToKernel(kernel, 3, VX_INPUT, VX_TYPE_ARRAY, VX_PARAMETER_STATE_REQUIRED));
PARAM_ERROR_CHECK(vxAddParameterToKernel(kernel, 4, VX_INPUT, VX_TYPE_SCALAR, VX_PARAMETER_STATE_REQUIRED));
PARAM_ERROR_CHECK(vxAddParameterToKernel(kernel, 5, VX_INPUT, VX_TYPE_SCALAR, VX_PARAMETER_STATE_REQUIRED));
PARAM_ERROR_CHECK(vxFinalizeKernel(kernel));
}
if (status != VX_SUCCESS) {
exit:
vxRemoveKernel(kernel);
return VX_FAILURE;
}

return status;
}