07 视频图形子系统应用
本章节介绍 GK7206 的视频图形子系统(Video Graphics Subsystem,VGS)应用示例 —— sample_vgs。该应用演示了 VGS 的各种图形处理功能,包括 cover(遮挡)、OSD(字符叠加)、luma(亮度调整)、scale(缩放)、rotate(旋转)等。
应用源码位于 SDK 目录 sample/vgs/,是开发视频图形处理相关应用的参考模板。
1 应用概述
1.1 功能特性
- Cover(遮挡):在视频画面上添加遮挡区域
- OSD(字符叠加):在视频画面上叠加文本和时间信息
- Luma(亮度调整):调整视频画面的亮度
- Scale(缩放):对视频画面进行缩放处理
- Rotate(旋转):对视频画面进行旋转(90°/180°/270°)
1.2 技术参数
| 参数 | 值 |
|---|---|
功能索引 | 0=cover+osd+luma+scale,1=rotate |
依赖 | sensor + VPSS |
输出 | RTSP 流或 VO 显示 |
1.3 测试用例列表
| index | 名称 | 指令 | 预期现象 |
|---|---|---|---|
| 0 | cover+osd+luma+scale | ./sample_vgs 0 | 叠加 cover/osd、调亮、缩放,RTSP 可见 |
| 1 | rotate | ./sample_vgs 1 | 画面旋转 |
1.4 目录结构
sample/vgs/
├── Makefile # 构建脚本
└── sample_vgs.c # 主程序2 编译与部署
2.1 前置条件
在编译本应用之前,请确保已完成以下准备工作:
- SDK 环境已搭建:参照 SDK 编译 完成交叉编译工具链和 SDK 配置
- Sensor 已连接:需连接 SC465SL 或兼容的图像传感器
2.2 编译应用
# 进入 sample 目录
cd <SDK_PATH>/sample
# 编译 vgs 示例
make -C vgs clean && make -C vgs2.3 部署到板端
# 挂载 SD 卡(推荐)
mkdir -p /sd_card
mount -t vfat /dev/mmcblk1p1 /sd_card
# 使用 SCP 传输到开发板
scp sample/vgs/sample_vgs root@<板端IP>:/sd_card/2.4 运行应用
# 添加执行权限
chmod +x /sd_card/sample_vgs
# 进入 SD 卡目录
cd /sd_card
# 运行(index 0:cover+osd+luma+scale)
./sample_vgs 0
# 或(index 1:rotate)
./sample_vgs 12.5 预期输出
成功运行后,终端会输出类似以下信息:
sample_vgs running
vgs test index: 0
...
rtsp://192.168.1.100:554/livestream/0拉流后可以看到:
- 画面上有遮挡区域(cover)
- 画面上有叠加文本(OSD)
- 画面亮度有所调整(luma)
- 画面尺寸有所变化(scale)
3 内部执行逻辑详解
3.1 应用架构
本应用采用以下架构:
Sensor → VI → VPSS → VGS → VENC → RTSP 推流3.2 VGS 初始化流程
// 步骤 1:系统初始化
sample_comm_sys_init(&sys_config);
// 步骤 2:ISP 初始化
sample_comm_isp_init();
// 步骤 3:VI 启动
sample_comm_vi_start(...);
// 步骤 4:VPSS 启动
sample_comm_vpss_start(...);
// 步骤 5:VGS 初始化
xmedia_vgs_init();
// 步骤 6:配置 VGS 任务
xmedia_vgs_handle_t vgs_handle = xmedia_vgs_begin_job(...);
// 添加 cover 任务
xmedia_vgs_add_cover_task(vgs_handle, &cover_attr);
// 添加 OSD 任务
xmedia_vgs_add_osd_task(vgs_handle, &osd_attr);
// 添加 luma 任务
xmedia_vgs_add_luma_task(vgs_handle, &luma_attr);
// 提交任务
xmedia_vgs_end_job(vgs_handle);
// 步骤 7:VENC 启动
sample_comm_venc_start(...);
// 步骤 8:绑定模块
xmedia_bind_vpss_to_vgs(...);
xmedia_bind_vgs_to_venc(...);4 关键编程要点
4.1 Cover 配置
xmedia_vgs_cover_attr_t cover_attr;
cover_attr.enable = XMEDIA_TRUE;
cover_attr.rect.x = 100;
cover_attr.rect.y = 100;
cover_attr.rect.width = 200;
cover_attr.rect.height = 200;
cover_attr.color = 0xFF0000; // 红色4.2 OSD 配置
xmedia_vgs_osd_attr_t osd_attr;
osd_attr.enable = XMEDIA_TRUE;
osd_attr.rect.x = 10;
osd_attr.rect.y = 10;
osd_attr.rect.width = 200;
osd_attr.rect.height = 30;
osd_attr.font_color = 0xFFFFFF; // 白色
osd_attr.bg_color = 0x000000; // 黑色
strcpy(osd_attr.text, "Hello VGS");4.3 Luma 配置
xmedia_vgs_luma_attr_t luma_attr;
luma_attr.enable = XMEDIA_TRUE;
luma_attr.luma_factor = 120; // 100=正常,>100=变亮,<100=变暗4.4 Scale 配置
xmedia_vgs_scale_attr_t scale_attr;
scale_attr.enable = XMEDIA_TRUE;
scale_attr.dst_width = 640;
scale_attr.dst_height = 480;4.5 Rotate 配置
xmedia_vgs_rotate_attr_t rotate_attr;
rotate_attr.enable = XMEDIA_TRUE;
rotate_attr.rotate = VGS_ROTATE_90; // 90/180/270 度5 常见问题排查
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| OSD 不显示 | OSD 配置错误 | 检查 OSD 位置和颜色设置 |
| Cover 区域错误 | Cover 坐标超出画面 | 检查 Cover 坐标是否在有效范围内 |
| 画面过亮或过暗 | Luma 值设置不当 | 调整 Luma 值到 100 左右 |
| 缩放变形 | 宽高比不一致 | 保持目标宽高比与源一致 |
