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...