1. 程式人生 > >H264編碼器3( x264重要結構體詳細說明(1): x264_param_t)

H264編碼器3( x264重要結構體詳細說明(1): x264_param_t)

來自:https://blog.csdn.net/explorer_day/article/details/52239009

 

結構體x264_param_t是x264中最重要的結構體之一,主要用於初始化編碼器。以下給出了幾乎每一個引數的含義,對這些引數的註釋有的是參考了網上的資料,有的是自己的理解,還有的是對原始碼的翻譯,由於本人水平有限,錯誤難免,請高手指正。

 

/* 結構體x264_param_t定義在x264.h中 */

typedef struct x264_param_t

{

    /* CPU 標誌位 */

unsigned int cpu;

int  i_threads;                 // 並行編碼多幀; 執行緒數,為0則自動多執行緒編碼

int  b_sliced_threads;          // 如果為false,則一個slice只編碼成一個NALU;

                                // 否則有幾個執行緒,在編碼成幾個NALU。預設為true。

 

int  b_deterministic; // 是否允許非確定性時執行緒優化

int  b_cpu_independent; // 強制採用典型行為,而不是採用獨立於cpu的優化演算法

int  i_sync_lookahead; // 執行緒超前快取幀數

 

 

/* 視訊屬性 */

int  i_width; // 視訊影象的寬

int  i_height; // 視訊影象的高

int  i_csp;          // 編碼位元流的CSP,僅支援i420,色彩空間設定

int  i_level_idc; // 指明作用的level值,可能與編碼複雜度有關

int  i_frame_total;  // 編碼幀的總數, 預設 0

 

 

/* hrd : hypothetical reference decoder (假定參考解碼器) , 檢驗編碼器產生的符合

  該標準的NAL單元流或位元組流的偏差值。藍光視訊、電視廣播及其它特殊領域有此要求 */

int  i_nal_hrd;

 

 

/* vui引數集 : 視訊可用性資訊、視訊標準化選項 */

struct

{

    /* 寬高比的兩個值相對互素,且在(0,  65535] 之間 */

    int  i_sar_height; // 樣本寬高比的高度

int  i_sar_width;     // 樣本寬高比的寬度

 

 

/* 0=undef, 1=no overscan, 2=overscan 過掃描線,

    預設"undef"(不設定),可選項:show(觀看) / crop(去除) */

 

int  i_overscan;

 

 

/* 以下的值可以參見H264附錄E */

int  i_vidformat;     // 視訊在編碼/數字化之前是什麼型別,預設"undef".

                            // 取值有:Component, PAL, NTSC, SECAM, MAC 等

 

int  b_fullrange;           // 樣本亮度和色度的計算方式,預設"off",可選項:off/on

int  i_colorprim;           // 原始色度格式,預設"undef"

int  i_transfer;            // 轉換方式,預設"undef"

int  i_colmatrix;           // 設定從RGB計算得到亮度和色度所用的矩陣係數,預設"undef"

int  i_chroma_loc;          // 設定色度取樣位置,範圍0~5,預設0

} vui;

 

 

/* 位元流引數 */

int  i_frame_reference;         // 最大參考幀數目

int  i_dpb_size;                // Decoded picture buffer size

int  i_keyint_max;              // 設定IDR幀之間的最間隔,在此間隔設定IDR關鍵幀

int  i_keyint_min;              // 設定IDR幀之間的最小間隔, 場景切換小於此值編碼位I幀, 而不是 IDR幀.

int  i_scenecut_threshold;      // 場景切換閾值,插入I幀

int  b_intra_refresh;           // 是否使用週期幀內重新整理替代IDR幀

 

int  i_bframe;                  // 兩個參考幀之間的B幀數目

int  i_bframe_adaptive;         // 自適應B幀判定, 可選取值:X264_B_ADAPT_FAST等

int  i_bframe_bias;             // 控制B幀替代P幀的概率,範圍-100 ~ +100,

  // 該值越高越容易插入B幀,預設0.

int  i_bframe_pyramid;          // 允許部分B幀為參考幀,

  // 可選取值:0=off,  1=strict hierarchical,  2=normal

int  b_open_gop;                // Close GOP是指幀間的預測都是在GOP中進行的。

  // 使用Open GOP,後一個GOP會參考前一個GOP的資訊。

int  b_bluray_compat;           // 支援藍光碟

 

 

/* 去塊濾波器需要的引數, alpha和beta是去塊濾波器引數 */

int  b_deblocking_filter;        // 去塊濾波開關

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

int  i_deblocking_filter_beta;   // [-6, 6] 同上

 

int  b_cabac;                    // 自適應算術編碼cabac開關

int  i_cabac_init_idc;           // 給出算術編碼初始化時表格的選擇

 

int  b_interlaced;               // 隔行掃描

int  b_constrained_intra;

 

 

 /* 量化 */

int  i_cqm_preset;              // 自定義量化矩陣(CQM), 初始化量化模式為flat

char *psz_cqm_file;             // 讀取JM格式的外部量化矩陣檔案,忽略其他cqm選項

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

uint8_t  cqm_4py[16];

uint8_t  cqm_4ic[16];

uint8_t  cqm_4pc[16];

uint8_t  cqm_8iy[64];

uint8_t  cqm_8py[64];

uint8_t  cqm_8ic[64];

uint8_t  cqm_8pc[64];

 

 

/* 日誌 */

void  (*pf_log)( void *, int i_level, const char *psz, va_list );     // 日誌函式

void  *p_log_private;

int    i_log_level;             // 日誌級別,不需要列印編碼資訊時直接註釋掉即可

int    b_visualize;             // 是否顯示日誌

char   *psz_dump_yuv;           //  重建幀的檔名

 

 

/* 編碼分析引數 */

struct

{

unsigned int intra;             //  幀內分割槽

    unsigned int inter;             //  幀間分割槽

 

int  b_transform_8x8;           // 

int  i_weighted_pred;           // P幀權重

int  b_weighted_bipred;         // B幀隱式加權

int  i_direct_mv_pred;          // 時間空間運動向量預測模式

int  i_chroma_qp_offset;        // 色度量化步長偏移量

 

int  i_me_method;               // 運動估計演算法 (X264_ME_*)

int  i_me_range;                // 整畫素運動估計搜尋範圍 (from predicted mv) 

int  i_mv_range;                // 運動向量最大長度. -1 = auto, based on level

int  i_mv_range_thread;         // 執行緒之間的最小運動向量緩衝.  -1 = auto, based on number of threads.

int  i_subpel_refine;           // 亞畫素運動估計質量

int  b_chroma_me;               // 亞畫素色度運動估計和P幀的模式選擇

int  b_mixed_references;        // 允許每個巨集塊的分割槽有它自己的參考號

int  i_trellis;                 // Trellis量化提高效率,對每個8x8的塊尋找合適的量化值,需要CABAC,

  // 0 :即關閉  1:只在最後編碼時使用  2:在所有模式決策上啟用

int  b_fast_pskip;              // 快速P幀跳過檢測

int  b_dct_decimate;            // P幀變換系數閾值

int  i_noise_reduction;         // 自適應偽盲區

int  b_psy;                     // Psy優化開關,可能會增強細節

float  f_psy_rd;                // Psy RD強度

float  f_psy_trellis;           // Psy Trellis強度

 

int  i_luma_deadzone[2];        // 亮度量化中使用的盲區大小,{ 幀間, 幀內 }

int  b_psnr;                    // 計算和列印PSNR資訊

int  b_ssim;                    // 計算和列印SSIM資訊

} analyse;

 

 

/* 位元速率控制引數 */

struct

{

int  i_rc_method;               // 位元速率控制方式 : X264_RC_CQP恆定質量,  

  // X264_RC_CRF恆定位元速率,  X264_RC_ABR平均位元速率

int  i_qp_constant;             // 指定P幀的量化值,0 - 51,0表示無損

int  i_qp_min;                  // 允許的最小量化值,預設10

int  i_qp_max;                  // 允許的最大量化值,預設51

int  i_qp_step;                 // 量化步長,即相鄰兩幀之間量化值之差的最大值

 

int   i_bitrate;                // 平均位元速率大小

float  f_rf_constant;           // 1pass VBR, nominal QP. 實際質量,值越大影象越花,越小越清晰

float  f_rf_constant_max;       // 最大位元速率因子,該選項僅在使用CRF並開啟VBV時有效,

  // 影象質量的最大值,可能會導致VBV下溢。

float  f_rate_tolerance;        // 允許的誤差

int    i_vbv_max_bitrate;       // 平均位元速率模式下,最大瞬時位元速率,預設0

int    i_vbv_buffer_size;       // 位元速率控制緩衝區的大小,單位kbit,預設0

float  f_vbv_buffer_init;       // 設定位元速率控制緩衝區(VBV)緩衝達到多滿(百分比),才開始回放,

  // 範圍0~1.0,預設0.9

float  f_ip_factor;             // I幀和P幀之間的量化因子(QP)比值,預設1.4

float  f_pb_factor;             // P幀和B幀之間的量化因子(QP)比值,預設1.3

 

int   i_aq_mode;                // 自適應量化(AQ)模式。 0:關閉AQ  

  // 1:允許AQ在整個視訊中和幀內重新分配碼

                                // 2:自方差AQ(實驗階段),嘗試逐幀調整強度

 

float  f_aq_strength;           // AQ強度,減少平趟和紋理區域的塊效應和模糊度

 

 

/* MBTree File是一個臨時檔案,記錄了每個P幀中每個MB被參考的情況。

  目前mbtree只處理P幀的MB,同時也不支援b_pyramid. */

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.0 => 恆定位元率,1.0 => 恆定量化值。

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;               // 指定區的另一種方法

} rc;

 

 

/* 裁剪矩形視窗引數:隱式新增到解析度非16倍數的視訊中 */

/* 在碼流層指定一個切除(crop)矩形。若不想x264在編碼時做crop,

   但希望解碼器在回放時進行切除,可使用此項。單位為畫素。 */

struct

{

unsigned int i_left;

    unsigned int i_top;

    unsigned int i_right;

    unsigned int i_bottom;

} crop_rect;

 

/* 編碼3D視訊時,此引數在碼流中插入一個標誌,告知解碼器此3D視訊是如何封裝

  的。3D視訊幀封裝格式:幀封裝、場交錯、線交錯、左右全景、左右半景、上下半

  景、L+深度、L+深度+圖形+圖形深度 */

int  i_frame_packing;

 

/* Muxing複用引數 */

int  b_aud;                     // 生成訪問單元分隔符

int  b_repeat_headers;          // 是否複製sps和pps放在每個關鍵幀的前面

int  b_annexb;                  // 值為true,則NALU之前是4位元組字首碼0x00000001;

  // 值為false,則NALU之前的4個位元組為NALU長度

int  i_sps_id;                  // sps和pps的id號

int  b_vfr_input;               // VFR輸入。1 :時間基和時間戳用於位元速率控制  0 :僅幀率用於位元速率控制

uint32_t  i_fps_num;            // 幀率的分子

uint32_t  i_fps_den;            // 幀率的分母

uint32_t  i_timebase_num;       // 時間基的分子

uint32_t  i_timebase_den;       // 時間基的分母

 

/* 以某個預設模式將輸入流(隔行,恆定幀率)標記為軟交錯(soft telecine)。預設none. 可用預設有:

  none, 22, 32, 64, double, triple, euro.  使用除none以外任一預設,都會連帶開啟--pic-struct */

int  b_pulldown;

int  b_pic_struct;  // 強制在Picture Timing SEI傳送pic_struct. 預設是未開啟

 

/* 將視訊流標記為交錯(隔行),哪怕並非為交錯式編碼。可用於編碼藍光相容的25p和30p視訊。預設是未開啟 */

int b_fake_interlaced;

 

/* 條帶引數 */

 

int  i_slice_max_size;          // 每個slice的最大位元組數,包括預計的NAL開銷

int  i_slice_max_mbs;           // 每個slice的最大巨集塊數,重寫i_slice_count

int  i_slice_count;             // 每幀slice的數目,每個slice必須是矩形

} x264_param_t;