codec基礎知識的學習

2021-09-27 06:39:08 字數 2953 閱讀 8590

這些幀型別用於提供更好的壓縮率,我們將在下一章看到這是如何發生的。現在,我們可以想到 i 幀是昂貴的,p 幀是便宜的,最便宜的是 b 幀。b利用前後的資訊進行壓縮,便是指前後的參考幀中都有較大的變化。

hevc學習,其參考**為hm ,梳理hm**中的各個環節,並且分階段,弄懂其意思是跨過門檻的第乙個環節。

幀內**:

7、幀內**的詳解(入口函式:xcheckrdcostintra): 

7.1、對於亮度分量: 

7.1.1、呼叫estintrapredqt。主要做模式選擇的工作,負責選出對於當前pu的最優模式,如dc、planar、角度等模式。 

(1)首先對n個候選模式進行粗粒度篩選。代價函式是satd+λ*modebits。選出若干個可能的候選模式。下面是相關的函式。 

(2)predintralumaang。計算當前pu的**值。 

(3)calchad。計算satd代價。 

(4)xmodebitsintra。計算當前模式所消耗的位元數。 

(5)xupdatecandlist。更新模式的代價,保持前n個模式的代價最小。 

(6)選出n個模式之後,這n個模式會進入xrecurintracodingqt函式繼續處理。 

7.1.2、呼叫xrecurintracodingqt。根據選出的模式進行pu的分割,然後進行變換量化等工作。 

(1)這個函式會被呼叫兩次,第一次呼叫直接把pu當作tu,只為算出n個模式的rd代價, 從而選出乙個最優的,在這個最優的模式被選出後,再次呼叫這個函式,對這個最優的模式進行pu的分割。下面的是相關的函式。 

(2)xintracodinglumablk。對當前tu進行求殘差,對殘差進行變換、量化、反量化、反變換、重建等一系列工作,並求出失真。 

(3)xgetintrabitsqt。求出當前模式的所有資訊進行熵編碼會產生的位元數。 

(4)calcrdcos。根據 xintracodinglumablk得到的失真和 xgetintrabitsqt產生的位元數進行rd代價的計算,從而比較各個模式的優劣。 

(5)xsetintraresultqt。儲存最優模式的資料。 

7.2、對於色度分量,過程和亮度大部分一樣。

幀間**:

8.1、幀間分為兩種方式,一種是預設的inter模式(入口函式xcheckrdcostinter),另一種是merge模式(入口函式xcheckrdcostmerge2nx2n)。 

8.2、inter模式的呼叫流程:xcheckrdcostinter——>predintersearch——>encoderesandcalcrdintercu 

8.3、merge模式的呼叫流程:xcheckrdcostmerge2nx2n——>motioncompensation——>encoderesandcalcrdintercu 

8.4、predintersearch進行的是me(運動估計)和mc(運動補償)的過程。 

8.5、motioncompensation進行的是mc的工作。因為merge進行的是mv**,因此沒有me(運動估計)的過程。 

8.6、encoderesandcalcrdintercu。根據**值,求出殘差,然後進行tu的劃分,然後進行變換、量化等操作以及rd代價的計算。流程圖如下: 

8.6.1、encodeskipflag。對skip模式的標誌進行編碼。 

8.6.2、encodemergeindex。對mvp的索引進行編碼。 

8.6.3、xestimateresidualqt。在非skip模式的時候,進行rqt的決定(即應該把pu分割成什麼樣的tu)。 

8.6.4、xaddsymbolbitsinter。計算當前模式在進行熵編碼時產生的位元數。 

8.6.5、xsetresidualqtdata。儲存當前最優的殘差資訊。

一、hevc中熵編碼採用的技術

1、零階(或者k階)哥倫布指數編碼(變長編碼,類似於哈夫曼編碼那樣),主要用於vps、sps、pps、slice頭部資訊的編碼

2、cabac(算數編碼),主要用於資料和引數的編碼

265 reference code hm 學習筆記

1. 關於層次的劃分,在一幀影象中,並非所有的ctu都是幀間**或是幀內**,而是更具計算rd的值進行選擇。

在**中,pu, tu與cu的關係是,根據樹形關係來,進行組織?

2. hevc中的z順序掃瞄與其他不同的地方,一般為從左到右,從上到下的順序進行掃瞄,但由於在hevc中的cu樹形組織結構,基本為,在同乙個樹高上的cu按照這樣的順序進行。

真正的幀內**都是以pu為劃分單位開始進行的,幀內**的首要步驟是對於左邊與上邊的相鄰邊界進行取樣操作,獲得取樣數值,但依然需要對其進行濾波處理。

從**中,我們是否能夠看到,在每讀入以幀yuv之後,我們就開始進行了編碼工作,具體包括為,幀內幀間**,轉換量化,熵編碼與環路濾波,接下來應該分析,擁有依賴關係的b幀,其編碼順序可能會有所調整。

幀內**中的dc模式,planar,和一般的角度模式之間的區別。如何計算**角度處,沒有弄懂,原本的35個角度模式,是如何與我們所得出的邊界取樣點之間對應起來,且其返回值是什麼,其實,xpredintraang函式的根本任務是,將pu塊按照相應的角度模式進行填充,並將其放在ptruedst形參中進行返回,以便進行rd判斷運算,以此來確定,何種的角度模式是最合適的壓縮模式。(可以觀察這段**,看其是如何將乙個較為複雜的邏輯,使用簡單的**進行表述)

運動估計與運動補償的區別和關係,運動估計是擁有位移向量,而運動補償是還需要進行殘差計算

幀間**可以分為兩個過程:運動估計和運動補償。

運動估計(motion estimation,me)——提取當前影象運動資訊的過程。為當前編碼塊在已編碼塊中尋找最佳估計快,使得**塊與當前塊殘差盡可能的小,並計算當前塊的偏移mv(motion vector)。

運動補償(motion compensate,mc)——根據運動向量和幀間**方法,求得當前幀的估計值。

基礎知識學習

format 字串格式化的一種方式 10月 日 format 1 10月 日 format 1,2,3 10月 日 format 月 日 format 1,2,3 月 日 format 1 一 列表推導式 幫助快速的生成包含一堆資料的列表 i 10 for i in range 10 10 11,1...

集合的基礎知識學習

集合的基礎知識學習 劉意的課程筆記 public class collectiondemo 輸出 add方法永遠都是正確的,由此可見arraylist是可以存重複物件的 增加和刪除改動了集合,但是判斷不會 再看一下帶all的方法 因為add和addall都返回的是true,所以新增一定是可以的,說明...

QT學習 基礎知識

qt把它所支援的平台分兩級,第一級是重點支援的,第二級次之 第一級平台 platform compilers linux 32 and 64 bit gcc 4.2 microsoft windows xp gcc 4.4 mingw 32 bit msvc 2003,2005 32 and 64 ...