OpenVX框架:节点回调

框架:节点回调
允许客户端在特定节点完成后,接收回调执行。
不能保证在Node完成后立即调用回调。回调旨在使用vx_action_e返回值,为视觉图创建简单的早期退出条件。下面是设置回调的示例:
vx_graph graph = vxCreateGraph(context);
status = vxGetStatus((vx_reference)graph);
if (status == VX_SUCCESS) {
    vx_uint8 lmin = 0, lmax = 0;
    vx_uint32 minCount = 0, maxCount = 0;
    vx_scalar scalars[] = {
        vxCreateScalar(context, VX_TYPE_UINT8, &lmin),
        vxCreateScalar(context, VX_TYPE_UINT8, &lmax),
        vxCreateScalar(context, VX_TYPE_UINT32, &minCount),
        vxCreateScalar(context, VX_TYPE_UINT32, &maxCount),
    };
    vx_array arrays[] = {
        vxCreateArray(context, VX_TYPE_COORDINATES2D, 1),
        vxCreateArray(context, VX_TYPE_COORDINATES2D, 1)
    };
    vx_node nodes[] = {
        vxMinMaxLocNode(graph, input, scalars[0], scalars[1], arrays[0], arrays[1], scalars[2], scalars[3]),
        /// 其它节点
    };
    status = vxAssignNodeCallback(nodes[0], &analyze_brightness);
    // 做其它事情
}
一旦图形被初始化并安装了回调,那么回调本身将在图形执行期间被调用。
#define MY_DESIRED_THRESHOLD (10)
vx_action analyze_brightness(vx_node node) {
    // extract the max value
    vx_action action = VX_ACTION_ABANDON;
    vx_parameter pmax = vxGetParameterByIndex(node, 2); // Max Value
    if (pmax) {
        vx_scalar smax = 0;
        vxQueryParameter(pmax, VX_PARAMETER_REF, &smax, sizeof(smax));
        if (smax) {
            vx_uint8 value = 0u;
            vxCopyScalar(smax, &value, VX_READ_ONLY, VX_MEMORY_TYPE_HOST);
            if (value >= MY_DESIRED_THRESHOLD) {
                action = VX_ACTION_CONTINUE;
            }
            vxReleaseScalar(&smax);
        }
        vxReleaseParameter(&pmax);
    }
    return action;
}
这应该非常谨慎地使用,因为它会破坏图的功率/性能效率的优化。
1)回调必须返回一个vx_action代码,指示图形处理应如何进行。
2)如果返回VX_ACTION_CONINUE,则图形将继续执行,不做任何更改。
3)如果返回VX_ACTION_ABANDON,则未指定该节点作为支配者的所有节点的执行。作为此节。
点支配者的节点将已执行。未指定任何其他节点的执行。节点回调序列,如图3-2所示。
图3-2节点回调序列
类型定义
枚举
      vx_action_e
功能
1. 类型定义
vx_action
回调响应的正式typedef。
typedef  vx_enum  vx_action;
参阅: vx_action_e
vx_nodecomplete_f
在特定节点完成后,对客户端的回调。
typedef vx_action (*vx_nodecomplete_f)(vx_node node);
参数
[in] node - 回调附加到的节点。
返回:来自vx_action_e的操作代码。
2. 枚举类型
vx_action_e
执行期间vx_nodecomplete_f的返回代码枚举。
enum vx_action_e {
    VX_ACTION_CONTINUE = VX_ENUM_BASE(VX_ID_KHRONOS, VX_ENUM_ACTION) + 0x0,
    VX_ACTION_ABANDON = VX_ENUM_BASE(VX_ID_KHRONOS, VX_ENUM_ACTION) + 0x1,
};
枚举器
VX_ACTION_CONTINUE- 继续执行图形,不做任何更改。
VX_ACTION_ABANDON- 停止执行图形。
3. 函数
vxAssignNodeCallback
将回调分配给节点。如果此节点中已经存在回调,则此函数必须返回错误,并且用户可以通过传递NULL指针,作为回调来清除回调。
vx_status vxAssignNodeCallback(
    vx_node                       node,
    vx_nodecomplete_f             callback);
参数
[in] node - 对节点的引用。
[in] callback - 与此特定节点的完成相关联的回调。
警告
这必须非常谨慎地使用,因为它可能会破坏图的功率/性能效率优化。
返回:vx_status_e枚举。
返回值
VX_SUCCESS- 已分配回调,任何其他值都表示失败。
VX_ERROR_INVALID_REFERENCE- node 不是有效的vx_node引用。 
vxRetrieveNodeCallback
检索节点上设置的当前节点,回调函数指针。
vx_nodecomplete_f vxRetrieveNodeCallback(
    vx_node         node);
参数
      [in] node - 对vx_node对象的引用。
返回:vx_nodecomplete_f指向回调函数的指针。
返回值
NULL- 未设置回调。
 节点回调函数。
4. 框架:性能测量
定义性能测量和报告接口。
在OpenVX中,vx_graph对象和vx_node对象都跟踪性能信息。客户端可以使用其各自的vxQuery<object>函数,及其属性枚举VX_<object>_PERFORMANCE,以及VX_perf_t结构来查询任一对象类型,以获得性能信息。
vx_perf_t perf;
vxQueryNode(node, VX_NODE_PERFORMANCE, &perf, sizeof(perf));
数据结构
5. 数据结构
vx_perf_t
性能衡量结构。时间或持续时间以纳秒为单位。
typedef struct _vx_perf_t {
    vx_uint64    tmp;
    vx_uint64    beg;
    vx_uint64    end;
    vx_uint64    sum;
    vx_uint64    avg;
    vx_uint64    min;
    vx_uint64    num;
    vx_uint64    max;
} vx_perf_t;
tmp - 保存上次测量值。
beg - 保存集合中的第一个测量值。
end - 保存集合中的最后一个测量值。
sum - 保存持续时间的总和。
avg - 保存持续时间的平均值。
min - 保留持续时间的最小值。
num - 保存测量值的次数。
max - 保存持续时间的最大值。
3.3.2 框架:日志
定义调试日志记录接口。
调试接口允许客户端接收OpenVX的重要调试信息,如图3-3所示。有关可能的错误列表,参考vx_status_e。
图3-3 日志消息只有在安装回调后才能接收
类型定义
功能
1. 类型定义
vx_log_callback_f
日志回调函数。
typedef void (*vx_log_callback_f)(
              vx_context context,
              vx_reference ref,
              vx_status status,
              const vx_char string[]);
2. 函数
vxAddLogEntry
向日志中添加一行。
void vxAddLogEntry(
    vx_reference           ref,
    vx_status              status,
    const char*            message,
                           ...);
posted @ 2025-03-06 19:44  吴建明wujianming  阅读(35)  评论(0)    收藏  举报