hbVPVideoEncode

typedef void *hbVPVideoContext;

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

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 bitRate;
  uint32_t frameRate;
  uint32_t initialRcQp;
} hbVPVideoH264Cbr;

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

  • 成员

    成员名称描述
    intraPeriodI帧间隔。取值范围[0, 2047],推荐值28。
    bitRate目标平均比特率,单位是kbps。取值范围[1, 700000],推荐值1000kbps。
    frameRate目标帧率,单位是fps。取值范围[1, 240],推荐值30。
    initialRcQp初始码率量化值,取值范围[0, 51],其中参数值越大,编码质量越差。若设置的参数值超出51时,则由Video Processing Unit硬件决定该参数的具体值,推荐值63。
typedef struct {
  uint32_t intraPeriod;
  uint32_t intraQp;
  uint32_t frameRate;
} hbVPVideoH264Vbr;

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

  • 成员

    成员名称描述
    intraPeriodI帧间隔。取值范围[0, 2047],推荐值28。
    intraQp帧QP值。取值范围[0, 51],推荐值30。
    frameRate目标帧率,单位是fps。取值范围[1, 240],推荐值30。
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。取值范围[1, 240],推荐值30。
    qpII帧的QP值。取值范围[0, 51],推荐值0。
    qpPP帧的QP值。取值范围[0, 51],推荐值0。
    qpBB帧的QP值。取值范围[0, 51],推荐值0。
typedef struct {
  uint32_t intraPeriod;
  uint32_t frameRate;
  uint32_t qpMapArrayCount;
  uint8_t *qpMapArray;
} hbVPVideoH264QpMap;

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

  • 成员

    成员名称描述
    intraPeriodI帧间隔。取值范围[0, 2047],推荐值28。
    frameRate目标帧率,单位是fps。取值范围[1, 240],推荐值30。
    qpMapArrayCount指定QP Map的大小。计算公式为(ALIGN16(width)>>4)*(ALIGN16(height)>>4),取值范围[128, 8192x4096/(16x16)]。
    qpMapArray指定QP Map的数值。宏块大小为16x16,每个宏块需要指定一个QP值。每个QP值占用一个字节,并按光栅扫描顺序排列。
typedef hbVPVideoH264Cbr hbVPVideoH264Avbr;

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

  • 成员

    成员名称描述
    intraPeriodI帧间隔。取值范围[0, 2047],推荐值28。
    bitRate目标平均比特率,单位是kbps。取值范围[1, 700000],推荐值1000kbps。
    frameRate目标帧率,单位是fps。取值范围[1, 240],推荐值30。
    initialRcQp初始码率量化值,取值范围[0, 51],其中参数值越大,编码质量越差。若设置的参数值超出51时,则由Video Processing Unit硬件决定该参数的具体值,推荐值63。
typedef hbVPVideoH264Cbr hbVPVideoH265Cbr;

H.265编码协议恒定码率参数,参数范围限制同hbVPVideoH264Cbr。

typedef hbVPVideoH264Vbr hbVPVideoH265Vbr;

H.265编码协议可变码率参数,参数范围限制同hbVPVideoH264Vbr。

typedef hbVPVideoH264Avbr hbVPVideoH265Avbr;

H.265编码协议平均可变码率参数,参数范围限制同hbVPVideoH264Avbr。

typedef hbVPVideoH264FixQp hbVPVideoH265FixQp;

H.265编码协议固定量化参数,参数范围限制同hbVPVideoH264FixQp。

typedef hbVPVideoH264QpMap hbVPVideoH265QpMap;

H.265编码协议中的QP映射参数。其宏块大小为 32x32,每个宏块需要指定一个QP值。 qpMapArrayCount 参数的计算公式为 (ALIGN64(width)>>5) * (ALIGN64(height)>>5),其取值范围为 [256x128/(32x32), 8192x4096/(32x32)]。其余参数范围限制同hbVPVideoH264QpMap

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;

Video Processing Unit编码协议码率控制参数。

  • 成员

    成员名称描述
    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。
    支持1、2、3、6、7和9。
typedef struct {
  uint8_t pixelFormat;
  int32_t width;
  int32_t height;
  uint32_t outBufCount;
  uint64_t backend;
  hbVPVideoType videoType;
  hbVPVideoRcParam rcParam;
  hbVPVideoGopParam gopParam;
} hbVPVideoEncParam;

Video编码的参数。

  • 成员

    成员名称描述
    pixelFormat输入图像的像素格式。当前支持 HB_VP_IMAGE_FORMAT_NV12HB_VP_IMAGE_FORMAT_YUV420 格式。
    width输入图像的宽度,满足32对齐。取值范围[256, 8192]。
    height输入图像的高度,满足8对齐。取值范围[128, 4096]。
    outBufCountVideo Processing Unit内部输出缓冲区个数。取值范围[1, 1000],推荐值5。
    backend指定Video编码任务运行的后端。仅支持设置为单个具体核的后端,不支持多后端或 ANY 类型后端。
    videoType编码协议的类型。
    rcParam码率控制参数。
    gopParamGOP参数。
int32_t hbVPGetDefaultVideoEncParam(hbVPVideoEncParam *param);

获取编码器默认的编码参数,其中pixelFormat 默认为 HB_VP_IMAGE_FORMAT_YUV420widthheight 默认为0,需根据实际尺寸指定。 outBufCount 默认为5,backend 默认为 HB_UCP_VPU_CORE_0decodingRefreshType 默认为2,gopPresetIdx 默认为2。码率模式由传入的 videoType 参数决定, 当 videoType=HB_VP_VIDEO_TYPE_H264 时,码率控制模式为 HB_VP_VIDEO_RC_MODE_H264_CBR,具体参数见参考 hbVPVideoH264Cbr 结构体中的推荐参数。 当 videoType=HB_VP_VIDEO_TYPE_H265 时,码率控制模式为 HB_VP_VIDEO_RC_MODE_H265_CBR,具体参数见参考 hbVPVideoH265Cbr 结构体中的推荐参数。

  • 参数
    • [in] param 编码参数。
  • 返回值
    • 返回 0 则表示API成功执行,否则执行失败。
  • 接口限制说明
    • 在调用接口前,需要将 videoType 指定为 HB_VP_VIDEO_TYPE_H264HB_VP_VIDEO_TYPE_H265
int32_t hbVPCreateVideoEncContext(hbVPVideoContext *context,
                                  hbVPVideoEncParam const *param);

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

  • 参数
    • [out] context 编码器上下文。
    • [in] param 编码参数。
  • 返回值
    • 返回 0 则表示API成功执行,否则执行失败。
  • 接口限制说明
    • Video Processing Unit每个核最高支持创建32路编码或解码的上下文。
    • 编码器不支持包含B帧的后向参考帧的码流编码。
    • 由于硬件限制,H264码流内部会以 16x16 为单位进行编码处理,对于未对齐的数据,编码器会用底部像素值进行填充。
int32_t hbVPReleaseVideoEncContext(hbVPVideoContext context);

释放编码器上下文API。

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

调用Video Processing Unit编码API。

  • 参数
    • [out] taskHandle 任务句柄,负责算子与UCP架构的交互。
    • [in] srcImg 输入YUV图像。
    • [in] context 编码器的上下文。
  • 返回值
    • 返回 0 则表示API成功执行,否则执行失败。
  • 接口限制说明
    • 由于Video Processing Unit硬件限制,Video Processing Unit编码或解码时最大支持同时提交31个任务。
    • 仅支持使用异步方式创建任务。
    • 为了避免系统资源浪费并提高Video Processing Unit编码性能,建议复用输入地址。
int32_t hbVPGetVideoEncOutputBuffer(hbVPArray *outBuf,
                                    hbUCPTaskHandle_t taskHandle);

获取编码数据buffer的API。

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