ISVP-SDK  3.12.0
Ingenic Smart Video Platform SDK
模块 | 结构体 | 类型定义 | 函数

IVS智能分析通用接口API. 更多...

IMP_IVS 的协作图:

模块

 MoveDetection
 移动侦测接口
 

结构体

struct  IMPIVSInterface
 

类型定义

typedef struct IMPIVSInterface IMPIVSInterface
 ivs 的通用接口
 

函数

int IMP_IVS_CreateGroup (int GrpNum)
 创建通道组 更多...
 
int IMP_IVS_DestroyGroup (int GrpNum)
 销毁通道组 更多...
 
int IMP_IVS_CreateChn (int ChnNum, IMPIVSInterface *handler)
 创建IVS功能对应的通道 更多...
 
int IMP_IVS_DestroyChn (int ChnNum)
 销毁IVS功能句柄对应的通道 更多...
 
int IMP_IVS_RegisterChn (int GrpNum, int ChnNum)
 注册通道到通道组 更多...
 
int IMP_IVS_UnRegisterChn (int ChnNum)
 从通道组注消通道 更多...
 
int IMP_IVS_StartRecvPic (int ChnNum)
 通道开始接收图像 更多...
 
int IMP_IVS_StopRecvPic (int ChnNum)
 通道停止接收图像 更多...
 
int IMP_IVS_PollingResult (int ChnNum, int timeoutMs)
 阻塞判断是否可以获得IVS功能已计算出的智能分析结果 更多...
 
int IMP_IVS_GetResult (int ChnNum, void **result)
 获得IVS功能计算出的智能分析结果 更多...
 
int IMP_IVS_ReleaseResult (int ChnNum, void *result)
 释放IVS功能计算出的结果资源 更多...
 
int IMP_IVS_ReleaseData (void *vaddr)
 释放传给Datacallback的参数frame 更多...
 
int IMP_IVS_GetParam (int chnNum, void *param)
 获取通道算法参数 更多...
 
int IMP_IVS_SetParam (int chnNum, void *param)
 设置通道算法参数 更多...
 

详细描述

IVS智能分析通用接口API.

1 相关概念

IMP IVS 通过IVS通用接口API调用实例化的IMPIVSInterface以将智能分析算法嵌入到SDK中来分析SDK中的frame图像。

1.1 IMPIVSInterface

IMPIVSInterface 为通用算法接口,具体算法通过实现此接口并将其传给IMP IVS达到在SDK中运行具体算法的目的。
一个channel有且仅为单个算法实例的载体,必须将具体实现的通用算法接口传给具体的channel才能在SDK中运行算法。
IMPIVSInterface 成员param为成员函数init的参数。
IMP_IVS会在传给成员函数ProcessAsync参数的frame时对其进行外部加锁,ProcessAsync必须在使用完frame后调用IMP_IVS_ReleaseData释放frame,以免死锁。

2 使用方法

以移动侦测算法为例,函数的具体实现见sample-move_c.c文件
step.1 初始化系统,可以直接调用范例中的sample_system_init()函数。
整个应用程序只能初始化系统一次,若之前初始化了,这儿不需要再初始化。
step.2 初始化framesource
若算法所使用的framesource通道已创建,直接使用已经创建好的通道即可。
若算法所使用的framesource通道未创建,可以调用范列中的sample_framesource_init(IVS_FS_CHN, &fs_chn_attr)进行创建。
step.3 创建ivs具体算法通道组。
多个算法可以共用一个通道组,也可以分别使用通道组,具体件sample_ivs_move_init()

int sample_ivs_move_init(int grp_num)
{
int ret = 0;
ret = IMP_IVS_CreateGroup(grp_num);
if (ret < 0) {
IMP_LOG_ERR(TAG, "IMP_IVS_CreateGroup(%d) failed\n", grp_num);
return -1;
}
return 0;
}

step.4 绑定算法通道组和framesource通道组

IMPCell framesource_cell = {DEV_ID_FS, IVS_FS_CHN, 0};
IMPCell ivs_cell = {DEV_ID_IVS, 0, 0};
ret = IMP_System_Bind(&framesource_cell, &ivs_cell);
if (ret < 0) {
IMP_LOG_ERR(TAG, "Bind FrameSource channel%d and ivs0 failed\n", IVS_FS_CHN);
return -1;
}

step.5 启动framesource和算法。建议算法通道号和算法编号一致,以便可以直接对应当前操作哪一个算法。

ret = sample_framesource_streamon(IVS_FS_CHN);
if (ret < 0) {
IMP_LOG_ERR(TAG, "ImpStreamOn failed\n");
return -1;
}
ret = sample_ivs_move_start(0, 0, &inteface);
if (ret < 0) {
IMP_LOG_ERR(TAG, "sample_ivs_move_start(0, 0) failed\n");
return -1;
}

step.6 获取算法结果
Polling结果、获取结果和释放结果必须严格对应,不能中间有中断; 只有Polling结果正确返回,获取到的结果才会被更新,否则获取到的结果无法预知。

for (i = 0; i < NR_FRAMES_TO_IVS; i++) {
ret = IMP_IVS_PollingResult(0, IMP_IVS_DEFAULT_TIMEOUTMS);
if (ret < 0) {
IMP_LOG_ERR(TAG, "IMP_IVS_PollingResult(%d, %d) failed\n", 0, IMP_IVS_DEFAULT_TIMEOUTMS);
return -1;
}
ret = IMP_IVS_GetResult(0, (void **)&result);
if (ret < 0) {
IMP_LOG_ERR(TAG, "IMP_IVS_GetResult(%d) failed\n", 0);
return -1;
}
IMP_LOG_INFO(TAG, "frame[%d], result->ret=%d\n", i, result->ret);
ret = IMP_IVS_ReleaseResult(0, (void *)result);
if (ret < 0) {
IMP_LOG_ERR(TAG, "IMP_IVS_ReleaseResult(%d) failed\n", 0);
return -1;
}
}

step.7 释放资源

sample_ivs_move_stop(0, inteface);
sample_framesource_streamoff(1);
IMP_System_UnBind(&framesource_cell, &ivs_cell);
sample_ivs_move_exit(0);
sample_framesource_exit(IVS_FS_CHN);
sample_system_exit();

函数说明

int IMP_IVS_CreateChn ( int  ChnNum,
IMPIVSInterface handler 
)

创建IVS功能对应的通道

参数
[in]ChnNum通道号
[in]handlerIVS功能句柄
返回值
0成功
-1失败
备注
无.
注意
int IMP_IVS_CreateGroup ( int  GrpNum)

创建通道组

参数
[in]GrpNumIVS功能对应的通道组号
返回值
0成功
-1失败
备注
注意
int IMP_IVS_DestroyChn ( int  ChnNum)

销毁IVS功能句柄对应的通道

参数
[in]ChnNum通道号
返回值
0成功
-1失败
备注
注意
int IMP_IVS_DestroyGroup ( int  GrpNum)

销毁通道组

参数
[in]GrpNumIVS功能对应的通道组号
返回值
0成功
-1失败
备注
注意
int IMP_IVS_GetParam ( int  chnNum,
void *  param 
)

获取通道算法参数

参数
[in]ChnNumIVS功能对应的通道号
[in]param算法参数虚拟地址指针
返回值
0成功
-1失败
注意
int IMP_IVS_GetResult ( int  ChnNum,
void **  result 
)

获得IVS功能计算出的智能分析结果

参数
[in]ChnNumIVS功能对应的通道号
[in]resultIVS功能对应的通道号输出的结果,返回此通道对应的智能分析算法的结果指针,外部客户无需分配空间。
返回值
0成功
-1失败
备注
根据不同IVS功能绑定的通道,输出其对应的结果.
注意
int IMP_IVS_PollingResult ( int  ChnNum,
int  timeoutMs 
)

阻塞判断是否可以获得IVS功能已计算出的智能分析结果

参数
[in]ChnNumIVS功能对应的通道号
[in]timeout最大等待时间,单位ms; IMP_IVS_DEFAULT_TIMEOUTMS:库内部默认的等待时间,0:不等待,>0:用户设定的等待时间
返回值
0成功
-1失败
备注
只有该通道创建时参数IMPIVSInterface结构体中ProcessAsync函数成员返回0时,即实际检测正常返回时,此Polling函数才返回成功
注意
int IMP_IVS_RegisterChn ( int  GrpNum,
int  ChnNum 
)

注册通道到通道组

参数
[in]GrpNumIVS功能对应的通道组号
[in]ChnNumIVS功能对应的通道号
返回值
0成功
-1失败
备注
将号为Chnnum的通道注册到号为Grpnum通道组中
注意
int IMP_IVS_ReleaseData ( void *  vaddr)

释放传给Datacallback的参数frame

参数
[in]vaddr释放的空间虚拟地址
返回值
0成功
-1失败
备注
必须使用此函数释放传给Datacallback的frame参数,否则肯定造成死锁。
此接口仅供算法提供商使用,算法使用客户无须关注。
注意
int IMP_IVS_ReleaseResult ( int  ChnNum,
void *  result 
)

释放IVS功能计算出的结果资源

参数
[in]GrpNum通道组号
[in]ChnNumIVS功能对应的通道号
[in]resultIVS功能对应的通道号输出的结果
返回值
0成功
-1失败
备注
根据不同IVS功能绑定的通道,释放其输出的结果资源.
注意
int IMP_IVS_SetParam ( int  chnNum,
void *  param 
)

设置通道算法参数

参数
[in]ChnNumIVS功能对应的通道号
[in]param算法参数虚拟地址指针
返回值
0成功
-1失败
注意
int IMP_IVS_StartRecvPic ( int  ChnNum)

通道开始接收图像

参数
[in]ChnNum通道号
返回值
0成功
-1失败
备注
通道号为Chnnum的IVS功能通道开始接收图像做智能分析
注意
int IMP_IVS_StopRecvPic ( int  ChnNum)

通道停止接收图像

参数
[in]ChnNum通道号
返回值
0成功
-1失败
备注
通道号为Chnnum的IVS功能通道停止接收图像,暂停智能分析
注意
int IMP_IVS_UnRegisterChn ( int  ChnNum)

从通道组注消通道

参数
[in]ChnNumIVS功能对应的通道号
返回值
0成功
-1失败
备注
从号为Grpnum的通道组中注销号为Chnnum通道
注意