# HBN 框架说明

## 概述
HBN 框架在多媒体系统软件架构图中以 **红色** 标识，覆盖了 Camera Sensor 采集链路中大部分的模块，包括 VIN、 ISP、 VSE、 GDC、 N2D。 <br>
其中 `Camera API` 和 `OSD API` ( 图中 **绿色** 部分 ) 没有包含在 HBN 框架中，但是可以通过对应的 `attach` 函数绑定到 HBN 框架中。<br>
总的来说， HBN 框架覆盖了 Camera Sensor 采集链路的所有模块，并且提供了简单灵活的 API。

![ 框图 ](./media/multi_meida_hbn_framework.png)

## 软件抽象
HBN 框架中将 VIN、 ISP、 VSE、 GDC、 N2D 中的每个模块用 vnode 来抽象，多个 ``vnode`` 连接成一个 ``vflow`` （类似于一条流水线）。<br>
由于 Camera 和 OSD 使用独立的 API，所以 HBN 框架提供了 attach 接口，实现 Camera 和 VIN 进行绑定， OSD 和 VSE 进行绑定。

1. vnode 是对硬件加速单元的抽象，在 HBN 框架中 VIN、 ISP、 VSE、 GDC、 N2D ，都会抽象成 vnode 的概念， vnode 包含如下属性 ：
   - 硬件加速单元本身的属性，[ 比如 isp_attr_t](#isp_attr_t)
   - 硬件加速单元输入通道的属性，[ 比如 isp_ichn_attr_t](#isp_ichn_attr_t)
   - 硬件加速单元输出通道的属性，[ 比如 isp_ochn_attr_t](#isp_ochn_attr_t)
2. 多个 vnode 连接起来形成 1 个 vflow, 支持同时创建多条 vflow, 不同 vflow 之间是完全独立的 , 连接 vnode 的流程如下：
    - 创建 vflow 的接口：[hbn_vflow_create](#hbn_vflow_create)
	- vflow 中添加 vnode 节点的接口：[hbn_vflow_add_vnode](#hbn_vflow_add_vnode)
	- 在 vflow 中绑定两个 vnode 的接口：[hbn_vflow_bind_vnode](#hbn_vflow_bind_vnode)
	- 启动 vflow 的接口：[hbn_vflow_start](#hbn_vflow_start)
3. 对于 ``HBN API`` 中非 ``HBN Framework API`` 的模块，比如 Camera 和 OSD，支持使用 attach 接口绑定到 vflow 中
4. 对于非 ``HBN API`` 中的模块， 比如 BPU 和 Display 等，通过接口 ``hbn_vnode_get_output_frame`` 从 vflow 中获取视频帧

下图是三种场景的 vflow 例子（场景 1 中 **回灌** 的含义：数据源来自 DDR 的情况）：

![ 框图 ](./media/hbn_abstract_vnode_and_vflow.png)

1. 场景 1 ：单路 vflow( 回灌 )
   - 场景描述：视频帧来自 DDR ( 比如读取视频文件到 DDR)，使用 VSE 对视频帧进行缩放
   - 数据源：数据源没有包含在 vflow 中，需要在线程中主动将 DDR 中的视频帧送入到 vflow 中
   - vflow 中至少有 1 个 vnode，可以有多个，只有 1 个节点时可以不绑定到 vflow 中，多个 vnode 节点并且需要连接起来时，必须绑定到 vflow
   - VSE、 GDC、 ISP、 N2D 都支持回灌的方式
2. 场景 2 ：单路 vflow
   - 场景描述：接入 1 路 Camera, 分别经过 VIN、 ISP、 GDC、 VSE，在 VSE 中输出 3 个通道，分别进行如下处理，
     - 通道 0 ：交给 CODEC 进行编码
     - 通道 1 ：交给 Display 进行显示
     - 通道 2 ：交给 BPU 进行推理
   - 数据源：通过 mipi 接口接入的 Camera Sensor
   - vflow 中包含数据源， vflow 启动后， HBN 框架会自动调度完成数据流的传递，不需要开发者介入
   - vflow 启动后，可以从末尾节点持续获取视频帧，并传递到非 HBN API 中的加速单元，比如图中 虚线框中的设备 (Codec、 Display、 BPU)
3. 场景 3 ：多路 vflow
   - 场景描述：接入 2 路 Camera, 分别经过不同的处理链路
   - 数据源：每个 vflow 中各接入 1 个 Camera
   - 使用两个 vflow 完成两路视频链路的采集
   - 两个 vflow 之间是完全独立
## vnode 连接方式
vnode 之间通过输入通道和输出通道进行连接 :

- 每个 vnode 节点，有一个输入通道和多个输出通道
- 上游 vnode 的输出通道和下游 vnode 的输入通道连接 , 多个 vnode 连接成一个 vflow
- 上游 vnode 节点的输出通道决定了 vnode 的连接方式

下面从三个方面展开描述：输出通道、连接方式、参数配置

<span id="channel_description"/> </span>
### 输出通道

- 输出通道决定了 vnode 的连接方式，支持 online 模式和 offline 模式，详细见 [ 系统概述 ](./0-Overview_zh_CN.html#id8)
- 只有 VIN、 ISP 的输出通道支持 online 通道，其他模块只支持 offline 通道

| 模块 | 输出通道编号 | 通道功能                            |
|------|--------------|-------------------------------------|
| VIN  | 0            | offline 通道，输出 camera 帧到 ddr      |
|      | 1            | online 通道，连接到 isp               |
|      | 3            | offline 通道，只输出 emb data 到 ddr    |
| ISP  | 0            | offline 通道，输出 isp 处理后的帧到 ddr |
|      | 1            | online 通道，连接到 vse               |
| VSE  | 0            | offline 通道， 4K Downscale           |
|      | 1            | offline 通道， 1080P0 Downscale       |
|      | 2            | offline 通道， 1080P1 Downscale       |
|      | 3            | offline 通道， 720P0 Downscale        |
|      | 4            | offline 通道， 720P1 Downscale        |
|      | 5            | offline 通道， 4K Upscale             |
| GDC  | 0            | offline 通道，输出 gdc 处理后的帧到 ddr |

### 连接方式

只有 VIN、 ISP 的输出通道支持 online 通道，其他模块只支持 offline 通道，所以针对 VIN、 ISP、 VSE 之间的组合，描述如下：

| 模块组合  | 连接方式                                     | 说明                                                            |
|-----------|----------------------------------------------|-----------------------------------------------------------------|
| VIN - ISP | VIN online ISP， ISP 工作模式 PASSTHROUGH_MODE | VIN 和 ISP 间是硬件连接，中间不经过 DDR，最多支持 1 路使用该连接方式  |
|           | VIN online ISP， ISP 工作模式 MCM_MODE         | 最多支持 4 路使用该连接方式。预留模式，**当前不建议使用**             |
|           | VIN offline ISP， ISP 工作模式 DDR_MODE        | 中间需要经过 DDR，最多支持 6 路使用该连接方式                      |
| VIN - VSE | VIN offline VSE                              | Camera Sensor 不需要 ISP 时，使用 VIN 与 VSE 直接绑定， 只支持 offline |
| ISP - VSE | ISP online VSE                               | ISP 和 VSE 间是硬件连接，中间不经过 DDR，最多支持 4 路使用该连接方式  |
|           | ISP offline VSE                              | 中间需要经过 DDR                                                 |


### 参数配置
函数 [hbn_vflow_bind_vnode](#hbn_vflow_bind_vnode) 绑定两个 vnode 节点时，会确定模块间的连接方式，但是需要 VIN 和 ISP 节点设置为对应的配置，具体如下：

| 模块组合   | 连接方式                           | hbn_vflow_bind_vnode 函数                          | vin_node_attr 结构体 | isp_node_attr 结构体 |
|------------|----------------------------------|---------------------------------------------------|---------------------|--------------------|
|VIN - ISP   |online (ISP 是 PASSTHROUGH_MODE 模式 )| 1. src_out_channel =1 <br >2. dst_input_channel =0 |cim_isp_flyby =1     |input_mode = 0      |
|VIN - ISP   |online (ISP 是 MCM_MODE 模式 )       | 1. src_out_channel =1 <br >2. dst_input_channel =0 |cim_isp_flyby =1     |input_mode = 1       |
|VIN - ISP   |offline   (ISP 是 DDR_MODE)        | 1. src_out_channel =0 <br >2. dst_input_channel =0 |1. ddr_en  =1 <br> 2. cim_isp_flyby =0     |input_mode = 2|
|VIN - VSE   |offline                           | 1. src_out_channel =0 <br >2. dst_input_channel =0 |-                    |-                   |
|ISP - VSE   |online                            | 1. src_out_channel =1 <br >2. dst_input_channel =0 |-                    |-                   |
|ISP - VSE   |offline                           | 1. src_out_channel =0 <br >2. dst_input_channel =0 |ddr_en  =1           |-                   |


## API 列表

| API 接口                        | 接口功能                      |
|---------------------------------|------------------------------|
[hbn_vnode_open](#hbn_vnode_open)| 打开 vonde|
[hbn_vnode_close](#hbn_vnode_close)| 关闭 vonde|
[hbn_vnode_set_attr](#hbn_vnode_set_attr)| 设置 vnode 属性 |
[hbn_vnode_get_attr](#hbn_vnode_get_attr)| 获取 vnode 属性 |
[hbn_vnode_set_attr_ex](#hbn_vnode_set_attr_ex)| 设置 vnode 扩展属性 |
[hbn_vnode_get_attr_ex](#hbn_vnode_get_attr_ex)| 获取 vnode 扩展属性 |
[hbn_vnode_set_ochn_attr](#hbn_vnode_set_ochn_attr)| 设置模块的输出通道属性 |
[hbn_vnode_get_ochn_attr](#hbn_vnode_get_ochn_attr)| 获取模块的输出通道属性 |
[hbn_vnode_set_ochn_attr_ex](#hbn_vnode_set_ochn_attr_ex)| 设置模块的输出通道扩展属性，可在应用运行中动态设置 |
[hbn_vnode_set_ichn_attr](#hbn_vnode_set_ichn_attr)| 设置模块的输入通道属性 |
[hbn_vnode_get_ichn_attr](#hbn_vnode_get_ichn_attr)| 获取模块的输入通道属性 |
[hbn_vnode_set_ichn_attr_ex](#hbn_vnode_set_ichn_attr_ex)| 设置模块的输入通道扩展属性，可在应用运行中动态设置 |
[hbn_vnode_set_ochn_buf_attr](#hbn_vnode_set_ochn_buf_attr)| 设置输出通道 buffer 属性 |
[hbn_vnode_start](#hbn_vnode_start)| 启动 vnode，启动前需要先打开模块 |
[hbn_vnode_stop](#hbn_vnode_stop) | 停止 vonde|
[hbn_vnode_getframe](#hbn_vnode_getframe)| 获取模块输出通道的图像，阻塞型接口 |
[hbn_vnode_releaseframe](#hbn_vnode_releaseframe)| 释放图像 buffer， buffer 会归还到指定的输出通道 |
[hbn_vnode_sendframe](#hbn_vnode_sendframe)| 发送图像到模块的输入通道，会触发模块进行处理。阻塞型接口，等待硬件处理完再返回，默认超时时间为 1 秒 |
[hbn_vnode_sendframe_async](#hbn_vnode_sendframe_async)| 发送图像到模块的输入通道，会触发模块进行处理。非阻塞型接口 |
[hbn_vnode_set_output_frame](#hbn_vnode_set_output_frame)| 设置模块输出通道的图像 buffer，非阻塞型接口，外部设置输出 buffer |
[hbn_vnode_get_output_frame](#hbn_vnode_get_output_frame) | 获取模块处理后的图像 buffer，和 hbn_vnode_set_output_frame 配合使用，非阻塞型接口 |
[hbn_vflow_create](#hbn_vflow_create) | 创建一个 vflow，返回 vflow handle|
[hbn_vflow_destroy](#hbn_vflow_destroy) | 根据 vflow handle，销毁一个 vflow|
[hbn_vflow_add_vnode](#hbn_vflow_add_vnode) | 把模块添加到 vflow 里面，用 vflow 管理起来 |
[hbn_vflow_bind_vnode](#hbn_vflow_bind_vnode) | 把两个模块绑定到一起，绑定后 src_vnode_fd 模块的数据帧会自动流向 dst_vnode_fd 模块 |
[hbn_vflow_unbind_vnode](#hbn_vflow_unbind_vnode) | 解绑 src_vnode_fd 和 dst_vnode_fd 模块 |
[hbn_vflow_start](#hbn_vflow_start) | 启动一条 vflow， vflow 里包含的 vnode 都会启动 |
[hbn_vflow_stop](#hbn_vflow_stop) | 停止一条 vflow， vflow 里包含的 vnode 都会停止 |
[hbn_vflow_get_vnode_handle](#hbn_vflow_get_vnode_handle) | 通过模块 id 和 context id 获取 vnode handle|
[hbn_vflow_create_cfg](#hbn_vflow_create_cfg) | 通过配置文件创建一条包含 vnode 及其绑定关系的 vflow|
[hbn_vflow_get_version](#hbn_vflow_get_version) | 获取 hbn api 的版本信息 |

## API 调用流程

### 创建流程

![API 创建流程 ](./media/hbn_flow_create_flow.png)

### 销毁流程
销毁流程是创建流程的反操作，但是有如下几点需要注意：
- 调用了 [hbn_vflow_destroy](#hbn_vflow_destroy) 就不需要再调用 [hbn_vnode_close](#hbn_vnode_close) 和 [hbn_vflow_unbind_vnode](#hbn_vflow_unbind_vnode)
- 调用了 `hbn_camera_destroy` 就不需要再调用 `hbn_camera_detach_from_vin`


![API 销毁流程 ](./media/hbn_flow_destroy_flow.png)

## API 接口说明

<span id="hbn_vnode_open"/> </span>

### 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)
```

#### 【参数描述】

- [IN] hb_vnode_type vnode_type： vnode 类型，每个硬件模块对应一个 vnode 类型。取值为 HB_VIN、 HB_ISP、 HB_VSE、 HB_GDC、 HB_N2D；

- [IN] uint32_t hw_id：模块的硬件 id。对于 VIN 模块， hw_id 取值为 [0, 3]，依次对应 SIF0~SIF3 ，其他模块只取 0 ；

- [IN] uint32_t ctx_id：模块的 context id，软件上的概念，可指定 context id 值，也可设置为 AUTO_ALLOC_ID，由 HNB 框架 自动分配 context id；

- [OUT] hbn_vnode_handle_t *vnode_fd：返回模块的 vnode handle；


#### 【返回值】

- 成功： HBN_STATUS_SUCESS 0

- 失败：异常为负值错误码，参考 [ 返回值说明 ](#return_val)

#### 【功能描述】

初始化某个模块，返回该模块的句柄 `hbn_vnode_handle_t`。
1. 使用某个模块前，必须先调用 `hbn_vnode_open` 函数
2. `hbn_vnode_open` 函数打开该模块设备节点 ( 比如 `/dev/vin0_cap`)
3. `hbn_vnode_open` 函数返回一个指向 `hbn_vnode_handle_t` 类型的指针（ vnode_fd），用于标识模块的特定软件实例。<br>
	例如，在函数 [hbn_vflow_bind_vnode](#hbn_vflow_bind_vnode) 中，其两个参数 src_vnode_fd 和 dst_vnode_fd 均为 `hbn_vnode_open` 函数返回的 `hbn_vnode_handle_t` 指针

4. `hbn_vnode_handle_t` 的本质是 `int64_t` 类型，`hbn_vnode_open` 函数产生一个系统唯一的整型值通过 `*vnode_fd` 返回


#### 【注意事项】

<span id="hbn_vnode_close"/> </span>

### hbn_vnode_close
#### 【函数声明】

```
void hbn_vnode_close(hbn_vnode_handle_t vnode_fd)
```

#### 【参数描述】

- [IN] hbn_vnode_handle_t vnode_fd：模块的 vnode handle；

#### 【返回值】

无

#### 【功能描述】

关闭模块的设备节点。

#### 【注意事项】

- 调用了 hbn_vflow_destroy 就无须再调用 hbn_vnode_close。
- 模块绑定在 vflow 的情况：需要调用 hbn_vflow_destroy，不需要调用 hbn_vnode_close。
- 模块单独使用的情况（例如只是 ISP、 VSE、 GDC 回灌， 不绑定到 vflow）：需要调用 hbn_vnode_close



<span id="hbn_vnode_set_attr"/> </span>

### 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：模块的基本属性结构体指针。基本属性结构体可以是 [vin_attr_t](#vin_attr_t)、[isp_attr_t](#isp_attr_t)、[vse_attr_t](#vse_attr_t) 等，以模块名 +_attr_t 结尾的属性；

#### 【返回值】

- 成功： HBN_STATUS_SUCESS 0

- 失败：异常为负值错误码，参考 [ 返回值说明 ](#return_val)

#### 【功能描述】

设置模块的基本属性。

#### 【注意事项】

无


<span id="hbn_vnode_get_attr"/> </span>

### hbn_vnode_get_attr
#### 【函数声明】

```
hobot_status hbn_vnode_get_attr(hbn_vnode_handle_t vnode_fd, void *attr)
```

#### 【参数描述】

- [IN] hbn_vnode_handle_t vnode_fd：模块的 vnode handle；

- [OUT] void *attr：模块的基本属性结构体指针。基本属性结构体可以是 [vin_attr_t](#vin_attr_t)、[isp_attr_t](#isp_attr_t)、[vse_attr_t](#vse_attr_t) 等，以模块名 +_attr_t 结尾的属性；

#### 【返回值】

- 成功： HBN_STATUS_SUCESS 0

- 失败：异常为负值错误码，参考 [ 返回值说明 ](#return_val)

#### 【功能描述】

获取模块的基本属性。

#### 【注意事项】

无


<span id="hbn_vnode_set_attr_ex"/> </span>

### hbn_vnode_set_attr_ex
#### 【函数声明】

```
hobot_status hbn_vnode_set_attr_ex(hbn_vnode_handle_t vnode_fd, void *attr)
```

#### 【参数描述】

- [IN] hbn_vnode_handle_t vnode_fd：模块的 vnode handle；

- [IN] void *attr：模块的扩展属性结构体指针。扩展属性结构体可以是 `vin_attr_ex_t` 等，以模块名 +_attr_ex_t 结尾的属性；

#### 【返回值】

- 成功： HBN_STATUS_SUCESS 0

- 失败：异常为负值错误码，参考 [ 返回值说明 ](#return_val)

#### 【功能描述】

设置模块的扩展属性，可在应用运行中动态设置。

#### 【注意事项】

无

<span id="hbn_vnode_get_attr_ex"/> </span>

### hbn_vnode_get_attr_ex
#### 【函数声明】

```
hobot_status hbn_vnode_get_attr_ex(hbn_vnode_handle_t vnode_fd, void *attr)
```

#### 【参数描述】

- [IN] hbn_vnode_handle_t vnode_fd：模块的 vnode handle；

- [OUT] void *attr：模块的扩展属性结构体指针。扩展属性结构体可以是 `vin_attr_ex_t` 等，以模块名 +_attr_ex_t 结尾的属性；

#### 【返回值】

- 成功： HBN_STATUS_SUCESS 0

- 失败：异常为负值错误码，参考 [ 返回值说明 ](#return_val)

#### 【功能描述】

获取模块的扩展属性。

#### 【注意事项】

无


<spin id="hbn_vnode_set_ochn_attr"/> </span>

### 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 见 :[ 模块通道说明 ](#channel_description)；

- [IN] void *attr：模块的输出通道属性结构体指针。输出通道属性可以是 [vin_ochn_attr_t](#vin_ochn_attr_t)、[isp_ochn_attr_t](#isp_ochn_attr_t) 等，以模块名 +_ochn_attr_t 结尾的属性；


#### 【返回值】

- 成功： HBN_STATUS_SUCESS 0

- 失败：异常为负值错误码，参考 [ 返回值说明 ](#return_val)

#### 【功能描述】

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

#### 【注意事项】

无


<spin id="hbn_vnode_get_ochn_attr"/> </span>

### 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 见 :[ 模块通道说明 ](#channel_description)

- [OUT] void *attr：模块输出通道属性结构体指针。输出通道属性可以是 [vin_ochn_attr_t](#vin_ochn_attr_t)、[isp_ochn_attr_t](#isp_ochn_attr_t) 等，以模块名 +_ochn_attr_t 结尾的属性；

#### 【返回值】

- 成功： HBN_STATUS_SUCESS 0

- 失败：异常为负值错误码，参考 [ 返回值说明 ](#return_val)

#### 【功能描述】

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

#### 【注意事项】

无


<spin  id="hbn_vnode_set_ochn_attr_ex"/> </span>

### hbn_vnode_set_ochn_attr_ex
#### 【函数声明】

```
hobot_status hbn_vnode_set_ochn_attr_ex(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 见 :[ 模块通道说明 ](#channel_description)

- [IN] void *attr：模块的输出通道扩展属性结构体指针。输出通道扩展属性可以是 `vse_ochn_attr_ex_t` 等，以模块名 +_ochn_attr_ex_t 结尾的属性；

#### 【返回值】

- 成功： HBN_STATUS_SUCESS 0

- 失败：异常为负值错误码，参考 [ 返回值说明 ](#return_val)

#### 【功能描述】

设置模块的输出通道扩展属性，可在应用运行中动态设置。

#### 【注意事项】

无


<spin id="hbn_vnode_set_ichn_attr"/> </span>

### 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 见 :[ 模块通道说明 ](#channel_description)

- [IN] void *attr：模块的输入通道属性结构体指针。输入通道属性可以是 [vin_ichn_attr_t](#vin_ichn_attr_t)、[isp_ichn_attr_t](#isp_ichn_attr_t) 等，以模块名 +_ichn_attr_t 结尾的属性；

#### 【返回值】

- 成功： HBN_STATUS_SUCESS 0

- 失败：异常为负值错误码，参考 [ 返回值说明 ](#return_val)

#### 【功能描述】

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

#### 【注意事项】

无

<spin id="hbn_vnode_get_ichn_attr"/> </span>

### 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，通道 id 见 :[ 模块通道说明 ](#channel_description)

- [OUT] void *attr：模块的输入通道属性结构体指针。输入通道属性可以是 [vin_ichn_attr_t](#vin_ichn_attr_t)、[isp_ichn_attr_t](#isp_ichn_attr_t) 等，以模块名 +_ichn_attr_t 结尾的属性；

#### 【返回值】

- 成功： HBN_STATUS_SUCESS 0

- 失败：异常为负值错误码，参考 [ 返回值说明 ](#return_val)

#### 【功能描述】

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

#### 【注意事项】

无



<spin id="hbn_vnode_set_ichn_attr_ex"/> </span>

### hbn_vnode_set_ichn_attr_ex
#### 【函数声明】

```
hobot_status hbn_vnode_set_ichn_attr_ex(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 见 :[ 模块通道说明 ](#channel_description)

- [IN] void *attr：模块的输入通道扩展属性结构体指针。输入通道扩展属性指以模块名 +_ichn_attr_ex_t 结尾的属性；

#### 【返回值】

- 成功： HBN_STATUS_SUCESS 0

- 失败：异常为负值错误码，参考 [ 返回值说明 ](#return_val)

#### 【功能描述】

设置模块的输入通道扩展属性，可在应用运行中动态设置。

#### 【注意事项】

无


<spin id="hbn_vnode_set_ochn_buf_attr"/> </span>

### 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)
```

#### 【参数描述】

- [IN] hbn_vnode_handle_t vnode_fd：模块的 vnode handle；

- [IN] uint32_t ochn_id：模块的输出通道 id，通道 id 见 :[ 模块通道说明 ](#channel_description)

- [IN] hbn_buf_alloc_attr_t *alloc_attr： buffer 分配属性；

#### 【返回值】

- 成功： HBN_STATUS_SUCESS 0

- 失败：异常为负值错误码，参考 [ 返回值说明 ](#return_val)

#### 【功能描述】

设置输出通道 buffer 属性。

#### 【注意事项】

<span id="hbn_vnode_start"/> </span>

### 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

- 失败：异常为负值错误码，参考 [ 返回值说明 ](#return_val)

#### 【功能描述】

模块启动。

#### 【注意事项】

启动前需要先打开模块

<span id="hbn_vnode_stop"/> </span>

### 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

- 失败：异常为负值错误码，参考 [ 返回值说明 ](#return_val)

#### 【功能描述】

模块停止。

#### 【注意事项】

无


<span id="hbn_vnode_getframe"/> </span>

### 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 见 :[ 模块通道说明 ](#channel_description)

- [IN] uint32_t millisecondTimeout：超时等待时间；

- [OUT] hbn_vnode_image_t *out_img：输出图像 buffer 结构体地址；

#### 【返回值】

- 成功： HBN_STATUS_SUCESS 0

- 失败：异常为负值错误码，参考 [ 返回值说明 ](#return_val)

#### 【功能描述】

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

#### 【注意事项】

无



<span id="hbn_vnode_releaseframe"/> </span>

### hbn_vnode_releaseframe
#### 【函数声明】

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

#### 【参数描述】

- [IN] hbn_vnode_handle_t vnode_fd：模块的 vnode handle；

- [IN] uint32_t ochn_id：模块的输出通道 id，通道 id 见 :[ 模块通道说明 ](#channel_description)

- [IN] hbn_vnode_image_t *img：图像 buffer 结构体地址；

#### 【返回值】

- 成功： HBN_STATUS_SUCESS 0

- 失败：异常为负值错误码，参考 [ 返回值说明 ](#return_val)

#### 【功能描述】

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

#### 【注意事项】

无


<span id="hbn_vnode_sendframe"/> </span>

### hbn_vnode_sendframe
#### 【函数声明】

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

#### 【参数描述】

- [IN] hbn_vnode_handle_t vnode_fd：模块的 vnode handle；

- [IN] uint32_t ichn_id：模块的输入通道 id，通道 id 见 :[ 模块通道说明 ](#channel_description)

- [IN] hbn_vnode_image_t *img：输入图像 buffer 地址；

#### 【返回值】

- 成功： HBN_STATUS_SUCESS 0

- 失败：异常为负值错误码，参考 [ 返回值说明 ](#return_val)

#### 【功能描述】

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

#### 【注意事项】

无


<span id="hbn_vnode_sendframe_async"/> </span>

### hbn_vnode_sendframe_async
#### 【函数声明】

```
hobot_status hbn_vnode_sendframe_async(hbn_vnode_handle_t vnode_fd, uint32_t ichn_id, hbn_vnode_image_t *img)
```

#### 【参数描述】

- [IN] hbn_vnode_handle_t vnode_fd：模块的 vnode handle；

- [IN] uint32_t ichn_id：模块的输入通道 id，通道 id 见 :[ 模块通道说明 ](#channel_description)

- [IN] hbn_vnode_image_t *img：输入图像 buffer 地址；

#### 【返回值】

- 成功： HBN_STATUS_SUCESS 0

- 失败：异常为负值错误码，参考 [ 返回值说明 ](#return_val)

#### 【功能描述】

发送图像到模块的输入通道，会触发模块进行处理。非阻塞型接口。

#### 【注意事项】

无

<spin id="hbn_vnode_set_output_frame"/> </span>

### hbn_vnode_set_output_frame
#### 【函数声明】

```
hobot_status hbn_vnode_set_output_frame(hbn_vnode_handle_t vnode_fd, uint32_t ochn_id, hbn_vnode_image_t *img)
```

#### 【参数描述】

- [IN] hbn_vnode_handle_t vnode_fd：模块的 vnode handle；

- [IN] uint32_t ochn_id：模块的输出通道 id，通道 id 见 :[ 模块通道说明 ](#channel_description)

- [IN] hbn_vnode_image_t *img：输出图像 buffer 地址；

#### 【返回值】

- 成功： HBN_STATUS_SUCESS 0

- 失败：异常为负值错误码，参考 [ 返回值说明 ](#return_val)

#### 【功能描述】

设置模块输出通道的图像 buffer，非阻塞型接口，外部设置输出 buffer，用法参考 sample 代码。

#### 【注意事项】

- 只支持 VSE， GDC 和 GDC 绑定 VSE，三种场景回灌模式使用
- 需控制输出 buffer 的申请和释放以及 cache 管理
- 输出 buf 需满足： Y 和 UV 地址空间要连续，使用 ION 空间，填充必要 bufferindex 和 share_id
- 不支持同时有内部 buffer 控制操作，即通过 [hbn_vnode_set_ochn_buf_attr](#hbn_vnode_set_ochn_buf_attr) 下发申请内部 buffer


<spin  id="hbn_vnode_get_output_frame"/> </span>

### hbn_vnode_get_output_frame
#### 【函数声明】

```
hobot_status hbn_vnode_get_output_frame(hbn_vnode_handle_t vnode_fd, uint32_t ochn_id, hbn_vnode_image_t *img)
```

#### 【参数描述】

- [IN] hbn_vnode_handle_t vnode_fd：模块的 vnode handle；

- [IN] uint32_t ochn_id：模块的输出通道 id，通道 id 见 :[ 模块通道说明 ](#channel_description)

- [IN] hbn_vnode_image_t *img：输出图像 buffer 地址；

#### 【返回值】

- 成功： HBN_STATUS_SUCESS 0

- 失败：异常为负值错误码，参考 [ 返回值说明 ](#return_val)

#### 【功能描述】

获取模块处理后的图像 buffer，和 hbn_vnode_set_output_frame 配合使用，非阻塞型接口，用法参考 sample 代码。

#### 【注意事项】

- 只支持 VSE， GDC 和 GDC 绑定 VSE，三种场景回灌模式使用
- 需控制输出 buffer 的申请和释放以及 cache 管理
- 输出 buf 需满足： Y 和 UV 地址空间要连续，使用 ION 空间，填充必要 bufferindex 和 share_id
- 不支持同时有内部 buffer 控制操作，即通过 [hbn_vnode_set_ochn_buf_attr](#hbn_vnode_set_ochn_buf_attr) 下发申请内部 buffer

<span id="hbn_vflow_create"/> </span>

### hbn_vflow_create


#### 【函数声明】
```
hobot_status hbn_vflow_create(hbn_vflow_handle_t *vflow_fd)
```
#### 【参数描述】

- [OUT] hbn_vflow_handle_t *vflow_fd： vflow handle；

#### 【返回值】

- 成功： HBN_STATUS_SUCESS 0

- 失败：异常为负值错误码，参考 [ 返回值说明 ](#return_val)

#### 【功能描述】

创建一个 vflow，返回 vflow handle。

#### 【注意事项】

无

 <span id="hbn_vflow_destroy"/> </span>

### hbn_vflow_destroy


#### 【函数声明】
```
void hbn_vflow_destroy(hbn_vflow_handle_t vflow_fd)
```
#### 【参数描述】

- [IN] hbn_vflow_handle_t *vflow_fd： vflow handle；

#### 【返回值】

无

#### 【功能描述】

根据 vflow handle，销毁一个 vflow。

#### 【注意事项】

无

<span id="hbn_vflow_add_vnode"/> </span>

### hbn_vflow_add_vnode


#### 【函数声明】
```
hobot_status hbn_vflow_add_vnode(hbn_vflow_handle_t vflow_fd, hbn_vnode_handle_t vnode_fd)
```
#### 【参数描述】

- [IN] hbn_vflow_handle_t *vflow_fd： vflow handle；
- [IN] hbn_vnode_handle_t vnode_fd：模块的 vnode handle；

#### 【返回值】

- 成功： HBN_STATUS_SUCESS 0

- 失败：异常为负值错误码，参考 [ 返回值说明 ](#return_val)

#### 【功能描述】

把模块添加到 vflow 里面，用 vflow 管理起来。

#### 【注意事项】

无


<span id="hbn_vflow_bind_vnode"/> </span>

### hbn_vflow_bind_vnode


#### 【函数声明】
```
hobot_status hbn_vflow_bind_vnode(hbn_vflow_handle_t vflow_fd, hbn_vnode_handle_t src_vnode_fd, uint32_t out_chn, hbn_vnode_handle_t dst```_vnode_fd, uint32_t in_chn)
```

#### 【参数描述】

- [IN] hbn_vflow_handle_t *vflow_fd： vflow handle；

- [IN] hbn_vnode_handle_t src_vnode_fd：源模块的 vnode handle；

- [IN] uint32_t out_chn：源模块的输出通道 id，通道 id 见 :[ 模块通道说明 ](#channel_description)

- [IN] hbn_vnode_handle_t dst_vnode_fd：目的模块的 vnode handle；

- [IN] uint32_t in_chn：目的模块的输入通道 id，通道 id 见 :[ 模块通道说明 ](#channel_description)

#### 【返回值】

- 成功： HBN_STATUS_SUCESS 0

- 失败：异常为负值错误码，参考 [ 返回值说明 ](#return_val)

#### 【功能描述】

把两个模块绑定到一起。绑定后 src_vnode_fd 模块的数据帧会自动流向 dst_vnode_fd 模块。

#### 【注意事项】

flow 需要创建，模块需要 open。


<span id="hbn_vflow_unbind_vnode"/> </span>

### hbn_vflow_unbind_vnode


#### 【函数声明】
```
hobot_status hbn_vflow_unbind_vnode(hbn_vflow_handle_t vflow_fd, hbn_vnode_handle_t src_vnode_fd, uint32_t out_chn, hbn_vnode_handle_t dst_vnode_fd, uint32_t in_chn)
```

#### 【参数描述】

- [IN] hbn_vflow_handle_t *vflow_fd： vflow handle；

- [IN] hbn_vnode_handle_t src_vnode_fd：源模块的 vnode handle；

- [IN] uint32_t out_chn：源模块的输出通道 id，通道 id 见 :[ 模块通道说明 ](#channel_description)

- [IN] hbn_vnode_handle_t dst_vnode_fd：目的模块的 vnode handle；

- [IN] uint32_t in_chn：目的模块的输入通道 id，通道 id 见 :[ 模块通道说明 ](#channel_description)

#### 【返回值】

- 成功： HBN_STATUS_SUCESS 0

- 失败：异常为负值错误码，参考 [ 返回值说明 ](#return_val)

#### 【功能描述】

解绑 src_vnode_fd 和 dst_vnode_fd 模块。

#### 【注意事项】

- 调用了 hbn_vflow_destroy 就无须再调用 hbn_vflow_unbind_vnode




<span id="hbn_vflow_start"/> </span>

### hbn_vflow_start


#### 【函数声明】
```
hobot_status hbn_vflow_start(hbn_vflow_handle_t vflow_fd)
```
#### 【参数描述】

- [IN] hbn_vflow_handle_t vflow_fd： vflow handle；

#### 【返回值】

- 成功： HBN_STATUS_SUCESS 0

- 失败：异常为负值错误码，参考 [ 返回值说明 ](#return_val)

#### 【功能描述】

启动一条 vflow。 vflow 里包含的 vnode 都会启动。

#### 【注意事项】

模块 vnode 需要事先添加到 vflow 中。

<span id="hbn_vflow_stop"/> </span>

### hbn_vflow_stop


#### 【函数声明】
```
hobot_status hbn_vflow_stop(hbn_vflow_handle_t vflow_fd)
```
#### 【参数描述】

- [IN] hbn_vflow_handle_t vflow_fd： vflow handle；

#### 【返回值】

- 成功： HBN_STATUS_SUCESS 0

- 失败：异常为负值错误码，参考 [ 返回值说明 ](#return_val)

#### 【功能描述】

停止一条 vflow。 vflow 里包含的 vnode 都会停止。

#### 【注意事项】

和 hbn_vflow_start 成对使用。


<spin  id="hbn_vflow_get_vnode_handle"/> </span>

### hbn_vflow_get_vnode_handle


#### 【函数声明】
```
hbn_vnode_handle_t hbn_vflow_get_vnode_handle(hbn_vflow_handle_t vflow_fd, hb_vnode_type vnode_type, uint32_t index)
```

#### 【参数描述】
- [IN] hbn_vflow_handle_t vflow_fd： vflow handle；

- [IN] hb_vnode_type vnode_type：模块 id；

- [IN] uint32_t index： context id，范围为 [0, 7]

#### 【返回值】

- 成功： HBN_STATUS_SUCESS 0

- 失败：异常为负值错误码，参考 [ 返回值说明 ](#return_val)

#### 【功能描述】

通过模块 id 和 context id 获取 vnode handle。

#### 【注意事项】

模块需要事先 open。


<span id="hbn_vflow_create_cfg"/> </span>

### hbn_vflow_create_cfg
#### 【函数声明】
```
hobot_status hbn_vflow_create_cfg(const char *cfg_file, hbn_vflow_handle_t *vflow_fd)
```
#### 【参数描述】

- [IN] const char *cfg_file：配置文件路径；

- [OUT] hbn_vflow_handle_t *vflow_fd：指向 vflow handle 数组的指针，可包含多个 vflow；

#### 【返回值】

- 成功： HBN_STATUS_SUCESS 0

- 失败：异常为负值错误码，参考 [ 返回值说明 ](#return_val)

#### 【功能描述】

通过配置文件创建一条包含 vnode 及其绑定关系的 vflow。
接口内部的操作有：创建 vflow、创建 vnode、 vnode 添加到 vflow、绑定 vnode。

#### 【注意事项】

无



<span id="hbn_vflow_get_version"/> </span>

### hbn_vflow_get_version


#### 【函数声明】
```
hobot_status hbn_vflow_get_version(hbn_version_t *version)
```
#### 【参数描述】

- [OUT] hbn_version_t *version：版本信息结构体指针

#### 【返回值】

- 成功： HBN_STATUS_SUCESS 0
- 失败：异常为负值错误码，参考 [ 返回值说明 ](#return_val)

#### 【功能描述】

获取 hbn api 的版本信息。

#### 【注意事项】

暂不支持。

## 数据结构

### 通用参数

<span id="hbn_buf_alloc_attr_t"/> </span>

#### hbn_buf_alloc_attr_t

| 名称        | 类型     | 最小值 | 最大值 | 默认值 | 含义                               | 必选 |
| :---------- | :------- | :----- | :----- | :----- | :--------------------------------- | :--- |
| `flags`     | `int64_t`| -      | -      | -      | buffer flag，具体参考 hbmem 模块     | 是   |
| `buffers_num`| `uint32_t`| -     | -      | -      | 申请 buffer 数量                     | 是   |
| `is_contig` | `uint32_t`| -     | -      | -      | 多图层的 buffer 是否是一块连续 buffer | 是   |

<span id="hbn_frame_info_t"/> </span>

#### hbn_frame_info_t

| 名称             | 类型           | 最小值 | 最大值  | 默认值 | 含义                                       | 必选 |
| :--------------- | :------------- | :----- | :------ | :----- | :----------------------------------------- | :--- |
| `frame_id`       | `uint32_t`     | -      | -       | -      | frame id                                     | -    |
| `timestamps`     | `uint64_t`     | -      | -       | -      | sif framestart 时，内核获取的时间戳           | -    |
| `sys_timestamps` | `uint64_t`     | -      | -       | -      | sif framestart 时，内核获取的系统时间戳       | -    |
| `tv`             | `struct timeval`| -      | -       | -      | sif framestart 时，获取的硬件时间戳           | -    |
| `trig_tv`        | `struct timeval`| -      | -       | -      | 触发模式下， sensor 被触发曝光时刻的硬件时间戳 | -    |
| `frame_done`     | `uint32_t`     | -      | -       | -      | 暂时不用                                     | -    |
| `bufferindex`    | `int32_t`      | -      | -       | -      | 对应 buffer 的 index                            |      |

<span id="hbn_vnode_image_t"/> </span>

#### hbn_vnode_image_t

| 名称       | 类型                 | 最小值 | 最大值 | 默认值 | 含义         | 必选 |
| :--------- | :------------------- | :----- | :----- | :----- | :----------- | :--- |
| `info`     | `hbn_frame_info_t`   | -      | -      | -      | frame 信息    | -    |
| `buffer`   | `hb_mem_graphic_buf_t`| -     | -      | -      | buffer 信息   | -    |
| `*metadata`| `void`               | -      | -      | -      | metadata 数据 | -    |

<span id="hbn_version_t"/> </span>

#### hbn_version_t

| 名称  | 类型     | 最小值 | 最大值 | 默认值 | 含义        | 必选 |
| :---- | :------- | :----- | :----- | :----- | :---------- | :--- |
| `major` | `uint32_t` | -  | -  | -  | 版本 major 号 | -    |
| `minor` | `uint32_t` | -  | -  | -  | 版本 minor 号 | -    |

<span id="mipi_config_t"/> </span>

### MIPI 参数

#### mipi_config_t

| 名称       | 类型              | 最小值 | 最大值 | 默认值 | 含义                                                                      | 必选 |
| :--------- | :---------------- | :----- | :----- | :----- | :------------------------------------------------------------------------ | :--- |
| `rx_enable` | `uint32_t`        | 0      | 1      | 0      | RX 设备使能，使能对应的 MIPI RX 端口。                                      | 是   |
| `rx_attr`   | `mipi_host_cfg_t` | -      | -      | -      | RX 设备属性，设置对应的 MIPI RX 端口属性。                                   | 是   |
| `rx_ex_mask`| `uint64_t`        | -      | -      | -      | RX 高级属性掩码。                                                         | 否   |
| `rx_attr_ex`| `mipi_host_param_t`| -     | -      | -      | RX 高级属性配置                                                           | 否   |
| `*bypass`   | `mipi_bypass_t`   | -      | -      | -      | MIPI RX -> TX bypass 使能， MIPI RX 接收到的数据，直接通过 MIPI TX 发送出去。 | 否   |

<span id="mipi_host_cfg_t"/> </span>

#### mipi_host_cfg_t

| 名称                              | 类型     | 最小值 | 最大值 | 默认值 | 含义                                                                                     | 必选 |
| :--------------------------------- | :------- | :----- | :----- | :----- | :------------------------------------------------------------------------------------------ | :--- |
| `phy`                              | `uint16_t`| 0      | 1      | 0      | 0: 代表 dphy， X5 只支持该协议。                                                            | 否   |
| `lane`                             | `uint16_t`| 1      | 4      | -      | mipi lane 数，目前每一个 MIPI RX 默认支持 2 lane，如果设置为 4 lane，则会开启 lane 拼接功能。 | 是   |
| `datatype`                         | `uint16_t`| -      | -      | -      | mipi 输入的数据格式，与 sensor 配置保持一致。                                               | 是   |
| `fps`                              | `uint16_t`| 0      | 120    | 0      | 帧率，供计算 MIPI 配置用。                                                               | 是   |
| `mclk`                             | `uint16_t`| 0      | 65535  | 0      | sensor mclk 配置：                                                                        | 是   |
|                                    |          |        |        |        | 0 ：使用外部 mclk                                                                         |      |
|                                    |          |        |        |        | 1 ：使用芯片 产生的 mclk 24M                                                              |      |
|                                    |          |        |        |        | 2~24: invalid  and drop                                                                  |      |
|                                    |          |        |        |        | 25~636: invalid and error                                                                |      |
|                                    |          |        |        |        | 637~ : 配置频率 =mclk*10KHz freq ->  6.37MHz~655.35MHz                                   |      |
| `mipiclk`                          | `uint16_t`| 0      | -      | 0      | mipi 总传输率 ( 所有 LANE)                                                                 | 是   |
| `width`                            | `uint16_t`| 0      | 8192   | -      | 输入图像 宽度（ pixel）                                                                   | 是   |
| `height`                           | `uint16_t`| 0      | 4096   | -      | 输入图像 高度（ pixel）                                                                   | 是   |
| `linelenth`                        | `uint16_t`| 0      | -      | -      | 带 hblank 的总行长， RX 用于 ipi 参数计算， TX 的 VPG 模式可调整帧率                               | 是   |
| `framelenth`                       | `uint16_t`| 0      | -      | -      | 带 hblank 的总高， RX 用于 ipi 参数计算， TX 的 VPG 模式可调整帧率                                 | 是   |
| `settle`                            | `uint16_t`| 0      | -      | -      | mipi settle, phy 的 settle 时间配置，报 phy 错时可调整                                        | 是   |
| `ppi_pg`                            | `uint16_t`| 0      | -      | -      | mipi 输出 test pattern，不生效，预留使用                                                 | 否   |
| `hsaTime`                           | `uint16_t`| 0      | -      | -      | ipi 配置， time of horizontal synchronism active                                          | 否   |
| `hbpTime`                           | `uint16_t`| 0      | -      | -      | ipi 配置， time of horizontal back period                                                 | 否   |
| `hsdTime`                           | `uint16_t`| 0      | -      | -      | ipi 配置， time of horizontal sync porch delay period                                     | 否   |
| `channel_num`                       | `uint16_t`| 0      | 4      | 0      | mipi 虚拟通道 number                                                                      | 是   |
| `channel_sel[MIPIHOST_CHANNEL_NUM]` | `uint16_t`| 0      | 1      | 0      | mipi 虚拟通道对应的 ipi channel                                                            | 是   |
``


### SIF 参数

<span id="vin_attr_t"/> </span>

#### vin_attr_t

| 名称                 | 类型                 | 最小值 | 最大值 | 默认值 | 含义                        | 必选 |
| :------------------ | :------------------- | :------ | :------ | :------ | :-------------------- | :--- |
| `vin_node_attr`        | `vin_node_attr_t`      | -      | -      | -      | vin node 属性描述           | 是   |
| `vin_attr_ex`          | `vin_attr_ex_t`        | -      | -      | -      | vin node 增强属性描述       | 是   |
| `vin_ochn_attr[]`      | `vin_ochn_attr_t`      | -      | -      | -      | vin node 输出通道属性描述   | 是   |
| `vin_ichn_attr`        | `vin_ichn_attr_t`      | -      | -      | -      | vin node 输入通道属性描述   | 是   |
| `vin_ochn_buff_attr[]` | `vin_ochn_buff_attr_t` | -      | -      | -      | vin node 输出 buffer 属性描述 | 是   |

<span id="vin_node_attr_t"/> </span>

#### vin_node_attr_t

| 名称      | 类型        | 最小值 | 最大值 | 默认值 | 含义                            | 必选 |
| --------- | ----------- | ------ | ------ | ------ | ----------------------------- | ---- |
| `cim_attr`  | `cim_attr_t`  | -      | -      | -      | cim/sif 属性描述                | 是   |
| `lpwm_attr` | `lpwm_attr_t` | -      | -      | -      | lpwm 属性描述，用于多 sensor 同步 | 否   |
| `vcon_attr` | `vcon_attr_t` | -      | -      | -      | vcon 属性描述                   | 否   |
| `flow_id`   | `uint32_t`    | 0      | -      | -      | pipeline id，可以不用设置       | 否   |

<span id="cim_attr_t"/> </span>

#### cim_attr_t

| 名称        | 类型            | 最小值 | 最大值 | 默认值 | 含义                             | 必选 |
| ----------- | --------------- | ------ | ------ | ------ | -------------------------------- | ---- |
| `mipi_en`   | `uint32_t`      | 0      | 1      | 0      | 使能 mipi，预留值，目前不需要配置 | 否   |
| `mipi_rx`   | `uint32_t`      | 0      | 4      | 0      | mipi rx 端口号                   | 是   |
| `vc_index`  | `uint32_t`      | 0      | 4      | 0      | mipi virtual index               | 是   |
| `ipi_channel` | `uint32_t`      | 1      | 2      | 0      | ipi channel number，             | 是   |
|             |                 |        |        |        | linear mode 为 1 ，               |      |
|             |                 |        |        |        | hdr dol2 mode 为 2               |      |
| `tpg_input` | `cim_input_tpg_t` | -    | -      | -      | 预留使用                         | 否   |
| `func`      | `cim_func_desc_t` | -    | -      | -      | cim/sif 高阶功能                 | 是   |

<span id="cim_func_desc_t"/> </span>

#### cim_func_desc_t

| 名称               | 类型              | 最小值 | 最大值 | 默认值 | 含义                                                               | 必选 |
| :----------------- | :---------------- | :----- | :----- | :----- | :----------------------------------------------------------------- | :--- |
| `enable_frame_id`  | `uint32_t`        | 0      | 1      | 0      | 使能 frame id                                                       | 否   |
| `set_init_frame_id`| `uint32_t`        | 0      | -      | 0      | frame id 初始赋值                                                   | 否   |
| `time_stamp_en`    | `uint32_t`        | -      | -      | -      | 使能时间戳                                                         | 否   |
| `time_stamp_mode`  | `uint32_t`        | 1      | 8      | -      | 时间戳模式选择                                                     | 否   |
|                    |                   |        |        |        | 1 ：时间戳为 sensor 到达 sif 的时间                                  |      |
|                    |                   |        |        |        | 2 ：时间戳 trigger 时间戳功能的时间，相当于 trigger source 的时间   |      |
|                    |                   |        |        |        | 其他：预留值                                                       |      |
| `enable_pattern`   | `uint32_t`        | -      | -      | -      | 预留值，无需使用                                                   | 否   |
| `skip_frame`       | `uint32_t`        | -      | -      | -      | 预留值，无需使用                                                   | 否   |
| `input_fps`        | `uint32_t`        | -      | -      | -      | 预留值，无需使用                                                   | 否   |
| `output_fps`       | `uint32_t`        | -      | -      | -      | 预留值，无需使用                                                   | 否   |
| `skip_nums`        | `uint32_t`        | -      | -      | -      | 预留值，无需使用                                                   | 否   |
| `hw_extract_m`     | `uint32_t`        | -      | -      | -      | 预留值，无需使用                                                   | 否   |
| `hw_extract_n`     | `uint32_t`        | -      | -      | -      | 预留值，无需使用                                                   | 否   |
| `hdr_mode`         | `enum hdr_mode`   | 0      | 2      | 0      | 设置值为 enum hdr_mode：                                            | 是   |
|                    |                   |        |        |        | 0: 无需 SoC ISP 做多帧合成                                           |      |
|                    |                   |        |        |        | 1: 需要 SoC 侧做两帧合成                                             |      |
|                    |                   |        |        |        | 2: 需要 SoC 侧做三帧合成（预留， X5 不支持）                           |      |


<span id="vin_ochn_attr_t"/> </span>

#### vin_ochn_attr_t

| 名称              | 类型                      | 最小值 | 最大值 | 默认值 | 含义                                  | 必选 |
| :---------------- | :------------------------ | :----- | :----- | :----- | :----------------------------------- | :--- |
| `ddr_en`          | `uint32_t`                | 0      | 1      | 0      | 数据是否写到 DDR                     | 是   |
| `roi_en`          | `uint32_t`                | -      | -      | -      | 预留                                  | 否   |
| `emb_en`          | `uint32_t`                | -      | -      | -      | 预留， sensor embedded data 是否写到 DDR  | 否   |
| `ochn_attr_type`  | `vin_ochn_attr_type_e`    | -      | -      | -      | vin ochn 属性 <br/>VIN_BASIC_ATTR, // 默认，最基础的 vin 属性 <br/>VIN_EMB_ATTR，// sensor 带有 emb 输出 | 是   |
| `vin_basic_attr`  | `vin_basic_attr_t`        | -      | -      | -      | vin basic 属性，下 ddr 需要设置         | 是   |
| `rawds_attr`      | `vin_rawds_attr_t`        | -      | -      | -      | 预留                                  | 否   |
| `roi_attr`        | `vpm_commn_roi_data_desc` | -      | -      | -      | 预留                                  | 否   |
| `emb_attr`        | `vin_emb_attr_t`          | -      | -      | -      | 预留， emb 需要设置                    | 否   |

<span id="vin_basic_attr_t"/> </span>

#### vin_basic_attr_t

| 名称      | 类型     | 最小值 | 最大值 | 默认值 | 含义                                        | 必选 |
| :-------- | :------- | :----- | :----- | :----- | :------------------------------------------ | :--- |
| `pack_mode` | `uint32_t` | - | - | - | 预留                                        | 否   |
| `wstride`   | `uint32_t` | 0 | - | - | cim/sif 下 ddr 的 wide stride， 16 字节对齐。  | 是   |
|             |           |       |       |       | sensor raw8 为 width， raw10~raw16 为 2*width |      |
| `vstride`   | `uint32_t` | - | - | - | 预留                                        | 否   |
| `format`    | `uint32_t` | - | - | - | 下 ddr 时需要设置                           | 是   |

<span id="vin_pdaf_attr_t"/> </span>

#### vin_pdaf_attr_t

| 名称           | 类型     | 最小值 | 最大值 | 默认值 | 含义                                                         | 必选 |
| -------------- | -------- | ------ | ------ | ------ | ------------------------------------------------------------ | ---- |
| pdaf_en        | uint32_t | -      | -      | 0      | PD 信息通道是否使能， 1 为使能， 0 为不使能                       | 是   |
| pd_ipi_channel | uint32_t | 0      | 3      | -      | 指定 PD 信息从哪个 IPI 通道传输。<br/>RAW 数据从 IPI 通道 0 传输， PD 信息可指定为 1 ，从 IPI 通道 1 传输 | 是   |
| pd_width       | uint32_t | -      | -      |        | PD 信息的宽                                                   | 是   |
| pd_height      | uint32_t | -      | -      | -      | PD 信息的高                                                   | 是   |
| pd_format      | uint32_t | -      | -      | -      | PD 信息的格式                                                 | 是   |

<span id="vin_ichn_attr_t"/> </span>

#### vin_ichn_attr_t

| 名称   | 类型     | 最小值 | 最大值 | 默认值 | 含义                                     | 必选 |
| :----- | :------- | :----- | :----- | :----- | :--------------------------------------- | :--- |
| `format` | `uint32_t` | - | - | - | vin format， sensor 输出 format          | 是   |
| `width`  | `uint32_t` | 0      | 8192   | 0      | sensor 输出分辨率 宽度 pixel            | 是   |
| `height` | `uint32_t` | 0      | 4096   | 0      | sensor 输出分辨率 高度 pixel            | 是   |

<span id="vin_ochn_buff_attr_t"/> </span>

#### vin_ochn_buff_attr_t

| 名称        | 类型     | 最小值 | 最大值 | 默认值 | 含义                                      | 必选 |
| :---------- | :------- | :----- | :----- | :----- | :---------------------------------------- | :--- |
| `buffers_num` | `uint32_t` | 0      | -      | 0      | cim/sif 下 ddr 的 buffer number，一般设置为 6 | 是   |
| `flags`       | `int64_t` | -      | -      | -      | 一般在程序设置为：                       | 否   |
|               |           |        |        |        | hbn_buf_alloc_attr_t.flags = HB_MEM_USAGE_CPU_READ_OFTEN 逻辑或 |      |
|               |           |        |        |        | HB_MEM_USAGE_CPU_WRITE_OFTEN 逻辑或       |      |
|               |           |        |        |        | HB_MEM_USAGE_CACHED                      |      |

<span id="lpwm_attr_t"/> </span>

#### lpwm_attr_t

| 名称                                         | 类型     | 最小值 | 最大值 | 默认值 | 含义                    | 必选 |
| :------------------------------------------ | :------- | :----- | :----- | :----- | :----------------------- | :--- |
| `enable`                                    | `uint32_t` | 0      | -      | 0      | 是否使能 LPWM           | 否   |
| `lpwm_chn_attr_t lpwm_chn_attr[LPWM_CHN_NUM]` | -         | -      | -      | -      | LPWM channel 属性配置    | 否   |
|                                              |           |        |        |        | LPWM_CHN_NUM 值为 4      |      |

<span id="lpwm_chn_attr_t"/> </span>

#### lpwm_chn_attr_t

| 名称            | 类型       | 最小值   | 最大值              | 默认值   | 含义                                                                   | 必选 | 输出 30hz，高电平 10us 参数 |
| :-------------- | :--------- | :------- | :------------------ | :------- | :--------------------------------------------------------------------- | :--- | ------------------------- |
| `trigger_source` | `uint32_t` | 0        | 10                   | 0        | 触发源选择                                                             | 否   |                           |
|                 |           |          |                      |          | 0-3: pad_trigger_in，硬件 IO 输入 PPS                                  |      |                           |
|                 |           |          |                      |          | 4: enet_ptp_pps，预留                                                  |      |                           |
|                 |           |          |                      |          | 5: sw_trigger_in，软件触发                                             |      |                           |
|                 |           |          |                      |          | 6: gps_trigger_in (TIME_SYNC2)，硬件 IO 输入 PPS                       |      |                           |
|                 |           |          |                      |          | 7: mcu_trigger_in (TIME_SYNC1)， 硬件 IO 输入 PPS                      |      |                           |
|                 |           |          |                      |          | 8: time_sync2_in  (TIME_SYNC3)，硬件 IO 输入 PPS                       |      |                           |
|                 |           |          |                      |          | 9: time_sync3_in  (TIME_SYNC4)，硬件 IO 输入 PPS                       |      |                           |
|                 |           |          |                      |          | 10: camera_1sec_pulse_out，预留                                        |      |                           |
|                 |           |          |                      |          | 注：硬件 IO 对应的 pin 请在 pinlist 资料中查找。                         |      |                           |
| `trigger_mode`  | `uint32_t` | 0        | 1                    | 0        | 触发机制 (1- 外界硬件触发， 0- 内部软件触发 )                              | 否   |                           |
|                 |           |          |                      |          | trigger_mode 设置为 0 时，自动设置为软件触发，可以不选择 trigger_source |      |                           |
| `period`        | `uint32_t` | 2 us     | 1000000 us           | 0        | 周期，实际生效的周期时间为 (period + 1)us                              | 否   | 33332                       |
| `offset`        | `uint32_t` | 0        | (1000000/period) us  | 0        | 源触发 LPWM 后， LPWM 经过 offset(us) 再输出方波。                       | 否   | 11                          |
|                 |           |          |                      |          | 时间生效的时间为： (1/24) * (offset * 24 + 3) us 向下取整。              |      |                           |
| `duty_time`     | `uint32_t` | 0        | (4096/period) us     | 0        | 有效高电平时间，实际生效的时间为 (duty_time + 1)us                     | 否   | 9                           |
| `threshold`     | `uint32_t` | 0        | 65535 us             | 0        | 缓慢同步功能阈值                                                       | 否   | 0                           |
| `adjust_step`   | `uint32_t` | 0        | 15                   | 0        | 每次的调整时间 adjust_time = 2 ^ adjust_step                            | 否   | 0                           |


### ISP 参数
<span id="isp_cfg_t"/> </span>

#### isp_cfg_t

| 名称        | 类型               | 最小值  | 最大值  | 默认值  | 含义                | 必选 |
| :---------- | :----------------- | :------ | :------ | :------ | :------------------ | :--- |
| `isp_attr`  | `isp_attr_t`       | ·       | ·       | ·       | ISP 基本属性         | 是   |
| `ochn_attr` | `isp_ochn_attr_t`  | ·       | ·       | ·       | ISP 输出通道属性     | 是   |
| `ichn_attr` | `isp_ichn_attr_t`  | ·       | ·       | ·       | ISP 输入通道属性     | 是   |

<span id="isp_attr_t"/> </span>

#### isp_attr_t

| 名称        | 类型               | 最小值  | 最大值  | 默认值  | 含义                                                    | 必选 |
| :---------- | :----------------- | :------ | :------ | :------ | :------------------------------------------------------ | :--- |
| `input_mode`| `uint32_t`         | 0       | 2       | 0       | 前级模块输入方式 <br/>0 - PASSTHROUGH_MODE<br/>1 - MCM_MODE<br/>2 - DDR_MODE<br/> 需要注意的是：<br/>input_mode 为 0 或者 1 时， sif 绑定到 isp 要用通道 1 。<br/>input_mode 为 2 时， sif 下 drr 的功能必须打开，<br/>sif 绑定到 isp 要用通道 0 。<br/>PASSTHROUGH_MODE 仅支持单路，<br/>MCM_MODE 最大支持四路。 | 是   |
| `sched_mode`| `uint32_t`         | 0       | 2       | 0       | 图像处理优先级策略，暂时不支持 <br/>0 - ROUND_ROBIN<br/>1 - FIXED_SEQUENCE<br/>2 - FIFO | 否   |
| `tile_mode` | `uint32_t`         | 0       | 1       | 0       | 是否开启 tile_mode 模式，当输入尺寸超过 4096 时必须开启    | 否   |
| `sensor_mode`| `isp_sensor_mode_e`| 0      | 2       | 0       | 对应的 sensor 模式 <br/>0 - ISP_NORMAL_M<br/>1 - ISP_DOL2_M<br/>2 - ISP_PWL_M | 是   |
| `crop`      | `common_rect_t`    | ·       | ·       | ·       | 指对输入图像的 crop                                      | 否   |

<span id="isp_ichn_attr_t"/> </span>

#### isp_ichn_attr_t

| 名称      | 类型           | 最小值      | 最大值      | 默认值 | 含义                      | 必选 |
| :-------- | :------------- | :---------- | :---------- | :----- | :------------------------- | :--- |
| `tpg_en`  | `cam_bool_e`   | 0           | 1           | 0      | 开启 tpg 功能，暂时不支持   | 否   |
| `width`   | `uint32_t`     | 0           | 5472        | 0      | 输入图像宽度              | 是   |
| `height`  | `uint32_t`     | 0           | 3076        | 0      | 输入图像高度              | 是   |
| `fmt`     | `frame_format_e`| FRM_FMT_RAW | FRM_FMT_RAW | 0      | FRM_FMT_NULL - 无效值 , FRM_FMT_RAW - RAW 格式 , FRM_FMT_NV12 - NV12 格式， FRM_FMT_UYVY - UYVY 格式， 目前只支持 RAW 格式 | 是   |
| `bit_width`| `uint32_t`     | 8           | 12          | 0      | 输入图像数据的 bit 宽度     | 是   |

<span id="isp_ochn_attr_t"/> </span>

#### isp_ochn_attr_t

| 名称      | 类型           | 最小值       | 最大值       | 默认值 | 含义                      | 必选 |
| :-------- | :------------- | :----------- | :----------- | :----- | :------------------------- | :--- |
| `ddr_en`  | `cam_bool_e`   | 0            | 1            | 0      | 图像输出到 ddr             | 是   |
| `out`     | `common_rect_t`| ·            | ·            | ·      | 输出图像的尺寸，暂时不支持后级 crop，因此配置无作用 | 否   |
| `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            | 8      | 输出图像数据的 bit 宽度， 目前只支持 nv12 格式， 8bit | 是   |

### VSE 参数

<span id="vse_ochn_type_e"/> </span>

#### vse_ochn_type_e

| 名称                  | 类型 | 最小值 | 最大值 | 默认值 | 含义                                                                 | 必选 |
|-----------------------|------|--------|--------|--------|----------------------------------------------------------------------|------|
| `VSE_DOWN_SCALE_4K`     | -    | -      | -      | -      | downscale 输出通道，最大支持 4K                                       | -    |
| `VSE_DOWN_SCALE_1080P0` | -    | -      | -      | -      | downscale 输出通道，最大支持 1080p-0                                 | -    |
| `VSE_DOWN_SCALE_1080P1` | -    | -      | -      | -      | downscale 输出通道，最大支持 1080p-1                                 | -    |
| `VSE_DOWN_SCALE_720P0`  | -    | -      | -      | -      | downscale 输出通道，最大支持 720p-0                                  | -    |
| `VSE_DOWN_SCALE_720P1`  | -    | -      | -      | -      | downscale 输出通道，最大支持 720p-1                                  | -    |
| `VSE_UP_SCALE_4K`       | -    | -      | -      | -      | upscale 输出通道，支持最多 4 倍放大，最大输出尺寸为 4096x3076        | -    |
|                         |      |        |        |        | 注意是 crop 后尺寸的 4 倍；宽、高放大比例可随意调整，总放大倍数为 4 |      |
| `VSE_OCHN_MAX`          |      |        |        |        |                                                                      |      |

---

<span id="vse_cfg_t"/> </span>

#### vse_cfg_t

| 名称                    | 类型            | 最小值 | 最大值 | 默认值 | 含义                | 必选 |
|-------------------------|-----------------|--------|--------|--------|---------------------|------|
| `vse_attr`              | `vse_attr_t`    | -      | -      | -      | vse 基本属性        | 是   |
| `ochn_attr[VSE_OCHN_MAX]`| `vse_ochn_attr_t` | -    | -      | -      | vse 输出通道属性    | 是   |
| `ichn_attr`             | `vse_ichn_attr_t` | -    | -      | -      | vse 输入通道属性    | 是   |

---

<span id="vse_attr_t"/> </span>

#### vse_attr_t

| 名称        | 类型             | 最小值 | 最大值 | 默认值 | 含义                                | 必选 |
|-------------|------------------|--------|--------|--------|-------------------------------------|------|
| `fps`       | `frame_fps_ctrl_t`| -      | -      | 0      | 配置输入图像 src 的 fps，用于帧率控制 | 否   |

---

<span id="vse_ichn_attr_t"/> </span>

#### 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    | 图像格式，目前只支持 NV12 格式         | 是   |
| `bit_width` | `uint32_t`     | 8            | 8            | 0      | 输入图像 bit 宽度                      | 是   |

---

<span id="vse_ochn_attr_t"/> </span>

#### vse_ochn_attr_t

| 名称      | 类型             | 最小值       | 最大值         | 默认值 | 含义                                    | 必选 |
|-----------|------------------|--------------|----------------|--------|-----------------------------------------|------|
| `chn_en`  | `cam_bool_e`      | 0            | 1              | 0      | 使能通道                               | 是   |
| `roi`     | `common_rect_t`   | -            | -              | -      | 对输出图像的 crop，值全为 0 表示禁用    | 否   |
| `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      | 输出图像格式，目前只支持 NV12 格式     | 是   |
| `bit_width` | `uint32_t`       | 8            | 8              | 0      | 输出图像 bit 宽度                      | 是   |
| `fps`     | `frame_fps_ctrl_t`| -            | -              | 0      | 配置输出图像 dst 的 fps，用于帧率控制   | 否   |

---

注意事项：
- 宽度、高度、格式等字段需符合硬件能力限制。
- 默认值为 0 时，可能会禁用相关功能。


### GDC 参数

<span id="gdc_attr_t"/> </span>

#### gdc_attr_t

| 名称          | 类型     | 最小值 | 最大值 | 默认值 | 含义                         | 必选 |
|---------------|----------|--------|--------|--------|------------------------------|------|
| `config_addr` | `uint64_t` | -      | -      | -      | gdc 配置文件的地址           | 是   |
| `config_size` | `uint32_t` | -      | -      | -      | gdc 配置文件的大小           | 是   |
| `div_width`   | `uint8_t`  | 8      | -      | 0      | 暂时不用                     | 是   |
| `div_height`  | `uint8_t`  | 0      | -      | 0      | 暂时不用                     | 否   |
| `total_planes`| `uint32_t` | 0      | -      | 0      | yuv 图层数量                 | 是   |
| `binary_ion_id`| `int32_t` | 0      | -      | 0      | 配置文件的物理地址的 shareid | 是   |
| `binary_offset`| `uint64_t` | 0     | -      | 0      | 配置文件所在物理地址的 offset | 是   |

---

<span id="gdc_ichn_attr_t"/> </span>

#### gdc_ichn_attr_t

| 名称         | 类型     | 最小值 | 最大值 | 默认值 | 含义               | 必选 |
|--------------|----------|--------|--------|--------|--------------------|------|
| `input_width`| `uint32_t` | 0      | 4096   | 0      | 输入图像的宽度     | 是   |
| `input_height`| `uint32_t` | 0     | 2160   | 0      | 输入图像的高度     | 是   |
| `input_stride`| `uint32_t` | 0     | -      | 0      | 输入图像的 stride  | 是   |
| `n_in_one`   | `uint32_t` | 0      | -      | 0      | 回灌 n 帧合成 1 帧 | 是   |

---

<span id="gdc_ochn_attr_t"/> </span>

#### gdc_ochn_attr_t

| 名称          | 类型     | 最小值 | 最大值 | 默认值 | 含义               | 必选 |
|---------------|----------|--------|--------|--------|--------------------|------|
| `output_width`| `uint32_t` | 0      | -      | 0      | 输出图像的宽度     | 是   |
| `output_height`| `uint32_t` | 0     | -      | 0      | 输出图像的高度     | 是   |
| `output_stride`| `uint32_t` | 0     | -      | 0      | 输出图像的 stride  | 是   |

---

#### 注意事项
1. GDC 输入输出宽高必须是偶数。
2. 输入输出 stride 必须为 16 的倍数。


### N2D 参数

<span id="n2d_command_t"/> </span>

#### n2d_command_t

| 名称      | 类型 | 最小值 | 最大值 | 默认值 | 含义                     | 必选 |
|-----------|------|--------|--------|--------|--------------------------|------|
| scale     | -    | -      | -      | -      | 表示将进行 scale（缩放）处理  | 是   |
| overlay   | -    | -      | -      | -      | 表示将进行 overlay（叠层）处理 | 是   |
| stitch    | -    | -      | -      | -      | 表示将进行 stitch（拼接）处理  | 是   |
| csc       | -    | -      | -      | -      | 表示将进行 csc（色彩空间转换）处理 | 是   |

<span id="n2d_config_t"/> </span>

#### n2d_config_t

| 名称                         | 类型          | 最小值 | 最大值 | 默认值 | 含义                     | 必选 |
|------------------------------|---------------|--------|--------|--------|--------------------------|------|
| ninputs                      | uint32_t      | 0      | 4      | -      | 输入通道数               | 是   |
| input_width[N2D_IN_MAX]      | uint32_t      | 0      | 4096   | -      | n2d 输入通道宽度         | 是   |
| input_height[N2D_IN_MAX]     | uint32_t      | 0      | 2160   | -      | n2d 输入通道高度         | 是   |
| input_stride[N2D_IN_MAX]     | uint32_t      | -      | -      | -      | n2d 输入通道行跨         | 是   |
| output_width                 | uint32_t      | 0      | 4096   | -      | n2d 输出通道宽度         | 是   |
| output_height                | uint32_t      | 0      | 2160   | -      | n2d 输出通道高度         | 是   |
| output_stride                | uint32_t      | -      | -      | -      | n2d 输出通道行跨         | 是   |
| output_format                | uint32_t      | -      | -      | -      | n2d 输出通道格式         | 是   |
| in_buffer_addr[N2D_IN_MAX][HBN_VIO_BUFFER_MAX_PLANES] | uint64_t | - | - | -  | n2d 输入通道数据地址     | 是   |
| out_buffer_addr[HBN_VIO_BUFFER_MAX_PLANES] | uint64_t | -      | -      | -  | n2d 输出通道数据地址     | 是   |
| command                      | n2d_command_t | -      | -      | -      | 该配置文件进行的操作      | 是   |



<span id="return_val"/> </span>
## 返回值说明

| 错误码 | 宏定义                           | 描述                             | 常见原因及解决方法 |
| :---------- | :------- | :------ | :------ |
| 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，由 HNB 框架 自动分配 |
| 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            | 未知错误                         | |

