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;