跳转至

region 快速入门

1. 概述与作用

本样例将介绍如何在VI(chn)、VPSS(grp、chn)、VENC(chn)上叠加不同类型的区域,达到显示位图、色块、线框、线条的效果。

它通过在 VI、VPSS、VENC 三个不同媒体模块上 attach 各类区域(OVERLAY / COVER / COVEREX / CORNER_RECT / CORNER_RECTEX / LINEEX),覆盖位图叠加、纯色遮挡、检测框、画线等用法。每个 case 启动一条 VI→VPSS→VENC 的 H.265 编码链路,attach 区域后再通过 rgn_sample_pause() 等待用户回车,回车后销毁区域并停止通路运行,便可在 VENC 输出的 H.265 流中观察叠加效果。

2. 执行准备

在编译本样例之前,请参照Hi3516CV610环境搭建指南和快速上手指南完成编译环境的搭建。

2.1 编译

进入样例目录执行 make 即可完成编译:

cd samples/mpp/region && make

编译成功之后,在当前目录下会生成一个sample_region的可执行文件,可以放社区支持的开发板上运行。

2.2 加载 KO

ko加载脚本位于 output/mpp/ko/load_ko,有两个脚本,load3516cv610_20s和load3516cv610_20s_debug。区别为load3516cv610_20s_debug脚本会打开 logmpp_show=1(日志记录)、proc_show=1(proc信息打印),并将 mem_process_isolation 置为 0(不启用进程间mmz隔离)。

由于当前版本不支持进程间mmz隔离,因此需要在load3516cv610_20s脚本中将 mem_process_isolation 置为 0或者使用load3516cv610_20s_debug脚本,此处以load3516cv610_20s_debug脚本为例,20s内存大小为128MB,默认分配为 32MB OS、96MB MMZ,加载命令为:

./load3516cv610_20s_debug -i

可以通过-h命令查看具体用法:

./load3516cv610_20s_debug -h
Usage:  ./load3516cv610_20s_debug [-option] [-sensor0~1] 
options:
    -i                       insert modules
    -r                       remove modules
    -a                       remove modules first, then insert modules
    -sensor0~1 sensor_name   config sensor type    [default: hy006_3814_0011]
    -mmz_start               config MMZ start addr [default: 0x42000000]
    -mmz_size                config MMZ mem size [unit: M, default: 96M]
    -ir_auto                 config ir_auto enable [default: 0]
    -profile                 config sys_profile [default: 0]
    -h                       help information
Available sensors:hy006_3814_0011 bt1120/bt656/bt601
for example: ./load3516cv610_20s_debug -i -sensor0 hy006_3814_0011 -sensor1 hy006_3814_0011 -mmz_start 0x42000000 -mmz_size 96M -ir_auto 1

如果需要调整os和mmz的大小,需要参考《内存布局调整指南》对内存大小进行调整。

如果是使用社区默认提供的镜像,这些ko已经打包到文件系统中,烧录到单板上后位于/ko目录下,在系统启动后会自动加载这些ko。

2.3 运行时依赖

在运行样例前,需要提前准备:

  • 指定运行时依赖的so库路径

MPP样例依赖的so库位于soc/libs/musl下,需要将该目录下的so库拷贝到开发板上(或将这些so库所在的目录挂载到开发板上),并指定运行时依赖库的环境变量,假设这些so库位于/mnt/libs/,执行如下命令:

```shell
export LD_LIBRARY_PATH=/mnt/libs/:$LD_LIBRARY_PATH
```

如果是使用社区默认提供的镜像,这些so库已经打包到文件系统中,烧录到单板上后位于/usr/lib目录下,该目录是系统默认搜索目录,不需要执行export LD_LIBRARY_PATH命令去指定。

  • 启动MPP服务

当前MPP媒体模块处于用户态,通过一个独立进程提供相关接口的调用服务,该进程位于samples/mpp/sdk_server下,执行如下命令即可生成sdk_server可执行文件:

```shell
cd samples/mpp/sdk_server && make
```

在单板上执行./sdk_server &即可启动MPP服务。

  1. sdk_server同样依赖soc/libs/musl下的so库,因此也需要参照上述export LD_LIBRARY_PATH指定路径;
  2. 如果是使用社区默认提供的镜像,sdk_server进程已经打包到文件系统中,烧录到单板上后位于/usr/bin目录下,并在系统启动时会自动启动sdk_server。
  • 样例运行时候需要的资源文件

对于本样例,为samples/mpp/region/res/mm.bmp,需要将res目录放置于本样例运行的同目录下。

2.4 运行样例

可以执行./sample_region -h查看用法。

image-20260810115039317

3. 支持的 Case 列表

调用语法为 ./sample_region <index>,index 为单数字 0–7。具体含义如下。

index 说明
0 VI COVEREX — 在 VI chn 0 挂 3 个 OT_RGN_COVEREX(默认 OT_VI_OFFLINE_VPSS_OFFLINE wrap 模式(具体概念参考VI模块文档))
1 VENC OVERLAY — 在 VENC chn 0 挂 8 个 OT_RGN_OVERLAY,载入 ./res/mm.bmp 位图;切到 OT_VI_ONLINE_VPSS_ONLINE
2 VPSS GRP COVER — VPSS group 0 挂 1 个 OT_RGN_COVER(dev 级 attach)
3 VPSS CHN COVER — VPSS chn 0 挂 2 个 OT_RGN_COVER
4 VPSS CHN CORNER_RECT — VPSS chn 0 挂 2 个 OT_RGN_CORNER_RECT
5 VPSS CHN CORNER_RECTEX — 2 个 OT_RGN_CORNER_RECTEX,禁用 VPSS wrap
6 VPSS CHN LINEEX — 4 个 OT_RGN_LINEEX,禁用 VPSS wrap
7 VENC OVERLAY DRAW LINE — 8 个 OT_RGN_OVERLAY 在 VENC chn 0,sample_comm_set_osd_drawline(OT_TRUE);画 8 条 OSD 线(thick=8,color=1/2/3),用 set_bit_map 或 get_canvas 两种方式

3.1 case 0 - VI COVEREX

本case实现在VI的码流上显示1个实心矩形,1个空心矩形,1个空心四边形,如图1所示。

图 1 效果示例图

应用场景为在VI的输出码流上操作:

  • 对画面的某块区域进行遮挡时,可以对指定区域叠加纯色块。
  • 重点突出画面的某块区域或某个目标,可以使用空心框圈出来。例如人脸识别时,有一线框框住人脸。

调用命令

./sample_region 0
输出文件

H.265 编码流:stream_chn0.h265。该路径由 VENC 通用机制写入(实现位于 common/sample_comm_venc.c:2497-2509)。

控制台日志

启动时打印当前 case 名与 attach 信息;rgn_sample_pause() 等待用户回车(提示按回车继续)。回车后拆除并打印绿色 program exit normally! 或红色 program exit abnormally!。

正确性判断

满足以下三点视为通过:

  1. 控制台无 Error: / failed 行。
  2. stream_chn0.h265 存在且非空,ffplay stream_chn0.h265 或 VLC 可正常播放。
  3. 显示一个空心四边形,一个纯色矩形,一个空心矩形

如 stream_chn0.h265 缺失,常见原因为未在 region/ 目录启动、VENC 通道启动失败、 sensor 未出图。

软件配置流程

  1. 创建 COVEREX 区域,参考接口 ss_mpi_rgn_create
  2. 设置 COVEREX 相关属性(坐标、大小、形状),参考接口 ss_mpi_rgn_attach_to_chn 中的属性 ss_rgn_chn_attr
  3. 将 COVEREX 绑定到 VI chn上,参考接口 ss_mpi_rgn_attach_to_chn
  4. 将 COVEREX 从 VI chn 上解绑,参考接口 ss_mpi_rgn_detach_from_chn
  5. 销毁 COVEREX,参考接口 ss_mpi_rgn_destroy

数据流

COVEREX的数据流图如图2所示。

图 2 COVEREX的数据流图

3.2 case 1 - VENC OVERLAY

本case实现在VENC的码流上显示8个位图。这8个位图的原图是同一个,通过转换为不同像素格式进行呈现。像素格式分别为 ARGB1555、ARGB4444、CLUT2、CLUT4、CLUT2_2X2、CLUT4_2X2、CLUT2_4X4、CLUT4_4X4。

位图使用

  • SDK包提供了根据不同像素格式将BMP图转化为相应内存形式的方法,具体可参考如下文件:samples/mpp/common/loadbmp.c
  • 只有将位图转化为内存形式后,才能对位图进行叠加、更新等相应的操作
  • 位图更新的方法有两种,通过调用相应接口来实现:set_bmp 或 get_canvas + update_canvas。其中要实现局部更新,只能使用接口 get_canvas + update_canvas

效果呈现

本case应用场景为在VENC的码流上操作:

  • 可以在画面上显示中文、英文、数字,例如在每一帧画面显示时间戳,1秒或10秒更新一次。
  • 可以对叠加在画面上的图片进行整体或局部更新,对于特定像素格式的图片,还可以分别设置图片的前景和后景的透明度,以达到需要的显示效果。

调用命令

./sample_region 1
输出文件

H.265 编码流:stream_chn0.h265。该路径由 VENC 通用机制写入(实现位于 common/sample_comm_venc.c:2497-2509)。

控制台日志

启动时打印当前 case 名与 attach 信息;rgn_sample_pause() 等待用户回车(提示按回车继续)。回车后拆除并打印绿色 program exit normally! 或红色 program exit abnormally!。

正确性判断

满足以下三点视为通过:

  1. 控制台无 Error: / failed 行。
  2. stream_chn0.h265 存在且非空,ffplay stream_chn0.h265 或 VLC 可正常播放。
  3. 显示八个不同像素格式的 mm.bmp 位图

如 stream_chn0.h265 缺失,常见原因为未在 region/ 目录启动、VENC 通道启动失败、 sensor 未出图。位图载入失败时优先检查 ./res/mm.bmp 是否存在、样例的执行目录是否正确。

软件配置流程

  1. 创建 OVERLAY 区域,参考接口 ss_mpi_rgn_create(overlay的像素格式、背景色、大小等属性也在此接口设置)
  2. 设置 OVERLAY 属性,参考接口 ss_mpi_rgn_attach_to_chn 中的属性 ss_rgn_chn_attr
  3. 将 OVERLAY 绑定到 VENC chn 上,参考接口 ss_mpi_rgn_attach_to_chn
  4. 将位图读入内存,参考 sample 中的 region_mst_load_bmp
  5. 将位图载入 OVERLAY,参考接口ss_mpi_rgn_set_bmp/ss_mpi_rgn_get_canvas_info + ss_mpi_rgn_update_canvas
  6. 将 OVERLAY 从 VENC chn 上解绑,参考接口 ss_mpi_rgn_detach_from_chn
  7. 销毁 OVERLAY,参考接口 ss_mpi_rgn_destroy

数据流

OVERLAY的数据流图如图3所示。

图 3 OVERLAY的数据流图

3.3 case 2 - VPSS GRP COVER

本case实现在VPSS GRP的码流上叠加一个COVER,实现遮挡效果,如图4所示。

图 4 GRP COVER效果图

应用场景为:在VPSS GRP的码流上操作,VPSS的一个GRP能够对接多个chn,也就是多个chn能同时出一样的码流,这就是VPSS GRP的一出多。如果希望多个chn上的码流在相同位置增加遮挡效果,可直接在 GRP上叠加 COVER。而无需对每一个chn进行同样的操作。

调用命令

./sample_region 2
输出文件

H.265 编码流:stream_chn0.h265。该路径由 VENC 通用机制写入(实现位于 common/sample_comm_venc.c:2497-2509)。

控制台日志

启动时打印当前 case 名与 attach 信息;rgn_sample_pause() 等待用户回车(提示按回车继续)。回车后拆除并打印绿色 program exit normally! 或红色 program exit abnormally!。

正确性判断

满足以下三点视为通过:

  1. 控制台无 Error: / failed 行。
  2. stream_chn0.h265 存在且非空,ffplay stream_chn0.h265 或 VLC 可正常播放。
  3. 显示一个纯色矩形

如 stream_chn0.h265 缺失,常见原因为未在 region/ 目录启动、VENC 通道启动失败、 sensor 未出图。

软件配置流程

  1. 创建 COVER 区域,参考接口 ss_mpi_rgn_create
  2. 设置 COVER 相关属性(坐标、大小、形状),参考接口 ss_mpi_rgn_attach_to_dev 中的属性 ss_rgn_chn_attr
  3. 将 COVER 绑定到 VPSS grp 上,参考接口 ss_mpi_rgn_attach_to_dev
  4. 将 COVER 从 VPSS grp 上解绑,参考接口 ss_mpi_rgn_detach_from_dev
  5. 销毁 COVER,参考接口 ss_mpi_rgn_destroy

数据流

GRP COVER数据流图如图5所示。

图 5 GRP COVER数据流图

3.4 case 3 - VPSS CHN COVER

本case实现在VPSS chn的码流上叠加一个实心COVER,一个空心COVER,效果如图6所示。

图 6 效果图

应用场景:在VPSS chn的码流上操作,如果VPSS的一个grp只对接一个chn,那么无论在grp上还是在chn的码流上实现遮挡功能,都一样。但是如果是一个grp对接多个chn,而且想分别在每个chn的码流上实现位置、大小不同的遮挡效果,那么只能分别对每个chn进行叠加自定义的COVER。

调用命令

./sample_region 3
输出文件

H.265 编码流:stream_chn0.h265。该路径由 VENC 通用机制写入(实现位于 common/sample_comm_venc.c:2497-2509)。

控制台日志

启动时打印当前 case 名与 attach 信息;rgn_sample_pause() 等待用户回车(提示按回车继续)。回车后拆除并打印绿色 program exit normally! 或红色 program exit abnormally!。

正确性判断

满足以下三点视为通过:

  1. 控制台无 Error: / failed 行。
  2. stream_chn0.h265 存在且非空,ffplay stream_chn0.h265 或 VLC 可正常播放。
  3. 显示一个纯色矩形,一个空心矩形

如 stream_chn0.h265 缺失,常见原因为未在 region/ 目录启动、VENC 通道启动失败、 sensor 未出图。

软件配置流程

  1. 创建 COVER 区域,参考接口 ss_mpi_rgn_create
  2. 设置 COVER 相关属性(坐标、大小、形状),参考接口 ss_mpi_rgn_attach_to_chn 中的属性 ss_rgn_chn_attr
  3. 将 COVER 绑定到 VPSS chn 上,参考接口 ss_mpi_rgn_attach_to_chn
  4. 将 COVER 从 VPSS chn 上解绑,参考接口 ss_mpi_rgn_detach_from_chn
  5. 销毁 COVER,参考接口 ss_mpi_rgn_destroy

数据流

COVER数据流图如图7所示。

图 7 COVER数据流图

3.5 case 4 - VPSS CHN CORNER_RECT

本case实现在VPSS chn的码流上叠加一个CORNER_RECT,实现使用角框对画面中某个区域进行标记的效果。如图8所示。

图 8 CORNER_RECT效果图

应用场景:在VPSS chn的码流上操作,如果需要在码流上专门突出某个目标或某块区域,可以使用角框或线框对其进行标记。例如人脸识别。

调用命令

./sample_region 4
输出文件

H.265 编码流:stream_chn0.h265。该路径由 VENC 通用机制写入(实现位于 common/sample_comm_venc.c:2497-2509)。

控制台日志

启动时打印当前 case 名与 attach 信息;rgn_sample_pause() 等待用户回车(提示按回车继续)。回车后拆除并打印绿色 program exit normally! 或红色 program exit abnormally!。

正确性判断

满足以下三点视为通过:

  1. 控制台无 Error: / failed 行。
  2. stream_chn0.h265 存在且非空,ffplay stream_chn0.h265 或 VLC 可正常播放。
  3. 显示一个角框,一个线框

如 stream_chn0.h265 缺失,常见原因为未在 region/ 目录启动、VENC 通道启动失败、 sensor 未出图。

软件配置流程

  1. 创建 CORNER_RECT 区域,参考接口 ss_mpi_rgn_create
  2. 设置 CORNER_RECT 相关属性(坐标、大小、形状),参考接口 ss_mpi_rgn_attach_to_chn 中的属性 ss_rgn_chn_attr
  3. 将 CORNER_RECT 绑定到 VPSS chn 上,参考接口 ss_mpi_rgn_attach_to_chn
  4. 将 CORNER_RECT 从 VPSS chn 上解绑,参考接口 ss_mpi_rgn_detach_from_chn
  5. 销毁 CORNER_RECT ,参考接口 ss_mpi_rgn_destroy

数据流

CORNER_RECT数据流图如图9所示。

图 9 CORNER_RECT数据流图

3.6 case 5 - VPSS CHN CORNER_RECTEX

本case实现在VPSS chn的码流上叠加一个CORNER_RECTEX,实现使用角框对画面中某个区域进行标记的效果。如图10所示。

图 10 CORNER_RECTEX效果图

应用场景:在VPSS chn的码流上操作,如果需要在码流上需要专门突出某个目标或某块区域,可以使用角框或线框对其进行标记,例如人脸识别。

调用命令

./sample_region 5
输出文件

H.265 编码流:stream_chn0.h265。该路径由 VENC 通用机制写入(实现位于 common/sample_comm_venc.c:2497-2509)。

控制台日志

启动时打印当前 case 名与 attach 信息;rgn_sample_pause() 等待用户回车(提示按回车继续)。回车后拆除并打印绿色 program exit normally! 或红色 program exit abnormally!。

正确性判断

满足以下三点视为通过:

  1. 控制台无 Error: / failed 行。
  2. stream_chn0.h265 存在且非空,ffplay stream_chn0.h265 或 VLC 可正常播放。
  3. 显示一个角框,一个线框

如 stream_chn0.h265 缺失,常见原因为未在 region/ 目录启动、VENC 通道启动失败、 sensor 未出图。

软件配置流程

  1. 创建 CORNER_RECTEX 区域,参考接口 ss_mpi_rgn_create
  2. 设置 CORNER_RECTEX 相关属性(坐标、大小、形状),参考接口 ss_mpi_rgn_attach_to_chn 中的属性 ss_rgn_chn_attr
  3. 将 CORNER_RECTEX 绑定到 VPSS chn 上,参考接口 ss_mpi_rgn_attach_to_chn
  4. 将 CORNER_RECTEX 从 VPSS chn 上解绑,参考接口 ss_mpi_rgn_detach_from_chn
  5. 销毁 CORNER_RECTEX ,参考接口 ss_mpi_rgn_destroy

数据流

CORNER_RECTEX数据流图如图11所示。

图 11 CORNER_RECTEX数据流图

3.7 case 6 - VPSS CHN LINEEX

本case实现在VPSS chn的码流上叠加4条长度不同的直线段。效果如图12所示。

图 12 LINEEX效果图

应用场景:VPSS chn的码流上操作,在码流上实现画直线段的功能。根据自身需求,能够通过多次画线来实现任意多边形的效果。但线段数量有限制,具体可查看《MPP 媒体处理软件 V6.0 开发参考》“区域管理”章节。

调用命令

./sample_region 6
输出文件

H.265 编码流:stream_chn0.h265。该路径由 VENC 通用机制写入(实现位于 common/sample_comm_venc.c:2497-2509)。

控制台日志

启动时打印当前 case 名与 attach 信息;rgn_sample_pause() 等待用户回车(提示按回车继续)。回车后拆除并打印绿色 program exit normally! 或红色 program exit abnormally!。

正确性判断

满足以下三点视为通过:

  1. 控制台无 Error: / failed 行。
  2. stream_chn0.h265 存在且非空,ffplay stream_chn0.h265 或 VLC 可正常播放。
  3. 显示 4 条线段

如 stream_chn0.h265 缺失,常见原因为未在 region/ 目录启动、VENC 通道启动失败、 sensor 未出图。

软件配置流程

  1. 创建 LINEEX 区域,参考接口 ss_mpi_rgn_create
  2. 设置 LINEEX 相关属性(坐标、大小、形状),参考接口 ss_mpi_rgn_attach_to_chn 中的属性 ss_rgn_chn_attr
  3. 将 LINEEX 绑定到 VPSS chn 上,参考接口 ss_mpi_rgn_attach_to_chn
  4. 将 LINEEX 从 VPSS chn 上解绑,参考接口 ss_mpi_rgn_detach_from_chn
  5. 销毁 LINEEX ,参考接口 ss_mpi_rgn_destroy

数据流

LINEEX数据流图如图13所示。

图 13 LINEEX数据流图

3.8 case 7 - VENC OVERLAY DRAW LINE

本case实现分别创建像素格式为 ARGB1555、ARGB4444、CLUT2、CLUT4、CLUT2_2X2、CLUT4_2X2、CLUT2_4X4、CLUT4_4X4,背景色透明的 OVERLAY 区域,叠加到码流上,在各个 OVERLAY 上画多条直线段。效果如图14所示。

图 14 OVERLAY DRAW LINE效果图

应用场景:在VENC的码流上操作,并实现画直线段的功能,而且没有数量的限制。可用在人脸识别数量较多的场景,弥补COVER、CORNER_RECT数量不够用的情况。

调用命令

./sample_region 7
输出文件

H.265 编码流:stream_chn0.h265。该路径由 VENC 通用机制写入(实现位于 common/sample_comm_venc.c:2497-2509)。

控制台日志

启动时打印当前 case 名与 attach 信息;rgn_sample_pause() 等待用户回车(提示按回车继续)。回车后拆除并打印绿色 program exit normally! 或红色 program exit abnormally!。

正确性判断

满足以下三点视为通过:

  1. 控制台无 Error: / failed 行。
  2. stream_chn0.h265 存在且非空,ffplay stream_chn0.h265 或 VLC 可正常播放。
  3. 显示由八个不同像素格式的OSD通过画线形成的不规则图形

如 stream_chn0.h265 缺失,常见原因为未在 region/ 目录启动、VENC 通道启动失败、 sensor 未出图。位图载入失败时优先检查 ./res/mm.bmp 是否存在、样例的执行目录是否正确。

软件配置流程

  1. 创建 OVERLAY 区域,参考接口 ss_mpi_rgn_create(overlay的像素格式、背景色、大小等属性也在此接口设置)
  2. 设置 OVERLAY 属性,参考接口 ss_mpi_rgn_attach_to_chn 中的属性 ss_rgn_chn_attr
  3. 将 OVERLAY 绑定到 VENC chn 上,参考接口 ss_mpi_rgn_attach_to_chn
  4. 将位图读入内存,参考 sample 中的 region_mst_load_bmp
  5. 将位图载入 OVERLAY,参考接口 ss_mpi_rgn_set_bmp/ss_mpi_rgn_get_canvas_info + ss_mpi_rgn_update_canvas
  6. 分别在各个 OVERLAY 上画直线段,参考 sample 中的 sample_region_do_osd_drawline
  7. 将 OVERLAY 从 VENC chn 上解绑,参考接口 ss_mpi_rgn_detach_from_chn
  8. 销毁 OVERLAY,参考接口 ss_mpi_rgn_destroy

数据流

OVERLAY DRAW LINE数据流图如图15所示。

图 15 OVERLAY DRAW LINE数据流图