1. 程式人生 > >H.264編碼系統幾個比較重要的演算法

H.264編碼系統幾個比較重要的演算法

H.264編碼系統比較複雜,這裡是它的幾個比較重要的演算法:

1. Configure()函式,用於解析命令列引數,讀取配置檔案,其中,ac表示命令列引數數量,av表示命令列引數。void Configureint ac, char *av[ ]{……}

2. AllocNalPayloadBuffer()函式,用於初始化NAL模組,即分配NAL_Payload_buffer緩衝區。AllocNalPayloadBuffer(){……}

3. init_poc()函式的作用是用適合的引數初始化程序結構。init_poc(){……}

4. init_img()函式的作用是用合適的引數初始化影象結構,其中輸入引數結構為inp_par *inp

;輸出引數結構為img_par *img

5. malloc_picture()函式用於按照資料結構分配影象結構,其返回值為一個指向影象的指標。Picture *malloc_picture(){……}

6. init_rdopt()函式產生用於RD_最優化模式判斷結構。void init_rdopt(){……}

7. init_dpb()函式分配用於解碼影象所需的緩衝區並初始化值。void init_dpb(){……}

8. init_out_buffuer()函式用於初始化輸出緩衝區以便直接輸出。

9. init_global_buffers()函式為Global.h檔案中定義的全域性緩衝區分配動態記憶體,分配的記憶體必須在free_global_buffers

()函式中釋放。其中,輸入引數為inp_par *inp和影象引數結構img_par *img;輸出引數為分配的記憶體位元組數。

10.create_context_memory()函式用於建立關聯記憶體。

11.Init_Motion_Search_Module()函式用於初始化運動搜尋。

12.rc_init_seq()函式用於初始化速率控制引數。

13.encode_one_frame()函式為幀編碼函式。

關於encode_one_frame ()中的幾個主要函式的簡單說明

encode_one_frame ()
從這個函式開始才開始真正進入編碼階段,在次之前都是做的一些準備工作,但是這個函式不是核心函式,這個函式的主要功能是通過呼叫其他的函式對一幀資料進行編碼,每呼叫該函式一次,處理完一幀資料。剛進入encode_one_frame ()

,前面幾個函式如put_buffer_frame();CalculateFrameNumber(); init_frame ();等都比較簡單。
frame_picture (frame_pic)
函式是encode_one_frame ()這個函式中的主要函式!完成一幀資料的編碼是通過這個函式來實現的。下面來看看這個函式具體做了那些事情。進入函式,首先為要編碼的影象申請空間並進行初始化,比較簡單,沒什麼好說的。看看這個函式code_a_picture(frame);看函式名就知道它是這個函式中的最重要的函式。繼續跟蹤下去,看看code_a_picture(frame)這個函式的內容。進入這個函式體,直接看FmoInit()這個函式,這個函式與片組相關,確定巨集塊到片組的對映關係。主要呼叫
FmoGenerateMapUnitToSliceGroupMap(img, pps);
  FmoGenerateMBAmap(img, sps);
這兩個函式,前面一個函式主要根據slice_group_map_type這個變數決定片到片組的對映關係,既確定那些片屬於同一個片組。FmoGenerateMBAmap()確定巨集塊到片的對映,既那些巨集塊屬於一個片。
FmoStartPicture ()
得到每一個片中的第一個巨集塊地址。看看下面這個迴圈

while (NumberOfCodedMBs < img->total_number_mb)       // loop over slices
  {
    while (!FmoSliceGroupCompletelyCoded (SliceGroup))
    {
      NumberOfCodedMBs += encode_one_slice (SliceGroup, pic);
      FmoSetLastMacroblockInSlice (img->current_mb_nr);
      // Proceed to next slice
      img->current_slice_nr++;
      stat->bit_slice = 0;
    }
  }
可以說是編碼器的核心地方,外層迴圈以片為單位迴圈編碼所有片,內層迴圈以片組為單位迴圈處理每個片組中的所有片資料。順便說一下,若想一個frame中有多個slice,配置檔案中設定如下的引數可以實現
##########################################################################################
# Error Resilience / Slices
##########################################################################################
SliceMode             =  0   # Slice mode (0=off 1=fixed #mb in slice 2=fixed #bytes in slice 3=use callback)
SliceArgument         = 50   # Slice argument (Arguments to modes 1 and 2 above)
num_slice_groups_minus1 = 0  # Number of Slice Groups Minus 1, 0 == no FMO, 1 == two slice groups, etc.
slice_group_map_type    = 6  # 0:  Interleave, 1: Dispersed,    2: Foreground with left-over,
                             # 3:  Box-out,    4: Raster Scan   5: Wipe
                             # 6:  Explicit, slice_group_id read from SliceGroupConfigFileName
slice_group_change_direction_flag = 0    # 0: box-out clockwise, raster scan or wipe right,
                                         # 1: box-out counter clockwise, reverse raster scan or wipe left
slice_group_change_rate_minus1    = 85   #
SliceGroupConfigFileName          = "sg6conf.cfg"   # Used for slice_group_map_type 0, 2, 6
UseRedundantSlice     = 0    # 0: not used, 1: one redundant slice used for each slice (other modes not supported yet)

SliceMode             =  0  
為預設值,既不使用分組,也就是一幀為一個slice。具體的可以參照相應資料。下面看看這個函式中的核心函式encode_one_slice();看名字也知道是對一個slice進行編碼!下面進入這個函式體:
CurrentMbAddr = FmoGetFirstMacroblockInSlice (SliceGroupId);
 取得當前片的第一個巨集塊,init_slice(),為當前要編碼的slice申請一個Slice型別結構體,並進行初始化。
len = start_slice ()
函式,寫slice_header.
while (end_of_slice == FALSE)
{
...............
........................
}
這個迴圈對每個slice進行編碼,用幀或場方式。不管是哪種編碼方式,核心函式是encode_one_macroblock ();可以說這才是整個編碼器的核心部分!關於這個函式的結構可以參照firsttime 的 encode_one_macroblock()的程式結構——Wisting
(說明:由於本人主要研究的不是jm程式碼,要是有寫的不對的地方,請指教共同學習,關於其中涉及的各個函式,哪位熟悉的話,如果願意,可以跟帖補充具體的內容)

相關推薦

H.264編碼系統比較重要演算法

H.264編碼系統比較複雜,這裡是它的幾個比較重要的演算法: 1. Configure()函式,用於解析命令列引數,讀取配置檔案,其中,ac表示命令列引數數量,av表示命令列引數。void Configure(int ac, char *av[ ]){……} 2. A

webservice 教程學習系列(四)——webservice 中比較重要的術語

(1)wsdl:webservice definition language(直譯webservice定義語言) 1.對應一種型別檔案.wsdl 2.定義了webservice的伺服器端和客戶端應用互動傳遞請求和響應資料的格式和方式; 3.一個webservice對應一個wsdl文件;

Hadoop安裝包目錄下比較重要的目錄及其作用

1、sbin目錄:存放啟動或停止hadoop相關服務的指令碼 2、bin目錄:存放對hadoop相關服務(HDFS,YARN)進行操作的指令碼 3、etc目錄:hadoop的配置檔案目錄,存放hadoop的配置檔案 4、share目錄:存放hadoop的依

Java 基礎回顧:比較重要的預定義類

這篇文章中梳理了 Java 中幾個常見的預定義類:字串型別 String 類、Object 類、列舉型別 Enum 類以及陣列。 1、字串 String 類 1.1 字串相關問題總結 String 的每一個看起來會修改 String 的方法實際都是建立一個全新的

用caffe作實際專案的話應該有比較重要的地方

1、準備訓練資料,並選定一種caffe的資料輸入格式;2、設計網路結構,一般有參考論文的話都會給出它的網路架構吧,在參照caffe裡面的網路結構配置檔案修改就行;3、如果輸出層節點不止一個,也就是多標籤預測,可以將輸入資料和multilabel打包成hdf5檔案格式;不知道caffe現在有直接支援多label

為什麼NVIDIA NVENC 硬體H.264編碼器對XD和Horizon如此重要

本文翻譯自Magnar Johnsen的一篇文章,該文章論述了在Citrix XenDesktop和VMware Horizon解決方案中,如果使用了NVIDIA GRID card的NVENC的功能,那麼對於使用3D軟體的使用者來說,無論是效能還是使用者體驗,都有較大的提升。根據個人理解翻譯,如有理解不對的

H.264編碼格式分析

mas rail head nalu 比特流 包括 val slice raw   H.264的重要性不再提了。本文主要記錄一下H.264的編碼格式。H.264官方文檔:https://github.com/jiayayao/DataSheet/tree/master/en

【轉】 H.264編碼原理以及I幀B幀P幀

獨立 像素 疊加 提高 oss 解壓 防止 相同 大小 轉自:http://www.cnblogs.com/herenzhiming/articles/5106178.html 前言 ----------------------- H264是新一代的編碼標準,

Android比較有用的插件

好用 ror ring ble androi bsp colors http com 1、Android Drawable Importer 2、Android ButterKnife Zelezny 3、Android Holo Colors Gener

Android比較有用的外掛

 1、Android  Drawable Importer 2、Android ButterKnife Zelezny 3、Android  Holo Colors Generator 4、Robotium Recorder &n

C++實現RTMP協議傳送H.264編碼及AAC編碼的音視訊直播

  RTMP(Real Time Messaging Protocol)是專門用來傳輸音視訊資料的流媒體協議,最初由Macromedia 公司建立,後來歸Adobe公司所有,是一種私有協議,主要用來聯絡Flash Player和RtmpServer,如FMS, Red5, 

H.264---編碼架構分析

一、編碼架構分析   編碼器有兩條資料通道:前向通道和重建通道。在前向通道中,編碼器的輸入是幀Fn,每幀是以16X16畫素大小的巨集塊單元組成的,每個巨集塊進行幀內或幀間預測編碼。幀間預測的參考幀為前一幀Fn‘,實際上,參考幀的數量可以多達五幀。當前塊減去其預測塊P得到殘差Dn,Dn經過

C++實現RTMP協議傳送H.264編碼及AAC編碼的音視訊

作者HBStream   RTMP(Real Time Messaging Protocol)是專門用來傳輸音視訊資料的流媒體協議,最初由Macromedia 公司建立,後來歸Adobe公司所有,是一種私有協議,主要用來聯絡Flash Player和RtmpServer

比較新的惡意程式 AntiVir全報,kaspersky保持沉默的時候多

                endurer 原創2006-12-16 第1版線上掃描幾個從網上下載的惡意程式檔案的結果。檔案說明符 : D:/cl.exe屬性 : A---獲取檔案版本資訊大小失敗!建立時間 : 2006-12-16 12:58:44修改時間 : 2006-12-16 12:58:45訪問

H.264編碼原理以及I幀B幀P幀

H264是新一代的編碼標準,以高壓縮高質量和支援多種網路的流媒體傳輸著稱,在編碼方面,我理解的他的理論依據是:參照一段時間內影象的統計結果表明,在相鄰幾幅影象畫面中, 一般有差別的畫素只有10%以內的點,亮度差值變化不超過2%,而色度差值的變化只有1%

我常用的比較有意思的網站

###部分手段需要/科/學/上/網 上網類 Chrome+Google——程式設計師必備 Tor——深層網路(只可意會不可言傳,自己google) 程式碼託管網站 GitHub ——據說不會用Github的程式設計師不是

推薦比較好的筆記/部落格

印象筆記 跨平臺 多人協作 不支援markdown 有第三方付費可支援markdown 有道筆記 跨平臺 為知筆記 跨平臺 多人協作 支援markdown 簡書 部落格

H264編碼器6( H.264整數DCT公式推導及蝶形演算法分析)

來自:https://www.cnblogs.com/xkfz007/archive/2012/07/31/2616791.html   這是網上的一篇文章, 我重新讀了一下, 然後做了一些整理 1.為什麼要進行變換 空間影象資料通常是很難壓縮的:相鄰的取樣點具有很強的相關

H.264編碼原理以及I幀B幀P幀-------淺談

寫在前面:       H264是新一代的編碼標準,以高壓縮高質量和支援多種網路的流媒體傳輸著稱,在編碼方面,我理解的他的理論依據是:參照一段時間內影象的統計結果表明,在相鄰幾幅影象畫面中, 一般有差別的畫素只有10%以內的點,亮度差值變化不超過2%,而色度差值的變化只有

比較有用的php內建函式

程式碼級別的小優化之一:優先使用php內建函式以下幾個是可以用到內建函式的場景1.filter_var函式    比如用在驗證輸入文字是不是郵箱地址:filter_var('[email protected]',FILTER_VALIDATE_EMAIL);返回的值