系统控制模块,包括IMP的基础功能以及模块间绑定的相关功能
更多...
系统控制模块,包括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时(实例化)时被指定具体功能。
例如:
- 对于Encoder,一个Channel完成一路H264编码或者JPEG编码的功能,具体的编码功能(类型,参数)在通道创建时指定
- 对于IVS,一个Channel完成一个具体的算法的功能,具体的算法类型参数在通道创建时指定
- 对于OSD,有一个同Channel类似的概念Region,一个Region是一个具体的叠加区域,可以是PIC(图像),COVER(遮挡)等
- 对于FrameSource,一个Channel输出一路原始图像,FrameSource的Channel实际上就是Group
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的例子。
在上图中,实现了FrameSource的一路输出Bind到Encoder的一个Group。 在Encoder Group中Register了两个Channel,因此Encoder Group有H264和JPEG两路输出。 参考代码:
if (ret < 0)
printf("Bind FrameSource Channel0 and Encoder Group0 failed\n");
Bind将系统的数据流串接起来,根据不同的产品功能需求,Bind的策略也可能不同。
以下是典型双路码流产品应用Bind的示意图:
上图中,FrameSource有两路输出,分别是Channel0主码流(1280x720)和Channel1从码流(640x360)。
- 主码流:FrameSource的Channel0 Bind OSD Group.0,OSD Group.0 Bind Encoder Group.0。其中:
- OSD Group.0 注册了两个Region,分别用来显示时间戳和字符串信息
- Encoder Group.0 注册了两个Channel,分别进行H264编码和JPEG编码。其中JPEG编码通道的图像大小如果不等于输入设置(FrameSource的Channel0),那么就会进行缩放(Software at T10),达到任意分辨率抓拍的目的
- 从码流:FrameSource的Channel1 Bind IVS Group.0,IVS Group.0 Bind OSD Group.1,OSD Group.1 Bind Encoder Group.1。其中:
- IVS Group.0 注册了一个Channel,用来进行移动侦测
- OSD Group.1 注册了两个Region,分别用来显示时间戳和字符串信息
- Encoder Group.1 注册了一个Channel,进行H264编码
- 这里值得注意的一点是,IVS Bind 在 OSD之前,是因为OSD的时间戳可能造成IVS移动侦测的误判
参考代码:
主码流数据流Bind:
if (ret < 0)
printf("Bind FrameSource Channel0 and OSD Group0 failed\n");
if (ret < 0)
printf("Bind OSD Group0 and Encoder Group0 failed\n");
从码流数据流Bind:
if (ret < 0)
printf("Bind FrameSource Channel1 and IVS Group0 failed\n");
if (ret < 0)
printf("Bind IVS Group0 and OSD Group1 failed\n");
if (ret < 0)
printf("Bind OSD Group1 and Encoder Group1 failed\n");
- 注意
- 建议所有的Bind的操作在系统初始化时进行。
-
在FrameSource使能后Bind和UnBind操作不能动态调用,需要Disable FrameSource后才可进行UnBind。
-
DestroyGroup要在UnBind之后才能进行。
Bind可以呈树状结构,下图是一个例子:
上图中,FrameSource的Channel 1(Group.1)后端分别Bind了两个Group,分别从Output.0和 Output.1输出数据。本例中这样Bind的好处是,IVS Group可以与OSD Group.1并行工作。
- 注意
- 此例中的Bind方式可能对普通移动侦测造成影响,因此普通移动侦测不建议采用这种方式。
绑定源Cell和目的Cell.
- 参数
-
[in] | srcCell | 源Cell指针. |
[in] | dstCell | 目的Cell指针. |
- 返回值
-
- 注意
- 无。
int IMP_System_Exit |
( |
void |
| ) |
|
IMP系统去初始化.
- 参数
-
- 返回值
-
- 注意
- 在调用此API后,若要再次使用IMP则需重新进行IMP系统初始化.
获取绑定在目的Cell的源Cell信息.
- 参数
-
[in] | dstCell | 目的Cell指针. |
[out] | srcCell | 源Cell指针. |
- 返回值
-
- 注意
- 无。
const char * IMP_System_GetCPUInfo |
( |
void |
| ) |
|
int64_t IMP_System_GetTimeStamp |
( |
void |
| ) |
|
获得IMP系统的时间戳,单位为微秒。
- 参数
-
- 返回值
-
- 注意
- 无。
int IMP_System_GetVersion |
( |
IMPVersion * |
pstVersion | ) |
|
获取IMP系统版本号.
- 参数
-
[out] | pstVersion | IMP系统版本号结构体指针. |
- 返回值
-
- 注意
- 无.
int IMP_System_Init |
( |
void |
| ) |
|
IMP系统初始化.
- 参数
-
- 返回值
-
- 注意
- 在IMP的任何操作之前必须先调用此接口进行初始化.
uint32_t IMP_System_ReadReg32 |
( |
uint32_t |
u32Addr | ) |
|
int IMP_System_RebaseTimeStamp |
( |
int64_t |
basets | ) |
|
设置IMP系统的时间戳,单位为微秒。
- 参数
-
- 返回值
-
- 注意
- 无。
解除源Cell和目的Cell的绑定.
- 参数
-
[in] | srcCell | 源Cell指针. |
[in] | dstCell | 目的Cell指针. |
- 返回值
-
- 注意
- 无。
void IMP_System_WriteReg32 |
( |
uint32_t |
regAddr, |
|
|
uint32_t |
value |
|
) |
| |
向32位寄存器中写值。
- 参数
-
[in] | regAddr | 寄存器的物理地址。 |
[in] | value | 要写入的值。 |
- 返回值
-
- 注意
- 在不明确寄存器的含义之前请谨慎调用此API,否则可能会导致系统错误。