# sample_vse 使用说明
## 功能概述
sample_vse 完成 VSE 模块的初始化，配置输入和输出通道的参数，实现1路图像的输出，6路图像的经过缩放、crop 后输出的功能。

### 软件架构说明
sample_vse 主要依赖 libcam.so libvpf.so libhbmem.so，将 YUV 文件读入 hbm 申请的内存，并传入 VSE 通道做缩小或放大处理，最后将处理好的 YUV 数据 dump 到文件系统中。

![sample_vse_software_arch.png](_static/_images/sample_vse/sample_vse_software_arch.png)


### 数据流说明
测试程序 pipeline 如下所示，仅创建一个 vflow，vflow 仅包含一个 VSE vnode。通过 VSE vnode 内部6个 Channel 实现不同分辨率缩放。

![sample_vse_pipeline.png](_static/_images/sample_vse/sample_vse_pipeline.png)

### 代码位置及目录结构
- 代码位置 `app/samples/platform_samples/sample_vse`
- 目录结构
```
sample_vse/
├── Makefile
└── sample_vse.c
```

### API流程说明
![sample_vse_code_flow.png](_static/_images/sample_vse/sample_vse_code_flow.png)

## 编译部署
### 编译
- 进入 sample_vse 目录，执行`make`编译
- 输出成果物是 sample_vse 源码目录下的 `sample_vse`
- 详细程序编译方式请查阅 [编译方法](overview.html#span-id-sample-build) 章节

### 程序部署
把 `sample_vse/sample_vse` 上传到开发板上之后，运行`chmod +x sample_vse`命令给程序赋予可执行权限。

## 运行
### 程序运行方法
直接执行程序 `./sample_vse` 可以获得帮助信息：

### 程序参数选项说明
```
./sample_vse
Usage: sample_vse [OPTIONS]
Options:
-i, --input_file FILE           Specify the input file
-w, --input_width WIDTH         Specify the input width
-h, --input_height HEIGHT       Specify the input height
-f, --feedback                  Specify feedback mode
-V, --verbose                   Enable verbose mode
```

- i: 指定输入的YUV文件，测试程序默认使用 NV12 格式
- w: 输入 YUV 图像的宽度
- h: 输入 YUV 图像的高度
- f: 以 feedback 模式运行 VSE 节点（不创建 vflow 流）

### 运行效果
以输入分辨率为 1280 x 960 的 YUV 图片为例，执行 `sample_vse -i 1280x960_NV12.yuv -w 1280 -h 960`。

把一张 YUV 图像送入 VSE，并且初始化6个通道，0~4通道执行图像缩小，5通道执行图像放大，并且把处理后的图像保存为 yuv 图像：

  - 0 通道输出输入图像的原分辨率：1280 x 960。
  - 1 通道输出16像素对齐的常用算法图像使用的分辨率：512 x 512。
  - 2 通道输出非16像素对齐的常用算法图像使用的分辨率：224 x 224。
  - 3 通道输出ROI为原图中心点不变，宽、高各裁剪一半，输出图像宽、高等于ROI区域宽高，输出缩小到支持的最小分辨率：64 x 64。
  - 4 通道输出常用算法图像使用的分辨率：672 x 672。
  - 5 通道输出放大到支持的最大分辨率（注意：图像只能最大放到4倍）：2560 x 1920。

输出 log 如下:
```
VSE vnode work mode: vflow
Using input file:1280x960_NV12.yuv, input:1280x960
(read_yuvv_nv12_file):file read(1280x960_NV12.yuv), y-size(1228800)
ichn input width = 1280
ichn input height = 960
hbn_vnode_set_ochn_attr: 0, 1280x960
hbn_vnode_set_ochn_attr: 1, 512x512
hbn_vnode_set_ochn_attr: 2, 224x224
hbn_vnode_set_ochn_attr: 3, 64x64
hbn_vnode_set_ochn_attr: 4, 672x672
hbn_vnode_set_ochn_attr: 5, 2560x1920
```

运行 Feedback 模式以输入分辨率为 1920 x 1080 的 YUV 图片为例，执行 `./sample_vse -i input_1920x1080_nv12.yuv -w 1920 -h 1080 -f`。

输出 log 如下:
```
VSE vnode work mode: feedback
Using input file:input_1920x1080_nv12.yuv, input:1920x1080
(read_yuvv_nv12_file):file read(input_1920x1080_nv12.yuv), y-size(2073600)
ichn input width = 1920
ichn input height = 1080
hbn_vnode_set_ochn_attr: 0, 1920x1080
hbn_vnode_set_ochn_attr: 1, 512x512
hbn_vnode_set_ochn_attr: 2, 224x224
hbn_vnode_set_ochn_attr: 3, 64x64
hbn_vnode_set_ochn_attr: 4, 672x672
hbn_vnode_set_ochn_attr: 5, 3840x2160
```

- 浏览YUV图​​​

  请参考Hobot player静态图片章节浏览图像，图像的参数配置说明如下：​​
  按照如下图所示步骤配置选项，其中 file config 里面关注 pic_type 、 yuv_type 、width 和 height 的配置，以 `vse_output_nv12_chn0_1280x960_stride_1280.yuv` 为例， 配置为（PIC_YUV, YUV_NV12, 1280, 960）。
  ![vin_hobot_use.png](_static/_images/get_isp_data/isp_hobot_use.png)


## 提示说明

VSE 通道 5 只支持放大，如果输入分辨率小于测试程序 VSE 通道0-4设置的默认分辨率，将出现报错。
例如使用 64x64 图像作为输入，将提示报错信息如下:

```
[   51.037647] [L485]vse_ochn_attr_check: Invalid Param attr->target_w: 512, min: 64, max: 64
[   51.045960] vse_ochn_attr_check failed
```