X264閱讀筆記1

2021-06-09 14:12:53 字數 2749 閱讀 9381

264**閱讀筆記,版本是20060309。

一、函式入口main  x264.c

1、呼叫x264_param_default 設定預設的編碼引數。

2、呼叫parse 轉換 命令列引數

3、進入encode函式,開始編碼

二、encode x264.c

1、p_get_frame_total獲取要編的總數

2、x264_encoder_open建立x264編碼器,配置引數

3、p_set_outfile_param設定輸出檔案引數

4、x264_picture_alloc分配原始影象的記憶體空間

5、for 迴圈編碼每一幀

6、encode_frame 編碼一幀影象,並nal打包

7、編完剩餘的b幀

8、x264_picture_clean釋放分配的影象空間

9、x264_encoder_close關閉編碼器

10、p_close_infile和p_close_outfile關閉輸入和輸出檔案。

三、encode_frame x264.c

1、x264_encoder_encode編一幀影象

2、for迴圈,用x264_nal_encode打nal包,用p_write_nalu寫出nal碼流。

四、x264_encoder_encode  encoder.c

1、x264_frame_get 申請空間,fenc指向新空間

2、x264_frame_copy_picture 將影象資料從pic_in 拷貝到fenc

3、如果影象的寬高不是16對齊,用x264_frame_expand_border_mod16對資料進行擴充套件

4、x264_frame_put 將fenc放到next指標陣列中

5、當使用低解析度影象時,用x264_frame_init_lowres作處理

6、if(h->frames.current[0]==null)分支表示填充獲取b幀編碼影象資料,後面再說

7、從current中獲取編碼影象拷貝到fenc中,用x264_frame_get

8、do_encode 開始編碼

9、根據要編碼的幀型別設定nal的型別和slice條帶的型別。如果是idr,要用x264_reference_reset重置參考幀。

10、計算poc、幀號、幀型別、當前幀是否作為參考幀等

11、x264_reference_build_list構建參幀鍊錶,list0和list1

12、用x264_ratecontrol_start開始位元速率控制,用x264_ratecontrol_qp獲取當前幀的qp值

13、如果是b幀,用x264_macroblock_bipred_init初始化雙向**

14、x264_slice_init初始化條帶頭資訊

15、用bs_init初始化輸出bit流資訊

16、寫aud nal、sei nal、sps nal和pps nal資訊。

17、呼叫x264_slices_write開始巨集塊編碼

五、x264_slices_write encoder.c

1、用單執行緒編碼,呼叫x264_slice_write編碼

2、用x264_nal_start開始寫nal,用x264_slice_header_write寫條帶頭資訊到碼流中

3、如果使用cabac,要初始化cabac環境。呼叫x264_cabac_context_init和x264_cabac_encode_init。

4、for對每個巨集塊進行編碼。

5、先計算當前巨集塊的索引,i_mb_y和i_mb_x。

6、x264_macroblock_cache_load獲取當前巨集塊左側和上側相鄰巨集塊的資料

7、x264_macroblock_analyse決定當前巨集塊的最佳編碼模式。i幀用9種4x4模式和4種16x16模式。p幀用幀內**的4x4模式和16x16模式,或用幀間16x16、16x8,8x16,8x8,

8x4,4x8,4x4。選擇能生成最小sad值的模式為當前巨集塊的編碼模式。

8、x264_mb_analyse_init初始化分析引數

9、i幀呼叫x264_mb_analyse_intra決定幀內模式、p幀和b幀要複雜

10、先看p幀**。p幀**中含有i幀的幀內**。先判斷p幀是否可以skip,用編碼。如果是跳過用x264_macroblock_probe_pskip。

11、x264_mb_analyse_load_costs分配運動向量空間。x264_mb_analyse_inter_p16x16分析幀間16x16模式。模式代價值analysis.l0.me16x16.cost。

12、if判斷是否使用了16x16子塊模式。如用了,呼叫x264_mb_analyse_inter_p8x8_mixed_ref和x264_mb_analyse_inter_p8x8對幀間8x8模式進行**。模式代價值analysis.l0.i_cost8x8。

13、如果上述8x8模式的代價小於16x16模式的值,對8x8模式進一步分成4x4模式。當然要配置了8x8的子塊模式。4個8x8塊,對4個4x4塊進行模式選擇,呼叫x264_mb_analyse_inter_p4x4完成,得到analysis.l0.i_cost4x4[i]4個4x4塊的代價和。如果4x4模式的代價analysis.l0.i_cost4x4[i]比8x8模式代價analysis.l0.me8x8[i].cost小,

再對8x8模式劃分成8x4和4x8模式,用x264_mb_analyse_inter_p8x4和x264_mb_analyse_inter_p4x8完成。

今天到這來,下次繼續16x8和8x16模式的分析。

x264使用示例

note x264的編碼示例.使用x264的版本為libx264 115 1.示例是個死迴圈,會源源不斷的編碼,然後將資料寫檔案.2.示例的行為是 編碼1000幀後,取空編碼緩衝區,然後迴圈執行這兩步.author 戈 include include include include stdint.h...

編譯安裝x264

網上也有相應的教程,之所以在這裡重申一遍,是因為我試了網上很多的編譯方法,都出現了問題,為此將此編譯安裝方法記錄下來。首先是 獲取x264 的 git clone git linux 下最簡單編譯步驟 1.切換至源 目錄 2.輸入 configure enable shared enable sta...

x264編譯問題合集

1 x264路徑帶空格 錯誤 正在執行自定義生成步驟 nasm error more than one input file specified type nasm h for help project error prj0019 工具從 正在執行自定義生成步驟 特徵 nasm出現錯誤 原因 你的x...