hbVPVideoEncode

typedef void *hbVPVideoContext;

hbVPVideoEncode 算子和 hbVPVideoDecode 算子的context上下文描述句柄,句柄包含了VPU上运行所必要的描述信息,可重复使用。

typedef enum { HB_VP_VIDEO_TYPE_H264, HB_VP_VIDEO_TYPE_H265 } hbVPVideoType;

视频编码类型枚举。

  • 成员

    成员名称描述
    HB_VP_VIDEO_TYPE_H264H.264视频编码协议。
    HB_VP_VIDEO_TYPE_H265H.265视频编码协议。
typedef enum { HB_VP_VIDEO_RC_MODE_H264_CBR, HB_VP_VIDEO_RC_MODE_H264_VBR, HB_VP_VIDEO_RC_MODE_H264_AVBR, HB_VP_VIDEO_RC_MODE_H264_FIXQP, HB_VP_VIDEO_RC_MODE_H264_QPMAP, HB_VP_VIDEO_RC_MODE_H265_CBR, HB_VP_VIDEO_RC_MODE_H265_VBR, HB_VP_VIDEO_RC_MODE_H265_AVBR, HB_VP_VIDEO_RC_MODE_H265_FIXQP, HB_VP_VIDEO_RC_MODE_H265_QPMAP } hbVPVideoRcMode;

码率控制模式枚举。

  • 成员

    成员名称描述
    HB_VP_VIDEO_RC_MODE_H264_CBRH.264编码协议CBR码率控制模式。
    HB_VP_VIDEO_RC_MODE_H264_VBRH.264编码协议VBR码率控制模式。
    HB_VP_VIDEO_RC_MODE_H264_AVBRH.264编码协议AVBR码率控制模式。
    HB_VP_VIDEO_RC_MODE_H264_FIXQPH.264编码协议FixQp码率控制模式。
    HB_VP_VIDEO_RC_MODE_H264_QPMAPH.264编码协议QPMap码率控制模式。
    HB_VP_VIDEO_RC_MODE_H265_CBRH.265编码协议CBR码率控制模式。
    HB_VP_VIDEO_RC_MODE_H265_VBRH.265编码协议VBR码率控制模式。
    HB_VP_VIDEO_RC_MODE_H265_AVBRH.265编码协议AVBR码率控制模式。
    HB_VP_VIDEO_RC_MODE_H265_FIXQPH.265编码协议FIXQP码率控制模式。
    HB_VP_VIDEO_RC_MODE_H265_QPMAPH.265编码协议QPMAP码率控制模式。
typedef struct { uint32_t intraPeriod; uint32_t intraQp; uint32_t bitRate; uint32_t frameRate; uint32_t initialRcQp; int32_t vbvBufferSize; uint32_t mbLevelRcEnable; uint32_t minQpI; uint32_t maxQpI; uint32_t minQpP; uint32_t maxQpP; uint32_t minQpB; uint32_t maxQpB; uint32_t hvsQpEnable; int32_t hvsQpScale; uint32_t hvsMaxDeltaQp; uint8_t qpMapEnable; } hbVPVideoH264Cbr;

H.264编码协议恒定码率参数。

  • 成员

    成员名称描述
    intraPeriodI帧间隔。取值范围[0, 2047],默认值28。
    intraQpI帧QP值。取值范围[0, 51],默认值30。
    bitRate目标平均比特率,单位是kbps。取值范围[0, 700000],默认值1000。
    frameRate目标帧率,单位是fps。取值范围[0, 240],默认值30。
    initialRcQp初始QP值,当该值不在[0, 51]范围内,编码器内部会决定初始值。取值范围[0, 63],默认值63。
    vbvBufferSize指定视频缓冲区的大小,单位是ms。取值范围[10,3000],默认值10。 视频缓冲区的大小为bitRate*vbvBufferSize/1000(kb),该大小会影响编码质量和码率控制精度。 当视频缓冲区比较小时,码率控制精确度高,但图像编码质量较差; 当该buffer比较大时,图像编码质量高,但是码率波动大。
    mbLevelRcEnable使能基于宏块的帧级速率控制,根据视频内容的特征和需求动态的调整每个宏块的编码参数。 取值范围[0, 1],默认值0。
    minQpII帧的最小QP值。取值范围[0, 51],默认值8。
    maxQpII帧的最大QP值。取值范围[0, 51],默认值51。
    minQpPP帧的最小QP值。取值范围[0, 51],默认值8。
    maxQpPP帧的最大QP值。取值范围[0, 51],默认值51。
    minQpBB帧的最小QP值。取值范围[0, 51],默认值8。
    maxQpBB帧的最大QP值。取值范围[0, 51],默认值51。
    hvsQpEnable码率控制可以工作在subCTU级别的控制,该模式会调整子宏块的QP值,进而提高主观图像质量。 取值范围[0,1],默认值1。
    hvsQpScale当hvsQpEnable使能后有效,表示QP缩放因子。取值范围[0, 4],默认值2。
    hvsMaxDeltaQp当hvsQpEnable使能后有效,指定HVS QP值的最大偏差范围。取值范围[0, 12],默认值10。
    qpMapEnable使能ROI编码时的QP Map。取值范围[0, 1],默认值0。
typedef struct { uint32_t intraPeriod; uint32_t intraQp; uint32_t frameRate; uint8_t qpMapEnable; } hbVPVideoH264Vbr;

H.264编码协议可变码率参数。

  • 成员

    成员名称描述
    intraPeriodI帧间隔。取值范围[0, 2047],默认值28。
    intraQp帧QP值。取值范围[0, 51],默认值0。
    frameRate目标帧率,单位是fps。取值范围[0, 240],默认值30。
    qpMapEnable使能ROI编码时的QP Map。取值范围[0, 1],默认值0。
typedef struct { uint32_t intraPeriod; uint32_t frameRate; uint32_t qpI; uint32_t qpP; uint32_t qpB; } hbVPVideoH264FixQp;

H.264编码协议固定量化参数。

  • 成员

    成员名称描述
    intraPeriodI帧间隔。取值范围[0, 2047],默认值28。
    frameRate目标帧率,单位是fps。取值范围[0, 240],默认值30。
    qpI强制I帧的QP值。取值范围[0, 51],默认值8。
    qpP强制P帧的QP值。取值范围[0, 51],默认值8。
    qpB强制B帧的QP值。取值范围[0, 51],默认值8。
typedef struct { uint32_t intraPeriod; uint32_t frameRate; uint32_t qpMapArrayCount; uint8_t *qpMapArray; } hbVPVideoH264QpMap;

H.264编码协议QP映射参数。

  • 成员

    成员名称描述
    intraPeriodI帧间隔。取值范围[0, 2047],默认值28。
    frameRate目标帧率,单位是fps。取值范围[0, 240],默认值30。
    qpMapArrayCount指定QP Map表的大小。计算公式(ALIGN64(width)>>5)*(ALIGN64(height)>>5),默认值0。
    qpMapArray指定QP Map表,H.264编码协议的subCTU大小为32x32,需要为每一个subCTU 指定一个QP值。每个QP值占一个字节,并且按照光栅扫描方向排序。默认值nullptr。
typedef struct { uint32_t intraPeriod; uint32_t intraQp; uint32_t bitRate; uint32_t frameRate; uint32_t initialRcQp; int32_t vbvBufferSize; uint32_t ctuLevelRcEnable; uint32_t minQpI; uint32_t maxQpI; uint32_t minQpP; uint32_t maxQpP; uint32_t minQpB; uint32_t maxQpB; uint32_t hvsQpEnable; int32_t hvsQpScale; uint32_t hvsMaxDeltaQp; uint8_t qpMapEnable; } hbVPVideoH265Cbr;

H.265编码协议恒定码率参数。

  • 成员

    成员名称描述
    intraPeriodI帧间隔。取值范围[0, 2047],默认值28。
    intraQpI帧QP值。取值范围[0, 51],默认值30。
    bitRate目标平均比特率,单位是kbps。取值范围[0, 700000],默认值1000。
    frameRate目标帧率,单位是fps。取值范围[0, 240],默认值30。
    initialRcQp初始QP值,当该值不在[0, 51]范围内,编码器内部会决定初始值。取值范围[0, 63],默认值63。
    vbvBufferSize指定视频缓冲区的大小,单位是ms。取值范围[10,3000],默认值10。 视频缓冲区的大小为bitRate*vbvBufferSize/1000(kb),该大小会影响编码质量和码率控制精度。 当视频缓冲区比较小时,码率控制精确度高,但图像编码质量较差; 当该buffer比较大时,图像编码质量高,但是码率波动大。
    ctuLevelRcEnable使能基于编码数单元的帧级速率控制。根据视频内容的特征和需求动态的调整每个宏块的编码参数。 取值范围[0, 1],默认值0。
    minQpII帧的最小QP值。取值范围[0, 51],默认值8。
    maxQpII帧的最大QP值。取值范围[0, 51],默认值51。
    minQpPP帧的最小QP值。取值范围[0, 51],默认值8。
    maxQpPP帧的最大QP值。取值范围[0, 51],默认值51。
    minQpBB帧的最小QP值。取值范围[0, 51],默认值8。
    maxQpBB帧的最大QP值。取值范围[0, 51],默认值51。
    hvsQpEnable使能编码数单元的帧率控制。
    hvsQpScale当hvsQpEnable使能后有效,表示QP缩放因子。取值范围[0, 4],默认值2。
    hvsMaxDeltaQp当hvsQpEnable使能后有效,指定HVS QP值的最大偏差范围。取值范围[0, 12],默认值10。
    qpMapEnable使能ROI编码时的QPMap。取值范围[0, 1],默认值0。
typedef hbVPVideoH264Cbr hbVPVideoH264Avbr;

H.264编码协议恒定平均目标码率参数。

typedef hbVPVideoH264Vbr hbVPVideoH265Vbr;

H.265编码协议可变码率参数。

typedef hbVPVideoH264QpMap hbVPVideoH265QpMap;

H.265编码协议QP映射参数。

typedef hbVPVideoH264FixQp hbVPVideoH265FixQp;

H.265编码协议固定量化参数。

typedef hbVPVideoH265Cbr hbVPVideoH265Avbr;

H.265编码协议恒定平均目标码率参数。

typedef struct { hbVPVideoRcMode mode; union { hbVPVideoH264Cbr h264Cbr; hbVPVideoH264Vbr h264Vbr; hbVPVideoH264Avbr h264Avbr; hbVPVideoH264QpMap h264QpMap; hbVPVideoH264FixQp h264FixQp; hbVPVideoH265Cbr h265Cbr; hbVPVideoH265Vbr h265Vbr; hbVPVideoH265Avbr h265Avbr; hbVPVideoH265QpMap h265QpMap; hbVPVideoH265FixQp h265FixQp; }; } hbVPVideoRcParam;

VPU编码协议码率控制参数。

  • 成员

    成员名称描述
    mode码率控制模式。
    h264CbrH.264编码协议CBR码率控制模式的参数。
    h264VbrH.264编码协议VBR码率控制模式的参数。
    h264AvbrH.264编码协议AVBR码率控制模式的参数。
    h264QpMapH.264编码协议QpMap码率控制模式的参数。
    h264FixQpH.264编码协议FixQp码率控制模式的参数。
    h265CbrH.265编码协议CBR码率控制模式的参数。
    h265VbrH.265编码协议VBR码率控制模式的参数。
    h265AvbrH.265编码协议AVBR码率控制模式的参数。
    h265QpMapH.265编码协议QpMap码率控制模式的参数。
    h265FixQpH.265编码协议FixQp码率控制模式的参数。
typedef struct { int32_t decodingRefreshType; uint32_t gopPresetIdx; } hbVPVideoGopParam;

GOP结构参数。

  • 成员

    成员名称描述
    decodingRefreshType指定在I帧周期应用的解码刷新类型。取值范围[0, 2],默认值2。
    0:NON_IRAP,1:CRA,2: IDR。
    gopPresetIdxGOP预设结构。默认值2。
    支持0、1、2、3、6、7和9。
typedef enum { HB_VP_H264_PROFILE_UNSPECIFIED, HB_VP_H264_PROFILE_BP, HB_VP_H264_PROFILE_MP, HB_VP_H264_PROFILE_EXTENDED, HB_VP_H264_PROFILE_HP, HB_VP_H264_PROFILE_HIGH10, HB_VP_H264_PROFILE_HIGH422, HB_VP_H264_PROFILE_HIGH444 } hbVPH264Profile;

H.264编码协议下Profile枚举。

  • 成员

    成员名称描述
    HB_VP_H264_PROFILE_UNSPECIFIED不指定编码等级,VPU将自动根据源图像的位深度配置编码等级。
    HB_VP_H264_PROFILE_BPBaseline Profile,基础画质,支持8bit和4:2:0采样格式的视频序列。
    HB_VP_H264_PROFILE_MPMain Profile,主流画质,支持8bit和4:2:0采样格式的视频序列。
    HB_VP_H264_PROFILE_EXTENDEDExtended Profile,进阶画质,支持8bit和4:2:0采样格式的视频序列。
    HB_VP_H264_PROFILE_HPHigh Profile,高级画质,支持8bit和4:2:0采样格式的视频序列。
    HB_VP_H264_PROFILE_HIGH10High Profile,高级画质,支持10bit和4:2:0采样格式的视频序列。
    HB_VP_H264_PROFILE_HIGH422High Profile,高级画质,支持10bit和4:2:2采样格式的视频序列。
    HB_VP_H264_PROFILE_HIGH444High Profile,高级画质,支持10bit和4:4:4采样格式的视频序列。
typedef enum { HB_VP_H264_LEVEL_UNSPECIFIED, HB_VP_H264_LEVEL1b = 9, HB_VP_H264_LEVEL1 = 10, HB_VP_H264_LEVEL1_1 = 11, HB_VP_H264_LEVEL1_2 = 12, HB_VP_H264_LEVEL1_3 = 13, HB_VP_H264_LEVEL2 = 20, HB_VP_H264_LEVEL2_1 = 21, HB_VP_H264_LEVEL2_2 = 22, HB_VP_H264_LEVEL3 = 30, HB_VP_H264_LEVEL3_1 = 31, HB_VP_H264_LEVEL3_2 = 32, HB_VP_H264_LEVEL4 = 40, HB_VP_H264_LEVEL4_1 = 41, HB_VP_H264_LEVEL4_2 = 42, HB_VP_H264_LEVEL5 = 50, HB_VP_H264_LEVEL5_1 = 51, HB_VP_H264_LEVEL5_2 = 52 } hbVPH264Level;

H.264编码协议下Level枚举。

typedef struct { hbVPH264Profile h264Profile; hbVPH264Level h264Level; } hbVPH264EncConfig;

H.264编码协议配置参数。

  • 成员

    成员名称描述
    h264ProfileH.264编码协议的Profile。
    取值范围[0, 4],默认值HB_VP_H264_PROFILE_UNSPECIFIED。
    h264LevelH.264编码协议的Level。
    默认值HB_VP_H264_LEVEL_UNSPECIFIED。
typedef enum { HB_VP_H265_LEVEL_UNSPECIFIED, HB_VP_H265_LEVEL1 = 30, HB_VP_H265_LEVEL2 = 60, HB_VP_H265_LEVEL2_1 = 63, HB_VP_H265_LEVEL3 = 90, HB_VP_H265_LEVEL3_1 = 93, HB_VP_H265_LEVEL4 = 120, HB_VP_H265_LEVEL4_1 = 123, HB_VP_H265_LEVEL5 = 150, HB_VP_H265_LEVEL5_1 = 153 } hbVPH265Level;

H.265编码协议下Level枚举。

typedef struct { int32_t h265Tier; uint32_t transformSkipEnable; uint32_t losslessMode; uint32_t tmvpEnable; uint32_t wppEnable; uint8_t mainStillPictureProfileEnable; hbVPH265Level h265Level; } hbVPH265EncConfig;

H.265编码协议配置参数。

  • 成员

    成员名称描述
    h265TierVPU支持main tier和 high tier。取值范围[0,1],默认值0。
    transformSkipEnable使能transform_skip模式,取值范围[0,1],默认值1。 当图像内容和背景相似度较高时,跳过一些不必要的计算和数据 传输来降低编码时间和数据流量,同时保持较高的视频质量和流畅度。
    losslessMode使能无损编码模式。取值范围[0,1],默认值0。
    tmvpEnable使能时间运动矢量预测。取值范围[0,1],默认值1。
    wppEnable使能波前并行处理。取值范围[0,1],默认值0。
    mainStillPictureProfileEnable使能主静帧的Profile,可提供较好的视频质量和较低的压缩比。 取值范围[0,1],默认值0。
    h265LevelH.265编码协议的Level,默认值HB_VP_H265_LEVEL_UNSPECIFIED。
typedef struct { uint8_t pixelFormat; int32_t width; int32_t height; uint32_t outBufCount; hbVPVideoType videoType; hbVPVideoRcParam rcParam; hbVPVideoGopParam gopParam; union { hbVPH264EncConfig h264EncConfig; hbVPH265EncConfig h265EncConfig; }; } hbVPVideoEncParam;

Video编码的参数。

  • 成员

    成员名称描述
    pixelFormat输入图像的像素格式。当前支持 HB_VP_IMAGE_FORMAT_NV12HB_VP_IMAGE_FORMAT_YUV420 格式。
    width输入图像的宽度,满足8对齐。取值范围[256, 8192]。
    height输入图像的高度,满足8对齐。取值范围[128, 8192]。
    outBufCountVPU内部输出缓冲区个数。取值范围[1, 65536],默认值5。
    videoType编码协议的类型。
    rcParam码率控制参数。
    gopParamGOP参数。
    h264EncConfigH.264编码配置参数。
    h265EncConfigH.265编码配置参数。
int32_t hbVPGetDefaultVideoEncParam(hbVPVideoEncParam *param);

获取编码器默认的编码参数。

  • 参数
    • [in] param 编码参数指针。
  • 返回值
    • 返回 0 则表示API成功执行,否则执行失败。
int32_t hbVPCreateVideoEncContext(hbVPVideoContext *context, hbVPVideoEncParam const *param);

创建编码器上下文API,创建前需要提前将context初始化为nullptr。

  • 参数
    • [out] context 编码器上下文指针。
    • [in] param 编码参数指针。
  • 返回值
    • 返回 0 则表示API成功执行,否则执行失败。
  • 接口限制说明
    • VPU最高支持创建32路编码或解码的上下文。
    • 编码器不支持包含B帧的后向参考帧的码流编码。
int32_t hbVPReleaseVideoEncContext(hbVPVideoContext context);

释放编码器上下文API。

  • 参数
    • [in] context 编码器上下文指针。
  • 返回值
    • 返回 0 则表示API成功执行,否则执行失败。
int32_t hbVPVideoEncode(hbUCPTaskHandle_t *taskHandle, hbVPImage const *srcImg, hbVPVideoContext context);

调用VPU编码API。

  • 参数
    • [out] taskHandle 任务句柄,负责算子与UCP架构的交互。
    • [in] srcImg 存放编码图像的内存地址指针。
    • [in] context 编码器的上下文指针。
  • 返回值
    • 返回 0 则表示API成功执行,否则执行失败。
  • 接口限制说明
    • 仅支持使用异步方式创建任务。
int32_t hbVPGetVideoEncOutputBuffer(hbUCPTaskHandle_t taskHandle, hbVPArray *outBuf);

获取编码数据buffer的API。

  • 参数
    • [in] taskHandle 任务句柄,负责算子与UCP架构的交互。
    • [out] outBuf 存放编码后数据的内存地址指针。
  • 返回值
    • 返回 0 则表示API成功执行,否则执行失败。
  • 接口限制说明
    • 输出缓冲区 outBuf 由VPU内部申请。
    • 当任务成功完成后,输出缓冲区中的数据有效;在任务释放阶段,输出缓冲区将被释放。