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;
?