跳转至

NVR Demo 使用说明


1. 功能场景介绍

1.1 程序概述

sgs_demo_nvr是用于展示NVR(Network Video Recorder,网络视频录像机)功能的示例程序。该程序支持多路视频解码、显示、录制、抓图等功能,并提供丰富的测试用例。

1.2 主要特性

  • 多通道视频解码与显示
  • 实时视频抓图与录制
  • 画面切换与分辨率调整
  • PIP(画中画)功能
  • 缩放(ZOOM)与EPTZ(电子云台)
  • 鼠标显示与移动
  • UI图层叠加
  • 双层UI融合
  • Alpha混合与Color Key
  • FB缩放
  • 同源/异源切换
  • 静帧功能

1.3 模块架构

1.3.1 数据流

主case pipeline:

  +---------+      +---------+
  |   VDEC  | ---> |   DISP  |
  +---------+      +---------+
            framebase

使用rotate时需要用到SCL:

  +---------+      +---------+      +---------+
  |   VDEC  | ---> |   SCL   | ---> |   DISP  |
  +---------+      +---------+      +---------+
            framebase        framebase

1.3.2 程序架构

sgs_demo_nvr架构
├── 视频解码模块 (VDEC)
│   ├── H.264/H.265解码
│   ├── 通道管理
│   └── 码流发送
├── 显示模块 (DISP)
│   ├── 视频输出接口 (HDMI/VGA/MIPI/TTL/BT1120)
│   ├── 分辨率支持 (720P/1080P/4K等)
│   └── 画面布局管理
├── 图形引擎模块 (GFX)
│   ├── 缩放与旋转
│   ├── Alpha混合
│   ├── Color Key
│   └── Quick Fill
├── 帧缓冲模块 (FB)
│   ├── UI图层显示
│   ├── 双层UI融合
│   └── 鼠标图标显示
├── 缩放模块 (SCL)
│   ├── 画面缩放
│   └── EPTZ支持
├── 虚拟显示模块 (VDISP)
│   ├── 软件拼图
│   └── 多路合成
└── 编码模块 (VENC)
    ├── 抓图编码
    └── 零通道编码 (WBC)

1.4 测试用例说明

case id 说明
0 exit,退出程序
1 手动切屏
2 自动循环随机切屏,5s切换一次
3 手动切换分辨率
4 自动循环随机切换分辨率,5s切换一次
5 全屏画面显示PIP,vdec_0_0_0->scl_1_0_0->disp_0_64_0
6 DISP zoom功能
7 抓图,vdec_0_0_1->venc_8_0_0,如果需要放大:vdec_0_0_1->scl_1_0_0->venc_8_0_0
8 静帧功能,VDEC暂停通道解码
9 VDISP Case,vdec->scl->vdisp->disp
10 获取所有VDEC通道状态
11 设定HDMI输出设备参数,Csc:色彩转换信息(包含Contrast:对比度,Luma:亮度,Hue:色度,Saturation:饱和度),Gain:信号强度增益,Sharpness:锐利度
12 鼠标显示和移动
13 设置VDEC送帧间隔时间,单位:ms
14 设置alpha值,范围:0~ff,支持global与pixel,可以通过配置文件中fbArgs_xalphaType参数设置,0: global; 1: pixel
15 读取指定的UI文件数据经过GFX操作再送到framebuffer显示,GFX操作包括:1、缩放 2、旋转(0°,90°,180°,270°) 3、mirror 4、alpha blend
16 读取一张YUV420SP数据经过GFX旋转(0°,90°,180°,270°)操作后再保存到文件中
17 读指定UI文件数据到framebuffer
18 scl stretch
19 预留
20 GFX quickfill到framebuff,包括drawrect到framebuffer和colorkey设置
21 FB放大,将1920x1080放大4K显示
22 同源<->异源切换,支持hdmi&vga、hdmi&ttl、hdmi&mipi、hdmi&bt1120切换
23 零通道编码,wbc->venc->file
24 EPTZ Case,1路Pano(vdec->disp) + 5路eptz(vdec->scl->disp)
25 设置colorkey值,值为argb8888格式,例如:ff00ff00
26 双层UI融合显示Case

2. 编译环境说明

2.1 编译环境设置

在项目根目录下设置 arm64 编译环境:

export PATH=/tools/toolchain/aarch64-unknown-linux-gcc-12.4.0-glibc-2.37-gnu/bin:$PATH
export CROSS_COMPILE=aarch64-unknown-linux-gnu-12.4.0-
export ARCH=arm64
cd project
make linux-comake_mhera.emmc.glibc-12.4.0-arm64-ext4.d3.4096.fccsp16_lpddr4x_defconfig

如果选用2GB的ddr,defconfig可以使用 linux-comake_mhera.emmc.glibc-12.4.0-arm64-ext4.d3.2048.fccsp16_lpddr4x_defconfig

2.2 编译命令

# 编译整个 project
cd project
make clean;make image -j16

# 编译 NVR demo
cd sdk/verify/sample_code
make demo/nvr/nvr

2.3 编译产物

编译生成的可执行文件位于:sdk/verify/sample_code/out/arm64/app/sgs_demo_nvr


3. 运行环境说明

3.1 硬件环境

  • Comake Pi D3开发板
  • 电源、网线、串口线
  • 鼠标
  • HDMI线与4K显示屏
  • MIPI PANEL
    ┌─────────┐                   ┌────────────────┐                   ┌──────────┐
    │ 显示器A │◄─────────────────►│  开发板/EVB板  │◄─────────────────►│ 显示器B  │
    └─────────┘    HDMI直连       └────────────────┘   MIPI PANEL    └──────────┘
                                          │
                                          │ 串口/网络
                                          |
                                          ▼
                                    ┌────────────┐
                                    │    PC端    │
                                    └────────────┘
    

详细硬件连接如下所示

图片描述

3.2 DTS配置

无特殊要求

3.3 配置文件说明

配置文件config_nvr.json中主要包含:disp、fb、vdec 3个模块的参数设置。

3.3.1 DISP参数

参数 说明
dispDevNum disp 设备个数,最大为2
dispArgs_0 disp0 的参数配置
dispArgs_1 disp1 的参数配置

dispArgs_x参数说明:

参数 说明
intfType 视频输出接口,支持 hdmivgamipittlbt1120,如果为双屏同源显示支持 hdmi&vgahdmi&ttlhdmi&bt1120,D3 开发板上只支持异源 hdmi&mipi的组合
timing 支持的时序,720P_50, 720P_60, 1080P_50, 1080P_60, 1600x1200_60, 1440x900_60, 1280x1024_60, 1024x768_60, 1280x800_60, 1366x768_60, 2560x1440_30, 2560x1600_60, 3840x2160_30
chnNum 画面数量,disp0:164,disp1:132
rotate 旋转角度,0:0°, 1:90°, 2:180°, 3:270°, 4:NO ROTAT

3.3.2 FB参数

参数 说明
fbUiMix fb 双层UI融合测试,1:打开,0:关闭
fbDevNum fb 设备个数,最大为2
fbArgs_0 fb0 的参数配置
fbArgs_1 fb1 的参数配置

fbArgs_x参数说明:

参数 说明
alphaType alpha值类型,0:global; 1:pixel
mouseIconFilePath 鼠标图标文件路径,如:./cursor-arrow.dat
mousePicWidth 鼠标图标文件的宽
mousePicHeight 鼠标图标文件的高
gfxFilePath UI文件路径,argb1555格式
gfxPicWidth UI文件的宽,argb1555格式
gfxPicHeight UI文件的高,argb1555格式
gfxRotateType UI文件旋转角度,0:0°, 1:90°, 2:180°, 3:270°

3.3.3 VDEC参数

参数 说明
vdecDevNum vdec 设备个数,最大为2,nvr demo中只开启vdec0,因此只能配置为1
vdecArgs_0 vdec0 的参数配置

vdecArgs_0参数说明:

参数 说明
chnNum 通道数,1~64
compressEn 是否压缩,0:不压缩,1:LSYC0;LSYC 50%压缩率为有损压缩,使用限制:1、当开启压缩后级只能接dispdisp支持LSYD,2、当port0打开LSYC功能,port1/port2必须关闭LSYC功能;当port0关闭LSYC功能时,port1/port2各自可打开或关闭LSYC功能,3、LSYC功能不支持H265使用了多Tile划分(图像参数集PPS语法中tiles_enabled_flag为1)的码流,若解码到这类码流,LSYC功能会被强制关闭
vdecAttr vdec chn参数配置

vdecAttr参数说明:

参数 说明
chnId 通道id
picWidth 码流的宽(可以不用填写,程序中通过解析码流sps信息获取)
picHeight 码流的高(可以不用填写,程序中通过解析码流sps信息获取)
codecType 码流类型,0:h264, 1:h265
refFrameNum 最大参考帧数量,大于2时生效(可以不用填写,程序中通过解析码流sps信息获取)
esAddHead 码流是否加头,0:不加头,1:加头
filePath 码流文件路径

3.4 输入文件

  • 配置文件:sdk/verify/sample_code/demo/nvr/nvr/config_nvr.json
  • 资源文件位于sdk/verify/sample_code/demo/nvr/nvr/resource路径下:
    • UI图片:1920x1080_argb1555.bin
    • 鼠标图标:cursor_argb1555.bin
    • 码流文件:720x576@30.h265

4. 运行说明

4.1 程序部署

  1. 将编译出来的可执行文件sgs_demo_nvr拷贝到板端或者NFS/CIFS挂载目录下,并修改权限为777。

  2. 将配置文件config_nvr.json以及资源文件(UI图片、鼠标图标、码流文件)拷贝到sgs_demo_nvr同级目录,如下:

    sgs_demo_nvr                # nvr demo 可执行文件
    config_nvr.json             # 配置文件
    720x576@30.h265             # 配置文件中使用的码流文件
    1920x1080_argb1555.bin      # 配置文件中使用的UI图片
    cursor_argb1555.bin         # 配置文件中使用的鼠标图标
    

4.2 运行 Demo

./sgs_demo_nvr config_nvr.json

4.3 测试用例操作

程序运行后会显示测试用例列表,输入不同的case测试命令运行不同的case,根据终端提示进行输入。

命令行等待输入示例:

[-------Test case list------]
|-> 0: exit
|-> 1: splite windows manually
|-> 2: splite windows automatically
|-> 3: change timing manually
|-> 4: change timing automatically
|-> 5: PIP
|-> 6: zoom
|-> 7: capture pic
|-> 8: pause
|-> 9: vdisp case
|->10: get vdec state
|->11: set CSC
|->12: show mouse
|->13: set send frame time interval(ms),default is 10ms
|->14: set fb alpha, default is 0x77
|->15: copy argb and rotate by gfx
|->16: copy yuv and rotate by gfx
|->17: draw argb to framebuffer directly
|->18: scl stretch test
|->19: resvered
|->20: gfx fill
|->21: ui scaling up 1080P to 4K
|->22: Homologous–heterologous switching
|->23: wbc
|->24: eptz
|->25: set colorkey
|->26: dual layer UI blending
Please input number:

4.3.1 测试用例

用例ID 测试目标 操作步骤 执行命令 预期结果
NVR-01 多通道视频解码显示 1. 启动程序
2. 等待视频自动播放
3. 验证画面布局
程序启动后自动播放 多路视频同时解码显示,画面布局按照配置文件中的chnNum参数自动分配,显示正常无花屏
NVR-02 手动切屏功能 1. 程序启动后输入1
2. 根据提示输入切屏模式
3. 验证画面切换
输入1后根据提示操作 画面按照用户输入的模式切换,所有画面正常显示
NVR-03 自动切屏功能 1. 程序启动后输入2
2. 等待自动切换
3. 验证切换效果
输入2 每5秒自动随机切换画面布局,切换过程平滑无闪烁
NVR-04 手动切换分辨率 1. 程序启动后输入3
2. 根据提示选择分辨率
3. 验证显示效果
输入3后选择分辨率 HDMI输出分辨率切换为选定值,画面正常显示
NVR-05 自动切换分辨率 1. 程序启动后输入4
2. 等待自动切换
3. 验证显示效果
输入4 每5秒自动随机切换分辨率,切换过程正常
NVR-06 PIP画中画功能 1. 程序启动后输入5
2. 验证PIP显示效果
输入5 全屏画面显示画中画效果,数据流:vdec_0_0_0->scl_1_0_0->disp_0_64_0
NVR-07 ZOOM缩放功能 1. 程序启动后输入6
2. 根据提示选择缩放参数
3. 验证缩放效果
输入6后根据提示操作 画面按指定比例放大,可查看画面细节
NVR-08 抓图功能 1. 程序启动后输入7
2. 根据提示选择通道
3. 验证抓图文件
输入7后根据提示操作 生成抓图文件(JPEG格式),抓图内容与当前显示画面一致
NVR-09 静帧功能 1. 程序启动后输入8
2. 选择要静帧的通道
3. 验证静帧效果
输入8后选择通道 指定通道画面停止更新,其他通道继续正常播放
NVR-10 获取VDEC状态 1. 程序启动后输入10
2. 查看状态信息
输入10 终端输出所有VDEC通道的状态信息
NVR-11 设置CSC参数 1. 程序启动后输入11
2. 根据提示调整参数
3. 验证画面变化
输入11后调整参数 HDMI输出画面色彩实时变化(对比度、亮度、色度、饱和度等)
NVR-12 鼠标显示和移动 1. 程序启动后输入12
2. 移动鼠标
3. 验证鼠标显示
输入12 屏幕显示鼠标图标,鼠标移动时图标跟随移动
NVR-13 设置送帧间隔 1. 程序启动后输入13
2. 输入间隔时间
3. 验证效果
输入13后输入间隔值 VDEC送帧间隔按设定值调整
NVR-14 设置Alpha值 1. 程序启动后输入14
2. 输入Alpha值
3. 验证透明效果
输入14后输入Alpha值(0~ff) UI图层透明度按设定值变化
NVR-15 GFX缩放旋转 1. 程序启动后输入15
2. 验证GFX操作效果
输入15 UI文件经GFX缩放、旋转、镜像、Alpha混合后显示到framebuffer
NVR-16 YUV旋转保存 1. 程序启动后输入16
2. 验证保存文件
输入16 YUV420SP数据经GFX旋转后保存到文件
NVR-17 直接绘制ARGB 1. 程序启动后输入17
2. 验证显示效果
输入17 UI文件直接读取到framebuffer显示
NVR-18 SCL拉伸测试 1. 程序启动后输入18
2. 验证拉伸效果
输入18 画面经SCL拉伸后正常显示
NVR-20 GFX填充 1. 程序启动后输入20
2. 验证填充效果
输入20 GFX执行quickfill到framebuffer,包括drawrect和colorkey设置
NVR-21 FB放大功能 1. 先通过case 3设置分辨率为3840x2160
2. 修改fb_timing_width和fb_timing_height
3. 执行case 21
输入21 1920x1080画面放大到4K显示
NVR-22 同源/异源切换 1. 准备两块显示屏
2. 程序启动后输入22
3. 选择切换模式
输入22后选择模式 同源模式:两个屏幕显示相同内容;异源模式:两个屏幕显示不同内容
NVR-23 零通道编码 1. 程序启动后输入23
2. 验证编码文件
输入23 WBC数据经VENC编码后保存到文件
NVR-24 EPTZ功能 1. 程序启动后输入24
2. 验证EPTZ显示
输入24 1路全景画面+5路EPTZ画面同时显示
NVR-25 设置ColorKey 1. 程序启动后输入25
2. 输入ColorKey值
3. 验证效果
输入25后输入值 按设定的ColorKey值进行颜色键控
NVR-26 双层UI融合 1. 修改板端config.json
2. 设置fbUiMix为1
3. 程序启动后输入26
输入26 两个UI图层叠加显示,支持Alpha混合

5. 运行结果说明

5.1 正常运行状态

程序启动后,会在终端显示测试用例列表,并等待用户输入。同时屏幕上会显示配置的视频画面。

5.2 各功能场景运行结果

5.2.1 多通道视频解码显示

  • 多路视频同时解码并显示在屏幕上
  • 画面布局按照配置文件中的chnNum参数自动分配

5.2.2 画面切换功能

  • 手动切屏(case 1):根据用户输入切换画面布局
  • 自动切屏(case 2):每5秒自动随机切换画面布局

5.2.3 分辨率切换功能

  • 手动切换(case 3):用户选择分辨率进行切换
  • 自动切换(case 4):每5秒自动随机切换分辨率

5.2.4 PIP功能(case 5)

  • 全屏画面显示画中画效果
  • 数据流:vdec_0_0_0->scl_1_0_0->disp_0_64_0

5.2.5 ZOOM功能(case 6)

  • 支持画面缩放显示
  • 可放大查看画面细节

5.2.6 抓图功能(case 7)

  • 支持实时抓图保存
  • 可选是否进行放大处理

5.2.7 EPTZ功能(case 24)

  • 1路全景画面 + 5路EPTZ画面同时显示
  • 支持电子云台控制

5.3 常见问题

5.3.1 压缩功能注意事项

  • 当开启压缩后级只能接dispdisp支持LSYD
  • 当port0打开LSYC功能,port1/port2必须关闭LSYC功能
  • 当port0关闭LSYC功能时,port1/port2各自可打开或关闭LSYC功能
  • LSYC功能不支持H265使用了多Tile划分(图像参数集PPS语法中tiles_enabled_flag为1)的码流,若解码到这类码流,LSYC功能会被强制关闭

5.3.2 特殊case注意事项

FB放大功能(case 21):

  • 确保分辨率为3840x2160,可以通过case 3进行设置
  • 修改fb_timing_width和fb_timing_height为3840和2160
  • u16Xpos和u16Ypos必须为(0,0)

同源/异源切换(case 22):

  • 需要准备两块屏幕,支持hdmi&vga/hdmi&ttl/hdmi&mipi/hdmi&bt1120切换测试
  • 如果使用bt1120需要准备bt1120转hdmi转板
  • 执行转板驱动程序:./LT8618SX_BT1120_to_HDMI_Reg_setting_U2_U3_20210127 1 12
  • 确保当前分辨率和帧率为4K30
  • D3 开发板上只支持异源 hdmi&mipi的组合

双层UI融合(case 26):

  • 需要将板端/misc/config.json文件中mi_fb内容修改为特定配置,修改完成后重启
  • 使用命令ls /dev/fb*查看是否有fb2设备节点
  • 需要将程序运行的配置文件config_nvr.json中的fbUiMix值设置为1