5.8. 视频处理 - VSE

5.8.1. 模块描述

VSE (Video Scale Enginer) 用于图像缩放 支持 6 个缩放通道,通道特性如下

  • 最大处理能力: 3840x2160@60fps

  • 支持输入裁剪,分别在水平和垂直方向上进行缩放,并且对色度和亮度分量进行单独处理

  • 5个 downscale 通道

    • 最大分辨率支持分别为 4K/1080P/1080P/720P/720P

    • 最小分辨率为 64x64,支持任意 downscale factor

    • 支持帧率控制,支持 OSD

  • 1个 upscale 通道

    • 最大分辨率支持 4K,最大放大倍数 4X, 放大倍数支持 0 - 4

    • 支持帧率控制,支持 OSD

输出通道编号 类型 通道功能
0 offline 4K Downscale
1 offline 1080P Downscale
2 offline 1080P Downscale
3 offline 720P Downscale
4 offline 720P Downscale
5 offline 4K Upscale

输入输出数据格式

  • 支持输入数据的格式

    • from DDR: YUV422sp, YUV422 interleave, YUV420sp

    • from ISP: YUV420sp, YUV422sp

  • 支持输出数据的格式:YUV444, YUV422, YUV420, RGB888

OSD 特性如下

  • 每个OSD支持最多4个叠加区域(4个ROI在垂直方向上不重叠)和8个直方图统计区域

  • OSD 相关介绍可以参考 区域处理 - OSD

5.8.2. 参考示例

  • VSE 部分示例代码可以参考 sample_vse 章节

5.8.3. API 参考

5.8.4. 接口说明

5.8.4.1. hbn_vnode_open

【函数声明】

hobot_status hbn_vnode_open(hb_vnode_type vnode_type, uint32_t hw_id, int32_t ctx_id, hbn_vnode_handle_t *vnode_fd);

【功能描述】

初始化 vnode,打开 vnode 设备节点,并返回该模块的 vnode handle

【参数描述】

  • [IN] hb_vnode_type vnode_type : vnode类型,对于 VSE,取值为 HB_VSE

  • [IN] uint32_t hw_id : 模块的硬件 id,对于 VSE,hw_id 取值为0

  • [IN] int32_t ctx_id : 模块的 context id,软件上的概念,可指定 context id 值,也可设置为 AUTO_ALLOC_ID,由 HBN 框架自动分配 context id

  • [OUT] hbn_vnode_handle_t *vnode_fd : 返回模块的 vnode handle

【返回值】

  • 成功,返回 HBN_STATUS_SUCESS 0

  • 失败:异常为负值错误码,参考返回值说明

【注意事项】

【兼容性】

硬件: X5

5.8.4.2. hbn_vnode_close

【函数声明】

void hbn_vnode_close(hbn_vnode_handle_t vnode_fd);

【功能描述】

关闭模块的设备节点。

【参数描述】

  • [IN] hbn_vnode_handle_t vnode_fd:模块的 vnode handle;

【返回值】

【注意事项】

需要和hbn_vnode_open成对使用。

【兼容性】

硬件: X5

5.8.4.3. hbn_vnode_set_attr

【函数声明】

hobot_status hbn_vnode_set_attr(hbn_vnode_handle_t vnode_fd, void *attr);

【功能描述】

设置模块的基本属性。

【参数描述】

  • [IN] hbn_vnode_handle_t vnode_fd:模块的 vnode handle;

  • [IN] void *attr:模块的基本属性结构体指针,对于 VSE,其属性结构体为 vse_attr_t

【返回值】

  • 成功,返回 HBN_STATUS_SUCESS 0

  • 失败:异常为负值错误码,参考返回值说明

【注意事项】

【兼容性】

硬件: X5

5.8.4.4. hbn_vnode_set_ochn_attr

【函数声明】

hobot_status hbn_vnode_set_ochn_attr(hbn_vnode_handle_t vnode_fd, uint32_t ochn_id, void *attr);

【功能描述】

设置模块的输出通道属性。

【参数描述】

  • [IN] hbn_vnode_handle_t vnode_fd:模块的 vnode handle;

  • [IN] uint32_t ochn_id:模块的输出通道 id,通道 id 见VSE通道说明

  • [IN] void *attr:模块的输出通道属性结构体指针。对于 VSE,输出通道属性结构体为 vse_ochn_attr_t

【返回值】

  • 成功,返回 HBN_STATUS_SUCESS 0

  • 失败:异常为负值错误码,参考返回值说明

【注意事项】

【兼容性】

硬件: X5

5.8.4.5. hbn_vnode_get_ochn_attr

【函数声明】

hobot_status hbn_vnode_get_ochn_attr(hbn_vnode_handle_t vnode_fd, uint32_t ochn_id, void *attr);

【功能描述】

获取模块的输出通道属性。

【参数描述】

  • [IN] hbn_vnode_handle_t vnode_fd:模块的 vnode handle;

  • [IN] uint32_t ochn_id:模块的输出通道 id,通道 id 见VSE通道说明

  • [OUT] void *attr:模块输出通道属性结构体指针。对于 VSE,输出通道属性结构体为 vse_ochn_attr_t

【返回值】

  • 成功,返回 HBN_STATUS_SUCESS 0

  • 失败:异常为负值错误码,参考返回值说明

【注意事项】

【兼容性】

硬件: X5

5.8.4.6. hbn_vnode_set_ichn_attr

【函数声明】

hobot_status hbn_vnode_set_ichn_attr(hbn_vnode_handle_t vnode_fd, uint32_t ichn_id, void *attr);

【功能描述】

设置模块的输入通道属性。

【参数描述】

  • [IN] hbn_vnode_handle_t vnode_fd:模块的 vnode handle;

  • [IN] uint32_t ichn_id:模块的输入通道 id,通道 id 见VSE通道说明

  • [IN] void *attr:模块的输入通道属性结构体指针。对于 VSE,输入通道属性结构体为 vse_ichn_attr_t

【返回值】

  • 成功,返回 HBN_STATUS_SUCESS 0

  • 失败:异常为负值错误码,参考返回值说明

【注意事项】

【兼容性】

硬件: X5

5.8.4.7. hbn_vnode_get_ichn_attr

【函数声明】

hobot_status hbn_vnode_get_ichn_attr(hbn_vnode_handle_t vnode_fd, uint32_t ichn_id, void *attr);

【功能描述】

获取模块的输入通道属性。

【参数描述】

  • [IN] hbn_vnode_handle_t vnode_fd:模块的 vnode handle;

  • [IN] uint32_t ichn_id:模块的输入通道 id,对于 VSE,输入通道为0;

  • [OUT] void *attr:模块的输入通道属性结构体指针。对于 VSE,输入通道属性结构体为 vse_ichn_attr_t

【返回值】

  • 成功,返回 HBN_STATUS_SUCESS 0

  • 失败:异常为负值错误码,参考返回值说明

【注意事项】

【兼容性】

硬件: X5

5.8.4.8. hbn_vnode_set_ochn_buf_attr

【函数声明】

hobot_status hbn_vnode_set_ochn_buf_attr(hbn_vnode_handle_t vnode_fd, uint32_t ochn_id,
					 hbn_buf_alloc_attr_t *alloc_attr);

【功能描述】

设置输出通道 buffer 属性,包括 buffer 的数量以及 buffer 地址是否连续。

【参数描述】

  • [IN] hbn_vnode_handle_t vnode_fd:模块的 vnode handle;

  • [IN] uint32_t ochn_id:模块的输出通道id,通道 id 见VSE通道说明

  • [IN] hbn_buf_alloc_attr_t *alloc_attr:buffer分配属性;

【返回值】

  • 成功,返回 HBN_STATUS_SUCESS 0

  • 失败:异常为负值错误码,参考返回值说明

【注意事项】

【兼容性】

硬件: X5

5.8.4.9. hbn_vnode_start

【函数声明】

hobot_status hbn_vnode_start(hbn_vnode_handle_t vnode_fd);

【功能描述】

模块启动。

【参数描述】

  • [IN] hbn_vnode_handle_t vnode_fd:模块的 vnode handle;

【返回值】

  • 成功,返回 HBN_STATUS_SUCESS 0

  • 失败:异常为负值错误码,参考返回值说明

【注意事项】

启动前需要先打开模块。

【兼容性】

硬件: X5

5.8.4.10. hbn_vnode_stop

【函数声明】

hobot_status hbn_vnode_stop(hbn_vnode_handle_t vnode_fd);

【功能描述】

模块停止。

【参数描述】

  • [IN] hbn_vnode_handle_t vnode_fd:模块的 vnode handle;

【返回值】

  • 成功,返回 HBN_STATUS_SUCESS 0

  • 失败:异常为负值错误码,参考返回值说明

【注意事项】

【兼容性】

硬件: X5

5.8.4.11. hbn_vnode_getframe

【函数声明】

hobot_status hbn_vnode_getframe(hbn_vnode_handle_t vnode_fd, uint32_t ochn_id, uint32_t millisecondTimeout,
				hbn_vnode_image_t *out_img);

【功能描述】

获取模块输出通道的图像,阻塞型接口。

【参数描述】

  • [IN] hbn_vnode_handle_t vnode_fd:模块的 vnode handle;

  • [IN] uint32_t ochn_id:模块的输出通道 id,通道 id 见VSE通道说明

  • [IN] uint32_t millisecondTimeout:超时等待时间;

  • [OUT] hbn_vnode_image_t *out_img:输出图像 buffer 结构体地址;

【返回值】

  • 成功,返回 HBN_STATUS_SUCESS 0

  • 失败:异常为负值错误码,参考返回值说明

【注意事项】

【兼容性】

硬件: X5

5.8.4.12. hbn_vnode_sendframe

【函数声明】

hobot_status hbn_vnode_sendframe(hbn_vnode_handle_t vnode_fd, uint32_t ichn_id,
				 hbn_vnode_image_t *img);

【功能描述】

发送图像到模块的输入通道,会触发模块进行处理。阻塞型接口,等待硬件处理完再返回,默认超时时间为1秒

【参数描述】

  • [IN] hbn_vnode_handle_t vnode_fd:模块的 vnode handle;

  • [IN] uint32_t ichn_id:模块的输入通道id,对于 VSE,输入通道为0;

  • [IN] hbn_vnode_image_t *img:输入图像buffer地址;

【返回值】

  • 成功,返回 HBN_STATUS_SUCESS 0

  • 失败:异常为负值错误码,参考返回值说明

【注意事项】

【兼容性】

硬件: X5

5.8.4.13. hbn_vnode_releaseframe

【函数声明】

hobot_status hbn_vnode_releaseframe(hbn_vnode_handle_t vnode_fd, uint32_t ochn_id, hbn_vnode_image_t *img);

【功能描述】

释放图像buffer,buffer会归还到指定的输出通道。

【参数描述】

  • [IN] hbn_vnode_handle_t vnode_fd:模块的 vnode handle;

  • [IN] uint32_t ochn_id:模块的输出通道 id,通道 id 见VSE通道说明

  • [IN] hbn_vnode_image_t *img:图像 buffer 结构体地址;

【返回值】

  • 成功,返回 HBN_STATUS_SUCESS 0

  • 失败:异常为负值错误码,参考返回值说明

【注意事项】

【兼容性】

硬件: X5

5.8.5. 数据结构

5.8.5.1. vse_cfg_t

名称 类型 最小值 最大值 默认值 含义
vse_attr vse_attr_t · · · VSE 基本属性
ichn_attr vse_ichn_attr_t · · · VSE 输入通道属性
ochn_attr vse_ochn_attr_t · · · VSE 输出通道属性

5.8.5.2. vse_attr_t

名称 类型 最小值 最大值 默认值 含义
fps frame_fps_ctrl_t · · 0 目前只支持配置输入图像src的fps, 该参数用于vse的帧率控制

5.8.5.3. vse_ichn_attr_t

名称 类型 最小值 最大值 默认值 含义
tpg_en cam_bool_e 0 1 0 使能tpg功能,暂时不支持
width uint32_t 0 5432 0 输入图像原始的宽度
height uint32_t 0 3076 0 输入图像原始的高度
fmt frame_format_e FRM_FMT_NV12 FRM_FMT_NV12 0 FRM_FMT_NULL - 无效值,FRM_FMT_RAW - RAW格式,FRM_FMT_NV12 - NV12格式,FRM_FMT_UYVY - UYVY格式,目前只支持nv12格式
bit_width uint32_t 8 8 0 输入图像bit宽度

5.8.5.4. vse_ochn_attr_t

名称 类型 最小值 最大值 默认值 含义
chn_en cam_bool_e 0 1 0 使能通道
roi common_rect_t · · · 对输出图像的crop,值全为0,表示禁止crop
target_w uint32_t 0 受通道能力限制 0 输出图像的宽度,值为0表示禁止scale
target_h uint32_t 0 受通道能力限制 0 输出图像的高度,值为0表示禁止scale
y_stride uint32_t 0 · 0 输出图像y图层stride,暂时不支持
uv_stride uint32_t 0 · 0 输出图像uv图层stride,暂时不支持
fmt frame_format_e FRM_FMT_NV12 FRM_FMT_NV12 0 FRM_FMT_NULL - 无效值,FRM_FMT_RAW - RAW格式,FRM_FMT_NV12 - NV12格式,FRM_FMT_UYVY - UYVY格式,目前只支持nv12格式
bit_width uint32_t 8 8 0 输入图像bit宽度
fps frame_fps_ctrl_t · · 0 目前只支持配置输出图像dst的fps, 该参数用于vse的帧率控制。该值为0时, 若输入fps为0,则不会开启帧率控制, 若输入fps不为0,则不会输出任何数据

5.8.6. 返回值说明

错误码 宏定义 描述 常见原因及解决方法
0 HBN_STATUS_SUCESS 成功
1 HBN_STATUS_INVALID_NODE vnode无效,找不到对应的vnode
2 HBN_STATUS_INVALID_NODETYPE vnode类型无效,找不到对应的vnode 对于 VSE,vnode 类型为 HB_VSE
3 HBN_STATUS_INVALID_HWID 无效的硬件模块id 对于 VSE,hw_id 取值为 0
4 HBN_STATUS_INVALID_CTXID 无效的context id 可设置为 AUTO_ALLOC_ID,由 HBN 框架自动分配
5 HBN_STATUS_INVALID_OCHNID 无效的输出通道id VSE 输出通道范围[0,5]
6 HBN_STATUS_INVALID_ICHNID 无效的输入通道id VSE 仅支持1个输入通道
7 HBN_STATUS_INVALID_FORMAT 无效的格式
8 HBN_STATUS_INVALID_NULL_PTR 空指针
9 HBN_STATUS_INVALID_PARAMETER 无效的参数,版本检查失败
10 HBN_STATUS_ILLEGAL_ATTR 无效的参数
11 HBN_STATUS_INVALID_FLOW 无效的flow,找不到对应的flow
12 HBN_STATUS_FLOW_EXIST flow已经存在
13 HBN_STATUS_FLOW_UNEXIST flow不存在
14 HBN_STATUS_NODE_EXIST node已经存在
15 HBN_STATUS_NODE_UNEXIST node不存在
16 HBN_STATUS_NOT_CONFIG 预留
17 HBN_STATUS_CHN_NOT_ENABLED 通道未使能
18 HBN_STATUS_CHN_ALREADY_ENABLED 通道已使能
19 HBN_STATUS_ALREADY_BINDED node已经绑定
20 HBN_STATUS_NOT_BINDED node未绑定
21 HBN_STATUS_TIMEOUT 超时
22 HBN_STATUS_NOT_INITIALIZED 未初始化
23 HBN_STATUS_NOT_SUPPORT 通道不支持或未激活
24 HBN_STATUS_NOT_PERM 操作不允许
25 HBN_STATUS_NOMEM 内存不足
26 HBN_STATUS_INVALID_VNODE_FD 无效的node文件描述符
27 HBN_STATUS_INVALID_ICHNID_FD 无效的输入通道文件描述符
28 HBN_STATUS_INVALID_OCHNID_FD 无效的输出通道文件描述符
29 HBN_STATUS_OPEN_OCHN_FAIL 打开输出通道失败
30 HBN_STATUS_OPEN_ICHN_FAIL 打开输入通道失败
31 HBN_STATUS_JSON_PARSE_FAIL json解析失败
32 HBN_STATUS_REQ_BUF_FAIL 请求buffer失败
33 HBN_STATUS_QUERY_BUF_FAIL 查询buffer信息失败
34 HBN_STATUS_SET_CONTROL_FAIL 模块控制、调节参数(如ISP效果参数)设置失败
35 HBN_STATUS_GET_CONTROL_FAIL 模块控制、调节参数(如ISP效果参数)获取失败
36 HBN_STATUS_NODE_START_FAIL node开启失败
37 HBN_STATUS_NODE_STOP_FAIL node停止失败
38 HBN_STATUS_NODE_POLL_ERROR node通道poll错误
39 HBN_STATUS_NODE_POLL_TIMEOUT node通道poll超时
40 HBN_STATUS_NODE_POLL_FRAME_DROP node通道poll时发生丢帧
41 HBN_STATUS_NODE_POLL_HUP node通道poll时描述符挂起
42 HBN_STATUS_NODE_ILLEGAL_EVENT node通道poll时事件非法
43 HBN_STATUS_NODE_DEQUE_ERROR node通道dequeue buffer错误
44 HBN_STATUS_ILLEGAL_BUF_INDEX 无效的buffer索引
45 HBN_STATUS_NODE_QUE_ERROR node通道queue buffer错误
46 HBN_STATUS_FLUSH_FRAME_ERROR node通道帧flush错误
47 HBN_STATUS_INIT_BIND_ERROR 用json解析并绑定时发生错误
48 HBN_STATUS_ADD_NODE_FAIL 向flow中添加node失败
49 HBN_STATUS_WRONG_CONFIG_ID 系统不支持的node id
50 HBN_STATUS_BIND_NODE_FAIL flow绑定node时发生错误
51 HBN_STATUS_INVALID_VERSION 底层驱动模块和上层库版本号不匹配错误
52 HBN_STATUS_GET_VERSION_ERROR 获取底层驱动模块版本号错误
53 HBN_STATUS_MEM_INIT_FAIL hbmem内存初始化失败
54 HBN_STATUS_MEM_IMPORT_FAIL hbmem内存引入失败
55 HBN_STATUS_MEM_FREE_FAIL hbmem内存释放失败
56 HBN_STATUS_SYSFS_OPEN_FAIL 系统文件打开失败
57 HBN_STATUS_STRUCT_SIZE_NOT_MATCH hal层结构体大小与kernel层不匹配
58 HBN_STATUS_RGN_UNEXIST 获取不到对应的rgn数据
59 HBN_STATUS_RGN_INVALID_OPERATION rgn操作无效
60 HBN_STATUS_RGN_OPEN_FILE_FAIL rgn模块打开文件失败
128 HBN_STATUS_ERR_UNKNOW 未知错误