跳转至

Sgs NVR 应用开发指南

本文档介绍 Sgs NVR 应用的开发流程、关键概念和使用方法,帮助开发者快速掌握基于 SGS MI 系统的 NVR 应用开发。

REVISION HISTORY

Revision No.
Description
Date
1.0
  • Initial release
  • 01/20/2026

    1. 基础概念介绍

    1.1 Sgs MI 系统概述

    Sgs MI(Module Interface)系统是 SGS SoC 平台的多媒体软件开发套件,提供了一整套统一的 API 接口来访问底层硬件 IP。MI 系统通过模块化的设计,将复杂的硬件操作抽象为简单易用的接口,使开发者能够专注于应用层逻辑,而无需关心底层硬件细节。

    核心特点

    • 硬件抽象:屏蔽不同芯片间的硬件差异
    • 模块化设计:每个功能模块独立管理,包括 VDEC、DISP、VENC、SCL 等
    • 统一接口:所有模块遵循相同的调用规范
    • 跨平台支持:支持 PureRTOS、PureLinux、DualOS、LightningBoot 等多种操作系统

    1.2 NVR 关键模块说明

    1.2.1 MI_SYS(系统模块)

    作用:系统核心模块,负责全局初始化、资源管理和模块间数据传输。

    主要功能

    • 系统初始化与退出(MI_SYS_Init / MI_SYS_Exit
    • 模块间通道绑定(MI_SYS_BindChnPort
    • 内存管理(MMA heap 分配)
    • 缓冲区管理(Buffer 分配与传递)
    • 时间戳管理(PTS 同步)

    头文件

    • mi_sys.h:主要 API 接口
    • mi_sys_datatype.h:数据类型定义

    1.2.2 MI_VDEC(视频解码模块)

    作用:解码 H.264/H.265/JPEG 等格式的视频码流

    主要功能

    • 解码设备创建/销毁(MI_VDEC_CreateDev / MI_VDEC_DestroyDev
    • 解码通道创建/销毁(MI_VDEC_CreateChn / MI_VDEC_DestroyChn
    • 解码参数配置(码流类型、分辨率等)
    • 码流输入(MI_VDEC_SendStream
    • 解码通道控制(MI_VDEC_StartChn / MI_VDEC_StopChn

    头文件

    • mi_vdec.h
    • mi_vdec_datatype.h

    关键数据类型

    typedef enum {
        E_MI_VDEC_CODEC_TYPE_H264 = 0,    // H.264 编码
        E_MI_VDEC_CODEC_TYPE_H265,        // H.265 编码
        // ...
    } MI_VDEC_CodecType_e;
    

    1.2.3 MI_DISP(显示模块)

    作用:将视频数据输出到显示设备,包括 HDMI、VGA、MIPI 等。

    主要功能

    • 显示设备创建/销毁(MI_DISP_CreateDevice / MI_DISP_DestroyDevice
    • 显示层管理(Layer)
    • 通道管理(MI_DISP_CreateChn / MI_DISP_DestroyChn
    • 输出时序配置(MI_DISP_SetOutputTiming
    • 显示区域设置(MI_DISP_SetChnDispRect

    头文件

    • mi_disp.h
    • mi_disp_datatype.h

    支持的输出接口

    • HDMI
    • VGA
    • MIPI
    • TTL
    • BT1120

    1.2.4 MI_SCL(缩放模块)

    作用:对图像进行缩放处理,支持多路不同分辨率输出

    主要功能

    • 图像缩放
    • 裁剪
    • 多路输出
    • 旋转支持

    头文件

    • mi_scl.h
    • mi_scl_datatype.h

    1.2.5 MI_VENC(视频编码模块)

    作用:将 YUV 图像编码为 H.264/H.265/JPEG 等格式

    主要功能

    • 编码通道创建/销毁(MI_VENC_CreateChn / MI_VENC_DestroyChn
    • 编码参数配置(码率、GOP、QP 等)
    • 码流获取(MI_VENC_GetStream
    • IDR 帧请求(MI_VENC_RequestIdr

    头文件

    • mi_venc.h
    • mi_venc_datatype.h

    1.2.6 MI_GFX(图形处理模块)

    作用:提供图形处理功能(缩放、旋转、叠加等)

    主要功能

    • 位图拷贝(BitBlit)
    • 图像缩放
    • 图像旋转(0°/90°/180°/270°)
    • 镜像翻转
    • Alpha 混合

    头文件

    • mi_gfx.h
    • mi_gfx_datatype.h

    1.2.7 MI_FB(帧缓冲模块)

    作用:管理 Framebuffer,用于 UI 显示

    主要功能

    • Framebuffer 设备管理
    • Alpha 值设置(Global/Pixel Alpha)
    • ColorKey 设置
    • 获取 Framebuffer 地址

    头文件

    • mi_fb.h
    • mi_fb_datatype.h

    1.2.8 MI_HDMI(HDMI 输出模块)

    作用:配置 HDMI 输出参数

    主要功能

    • HDMI 初始化与退出
    • 输出时序设置
    • 色彩空间转换配置
    • 信号增益和锐度调整

    头文件

    • mi_hdmi.h
    • mi_hdmi_datatype.h

    1.3 数据流程与控制流程

    1.3.1 数据流程

    NVR 应用的数据流程是 单向流动 的,典型的数据流向如下:

    File/RTSP → VDEC → DISP → Screen
    

    详细流程说明

    1. 码流输入:从文件或网络读取 H.264/H.265 码流
    2. VDEC 解码:VDEC 模块解码码流,输出 YUV 数据
    3. SCL 处理:SCL 将 YUV 数据缩放到目标分辨率,可输出多路不同分辨率,也可以进行rotat输出
    4. DISP 显示:DISP 将 YUV 数据输出到显示设备(HDMI、VGA 等)

    典型 Pipeline(4 路码流为例)

    +----------+     +-------+     +-----------+     +--------------------+
    | Stream 0 | --> | VDEC0 | --> | SCL0(rot) | --> | Port0 |            |
    +----------+     +-------+     +-----------+     +-------+            |
                                                     |                    |
    +----------+     +-------+                       +-------+            |
    | Stream 1 | --> | VDEC1 | --------------------> | Port1 |            |
    +----------+     +-------+                       +-------+            |
                                                     |            DISP0   | --> Screen (多画面显示)
    +----------+     +-------+                       +-------+            |
    | Stream 2 | --> | VDEC2 | --------------------> | Port2 |            |
    +----------+     +-------+                       +-------+            |
                                                     |                    |
    +----------+     +-------+                       +-------+            |
    | Stream 3 | --> | VDEC3 | --------------------> | Port3 |            |
    +----------+     +-------+                       + -------------------+
    

    1.3.2 控制流程

    控制流程是指 配置和管理 各模块的流程,主要包括:

    1. 初始化阶段

      • MI_SYS_Init():初始化系统
      • 读取配置文件(JSON 格式)
      • 创建设备:MI_VDEC_CreateDev()MI_DISP_CreateDevice()
      • 配置参数:设置各模块属性
      • 创建通道:MI_VDEC_CreateChn()MI_DISP_CreateChn()
    2. 绑定阶段

      • MI_SYS_BindChnPort():建立模块间的数据传输通道
    3. 启动阶段

      • 使能设备:MI_DISP_EnableInputPort()
      • 启动通道开始解码:MI_VDEC_StartChn()
    4. 运行阶段

      • 读取码流:从文件读取 H.264/H.265 码流
      • 发送码流:MI_VDEC_SendStream()
      • 处理用户输入:切屏、抓拍等功能
    5. 停止阶段

      • 停止通道:MI_VDEC_StopChn()
      • 禁用设备:MI_DISP_DisableInputPort()
      • 解绑通道:MI_SYS_UnBindChnPort()
      • 销毁通道/设备
      • MI_SYS_Exit():退出系统

    1.4 Channel 与 Port 概念

    1.4.1 Device(设备)

    • 定义:代表一个硬件设备实例
    • 示例:VDEC 设备 0、DISP 设备 0、VENC 设备 8 等
    • 作用:管理硬件资源的全局配置

    1.4.2 Channel(通道)

    • 定义:设备上的独立数据通道
    • 示例:VDEC 通道 0~63(支持多路解码)、DISP 通道 0~63(支持多画面显示)
    • 作用:支持多个独立的数据流

    1.4.3 Port(端口)

    • 定义:通道上的输入或输出接口

    • 类型

      • InputPort:输入端口,接收上游模块的数据
      • OutputPort:输出端口,向下游模块发送数据
    • 作用:模块间数据传输的桥梁

    1.4.4 ChnPort(通道端口)

    • 定义:由 ModuleId、DevId、ChnId、PortId 组成的结构体

    • 结构

      typedef struct {
          MI_ModuleId_e eModId;    // 模块 ID(如 E_MI_MODULE_ID_VDEC)
          MI_U32         u32DevId; // 设备 ID
          MI_U32         u32ChnId; // 通道 ID
          MI_U32         u32PortId;// 端口 ID
      } MI_SYS_ChnPort_t;
      
    • 作用:唯一标识一个模块的输入或输出端口

    1.5 BindType(绑定模式)

    绑定模式定义了模块间数据传输的方式,主要通过 MI_SYS_BindType_e 枚举类型指定。

    1.5.1 NVR 常用绑定模式

    绑定模式 枚举值 十六进制 简称
    Frame Mode E_MI_SYS_BIND_TYPE_FRAME_BASE 0x00000001(1) F

    2. 应用开发流程

    2.1 开发环境准备

    2.1.1 硬件要求

    • SGS SoC 开发板(支持 NVR 功能的芯片)
    • 显示设备(HDMI/VGA/MIPI 显示屏)
    • 存储设备(存放码流文件)

    2.1.2 软件依赖

    • 交叉编译工具链:根据目标芯片选择(例如 aarch64-linux-gnu-gcc)
    • MI 库libmi_sys.solibmi_vdec.solibmi_disp.so
    • 第三方库libcjson.so(配置文件解析)
    • 系统库libpthread.so

    2.1.3 头文件路径

    MI 头文件位于 project/release/include/ 目录下。

    常用头文件:

    #include "mi_sys.h"           // 系统模块
    #include "mi_vdec.h"          // 解码模块
    #include "mi_disp.h"          // 显示模块
    #include "mi_scl.h"           // 缩放模块
    #include "mi_venc.h"          // 编码模块
    #include "mi_gfx.h"           // 图形处理模块
    #include "mi_fb.h"            // 帧缓冲模块
    #include "mi_hdmi.h"          // HDMI 模块
    

    2.2 MI API 开发标准流程

    2.2.1 初始化流程

    // 1. 初始化系统
    MI_SYS_Init(0);
    
    // 2. 创建 VDEC 设备
    MI_VDEC_InitParam_t vdecInitParam;
    // ... 配置 vdecInitParam
    MI_VDEC_CreateDev(0, &vdecInitParam);
    
    // 3. 创建 DISP 设备
    MI_DISP_InitParam_t dispInitParam;
    // ... 配置 dispInitParam
    MI_DISP_CreateDevice(0, &dispInitParam);
    
    // 4. 创建 VDEC 通道
    MI_VDEC_ChnAttr_t vdecChnAttr;
    // ... 配置 vdecChnAttr
    MI_VDEC_CreateChn(0, vdecChn, &vdecChnAttr);
    
    // 5. 创建 DISP 通道
    MI_DISP_ChnAttr_t dispChnAttr;
    // ... 配置 dispChnAttr
    MI_DISP_CreateChn(0, dispChn, &dispChnAttr);
    

    2.2.2 绑定流程

    // 定义源和目标端口
    MI_SYS_ChnPort_t srcPort = {
        .eModId = E_MI_MODULE_ID_VDEC,
        .u32DevId = 0,
        .u32ChnId = 0,
        .u32PortId = 0
    };
    
    MI_SYS_ChnPort_t dstPort = {
        .eModId = E_MI_MODULE_ID_DISP,
        .u32DevId = 0,
        .u32ChnId = 0,
        .u32PortId = 0
    };
    
    // 绑定(Frame Mode)
    MI_SYS_BindChnPort(0, &srcPort, &dstPort,
                       30, 30,  // 帧率
                       E_MI_SYS_BIND_TYPE_FRAME_BASE, 0);
    

    2.2.3 启动流程

    // 1. 使能 DISP 通道
    MI_DISP_EnableChn(0, dispChn);
    
    // 2. 使能 DISP 输入端口
    MI_DISP_EnableInputPort(layerId, dispPortId);
    
    // 3. 开始通道解码
    MI_VDEC_StartChn(0, vdecChn);
    

    2.2.4 运行与数据输入

    // 从文件读取码流并发送给解码器
    FILE *fp = fopen("stream.h265", "rb");
    MI_VDEC_Stream_t stream;
    MI_VDEC_Data_t data;
    
    while (running) {
        // 读取码流数据
        size_t readSize = fread(buffer, 1, buffer_size, fp);
        if (readSize <= 0) break;
    
        // 填充数据结构
        data.pu8Addr = buffer;
        data.u32Len = readSize;
        data.u64PTS = pts;
        data.bEndOfFrame = TRUE;
    
        stream.pstData = &data;
        stream.u32DataCount = 1;
    
        // 发送码流
        MI_VDEC_SendStream(0, vdecChn, &stream, -1);
    }
    
    fclose(fp);
    

    2.2.5 清理流程

    // 1. 停止通道解码
    MI_VDEC_StopChn(0, vdecChn);
    
    // 2. 禁用各模块
    MI_DISP_DisableInputPort(layerId, dispPortId);
    MI_DISP_DisableChn(0, dispChn);
    
    // 3. 解绑
    MI_SYS_UnBindChnPort(0, &srcPort, &dstPort);
    
    // 4. 销毁通道和设备
    MI_DISP_DestroyChn(0, dispChn);
    MI_DISP_DestroyDevice(0);
    MI_VDEC_DestroyChn(0, vdecChn);
    MI_VDEC_DestroyDev(0);
    
    // 5. 退出系统
    MI_SYS_Exit(0);
    

    2.3 关键开发要点

    2.3.1 配置文件管理

    NVR demo 使用 JSON 格式的配置文件,包含以下主要配置。

    • disp 配置:显示设备参数,包括接口类型、时序、通道数等
    • fb 配置:Framebuffer 参数,包括 Alpha 类型、UI 文件路径等
    • vdec 配置:解码设备参数,包括通道数、压缩使能、码流属性等

    配置文件示例:

    {
        "dispDevNum": 2,
        "dispArgs_0": {
            "intfType": "hdmi",
            "timing": "3840x2160_30",
            "chnNum": 32,
            "rotate": 4
        },
        "vdecDevNum": 1,
        "vdecArgs_0": {
            "chnNum": 64,
            "compressEn": 1,
            "vdecAttr": [
                {
                    "chnId": 0,
                    "picWidth": 720,
                    "picHeight": 576,
                    "codecType": 1,
                    "refFrameNum": 2,
                    "esAddHead": 1,
                    "filePath": "720x576@30.h265"
                }
            ]
        }
    }
    

    2.3.2 错误处理

    所有 MI API 返回 MI_S32 类型。

    • MI_SUCCESS(0):成功
    • 非 0:失败(具体错误码见 mi_common_datatype.h
    if (MI_SUCCESS != ret) {
        printf("Error: MI_xxx failed, ret = 0x%x\n", ret);
        // 错误处理
    }
    

    2.3.3 资源管理

    • 创建顺序:系统 → 设备 → 通道
    • 销毁顺序:通道 → 设备 → 系统(与创建相反)
    • 内存管理:使用 MMA heap 分配内存,记得释放

    2.3.4 线程安全

    • MI API 通常是线程安全的
    • 同一设备的同一通道不能在多线程中同时操作
    • 建议使用互斥锁保护共享资源

    2.3.5 性能优化

    • 合理设置缓冲区深度(MI_SYS_SetChnOutputPortDepth
    • 使用压缩模式(LSYC)降低带宽
    • 避免频繁的创建和销毁操作
    • 合理选择绑定模式

    3. nvr_demo 编译与使用

    3.1 Demo 功能概述

    nvr_demo 演示了完整的 NVR 视频 Pipeline。

    • 从文件读取 H.264/H.265 码流
    • 经由 VDEC 解码缩放
    • 通过 SCL 缩放和旋转(可选)
    • 通过 DISP 显示到屏幕
    • 支持多种测试场景,包括切屏、抓拍、PIP 等

    Pipeline 图示

    +----------+     +-------+     +------+     +-------+
    | Stream 0 | --> | VDEC0 | --> | SCL0 | --> | DISP0 | --> Screen
    +----------+     +-------+     +------+     +-------+
                                        |
                                        v
                                     +-------+
                                     | VENC8 | --> File(抓拍)
                                     +-------+
    

    3.2 编译方法

    3.2.1 项目目录结构

    sdk/verify/sample_code/demo/
    ├── nvr/nvr/                      # nvr demo 目录
    │   ├── sgs_demo_nvr.c            # 主程序
    │   ├── nvr.mk                    # 编译配置
    │   ├── dep.mk                    # 依赖配置
    │   ├── config_nvr.json           # 配置文件
    │   └── readme_zh.md              # 使用说明
    |   ...
    ├── nvr/internal/                 # 内部组件
    │   ├── common/                   # 公共组件
    │   ├── sys/                      # 系统组件
    │   ├── vdec/                     # 解码组件
    │   ├── disp/                     # 显示组件
    │   ├── scl/                      # 缩放组件
    │   ├── venc/                     # 编码组件
    │   ├── gfx/                      # 图形组件
    │   ├── fb/                       # 帧缓冲组件
    │   └── hdmi/                     # HDMI 组件
    |   ...
    

    3.2.2 编译步骤

    前提条件:确保交叉编译工具链已配置。

    方法 1:单独编译 nvr demo

    # 进入 SDK 根目录
    cd SourceCode/sdk/verify/sample_code
    
    # 编译 nvr demo
    make demo/nvr/nvr
    
    # 清理编译产物
    make demo/nvr/nvr_clean
    

    方法 2:整包编译

    # 进入 project 目录
    cd SourceCode/project
    
    # 选择 defconfig(根据板子型号)
    # 例如:nvr_mhera.spinand.glibc-12.4.0-arm64-squashfs.ssm004a.s01a.1024x1024.fccsp16_ddr4_defconfig
    make nvr_mhera.spinand.glibc-12.4.0-arm64-squashfs.ssm004a.s01a.1024x1024.fccsp16_ddr4_defconfig
    
    # 编译整包
    make clean && make image -j8
    

    3.2.3 编译输出

    编译成功后,可执行文件位于:

    sdk/verify/sample_code/out/<arch>/app/sgs_demo_nvr
    

    其中 <arch> 由构建配置决定,例如 arm64

    3.2.4 依赖库说明

    根据 nvr.mk,依赖以下库。

    LIBS += -lmi_common       # 公共库
    LIBS += -lmi_disp         # 显示模块
    LIBS += -lmi_hdmi         # HDMI 模块
    LIBS += -lmi_vdec         # 解码模块
    LIBS += -lmi_jpd          # JPEG 解码
    LIBS += -lmi_venc         # 编码模块
    LIBS += -lmi_scl          # 缩放模块
    LIBS += -lmi_gfx          # 图形处理
    LIBS += -lmi_vdisp        # 虚拟显示
    

    pthread/cjson 通过 dep.mk 依赖与构建系统自动链入,nvr.mk 中未显式列出。

    3.3 使用方法

    3.3.1 运行前准备

    1. 准备码流文件

      • 准备 H.264/H.265 码流文件
      • 放在与可执行文件同目录下
    2. 准备 UI 资源文件(可选)

      • 鼠标图标文件:cursor_argb1555.bin
      • UI 文件:1920x1080_argb1555.bin
      • 放在与可执行文件同目录下
    3. 修改配置文件

      • 根据实际需求修改 config_nvr.json
      • 配置显示参数、解码参数等
      • 如果需要使用SCL模块,需要将config_nvr.json的"rotate"参数改为0/½/3的其中一个值

    码流文件和资源文件位于 SourceCode/sdk/verify/sample_code/demo/nvr/nvr/resource。

    3.3.2 命令行参数

    ./sgs_demo_nvr <config_file>
    

    参数说明

    • config_file:JSON 格式的配置文件路径

    示例

    # 使用默认配置文件
    ./sgs_demo_nvr config_nvr.json
    

    3.3.3 配置文件详解

    disp 参数说明

    参数 说明 可选值
    dispDevNum 显示设备数量 1 或 2
    intfType 输出接口类型 hdmi, vga, mipi, ttl, bt1120, hdmi&vga 等
    timing 输出时序 720P_60, 1080P_60, 3840x2160_30 等
    chnNum 画面数量 disp0: 1~64, disp1: 1~32
    rotate 旋转角度 0: 0°, 1: 90°, 2: 180°, 3: 270°, 4: 不旋转

    vdec 参数说明

    参数 说明 可选值
    vdecDevNum 解码设备数量 1(仅使用 vdec0)
    chnNum 通道数量 1~64
    compressEn 压缩使能 0: 不压缩, 1: LSYC0 压缩
    vdecAttr 通道属性配置 见下方

    其中vdecDevNum字段在config_nvr.json 中未使用。

    vdecAttr 参数说明

    参数 说明 可选值
    chnId 通道 ID 0~63
    picWidth 码流宽度 自动或手动指定
    picHeight 码流高度 自动或手动指定
    codecType 码流类型 0: H.264, 1: H.265
    refFrameNum 参考帧数量 依据实际码流配置,如0,1,2等
    esAddHead 码流加头 0: 不加头, 1: 加头
    filePath 码流文件路径 相对或绝对路径

    3.3.4 使用示例

    示例 1:4 路码流解码显示

    配置文件 config_nvr.json

    {
        "dispDevNum": 1,
        "dispArgs_0": {
            "intfType": "hdmi",
            "timing": "720x576_30",
            "chnNum": 4,
            "rotate": 4
        },
        "vdecDevNum": 1,
        "vdecArgs": {
            "chnNum": 4,
            "compressEn": 1,
            "vdecAttr": [
                {"chnId": 0, "codecType": 1, "filePath": "720x576@30.h265"},
                {"chnId": 1, "codecType": 1, "filePath": "720x576@30.h265"},
                {"chnId": 2, "codecType": 1, "filePath": "720x576@30.h265"},
                {"chnId": 3, "codecType": 1, "filePath": "720x576@30.h265"}
            ]
        }
    }
    

    运行:

    把sgs_demo_nvr和config_nvr.json拷贝到共享路径(比如PC端的E:\platform\test路径)。

    进入共享路径(比如进入板子路径/mnt/test下)执行以下命令:

    ./sgs_demo_nvr config_nvr.json
    

    示例 2:16 路码流解码显示

    修改配置文件中的 chnNum 为 16,并添加对应的码流文件配置。

    3.4 测试 Case 命令

    nvr_demo 支持多种测试场景,运行后会提示输入命令:

    Case ID 说明
    0 退出程序
    1 手动切屏
    2 自动循环随机切屏(5s 切换)
    3 手动切换分辨率
    4 自动循环随机切换分辨率(5s 切换)
    5 全屏画面显示 PIP
    6 DISP zoom 功能
    7 抓图(VDEC→VENC→File)
    8 静帧功能(暂停解码)
    9 VDISP Case(VDEC→SCL→VDISP→DISP)
    10 获取所有 VDEC 通道状态
    11 设定 HDMI 输出参数
    12 鼠标显示和移动
    13 设置 VDEC 送帧间隔时间
    14 设置 Alpha 值(0~ff)
    15 GFX 操作(缩放、旋转、镜像、Alpha 混合)
    16 YUV 旋转并保存到文件
    17 读 UI 文件到 framebuffer
    18 SCL stretch
    20 GFX quickfill 到 framebuffer
    21 FB 放大(1920x1080→4K)
    22 同源/异源切换
    23 零通道编码(WBC→VENC→File)
    24 EPTZ Case(1 路 Pano + 5 路 eptz)
    25 设置 ColorKey 值
    26 双层 UI 融合显示

    3.5 运行结果

    3.5.1 成功启动标志

    终端输出:

    Please input number:
    

    此时:

    • VDEC 通道已创建并启动
    • DISP 通道已创建并启动
    • 码流开始解码并显示

    3.5.2 验证解码状态

    查看 VDEC 通道状态:

    cat /proc/mi_modules/mi_vdec/mi_vdec0
    

    查看 DISP 通道状态:

    cat /proc/mi_modules/mi_disp/mi_disp0
    

    3.5.3 抓拍功能

    运行时输入 Case 7,程序会将指定通道的数据编码为 JPEG 并保存到文件。

    3.5.4 退出程序

    输入 Case 0,程序会自动:

    1. 停止 VDEC 解码
    2. 停止 DISP 显示
    3. 解绑所有通道
    4. 销毁所有设备
    5. 释放所有资源

    4. MI 文档使用指南

    4.1 MI 文档结构

    MI文档主要由两部分组成:API头文件和API参考文档。

    4.1.1 API 头文件

    位于 project/release/include/,包含:

    • 接口声明:函数原型、参数说明
    • 数据类型:结构体、枚举、宏定义
    • 注释说明:简要功能描述

    4.1.2 API 参考文档

    位于 project/release/docs/(如果存在),包含:

    • 详细功能描述
    • 参数详细说明
    • 返回值说明
    • 使用示例
    • 注意事项

    4.2 查找 API 文档的方法

    4.2.1 按模块查找

    每个功能模块有对应的头文件。

    功能模块 头文件
    系统管理 mi_sys.h
    解码 mi_vdec.h
    显示 mi_disp.h
    编码 mi_venc.h
    缩放 mi_scl.h
    图形处理 mi_gfx.h
    帧缓冲 mi_fb.h
    HDMI mi_hdmi.h

    4.2.2 按功能查找

    使用 grep 搜索关键函数。

    # 在头文件中搜索函数
    cd project/release/include
    grep -r "MI_VDEC_SendStream" . --include="*.h"
    
    # 搜索数据类型
    grep -r "MI_VDEC_ChnAttr_t" . --include="*.h"
    

    4.2.3 查看模块 ID

    所有模块 ID 定义在 mi_common_datatype.h 文件中。

    typedef enum {
        E_MI_MODULE_ID_SYS      = 9,
        E_MI_MODULE_ID_VDEC     = 1,
        E_MI_MODULE_ID_DISP     = 5,
        E_MI_MODULE_ID_VENC     = 2,
        E_MI_MODULE_ID_SCL      = 34,
        E_MI_MODULE_ID_GFX      = 4,
        // ...
    } MI_ModuleId_e;
    

    4.3 阅读头文件的技巧

    4.3.1 重点关注内容

    1. 函数声明:了解函数名称、参数、返回值
    2. 数据类型定义:理解结构体成员含义
    3. 枚举值:了解可选的配置选项
    4. 宏定义:常用的常量和边界值
    5. 注释:简要的使用说明

    4.3.2 典型头文件结构

    mi_vdec.h 为例。

    #ifndef _MI_VDEC_H_
    #define _MI_VDEC_H_
    
    #include "mi_common.h"           // 公共类型
    #include "mi_vdec_datatype.h"    // 数据类型定义
    
    #define MI_VDEC_API_VERSION ...  // 版本信息
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    // 核心 API
    MI_S32 MI_VDEC_CreateDev(MI_U32 u32DevId, MI_VDEC_InitParam_t *pstInitParam);
    MI_S32 MI_VDEC_DestroyDev(MI_U32 u32DevId);
    MI_S32 MI_VDEC_CreateChn(MI_U32 u32DevId, MI_VDEC_ChnId_t Chn, MI_VDEC_ChnAttr_t *pstAttr);
    // ...
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif
    

    4.4 理解数据类型

    4.4.1 基础数据类型

    所有基础类型定义在 mi_common_datatype.h 文件中。

    typedef unsigned char      MI_U8;   // 1 字节
    typedef unsigned short     MI_U16;  // 2 字节
    typedef unsigned int       MI_U32;  // 4 字节
    typedef unsigned long long MI_U64;  // 8 字节
    
    typedef signed char        MI_S8;   // 1 字节
    typedef signed short       MI_S16;  // 2 字节
    typedef signed int         MI_S32;  // 4 字节
    typedef signed long long   MI_S64;  // 8 字节
    

    4.4.2 模块通用类型

    每个通道和设备类型的定义如下。

    typedef MI_S32 MI_VDEC_DEV;    // VDEC 设备类型
    typedef MI_S32 MI_VDEC_CHN;    // VDEC 通道类型
    typedef MI_S32 MI_DISP_DEV;    // DISP 设备类型
    typedef MI_S32 MI_DISP_CHN;    // DISP 通道类型
    

    4.5 错误码处理

    4.5.1 错误码定义

    通用错误码定义在 mi_common_datatype.h 文件中。

    typedef enum {
        E_MI_ERR_INVALID_DEVID = 1,      // 无效设备 ID
        E_MI_ERR_INVALID_CHNID = 2,      // 无效通道 ID
        E_MI_ERR_ILLEGAL_PARAM = 3,      // 非法参数
        E_MI_ERR_EXIST = 4,              // 资源已存在
        E_MI_ERR_UNEXIST = 5,            // 资源不存在
        E_MI_ERR_NULL_PTR = 6,           // 空指针
        E_MI_ERR_NOT_CONFIG = 7,         // 未配置
        E_MI_ERR_NOT_SUPPORT = 8,        // 不支持
        E_MI_ERR_NOMEM = 12,             // 内存不足
        E_MI_ERR_NOBUF = 13,             // 缓冲区不足
        E_MI_ERR_NOT_INIT = 21,          // 未初始化
        E_MI_ERR_BUSY = 18,              // 资源忙
        // ...
    } MI_ErrCode_e;
    

    4.6 版本信息

    每个模块都有版本号宏。

    // mi_vdec.h
    #define VDEC_MAJOR_VERSION 3
    #define VDEC_SUB_VERSION   18
    #define MI_VDEC_API_VERSION "mi_vdec_version_3.18"
    
    // mi_disp.h
    #define DISP_MAJOR_VERSION 3
    #define DISP_SUB_VERSION   14
    #define MI_DISP_API_VERSION "mi_disp_version_3.14"
    

    运行时获取版本

    MI_VDEC_Version_t version;
    MI_VDEC_GetVersion(0, &version);
    printf("VDEC version: %s\n", version.aVersion);