MI VDEC API

version 3.04


1. 概述


1.1. 模块简介

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

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

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

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

表1-1 芯片解码规格

芯片 硬件解码模块 支持最大通道数 支持协议 分辨率范围 最大性能
Taiyaki DEC2.0 16 H.264/H.265 H.264: max 8192x8192, min 32x32
H.265: max 8192x8192, min 8x8
H.264: 3840x2160@30fps H.265: 3840x2160@30fps
Takoyaki DEC2.0 4 H.264/H.265 H.264: max 8192x8192, min 32x32
H.265: max 8192x8192, min 8x8
H.264: 920x1080@30fps H.265: 1920x1080@30fps
Tiramisu 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

1.2. 解码流程图

图1-1 Taiyaki数据流程图

图1-2 Takoyaki数据流程图

图1-3 Tiramisu数据流程图


1.3. 关键字说明

  • 码流发送方式

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

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

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

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

  • 图像输出顺序

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

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

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

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

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

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

  • 时间戳(PTS)处理

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

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

  • 码流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。

  • 输出buffer模式

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

  • 输出图像裁剪

    用户调用MI_VDEC_SetDestCrop可以对解码后的图像进行裁剪再输出。设置裁剪时,坐标X和宽必须按16对齐,坐标Y和高必须按2对齐,否则接口会返回错误码MI_ERR_VDEC_ILLEGAL_PARAM。如果裁剪功能和缩放功能同时使用,则裁剪的图像大小不能小于缩放的大小,否则接口会返回错误码MI_ERR_VDEC_ILLEGAL_PARAM。

    Taiyaki和Takoyaki系列芯片不支持裁剪功能。

    裁剪和缩放的关系:

    1. 缩放关闭,裁剪关闭,输出为原图像;

    2. 缩放开启,裁剪关闭,输出为缩放后的图像;

    3. 缩放关闭,裁剪开启,输出为裁剪后的图像;

    4. 缩放开启,裁剪开启,输出为以裁剪后的的图像为参考,再做缩放后的图像;

      如果开启了缩放,则最后输出的frame buffer以缩放大小为最终输出大小。

    5. 输出图像格式

      目前H264及H265解码只支持输出NV12图像格式。


2. API参考


2.1. 功能模块API

API名 功能
MI_VDEC_CreateDev 创建解码设备
MI_VDEC_DestroyDev 销毁解码设备
MI_VDEC_CreateChn 创建解码通道
MI_VDEC_DestroyChn 销毁解码通道
MI_VDEC_StartChn 开始通道解码
MI_VDEC_StopChn 停止通道解码
MI_VDEC_GetChnAttr 获取解码通道属性
MI_VDEC_GetChnStat 获取解码通道状态
MI_VDEC_FlushChn 清理解码通道缓存数据
MI_VDEC_ResetChn 重置解码通道
MI_VDEC_SetChnParam 设置解码通道参数
MI_VDEC_GetChnParam 获取解码通道参数
MI_VDEC_SendStream 向解码通道发送码流数据
MI_VDEC_PauseChn 暂停通道解码
MI_VDEC_RefreshChn 刷新通道,再次解码当前帧
MI_VDEC_ResumeChn 恢复通道解码
MI_VDEC_StepChn 通道单帧解码
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_SetDestCrop 设置解码通道裁剪属性
MI_VDEC_GetDestCrop 获取解码通道裁剪属性
MI_VDEC_SetChnErrHandlePolicy 设置解码通道错误宏块的数据帧的输出策略
MI_VDEC_SetOutputPortAttrEx 设置解码通道输出端口属性
MI_VDEC_GetOutputPortAttrEx 获取解码通道输出端口属性
MI_VDEC_SetDestCropEx 设置解码通道裁剪属性
MI_VDEC_GetDestCropEx 获取解码通道裁剪属性

2.2. MI_VDEC_CreateDev

  • 功能

    创建解码设备

  • 定义

    MI_S32 MI_VDEC_CreateDev(MI_VDEC_DEV VdecDev, MI_VDEC_InitParam_t *pstInitParam);
    
  • 形参

    参数名称 描述 输入/输出
    VdecDev 解码设备号。取值范围:[0, MI_VDEC_MAX_DEV_NUM)。 输入
    pstVdecInitParam 解码设备初始化参数指针,数据类型: MI_VDEC_InitParam_t 输入
  • 返回值

    返回值 描述
    MI_SUCCESS 成功。
    MI_ERR_VDEC_FAILED 失败。
    MI_ERR_VDEC_INVALID_DEVID 设备 ID 超出合法范围。
    MI_ERR_VDEC_INITED 设备已经初始化。
    MI_ERR_VDEC_NULL_PTR 输入参数为空指针。
    MI_ERR_VDEC_NOT_CONFIG 使用前未配置。
    MI_ERR_VDEC_ILLEGAL_PARAM 非法参数或输入参数超过通道解码能力。
  • 依赖

    • 头文件:mi_vdec.h、mi_common.h

    • 库文件:libmi_vdec.a

  • 注意

    • 设备号不能超出最大的设备号范围;

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

    • 若选择使用该接口,则必须在创建解码通道前调用,否则会返回设备已初始化的错误码MI_ERR_VDEC_INITED;

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

  • 举例

    MI_S32 StartVdec(void)
    {
    MI_S32 s32Ret = MI_ERR_VDEC_FAILED;
    MI_VDEC_DEV VdecDev = 0;
        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));
    
        s32Ret = MI_VDEC_CreateDev(VdecDev, &stInitParam);
        if(MI_SUCCESS != s32Ret)
        {
            printf("MI_VDEC_CreateDev 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;
        stChnAttr.stVdecVideoAttr.bDisableLowLatency = FALSE;
    
        s32Ret = MI_VDEC_CreateChn(VdecDev, VdecChn, &stChnAttr);
        if(MI_SUCCESS != s32Ret)
        {
            printf("MI_VDEC_CreateChn failed, s32Ret: 0x%x.\n", s32Ret);
            return s32Ret;
        }
    
        return MI_SUCCESS;
    }
    

2.3. MI_VDEC_DestroyDev

  • 功能

    销毁解码设备。

  • 定义

    MI_S32 MI_VDEC_DestroyDev (MI_VDEC_DEV VdecDev);
    
  • 形参

    参数名称 描述 输入/输出
    VdecDev 解码设备号。 取值范围:[0, MI_VDEC_MAX_DEV_NUM)。 输入
  • 返回值

    返回值 描述
    MI_SUCCESS 成功。
    MI_ERR_VDEC_FAILED 失败。
    MI_ERR_VDEC_INVALID_DEVID 设备ID超出合法范围。
    MI_ERR_VDEC_NOT_INIT 设备未初始化。
    MI_ERR_VDEC_NOT_CONFIG 使用前未配置。
  • 依赖

    • 头文件:mi_vdec.h、mi_common.h

    • 库文件:libmi_vdec.a

  • 注意

    • 该接口为可选调用;

    • 设备号不能超出最大的设备号范围;

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

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

  • 举例

    MI_S32 StopVdec(void)
    {
    MI_S32 s32Ret = MI_ERR_VDEC_FAILED;
    MI_VDEC_DEV VdecDev = 0;
        MI_VDEC_CHN VdecChn = 0;
    
        s32Ret = MI_VDEC_DestroyChn(VdecDev, 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_DestroyDev(VdecDev);
        if(MI_SUCCESS != s32Ret)
        {
            printf("MI_VDEC_DestroyDev failed, s32Ret: 0x%x.\n", s32Ret);
            return s32Ret;
        }
    
        return MI_SUCCESS;
    }
    

2.4. MI_VDEC_CreateChn

  • 功能

    创建视频解码通道。

  • 定义

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

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

    返回值 描述
    MI_SUCCESS 成功。
    MI_ERR_VDEC_FAILED 失败。
    MI_ERR_VDEC_INVALID_DEVID 设备 ID 超出合法范围。
    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、mi_common.h

    • 库文件:libmi_vdec.a

  • 注意

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

    • 如果设置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_DEV VdecDev = 0;
        MI_VDEC_CHN VdecChn = 0;
        MI_VDEC_DisplayMode_e eDisplayMode = E_MI_VDEC_DISPLAY_MODE_MAX;
        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(VdecDev, VdecChn, &stChnAttr);
        if(MI_SUCCESS != s32Ret)
        {
            printf("MI_VDEC_CreateChn failed, s32Ret: 0x%x.\n", s32Ret);
            return s32Ret;
        }
    
        eDisplayMode = E_MI_VDEC_DISPLAY_MODE_PLAYBACK;
        s32Ret = MI_VDEC_SetDisplayMode (VdecDev, VdecChn, eDisplayMode);
        if(MI_SUCCESS != s32Ret)
        {
            printf("MI_VDEC_SetDisplayMode failed, s32Ret: 0x%x.\n", s32Ret);
            return s32Ret;
        }
    
        s32Ret = MI_VDEC_StartChn(VdecDev, VdecChn);
        if(MI_SUCCESS != s32Ret)
        {
            printf("MI_VDEC_StartChn failed, s32Ret: 0x%x.\n", s32Ret);
            return s32Ret;
        }
    
        stOutputPortAttr.u16Width  = 640;
        stOutputPortAttr.u16Height = 480;
        s32Ret = MI_VDEC_SetOutputPortAttr(VdecDev, VdecChn, &stOutputPortAttr);
        if(MI_SUCCESS != s32Ret)
        {
            printf("MI_VDEC_SetOutputPortAttr failed, s32Ret: 0x%x.\n", s32Ret);
            return s32Ret;
    }
    
    stCropCfg.bEnable   = TRUE;
    stCropCfg.stRect.u16X  = 0;
    stCropCfg.stRect.u16Y  = 0;    
    stCropCfg.stRect.u16Width = 720;
    stCropCfg.stRect.u16Height = 578;
    s32Ret = MI_S32 MI_VDEC_SetDestCrop(VdecDev, VdecChn, &stCropCfg);
    if(MI_SUCCESS != s32Ret)
    {
        printf("MI_VDEC_SetDestCrop failed, s32Ret: 0x%x.\n", s32Ret);
        return s32Ret;
    }
    
        return MI_SUCCESS;
    }
    

2.5. MI_VDEC_DestroyChn

  • 功能

    销毁视频解码通道。

  • 定义

    MI_S32 MI_VDEC_DestroyChn(MI_VDEC_DEV VdecDev, MI_VDEC_CHN VdecChn);
    
  • 形参

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

    返回值 描述
    MI_SUCCESS 成功。
    MI_ERR_VDEC_FAILED 失败。
    MI_ERR_VDEC_INVALID_DEVID 设备 ID 超出合法范围。
    MI_ERR_VDEC_INVALID_CHNID 通道 ID 超出合法范围。
    MI_ERR_VDEC_CHN_NOT_STOP 停止接收码流前不允许关闭通道。
    MI_ERR_VDEC_CHN_UNEXIST 通道不存在。
    MI_ERR_VDEC_NOT_SUPPORT 该操作或者功能不支持
  • 依赖

    • 头文件:mi_vdec.h、mi_common.h

    • 库文件:libmi_vdec.a

  • 注意

    • 销毁前需停止接收码流。
  • 举例

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

2.6. MI_VDEC_StartChn

  • 功能

    开始通道解码。

  • 定义

    MI_S32 MI_VDEC_StartChn(MI_VDEC_DEV VdecDev, MI_VDEC_CHN VdecChn);
    
  • 形参

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

    返回值 描述
    MI_SUCCESS 成功。
    MI_ERR_VDEC_FAILED 失败。
    MI_ERR_VDEC_INVALID_DEVID 设备 ID 超出合法范围。
    MI_ERR_VDEC_INVALID_CHNID 通道 ID 超出合法范围。
    MI_ERR_VDEC_CHN_UNEXIST 通道未创建或者已销毁。
    MI_ERR_VDEC_CHN_NOT_STOP 通道未停止。
    MI_ERR_VDEC_NULL_PTR 输入参数为空指针。
  • 依赖

    • 头文件:mi_vdec.h、mi_common.h

    • 库文件:libmi_vdec.a

  • 注意

    • 启动接收码流前必须保证通道已创建,否则会返回通道未创建的错误码 MI_ERR_VDEC_CHN_UNEXIST。

    • 启动接收码流之后,才能调用 MI_VDEC_SendStream 发送码流成功。

    • 重复调用启动接收码流接口时,返回成功。

  • 举例

    请参见MI_VDEC_CreateChn 的举例。


2.7. MI_VDEC_StopChn

  • 功能

    停止通道解码。

  • 语法

    MI_S32 MI_VDEC_StopChn(MI_VDEC_DEV VdecDev, MI_VDEC_CHN VdecChn);
    
  • 形参

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

    返回值 描述
    MI_SUCCESS 成功。
    MI_ERR_VDEC_FAILED 失败。
    MI_ERR_VDEC_INVALID_DEVID 设备 ID 超出合法范围。
    MI_ERR_VDEC_INVALID_CHNID 通道 ID 超出合法范围。
    MI_ERR_VDEC_CHN_NOT_START 通道未使能
    MI_ERR_VDEC_NULL_PTR 输入参数为空指针。
    MI_ERR_VDEC_CHN_UNEXIST 通道未创建或者已销毁。
    MI_ERR_VDEC_BUSY 系统忙。
  • 依赖

    • 头文件:mi_vdec.h、mi_common.h

    • 库文件:libmi_vdec.a

  • 注意

    • 调用此接口后,调用发送码流接口 MI_VDEC_SendStream 会返回失败。
    • 重复调用停止接收码流接口时,返回MI_ERR_VDEC_CHN_NOT_START。
    • 解码B帧时,如果vdec后级绑定了disp模块,则在vdec停止通道前,需要保证disp模块先退出;否则,vdec退出时,会直接释放linear buffer,而disp此时还在访问vdec的linear buffer,会引起踩内存等可能的问题;如果vdec退出时,发现有buffer未还回,会报错MI_ERR_VDEC_BUSY。
  • 举例

    请参见MI_VDEC_DestroyChn的举例。


2.8. MI_VDEC_GetChnAttr

  • 功能

    获取视频解码通道属性。

  • 定义

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

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

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

    • 头文件:mi_vdec.h、mi_common.h

    • 库文件:libmi_vdec.a


2.9. MI_VDEC_GetChnStat

  • 功能

    查询解码通道状态。

  • 语法

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

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

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

    • 头文件:mi_vdec.h、mi_common.h

    • 库文件:libmi_vdec.a

  • 举例

    请参见MI_VDEC_SendStream 的举例。


2.10. MI_VDEC_FlushChn

  • 功能

    清理解码通道缓存数据。

  • 定义

    MI_S32 MI_VDEC_FlushChn(MI_VDEC_DEV VdecDev, MI_VDEC_CHN VdecChn);
    
  • 形参

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

    返回值 描述
    MI_SUCCESS 成功。
    MI_ERR_VDEC_FAILED 失败。
    MI_ERR_VDEC_INVALID_DEVID 设备 ID 超出合法范围。
    MI_ERR_VDEC_INVALID_CHNID 通道 ID 超出合法范围。
    MI_ERR_VDEC_CHN_UNEXIST 通道未创建或已销毁。
    MI_ERR_VDEC_CHN_NOT_START 通道未使能。
    MI_ERR_VDEC_NULL_PTR 输入参数为空指针。
    MI_ERR_VDEC_BUSY 解码器忙。
  • 依赖

    • 头文件:mi_vdec.h、mi_common.h

    • 库文件:libmi_vdec.a

  • 注意

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

2.11. MI_VDEC_ResetChn

  • 功能

    复位解码通道。

  • 定义

    MI_S32 MI_VDEC_ResetChn(MI_VDEC_DEV VdecDev, MI_VDEC_CHN VdecChn);
    
  • 形参

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

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

    • 头文件:mi_vdec.h、mi_common.h

    • 库文件:libmi_vdec.a

  • 注意

    • 该接口暂不支持。

2.12. MI_VDEC_SetChnParam

  • 功能

    设置解码通道参数。

  • 语法

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

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

    返回值 描述
    MI_SUCCESS 成功。
    MI_ERR_VDEC_INVALID_DEVID 设备 ID 超出合法范围。
    MI_ERR_VDEC_INVALID_CHNID 通道 ID 超出合法范围。
    MI_ERR_VDEC_CHN_UNEXIST 通道未创建或已销毁。
    MI_ERR_VDEC_ILLEGAL_PARAM 参数不合法。
    MI_ERR_VDEC_NOT_PERM 非法操作,操作前需调用MI_VDEC_StopChn停止通道解码。
  • 依赖

    • 头文件:mi_vdec.h、mi_common.h

    • 库文件:libmi_vdec.a

  • 注意

    该接口暂不支持。


2.13. MI_VDEC_GetChnParam

  • 功能

    获取解码通道参数。

  • 语法

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

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

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

    • 头文件:mi_vdec.h、mi_common.h

    • 库文件:libmi_vdec.a

  • 注意

    • 该接口暂不支持。

2.14. MI_VDEC_SendStream

  • 功能

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

  • 语法

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

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

    返回值 描述
    MI_SUCCESS 成功。
    MI_ERR_VDEC_FAILED 失败。
    MI_ERR_VDEC_INVALID_DEVID 设备 ID 超出合法范围。
    MI_ERR_VDEC_INVALID_CHNID 通道 ID 超出合法范围。
    MI_ERR_VDEC_CHN_NOT_START 通道未使能。
    MI_ERR_VDEC_ILLEGAL_PARAM 非法参数。
    MI_ERR_VDEC_CHN_UNEXIST 通道未创建或者已销毁。
    MI_ERR_VDEC_BUF_FULL 解码后的数据帧缓冲区满。
    MI_ERR_VDEC_NOMEM 分配内存失败,如系统内存不足。
    MI_ERR_VDEC_NOT_CONFIG 使用前未配置。
  • 依赖

    • 头文件:mi_vdec.h、mi_common.h

    • 库文件:libmi_vdec.a

  • 注意

    • 暂不支持按流发送。
    • 按帧传送时,每次需完整传送一帧数据。
    • 暂不支持设置s32MilliSec,默认为非阻塞模式。如果出现码流buffer满或其他错误,则接口直接返回错误码。
    • 若用户在送流时,设置pstVideoStream->u64PTS = -2, 则在解码后,VDEC会丢弃该帧。用户可根据需要进行设置。
  • 举例

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

    MI_S32 VdecSendStream(void)
    {
    MI_S32 s32Ret = MI_ERR_VDEC_FAILED;
    MI_VDEC_DEV VdecDev = 0;
        MI_VDEC_CHN VdecChn = 0;
        MI_S32 s32MilliSec = 0;
        MI_VDEC_VideoStream_t stVideoStream;
        MI_VDEC_ChnStat_t stChnStat;
    
        do{
            //Check if you need stop sending stream
            if(bStop)
            {
                break;
            }
    
            memset(&stChnStat, 0x0, sizeof(MI_VDEC_ChnStat_t));
            s32Ret = MI_VDEC_GetChnStat(VdecDev, VdecChn, &stChnStat);
            if(MI_SUCCESS != s32Ret)
            {
                printf("MI_VDEC_GetChnStat failed, s32Ret: 0x%x.\n", s32Ret);
                return s32Ret;
            }
    
            //suggest to check chn status
            if(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(VdecDev, VdecChn, &stVideoStream, s32MilliSec);
            if(MI_SUCCESS != s32Ret)
            {
                printf("MI_VDEC_SendStream failed, s32Ret: 0x%x.\n", s32Ret);
                continue;
            }
        }while(!ShouldStop);
    
        return MI_SUCCESS;
    }
    

2.15. MI_VDEC_PauseChn

  • 功能

    暂停通道解码。

  • 语法

    MI_S32 MI_VDEC_PauseChn(MI_VDEC_DEV VdecDev, MI_VDEC_CHN VdecChn);
    
  • 形参

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

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

    • 头文件:mi_vdec.h、mi_common.h

    • 库文件:libmi_vdec.a

  • 注意

    • 调用该接口后,解码器停止解码;此时,上层可以继续调用MI_VDEC_SendStream接口送流,但是码流buffer满时,MI_VDEC_SendStream会返回错误码MI_ERR_VDEC_BUF_FULL。

    • 该接口可以重复调用,不会报错。

  • 举例

    MI_S32 PauseChn(void)
    {
        MI_S32 s32Ret = MI_ERR_VDEC_FAILED;
        MI_VDEC_DEV VdecDev  = 0;
        MI_VDEC_CHN VdecChn  = 0;
        MI_U32 u32RefreshCnt = 0;
    
        //While decoding...
    
        s32Ret = MI_VDEC_PauseChn(VdecDev, VdecChn);
        if (MI_SUCCESS != s32Ret)
        {
            printf("MI_VDEC_PauseChn failed, s32Ret: 0x%x.\n", s32Ret);
            return s32Ret;
        }
    
        //refresh 10 times
        while (u32RefreshCnt < 10)
        {
            s32Ret = MI_VDEC_RefreshChn(VdecDev, VdecChn);
            if(MI_SUCCESS != s32Ret)
            {
                printf("MI_VDEC_RefreshChn failed, s32Ret: 0x%x.\n", s32Ret);
                break;
            }
            u32RefreshCnt ++;
            usleep(100*1000);
        }
    
        s32Ret = MI_VDEC_ResumeChn(VdecDev, VdecChn);
        if (MI_SUCCESS != s32Ret)
        {
            printf("MI_VDEC_ResumeChn failed, s32Ret: 0x%x.\n", s32Ret);
            return s32Ret;
        }
        return MI_SUCCESS;
    }
    

2.16. MI_VDEC_RefreshChn

  • 功能

    刷新通道,再次解码当前帧。

  • 语法

    MI_S32 MI_VDEC_RefreshChn(MI_VDEC_DEV VdecDev, MI_VDEC_CHN VdecChn);
    
  • 形参

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

    返回值 描述
    MI_SUCCESS 成功。
    MI_ERR_VDEC_INVALID_DEVID 设备 ID 超出合法范围。
    MI_ERR_VDEC_INVALID_CHNID 通道 ID 超出合法范围。
    MI_ERR_VDEC_CHN_UNEXIST 通道未创建或者已销毁。
    MI_ERR_VDEC_CHN_NOT_START 通道未使能或者已禁用。
    MI_ERR_VDEC_NOT_DISABLE 通道未暂停。
    MI_ERR_VDEC_BUF_EMPTY 码流buffer为空。
    MI_ERR_VDEC_CHN_NO_CONTENT 码流buffer无有效数据。
    MI_ERR_VDEC_BUSY 解码器为BUSY状态,暂时不能refresh channel。
  • 依赖

    • 头文件:mi_vdec.h、mi_common.h

    • 库文件:libmi_vdec.a

  • 注意

    • 调用该接口时,需要保证已调用MI_VDEC_PauseChn停止解码,否则会报错误码MI_ERR_VDEC_NOT_DISABLE。

    • 每调用一次该接口,会触发解码器再次解码当前帧;可以多次调用,同时可以配合MI_VDEC_SetOutputPortAttr调整缩放倍数,以适应不同的场景需求。

    • 用户在调用该接口时,需要保证码流buffer中还有待解码的数据,否则不能完成refresh动作。

    • 用户连续多次调用该接口时,如果上一次的refresh或step task未完成,则接口会返回错误码MI_ERR_VDEC_BUSY。

  • 举例

    请参见MI_VDEC_PauseChn和MI_VDEC_StepChn的举例。

    实现暂停时电子放大与抓图功能,目前只有Tiramisu芯片支持此功能。

    常见应用场景举例:

    假设MI_DISP在预览模式下输出分辨率为1920x1080,4通道都为1080P的源码流同时解码预览时,每个通道输出分辨率设置为960x540输出显示。如果暂停解码,然后将通道2切换至全屏预览,MI_DISP会将960x540的图像拉伸至1920x1080全屏显示,此时图像数据会失真。此时可以通过调用MI_VDEC_RefreshChn获取到当前暂停的数据帧的1920x1080的图像进行无失真显示输出。

    通道要实现暂停电子放大功能,依赖于 MI_VDEC_PauseChn,MI_VDEC_RefreshChn,MI_VDEC_ResumeChn以及MI_VDEC_SendStream组合,目的是为相同的码流数据帧能获得不同分辨率的图像的功能,如下,图像3需要重复输出4次。

    API组合调用时序:

    1. 调用MI_VDEC_SendStream推送数据帧‘1’和‘2’的码流数据。

    2. 调用MI_VDEC_PauseChn暂停解码器,进入解码输出重复图像帧模式。

    3. 调用MI_VDEC_SendStream推送需要重复输出图像‘3’的码流数据到解码器。

    4. 重复调用MI_VDEC_RefreshChn,重复输出图像‘3’,每调用1次将输出1帧图像,调用次数无限制。当前示例调用4次。

    5. 调用MI_VDEC_ResumeChn退出重复解码相同图像帧模式。

    6. 调用MI_VDEC_SendStream推送数据帧‘4’和‘5’的码流数据。


2.17. MI_VDEC_ResumeChn

  • 功能

    恢复通道解码。

  • 语法

    MI_S32 MI_VDEC_ResumeChn(MI_VDEC_DEV VdecDev, MI_VDEC_CHN VdecChn);
    
  • 形参

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

    返回值 描述
    MI_SUCCESS 成功。
    MI_ERR_VDEC_INVALID_DEVID 设备 ID 超出合法范围。
    MI_ERR_VDEC_INVALID_CHNID 通道 ID 超出合法范围。
    MI_ERR_VDEC_CHN_UNEXIST 通道未创建或者已销毁。
    MI_ERR_VDEC_CHN_NOT_START 通道未使能或者已禁用。
    MI_ERR_VDEC_BUSY 解码器为BUSY状态,暂时不能resume channel。
    MI_ERR_VDEC_NOT_DISABLE 通道未暂停解码。
  • 依赖

    • 头文件:mi_vdec.h、mi_common.h

    • 库文件:libmi_vdec.a

  • 注意

    • 调用该接口时,需要保证已调用MI_VDEC_PauseChn停止解码,否则会报错误码MI_ERR_VDEC_NOT_DISABLE。

    • 调用该接口时,如果还有refresh或step task未完成,则接口会返回错误码MI_ERR_VDEC_BUSY。

  • 举例

    请参见MI_VDEC_PauseChn和MI_VDEC_StepChn的举例。


2.18. MI_VDEC_StepChn

  • 功能

    通道单帧解码。

  • 语法

    MI_S32 MI_VDEC_StepChn(MI_VDEC_DEV VdecDev, MI_VDEC_CHN VdecChn);
    
  • 形参

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

    返回值 描述
    MI_SUCCESS 成功。
    MI_ERR_VDEC_INVALID_DEVID 设备 ID 超出合法范围。
    MI_ERR_VDEC_INVALID_CHNID 通道 ID 超出合法范围。
    MI_ERR_VDEC_CHN_UNEXIST 通道未创建或者已销毁。
    MI_ERR_VDEC_CHN_NOT_START 通道未使能或者已禁用。
    MI_ERR_VDEC_BUF_EMPTY 码流buffer为空。
    MI_ERR_VDEC_CHN_NO_CONTENT 码流buffer无有效数据。
    MI_ERR_VDEC_BUSY 解码器为busy状态,暂时不能step channel。
  • 依赖

    • 头文件:mi_vdec.h、mi_common.h

    • 库文件:libmi_vdec.a

  • 注意

    • 每调用一次该接口,会触发解码器解码下一帧;可以多次调用,同时可以配合MI_VDEC_SetOutputPortAttr调整缩放倍数,以适应不同的场景需求。

    • 用户在调用该接口时,需要保证码流buffer中还有待解码的数据,否则不能完成step动作。

    • 用户连续多次调用该接口时,如果上一次的refresh或step task未完成,则接口会返回错误码MI_ERR_VDEC_BUSY。

  • 举例

    Case 1:

    MI_S32 StepChn(void)
    {
        MI_S32 s32Ret = MI_ERR_VDEC_FAILED;
        MI_VDEC_DEV VdecDev  = 0;
        MI_VDEC_CHN VdecChn  = 0;
    
        //While decoding...
    
        s32Ret = MI_VDEC_PauseChn(VdecDev, VdecChn);
        if (MI_SUCCESS != s32Ret)
        {
            printf("MI_VDEC_PauseChn failed, s32Ret: 0x%x.\n", s32Ret);
            return s32Ret;
        }
    
        /// 此处送流过程也可以用另起独立的线程调用MI_VDEC_SendStream 替代
        s32Ret = MI_VDEC_SendStream(VdecDev, VdecChn, &stVdecStream, 0);
        if(MI_SUCCESS != s32Ret)
        {
            printf("MI_VDEC_ SendStream failed, s32Ret: 0x%x.\n", s32Ret);
            return s32Ret;
        }
    
        s32Ret = MI_VDEC_StepChn(VdecDev, VdecChn);
        if(MI_SUCCESS != s32Ret)
        {
            printf("MI_VDEC_StepChn failed, s32Ret: 0x%x.\n", s32Ret);
            return s32Ret;
        }
        usleep(20*1000);
    
        s32Ret = MI_VDEC_ResumeChn(VdecDev, VdecChn);
        if (MI_SUCCESS != s32Ret)
        {
            printf("MI_VDEC_ResumeChn failed, s32Ret: 0x%x.\n", s32Ret);
            return s32Ret;
        }
        return MI_SUCCESS;
    }
    

    Case 2:

    MI_S32 refresh_and_step_chn(void)
    {
        MI_S32 s32Ret = MI_ERR_VDEC_FAILED;
        MI_VDEC_DEV VdecDev  = 0;
    MI_VDEC_CHN VdecChn  = 0;
    MI_U32 u32LoopCnt = 0;
    
        //While decoding...
    
        s32Ret = MI_VDEC_PauseChn(VdecDev, VdecChn);
        if (MI_SUCCESS != s32Ret)
        {
            printf("MI_VDEC_PauseChn failed, s32Ret: 0x%x.\n", s32Ret);
            return s32Ret;
        }
    
        /// 此处送流过程也可以用另起独立的线程调用MI_VDEC_SendStream 替代
        s32Ret = MI_VDEC_SendStream(VdecDev, VdecChn, &stVdecStream, 0);
        if(MI_SUCCESS != s32Ret)
        {
            printf("MI_VDEC_ SendStream failed, s32Ret: 0x%x.\n", s32Ret);
            return s32Ret;
        }
    
        /*Loop 10 times*/
        While(u32LoopCnt < 10)
    {
        s32Ret = MI_VDEC_RefreshChn(VdecDev, VdecChn);
            if(MI_SUCCESS != s32Ret)
            {
                printf("MI_VDEC_RefreshChn failed, s32Ret: 0x%x.\n", s32Ret);
                return s32Ret;
            }
            usleep(20*1000);
    
            /// 此处送流过程也可以用另起独立的线程调用MI_VDEC_SendStream 替代
            s32Ret = MI_VDEC_SendStream(VdecDev, VdecChn, &stVdecStream, 0);
            if(MI_SUCCESS != s32Ret)
            {
                printf("MI_VDEC_ SendStream failed, s32Ret: 0x%x.\n", s32Ret);
                return s32Ret;
            }
    
            s32Ret = MI_VDEC_StepChn(VdecDev, VdecChn);
            if(MI_SUCCESS != s32Ret)
            {
                printf("MI_VDEC_StepChn failed, s32Ret: 0x%x.\n", s32Ret);
                return s32Ret;
            }
            usleep(20*1000);
            u32LoopCnt ++;
        }
    
        s32Ret = MI_VDEC_ResumeChn(VdecDev, VdecChn);
        if (MI_SUCCESS != s32Ret)
        {
            printf("MI_VDEC_ResumeChn failed, s32Ret: 0x%x.\n", s32Ret);
            return s32Ret;
        }
        return MI_SUCCESS;
    }
    

2.19. MI_VDEC_GetUserData

  • 功能

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

  • 语法

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

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

    返回值 描述
    MI_SUCCESS 成功。
    MI_ERR_VDEC_INVALID_DEVID 设备 ID 超出合法范围。
    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、mi_common.h

    • 库文件:libmi_vdec.a

  • 注意

    该接口暂不支持。


2.20. MI_VDEC_ReleaseUserData

  • 功能

    释放用户数据。

  • 语法

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

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

    返回值 描述
    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、mi_common.h

    • 库文件:libmi_vdec.a

  • 注意

    该接口暂不支持。


2.21. MI_VDEC_SetDisplayMode

  • 功能

    设置显示模式。

  • 语法

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

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

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

    • 头文件:mi_vdec.h、mi_common.h

    • 库文件:libmi_vdec.a

  • 举例

    请参见MI_VDEC_CreateChn 的举例。


2.22. MI_VDEC_GetDisplayMode

  • 功能

    获取显示模式。

  • 语法

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

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

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

    • 头文件:mi_vdec.h、mi_common.h

    • 库文件:libmi_vdec.a


2.23. MI_VDEC_SetOutputPortAttr

  • 功能

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

  • 语法

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

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

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

    • 头文件:mi_vdec.h、mi_common.h

    • 库文件:libmi_vdec.a

  • 注意

    • 若通道未创建,则返回错误码MI_ERR_VDEC_CHN_UNEXIST
    • 缩放范围[⅛, 1]。
    • 不支持放大。
    • 若裁剪和缩放同时开启,则缩放宽和高不能大于裁剪的宽和高。
  • 举例

    请参见MI_VDEC_CreateChn 的举例。


2.24. MI_VDEC_GetOutputPortAttr

  • 功能

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

  • 语法

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

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

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

    • 头文件:mi_vdec.h、mi_common.h

    • 库文件:libmi_vdec.a

  • 注意

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

2.25. MI_VDEC_SetOutputPortLayoutMode

  • 功能

    设置输出端口Buffer模式。

  • 语法

    MI_S32 MI_VDEC_SetOutputPortLayoutMode(MI_VDEC_DEV VdecDev, MI_VDEC_OutbufLayoutMode_e eBufTileMode);
    
  • 形参

    参数名称 描述 输入/输出
    VdecDev 解码设备号。取值范围:[0, MI_VDEC_MAX_DEV_NUM)。 输入
    eBufTileMode 输出Buffer模式,数据类型:MI_VDEC_OutbufLayoutMode_e 输入
  • 返回值

    返回值 描述
    MI_SUCCESS 成功。
    MI_ERR_VDEC_FAILED 失败。
    MI_ERR_VDEC_INVALID_DEVID 设备 ID 超出合法范围。
    MI_ERR_VDEC_NOT_INIT 设备未初始化。
    MI_ERR_VDEC_ILLEGAL_PARAM 非法参数。
  • 依赖

    • 头文件:mi_vdec.h、mi_common.h

    • 库文件:libmi_vdec.a

  • 注意

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

    MI_S32 StartVdec(void)
    {
    MI_S32 s32Ret = MI_ERR_VDEC_FAILED;
    MI_VDEC_DEV VdecDev = 0;
        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(VdecDev, 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;
    
        s32Ret = MI_VDEC_CreateChn(VdecDev, VdecChn, &stChnAttr);
        if(MI_SUCCESS != s32Ret)
        {
            printf("MI_VDEC_CreateChn failed, s32Ret: 0x%x.\n", s32Ret);
            return s32Ret;
        }
    
        return MI_SUCCESS;
    }
    

2.26. MI_VDEC_GetOutputPortLayoutMode

  • 功能

    获取输出端口Buffer模式。

  • 语法

    MI_S32 MI_VDEC_GetOutputPortLayoutMode(MI_VDEC_DEV VdecDev, MI_VDEC_OutbufLayoutMode_e *peBufTileMode);
    
  • 形参

    参数名称 描述 输入/输出
    VdecDev 解码设备号。取值范围:[0, MI_VDEC_MAX_DEV_NUM)。 输入
    eBufTileMode 输出Buffer模式,数据类型:MI_VDEC_OutbufLayoutMode_e 输入
  • 返回值

    返回值 描述
    MI_SUCCESS 成功。
    MI_ERR_VDEC_INVALID_DEVID 设备 ID 超出合法范围。
    MI_ERR_VDEC_NOT_INIT 设备未初始化。
    MI_ERR_VDEC_NULL_PTR 输入参数空指针
  • 依赖

    • 头文件:mi_vdec.h、mi_common.h

    • 库文件:libmi_vdec.a

  • 注意

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

2.27. MI_VDEC_SetDestCrop

  • 功能

    设置解码通道裁剪属性。

  • 语法

    MI_S32 MI_VDEC_SetDestCrop(MI_VDEC_DEV VdecDev, MI_VDEC_CHN VdecChn, MI_VDEC_CropCfg_t *pstCropCfg);
    
  • 形参

    参数名称 描述 输入/输出
    VdecDev 解码设备号。取值范围:[0, MI_VDEC_MAX_DEV_NUM)。 输入
    VdecChn 解码通道号。
    取值范围:[0, MI_VDEC_MAX_CHN_NUM)。
    输入
    pstCropCfg 解码通道裁剪属性指针,数据类型: MI_VDEC_CropCfg_t。 输入
  • 返回值

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

    • 头文件:mi_vdec.h、mi_common.h

    • 库文件:libmi_vdec.a

  • 注意

    • 裁剪设置的坐标X和宽需要按16对齐,坐标Y和高需要按2对齐;

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

    • 若裁剪和缩放同时开启,则裁剪宽和高不能大于缩放的宽和高。

  • 举例

    请参见MI_VDEC_CreateChn的举例。


2.28. MI_VDEC_GetDestCrop

  • 功能

    获取解码通道裁剪属性。

  • 语法

    MI_S32 MI_VDEC_GetDestCrop(MI_VDEC_DEV VdecDev, MI_VDEC_CHN VdecChn, MI_VDEC_CropCfg_t *pstCropCfg)
    
  • 形参

    参数名称 描述 输入/输出
    VdecDev 解码设备号。取值范围:[0, MI_VDEC_MAX_DEV_NUM)。 输入
    VdecChn 解码通道号。
    取值范围:[0, MI_VDEC_MAX_CHN_NUM)。
    输入
    pstCropCfg 解码通道裁剪属性指针,数据类型: MI_VDEC_CropCfg_t。 输出
  • 返回值

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

    • 头文件:mi_vdec.h、mi_common.h

    • 库文件:libmi_vdec.a

  • 注意

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

2.29. MI_VDEC_SetChnErrHandlePolicy

  • 功能

    设置解码通道错误宏块的数据帧的输出策略。

  • 语法

    MI_S32 MI_VDEC_SetChnErrHandlePolicy(MI_VDEC_DEV VdecDev, MI_VDEC_CHN VdecChn, MI_VDEC_ErrHandlePolicy_t *pstErrHandlePolicy)
    
  • 形参

    参数名称 描述 输入/输出
    VdecDev 解码设备号。取值范围:[0, MI_VDEC_MAX_DEV_NUM)。 输入
    VdecChn 解码通道号。 取值范围:[0, MI_VDEC_MAX_CHN_NUM)。 输入
    pstErrHandlePolicy 设置错误宏块的数据帧的输出策略,参考MI_VDEC_ErrHandlePolicy_t定义。 输入
  • 返回值

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

    • 头文件:mi_vdec.h、mi_common.h

    • 库文件:libmi_vdec.a

  • 注意

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


2.30. MI_VDEC_SetOutputPortAttrEx

  • 功能

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

  • 语法

    MI_S32 MI_VDEC_SetOutputPortAttrEx (MI_VDEC_DEV VdecDev, MI_VDEC_CHN VdecChn, 
    MI_U32 u32Port, MI_VDEC_OutputPortAttr_t *pstOutputPortAttr);
    
  • 形参

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

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

    • 头文件:mi_vdec.h、mi_common.h

    • 库文件:libmi_vdec.a

  • 注意

    • 若通道未创建,则返回错误码MI_ERR_VDEC_CHN_UNEXIST
    • 缩放范围[⅛, 1]。
    • 不支持放大。
    • 若裁剪和缩放同时开启,则缩放宽和高不能大于裁剪的宽和高。

2.31. MI_VDEC_GetOutputPortAttrEx

  • 功能

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

  • 语法

    MI_S32 MI_VDEC_GetOutputPortAttrEx(MI_VDEC_DEV VdecDev, MI_VDEC_CHN VdecChn, 
    MI_U32 u32Port, MI_VDEC_OutputPortAttr_t *pstOutputPortAttr);
    
  • 形参

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

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

    • 头文件:mi_vdec.h、mi_common.h

    • 库文件:libmi_vdec.a

  • 注意

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


2.32. MI_VDEC_SetDestCropEx

  • 功能

    设置解码通道裁剪属性。

  • 语法

    MI_S32 MI_VDEC_SetDestCropEx(MI_VDEC_DEV VdecDev, MI_VDEC_CHN VdecChn, 
    MI_U32 u32Port, MI_VDEC_CropCfg_t *pstCropCfg);
    
  • 形参

    参数名称 描述 输入**/****输出**
    VdecDev 解码设备号。
    取值范围:[0, MI_VDEC_MAX_DEV_NUM)。
    输入
    VdecChn 解码通道号。
    取值范围:[0, MI_VDEC_MAX_CHN_NUM)。
    输入
    u32Port 解码输出端口号。
    取值范围:[0, 2)。
    输入
    pstCropCfg 解码通道裁剪属性指针,数据类型:
    MI_VDEC_CropCfg_t
    输入
  • 返回值

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

    • 头文件:mi_vdec.h、mi_common.h

    • 库文件:libmi_vdec.a

  • 注意

    • 裁剪设置的坐标X和宽需要按16对齐,坐标Y和高需要按2对齐;

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

    • 若裁剪和缩放同时开启,则裁剪宽和高不能大于缩放的宽和高。


2.33. MI_VDEC_GetDestCropEx

  • 功能

    获取解码通道裁剪属性。

  • 语法

    MI_S32 MI_VDEC_GetDestCropEx(MI_VDEC_DEV VdecDev, MI_VDEC_CHN VdecChn, 
    MI_U32 u32Port, MI_VDEC_CropCfg_t *pstCropCfg)
    
  • 形参

    参数名称 描述 输入**/****输出**
    VdecDev 解码设备号。
    取值范围:[0, MI_VDEC_MAX_DEV_NUM)。
    输入
    VdecChn 解码通道号。
    取值范围:[0, MI_VDEC_MAX_CHN_NUM)。
    输入
    u32Port 解码输出端口号。
    取值范围:[0, 2)。
    输入
    pstCropCfg 解码通道裁剪属性指针,数据类型:
    MI_VDEC_CropCfg_t
    输出
  • 返回值

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

    • 头文件:mi_vdec.h、mi_common.h

    • 库文件:libmi_vdec.a

  • 注意

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


3. 数据类型


3.1. 数据类型定义

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

数据结构 说明
MI_VDEC_CodecType_e 定义解码类型
MI_VDEC_DPB_BufMode_e 定义Inplace内存模式
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 定义视频解码通道属性
MI_VDEC_ChnStat_t 定义通道状态结构体
MI_VDEC_ChnParam_t 定义解码通道参数结构体
MI_VDEC_VideoStream_t 定义推送码流结构体
MI_VDEC_UserData_t 定义用户数据结构体
MI_VDEC_OutputPortAttr_t 定义输出端口属性结构体
MI_VDEC_ErrHandlePolicy_t 控制有错误宏块的数据帧是否需要输出显示。
MI_VDEC_CropCfg_t 定义裁剪属性结构体体

3.2. 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;
    
  • 注意事项

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


3.3. MI_VDEC_DPB_BufMode_e

  • 说明

    定义DPB buffer模式。

  • 定义

    typedef enum
    
    {
    
        E_MI_VDEC_DPB_MODE_NORMAL=0,
    
        E_MI_VDEC_DPB_MODE_INPLACE_ONE_BUF=1,
    
        E_MI_VDEC_DPB_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_DPB_MODE_INPLACE_ONE_BUF Inplace one buffer模式。
    E_MI_VDEC_DPB_MODE_INPLACE_TWO_BUF Inplace two buffer模式

3.4. 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.5. 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.6. MI_VDEC_ErrCode_e

  • 说明

    定义码流发送方式。

  • 定义

    typedef enum
    {
        E_MI_VDEC_ERR_CODE_NONE = 0x0,
        E_MI_VDEC_ERR_CODE_UNKNOWN,
        E_MI_VDEC_ERR_CODE_MB_ERROR,
        E_MI_VDEC_ERR_CODE_REF_FRAME_ERROR,
        E_MI_VDEC_ERR_CODE_REF_FRAME_BUFF_NOT_ENOUGH,
        E_MI_VDEC_ERR_CODE_VCL_NOT_FOUND,
        E_MI_VDEC_ERR_CODE_OVER_PROFILE,
        E_MI_VDEC_ERR_CODE_OVER_LEVEL,
        E_MI_VDEC_ERR_CODE_OVER_MULTISLICE_NUM,
        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_NONE
    E_MI_VDEC_ERR_CODE_UNKNOW 未知错误。
    E_MI_VDEC_ERR_CODE_MB_ERROR 宏块错误
    E_MI_VDEC_ERR_CODE_REF_FRAME_ERROR 参考帧错误
    E_MI_VDEC_ERR_CODE_REF_FRAME_BUFF_NOT_ENOUGH 参考帧分配个数不够
    E_MI_VDEC_ERR_CODE_VCL_NOT_FOUND 无有效的图像数据
    E_MI_VDEC_ERR_CODE_OVER_PROFILE Profile不支持
    E_MI_VDEC_ERR_CODE_OVER_LEVEL Level不支持
    E_MI_VDEC_ERR_CODE_OVER_MULTISLICE_NUM 视频帧Slice个数超出限制
    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.7. 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.8. 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.9. 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.10. 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 预览模式。不参考PTS输出
    E_MI_DISPLAY_MODE_PLAYBACK 回放模式。参考PTS数值输出

3.11. 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模块输出buffer为TILE模式,其它场景输出buffer模式设置为LINEAR模式。

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

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

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


3.12. MI_VDEC_InitParam_t

  • 说明

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

  • 定义

    typedef struct MI_VDEC_InitParam_s
    {
        MI_U16 u16MaxWidth;
        MI_U16 u16MaxHeight;
    } MI_VDEC_InitParam_t;
    
  • 成员

    成员名称 描述
    u16MaxWidth 解码器支持的最大码流宽。参数类型: MI_U16
    u16MaxHeight 解码器支持的最大码流高。参数类型: MI_U16
  • 注意事项

    VDEC根据硬件性能,内部默认设置了一组最大分辨率。如果用户需要解码超出默认的最大分辨率(如:4Kx3K),则需要在此修改最大码流的宽和高,以便可以正常解码。超出默认分辨率,解码帧率相应下降。


3.13. 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.14. 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.15. MI_VDEC_VideoAttr_t

  • 说明

    定义视频解码通道属性。

  • 定义

    typedef struct MI_VDEC_VideoAttr_s
    {
        MI_U32 u32RefFrameNum;
        MI_VDEC_ErrHandlePolicy_t stErrHandlePolicy; 
        MI_BOOL bDisableLowLatency;
    }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的值小于当前解码所需的参考帧个数,则可能不解码或者解码花屏。
    • 若bDisableLowLatency设为TRUE,表示关闭低延时;这种情况适用于解码B帧,用于对B帧的输出帧做重排序,输出画面会有延时。另外,做重排序操作,也会增加内存使用量。
    • 如果用户的场景不涉及延时模式,则需要设置 bDisableLowLatency为FALSE。

3.16. 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.17. 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_DECODE 按解码顺序输出数制帧
    eVideoFormat 参考MI_VDEC_VideoFormat_e定义。
  • 注意事项

    暂不支持设置这些参数。


3.18. 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_VDEC_VideoStream_t;
    
  • 成员

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

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

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


3.19. 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 当前数据的有效标识。取值范围:{TRUE, FALSE}。
    TRUE:有效。
    FALSE:无效。
  • 注意事项

    暂不支持设置该参数。


3.20. 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 输出图像高
  • 注意事项

    • 缩放范围[⅛, 1]。

    • 不支持放大。


3.21. 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;值为TRUE时,使用客制化定义的u8ErrMBPercentThreshold数值。

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

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


3.22. MI_VDEC_CropCfg_t

  • 说明

    定义裁剪属性结构体。

  • 定义

    typedef struct MI_VDEC_CropCfg_s
    
    {
    
        MI_BOOL bEnable; /* Crop region enable */
    
        MI_SYS_WindowRect_t stRect; /* Crop region */
    
    } MI_VDEC_CropCfg_t;
    
  • 成员

    成员名称 描述
    bEnable 开启/关闭裁剪功能。
    stRect 裁剪属性。结构体MI_SYS_WindowRect_t参考mi_sys数据类型定义。
  • 注意事项

    • 取值范围:u16X:[0, 4096-16],u16Y:[0, 4096-2],u16Width:[16, 4096],u16Height:[2, 4096];
    • 对齐要求:u16X / u16Width需按16对齐,u16Y和u16Height需按2对齐。
    • 若裁剪和缩放同时开启,则裁剪宽和高不能小于缩放的宽和高。

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

  • 调试信息

    查看vdec device 0:

    # cat /proc/mi_modules/mi_vdec/mi_vdec0
    

    查看vdec device 1:

    # cat /proc/mi_modules/mi_vdec/mi_vdec1
    

  • 调试信息分析

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

  • 参数说明

    参数 描述
    DEV Info DevID 硬件设备号。
    UUID UUID号。
    MaxChnNum 最大支持通道个数。
    TotEnqCnt 解码硬件队列排队帧数。
    CHN ATTR Info DevID  硬件设备号。
    ChnID 通道号。
    CodecType  解码协议类型
    0:H264;
    1:H265;
    Width  解码图像最大宽度。
    Height   解码图像最大高度。
    BufSize  VDEC码流buffer大小,单位:byte。
    VideoMode  发送码流方式。 FRAME:按帧发送。
    DpbBufMode  解码模式
    INPLACE1:DBP_MODE_INPLACE_ONE_BUF;
    INPLACE2:DBP_MODE_INPLACE_TWO_BUF;
    NORMAL: DBP_MODE_NORMAL;
    RefFrmNum 最大分配参考帧个数。
    CHN PARAM Info DevID  硬件设备号。
    ChnID  通道号。
    bCusPolicy 是否由客户设置丢帧策略
    Y:客户设置;
    N:客户不设置,使用默认;
    ErrMBDropThrd 丢帧策略生效时,错误宏块占整张数据帧的比率。
    DisplayMode 显示模式。
    PREVIEW:  预览模式
    PLAYBACK: 回放模式
    bDisableLowLatency 通道是否支持B帧播放。
    0:不支持B帧播放。
    1:支持B帧播放。
    Scale & Crop Info DevID 硬件设备号。
    ChnID  通道号。
    bScale 是否设置缩小功能。
    N: 不设置,源码流大小输出。
    Y: 设置。
    ScaleW 设置缩小输出的宽度。
    ScaleH 设置缩小输出的高度。
    bCrop 是否设置裁剪功能。
    N: 不设置。
    Y: 设置。
    CropX 裁剪源图开始的X坐标。
    CropY 裁剪源图开始的Y坐标。
    CropW 裁剪源图的宽度。
    CropH 裁剪源图的高度。
    Decode Frame Info DevID 硬件设备号。
    ChnID  通道号。
    DecW 源码流宽度。
    DecH 源码流高度。
    DispW 输出数据帧的宽度。
    DispH 输出数据帧的高度。
    RefRecFrmCnt 当前源码流解码所需要分配参考帧个数。
    linearFrmCnt Output Buffer分配的个数。
    Output Frame Info DevID 硬件设备号。
    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 DevID 硬件设备号。
    ChnID  通道号。
    bStart  解码器是否启动。
    Y: 启动,进入解码状态。
    N: 停止解码状态。
    DecState 当前通道解码状态。
    0:未定义。
    1:通道刚创建。
    2:等待sps,pps等关键数据帧。
    3:获取关键sps, pps信息完成状态。
    4:解码前申请参考帧等内存状态。
    5:申请到解码所需内存,正常解码状态。
    6:通道关闭状态。
    SendCnt 应用层推流次数。
    SendStrmSize 应用层推流字节数。
    LeftStrmBytes  码流buffer中待解码的byte数。
    LeftCnt     相应于SendCnt参数,待解码的次数。
    DecFrmCnt 成功解码输出的帧数。
    fps 当前解码帧率。
    CHN STATE DevID 硬件设备号。
    ChnID  通道号。
    Start 开始解码次数。
    Get 获取解码结果的次数。
    GetOK 成功获取到解码结果的次数。
    Done 成功解码并输出显示的次数。
    Drop 丢弃不输出显示的次数。
    DropNoVCL 丢弃无效数据帧的次数。
    Run 申请硬件解码次数。
    SeqChange 图像序列发生变化的次数。例如: SPS。
    CHN STATE DevID 硬件设备号。
    ChnID 通道号。
    Issue 请求解码器解释码流头信息的次数。
    Complete 解码器完成解释码流头信息的次数,对应Issue请求。
    InitSeq 解码器完成解释码流头信息后,对应Issue请求,返回中断次数。
    VlcInsuff VLC Buffer不足的中断次数。
    FrmDone 解码器返回解码成功的中断的次数。
    ChkInitSeq 对应InitSeq,解码器返回完成解释码流头信息成功中断后,对应VDEC检查中断并处理的次数。
    ChkFrmDone 对应FrmDone,解码器返回解码成功中断后,对应VDEC检查中断并处理的次数。
    RcvRstCB 接收到解码器请求Reset的中断的次数。
    ChkRstCB 对应RcvRstCB中断请求,VDEC处理解码器Resset请求的次数。
    ISR STATE IsrCnt 解码器上报中断的总次数。
    InitSeq 解码器上报解析码流头信息中断的次数。
    VlcInsuff 解码器上报VLC Buffer不足的中断次数。
    FrmDone 解码器上报解码完成的中断次数。
    UnderRun 解码器上报任务线程还未解码完成的次数。
    HwTimeout 解码器上报硬件解码超时的次数。
    Other 解码器上报硬件其他中断次数。


5.2. echo

vdec device 0:

/proc/mi_modules/mi_vdec/mi_vdec0

vdec device 1:

/proc/mi_modules/mi_vdec/mi_vdec1
功能 打开抓图或静帧功能的debug log相关信息到/proc/kmsg
命令 echo log [capture/refresh] [on/off] > /proc/mi_modules/mi_vdec/mi_vdec0
参数说明 capture/refresh:capture抓图,refresh 静帧
on/off:on打开,off 关闭
举例 echo log refresh on > /proc/mi_modules/mi_vdec/mi_vdec0
打开静帧功能的debug log相关信息到/proc/kmsg
功能 将指定通道的bitstream buffer数据存储到指定路径
命令 echo dumpbs [chn] [path] > /proc/mi_modules/mi_vdec/mi_vdec0
参数说明 chn:通道号 [0~63]
path:dump文件输出路径,输入off代表停止存储码流。
举例 echo dumpbs 3 /mnt/dump/ > /proc/mi_modules/mi_vdec/mi_vdec0
dump通道3的应用推送到bitstream buffer的码流数据到/mnt/dump目录下
功能 将指定通道解码后的输出数据帧存储指定路径
命令 echo dumpfb [chn] [path] [frmcnt] [bDumpAll] [bDetile] > /proc/mi_modules/mi_vdec/mi_vdec0
参数说明 chn:通道号 [0~63]
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格式数据)。
举例 通道3,存储路径为/mnt/dump/,存储99帧,不单独保存Y buffer和UV buffer,对将要存储的YUV做detile
echo dumpfb 3 /mnt/dump/ 99 0 1 > /proc/mi_modules/mi_vdec/mi_vdec0
功能 打开/关闭丢帧开关,丢弃所有的解码输出数据帧,不传送解码后端。
命令 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