`
xpp02
  • 浏览: 1013918 次
社区版块
存档分类
最新评论

X264学习笔记(1)

 
阅读更多

X264学习笔记(1)



X264编码流程

参数的初始化

1.opt,param根据输入的参数和标准的规定,进行初始化设置。

Opt的说明如下:

Opt->hin用于给出读入的yuv文件的指针地址

Opt->hout给出了输出的文件的指针地址

Opt->i_seek给出了起始编码帧的帧数,是由编码时的seek命令参数决定的

如:

X264 -seek 10 -o foreman.cif test.264 352x288

i_seek 设为10,表示起始编码的帧为元序列的第十帧

Opt->qpfile按照说明,为qp值文件输入进行定义这种方式的接口,可以通过读入标准的文件格式,对编码时的qp值进行定义。

Param的说明:

typedef struct

{

/* CPU flags */

unsigned int cpu;

int i_threads; /* divide each frame into multiple slices, encode in parallel */线程数,用于多线程并行编码

/* Video Properties */

int i_width; 图像的宽度

int i_height; 图像的高度

int i_csp; /* CSP of encoded bitstream, only i420 supported */ 色彩空间的设置

int i_level_idc; level 值的设置

int i_frame_total; /* number of frames to encode if known, else 0 */ 总共需要编码的帧数,由--frames设置

Vui参数集

struct

{

/* they will be reduced to be 0 < x <= 65535 and prime */

int i_sar_height;

int i_sar_width;

int i_overscan; /* 0=undef, 1=no overscan, 2=overscan */

/* see h264 annex E for the values of the following */

int i_vidformat;

int b_fullrange;

int i_colorprim;

int i_transfer;

int i_colmatrix;

int i_chroma_loc; /* both top & bottom */

} vui;

int i_fps_num;

int i_fps_den;

这两个参数是由fps帧率确定的,赋值的过程见下:

{

float fps;

if( sscanf( value, "%d/%d", &p->i_fps_num, &p->i_fps_den ) == 2 )

;

else if( sscanf( value, "%f", &fps ) )

{

p->i_fps_num = (int)(fps * 1000 + .5);

p->i_fps_den = 1000;

}

else

b_error = 1;

}

Value的值就是fps。

/* Bitstream parameters */

int i_frame_reference; /* Maximum number of reference frames */

int i_keyint_max; /* Force an IDR keyframe at this interval */

int i_keyint_min; /* Scenecuts closer together than this are coded as I, not IDR. */

int i_scenecut_threshold; /* how aggressively to insert extra I frames */

int i_bframe; /* how many b-frame between 2 references pictures */

int b_bframe_adaptive;

int i_bframe_bias;

int b_bframe_pyramid; /* Keep some B-frames as references */

去块滤波器需要的参数

int b_deblocking_filter;

int i_deblocking_filter_alphac0; /* [-6, 6] -6 light filter, 6 strong */

int i_deblocking_filter_beta; /* [-6, 6] idem */

熵编码

int b_cabac;

int i_cabac_init_idc;

量化

int i_cqm_preset;

char *psz_cqm_file; /* JM format */

uint8_t cqm_4iy[16]; /* used only if i_cqm_preset == X264_CQM_CUSTOM */

uint8_t cqm_4ic[16];

uint8_t cqm_4py[16];

uint8_t cqm_4pc[16];

uint8_t cqm_8iy[64];

uint8_t cqm_8py[64];

/* Log */

void (*pf_log)( void *, int i_level, const char *psz, va_list );

void *p_log_private;

int i_log_level;

int b_visualize;

/* Encoder analyser parameters */

struct

{

unsigned int intra; /* intra partitions */

unsigned int inter; /* inter partitions */

int b_transform_8x8;

int b_weighted_bipred; /* implicit weighting for B-frames */

int i_direct_mv_pred; /* spatial vs temporal mv prediction */

int i_chroma_qp_offset;

int i_me_method; /* motion estimation algorithm to use (X264_ME_*) */

int i_me_range; /* integer pixel motion estimation search range (from predicted mv) */

int i_mv_range; /* maximum length of a mv (in pixels) */

int i_subpel_refine; /* subpixel motion estimation quality */

int b_bidir_me; /* jointly optimize both MVs in B-frames */

int b_chroma_me; /* chroma ME for subpel and mode decision in P-frames */

int b_bframe_rdo; /* RD based mode decision for B-frames */

int b_mixed_references; /* allow each mb partition in P-frames to have it's own reference number */

int i_trellis; /* trellis RD quantization */

int b_fast_pskip; /* early SKIP detection on P-frames */

int b_dct_decimate; /* transform coefficient thresholding on P-frames */

int i_noise_reduction; /* adaptive pseudo-deadzone */

int b_psnr; /* Do we compute PSNR stats (save a few % of cpu) */

} analyse;

/* Rate control parameters */

struct

{

int i_rc_method; /* X264_RC_* */

int i_qp_constant; /* 0-51 */

int i_qp_min; /* min allowed QP value */

int i_qp_max; /* max allowed QP value */

int i_qp_step; /* max QP step between frames */

int i_bitrate; 比特率 --bitrate控制

int i_rf_constant; /* 1pass VBR, nominal QP */

float f_rate_tolerance;

int i_vbv_max_bitrate;

int i_vbv_buffer_size;

float f_vbv_buffer_init;

float f_ip_factor;

float f_pb_factor;

/* 2pass */

int b_stat_write; /* Enable stat writing in psz_stat_out */

char *psz_stat_out;

int b_stat_read; /* Read stat from psz_stat_in and use it */

char *psz_stat_in;

/* 2pass params (same as ffmpeg ones) */

char *psz_rc_eq; /* 2 pass rate control equation */

float f_qcompress; /* 0.0 => cbr, 1.0 => constant qp */

float f_qblur; /* temporally blur quants */

float f_complexity_blur; /* temporally blur complexity */

x264_zone_t *zones; /* ratecontrol overrides */

int i_zones; /* sumber of zone_t's */

char *psz_zones; /* alternate method of specifying zones */

} rc;

/* Muxing parameters */

int b_aud; /* generate access unit delimiters */

int b_repeat_headers; /* put SPS/PPS before each keyframe */

int i_sps_id; /* SPS and PPS id number */

} x264_param_t;

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics