東莞網(wǎng)站制作seo排名優(yōu)化哪家好
vp9協(xié)議筆記📒
本文主要是對vp9協(xié)議的梳理,協(xié)議的細(xì)節(jié)參考官方文檔:
VP9協(xié)議鏈接(需要加速器)
vp9協(xié)議筆記
- vp9協(xié)議筆記📒
- 1. 視頻編碼概述
- 2. 超級幀superframe(sz):
- 2. frame(sz)
- 3. vp9中的一些索引解釋:
- 4. decode-tiles()
- 5. decode_partition
- 6. Residual()
- 7. 參考文獻(xiàn)
1. 視頻編碼概述
🐶視頻編碼的流程大概是預(yù)測 + 殘差 + loop filter(LPF)的模式;
🐭編碼端 : 編碼端首先對圖像進(jìn)行合理的劃分,之后對劃分的塊(CU)采用幀內(nèi)預(yù)測或幀間預(yù)測的方式,對圖像進(jìn)行預(yù)測,篩選出誤差最小的預(yù)測模式,但這樣預(yù)測出來的圖像和原圖像會有很大誤差,這個誤差被稱為殘差(residual, TU);
🐹編碼端可能會對殘差進(jìn)行進(jìn)一步的split劃分(因此TU的大小是小于CU的, H265有對TU進(jìn)一步的劃分, 而vp9中沒有),之后再對劃分后的塊進(jìn)行DCT變換和量化,以減小殘差所占的字節(jié)大小(這一步一般圖像會有少許的損失);
🐰為了彌補(bǔ)變換量化產(chǎn)生的損失,編碼端會編碼一種選擇一種合適的loop_filter(lpf)過濾器的模式,對圖像進(jìn)行補(bǔ)償;
🐺如圖所示, 解碼端拿到預(yù)測模式,根據(jù)預(yù)測模式對圖像進(jìn)行預(yù)測;同時對拿到的殘差進(jìn)行解量化和反變換; 將預(yù)測圖像和接量化,反變換后的殘差相加,再根據(jù)lpf的模式進(jìn)行濾波,就可以完成圖像的解碼了。
2. 超級幀superframe(sz):
superframe( sz ) {for( i = 0; i < NumFrames; i++ )frame( frame_sizes[ i ] )superframe_index( )
}
- 🐸各個幀的解析函數(shù)frame(frame_ize)需要用的fram_size在superframe_index()里,為什么super_frame_index在后面才解碼?
-
- Q1 : 該解析函數(shù)順序并不是真實解碼順序,只是碼流的排列順序。解析超級幀時,整個超級幀的大小sz是已知的,直接先讀取大小為sz的字符串的最后1個字節(jié)(superframe_header),解析后就知道frame的數(shù)量和frame_size的大小;解析完superframe-index然后才開始從頭開始解析各個frame;
-
- Q2. 由于我們編碼完所有的幀信息才能知道各個幀的大小,所以superframe index放在超級幀的后面;而解析的時候是先解析superframe index,再從頭解析各個frame
- 🐯為什么superframe header要解析兩遍
-
- Q : 因為vp9支持superframe,也支持不用superframe的結(jié)構(gòu),解析兩遍(對比一下是否存在這個信息)和superframe-mark標(biāo)志的,一起判斷該段是否為超級幀;
2. frame(sz)
frame( sz ) {startBitPos = get_position( )uncompressed_header( )trailing_bits( )if ( header_size_in_bytes == 0 ) {while ( get_position( ) < startBitPos + 8 * sz)padding_bitreturn}load_probs( frame_context_idx )load_probs2( frame_context_idx )clear_counts( )init_bool( header_size_in_bytes )compressed_header( )exit_bool( )endBitPos = get_position( )headerBytes = (endBitPos - startBitPos) / 8decode_tiles( sz - headerBytes )refresh_probs( )
}
- 🐻uncompress-header()為一些圖像基本信息,bit位寬,YUV格式,色彩空間,幀間預(yù)測所需要用到的參考幀的更新等等;
- 🐷header_size_in_byte為0時表示該幀直接copy其他幀信息,不需要進(jìn)一步解碼了,這個變量的解析在ubcompress-header中;
- 🐽vp9采用的基于概率的壓縮,具體可以參考協(xié)議第9節(jié),很多壓縮的語法元素有一張概率表,解碼過程是會用到這張概率表的,而這張概率表也是會在運(yùn)算過程中更新的。load-probs(idx)是加載frame_context_idx表示的這張概率表,frame_context_idx的值在uncompress-header中解析;
- 🐮編解碼過程中會將很多語法元素編碼的次數(shù)記錄下來,以便后面在refresh_probs()中更新概率模型;因此開始解析壓縮后的信息前,clear_count()清空計數(shù)器;
- 🐵Compress_header()里解析的是概率表,因為vp9并不是完全按上面load-probs加載的概率表來計算的,部分位置需要更新后再使用,哪些概率信息需要更新,更新值是多少,就在compress-header里解析;概率表用于從二進(jìn)制碼流里解析各個語法元素(詳見協(xié)議第9節(jié))
- 🐒decode-tiles()開始正式解析還原這個圖像;
3. vp9中的一些索引解釋:
- 🐴segment id : sement id對應(yīng)的位置存儲了之前解碼過的圖像的skip,QP,參考幀等信息,根據(jù)一些segment的相關(guān)標(biāo)志位決定這些參數(shù)是直接采用segment id位置 所對應(yīng)這些信息,還是單獨(dú)解碼這些信息;
- 🐎 frame_to_show_map_idx : 表示該幀直接顯示frame_to_show_map_idx所對應(yīng)的圖像(之前解碼存儲的圖像),該幀解碼結(jié)束;
- 🐫frame_context_idx : vp9的字符串解析過程中會用到很多概率表(第9節(jié)),load_probs( frame_context_idx )表示加載frame_context_idx所對應(yīng)的概率表;
4. decode-tiles()
- 🐑tileCols,這一幀圖像有多少列tile
- 🐘tileRows,這一幀圖像有多少行tile
- 🐼tileROw:當(dāng)前tile位于該幀的第幾行tile
- 🐍tileCOl: 當(dāng)前tile位于該幀的第幾行tile
- 🐦MiROWs:這一幀圖像有多少行8*8塊
- 🐤MiCols:這一幀圖像有多少行8*8塊
- 🐥MiROWSTART : 該tile的起始行的位置(8*8為單位,比如若為20,表示該tile位于一幀圖像的y坐標(biāo)的160像素點(diǎn));
- 🐣簡單來說,一個Mi的為8*8個r像素點(diǎn);
5. decode_partition
- 🐔bsize是根據(jù)partition劃分后的大小,也就是說,如果對88進(jìn)行劃分,之后一定進(jìn)decode-block()。 如果bsize是88,partition 若為 NONE則一定進(jìn)入decode_ block;其他partition對應(yīng)的bsize為44,84,48,也是直接進(jìn)decode block(一個88,無論怎么劃分,都只解碼一次decode_block);需要注意的是,decode_block函數(shù)里雖然Misze是44,84或48,但實際上都是在處理一個88的塊;
- 🐧如果不需要編解碼殘差(skip),那還需要編碼tx size嗎?需要,intra mode預(yù)測要用到tx_size;
6. Residual()
Token : extra_bits[ 11 ][ 3 ] = {
{ 0, 0, 0},
{ 0, 0, 1},
{ 0, 0, 2},
{ 0, 0, 3},
{ 0, 0, 4},
{ 1, 1, 5},
{ 2, 2, 7},
{ 3, 3, 11},
{ 4, 4, 19},
{ 5, 5, 35},
{ 6, 14, 67}
}
- 【0】 位置是概率解碼時要用到的;
- 【1】 表示offset的位寬
- 【2】 表示base
殘差的絕對值 = base + offset;
例如:
- 🐟若token為 0(ZERO_TOKEN),則base為0,offset位寬為0,則殘差的絕對值為0;
- 🐳若token為7(DCT_VAL_CAT3)則base = 7, offset位寬為2bit([0 , 3]),因此殘差絕對值的取值范圍為[7 , 10];
- 🐋若token為8(DCT_VAL_CAT4)則base = 11, offset位寬為3bit[0 , 7],因此表示殘差絕對值的取值范圍為[11 , 18];
7. 參考文獻(xiàn)
【1】VP9協(xié)議鏈接(需要加速器)