X264重要的结构体说明

X264的文档内容比较多,参数也不少,我就挑一些重要的参数给大家分享一下。

#nal_unit_type_e//NAL的类型
enum nal_unit_type_e
{
NAL_UNKNOWN     = 0,//未知类型
NAL_SLICE       = 1,//不分区、不是IDR 图像的片
NAL_SLICE_DPA   = 2,//片分区A
NAL_SLICE_DPB   = 3,//片分区B
NAL_SLICE_DPC   = 4,//片分区C
NAL_SLICE_IDR   = 5,    /* ref_idc != 0 *///序列参数集
NAL_SEI         = 6,    /* ref_idc == 0 *///图像参数集
NAL_SPS         = 7,//分界符
NAL_PPS         = 8,//序列结束
NAL_AUD         = 9,//码流结束
NAL_FILLER      = 12,//填充模式
/* ref_idc == 0 for 6,9,10,11,12 */

};

enum nal_priority_e

enum nal_priority_e//NAL单元的优先级
{
NAL_PRIORITY_DISPOSABLE = 0,
NAL_PRIORITY_LOW        = 1,
NAL_PRIORITY_HIGH       = 2,
NAL_PRIORITY_HIGHEST    = 3,
};

typedef struct x264_nal_t

typedef struct x264_nal_t
{
int i_ref_idc;  //nal的优先级
int i_type;    //nal单元的类型
int b_long_startcode; // 是否采用长前缀码0x00000001
int i_first_mb; // 如果Nal为一条带,则表示该条带第一个宏块的指数
int i_last_mb;  // 如果Nal为一条带,则表示该条带最后一个宏块的指数
int i_payload; // payload 的字节大小  
uint8_t *p_payload; // 存放编码后的数据,已经封装成Nal单元
int i_padding;//尾部补全的字节数
} x264_nal_t;

Analyse flags

/* Analyse flags */
#define X264_ANALYSE_I4x4       0x0001  /* Analyse i4x4 */
#define X264_ANALYSE_I8x8       0x0002  /* Analyse i8x8  (requires 8x8 transform) */
#define X264_ANALYSE_PSUB16x16  0x0010  /* Analyse p16x8, p8x16 and p8x8 */
#define X264_ANALYSE_PSUB8x8    0x0020  /* Analyse p8x4, p4x8, p4x4 */
#define X264_ANALYSE_BSUB16x16  0x0100  /* Analyse b16x8, b8x16 and b8x8 */
#define X264_DIRECT_PRED_NONE        0//直接预测方法
#define X264_DIRECT_PRED_SPATIAL     1//空间
#define X264_DIRECT_PRED_TEMPORAL    2//时间
#define X264_DIRECT_PRED_AUTO        3
#define X264_ME_DIA                  0//运动估计方法
#define X264_ME_HEX                  1
#define X264_ME_UMH                  2
#define X264_ME_ESA                  3
#define X264_ME_TESA                 4
#define X264_CQM_FLAT                0//自定义量化矩阵方法
#define X264_CQM_JVT                 1
#define X264_CQM_CUSTOM              2
#define X264_RC_CQP                  0// 码率控制方法
#define X264_RC_CRF                  1
#define X264_RC_ABR                  2
#define X264_QP_AUTO                 0
#define X264_AQ_NONE                 0
#define X264_AQ_VARIANCE             1
#define X264_AQ_AUTOVARIANCE         2
#define X264_AQ_AUTOVARIANCE_BIASED  3
#define X264_B_ADAPT_NONE            0 // 自适应B帧
#define X264_B_ADAPT_FAST            1
#define X264_B_ADAPT_TRELLIS         2
#define X264_WEIGHTP_NONE            0// P帧权重
#define X264_WEIGHTP_SIMPLE          1
#define X264_WEIGHTP_SMART           2
#define X264_B_PYRAMID_NONE          0// 参见param->i_bframe_pyramid ,B帧可作为参考帧
#define X264_B_PYRAMID_STRICT        1
#define X264_B_PYRAMID_NORMAL        2
#define X264_KEYINT_MIN_AUTO         0// IDR帧间距param->i_keyint_max / i_keyint_min 
#define X264_KEYINT_MAX_INFINITE     (1<<30)

static const char * const x264_direct_pred_names[] = { "none", "spatial", "temporal", "auto", 0 };
static const char * const x264_motion_est_names[] = { "dia", "hex", "umh", "esa", "tesa", 0 };
static const char * const x264_b_pyramid_names[] = { "none", "strict", "normal", 0 };
static const char * const x264_overscan_names[] = { "undef", "show", "crop", 0 };
static const char * const x264_vidformat_names[] = { "component", "pal", "ntsc", "secam", "mac", "undef", 0 };
static const char * const x264_fullrange_names[] = { "off", "on", 0 };
static const char * const x264_colorprim_names[] = { "", "bt709", 
"undef", "", "bt470m", "bt470bg", "smpte170m", "smpte240m", "film", "bt2020", 0 };
static const char * const x264_transfer_names[] = { "", "bt709", "undef", "", "bt470m", "bt470bg", "smpte170m", "smpte240m", "linear", "log100", "log316",
                                                "iec61966-2-4", "bt1361e", "iec61966-2-1", "bt2020-10", "bt2020-12", 0 };
static const char * const x264_colmatrix_names[] = { "GBR", "bt709", "undef", "", "fcc", "bt470bg", "smpte170m", "smpte240m", "YCgCo", "bt2020nc", "bt2020c", 0 };
static const char * const x264_nal_hrd_names[] = { "none", "vbr", "cbr", 0 };

Colorspace type

/* Colorspace type:设置输出的视频的采样格式 */
#define X264_CSP_MASK           0x00ff  /* */
#define X264_CSP_NONE           0x0000  /* Invalid mode     */
#define X264_CSP_I420           0x0001  /* yuv 4:2:0 planar */
#define X264_CSP_YV12           0x0002  /* yvu 4:2:0 planar */
#define X264_CSP_NV12           0x0003  /* yuv 4:2:0, with one y plane and one packed u+v */
#define X264_CSP_NV21           0x0004  /* yuv 4:2:0, with one y plane and one packed v+u */
#define X264_CSP_I422           0x0005  /* yuv 4:2:2 planar */
#define X264_CSP_YV16           0x0006  /* yvu 4:2:2 planar */
#define X264_CSP_NV16           0x0007  /* yuv 4:2:2, with one y plane and one packed u+v */
#define X264_CSP_V210           0x0008  /* 10-bit yuv 4:2:2 packed in 32 */
#define X264_CSP_I444           0x0009  /* yuv 4:4:4 planar */
#define X264_CSP_YV24           0x000a  /* yvu 4:4:4 planar */
#define X264_CSP_BGR            0x000b  /* packed bgr 24bits   */
#define X264_CSP_BGRA           0x000c  /* packed bgr 32bits   */
#define X264_CSP_RGB            0x000d  /* packed rgb 24bits   */
#define X264_CSP_MAX            0x000e  /* end of list */
#define X264_CSP_VFLIP          0x1000  /* the csp is vertically flipped */
#define X264_CSP_HIGH_DEPTH     0x2000  /* the csp has a depth of 16 bits per pixel component */

Rate control parameters

/* Rate control parameters*/
 struct
{
    int         i_rc_method;  //码率控制

    int         i_qp_constant; //QP值,范围0~51,值越大图像越模糊,默认23
    int         i_qp_min;       //允许的最小量化值 
    int         i_qp_max;      //允许的最大量化值
    int         i_qp_step;      //帧间最大量化步长

    int         i_bitrate;  //设置平均码率
    float       f_rf_constant; //是实际质量,越大图像越花,越小越清晰
    float       f_rf_constant_max;  //图像质量的最大值
    float       f_rate_tolerance;//允许的误差
    int         i_vbv_max_bitrate;//平均码率模式下,最大瞬时码率,默认0(与-B设置相同)
    int         i_vbv_buffer_size;//率控制缓冲区的大小,单位kbit,默认0 
    float       f_vbv_buffer_init; // <=1: fraction of buffer_size. >1: kbit码率控制缓冲区数据保留的最[大数据](http://lib.csdn.net/base/20)量与缓冲区大小之比,范围0~1.0,默认0.9
    float       f_ip_factor;//ip--i帧p帧的qp的差值
    float       f_pb_factor;//pb--p帧b帧的qp的差值

    /* VBV filler: force CBR VBV and use filler bytes to ensure hard-CBR.
     * Implied by NAL-HRD CBR. */
    int         b_filler;

    int         i_aq_mode;    // 自适应量化(AQ)模式。
                                // 0:关闭AQ  
                                // 1:允许AQ在整个视频中和帧内重新分配码
                                // 2:自方差AQ(实验阶段),尝试逐帧调整强度
    float       f_aq_strength;//AQ强度,减少平趟和纹理区域的块效应和模糊度
    int         b_mb_tree;     //是否开启基于macroblock的qp控制方法,开启之后质量有所提升
    int         i_lookahead;  // 决定mbtree向前预测的帧数

    /* 2pass */
    int         b_stat_write;   //是否将统计数据写入到文件psz_stat_out中
    char        *psz_stat_out;  // 输出文件用于保存第一次编码统计数据
    int         b_stat_read;    // 是否从文件psz_stat_in中读入统计数据
    char        *psz_stat_in;  // 输入文件存有第一次编码的统计数据

    /* 2pass params (same as ffmpeg ones) */
    float       f_qcompress;    //量化曲线(quantizer curve)压缩因子。范围0-1
                                    0.0 => cbr(constant bitrate), 1.0 => constant qp(constatnt quantity(p frame))
                                    越小-》码率越恒定,越大-》量化越恒定
    float       f_qblur;       //时间上模糊量化,减少QP的波动(after curve compression)
    float       f_complexity_blur; //时间上模糊复杂性,减少QP的波动(before curve compression)
    x264_zone_t *zones;         // 码率控制覆盖
    int         i_zones;        /* number of zone_t's */
    char        *psz_zones;     /* alternate method of specifying zones */
} rc;

x264_level_t

//在给定的profile下,level通常与解码器的处理能力和内存容量相对应。每一个档次设置不同的参数
//(如取样速率、图像尺寸、编码比特率等),得到对应的编解码器性能的不同level。

typedef struct x264_level_t
{
int level_idc;
int mbps;      //兆比特每秒
int frame_size;  //最大帧的大小
int dpb;         // 最大的解码图像缓冲区
int bitrate;     //比特率
int cpb;         /* max vbv buffer (kbit) */
int mv_range;    //最大的垂直的mv分量的范围
int mvs_per_2mb; /* max mvs per 2 consecutive mbs. */
int slice_rate;  /* ?? */
int mincr;       /* min compression ratio */
int bipred8x8;   /* limit bipred to >=8x8 */
int direct8x8;   /* limit b_direct to >=8x8 */
int frame_only;  /* forbid interlacing */
} x264_level_t;

x264_image_t

x264_image_t 结构用于存放一帧图像实际像素数据

 typedef struct
{
int     i_csp;           // 设置彩色空间,通常取值 X264_CSP_I420,所有可能取值定义在x264.h中
int     i_plane;        //  图像平面个数,例如彩色空间是YUV420格式的,此处取值3
int     i_stride[4];    // 每个图像平面的跨度,也就是每一行数据的字节数
uint8_t *plane[4];      //  每个图像平面存放数据的起始地址, plane[0]是Y平面,
            // plane[1]和plane[2]分别代表U和V平面
}  x264_image_t;

x264_picture_t

x264_picture_t 结构体描述一视频帧的特征

typedef struct
{
int   i_type;            // 帧的类型,取值有
X264_TYPE_KEYFRAME、X264_TYPE_P、
                        // X264_TYPE_AUTO等。初始化为
auto,则在编码过程自行控制。
int   i_qpplus1;      // 此参数减1代表当前帧的量化参数值
int   i_pic_struct;   // 帧的结构类型,表示是帧还是场,是逐行还是隔行,
                       // 取值为枚举值 pic_struct_e,定义在x264.h中
int   b_keyframe;  // 输出:是否是关键帧
int64_t   i_pts;     // 一帧的显示时间戳
int64_t   i_dts;     // 输出:解码时间戳。当一帧的pts非常接近0时,该dts值可能为负。

/* 编码器参数设置,如果为NULL则表示继续使用前一帧的设置。某些参数
   (例如aspect ratio) 由于收到H264本身的限制,只能每隔一个GOP才能改变。
  这种情况下,如果想让这些改变的参数立即生效,则必须强制生成一个IDR帧。*/ 
x264_param_t    *param;

x264_image_t     img;            // 存放一帧图像的真实数据
x264_image_properties_t    prop;
x264_hrd_t    hrd_timing;       // 输出:HRD时间信息,仅当i_nal_hrd设置了才有效
void    *opaque;                     // 私有数据存放区,将输入数据拷贝到输出帧中
} x264_picture_t ;

x264_nal_t

x264_nal_t中的数据在下一次调用x264_encoder_encode之后就无效了,因此必须在调用
x264_encoder_encode 或 x264_encoder_headers 之前使用或拷贝其中的数据。

typedef struct
{
int  i_ref_idc;        // Nal的优先级
int  i_type;           // Nal的类型
int  b_long_startcode; // 是否采用长前缀码0x00000001
int  i_first_mb;       // 如果Nal为一条带,则表示该条带第一个宏块的指数
int  i_last_mb;        // 如果Nal为一条带,则表示该条带最后一个宏块的指数
int  i_payload;        // payload 的字节大小
uint8_t *p_payload;    // 存放编码后的数据,已经封装成Nal单元
} x264_nal_t;

cli_opt_t

结构体主要记录一些与编码关系较小的设置信息,其变量可通过读取main()的参数获得。

typedef struct
{
   int   b_progress;       // bool类型的变量,用来控制是否显示编码进度。取值为0或1。
   int   i_seek;             // 整数类型 表示开始从哪一帧开始编码。
                                             // 因为不一定从文件的第一帧开始编码,这是可以控制的。

   /* hnd_t(hnd=handle)是一个空指针, 定义在x264cli.h 中。void *在C语言里空指针是有几个
特性的,它是一个一般化指针,可以指向任何一种类型,但却不能解引用,需要解引
用的时候,需要进行强制转换。采用空指针的策略,是为了声明变量的简便和统一。 */
   hnd_t   hin;              // 指向输入yuv文件的指针
   hnd_t  hout;            // 指向编码过后生成的文件的指针。

   /* 一个指向文件类型的指针,它是文本文件,其每一行的格式是 :framenum frametye  
  QP用于强制指定某些帧或者全部帧的帧类型和QP(quant param量化参数)的值. */
   FILE   *qpfile;
} cli_opt_t;

你可能感兴趣的:(X264重要的结构体说明)