现在的位置: 首页 > 综合 > 正文

X264学习笔记(1)

2013年11月16日 ⁄ 综合 ⁄ 共 5593字 ⁄ 字号 评论关闭

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;

 

抱歉!评论已关闭.