JM86 中 POC 的計算方法

2021-06-21 11:47:12 字數 3511 閱讀 6807



一·引數說明

這一節闡述的是 encoder.cfg 中的引數對編碼過程的影響

要注意的是 encoder.cfg 中的引數跟 input 結構體中的變數是一一對應的

二·pic_order_cnt_type 為 0 的情況

這種情況下顯式的計算 poc

(1) 編碼端 i 幀或 p 幀 toppoc 的計算

這個過程在 main()函式的組迴圈

「for (img->number=0; img->number < input->no_frames; img->number++)」

中實現

intraperiod 或 idrintraenable 為零時

這種情況下只有第乙個 i 幀是 idr 幀,比較簡單。對於 i 幀或 p 幀,其頂場的 poc 為

(img->number) * (2*(input->successive_bframe+1))

intraperiod 和 idrintraenable 都不為零時

這種情況下每個 i 幀都是 idr 幀,其 poc 必須設定為零,i 幀出現的頻率為 intraperiod,

故其 toppoc 為

(img->number % input->intra_period) * (2*(input->successive_bframe+1))

z    說明:

原程式中使用了巨集定義 img_number

「#define img_number (img->number - start_frame_no_in_this_igop)」

通過搜start_frame_no_in_this_igop 可知這個變數在numberofframeinsecondigop 為0

(encoder_main.cfg 中就是這樣設定的)時恒為 0,故有

img_number = img->number

(2) 編碼端 b 幀 poc 的計算

由表一可知,在編完一 i 幀或 p 幀之後才開始對它前面的 b 幀進行編碼

for (img->number=0; img->number < input->no_frames; img->number++)

intraperiod 或 idrintraenable 為零時 toppoc 等於

2+(img->number-1) * (2*(input->successive_bframe+1))  

+2* (img->b_frame_to_code-1)

a)    第乙個 2 指得是 idr 的兩個場;

b)    img->number 要減一是因為要對當前幀(img->number)前面的 b 幀進行編碼;

intraperiod 和 idrintraenable 都不為零時 toppoc 等於

2+(img->number % input->intra_period-1) * (2*(input->successive_bframe+1))+2* (img->b_frame_to_code-1)

idr 幀前面

(3) toppoc 到 pic_order_cnt_lsb 的轉化

img->pic_order_cnt_lsb

=img->toppoc &

~((((unsigned int)( –1)) << (log2_max_pic_order_cnt_lsb_minus4+4)))

(unsigned int)(-1)的十六進製制形式是 0xffffffff,即它的每一位都是 1;

log2_max_pic_order_cnt_lsb_minus4+4 是圖象數目(包括 b 幀)最大值的位數

當 toppoc >0 時,img->pic_order_cnt_lsb=img->toppoc

當 toppoc <0 時,img->pic_order_cnt_lsb= max_pic_order_cnt+ img->toppoc

其中 max_pic_order_cnt=1<<( log2_max_pic_order_cnt_lsb_minus4+4)

疑問:

不知道 toppoc 到 pic_order_cnt_lsb 這個過程有什麼意義;

poc 的值會從 0 變到很大,為什麼不對它進行熵編碼;

(4) 解碼端 toppoc 的恢復(2)演算法思想以及其解碼端的實現

對於 idr 幀,poc = 0;

對於 i 幀或 p 幀

poc = frame_num*2*(input->successive_bframe+1)

或    

poc = 2*(input->successive_bframe+1)

+ (frame_num – 1)*2*(input->successive_bframe+1)

解碼端實現

poc = img->expectedpicordercnt

+ img->delta_pic_order_cnt[0]

+ active_sps->offset_for_non_ref_pic

變數說明

a)    其中 img->b_frame_to_code 請參見標題一·(2)

b)    img->disposable_flag = (nalu->nal_reference_idc = = 0),而 nal_reference_idc 只在 b 幀時為0,即img->disposable_flag 只在b 幀時為1。這也是在b 幀情況下img->absframenum

要比 i 幀或 p 幀多減去乙個 1 的原因。

c)    其它變數參見下面小題;

(3)編碼端引數設定

a)    img->num_ref_frames_in_pic_order_cnt_cycle:

這個引數在 init_poc( )函式中設定為 1 後就再沒改動過;

b)    img->offset_for_ref_frame[0] :

在 storedbpictures 為 0 時等於 2*(input->successive_bframe+1);

c)    img->offset_for_ref_frame[1] :

沒什麼用,264 標頭檔案中不會儲存此變數;

d)    img->delta_pic_order_cnt[0]    :

這個變數只對 b 幀有用,等於 2*(img->b_frame_to_code –1); 對於 i 幀或 p 幀, 其值為 0;

e)    active_sps->offset_for_non_ref_pic:

只對 b 幀有用,在 storedbpictures 為 0 時等於–2*input->successive_bframe,

#h264

H 264碼流結構及JM8 6中碼流的產生步驟

整理自 h.264碼流結構示意圖 nalu第一位元組包括3個語法結構 forbidden zero bit 1 1bit禁止位,一般為0 nal ref idc 2 2bit 表示該nal單元的重要性,nal unit type 5 5bit 表示nalu型別加起來正好乙個位元組,如下圖所示 對so...

AUC的計算方法

在機器學習的分類任務中,我們常用許多的指標,諸如召回率 recall 準確率 precision f1值 auc等。相信這個問題很多玩家都已經明白了,簡單的概括一下,auc are under curve 是乙個模型的評價指標,用於分類任務。那麼這個指標代表什麼呢?這個指標想表達的含義,簡單來說其實...

mAP的計算方法

git開源專案 比如unsky的fpn 中test net.py呼叫test.py下的def test net net,imdb,max per image 1000,thresh 0.05,vis false 函式。之後會順一遍,先介紹下思路 假設一張測試有3個標定好的ground truth 黑...