8.3. API参考

该功能模块为用户提供以下API:

8.3.1. CVI_VDEC_CreateChn

【描述】

创建视频解码通道。

【语法】

CVI_S32 CVI_VDEC_CreateChn(VDEC_CHN VdChn, const VDEC_CHN_ATTR_S *pstAttr);

【参数】

参数名称

描述

输入/输出

VdChn

视频解码通道号。

输入

pstAttr

解码通道属性指针。

输入

【返回值】

返回值

描述

0

成功

非 0

失败,其值为 错误码

【需求】

  • 头文件:cvi_vdec.h,cvi_comm_video.h,cvi_comm_vdec.h

  • 库文件:ibvdec.so/libvdec.a

【注意】

  • CV181x VDEC模块支持T_JPEG/PT_MJPEG/PT_H264,CV180X支持PT_JPEG/PT_MJPEG。

  • 系统内存不足时会返回 CVII_ERR_VDEC_NOMEM 的错误码。

  • 使用JPEG/MJPEG时要在创建解码信道之前要先创建专属于 VDEC 的模 块 VB 池,不同协议解码所需的图像 VB 块大小不同,可参考 sample_vdec_lib.c 内的vdecInitVBPool函式。

【举例】

CVI_S32 SAMPLE_COMM_VDEC_Start(vdecChnCtx *pvdchnCtx)
{
  //设定VDEC 相关参数
  VDEC_CHN_ATTR_S stChnAttr, *pstChnAttr = &stChnAttr;
  VDEC_CHN VdecChn = pvdchnCtx->VdecChn;
  SAMPLE_VDEC_ATTR *psvdattr = &pvdchnCtx->stSampleVdecAttr;
  VDEC_CHN_PARAM_S stChnParam;

  pstChnAttr->enType = psvdattr->enType;
  pstChnAttr->enMode = psvdattr->enMode;
  pstChnAttr->u32PicWidth = psvdattr->u32Width;
  pstChnAttr->u32PicHeight = psvdattr->u32Height;
  pstChnAttr->u32StreamBufSize = psvdattr->u32Width * psvdattr->u32Height;
  pstChnAttr->u32FrameBufCnt = psvdattr->u32FrameBufCnt;

  //JPEG, MJPEG 需要设定VB buffer
  if (psvdattr->enType == PT_JPEG || psvdattr->enType == PT_MJPEG) {
    pstChnAttr->enMode = VIDEO_MODE_FRAME;
    pstChnAttr->u32FrameBufSize = VDEC_GetPicBufferSize(
        pstChnAttr->enType, psvdattr->u32Width, psvdattr->u32Height,
        psvdattr->stSapmleVdecPicture.enPixelFormat, DATA_BITWIDTH_8, 0);
  }
  //创建VDEC通道
  CHECK_CHN_RET(CVI_VDEC_CreateChn(VdecChn, pstChnAttr), VdecChn,
                                          "CVI_VDEC_CreateChn");
  //确认目前default 参数
  CHECK_CHN_RET(CVI_VDEC_GetChnParam(VdecChn, &stChnParam), VdecChn,
                                      "CVI_VDEC_GetChnParam");

  if (psvdattr->enType == PT_H264 || psvdattr->enType == PT_H265) {
  } else {
    stChnParam.stVdecPictureParam.enPixelFormat =
      psvdattr->stSapmleVdecPicture.enPixelFormat;
    stChnParam.stVdecPictureParam.u32Alpha =
      psvdattr->stSapmleVdecPicture.u32Alpha;
  }
  //设定display frame..等参数
  stChnParam.u32DisplayFrameNum = psvdattr->u32DisplayFrameNum;
  //设定VDEC 参数
  CHECK_CHN_RET(CVI_VDEC_SetChnParam(VdecChn, &stChnParam), VdecChn,
                                    "CVI_MPI_VDEC_GetChnParam");
  //Enable VDEC frame 传输
  CHECK_CHN_RET(CVI_VDEC_StartRecvStream(VdecChn), VdecChn,
                              "CVI_MPI_VDEC_StartRecvStream");
  return CVI_SUCCESS;
}

【相关主题】

CVI_VDEC_DestroyChn

8.3.2. CVI_VDEC_DestroyChn

【描述】

销毁视频解码通道。

【语法】

CVI_S32 CVI_VDEC_DestroyChn(VDEC_CHN VdChn);

【参数】

参数名称

描述

输入/输出

VdChn

视频解码通道号。

输入

【返回值】

返回值

描述

0

成功

非 0

失败,其值为 错误码

【需求】

  • 头文件:cvi_vdec.h,cvi_comm_video.h,cvi_comm_vdec.h

  • 库文件:ibvdec.so/libvdec.a

【注意】

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

  • 销毁前必须停止接收码流(或者尚未开始接收码流),否则返回错误。

【举例】

  • 无。

【相关主题】

CVI_VDEC_CreateChn

8.3.3. CVI_VDEC_ResetChn

【描述】

复位通道。

【语法】

CVI_S32 CVI_VDEC_ResetChn(VDEC_CHN VdChn);

【参数】

参数名称

描述

输入/输出

VdChn

通道号。

输入

【返回值】

返回值

描述

0

成功

非 0

失败,其值为 错误码

【需求】

  • 头文件:cvi_vdec.h,cvi_comm_video.h,cvi_comm_vdec.h

  • 库文件:ibvdec.so/libvdec.a

【注意】

  • Reset 并不存在的通道,返回失败CVI_FAILURE。

  • 如果一个通道没有停止接收码流而 reset 通道,则返回失败。

【举例】

  • 无。

8.3.4. CVI_VDEC_GetChnAttr

【描述】

获取视频解码通道属性。

【语法】

CVI_S32 CVI_VDEC_GetChnAttr(VDEC_CHN VdChn, VDEC_CHN_ATTR_S *pstAttr);

【参数】

参数名称

描述

输入/输出

VdChn

视频解码通道号。

输入

pstAttr

解码通道属性指针。

输出

【返回值】

返回值

描述

0

成功

非 0

失败,其值为 错误码

【需求】

  • 头文件:cvi_vdec.h,cvi_comm_video.h,cvi_comm_vdec.h

  • 库文件:ibvdec.so/libvdec.a

【注意】

  • VDEC 通道必须已经创建。

  • 此函式通常在 CVI_VDEC_SetChnAttr 前使用,或是在获取decoder frame之前呼叫,以确认通道正常。

【举例】

可参阅 sample_common_vdec.c 内的SAMPLE_COMM_VDEC_GetPic函式。

CVI_VOID *SAMPLE_COMM_VDEC_GetPic(CVI_VOID *pArgs)
{
  VDEC_THREAD_PARAM_S *pstVdecThreadParam = (VDEC_THREAD_PARAM_S *)pArgs;
  FILE *fp = CVI_NULL;
  CVI_S32 s32Ret, s32Cnt = 0;
  VDEC_CHN_ATTR_S stAttr;
  VIDEO_FRAME_INFO_S stVFrame;
  CVI_CHAR cSaveFile[256];
  prctl(PR_SET_NAME, "VdecGetPic", 0, 0, 0);
  s32Ret = CVI_VDEC_GetChnAttr(pstVdecThreadParam->s32ChnId, &stAttr);
  if (s32Ret != CVI_SUCCESS) {
    CVI_VDEC_ERR("chn %d get chn attr fail for %#x!\n",
        pstVdecThreadParam->s32ChnId,
        s32Ret);
    return (CVI_VOID *)(CVI_FAILURE);
  }

  if (stAttr.enType != PT_JPEG && stAttr.enType != PT_H264 && stAttr.enType != PT_H265) {
    CVI_VDEC_ERR("chn %d enType %d do not support save file!\n",
        pstVdecThreadParam->s32ChnId,
        stAttr.enType);
    return (CVI_VOID *)(CVI_FAILURE);
  }

  while (1) {
    if (pstVdecThreadParam->eThreadCtrl == THREAD_CTRL_STOP)
      break;

    s32Ret = CVI_VDEC_GetFrame(
        pstVdecThreadParam->s32ChnId,
        &stVFrame,
        pstVdecThreadParam->s32MilliSec);
    CVI_VDEC_TRACE("leave CVI_VDEC_GetFrame %d\n", s32Ret);
    ...
    ...
    }
}

【相关主题】

CVI_VDEC_SetChnAttr

8.3.5. CVI_VDEC_SetChnAttr

【描述】

设置视频解码通道属性。

【语法】

CVI_S32 CVI_VDEC_SetChnAttr(VDEC_CHN VdChn, const VDEC_CHN_ATTR_S *pstAttr);

【参数】

参数名称

描述

输入/输出

VdChn

视频解码通道号。

输入

pstAttr

解码通道属性指针。

输入

【返回值】

返回值

描述

0

成功

非 0

失败,其值为 错误码

【需求】

  • 头文件:cvi_vdec.h,cvi_comm_video.h,cvi_comm_vdec.h

  • 库文件:ibvdec.so/libvdec.a

【注意】

  • VDEC 通道必须已经创建。

  • 切换通道属性之前必须先停止接收码流,否则返回错误。

【举例】

  • 无。

【相关主题】

CVI_VDEC_GetChnAttr

8.3.6. CVI_VDEC_StartRecvStream

【描述】

解码器开始接收用户发送的码流。

【语法】

CVI_S32 CVI_VDEC_StartRecvStream(VDEC_CHN VdChn);

【参数】

参数名称

描述

输入/输出

VdChn

视频解码通道号。

输入

【返回值】

返回值

描述

0

成功

非 0

失败,其值为 错误码

【需求】

  • 头文件:cvi_vdec.h,cvi_comm_video.h,cvi_comm_vdec.h

  • 库文件:ibvdec.so/libvdec.a

【注意】

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

【举例】

请参见 CVI_VDEC_CreateChn 举例

【相关主题】

CVI_VDEC_CreateChn

8.3.7. CVI_VDEC_StopRecvStream

【描述】

解码器停止接收用户发送的码流。

【语法】

CVI_S32 CVI_VDEC_StopRecvStream(VDEC_CHN VdChn);

【参数】

参数名称

描述

输入/输出

VdChn

视频解码通道号。

输入

【返回值】

返回值

描述

0

成功

非 0

失败,其值为 错误码

【需求】

  • 头文件:cvi_vdec.h,cvi_comm_video.h,cvi_comm_vdec.h

  • 库文件:ibvdec.so/libvdec.a

【注意】

【举例】

请参见 sample_common_vdec.c 内SAMPLE_COMM_VDEC_Stop:

CVI_S32 SAMPLE_COMM_VDEC_Stop(CVI_S32 s32ChnNum)
{
  CVI_S32 i;
  for (i = 0; i < s32ChnNum; i++) {
    CHECK_CHN_RET(CVI_VDEC_DestroyChn(i), i, "CVI_MPI_VDEC_DestroyChn");
    CHECK_CHN_RET(CVI_VDEC_StopRecvStream(i), i, "CVI_MPI_VDEC_StopRecvStream");
  }

  return CVI_SUCCESS;
}

【相关主题】

  • 无。

8.3.8. CVI_VDEC_QueryStatus

【描述】

查询解码通道状态。

【语法】

CVI_S32 CVI_VDEC_QueryStatus(VDEC_CHN VdChn, VDEC_CHN_STATUS_S *pstStatus);

【参数】

参数名称

描述

输入/输出

VdChn

视频解码通道号。

输入

pstStatus

视频解码通道状态结构体指针

输出

【返回值】

返回值

描述

0

成功

非 0

失败,其值为 错误码

【需求】

  • 头文件:cvi_vdec.h,cvi_comm_video.h,cvi_comm_vdec.h

  • 库文件:ibvdec.so/libvdec.a

【注意】

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

【举例】

  • 可参阅 sample_common_vdec.c 内之SAMPLE_COMM_VDEC_CmdCtrl用法。

  • CVI_VDEC_QueryStatus 让用户可以查询以下信息:

    • enType:解碼格式。

    • bStartRecvStream:是否已经开始传送frame给予译码器。

    • u32DecodeStreamFrames:已解碼frame数。

    • u32LeftPics:剩余影像张数。

    • stVdecDecErr:译码器错误状态(s32FormatErr:格式错误码,s32PicSizeErrSet:影像大小错误,s32StreamUnsprt:不支援码流格式…)。

【相关主题】

  • 无。

8.3.9. CVI_VDEC_SetChnParam

【描述】

设置解码通道参数。

【语法】

CVI_S32 CVI_VDEC_SetChnParam(VDEC_CHN VdChn, const VDEC_CHN_PARAM_S *pstParam);

【参数】

参数名称

描述

输入/输出

VdChn

视频解码通道号。

输入

pstParam

通道参数。

输入

【返回值】

返回值

描述

0

成功

非 0

失败,其值为 错误码

【需求】

  • 头文件:cvi_vdec.h,cvi_comm_video.h,cvi_comm_vdec.h

  • 库文件:ibvdec.so/libvdec.a

【注意】

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

【举例】

参阅 sample_common_vdec.c 内SAMPLE_COMM_VDEC_Start函式:

CVI_S32 SAMPLE_COMM_VDEC_Start(vdecChnCtx *pvdchnCtx)
{
  VDEC_CHN_ATTR_S stChnAttr, *pstChnAttr = &stChnAttr;
  VDEC_CHN VdecChn = pvdchnCtx->VdecChn;
  SAMPLE_VDEC_ATTR *psvdattr = &pvdchnCtx->stSampleVdecAttr;
  VDEC_CHN_PARAM_S stChnParam;

  pstChnAttr->enType = psvdattr->enType;
  pstChnAttr->enMode = psvdattr->enMode;
  pstChnAttr->u32PicWidth = psvdattr->u32Width;
  pstChnAttr->u32PicHeight = psvdattr->u32Height;
  pstChnAttr->u32StreamBufSize = psvdattr->u32Width * psvdattr->u32Height;
  pstChnAttr->u32FrameBufCnt = psvdattr->u32FrameBufCnt;

  if (psvdattr->enType == PT_JPEG || psvdattr->enType == PT_MJPEG) {
    pstChnAttr->enMode = VIDEO_MODE_FRAME;
    pstChnAttr->u32FrameBufSize = VDEC_GetPicBufferSize(
        pstChnAttr->enType, psvdattr->u32Width, psvdattr->u32Height,
        psvdattr->stSapmleVdecPicture.enPixelFormat, DATA_BITWIDTH_8, 0);
  }

  CHECK_CHN_RET(CVI_VDEC_CreateChn(VdecChn, pstChnAttr), VdecChn, "CVI_VDEC_CreateChn");

  CHECK_CHN_RET(CVI_VDEC_GetChnParam(VdecChn, &stChnParam), VdecChn, "CVI_VDEC_GetChnParam");

  if (psvdattr->enType == PT_H264 || psvdattr->enType == PT_H265) {
  } else {
    stChnParam.stVdecPictureParam.enPixelFormat =
      psvdattr->stSapmleVdecPicture.enPixelFormat;
    stChnParam.stVdecPictureParam.u32Alpha =
      psvdattr->stSapmleVdecPicture.u32Alpha;
  }
  stChnParam.u32DisplayFrameNum = psvdattr->u32DisplayFrameNum;

  CHECK_CHN_RET(CVI_VDEC_SetChnParam(VdecChn, &stChnParam), VdecChn, "CVI_MPI_VDEC_GetChnParam");

  CHECK_CHN_RET(CVI_VDEC_StartRecvStream(VdecChn), VdecChn, "CVI_MPI_VDEC_StartRecvStream");
  return CVI_SUCCESS;
}

【相关主题】

  • 无。

8.3.10. CVI_VDEC_GetChnParam

【描述】

获取解码通道参数。

【语法】

CVI_S32 CVI_VDEC_GetChnParam(VDEC_CHN VdChn, VDEC_CHN_PARAM_S *pstParam);

【参数】

参数名称

描述

输入/输出

VdChn

视频解码通道号。

输入

pstParam

通道参数。

输出

【返回值】

返回值

描述

0

成功

非 0

失败,其值为 错误码

【需求】

  • 头文件:cvi_vdec.h,cvi_comm_video.h,cvi_comm_vdec.h

  • 库文件:ibvdec.so/libvdec.a

【注意】

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

【举例】

可参阅 sample_common_vdec.c 内的SAMPLE_COMM_VDEC_Start函式。

【相关主题】

CVI_VDEC_SetChnParam

8.3.11. CVI_VDEC_SendStream

【描述】

发送码流数据至视频解码通道。

【语法】

CVI_S32 CVI_VDEC_SendStream(VDEC_CHN VdChn, const VDEC_STREAM_S *pstStream, CVI_S32 s32MilliSec);

【参数】

参数名称

描述

输入/输出

VdChn

视频解码通道号。

输入

pstStream

解码码流数据指针。

输入

s32MilliSec

送码流方式标志。

取值范围:

-1:阻塞。

输入

【返回值】

返回值

描述

0

成功

非 0

失败,其值为 错误码

【需求】

  • 头文件:cvi_vdec.h,cvi_comm_video.h,cvi_comm_vdec.h

  • 库文件:ibvdec.so/libvdec.a

【注意】

  • 发送数据前必须保证已经调用 CVI_VDEC_CreateChnCVI_VDEC_StartRecvStream

  • 此接口在mjpeg,jpeg译码状态下,送入长度0(pstStream->u32Len)会返回CVI_SUCCESS;

  • 译码失败会回传错误码:ERR_CVI_VDEC_SEND_STREAM。

【举例】

请参阅 sample_common_vdec.c 内SAMPLE_COMM_VDEC_SendStream函式。

【相关主题】

  • 无。

8.3.12. CVI_VDEC_GetFrame

【描述】

获取视频解码通道的解码图像。

【语法】

CVI_S32 CVI_VDEC_GetFrame(VDEC_CHN VdChn, VIDEO_FRAME_INFO_S *pstFrameInfo, CVI_S32 s32MilliSec);

【参数】

参数名称

描述

输入/输出

VdChn

视频解码通道号。

输入

s32MilliSec

获取图像方式标志。
取值范围:
-1:阻塞。

输入

pstFrameInfo

获取的解码图像信息。

输出

【返回值】

返回值

描述

0

成功

非 0

失败,其值为 错误码

【需求】

  • 头文件:cvi_vdec.h,cvi_comm_video.h,cvi_comm_vdec.h

  • 库文件:ibvdec.so/libvdec.a

【注意】

  • 获取解码图像时必须保证通道已经被创建,否则返回错误。

【举例】

参阅 sample_common_vdec.c 内SAMPLE_COMM_VDEC_GetPic函式。

【相关主题】

无。

8.3.13. CVI_VDEC_ReleaseFrame

【描述】

释放视频解码通道的图像。

【语法】

CVI_S32 CVI_VDEC_ReleaseFrame(VDEC_CHN VdChn, const VIDEO_FRAME_INFO_S *pstFrameInfo);

【参数】

参数名称

描述

输入/输出

VdChn

视频解码通道号。

输入

pstFrameInfo

解码后的图像信息指针

输入

【返回值】

返回值

描述

0

成功

非 0

失败,其值为 错误码

【需求】

  • 头文件:cvi_vdec.h,cvi_comm_video.h,cvi_comm_vdec.h

  • 库文件:ibvdec.so/libvdec.a

【注意】

  • 此接口需与 CVI_VDEC_GetFrame 配对使用,获取的数据应当在使用完之后立 即释放,如果不及时释放,会导致解码过程阻塞等待资源。

  • 释放的数据必须是 CVI_VDEC_GetFrame 从该通道获取的数据,不得对数据信 息结构体进行任何修改。

  • 释放视频解码信道的图像必须在信道销毁前。

【举例】

无。

【相关主题】

无。

8.3.14. CVI_VDEC_SetModParam

【描述】

设置解码相关的模块参数。

【语法】

CVI_S32 CVI_VDEC_SetModParam(const VDEC_PARAM_MOD_S *pstModParam);

【参数】

参数名称

描述

输入/输出

pstModParam

解码模块参数指针。

输入

【返回值】

返回值

描述

0

成功

非 0

失败,其值为 错误码

【需求】

  • 头文件:cvi_vdec.h,cvi_comm_video.h,cvi_comm_vdec.h

  • 库文件:ibvdec.so/libvdec.a

【注意】

  • 此接口可以在通道创建前后呼叫。

  • 此接口主要用于设置对应解码VB pool获取方式,用户可透过结构体 VDEC_PARAM_MOD_S 内的 VB_SOURCE_E 类型变量设定VB mode。

【举例】

  • 无。

8.3.15. CVI_VDEC_GetModParam

【描述】

获取解码相关的模块参数。

【语法】

CVI_S32 CVI_VDEC_GetModParam(VDEC_PARAM_MOD_S *pstModParam);

【参数】

参数名称

描述

输入/输出

pstModParam

解码模块参数指针。

输出

【返回值】

返回值

描述

0

成功

非 0

失败,其值为 错误码

【需求】

  • 头文件:cvi_vdec.h,cvi_comm_video.h,cvi_comm_vdec.h

  • 库文件:ibvdec.so/libvdec.a

【注意】

【举例】

  • 无。

8.3.16. CVI_VDEC_AttachVbPool

【描述】

将解码通道绑定到某个视频缓存 VB 池中。

【语法】

CVI_S32 CVI_VDEC_AttachVbPool(VDEC_CHN VdChn, const VDEC_CHN_POOL_S *pstPool);

【参数】

参数名称

描述

输入/输出

VdChn

通道号。

输入

pstPool

视频缓存VB 池的 Id 号

输入

【返回值】

返回值

描述

0

成功

非 0

失败,其值为 错误码

【需求】

  • 头文件:cvi_vdec.h,cvi_comm_video.h,cvi_comm_vdec.h

  • 库文件:ibvdec.so/libvdec.a

【注意】

  • 必须保证通道已创建,否则会返回CVI_FAILURE的错误码。

  • 用户必须调用接口 CVI_VB_CreatePool 创建一个视频缓存 VB 池,再通过调用 接口 CVI_VDEC_AttachVbPool 把当前编码通道绑定到固定 PoolId 的 VB 池 中。可以把多个编码通道绑定到同一个 VB 池中,但是不能把同一个编码通道绑 定到多个 VB 池中。

  • pstPool 必须是已创建 VB 池的有效 PoolId,包含存储 Picture 的 VB 池和存储存储 Picture 信息的 VB 池。

  • 用户调用此接口,必须确定透过 CVI_VDEC_SetModParam 设定在VB_SOURCE_USER模式。

【举例】

  • 无。

8.3.17. CVI_VDEC_DetachVbPool

【描述】

将解码通道从某个视频缓存 VB 池中解绑定。

【语法】

CVI_S32 CVI_VDEC_DetachVbPool(VDEC_CHN VdChn);

【参数】

参数名称

描述

输入/输出

VdChn

通道号。

输入

【返回值】

返回值

描述

0

成功

非 0

失败,其值为 错误码

【需求】

  • 头文件:cvi_vdec.h,cvi_comm_video.h,cvi_comm_vdec.h

  • 库文件:ibvdec.so/libvdec.a

【注意】

  • 必须保证通道已创建,否则会返回CVI_FAILURE的错误码。

【举例】

  • 无。