RV1126 NO.13:RV1126的视频编码模块的讲解

一.VENC模块的介绍

VENC模块是RV1126专门用于视频编码的模块,VENC模块提供了多种编码方式,分别是:H264/H265/MJPEG/JPEG。而在此次编码模块中,我们重点是讲解H264、H265编码模块(MJPEG/JPEG用的不多,所以就不作详细讲解)。

二.VENC结构体的定义

/* the attribute of the venc chnl*/
typedef struct rkVENC_CHN_ATTR_S {
  VENC_ATTR_S stVencAttr;    // 编码器基础属性结构体 the attribute of video encoder
  VENC_RC_ATTR_S stRcAttr;   // 编码码率控制属性结构体 the attribute of rate  ctrl
  VENC_GOP_ATTR_S stGopAttr; // 编码器GOP属性结构体 the attribute of gop
} VENC_CHN_ATTR_S;

VENC_CHN_ATTRS是管理整个VENC模块的管理结构体,这里面它包含三个VENC子类结构体:分别是VENC_ATTR_S结构体(编码器基础属性结构体)、VENC_RC_ATTR_S结构体(编码码率控制属性结构体)、VENC_GOP_ATTR_S结构体(编码器GOP属性结构体)。

2.1. VENC_ATTR_S结构体(编码器基础属性结构体):

这个结构体主要是设置编码器的基础属性,比方说:分辨率、编码器类型、Profile等等。具体的我们来看看,它的定义:

/* the attribute of the Venc*/
typedef struct rkVENC_ATTR_S {

  CODEC_TYPE_E enType;    // 编码器协议类型 RW; the type of encodec
  IMAGE_TYPE_E imageType; // 输入图像类型,通常来说venc的imageType和vi的imageType是一致的 the type of input image
  RK_U32 u32VirWidth;  //  stride width, same to buffer_width, must greater than
                       // width, often set vir_width=(width+15)&(~15)
  RK_U32 u32VirHeight; // stride height, same to buffer_height, must greater
                       // than height, often set vir_height=(height+15)&(~15)
  RK_U32 u32Profile;   // RW;
                       // H.264:   66: baseline; 77:MP; 100:HP;
                       // H.265:   default:Main;
                       // Jpege/MJpege:   default:Baseline
  RK_BOOL bByFrame;    // RW; Range:[0,1];
                       // get stream mode is slice mode or frame mode
  RK_U32 u32PicWidth;  // 编码图像宽度
  RK_U32 u32PicHeight; // 编码图像高度
  VENC_ROTATION_E enRotation;
  union {
    VENC_ATTR_H264_S stAttrH264e;   // attributes of H264e
    VENC_ATTR_H265_S stAttrH265e;   // attributes of H265e
    VENC_ATTR_MJPEG_S stAttrMjpege; // attributes of Mjpeg
    VENC_ATTR_JPEG_S stAttrJpege;   // attributes of jpeg
  };
} VENC_ATTR_S;

 2.1.1. enType:编码器协议类型,下面是画框部分就是它支持的视频编码类型:包括RK_CODEC_TYPE_H264、RK_CODEC_TYPE_H265、RK_CODEC_TYPE_JPEG、RK_CODEC_TYPE_MJPEG

typedef enum rk_CODEC_TYPE_E {
  RK_CODEC_TYPE_NONE = -1,
  // Audio
  RK_CODEC_TYPE_AAC,
  RK_CODEC_TYPE_MP2,
  RK_CODEC_TYPE_VORBIS,
  RK_CODEC_TYPE_G711A,
  RK_CODEC_TYPE_G711U,
  RK_CODEC_TYPE_G726,
  // Video
  RK_CODEC_TYPE_H264,
  RK_CODEC_TYPE_H265,
  RK_CODEC_TYPE_JPEG,
  RK_CODEC_TYPE_MJPEG,
  RK_CODEC_TYPE_NB
} CODEC_TYPE_E;

2.1.2. imageType: 输入图像类型,venc的imageType和VI的imageType必须保持一致

typedef enum rk_IMAGE_TYPE_E {
  IMAGE_TYPE_UNKNOW = 0,
  IMAGE_TYPE_GRAY8,
  IMAGE_TYPE_GRAY16,
  IMAGE_TYPE_YUV420P,
  IMAGE_TYPE_NV12,
  IMAGE_TYPE_NV21,
  IMAGE_TYPE_YV12,
  IMAGE_TYPE_FBC2,
  IMAGE_TYPE_FBC0,
  IMAGE_TYPE_YUV422P,
  IMAGE_TYPE_NV16,
  IMAGE_TYPE_NV61,
  IMAGE_TYPE_YV16,
  IMAGE_TYPE_YUYV422,
  IMAGE_TYPE_UYVY422,
  IMAGE_TYPE_RGB332,
  IMAGE_TYPE_RGB565,
  IMAGE_TYPE_BGR565,
  IMAGE_TYPE_RGB888,
  IMAGE_TYPE_BGR888,
  IMAGE_TYPE_ARGB8888,
  IMAGE_TYPE_ABGR8888,
  IMAGE_TYPE_JPEG,

  IMAGE_TYPE_BUTT
} IMAGE_TYPE_E;

2.1.3. u32VirWidth:编码图像的虚宽,一般虚宽和宽度保持一致

2.1.4. u32VirHeight:编码图像的高度,一般高度和高度保持一致

2.1.5. u32Profile:H264支持66:baseline、77: MP、100:HP。H265支持default:Main;

2.1.6. bByFrame:RW,范围是[0,1],默认是0

2.1.7. u32PicWidth:编码图像宽度

2.1.8. u32PicHeight:编码图像高度

2.1.9. enRotation:图像旋转角度,VENC_ROTATION_0, VENC_ROTATION_90, VENC_ROTATION_180,VENC_ROTATION_270。

typedef enum rkVENC_ROTATION_E {
  VENC_ROTATION_0 = 0,
  VENC_ROTATION_90 = 90,
  VENC_ROTATION_180 = 180,
  VENC_ROTATION_270 = 270,
  VENC_ROTATION_BUTT
} VENC_ROTATION_E;

2.1.10. 编码器额外属性:VENC_ATTR_H264_S、VENC_ATTR_H265_S、VENC_ATTR_MJPEG_S、VENC_ATTR_JPEG_S

union {
    VENC_ATTR_H264_S stAttrH264e;   // attributes of H264e
    VENC_ATTR_H265_S stAttrH265e;   // attributes of H265e
    VENC_ATTR_MJPEG_S stAttrMjpege; // attributes of Mjpeg
    VENC_ATTR_JPEG_S stAttrJpege;   // attributes of jpeg
  };

主要是定义了H264、H265、MJPEG、JPEGE四种编码器的额外属性。

2.1.10.1. VENC_ATTR_H264_S

typedef struct rkVENC_ATTR_H264_S {
  RK_U32 u32Level;
  // reserved
} VENC_ATTR_H264_S;

u32Level:Profile的IDC值,这个值跟上面u32Profile值一样

2.1.10.2. VENC_ATTR_H265_S

typedef struct rkVENC_ATTR_H265_S {

  // reserved
} VENC_ATTR_H265_S;

2.1.10.3. VENC_ATTR_MJPEG_S:

/*the attribute of mjpege*/
typedef struct rkVENC_ATTR_MJPEG_S {
  RK_U32 u32ZoomWidth;  // Zoom to specified width
  RK_U32 u32ZoomHeight; // Zoom to specified height
  RK_U32 u32ZoomVirWidth;
  RK_U32 u32ZoomVirHeight;
} VENC_ATTR_MJPEG_S;

2.1.10.3.1. u32ZoomWidth:缩放的指定宽度

2.1.10.3.2.u32ZoomWidth:缩放的指定高度

2.1.10.3.3.u32ZoomVirWidth:缩放的虚拟宽度

2.1.10.3.4.u32ZoomVirWidth:缩放的虚拟高度

2.1.10.4. VENC_ATTR_JPEG_S:

/*the attribute of jpege*/
typedef struct rkVENC_ATTR_JPEG_S {
  RK_U32 u32ZoomWidth;  // Zoom to specified width
  RK_U32 u32ZoomHeight; // Zoom to specified height
  RK_U32 u32ZoomVirWidth;
  RK_U32 u32ZoomVirHeight;
} VENC_ATTR_JPEG_S;

2.2. VENC_RC_ATTR_S结构体(编码器基础属性结构体):

这个结构体主要设置码率控制属性,这其中包括:enRcMode、stH264Cbr(H264的CBR码率控制模式)、stH264Vbr(H264的VBR码率控制模式)、stH264Avbr(H264的AVBR码率控制模式)、stMJpegCbr(MJPEG的CBR模式)、stMJpegVbr(MJPEG的VBR模式)、stH265Cbr(H265的CBR码率控制模式)、

stH265Vbr(H265的VBR码率控制模式)、stH265Avbr(H265的AVBR码率控制模式)

/* the attribute of rc*/
typedef struct rkVENC_RC_ATTR_S {
  /* RW; the type of rc*/
  VENC_RC_MODE_E enRcMode;
  union {
    VENC_H264_CBR_S stH264Cbr;
    VENC_H264_VBR_S stH264Vbr;
    VENC_H264_AVBR_S stH264Avbr;

    VENC_MJPEG_CBR_S stMjpegCbr;
    VENC_MJPEG_VBR_S stMjpegVbr;

    VENC_H265_CBR_S stH265Cbr;
    VENC_H265_VBR_S stH265Vbr;
    VENC_H265_AVBR_S stH265Avbr;
  };
} VENC_RC_ATTR_S;

2.2.1. enRcMode:码率控制类型,下面是不同编码的控制码率类型(注意:编码类型必须要和码率控制的编码类型要一致,比方说:若enType是H264,那enRcMode对应的码率控制结构体是stH264Cbr、stH264Vbr、stH264Avbr结构体)。

/* rc mode */
typedef enum rkVENC_RC_MODE_E {
  // H264
  VENC_RC_MODE_H264CBR = 1,
  VENC_RC_MODE_H264VBR,
  VENC_RC_MODE_H264AVBR,
  // MJPEG
  VENC_RC_MODE_MJPEGCBR,
  VENC_RC_MODE_MJPEGVBR,
  // H265
  VENC_RC_MODE_H265CBR,
  VENC_RC_MODE_H265VBR,
  VENC_RC_MODE_H265AVBR,
  VENC_RC_MODE_BUTT,
} VENC_RC_MODE_E;

2.2.2. stH264Cbr:H264的CBR码率控制结构体

/* the attribute of h264e cbr*/
typedef struct rkVENC_H264_CBR_S {

  RK_U32 u32Gop; // RW; Range:[1, 65536]; the interval of I Frame.
  RK_U32 u32SrcFrameRateNum;
  RK_U32 u32SrcFrameRateDen;
  RK_FR32 fr32DstFrameRateNum;
  RK_FR32 fr32DstFrameRateDen;
  RK_U32 u32BitRate; // RW; Range:[2, 614400]; average bitrate
} VENC_H264_CBR_S;

2.2.2.1.u32Gop:GOP长度的设置

2.2.2.2.u32SrcFrameRateNum:数据源帧率分子

2.2.2.3.u32SrcFrameRateDen:数据源帧率分母

2.2.2.4.u32DstFrameRateNum:目标帧率分子

2.2.2.5.u32DstFrameRateDen:目标帧率分母

2.2.2.6.u32BitRate:平均码率,取值范围[2000, 98000000]bps(比特率)

2.2.3. stH264Vbr:H264的VBR码率控制结构体

/* the attribute of h264e vbr*/
typedef struct rkVENC_H264_VBR_S {
  RK_U32 u32Gop; // RW; Range:[1, 65536]; the interval of ISLICE.
  RK_U32 u32SrcFrameRateNum;
  RK_U32 u32SrcFrameRateDen;
  RK_FR32 fr32DstFrameRateNum;
  RK_FR32 fr32DstFrameRateDen;
  RK_U32 u32MaxBitRate; // RW; Range:[2, 614400];the max bitrate
} VENC_H264_VBR_S;

2.2.3.1.u32Gop:GOP长度的设置

2.2.3.2.u32SrcFrameRateNum:数据源帧率分子

2.2.3.3.u32SrcFrameRateDen:数据源帧率分母

2.2.3.4.u32DstFrameRateNum:目标帧率分子

2.2.3.5.u32DstFrameRateDen:目标帧率分子

2.2.3.6.u32MaxBitRate:最大码率,取值范围[2000, 98000000]bps(比特数)。注意:最大码率不是说设置多少,就不能超过多少,他时时刻刻以画面质量进行动态码率调节:它很有可能会超过你设置的值。

2.2.4. stH264Avbr:H264的AVBR码率控制结构体

/* the attribute of h264e vbr*/
typedef struct rkVENC_H264_AVBR_S {
  RK_U32 u32Gop; // RW; Range:[1, 65536]; the interval of ISLICE.
  RK_U32 u32SrcFrameRateNum;
  RK_U32 u32SrcFrameRateDen;
  RK_FR32 fr32DstFrameRateNum;
  RK_FR32 fr32DstFrameRateDen;
  RK_U32 u32MaxBitRate; // RW; Range:[2, 614400];the max bitrate
} VENC_H264_AVBR_S;

2.2.4.1.u32Gop:GOP长度的设置

2.2.4.2.u32SrcFrameRateNum:数据源帧率分子

2.2.4.3.u32SrcFrameRateDen:数据源帧率分母

2.2.4.4.u32DstFrameRateNum:目标帧率分子

2.2.4.5.u32DstFrameRateDen:目标帧率分子

2.2.4.6.u32MaxBitRate:最大码率,取值范围[2000, 98000000]bps(比特数)。注意:最大码率不是说设置多少,就不能超过多少,他时时刻刻以画面质量进行动态码率调节:它很有可能会超过你设置的值。

2.2.5. stMjpegCbr:MJPEG的CBR码率控制结构体

/* the attribute of mjpege cbr*/
typedef struct rkVENC_MJPEG_CBR_S {
  RK_U32 u32SrcFrameRateNum;
  RK_U32 u32SrcFrameRateDen;
  RK_FR32 fr32DstFrameRateNum;
  RK_FR32 fr32DstFrameRateDen;
  RK_U32 u32BitRate; // RW; Range:[2000, 98000000]; average bitrate
} VENC_MJPEG_CBR_S;

2.2.5.1. u32SrcFrameRateNum:数据源帧率分子

2.2.5.2.u32SrcFrameRateDen:数据源帧率分母

2.2.5.3.u32DstFrameRateNum:目标帧率分子

2.2.5.4.u32DstFrameRateDen:目标帧率分母

2.2.5.5.u32BitRate:平均码率,取值范围[2000, 98000000]bps(比特数)

2.2.6. stMjpegVbr:MJPEG的VBR码率控制结构体

/* the attribute of mjpege vbr*/
typedef struct rkVENC_MJPEG_VBR_S {
  RK_U32 u32SrcFrameRateNum;
  RK_U32 u32SrcFrameRateDen;
  RK_FR32 fr32DstFrameRateNum;
  RK_FR32 fr32DstFrameRateDen;
  RK_U32 u32BitRate; // RW; Range:[2000, 98000000]; average bitrate
} VENC_MJPEG_VBR_S;

2.2.6.1. u32SrcFrameRateNum:数据源帧率分子

2.2.6.2.u32SrcFrameRateDen:数据源帧率分母

2.2.6.3.u32DstFrameRateNum:目标帧率分子

2.2.6.4. u32DstFrameRateDen:目标帧率分子

2.2.6.5. u32BitRate:平均码率,取值范围[2000, 98000000]bps(比特数)

2.2.8. stH265Cbr:H265的CBR码率控制结构体

VENC_H265_CBR_S结构体的参数和VENC_H264_CBR_S参数一致

2.2.9. stH265Vbr:H265的VBR码率控制结构体

VENC_H265_VBR_S结构体的参数和VENC_H264_VBR_S参数一致

2.2.10. stH265AVbr:H265的VBR码率控制结构体

VENC_H265_AVBR_S结构体的参数和VENC_H264_AVBR_S参数一致

2.3. VENC_GOP_ATTR_S结构体(编码器GOP属性结构体):

这个结构体主要是设置编码器的GOP属性,具体的我们来看看,它的定义:

/* the attribute of the gop*/
typedef struct rkVENC_GOP_ATTR_S {
  VENC_GOP_MODE_E enGopMode;
  RK_U32 u32GopSize;
  RK_S32 s32IPQpDelta;
  RK_U32 u32BgInterval;
  RK_S32 s32ViQpDelta;
} VENC_GOP_ATTR_S;

2.3.1. enGopMode:GOP类型,我们来看看有几种:

/* the gop mode */
typedef enum rkVENC_GOP_MODE_E {
  VENC_GOPMODE_NORMALP = 0,
  VENC_GOPMODE_TSVC,
  VENC_GOPMODE_SMARTP,
  VENC_GOPMODE_BUTT,
} VENC_GOP_MODE_E;

2.3.1.1. VENC_GOPMODE_NORMALP:普通GOP模式

2.3.1.2. VENC_GOPMODE_TSVC:TSVC模式

2.3.1.3. VENC_GOPMODE_SMARTP:智能SMARTP模式

2.3.2. u32GopSize:编码GOP大小,可以理解为关键帧间隔数量

2.3.3. s32IPQpDelta:I帧相对于P帧的QP差值

2.3.4. u32BgInterval:长期参考帧间隔(SMARTP模式才会用到)

2.3.5. s32ViQpDelta:虚拟I帧相对于普通P帧的QP差值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值