MI VDEC API


1. 概述


1.1. 模块简介

视频解码功能参考,提供解码通道创建、码流传送及控制、输出图像缩放和裁剪等功能。

VDEC模块的输入源主要是两类:

  • 用户读取码流文件向解码模块发送数据;

  • 用户将网络接收到的码流数据直接发送到解码模块。

表1-1 芯片解码规格

芯片 硬件解码模块 支持最大通道数 支持协议 分辨率范围 最大性能
Taiyaki DEC2.0 16 H.264/H.265 H.264: max 4096x4096, min 176x128
H.265: max 4096x4096, min 176x128
H.264: 3840x2160@30fps
H.265: 3840x2160@30fps
Takoyaki DEC2.0 4 H.264/H.265 H.264: max 4096x4096, min 176x128
H.265: max 4096x4096, min 176x128
H.264: 1920x1080@30fps
H.265: 1920x1080@30fps

1.2. 解码流程图

1.2.1. Taiyaki数据流程图

图1-1 VDEC数据流程图

1.2.2. Takoyaki数据流程图

图1-2 VDEC数据流程图


1.3. 关键字说明

  • 码流发送方式

    VDEC解码器提供两种码流发送方式:

    • 按流发送(E_MI_VDEC_VIDEO_MODE_STREAM):用户每次可发送任意长度码流到解码器,由解码器内部完成码流帧的解析和拼接过程。对于H.264/H.265,需在收到下一帧码流才能确认为当前码流帧的结束,所以在该模式下,输入一帧H.264/H.265码流,不会立刻解出图像。目前不支持按流发送功能。

    • 按帧发送(E_MI_VDEC_VIDEO_MODE_FRAME):用户每次发送完整的一帧码流到解码器,每调用一次发送接口,解码器就认为该帧码流已经结束,并开始解码图像。因此,用户需保证每次发送的码流必须为完整的一帧,否则会出现解码错误。使用该模式可以达到快速解码的目的。

    码流发送方式eVideoMode可在接口MI_VDEC_CreateChn 中设置。

  • 图像输出顺序

    根据H.264/H265协议,解码图像可能不会在解码后立即输出。VDEC解码器可以通过设置不同的图像输出方式达到尽快输出的目的。图像输出方式包括以下两种:

    • 解码序:解码图像按照解码的先后顺序输出。

    • 显示序:解码图像按照协议中的显示顺序输出。

    根据H.264/H.265协议,视频的解码顺序(即解码序)和解码图像的显示顺序(即显示序)可能不一致。例如:解码B帧时,需要前后的P帧作为参考,所以B帧后的P帧先于B帧解码,但B帧先于P帧输出。按解码序输出是保证快速输出的一个必要条件,用户选择按解码序输出,需保证码流的解码序与显示序相同。

    按帧发送码流与按解码序输出相结合能达到快速解码和快速输出的目的,用户必须保证每次发送的是完整的一帧码流以及码流的解码序和显示序相同。

    目前图像输出方式会自适应为显示序,用户设置无效。

  • 时间戳(PTS)处理

    在按帧模式发送码流时,解码输出的图像时间戳PTS为发送码流接口(MI_VDEC_SendStream)中用户送入的PTS,解码器不会更改此值;如果用户送入的PTS值为-2,则表示此图像不会被视频显示模块(DISP)显示;如果是其他值,则表示解码器不做任何处理。

    该PTS不用于帧率控制。帧率控制功能请参考MI_VDEC_SendStream

  • 码流Buffer

    码流Buffer用于缓存用户输入的码流,然后送入解码器解码。码流buffer的大小没有固定的计算公式,一般按照经验值,分辨率小于或等于D1,建议配置为512KB;分辨率在(D1,1080P],建议配置为1MB;分辨率在(1080P,4K],建议配置为2MB;用户可根据实际需求,选择合理的值设置。

  • eDpbBufMode

    eDpbBufMode可供用户设置不同的buffer模式来进行解码。根据不同的场景,来选择不同的buffer模式,可以达到省内存的目的。当设为E_MI_VDEC_DPB_MODE_NORMAL,则不能节省内存;当设为E_MI_VDEC_DPB_MODE_INPLACE_ONE_BUF,则用于解码仅包含一个参考帧的码流类型,此时仅需一个DPB buffer即可;当设为E_MI_VDEC_DPB_MODE_INPLACE_TWO_BUF,则用于解码仅包含两个参考帧的码流类型,此时仅需两个DPB buffer即可。

  • u32RefFrameNum

    u32RefFrameNum表示最大参考帧个数。由于在实际的场景中,系统的内存并不是无限大,用户可以根据产品的定义对参考帧的个数进行限制,以便提示用户当前码流可能超规格。如果用户设置了eDpbBufMode为E_MI_VDEC_DPB_MODE_INPLACE_ONE_BUF或者E_MI_VDEC_DPB_MODE_INPLACE_TWO_BUF,则该参数无效。如果用户设置了eDpbBufMode为E_MI_VDEC_DPB_MODE_NORMAL,则解码器在参考帧个数受到限制时进行解码,解码图像可能会异常或者解码超时。

  • 输出图像缩放

    用户调用MI_VDEC_SetOutputPortAttr可以对解码后的图像进行缩放,以输出需要的分辨率的图像。但需注意,解码器仅支持对图像缩小,不支持对图像放大。

  • 低延时

    这里的延时是指解码B帧后,需要对待显示的图像队列进行重排序(reorder)所产生的延时。当解码不含B帧的码流时,解码顺序和显示顺序相同,因此不会出现延时输出,即低延时;而解码含B帧的码流时,由于B帧有前后向参考,需要等待所参考的图像解码完后,才能解当前帧,并且需要对解码后的图像重排序(reorder),由此产生输出延时。这两种模式需要通过设置bDisableLowLatency来完成。默认bDisableLowLatency为FALSE,用户无需设置;当需要解码B帧码流时,需要将bDisableLowLatency设为TRUE。需要注意,bDisableLowLatency为TRUE时,不能用于解码非B帧码流。该功能仅使用于芯片Takoyaki。

  • 输出buffer模式

    用户可以调用MI_VDEC_SetOutputPortLayoutMode设置输出buffer的模式。该接口仅使用于芯片Takoyaki。当用户需要手动控制输出buffer的模式时,可调用该接口。当为E_MI_VDEC_OUTBUF_LAYOUT_LINEAR模式时,表示输出buffer为线性模式;当为E_MI_VDEC_OUTBUF_LAYOUT_TILE模式时,表示输出buffer为TILE模式;默认为E_MI_VDEC_OUTBUF_LAYOUT_AUTO模式,表示输出buffer会自动在线性模式和TILE模式间切换。


2. API参考


该功能模块提供以下API:

API名 功能
MI_VDEC_InitDev 解码设备初始化
MI_VDEC_DeInitDev 解码设备去初始化
MI_VDEC_CreateChn 创建解码通道
MI_VDEC_DestroyChn 销毁解码通道
MI_VDEC_GetChnAttr 获取解码通道属性
MI_VDEC_StartChn 开始通道解码
MI_VDEC_StopChn 停止通道解码
MI_VDEC_GetChnStat 获取解码通道状态
MI_VDEC_FlushChn 清理解码通道缓存数据
MI_VDEC_ResetChn 复位解码通道
MI_VDEC_SetChnParam 设置解码通道参数
MI_VDEC_GetChnParam 获取解码通道参数
MI_VDEC_SendStream 向解码通道发送码流数据
MI_VDEC_GetUserData 获取解码通道的用户数据
MI_VDEC_ReleaseUserData 释放解码通道的用户数据
MI_VDEC_SetDisplayMode 设置解码通道显示模式
MI_VDEC_GetDisplayMode 获取解码通道显示模式
MI_VDEC_SetOutputPortAttr 设置解码通道输出端口属性
MI_VDEC_GetOutputPortAttr 获取解码通道输出端口属性
MI_VDEC_SetOutputPortLayoutMode 设置输出端口Buffer模式
MI_VDEC_GetOutputPortLayoutMode 获取输出端口Buffer模式
MI_VDEC_DecRepeatFrame 重复解码当前帧

2.1. MI_VDEC_InitDev

  • 功能

    解码设备初始化。

  • 定义

    MI_S32 MI_VDEC_InitDev(MI_VDEC_InitParam_t *pstVdecInitParam);
    
  • 形参

    表2-2

    参数名称 描述 输入/输出
    pstVdecInitParam 解码设备初始化参数指针,数据类型: MI_VDEC_InitParam_t 输入
  • 返回值

    表2-3

    返回值 描述
    MI_SUCCESS 成功
    MI_ERR_VDEC_FAILED 失败
    MI_ERR_VDEC_INITED 设备已经初始化
    MI_ERR_VDEC_NULL_PTR 输入参数为空指针
  • 依赖

    • 头文件:mi_vdec.h

    • 库文件:libmi_vdec.a/libmi_vdec.so

  • 注意

    • 该接口为可选调用,如果仅使用默认的初始化参数,则无需调用;

    • 该接口在不同平台的使用上有所不同,具体见以下表格。

      芯片/平台 接口使用描述
      Taiyaki 无此接口,不支持设置。
      Takoyaki 可选调用。
    • 若选择使用该接口,则必须在创建解码通道前调用,否则会返回设备已初始化的错误码MI_ERR_VDEC_INITED;

    • 若重复调用该接口,则会返回设备已初始化的错误码MI_ERR_VDEC_INITED。

    • 如果需要解码B帧码流,则需要设置bDisableLowLatency为TRUE,以保证解码器按显示顺序输出解码后的图像;否则,输出的图像会有抖动,不连贯的问题。

  • 举例

    MI_S32 StartVdec(void)
    
    {
    
        MI_S32 s32Ret = MI_ERR_VDEC_FAILED;
    
        MI_VDEC_CHN VdecChn = 0;
    
        MI_VDEC_InitParam_t stInitParam;
    
        MI_VDEC_ChnAttr_t stChnAttr;
    
        memset(&stInitParam, 0x0, sizeof(MI_VDEC_InitParam_t));
    
        memset(&stChnAttr, 0x0, sizeof(MI_VDEC_ChnAttr_t));
    
        stInitParam.bDisableLowLatency = FALSE;
    
        s32Ret = MI_VDEC_InitDev(&stInitParam);
    
        if(MI_SUCCESS != s32Ret)
    
        {
            printf("MI_VDEC_InitDev failed, s32Ret: 0x%x.\n", s32Ret);
    
            return s32Ret;
    
        }
    
        VdecChn = 0;
    
        stChnAttr.eCodecType    = E_MI_VDEC_CODEC_TYPE_H264;
    
        stChnAttr.u32PicWidth   = 1920;
    
        stChnAttr.u32PicHeight  = 1080;
    
        stChnAttr.eVideoMode    = E_MI_VDEC_VIDEO_MODE_FRAME;
    
        stChnAttr.u32BufSize    = 1024*1024;
    
        stChnAttr.eDpbBufMode   = E_MI_VDEC_DPB_MODE_INPLACE_ONE_BUF;
    
        stChnAttr.stVdecVideoAttr.u32RefFrameNum = 1;
    
        stChnAttr.u32Priority = 0;
    
        stChnAttr.stVdecVideoAttr.stErrHandlePolicy.bUseCusPolicy = FALSE;
    
        s32Ret = MI_VDEC_CreateChn(VdecChn, &stChnAttr);
        if(MI_SUCCESS != s32Ret)
    
        {
            printf("MI_VDEC_CreateChn failed, s32Ret: 0x%x.\n", s32Ret);
    
            return s32Ret;
    
        }
    
        return MI_SUCCESS;
    }
    

2.2. MI_VDEC_DeInitDev

  • 功能

    解码设备去初始化。

  • 定义

    MI_S32 MI_VDEC_DeInitDev(void);
    
  • 返回值

    表2-4

    返回值 描述
    MI_SUCCESS 成功
    MI_ERR_VDEC_FAILED 失败
    MI_ERR_VDEC_NOT_INIT 设备未初始化
  • 依赖

    • 头文件:mi_vdec.h

    • 库文件:libmi_vdec.a/libmi_vdec.so

  • 注意

    • 该接口为可选调用;

    • 该接口的使用因平台的不同而有所差异,具体请参照MI_VDEC_InitDev接口的描述;

    • 若选择使用该接口,则必须在销毁解码通道后调用,否则会返回设备未初始化的错误码MI_ERR_VDEC_NOT_INIT;

    • 若重复调用该接口,则会返回设备未初始化的错误码MI_ERR_VDEC_NOT_INIT。

  • 举例

    MI_S32 StopVdec(void)
    
    {
    
        MI_S32 s32Ret = MI_ERR_VDEC_FAILED;
    
        MI_VDEC_CHN VdecChn = 0;
    
        s32Ret = MI_VDEC_DestroyChn(VdecChn);
    
        if(MI_SUCCESS != s32Ret)
    
        {
    
            printf("MI_VDEC_DestroyChn failed, s32Ret: 0x%x.\n", s32Ret);
    
            return s32Ret;
    
        }
    
        //Confirm that you have destroyed all channels
        s32Ret = MI_VDEC_DeInitDev();
    
        if(MI_SUCCESS != s32Ret)
    
        {
    
            printf("MI_VDEC_DeInitDev failed, s32Ret: 0x%x.\n", s32Ret);
    
            return s32Ret;
    
        }
    
        return MI_SUCCESS;
    
    }
    

2.3. MI_VDEC_CreateChn

  • 功能

    创建视频解码通道。

  • 定义

    MI_S32 MI_VDEC_CreateChn(MI_VDEC_CHN VdecChn,MI_VDEC_ChnAttr_t *pstChnAttr);
    
  • 形参

    表2-5

    参数名称 描述 输入/输出
    VdecChn 解码通道号
    取值范围:[0, MI_VDEC_MAX_CHN_NUM)
    输入
    pstChnAttr 解码通道属性指针,数据类型: MI_VDEC_ChnAttr_t 输入
  • 返回值

    表2-6

    返回值 描述
    MI_SUCCESS 成功
    MI_ERR_VDEC_FAILED 失败
    MI_ERR_VDEC_INVALID_CHNID 通道 ID 超出合法范围,取值范围:[0, MI_VDEC_MAX_CHN_NUM)
    MI_ERR_VDEC_NOT_INIT 模块没有成功加载
    MI_ERR_VDEC_ILLEGAL_PARAM 非法参数或输入参数超过通道解码能力
    MI_ERR_VDEC_CHN_EXIST 试图创建已经存在的通道
    MI_ERR_VDEC_NOMEM 分配内存失败(如系统内存不足)
    MI_ERR_VDEC_NULL_PTR 输入参数为空指针
    MI_ERR_VDEC_NOT_SUPPORT 该操作或者功能不支持
  • 依赖

    • 头文件:mi_vdec.h

    • 库文件:libmi_vdec.a/libmi_vdec.so

  • 注意

    • 通道号不能超出最大的通道号范围。

    • 创建解码通道前,需要保证解码通道未创建或者已销毁,否则会返回错误码MI_ERR_VDEC_CHN_EXIST。

    • 如果设置eDpbBufMode为E_MI_VDEC_DPB_MODE_INPLACE_ONE_BUF模式或者E_MI_VDEC_DPB_MODE_INPLACE_TWO_BUF模式,解码器只保证支持正常解码Sstar编码器编出的码流,对第三方编码器编出的码流不保证完全支持;另外,eDpbBufMode要与待解码的码流参考帧个数一致。

  • 举例

    MI_S32 StartVdec(void)
    {
        MI_S32 s32Ret = MI_ERR_VDEC_FAILED;
        MI_VDEC_CHN VdecChn = 0;
        MI_VDEC_ChnAttr_t stChnAttr;
        MI_VDEC_OutputPortAttr_t stOutputPortAttr;
    
        memset(&stChnAttr, 0x0, sizeof(MI_VDEC_ChnAttr_t));
        memset(&stOutputPortAttr, 0x0, sizeof(MI_VDEC_OutputPortAttr_t));
    
        VdecChn = 0;
        stChnAttr.eCodecType    = E_MI_VDEC_CODEC_TYPE_H264;
        stChnAttr.u32PicWidth   = 1920;
        stChnAttr.u32PicHeight  = 1080;
        stChnAttr.eVideoMode    = E_MI_VDEC_VIDEO_MODE_FRAME;
        stChnAttr.u32BufSize    = 1024*1024;
        stChnAttr.eDpbBufMode   = E_MI_VDEC_DPB_MODE_INPLACE_ONE_BUF;
        stChnAttr.stVdecVideoAttr.u32RefFrameNum = 1;
        stChnAttr.u32Priority = 0;
        stChnAttr.stVdecVideoAttr.stErrHandlePolicy.bUseCusPolicy = FALSE;
    
        s32Ret = MI_VDEC_CreateChn(VdecChn, &stChnAttr);
        if(MI_SUCCESS != s32Ret)
        {
            printf("MI_VDEC_CreateChn failed, s32Ret: 0x%x.\n", s32Ret);
            return s32Ret;
        }
    
        s32Ret = MI_VDEC_StartChn(VdecChn);
        if(MI_SUCCESS != s32Ret)
        {
            printf("MI_VDEC_StartChn failed, s32Ret: 0x%x.\n", s32Ret);
            return s32Ret;
        }
    
        stOutputPortAttr.u16Width  = 720;
        stOutputPortAttr.u16Height = 576;
        s32Ret = MI_VDEC_SetOutputPortAttr(VdecChn, &stOutputPortAttr);
        if(MI_SUCCESS != s32Ret)
        {
            printf("MI_VDEC_SetOutputPortAttr failed, s32Ret: 0x%x.\n", s32Ret);
            return s32Ret;
        }
    
        return MI_SUCCESS;
    }
    

2.4. MI_VDEC_DestroyChn

  • 功能

    销毁视频解码通道。

  • 定义

    MI_S32 MI_VDEC_DestroyChn(MI_VDEC_CHN VdecChn);
    
  • 形参

    表2-7

    参数名称 描述 输入/输出
    VdecChn 视频解码通道号
    取值范围:[0, MI_VDEC_MAX_CHN_NUM)
    输入
  • 返回值

    表2-8

    返回值 描述
    MI_SUCCESS 成功
    MI_ERR_VDEC_INVALID_CHNID 通道 ID 超出合法范围
    MI_ERR_VDEC_CHN_NOT_STOP 销毁通道前未停止解码
    MI_ERR_VDEC_CHN_UNEXIST 通道不存在
    MI_ERR_VDEC_NOT_INIT 模块没有成功加载
    MI_ERR_VDEC_NOT_SUPPORT 该操作或者功能不支持
  • 依赖

    • 头文件:mi_vdec.h

    • 库文件:libmi_vdec.a/libmi_vdec.so

  • 注意

    • 销毁解码通道前必须保证通道已创建,否则会返回通道未创建的错误码MI_ERR_VDEC_CHN_UNEXIST。

    • 销毁解码通道前需要先停止解码,否则会返回通道未停止解码的错误码MI_ERR_VDEC_CHN_NOT_STOP。

  • 举例

    MI_S32 StopVdec(void)
    {
        MI_S32 s32Ret = MI_ERR_VDEC_FAILED;
        MI_VDEC_CHN VdecChn = 0;
    
        // Destroy send stream thread
        ...
    
        s32Ret = MI_VDEC_StopChn(VdecChn);
        if(MI_SUCCESS != s32Ret)
        {
            printf("MI_VDEC_StopChn failed, s32Ret: 0x%x.\n", s32Ret);
            return s32Ret;
        }
    
        s32Ret = MI_VDEC_DestroyChn(VdecChn);
        if(MI_SUCCESS != s32Ret)
        {
            printf("MI_VDEC_DestroyChn failed, s32Ret: 0x%x.\n", s32Ret);
            return s32Ret;
        }
    
        return MI_SUCCESS;
    }
    

2.5. MI_VDEC_GetChnAttr

  • 功能

    获取视频解码通道属性。

  • 定义

    MI_S32 MI_VDEC_GetChnAttr(MI_VDEC_CHN VdecChn,
    MI_VDEC_ChnAttr_t *pstChnAttr);
    
  • 形参

    表2-9

    参数名称 描述 输入/输出
    VdecChn 视频解码通道号
    取值范围:[0, MI_VDEC_MAX_CHN_NUM)
    输入
    pstChnAttr 解码通道属性指针参数类型: MI_VDEC_InitParam_t 输出
  • 返回值

    表2-10

    返回值 描述
    MI_SUCCESS 成功
    MI_ERR_VDEC_INVALID_CHNID 通道 ID 超出合法范围
    MI_ERR_VDEC_NULL_PTR 输入参数为空指针
    MI_ERR_VDEC_CHN_UNEXIST 通道不存在
  • 依赖

    • 头文件:mi_vdec.h

    • 库文件:libmi_vdec.a/libmi_vdec.so

  • 注意

    获取通道属性前必须保证通道已创建,否则会返回通道未创建的错误码MI_ERR_VDEC_CHN_UNEXIST。


2.6. MI_VDEC_StartChn

  • 功能

    开始通道解码。

  • 定义

    MI_S32 MI_VDEC_StartChn(MI_VDEC_CHN VdecChn);
    
  • 形参

    表2-11

    参数名称 描述 输入/输出
    VdecChn 视频解码通道号
    取值范围:[0, MI_VDEC_MAX_CHN_NUM)
    输入
  • 返回值

    表2-12

    返回值 描述
    MI_SUCCESS 成功
    MI_ERR_VDEC_FAILED 失败
    MI_ERR_VDEC_INVALID_CHNID 通道 ID 超出合法范围
    MI_ERR_VDEC_CHN_UNEXIST 通道未创建或者已销毁
    MI_ERR_VDEC_CHN_NOT_STOP 通道未停止解码
    MI_ERR_VDEC_NOT_SUPPORT 该操作或者功能不支持
  • 依赖

    • 头文件:mi_vdec.h

    • 库文件:libmi_vdec.a/libmi_vdec.so

  • 注意

    • 开始通道解码前必须保证通道已创建,否则会返回通道未创建的错误码 MI_ERR_VDEC_CHN_UNEXIST。

    • 开始通道解码之后,才能调用 MI_VDEC_SendStream 发送码流成功。

    • 重复调用该接口时,会返回通道未停止解码的错误码MI_ERR_VDEC_CHN_NOT_STOP。

  • 举例

    请参见MI_VDEC_CreateChn 的举例。


2.7. MI_VDEC_StopChn

  • 功能

    停止通道解码。

  • 语法

    MI_S32 MI_VDEC_Stop(MI_VDEC_CHN VdecChn);
    
  • 形参

    表2-13

    参数名称 描述 输入/输出
    VdecChn 视频解码通道号
    取值范围:[0, MI_VDEC_MAX_CHN_NUM)
    输入
  • 返回值

    表2-14

    返回值 描述
    MI_SUCCESS 成功。
    MI_ERR_VDEC_FAILED 失败。
    MI_ERR_VDEC_INVALID_CHNID 通道 ID 超出合法范围。
    MI_ERR_VDEC_CHN_NOT_START 通道未使能
    MI_ERR_VDEC_CHN_UNEXIST 通道未创建或者已销毁。
  • 依赖

    • 头文件:mi_vdec.h

    • 库文件:libmi_vdec.a/libmi_vdec.so

  • 注意

    • 调用该接口时,需要保证通道已创建,否则会报通道未创建的错误码MI_ERR_VDEC_CHN_UNEXIST。

    • 调用该接口时,需要保证通道已使能,否则会报通道未使能的错误码MI_ERR_VDEC_CHN_NOT_START。

    • 调用此接口后,调用发送码流的接口 MI_VDEC_SendStream 会返回失败。

    • 重复调用该接口时,会返回通道未开始解码的错误码MI_ERR_VDEC_CHN_NOT_START。

  • 举例

    请参见MI_VDEC_DestroyChn的举例。


2.8. MI_VDEC_GetChnStat

  • 功能

    查询解码通道状态。

  • 语法

    MI_S32 MI_VDEC_GetChnStat (MI_VDEC_CHN VdecChn,
    MI_VDEC_ChnStat_t *pstChnStat);
    
  • 形参

    表2-15

    参数名称 描述 输入/输出
    VdecChn 解码通道号
    取值范围:[0, MI_VDEC_MAX_CHN_NUM)
    输入
    pstChnStat 解码通道状态结构体指针。 输出
  • 返回值

    表2-16

    返回值 描述
    MI_SUCCESS 成功
    MI_ERR_VDEC_INVALID_CHNID 通道 ID 超出合法范围
    MI_ERR_VDEC_CHN_UNEXIST 通道未创建或已销毁
    MI_ERR_VDEC_NULL_PTR 输入参数为空指针
  • 依赖

    • 头文件:mi_vdec.h

    • 库文件:libmi_vdec.a/libmi_vdec.so

  • 注意

    查询解码通道状态前必须保证通道已创建,否则会返回通道未创建的错误码MI_ERR_VDEC_CHN_UNEXIST。

  • 举例

    请参见MI_VDEC_SendStream 的举例。


2.9. MI_VDEC_FlushChn

  • 功能

    清理解码通道缓存数据。

  • 定义

    MI_S32 MI_VDEC_FlushChn(MI_VDEC_CHN VdecChn);
    
  • 形参

    表2-17

    参数名称 描述 输入/输出
    VdecChn 视频解码通道号
    取值范围:[0, MI_VDEC_MAX_CHN_NUM)
    输入
  • 返回值

    表2-18

    返回值 描述
    MI_SUCCESS 成功
    MI_ERR_VDEC_FAILED 失败
    MI_ERR_VDEC_INVALID_CHNID 通道 ID 超出合法范围
    MI_ERR_VDEC_CHN_UNEXIST 通道未创建或已销毁
    MI_ERR_VDEC_CHN_NOT_START 通道未使能
  • 依赖

    • 头文件:mi_vdec.h

    • 库文件:libmi_vdec.a/libmi_vdec.so

  • 注意

    • 该接口可用于解码过程中,切换到其他GOP时,清理解码通道缓存的数据,从而使解码继续进行。

2.10. MI_VDEC_ResetChn

  • 功能

    复位解码通道。

  • 定义

    MI_S32 MI_VDEC_ResetChn(MI_VDEC_CHN VdecChn);
    
  • 形参

    表2-19

    参数名称 描述 输入/输出
    VdecChn 视频解码通道号
    取值范围:[0, MI_VDEC_MAX_CHN_NUM)
    输入
  • 返回值

    表2-20

    返回值 描述
    MI_SUCCESS 成功
    MI_ERR_VDEC_FAILED 失败
    MI_ERR_VDEC_INVALID_CHNID 通道 ID 超出合法范围
    MI_ERR_VDEC_CHN_UNEXIST 通道未创建或已销毁
    MI_ERR_VDEC_NOT_PERM 无法重置通道,操作不能与MI_VDEC_SendStream 同时调用
    MI_ERR_VDEC_NOT_SUPPORT 该操作或者功能不支持。
  • 依赖

    • 头文件:mi_vdec.h

    • 库文件:libmi_vdec.a/libmi_vdec.so

  • 注意

    • 该接口暂不支持。

2.11. MI_VDEC_SetChnParam

  • 功能

    设置解码通道参数。

  • 语法

    MI_S32 MI_VDEC_SetChnParam(MI_VDEC_CHN VdecChn,
    MI_VDEC_ChnParam_t *pstChnParam);
    
  • 形参

    表2-21

    参数名称 描述 输入/输出
    VdecChn 视频解码通道号
    取值范围:[0, MI_VDEC_MAX_CHN_NUM)
    输入
    pstChnParam 通道参数。 输入
  • 返回值

    表2-22

    返回值 描述
    MI_SUCCESS 成功
    MI_ERR_VDEC_INVALID_CHNID 通道 ID 超出合法范围
    MI_ERR_VDEC_NOT_PERM 非法操作,操作前需调用MI_VDEC_StopChn停止通道解码
    MI_ERR_VDEC_NOT_SUPPORT 该操作或者功能不支持。
  • 依赖

    • 头文件:mi_vdec.h

    • 库文件:libmi_vdec.a/libmi_vdec.so

  • 注意

    该接口暂不支持。


2.12. MI_VDEC_GetChnParam

  • 功能

    获取解码通道参数。

  • 语法

    MI_S32 MI_VDEC_GetChnParam(MI_VDEC_CHN VdecChn,
    MI_VDEC_ChnParam_t *pstChnParam);
    
  • 形参

    表2-23

    参数名称 描述 输入/输出
    VdecChn 视频解码通道号
    取值范围:[0, MI_VDEC_MAX_CHN_NUM)
    输入
    pstChnParam 通道参数 输出
  • 返回值

    表2-24

    返回值 描述
    MI_SUCCESS 成功
    MI_ERR_VDEC_INVALID_CHNID 通道 ID 超出合法范围
    MI_ERR_VDEC_CHN_UNEXIST 通道未创建或已销毁
    MI_ERR_VDEC_ILLEGAL_PARAM 参数不合法
    MI_ERR_VDEC_NOT_SUPPORT 该操作或者功能不支持。
  • 依赖

    • 头文件:mi_vdec.h

    • 库文件:libmi_vdec.a/libmi_vdec.so

  • 注意

    • 该接口暂不支持。

2.13. MI_VDEC_SendStream

  • 功能

    向解码通道发送码流数据。

  • 语法

    MI_S32 MI_VDEC_SendStream(MI_VDEC_CHN VdecChn,
    MI_VDEC_VideoStream_t *pstVideoStream, MI_S32 s32MilliSec);
    
  • 形参

    表2-25

    参数名称 描述 输入/输出
    VdecChn 视频解码通道号
    取值范围:[0, MI_VDEC_MAX_CHN_NUM)
    输入
    pstVideoStream 解码码流数据指针。参考MI_VDEC_VideoStream_t定义。 输入
    s32MilliSec 设定推送数据超时时间参数。
    取值范围:
    -1:阻塞
    0:非阻塞
    正值:超时时间,单位为毫秒
    输入
  • 返回值

    表2-26

    返回值 描述
    MI_SUCCESS 成功。
    MI_ERR_VDEC_FAILED 失败。
    MI_ERR_VDEC_INVALID_CHNID 通道 ID 超出合法范围。
    MI_ERR_VDEC_ILLEGAL_PARAM 非法参数。
    MI_ERR_VDEC_CHN_NOT_START 通道未使能。
    MI_ERR_VDEC_NOT_PERM 非法操作,如通道未准备好。
    MI_ERR_VDEC_BUF_FULL 解码前的码流缓冲区满
    MI_ERR_VDEC_NOMEM 分配内存失败,如系统内存不足。
    MI_ERR_VDEC_BADADDR 地址错误。
  • 依赖

    • 头文件:mi_vdec.h

    • 库文件:libmi_vdec.a/libmi_vdec.so

  • 注意

    • 暂不支持按流发送;

    • 暂不支持设置接口的阻塞时间,用户设置s32MilliSec参数无效;

    • 按帧传送时,每次需完整传送一帧数据;

    • 若用户在送流时,设置pstVideoStream->u64PTS = -2,则在解码后,VDEC会丢弃该帧。用户可根据需要进行设置。

    • 该接口和MI_VDEC_DecRepeatFrame配合使用,可以实现解码重复帧的功能,具体见MI_VDEC_DecRepeatFrame的接口描述。

  • 举例

    每次传送完整一帧数据。以帧为单位,如果当前数据帧传送失败,需要重新传送。

    MI_S32 VdecSendStream(void)
    {
        MI_S32 s32Ret = MI_ERR_VDEC_FAILED;
        MI_VDEC_CHN VdecChn = 0;
        MI_S32 s32MilliSec = 0;
        MI_VDEC_VideoStream_t stVideoStream;
        MI_VDEC_ChnAttr_t stChnAttr;
        MI_VDEC_ChnStat_t stChnStat;
    
        do{
            //Check if you need stop sending stream
            if(bStop)
            {
                break;
            }
    
            memset(&stChnAttr, 0x0, sizeof(MI_VDEC_ChnAttr_t));
            s32Ret = MI_VDEC_GetChnAttr(VdecDev, VdecChn, &stChnAttr);
            if(MI_SUCCESS != s32Ret)
            {
                printf("MI_VDEC_GetChnAttr failed, s32Ret: 0x%x.\n", s32Ret);
                return s32Ret;
            }
    
            memset(&stChnStat, 0x0, sizeof(MI_VDEC_ChnStat_t));
            s32Ret = MI_VDEC_GetChnStat(VdecChn, &stChnStat);
            if(MI_SUCCESS != s32Ret)
            {
                printf("MI_VDEC_SendStream failed, s32Ret: 0x%x.\n", s32Ret);
                return s32Ret;
            }
    
            //suggest to check chn status
            if(stChnAttr.u32Bufsize - stChnStat.u32LeftStreamBytes < u32StreamSize)
            {
                continue;
            }
    
            memset(&stVideoStream, 0x0, sizeof(MI_VDEC_VideoStream_t));
            stVideoStream.pu8Addr = pu8StreamBuf;
            stVideoStream.u32Len  = u32StreamSize;
            stVideoStream.u64PTS  = u64StreamPts;
            stVideoStream.bEndOfFrame  = TRUE;
            stVideoStream.bEndOfStream = FALSE;
            s32MilliSec = 30;                    //30ms
            s32Ret = MI_VDEC_SendStream(VdecChn, &stVideoStream, s32MilliSec);
            if(MI_SUCCESS != s32Ret)
            {
                printf("MI_VDEC_SendStream failed, s32Ret: 0x%x.\n", s32Ret);
                continue;
            }
        }while(!ShouldStop);
    
        return MI_SUCCESS;
    }
    

2.14. MI_VDEC_GetUserData

  • 功能

    获取解码通道的用户数据。

  • 语法

    MI_S32 MI_VDEC_GetUserData(MI_VDEC_CHN VdecChn,
    MI_VDEC_UserData_t *pstUserData, MI_S32 s32MilliSec);
    
  • 形参

    表2-27

    参数名称 描述 输入/输出
    VdecChn 视频解码通道号
    取值范围:[0, MI_VDEC_MAX_CHN_NUM)
    输入
    s32MilliSec 获取用户数据超时定义。
    取值范围:
    -1:阻塞
    0:非阻塞
    正值:推送数据超时时间,以 毫秒为单位
    输入
    pstUserData 获取的解码用户数据,参考MI_VDEC_UserData_t定义 输出
  • 返回值

    表2-28

    返回值 描述
    MI_SUCCESS 成功
    MI_ERR_VDEC_INVALID_CHNID 通道 ID 超出合法范围
    MI_ERR_VDEC_ILLEGAL_PARAM 非法参数
    MI_ERR_VDEC_CHN_UNEXIST 通道未创建或者已销毁
    MI_ERR_VDEC_NOT_PERM 非法操作,如通道未准备好
    MI_ERR_VDEC_BUF_FULL 解码后的数据帧缓冲区满
  • 依赖

    • 头文件:mi_vdec.h

    • 库文件:libmi_vdec.a/libmi_vdec.so

  • 注意

    • 该接口暂不支持。

2.15. MI_VDEC_ReleaseUserData

  • 功能

    释放用户数据。

  • 语法

    MI_S32 MI_VDEC_ReleaseUserData(MI_VDEC_CHN VdecChn,
    MI_VDEC_UserData_t *pstUserData);
    
  • 形参

    表2-29

    参数名称 描述 输入/输出
    VdecChn 视频解码通道号
    取值范围:[0, MI_VDEC_MAX_CHN_NUM)
    输入
    pstUserData 解码后的用户数据指针,由 MI_VDEC_UserData_t 接口获取 输入
  • 返回值

    表2-30

    返回值 描述
    MI_SUCCESS 成功
    MI_ERR_VDEC_INVALID_CHNID 通道 ID 超出合法范围
    MI_ERR_VDEC_ILLEGAL_PARAM 非法参数
    MI_ERR_VDEC_CHN_UNEXIST 通道未创建或者已销毁
    MI_ERR_VDEC_NOT_PERM 非法操作,如通道未准备好
  • 依赖

    • 头文件:mi_vdec.h

    • 库文件:libmi_vdec.a/libmi_vdec.so

  • 注意

    • 该接口暂不支持。

2.16. MI_VDEC_SetDisplayMode

  • 功能

    设置显示模式。

  • 语法

    MI_S32 MI_VDEC_SetDisplayMode(MI_VDEC_CHN VdecChn,MI_VDEC_DisplayMode_e eDisplayMode);
    
  • 形参

    表2-31

    参数名称 描述 输入/输出
    VdecChn 视频解码通道号
    取值范围:[0, MI_VDEC_MAX_CHN_NUM)
    输入
    eDisplayMode 显示模式枚举
    参考MI_VDEC_DisplayMode_e定义
    输入
  • 返回值

    表2-32

    返回值 描述
    MI_SUCCESS 成功
    MI_ERR_VDEC_INVALID_CHNID 通道 ID 超出合法范围
    MI_ERR_VDEC_CHN_UNEXIST 通道未创建或已销毁
    MI_ERR_VDEC_ILLEGAL_PARAM 非法参数
  • 依赖

    • 头文件:mi_vdec.h

    • 库文件:libmi_vdec.a/libmi_vdec.so

  • 注意

    该接口暂不支持。


2.17. MI_VDEC_GetDisplayMode

  • 功能

    获取显示模式。

  • 语法

    MI_S32 MI_VDEC_GetDisplayMode(MI_VDEC_CHN VdecChn,
    MI_VDEC_DisplayMode_e *peDisplayMode);
    
  • 形参

    表2-33

    参数名称 描述 输入/输出
    VdecChn 视频解码通道号
    取值范围:[0, MI_VDEC_MAX_CHN_NUM)
    输入
    peDisplayMode 显示模式枚举指针,参考MI_VDEC_DisplayMode_e定义。 输出
  • 返回值

    表2-34

    返回值 描述
    MI_SUCCESS 成功
    MI_ERR_VDEC_INVALID_CHNID 通道 ID 超出合法范围
    MI_ERR_VDEC_CHN_UNEXIST 通道未创建或已销毁
    MI_ERR_VDEC_NULL_PTR 输入参数为空指针
  • 依赖

    • 头文件:mi_vdec.h

    • 库文件:libmi_vdec.a/libmi_vdec.so

  • 注意

    该接口暂不支持。


2.18. MI_VDEC_SetOutputPortAttr

  • 功能

    设置解码通道输出端口属性。

  • 语法

    MI_S32 MI_VDEC_SetOutputPortAttr (MI_VDEC_CHN VdecChn,
    MI_VDEC_OutputPortAttr_t *pstOutputPortAttr);
    
  • 形参

    表2-35

    参数名称 描述 输入/输出
    VdecChn 视频解码通道号
    取值范围:[0, MI_VDEC_MAX_CHN_NUM)
    输入
    pstOutputPortAttr 输出端口属性,数据类型:MI_VDEC_OutputPortAttr_t 输入
  • 返回值

    表2-36

    返回值 描述
    MI_SUCCESS 成功。
    MI_ERR_VDEC_INVALID_CHNID 通道 ID 超出合法范围。
    MI_ERR_VDEC_CHN_UNEXIST 通道未创建或已销毁。
    MI_ERR_VDEC_ILLEGAL_PARAM 非法参数。
    MI_ERR_VDEC_NULL_PTR 输入参数空指针
  • 依赖

    • 头文件:mi_vdec.h

    • 库文件:libmi_vdec.a/libmi_vdec.so

  • 注意

    • 若通道未创建,则返回错误码MI_ERR_VDEC_CHN_UNEXIST。

    • 缩放宽和高需要按2对齐。

    • 缩放范围[⅛, 1]。

    • 不支持放大。

  • 举例

    请参见MI_VDEC_CreateChn 的举例。


2.19. MI_VDEC_GetOutputPortAttr

  • 功能

    获取解码通道输出端口属性。

  • 语法

    MI_S32 MI_VDEC_GetOutputPortAttr(MI_VDEC_CHN VdecChn,
    MI_VDEC_OutputPortAttr_t *pstOutputPortAttr);
    
  • 形参

    表2-37

    参数名称 描述 输入/输出
    VdecChn 视频解码通道号
    取值范围:[0, MI_VDEC_MAX_CHN_NUM)
    输入
    pstOutputPortAttr 输出端口属性,数据类型:MI_VDEC_OutputPortAttr_t 输出
  • 返回值

    表2-38

    返回值 描述
    MI_SUCCESS 成功
    MI_ERR_VDEC_INVALID_CHNID 通道 ID 超出合法范围
    MI_ERR_VDEC_CHN_UNEXIST 通道未创建或已销毁
    MI_ERR_VDEC_NULL_PTR 输入参数空指针
  • 依赖

    • 头文件:mi_vdec.h

    • 库文件:libmi_vdec.a/libmi_vdec.so

  • 注意

    • 若通道未创建,则返回错误码MI_ERR_VDEC_CHN_UNEXIST。

2.20. MI_VDEC_SetOutputPortLayoutMode

  • 功能

    设置输出端口Buffer模式。

  • 语法

    MI_S32 MI_VDEC_SetOutputPortLayoutMode
    (MI_VDEC_OutbufLayoutMode_e eBufTileMode);
    
  • 形参

    表2-39

    参数名称 描述 输入/输出
    eBufTileMode 输出Buffer模式,数据类型:MI_VDEC_OutbufLayoutMode_e 输入
  • 返回值

    表2-40

    返回值 描述
    MI_SUCCESS 成功
    MI_ERR_VDEC_NOT_INIT 设备未初始化
    MI_ERR_VDEC_ILLEGAL_PARAM 非法参数
  • 依赖

    • 头文件:mi_vdec.h

    • 库文件:libmi_vdec.a/libmi_vdec.so

  • 注意

    • 若设备未初始化,则返回错误码MI_ERR_VDEC_NOT_INIT。

    • 该接口仅支持在Takoyaki芯片使用。

  • 举例

    MI_S32 StartVdec(void)
    {
        MI_S32 s32Ret = MI_ERR_VDEC_FAILED;
        MI_VDEC_CHN VdecChn = 0;
        MI_VDEC_OutbufLayoutMode_e eBufTileMode = E_MI_VDEC_OUTBUF_LAYOUT_MAX;
        MI_VDEC_ChnAttr_t stChnAttr;
    
        memset(&stChnAttr, 0x0, sizeof(MI_VDEC_ChnAttr_t));
    
        eBufTileMode = E_MI_VDEC_OUTBUF_LAYOUT_AUTO;
        s32Ret = MI_VDEC_SetOutputPortLayoutMode(eBufTileMode) ;
        if(MI_SUCCESS != s32Ret)
        {
            printf("MI_VDEC_SetOutputPortLayoutMode failed, s32Ret: 0x%x.\n", s32Ret);
            return s32Ret;
        }
    
        VdecChn = 0;
        stChnAttr.eCodecType    = E_MI_VDEC_CODEC_TYPE_H264;
        stChnAttr.u32PicWidth   = 1920;
        stChnAttr.u32PicHeight  = 1080;
        stChnAttr.eVideoMode    = E_MI_VDEC_VIDEO_MODE_FRAME;
        stChnAttr.u32BufSize    = 1024*1024;
        stChnAttr.eDpbBufMode   = E_MI_VDEC_DPB_MODE_INPLACE_ONE_BUF;
        stChnAttr.stVdecVideoAttr.u32RefFrameNum = 1;
        stChnAttr.u32Priority = 0;
        stChnAttr.stVdecVideoAttr.stErrHandlePolicy.bUseCusPolicy = FALSE;
    
        s32Ret = MI_VDEC_CreateChn(VdecChn, &stChnAttr);
        if(MI_SUCCESS != s32Ret)
        {
            printf("MI_VDEC_CreateChn failed, s32Ret: 0x%x.\n", s32Ret);
            return s32Ret;
        }
    
        return MI_SUCCESS;
    }
    

2.21. MI_VDEC_GetOutputPortLayoutMode

  • 功能

    获取输出端口Buffer模式。

  • 语法

    MI_S32 MI_VDEC_GetOutputPortLayoutMode
    (MI_VDEC_OutbufLayoutMode_e *peBufTileMode);
    
  • 形参

    表2-41

    参数名称 描述 输入/输出
    peBufTileMode 输出Buffer模式,数据类型:MI_VDEC_OutbufLayoutMode_e 输出
  • 返回值

    表2-42

    返回值 描述
    MI_SUCCESS 成功
    MI_ERR_VDEC_NOT_INIT 设备未初始化
    MI_ERR_VDEC_NULL_PTR 输入参数空指针
  • 依赖

    • 头文件:mi_vdec.h

    • 库文件:libmi_vdec.a/libmi_vdec.so

  • 注意

    • 若设备未初始化,则返回错误码MI_ERR_VDEC_NOT_INIT。

    • 该接口仅支持在Takoyaki芯片使用。


2.22. MI_VDEC_DecRepeatFrame

  • 功能

    重复解码当前帧。

  • 语法

    MI_S32 MI_VDEC_DecRepeatFrame(MI_VDEC_CHN VdecChn,
    MI_BOOL bCancelRepeatFrame);
    
  • 形参

    参数名称 描述 输入/输出
    VdecChn 解码通道号。 取值范围:[0, MI_VDEC_MAX_CHN_NUM)。 输入
    bCancelRepeatFrame 是否取消重复解码当前帧。数据类型:MI_BOOL 输入
  • 返回值

    返回值 描述
    MI_SUCCESS 成功。
    MI_ERR_VDEC_FAILED 失败。
    MI_ERR_VDEC_INVALID_CHNID 通道 ID 超出合法范围。
    MI_ERR_VDEC_CHN_UNEXIST 通道未创建或已销毁。
  • 依赖

    • 头文件:mi_vdec.h

    • 库文件:libmi_vdec.a/libmi_vdec.so

  • 注意

    • 通道号不能超出最大的通道号范围。

    • 若通道未创建,则返回错误码MI_ERR_VDEC_CHN_UNEXIST。

    • 重复解码当前帧

      1. 用户调用MI_VDEC_SendStream,同时设置bRepeatFrame为TRUE,可以标记当前帧为重复帧;

      2. 用户调用该接口,同时设置bCancelRepeatFrame为FALSE,解码器便会重复解码当前送入的这一帧;

      3. 每调用一次该接口,VDEC便会重复解码一次当前帧。

    • 取消重复解码当前帧

      用户调用该接口,同时设置bCancelRepeatFrame为TRUE,可以取消重复解码当前帧,恢复到正常解码下一帧的流程。

    • 该接口仅支持在Taiyaki芯片使用。

  • 相关主题

    MI_VDEC_SendStream


3. 数据类型

视频解码相关数据类型、数据结构定义如下表。

数据结构 说明
MI_VDEC_CodecType_e 定义解码类型
MI_VDEC_DPB_BufMode_e 定义DPB buffer模式
MI_VDEC_JpegFormat_e 定义Jpeg 图片数据格式
MI_VDEC_VideoMode_e 定义码流发送方式
MI_VDEC_ErrCode_e 定义错误码类型
MI_VDEC_DecodeMode_e 定义码流解码方式
MI_VDEC_OutputOrder_e 定义解码输出顺序方式
MI_VDEC_VideoFormat_e 定义解码图像数据格式
MI_VDEC_DisplayMode_e 定义显示模式
MI_VDEC_OutbufLayoutMode_e 定义输出buffer模式
MI_VDEC_InitParam_t 定义解码设备初始化参数结构体
MI_VDEC_ChnAttr_t 定义视频解码通道属性
MI_VDEC_JpegAttr_t 定义JPEG视频解码属性
MI_VDEC_VideoAttr_t 定义H264/H265视频解码属性
MI_VDEC_ChnStat_t 定义通道状态结构体
MI_VDEC_ChnParam_t 定义解码通道参数结构体
MI_VDEC_VideoStream_t 定义视频解码的码流结构体
MI_VDEC_UserData_t 定义用户数据结构体
MI_VDEC_OutputPortAttr_t 定义输出端口属性
MI_VDEC_ErrHandlePolicy_t 定义错误宏块处理策略结构体

3.1. MI_VDEC_CodecType_e

  • 说明

    定义解码类型。

  • 定义

    typedef enum
    
    {
    
        E_MI_VDEC_CODEC_TYPE_H264 = 0x0,    /* H264 */
    
        E_MI_VDEC_CODEC_TYPE_H265,      /* H265 */
    
        E_MI_VDEC_CODEC_TYPE_JPEG,      /* JPEG */
    
        E_MI_VDEC_CODEC_TYPE_MAX
    
    } MI_VDEC_CodecType_e;
    
  • 成员

    成员名称 描述
    E_MI_VDEC_CODEC_TYPE_H264 H264解码。
    E_MI_VDEC_CODEC_TYPE_H265 H265解码。
    E_MI_VDEC_CODEC_TYPE_JPEG JPEG解码。
  • 注意事项

    暂不支持用户设置JPEG解码。

3.2. MI_VDEC_DPB_BufMode_e

  • 说明

    定义DPB buffer模式。

  • 定义

    typedef enum
    
    {
    
        E_MI_VDEC_DPB_MODE_NORMAL=0,
    
        E_MI_VDEC_DBP_MODE_INPLACE_ONE_BUF=1,
    
        E_MI_VDEC_DBP_MODE_INPLACE_TWO_BUF=2,
    
        E_MI_VDEC_DPB_MODE_MAX
    
    } MI_VDEC_DPB_BufMode_e;
    
  • 成员

    成员名称 描述
    E_MI_VDEC_DPB_MODE_NORMAL 普通模式
    E_MI_VDEC_DBP_MODE_INPLACE_ONE_BUF Inplace one buffer模式。
    E_MI_VDEC_DBP_MODE_INPLACE_TWO_BUF Inplace two buffer模式

3.3. MI_VDEC_JpegFormat_e

  • 说明

    定义Jpeg 图片数据格式。

  • 定义

    typedef enum
    
    {
    
        E_MI_VDEC_JPEG_FORMAT_YCBCR400 = 0x0,   /*YUV400*/
    
        E_MI_VDEC_JPEG_FORMAT_YCBCR420, /*YUV420*/
    
        E_MI_VDEC_JPEG_FORMAT_YCBCR422, /*YUV 422*/
    
        E_MI_VDEC_JPEG_FORMAT_YCBCR444, /*YUV 444*/
    
        E_MI_VDEC_JPEG_FORMAT_MAX
    
    } MI_VDEC_JpegFormat_e;
    
  • 注意事项

    目前暂不支持该参数相关功能。

3.4. MI_VDEC_VideoMode_e

  • 说明

    定义码流发送方式。

  • 定义

    typedef enum
    
    {
    
        E_MI_VDEC_VIDEO_MODE_STREAM = 0x0,
    
        E_MI_VDEC_VIDEO_MODE_FRAME,
    
        E_MI_VDEC_VIDEO_MODE_MAX
    
    } MI_VDEC_VideoMode_e;
    
  • 成员

    成员名称 描述
    E_MI_VIDEO_MODE_STREAM 按流方式发送码流。
    E_MI_VIDEO_MODE_FRAME 按帧方式发送码流,以帧为单位。
  • 注意事项

    暂不支持按流方式送码流。

3.5. MI_VDEC_ErrCode_e

  • 说明

    定义错误码类型。

  • 定义

    typedef enum
    {
        E_MI_VDEC_ERR_CODE_UNKNOW = 0x0,
        E_MI_VDEC_ERR_CODE_ILLEGAL_ACCESS,
        E_MI_VDEC_ERR_CODE_FRMRATE_UNSUPPORT,
        E_MI_VDEC_ERR_CODE_DEC_TIMEOUT,
        E_MI_VDEC_ERR_CODE_OUT_OF_MEMORY,
        E_MI_VDEC_ERR_CODE_CODEC_TYPE_UNSUPPORT,
        E_MI_VDEC_ERR_CODE_ERR_SPS_UNSUPPORT,
        E_MI_VDEC_ERR_CODE_ERR_PPS_UNSUPPORT,
        E_MI_VDEC_ERR_CODE_REF_LIST_ERR,
        E_MI_VDEC_ERR_CODE_MAX
    } MI_VDEC_ErrCode_e;
    
  • 成员

    成员名称 描述
    E_MI_VDEC_ERR_CODE_UNKNOW 未知错误。
    E_MI_VDEC_ERR_CODE_ILLEGAL_ACCESS 不可访问,例如:未初始化或硬件出问题。
    E_MI_VDEC_ERR_CODE_FRMRATE_UNSUPPORT 帧率不支持
    E_MI_VDEC_ERR_CODE_DEC_TIMEOUT 解帧超时
    E_MI_VDEC_ERR_CODE_OUT_OF_MEMORY 内存不足
    E_MI_VDEC_ERR_CODE_CODEC_TYPE_UNSUPPORT 解码类型不支持
    E_MI_VDEC_ERR_CODE_ERR_SPS_UNSUPPORT 不支持的SPS或SPS出错
    E_MI_VDEC_ERR_CODE_ERR_PPS_UNSUPPORT 不支持的PPS或PPS出错
    E_MI_VDEC_ERR_CODE_REF_LIST_ERR 参考帧列表出错

3.6. MI_VDEC_DecodeMode_e

  • 说明

    定义码流解码方式。

  • 定义

    typedef enum
    
    {
    
        E_MI_VDEC_DECODE_MODE_ALL = 0x0,
    
        E_MI_VDEC_DECODE_MODE_I,
    
        E_MI_VDEC_DECODE_MODE_IP,
    
        E_MI_VDEC_DECODE_MODE_MAX
    
    } MI_VDEC_DecodeMode_e;
    
  • 成员

    成员名称 描述
    E_MI_VDEC_DECODE_MODE_ALL 解码IPB数据帧模式
    E_MI_VDEC_DECODE_MODE_I 只解I帧模式
    E_MI_VDEC_DECODE_MODE_IP 只解IP帧,跳过B帧
  • 注意事项

    该参数暂不支持设置。

3.7. MI_VDEC_OutputOrder_e

  • 说明

    定义解码输出顺序方式。

  • 定义

    typedef enum
    
    {
    
        E_MI_VDEC_OUTPUT_ORDER_DISPLAY = 0x0,
    
        E_MI_VDEC_OUTPUT_ORDER_DECODE,
    
        E_MI_VDEC_OUTPUT_ORDER_MAX,
    
    } MI_VDEC_OutputOrder_e;
    
  • 成员

    成员名称 描述
    E_MI_VDEC_OUTPUT_ORDER_DISPLAY 按显示顺序输出数据帧
    E_MI_VDEC_OUTPUT_ORDER_DECODE 按解帧顺序输出数据帧
  • 数据类型

    目前内部默认按显示顺序输出数据帧,不支持用户设置。

3.8. MI_VDEC_VideoFormat_e

  • 说明

    定义解码图像数据格式。

  • 定义

    typedef enum
    
    {
    
        E_MI_VDEC_VIDEO_FORMAT_TILE = 0x0,
    
        E_MI_VDEC_VIDEO_FORMAT_REDUCE,
    
        E_MI_VDEC_VIDEO_FORMAT_MAX
    
    } MI_VDEC_VideoFormat_e;
    
  • 成员

    成员名称 描述
    E_MI_VDEC_VIDEO_FORMAT_TILE TILE数据格式。
    E_MI_VDEC_VIDEO_FORMAT_REDUCE 数据帧压缩模式,减少数据帧内存使用量。
  • 注意事项

    当前数据类型不支持上层设定,只能返回支持数据类型。

3.9. MI_VDEC_DisplayMode_e

  • 说明

    定义显示模式。

  • 定义

    typedef enum
    
    {
    
        E_MI_VDEC_DISPLAY_MODE_PREVIEW = 0x0,
    
        E_MI_VDEC_DISPLAY_MODE_PLAYBACK,
    
        E_MI_VDEC_DISPLAY_MODE_MAX,
    
    } MI_VDEC_DisplayMode_e;
    
  • 成员

    成员名称 描述
    E_MI_DISPLAY_MODE_PREVIEW 预览模式。
    E_MI_DISPLAY_MODE_PLAYBACK 回放模式。
  • 注意事项

    该参数暂不支持设置。

3.10. MI_VDEC_OutbufLayoutMode_e

  • 说明

    定义输出buffer模式。

  • 定义

    typedef enum
    
    {
    
        E_MI_VDEC_OUTBUF_LAYOUT_AUTO = 0x0,
    
        E_MI_VDEC_OUTBUF_LAYOUT_LINEAR,
    
        E_MI_VDEC_OUTBUF_LAYOUT_TILE,
    
        E_MI_VDEC_OUTBUF_LAYOUT_MAX
    
    } MI_VDEC_OutbufLayoutMode_e;
    
  • 成员

    成员名称 描述
    E_MI_VDEC_OUTBUF_LAYOUT_AUTO 输出buffer自适应模式。
    E_MI_VDEC_OUTBUF_LAYOUT_LINEAR 输出buffer为LINEAR模式。
    E_MI_VDEC_OUTBUF_LAYOUT_TILE 输出buffer为TILE模式
  • 注意事项

    • MI_DISP模块的旋转功能和MI_VDEC模块的TILE模式存在联动关系。如果MI_DISP模块需要开启旋转功能,则其前端送入的buffer必须为TILE格式。MI_VDEC模块有两种方式输出TILE格式的图像。

      1) 输出buffer模式为E_MI_VDEC_OUTBUF_LAYOUT_AUTO(默认)时,MI_DISP模块和MI_VDEC模块需要绑定;此时,由MI_DISP模块开启旋转,同时通过u64SidebandMsg告知MI_VDEC模块,然后MI_VDEC模块自动打开TILE模式,即可完成旋转功能的开启。如果MI_DISP模块关闭旋转,则同样通过u64SidebandMsg告知MI_VDEC模块,然后MI_VDEC模块再自动关闭TILE模式。该过程无需用户处理,由模块内部自动完成。

      2) 输出buffer模式为E_MI_VDEC_OUTBUF_LAYOUT_TILE时,MI_VDEC模块仅输出TILE格式的图像。MI_DISP模块必须开启旋转功能,才能正常显示TILE格式的图像。这种模式下,MI_VDEC模块和MI_DISP模块既可以直接绑定,也可由用户获取MI_VDEC模块的输出buffer,再发送给MI_DISP模块。

    • 如果MI_VDEC模块需要输出LINEAR图像,有两种方式。

      1) 输出buffer模式为E_MI_VDEC_OUTBUF_LAYOUT_AUTO(默认)时,如果MI_VDEC模块和MI_DISP模块绑定,则MI_DISP模块关闭旋转,即可输出LINEAR图像。其他情况下,均输出LINEAR图像。

      2) 输出buffer模式为E_MI_VDEC_OUTBUF_LAYOUT_LINEAR时,MI_VDEC模块仅输出LINEAR图像。

    • 输出buffer为TILE模式时,MI_VDEC模块输出buffer对齐方式如下表。

      芯片 TILE 输出buffer对齐要求(BYTE)
      Taiyaki 128x32
      Takoyaki 128x32

      因此,通过MI_VDEC_OutputPortAttr_t设置MI_VDEC模块输出buffer宽高时,也需要按TILE输出buffer对齐要求进行设置,否则会输出异常图像。如:TILE输出buffer对齐要求为128x32,那么MI_VDEC_OutputPortAttr_t设置MI_VDEC模块输出buffer的宽高也需要按128x32对齐。

3.11. MI_VDEC_InitParam_t

  • 说明

    定义解码设备初始化参数结构体。

  • 定义

    typedef struct MI_VDEC_InitParam_s
    
    {
    
        MI_BOOL bDisableLowLatency;
    
    } MI_VDEC_InitParam_t;
    
  • 成员

    成员名称 描述
    bDisableLowLatency 开启/关闭低延时模式,默认为FALSE。参数类型: MI_BOOL
  • 注意事项

    • 若bDisableLowLatency设为TRUE,表示关闭低延时;这种情况适用于解码B帧,用于对B帧的输出做reorder,输出画面会有延时。另外,做reorder操作,也会增加内存使用量。

    • 默认开启了低延时模式,即bDisableLowLatency为FALSE。如果场景不涉及延时模式,则无需调用MI_VDEC_InitDev

3.12. MI_VDEC_ChnAttr_t

  • 说明

    定义视频解码通道属性。

  • 定义

    typedef struct MI_VDEC_ChnAttr_s { MI_VDEC_CodecType_e eCodecType; MI_U32 u32BufSize MI_U32 u32Priority MI_U32 u32PicWidth MI_U32 u32PicHeight MI_VDEC_VideoMode_e eVideoMode MI_VDEC_DPB_BufMode_e eDpbBufMode; union { MI_VDEC_JpegAttr_t stVdecJpegAttr; MI_VDEC_VideoAttr_t stVdecVideoAttr; }; } MI_VDEC_ChnAttr_t;

  • 成员

    成员名称 描述
    eCodecType 解码类型枚举值。参数类型: MI_VDEC_CodecType_e
    u32BufSize 码流缓存的大小。
    u32Priority 通道优先级,取值范围为 1 ~ 255,值越大优先级越高。 注意:当前暂不支持此功能。
    u32PicWidth 通道支持的解码图像最大宽(以像素为单位)
    u32PicHeight 通道支持的解码图像最大高(以像素为单位)
    eVideoMode 码流传送方式。 注意:当前只支持按帧。
    eDpbBufMode DPB buffer 模式。 注意: eDpbBufMode= E_MI_VDEC_DPB_MODE_INPLACE_ONE_BUF,只适用于一个参考帧的码流;eDpbBufMode= E_MI_VDEC_DPB_MODE_INPLACE_TWO_BUF,适用于两个参考帧的码流;如果超过两个参考帧,则需要设置为eDpbBufMode= E_MI_VDEC_DPB_MODE_NORMAL。
    stVdecJpegAttr JPEG 通道的相关属性,目前暂不支持该参数相关功能。
    stVdecVideoAttr 除 JPEG 以外其它所支持类型的通道的相关属性
  • 注意事项

    • 当设置了eDpbBufMode为E_MI_VDEC_DPB_MODE_INPLACE_ONE_BUF或者E_MI_VDEC_DPB_MODE_INPLACE_TWO_BUF时,u32RefFrameNum的值将无效;

    • E_MI_VDEC_DPB_MODE_INPLACE_ONE_BUF与E_MI_VDEC_DPB_MODE_INPLACE_TWO_BUF为省内存模式,E_MI_VDEC_DPB_MODE_INPLACE_ONE_BUF解码器只分配1个参考帧,因此也只能解码1个参考帧的码流,同理,E_MI_VDEC_DPB_MODE_INPLACE_TWO_BUF最多只分配2个参考帧,只能解码最多2个参考帧的码流。对于2个参考帧以上的码流,只支持设置为E_MI_VDEC_DPB_MODE_NORMAL。例如:设置为E_MI_VDEC_DPB_MODE_NORMAL模式时,解码1个参考帧的码流,解码器需要申请2个参考帧才能正常解码,会比E_MI_VDEC_DPB_MODE_INPLACE_ONE_BUF省内存模式多申请1个参考帧。

    • 当eDpbBufMode为E_MI_VDEC_DPB_MODE_NORMAL时,需要设置u32RefFrameNum的值,用于限制最大参考帧个数,避免分配过多的frame buffer;若u32RefFrameNum的值小于当前解码所需的参考帧个数,则可能不解码或者解码花屏。

    • 如果无法预先确定码流参考帧个数,那么建议设置为E_MI_VDEC_DPB_MODE_NORMAL模式,最大参考帧申请个数u32RefFrameNum设置为16。解码器会自动解析码流所需参考帧个数,按解码码流所需参考帧个数进行申请。例如: u32RefFrameNum设置为16,当前码流解码需要3个参考帧,那么解码器将申请4个参考帧;反之,如果u32RefFrameNum设置为2,当前解码需要3个参考帧的码流,那么解码器最多只能申请到2个参考帧,无法正常解码。

3.13. MI_VDEC_JpegAttr_t

  • 说明

    定义JPEG视频解码属性。

  • 定义

    typedef struct MI_VDEC_JpegAttr_s
    
    {
    
        MI_VDEC_JpegFormat_e eJpegFormat;
    
    }MI_VDEC_JpegAttr_t;
    
  • 成员

    成员名称 描述
    eJpegFormat JPEG图片的存储格式。 取值范围是[0,E_MI_JPEG_FORMAT_MAX)。
  • 注意事项

    • 目前暂不支持该参数相关功能。

3.14. MI_VDEC_VideoAttr_t

  • 说明

    定义视频解码通道属性。

  • 定义

    typedef struct MI_VDEC_VideoAttr_s
    
    {
    
        MI_U32 u32RefFrameNum;
    
        MI_VDEC_ErrHandlePolicy_t stErrHandlePolicy;
    
    }MI_VDEC_VideoAttr_t;
    
  • 成员

    成员名称 描述
    u32RefFrameNum 参考帧的数目。 取值范围:[0, 16],以帧为单位。 参考帧的数目决定解码时需要的参考帧个数,影响内存使用量,根据实际情况设置合适的值。测试码流:推荐设为 2。
    stErrHandlePolicy 设置错误宏块的数据帧的输出策略,参考MI_VDEC_ErrHandlePolicy_t定义。
  • 注意事项

    • 当设置了eDpbBufMode为E_MI_VDEC_DPB_MODE_INPLACE_ONE_BUF或者E_MI_VDEC_DPB_MODE_INPLACE_TWO_BUF时,u32RefFrameNum的值将无效;

    • 当eDpbBufMode为E_MI_VDEC_DPB_MODE_NORMAL时,需要设置u32RefFrameNum的值,用于限制最大参考帧个数,避免分配过多的frame buffer;若u32RefFrameNum的值小于当前解码所需的参考帧个数,则可能不解码或者解码花屏。

    • 参数stErrHandlePolicy仅支持在Takoyaki芯片使用。

3.15. MI_VDEC_ChnStat_t

  • 说明

    定义通道状态结构体。

  • 定义

    typedef MI_VDEC_ChnStat_s
    {
        MI_VDEC_CodecType_e eCodecType;
        MI_U32  u32LeftStreamBytes;
        MI_U32  u32LeftStreamFrames;
        MI_U32  u32LeftPics;
        MI_BOOL bChnStart;
        MI_U32 u32RecvStreamFrames;
        MI_U32 u32DecodeStreamFrames;
        MI_VDEC_ErrCode_e eErrCode;
    } MI_VDEC_ChnStat_t;
    
  • 成员

    成员名称 描述
    eCodecType 解码类型
    u32LeftStreamBytes 码流 buffer 中待解码的 byte 数。
    u32LeftStreamFrames 码流 buffer 中待解码的帧数。 –1 表示无效。 仅按帧发送时有效。
    u32LeftPics 图像 buffer 中剩余的 pic 数目。
    bChnStart 解码器是否已经启动接收码流。
    u32RecvStreamFrames 码流 buffer 中已接收码流帧数。 -1 表示无效。 仅按帧发送时有效。
    u32DecodeStreamFrames 码流 buffer 中已解码帧数。
    eErrCode 解码错误码信息。

3.16. MI_VDEC_ChnParam_t

  • 说明

    定义解码通道参数结构体。

  • 定义

    typedef struct MI_VDEC_ChnParam_s
    {
        MI_VDEC_DecodeMode_e eDecMode;
        MI_VDEC_OutputOrder_e eOutputOrder;
        MI_VDEC_VideoFormat_e eVideoFormat;
    } MI_VDEC_ChnParam_t;
    
  • 成员

    成员名称 描述
    eDecMode 解码模式,参考MI_VDEC_DecodeMode_e定义。默认为E_MI_VDEC_DECODE_MODE_IP。E_MI_VDEC_DECODE_MODE_ALL模式需要足够内存。
    eOutputOrder 参考MI_VDEC_OutputOrder_e定义,默认为 E_MI_VDEC_OUTPUT_ORDER_DISPLAY 按解码顺序输出数制帧。
    eVideoFormat 参考MI_VDEC_VideoFormat_e定义。
  • 注意事项

    • 暂不支持设置这些参数。

3.17. MI_VDEC_VideoStream_t

  • 说明

    定义视频解码的码流结构体。

  • 定义

    typedef struct MI_VDEC_VideoStream_s
    
    {
    
        MI_U8* pu8Addr;
    
        MI_U32 u32Len;
    
        MI_U64 u64PTS;
    
        MI_BOOL bEndOfFrame;
    
        MI_BOOL bEndOfStream;
    
        MI_BOOL bRepeatFrame;
    
    }MI_VDEC_VideoStream_t;
    
  • 成员

    成员名称 描述
    pu8Addr 码流包的地址。
    u32Len 码流包的长度,以字节为单位。
    u64PTS 码流包的时间戳,以毫秒为单位。
    bEndOfFrame 当前帧是否结束,预留,当前只支持帧模式下按帧传送。
    bEndOfStream 是否发完所有码流。当所有码流数据帧传送完毕时,bEndOfStream值需置为TRUE。
    bRepeatFrame 是否标记当前帧为重复帧。
  • 注意事项

    • 暂不支持按流发送。按帧传送时,每次需完整传送一帧数据。

    • 码流帧数据附带PTS时,解码后输出数据输出相同PTS。当u64PTS = -2时,在解码后,VDEC会丢弃该帧。用户可根据需要进行设置。

3.18. MI_VDEC_UserData_t

  • 说明

    定义用户数据结构体。

  • 定义

    typedef struct MI_VDEC_UserData_s
    
    {
    
        MI_U8* pu8Addr;
    
        MI_U32 u32Len;
    
        MI_BOOL bValid;
    
    } MI_VDEC_UserData_t;
    
  • 成员

    成员名称 描述
    pu8Addr 用户数据的虚拟地址。
    u32Len 用户数据的长度。以 byte 为单位。
    bValid 当前数据的有效标识。取值范围:
  • 注意事项

    • 目前暂不支持该参数相关功能。

3.19. MI_VDEC_OutputPortAttr_t

  • 说明

    定义输出端口属性。

  • 定义

    typedef struct MI_VDEC_OutputPortAttr_s
    
    {
    
        MI_U16 u16Width;             // Width of target image
    
        MI_U16 u16Height;            // Height of target image
    
    }MI_VDEC_OutputPortAttr_t;
    
  • 成员

    成员名称 描述
    u16Width 输出图像宽
    u16Height 输出图像高
  • 注意事项

    • 缩放宽和高需要按2对齐。

    • 缩放范围[⅛, 1]。

    • 不支持放大。

3.20. MI_VDEC_ErrHandlePolicy_t

  • 说明

    定义错误宏块处理策略结构体。

  • 定义

    typedef struct MI_VDEC_ErrHandlePolicy_s
    
    {
    
        MI_BOOL bUseCusPolicy;     // FALSE: use default; TRUE: use customized value
    
        MI_U8 u8ErrMBPercentThreshold;
    
    } MI_VDEC_ErrHandlePolicy_t;
    
  • 成员

    成员名称 描述
    bUseCusPolicy 是否需要客制化控制错误帧输出策略。
    u8ErrMBPercentThreshold 设置控制不输出数据帧时,错误宏块数占整张数据帧宏块数的比例值,取值范围[0, 100]。
  • 注意事项

    • bUseCusPolicy 值为FALSE时代表不做客制化,u8ErrMBPercentThreshold为系统内置默认值30;bUseCusPolicy值为TRUE时,则使用客制化定义的u8ErrMBPercentThreshold数值。

    • u8ErrMBPercentThreshold取值范围[0, 100]。例如数值为10时,代表错误宏块个数占整个数据帧宏块个数低于10%时,当前数据帧输出显示,否则(大于等于10%)不显示。其中数值为0时,代表只要有错误宏块都将不输出显示;数值为100时,代表不管有多少错误宏块当前数据帧都将会显示。

    • u8ErrMBPercentThreshold数值是以宏块为基本单位计算比率值。

    • 该参数仅支持在Takoyaki芯片使用。


4. 错误码

视频解码错误码如下表:

错误代码 宏定义 描述
0xA0082001 MI_ERR_VDEC_INVALID_DEVID 设备ID超出合法范围
0xA0082002 MI_ERR_VDEC_INVALID_CHNID 通道ID超出合法范围
0xA0082003 MI_ERR_VDEC_ILLEGAL_PARAM 非法参数或输入参数超过通道解码能力
0xA0082004 MI_ERR_VDEC_CHN_EXIST 试图创建已经存在的通道
0xA0082005 MI_ERR_VDEC_CHN_UNEXIST 通道不存在
0xA0082006 MI_ERR_VDEC_NULL_PTR 输入参数为空指针
0xA0082007 MI_ERR_VDEC_NOT_CONFIG 使用前未配置
0xA0082008 MI_ERR_VDEC_NOT_SUPPORT 该操作或者功能不支持
0xA0082009 MI_ERR_VDEC_NOT_PERM 非法操作
0xA008200C MI_ERR_VDEC_NOMEM 分配内存失败,如系统内存不足
0xA008200D MI_ERR_VDEC_NOBUF 分配缓存失败,如申请的数据缓冲区太大
0xA008200E MI_ERR_VDEC_BUF_EMPTY 缓冲区中无数据
0xA008200F MI_ERR_VDEC_BUF_FULL 缓冲区中数据满
0xA0082010 MI_ERR_VDEC_SYS_NOTREADY 系统没有初始化或者相关 依赖的模块没有加载
0xA0082011 MI_ERR_VDEC_BADADDR 地址错误
0xA0082012 MI_ERR_VDEC_BUSY 系统忙
0xA0082013 MI_ERR_VDEC_CHN_NOT_START 通道未使能
0xA0082014 MI_ERR_VDEC_CHN_NOT_STOP 通道未禁用
0xA0082015 MI_ERR_VDEC_NOT_INIT 模块没有成功加载
0xA0082016 MI_ERR_VDEC_INITED 模块已成功加载
0xA0082017 MI_ERR_VDEC_NOT_ENABLE 解码器未使能
0xA0082018 MI_ERR_VDEC_NOT_DISABLE 解码器未禁用
0xA008201F MI_ERR_VDEC_FAILED 失败

5. PROCFS介绍


5.1. cat

  • 调试信息

    # cat /proc/mi_modules/mi_vdec/mi_vdec0
    

  • 调试信息分析

    打印分为两部分,使用Private Vdec0 Info分隔开。上半部分为common信息,下半部分为vdec模块信息。 主要记录了解码通道的使用情况及配置属性,可用于检查属性配置和当前通道的工作状态,便于debug。

  • 参数说明

    参数 描述
      fwVersion fw版本信息。
    VLC Buffer Status Idx Vlc buffer索引。
    State Vlc buffer使用状态。
    0:空闲状态;
    1:已准备好;
    2:正在使用。
    Base Vlc buffer基地址。
    Phy Vlc buffer物理地址。
    Virt Vlc buffer虚拟地址。
    Size Vlc buffer大小。
    CHN ATTR Info ChnID  通道号。
    CodecType  解码协议类型
    0:H264;
    1:H265;
    2:JPEG。
    Width  解码图像最大宽度。
    Height   解码图像最大高度。
    BufSize  VDEC码流buffer大小,单位:byte。
    VideoMode  发送码流方式。
    STREAM:按流发送;
    FRAME:按帧发送。
    RefFrmNum 最大分配参考帧个数。
    DpbBufMode 解码模式。
    INPLACE1:DBP_MODE_INPLACE_ONE_BUF;
    INPLACE2:DBP_MODE_INPLACE_TWO_BUF;
    NORMAL:DBP_MODE_NORMAL。
    CHN PARAM Info ChnID  通道号。
    bScale 是否设置缩小功能。
    N: 不设置。
    Y: 设置。
    ScaleW 设置缩小输出的宽度。
    ScaleH 设置缩小输出的高度。
    DisplayMode 显示模式。
    PREVIEW:  预览模式
    PLAYBACK: 回放模式
    minFrmBufCnt 当前源码流解码所需要分配参考帧个数。
    SkipFrmMode 跳帧模式。0:解码所有帧;1:只解I 帧;2:只解参考帧。
    bRepeatFrm 是否解码重复帧。0:关闭解码重复帧;1:打开解码重复帧。
    Decode Frame Info ChnID 通道号。
    DecW 源码流宽度。
    DecH 源码流高度。
    DispW 输出数据帧的宽度。
    DispH 输出数据帧的高度。
    Output Frame Info ChnID 通道号。
    bTileMode 是否打开tilemode输出格式。
    Y: 是。
    N: 否。
    TileFormat TileMode开启后对齐的格式。
    128x64: 128x64字节对齐。
    128x32: 128x32字节对齐。
    32x32: 32x32字节对齐。
    Invalid: 不支持。
    NA: 没有开启tilemode输出格式。
    Width 输出数据帧的宽度。
    Height 输出数据帧的高度。
    Stride 输出数据帧需对齐后的宽度stride。
    PixelFmt 输出数据帧的像素格式。
    YUV420SP: NV12数据帧格式输出。
    CHN STATE ChnID  通道号。
    bStart  解码器是否启动。
    Y: 启动,进入解码状态。
    N: 停止解码状态。
    DecState 当前通道解码状态。
    0:未定义。
    1:通道刚创建。
    2:等待sps,pps等关键数据帧。
    3:获取关键sps, pps信息完成状态。
    4:解码前申请参考帧等内存状态。
    5:申请到解码所需内存,正常解码状态。
    6:通道关闭状态。
    SendCnt 应用层推流次数。
    SendStrmSize 应用层推流字节数。
    LeftStrmBytes 码流buffer中待解码的byte数。
    StrmLeftCnt 相应于SendCnt参数,待解码的次数。
    DecFrmCnt 成功解码输出的帧数。
    fps 当前解码帧率。
    CHN STATE ChnID 通道号。
    startCnt 开始解码次数。
    getCnt 成功获取到解码结果的次数。
    dropCnt 丢弃不输出显示的次数。
    errCnt 解码报错的次数。
    runCnt 解码task还在执行的次数。
    seqChgCnt 图像序列发生变化的次数。例如: SPS。
    initSeqCnt 解码器完成解析码流头信息后,对应Issue请求,返回的中断次数。
    decPicCnt 解码器返回解码成功的中断次数。
    insuffiCnt VLC Buffer不足的中断次数。
    emptyCnt 码流buffer为空的中断次数。


5.2. echo

功能
将指定通道输入的bitstream数据存储到指定路径
命令 echo dumpbs [chn] [path] > /proc/mi_modules/mi_vdec/mi_vdec0
参数说明 chn:通道号 [0~31]
path:dump文件输出路径,输入off代表停止存储码流。
举例 echo dumpbs 3 /mnt/dump/ > /proc/mi_modules/mi_vdec/mi_vdec0
//dump通道3的应用推送到bitstream buffer的码流数据到/mnt/dump目录下
功能
将指定通道的当前码流buffer的所有数据存储到指定路径。(整个码流buffer包含有效数据和无效数据,注意与前面dumpbs的区别)
命令 echo dumpbsb [chn] [path] > /proc/mi_modules/mi_vdec/mi_vdec0
参数说明 chn:通道号 [0~31]
path:dump文件输出路径。
举例 echo dumpbsb 3 /mnt/dump/ > /proc/mi_modules/mi_vdec/mi_vdec0
//dump通道3的整个码流buffer的数据到/mnt/dump目录下
功能
将指定通道解码后的输出数据帧存储指定路径
命令 echo dumpfb [chn] [path] [frmcnt] [bDumpAll] [bDetile] > /proc/mi_modules/mi_vdec/mi_vdec0
参数说明 chn:通道号 [0~31]
path:dump文件输出路径
Frmcnt:dump的帧数
bDumpAll: 0:只存储yuv buffer。 1:同时存储Y buffer,UV buffer和YUV buffer。
bDetile: 0:不对将要存储的YUV做detile(tilemode模式下存储tile格式数据)。 1:对将要存储的YUV做detile(tilemode模式下存储YUV格式数据)。
举例 echo dumpfb 3 /mnt/dump/ 99 0 1 > /proc/mi_modules/mi_vdec/mi_vdec0
通道3,存储路径为/mnt/dump/,存储99帧,不单独保存Y buffer和UV buffer,对将要存储的YUV做detile
功能
打开/关闭flow checkpoint,检查解码任务运行状态。(不建议客户使用,内部debug)
命令 echo flowdbg [Status] > /proc/mi_modules/mi_vdec/mi_vdec0
参数说明 Status:on 打开; off 关闭
举例 echo flowdbg on > /proc/mi_modules/mi_vdec/mi_vdec0
打开vdec flow checkpoint,然后再敲cat /proc/mi_modules/mi_vdec/mi_vdec0可以在vdec procfs查看当前多个函数的checkpoint
功能
打开/关闭丢帧开关,丢弃所有的解码输出数据帧,不输出到解码后端。
命令 echo dropoutbuf [Status] > /proc/mi_modules/mi_vdec/mi_vdec0
参数说明 Status:on 打开; off 关闭
举例 echo dropoutbuf on > /proc/mi_modules/mi_vdec/mi_vdec0
丢弃将要输出的frame buffer
功能
打开/关闭vdec性能统计开关。将输出更详细的proc debug信息。(不建议客户使用,内部debug。)
命令 echo setperf [Status] > /proc/mi_modules/mi_vdec/mi_vdec0
参数说明 Status:on 打开; off 关闭
举例 echo setperf on > /proc/mi_modules/mi_vdec/mi_vdec0
打开vdec性能统计开关,然后再敲cat /proc/mi_modules/mi_vdec/mi_vdec0可以在vdec procfs查看当前解码耗时等数据。