x264

x264

1. x264調用主要過程

x264_param_default():設置參數集結構體x264_param_t的缺省值。
x264_picture_alloc():爲圖像結構體x264_picture_t分配內存。
x264_encoder_open():打開編碼器。
x264_encoder_encode():編碼一幀圖像。
x264_encoder_close():關閉編碼器。
x264_picture_clean():釋放x264_picture_alloc()申請的資源。html

x264_encoder_open()調用了下面的函數:
x264_validate_parameters():檢查輸入參數(例如輸入圖像的寬高是否爲正數)。
x264_predict_16x16_init():初始化Intra16x16幀內預測彙編函數。
x264_predict_4x4_init():初始化Intra4x4幀內預測彙編函數。
x264_pixel_init():初始化像素值計算相關的彙編函數(包括SAD、SATD、SSD等)。
x264_dct_init():初始化DCT變換和DCT反變換相關的彙編函數。
x264_mc_init():初始化運動補償相關的彙編函數。
x264_quant_init():初始化量化和反量化相關的彙編函數。
x264_deblock_init():初始化去塊效應濾波器相關的彙編函數。
x264_lookahead_init():初始化Lookahead相關的變量。
x264_ratecontrol_new():初始化碼率控制模塊。緩存

x264_encoder_headers()調用了下面的函數:
x264_sps_write():輸出SPS
x264_pps_write():輸出PPS
x264_sei_version_write():輸出SEIide

x264_encoder_encode()調用了下面的函數:
x264_frame_pop_unused():獲取1個x264_frame_t類型結構體fenc。若是frames.unused[]隊列不爲空,就調用x264_frame_pop()從unused[]隊列取1個現成的;不然就調用x264_frame_new()建立一個新的。
x264_frame_copy_picture():將輸入的圖像數據拷貝至fenc。
x264_lookahead_put_frame():將fenc放入lookahead.next.list[]隊列,等待肯定幀類型。
x264_lookahead_get_frames():經過lookahead分析幀類型。該函數調用了x264_slicetype_decide(),x264_slicetype_analyse()和x264_slicetype_frame_cost()等函數。通過一些列分析以後,最終肯定了幀類型信息,而且將幀放入frames.current[]隊列。
x264_frame_shift():從frames.current[]隊列取出一幀用於編碼。
x264_reference_update():更新參考幀列表。
x264_reference_reset():若是爲IDR幀,調用該函數清空參考幀列表。
x264_reference_hierarchy_reset():若是是I(非IDR幀)、P幀、B幀(可作爲參考幀),調用該函數(還沒研究)。
x264_reference_build_list():建立參考幀列表list0和list1。
x264_ratecontrol_start():開啓碼率控制。
x264_slice_init():建立 Slice Header。
x264_slices_write(): 編碼數據(最關鍵的步驟)。其中調用了x264_slice_write()完成了編碼的工做(注意「x264_slices_write()」和「x264_slice_write()」名字差了一個「s」)。
x264_encoder_frame_end():編碼結束後作一些後續處理,例如釋放一些中間變量以及打印輸出一些統計信息。其中調用了x264_frame_push_unused()將fenc從新放回frames.unused[]隊列,而且調用x264_ratecontrol_end()關閉碼率控制。函數

x264_slice_write()中如下幾個函數比較重要:
x264_nal_start():開始寫一個NALU。
x264_macroblock_thread_init():初始化存儲宏塊的重建數據緩存fdec_buf[]和編碼數據緩存fenc_buf[]。
x264_slice_header_write():輸出 Slice Header。
x264_fdec_filter_row():濾波模塊。該模塊包含了環路濾波,半像素插值,SSIM/PSNR的計算。
x264_macroblock_cache_load():將要編碼的宏塊的周圍的宏塊的信息讀進來。
x264_macroblock_analyse():分析模塊。該模塊包含了幀內預測模式分析以及幀間運動估計等。
x264_macroblock_encode():宏塊編碼模塊。該模塊經過對殘差的DCT變換、量化等方式對宏塊進行編碼。
x264_macroblock_write_cabac():CABAC熵編碼模塊。
x264_macroblock_write_cavlc():CAVLC熵編碼模塊。
x264_macroblock_cache_save():保存當前宏塊的信息。
x264_ratecontrol_mb():碼率控制。
x264_nal_end():結束寫一個NALU。ui

幾個模塊:編碼

濾波模塊:環路濾波,半像素插值,SSIM,PSNR計算
分析模塊:幀間預測,運動估計
碼率控制模塊:碼率控制
宏塊編碼模塊:DCT變換、量化
熵編碼模塊:CAVLC、CABACspa

chrominance(chroma), luminance(luma)code

相關文章
相關標籤/搜索