ISVP-SDK  3.12.0
Ingenic Smart Video Platform SDK
结构体 | 函数

系统控制模块,包括IMP的基础功能以及模块间绑定的相关功能 更多...

IMP_System 的协作图:

结构体

struct  IMPVersion
 IMP系统版本号定义. 更多...
 

函数

int IMP_System_Init (void)
 IMP系统初始化. 更多...
 
int IMP_System_Exit (void)
 IMP系统去初始化. 更多...
 
int64_t IMP_System_GetTimeStamp (void)
 获得IMP系统的时间戳,单位为微秒。 更多...
 
int IMP_System_RebaseTimeStamp (int64_t basets)
 设置IMP系统的时间戳,单位为微秒。 更多...
 
uint32_t IMP_System_ReadReg32 (uint32_t regAddr)
 读取32位寄存器的值。 更多...
 
void IMP_System_WriteReg32 (uint32_t regAddr, uint32_t value)
 向32位寄存器中写值。 更多...
 
int IMP_System_GetVersion (IMPVersion *pstVersion)
 获取IMP系统版本号. 更多...
 
const char * IMP_System_GetCPUInfo (void)
 获取CPU型号信息. 更多...
 
int IMP_System_Bind (IMPCell *srcCell, IMPCell *dstCell)
 绑定源Cell和目的Cell. 更多...
 
int IMP_System_UnBind (IMPCell *srcCell, IMPCell *dstCell)
 解除源Cell和目的Cell的绑定. 更多...
 
int IMP_System_GetBindbyDest (IMPCell *dstCell, IMPCell *srcCell)
 获取绑定在目的Cell的源Cell信息. 更多...
 

详细描述

系统控制模块,包括IMP的基础功能以及模块间绑定的相关功能

1 相关概念

系统控制主要实现连接各模块,定义数据流的功能。以下是一些重要概念:

1.1 Device

Device是完成某一(类)功能的集合。如FrameSource完成视频源数据的输出,Encoder完成视频编码或者图像编码的功能。这里的FrameSource和Encoder就是Device的概念。
Device只是一个集合的概念,并不是具体的数据流节点。

1.2 Group

Group是一路数据输入的最小单位。一个Device可以有多个Group,每个Group只能接收一路数据输入。Group可以有多路输出(1.3 Output )。
Group也是具体”功能“的容器,可以详见1.5 Channel 部分的解释。

1.3 Output

Output是一个Group的一路数据输出的最小单位。一个Group可以有多个Output,每个Output只能输出一路数据。

1.4 Cell

Cell指包含了Device、Group、Output信息的集合。以IMPCell的数据结构呈现。
Cell主要用来Bind(bind)。根据Device、Group、Output的定义,Output作为数据输出的节点,而Group作为数据输入的节点。
在Bind时数据输出节点的Cell索引到输出的Output,数据输入节点的Cell索引到输入的Group(因此作为数据输入的Cell,Output是一个无意义值)。

1.5 Channel

Channel通常指一个单一功能的单元,Channel在Create时(实例化)时被指定具体功能。
例如:

Channel作为功能单元,通常需要Register到Group中(FrameSource除外),才能接收到数据。Channel注册到Group中后,会得到Group输入的数据。
不同Device的Group可Register的Channel数也不同。

2 模块绑定(Bind)

两个Group经过Bind连接后,源Group的数据会自动发到目的Group。
由于Group是数据输入的最小单元,Output是数据输出的最小单元,因此IMP_System_Bind(IMPCell *srcCell, IMPCell *dstCell)的两个参数中srcCell的deviceID, groupID, outputID是有效的 而dstCell仅deviceID和groupID有效,outputID作为数据输入是无意义的。
下图是一个简单Bind的例子。

system_bind0.jpg

在上图中,实现了FrameSource的一路输出Bind到Encoder的一个Group。 在Encoder Group中Register了两个Channel,因此Encoder Group有H264和JPEG两路输出。 参考代码:

IMPCell fs_chn0 = {DEV_ID_FS, 0, 0}; //FrameSource deviceID:DEV_ID_FS groupID:0 outputID:0
IMPCell enc_grp0 = {DEV_ID_ENC, 0, 0}; //ENC deviceID:DEV_ID_ENC groupID:0 outputID:0, 这里enc_grp0的第三个参数无意义。
int ret = IMP_System_Bind(&fs_chn0, &enc_grp0);
if (ret < 0)
printf("Bind FrameSource Channel0 and Encoder Group0 failed\n");

Bind将系统的数据流串接起来,根据不同的产品功能需求,Bind的策略也可能不同。

以下是典型双路码流产品应用Bind的示意图:

typical_application.png

上图中,FrameSource有两路输出,分别是Channel0主码流(1280x720)和Channel1从码流(640x360)。

参考代码:
主码流数据流Bind:

IMPCell fs_chn0 = {DEV_ID_FS, 0, 0};
IMPCell osd_grp0 = {DEV_ID_OSD, 0, 0};
IMPCell enc_grp0 = {DEV_ID_ENC, 0, 0};
int ret = IMP_System_Bind(&fs_chn0, &osd_grp0);
if (ret < 0)
printf("Bind FrameSource Channel0 and OSD Group0 failed\n");
int ret = IMP_System_Bind(&osd_grp0, &enc_grp0);
if (ret < 0)
printf("Bind OSD Group0 and Encoder Group0 failed\n");

从码流数据流Bind:

IMPCell fs_chn1_output0 = {DEV_ID_FS, 1, 0};
IMPCell ivs_grp0 = {DEV_ID_IVS, 0, 0};
IMPCell osd_grp1 = {DEV_ID_OSD, 1, 0};
IMPCell enc_grp1 = {DEV_ID_ENC, 1, 0};
int ret = IMP_System_Bind(&fs_chn1_output0, &ivs_grp0);
if (ret < 0)
printf("Bind FrameSource Channel1 and IVS Group0 failed\n");
int ret = IMP_System_Bind(&ivs_grp0, &osd_grp1);
if (ret < 0)
printf("Bind IVS Group0 and OSD Group1 failed\n");
int ret = IMP_System_Bind(&osd_grp1, &enc_grp1);
if (ret < 0)
printf("Bind OSD Group1 and Encoder Group1 failed\n");
注意
建议所有的Bind的操作在系统初始化时进行。
在FrameSource使能后Bind和UnBind操作不能动态调用,需要Disable FrameSource后才可进行UnBind。
DestroyGroup要在UnBind之后才能进行。

Bind可以呈树状结构,下图是一个例子:

different_output.png

上图中,FrameSource的Channel 1(Group.1)后端分别Bind了两个Group,分别从Output.0和 Output.1输出数据。本例中这样Bind的好处是,IVS Group可以与OSD Group.1并行工作。

注意
此例中的Bind方式可能对普通移动侦测造成影响,因此普通移动侦测不建议采用这种方式。

函数说明

int IMP_System_Bind ( IMPCell srcCell,
IMPCell dstCell 
)

绑定源Cell和目的Cell.

参数
[in]srcCell源Cell指针.
[in]dstCell目的Cell指针.
返回值
0成功.
非0失败.
备注
根据Device、Group和Output的概念,每个Device可能有多个Group,每个Group可能有多个Output, Group作为Device的输入接口,而Output作为Device的输出接口.因此绑定实际上是将输出Device的某 个Output连接到输入Device的某个Group上.
绑定关系成功后,源Cell(Output)产生的数据会自动传送到目的Cell(Group).
注意
无。
int IMP_System_Exit ( void  )

IMP系统去初始化.

参数
无.
返回值
0成功.
非0失败.
备注
此函数调用后会释放IMP所有的内存以及句柄,并关闭硬件单元.
注意
在调用此API后,若要再次使用IMP则需重新进行IMP系统初始化.
int IMP_System_GetBindbyDest ( IMPCell dstCell,
IMPCell srcCell 
)

获取绑定在目的Cell的源Cell信息.

参数
[in]dstCell目的Cell指针.
[out]srcCell源Cell指针.
返回值
0成功.
非0失败.
备注
无.
注意
无。
const char * IMP_System_GetCPUInfo ( void  )

获取CPU型号信息.

参数
无.
返回值
CPU型号字符串.
备注
返回值是CPU型号类型的字符串,例如对于T10来说,有"T10"及"T10-Lite".
注意
无.
int64_t IMP_System_GetTimeStamp ( void  )

获得IMP系统的时间戳,单位为微秒。

参数
无。
返回值
时间(usec)
备注
系统初始化后时间戳自动被初始化。系统去初始化后时间戳失效。
注意
无。
int IMP_System_GetVersion ( IMPVersion pstVersion)

获取IMP系统版本号.

参数
[out]pstVersionIMP系统版本号结构体指针.
返回值
0成功.
非0失败.
备注
无.
注意
无.
int IMP_System_Init ( void  )

IMP系统初始化.

参数
无.
返回值
0成功.
非0失败.
备注
此API调用后会初始化基础的数据结构,但不会初始化硬件单元.
注意
在IMP的任何操作之前必须先调用此接口进行初始化.
uint32_t IMP_System_ReadReg32 ( uint32_t  u32Addr)

读取32位寄存器的值。

参数
[in]regAddr寄存器的物理地址。
返回值
寄存器的值(32位)
备注
无。
注意
无。
int IMP_System_RebaseTimeStamp ( int64_t  basets)

设置IMP系统的时间戳,单位为微秒。

参数
[in]basets基础时间。
返回值
0成功.
非0失败.
备注
无。
注意
无。
int IMP_System_UnBind ( IMPCell srcCell,
IMPCell dstCell 
)

解除源Cell和目的Cell的绑定.

参数
[in]srcCell源Cell指针.
[in]dstCell目的Cell指针.
返回值
0成功.
非0失败.
备注
无.
注意
无。
void IMP_System_WriteReg32 ( uint32_t  regAddr,
uint32_t  value 
)

向32位寄存器中写值。

参数
[in]regAddr寄存器的物理地址。
[in]value要写入的值。
返回值
备注
无。
注意
在不明确寄存器的含义之前请谨慎调用此API,否则可能会导致系统错误。