H264 CAVLC 研究

目錄
  • 1 CAVLC概念
  • 2 CAVLC原理
  • 3 CAVLC編碼流程
  • 4 CAVLC解碼流程
  • 展開全部
摘要糾錯編輯摘要

CAVLC即基于上下文的自適應變長編碼。H.264標準中使用CAVLC對4*4模塊的亮度和色度殘差數據進行編碼。

CAVLC-CAVLC概念

CAVLC的全稱是Context-Adaptive Varialbe-Length Coding,即基于上下文的自適應變長編碼。CAVLC的本質是變長編碼,它的特性主要體現在自適應能力上,CAVLC可以根據已編碼句法元素的情況動態的選擇編碼中使用的碼表,并且隨時更新拖尾系數后綴的長度,從而獲得極高的壓縮比。H.264標準中使用CAVLC對4×4模塊的亮度和色度殘差數據進行編碼。

CAVLC-CAVLC原理


在H.264標準編碼體系中,視頻圖像在經過了預測、變換及量化編碼后表現出如下的特性:4×4塊殘差數據塊比較稀疏,其中非零系數主要集中在低頻部分,而高頻系數大部分是零;量化后的數據經過zig-zag掃描,DC系數附近的非零系數值較大,而高頻位置上的非零系數值大部分是+1和-1;相鄰的4×4塊的非零系數的數目是相關的。CAVLC就是利用編碼后殘差數據的這些特性,通過自適應對不同碼表的選擇,利用較少的編碼數據對殘差數據進行無損的熵編碼,進一步減少了編碼數據的冗余和相關性,提高了H.264的壓縮效率。

CAVLC-CAVLC編碼流程


視頻圖像在經過預測、變換和量化編碼后,需要經過Zig-zag掃描和重新的排序過程,為后序的CAVLC編碼進行準備。一個殘差數據塊的CAVLC熵編碼的流程如圖所示:

CAVLC熵編碼處理流程CAVLC熵編碼處理流程

1、TotalCoeffs和TrailingOnes的編碼


從碼流的起始位置開始計算整個編碼塊中非零系數的數目(TotalCoeffs),非零系數的數目為從0-16,非零系數的數目被賦值給變量TotalCoeffs。
拖尾系數是指碼流中正或者負1的個數(+/-1)。拖尾系數的數目(TrailingOnes)被限定在3個以內,如果+/-1的數目超過3個,則只有最后3個被視為拖尾系數,其余的被視為普通的非零系數,拖尾系數的數目被賦值為變量TrailingOnes。?

2、判斷計算nC值

nC(Number Current 當前塊值)值的計算集中體現了CAVLC的基于上下文的思想,通過nC值選擇不同H.264標準附錄CAVLC碼表。?

3、查表獲得coeff_token編碼

根據之前編碼和計算過程所得的變量TotalCoeffs、TrailingOnes和nC值可以查H.264標準附錄CAVLC碼表,即可得出coeff_token編碼序列。

4、編碼每個拖尾系數的符號:前面的coeff_token編碼中已經包含了拖尾系數的總數,還需進一步對拖尾系數的符號進行編碼。由于拖尾系數符合為正(+)或負(-),因此,在H.264標準中規定用0表示正1(+1)、1表示負1(-1)。當拖尾系數的數目超過3個只有最后3個被認定為拖尾系數,因此對符號的編碼順序應按照反向掃描的順序進行。

5、編碼除拖尾系數之外的非零系數的幅值(Levels)

非零系數的幅值(Levels)由兩個部分組成:前綴(level_prefix)和后綴(level_suffix)。levelCode、levelSuffixsSize和suffixLength是編碼過程中需要使用的三個變量,其中levelCode是中間過程中用到的無符號數,levelSuffixsSize表示后綴長度位數,suffixLength代表Level的碼表序號。

6、編碼最后一個非零系數前零的數目(TotalZeros)

TotalZeros指的是在最后一個非零系數前零的數目,此非零系數指的是按照正向掃描的最后一個非零系數。因為非零系數數目(TotalCoeffs)是已知,這就決定了TotalZeros可能的最大值。根據TotalCoeffs值,H.264標準共提供了25個變長表格供查找,其中編碼亮度數據時有15個表格供查找,編碼色度DC 2×2塊(4:2:0格式)有3個表格、編碼色度DC 2×4塊(4:2:2格式)有7個表格。

7、編碼每個非零系數前零的個數(RunBefore)

在CAVLC中,變量 ZerosLeft表示當前非零系數左邊的所有零的個數,ZerosLeft的初始值等于TotalZeros。每個非零系數前零的個數(RunBefore)是按照反序來進行編碼的,從最高頻的非零系數開始。H.264標準中根據不同ZerosLeft和RunBefore,構建了RunBefore編碼表格供編碼查找使用。根據表格每編碼完一個RunBefore,對ZerosLeft的值進行更新,繼續編碼下一個RunBefore,直至全部完成所有非零系數前零的個數的編碼。當ZerosLeft=0即沒有剩余0需要編碼時或者只有一個非零系數時,均不需要再進行RunBefore編碼。

CAVLC-CAVLC解碼流程

CAVLC熵解碼是上述CAVLC熵編碼的逆過程,CAVLC熵解碼的輸入數據是來自片層數據的比特流,解碼的基本單位是一個4×4的像素塊,輸出為包含4×4塊每個像素點所有幅值的序列。CAVLC解碼步驟如下:
1. 初始化所有的系數幅值
2. 解碼非零系數個數(TotalCoeff)和拖尾系數個數(TrailingOnes)。
3. 解碼拖尾系數符號(trailing_ones_sign_flag)
4. 解碼非零系數幅值
5. 解碼total_zeros和run_before
6. 組合非零系數幅值和游程信息,得到整個殘差數據塊

?

H.264 CAVLC編解碼詳解
2007-04-20 21:53

CAVLC: Context-Adaptive Variable-Length Coding
用于亮度和色度殘差數據的編碼.
經過變化量化后的殘差有如下特性:非零系數集中在低頻部分,而高頻系數大部分是零; 量化后的數據經Zig-Zag掃描后DC系數附近的非零系數數值較大,而高頻位置上的非零系數值大部分是+1和-1;相鄰4*4塊的非零系數的數碼是相關的.

CAVLC模型選擇主要體現:非零系數編碼所需表格的選擇和拖尾系數后綴長度的更新;

編碼過程
1.初始化
確定NC值
NC則與當前塊左邊非零系數數目NA和上面塊的非零系數數目NB求得的:
NC = (NA+NB)/2?? NA,NB都可以能是沒有的(處于邊緣時),此時以0計之
色度的直流系數NC=-1
NC值與表格的對應 0-1:Num-VLC0 2-3:Num-VLC1 4-7:Num-VLC2 >=8:FLC(定長表格)

2.編碼非零系數的數目(TotalCoeffs: 0-16)和拖尾系數數目(TrailingOnes: 0-3)
兩個數目的編碼過程是通過查表實現的,而表格的選擇是根據變量NC(Number Current,當前塊值);

3.編碼每個拖尾系數的符號
符號用一個比特表示 0表示+ 1表示-

4.編碼除了拖尾系數之外的非零系數的幅值Levels
過程:
1)將有符號的Level[i]轉換成無符號的LevelCode
Level[i]為正, levelCode=(Level[i]<<1)-2;
Level[i]為負, levelCode=-(Level[i]<<1)-1;
2)計算level_prefix
level_prefix=levelCode/(1<<suffixLength), 查標準中的表9-6可得對應的bit_string
3)計算level_suffix
level_suffix=levelCode%(1<<suffixLength)
4)根據suffixLength的值確定后綴的長度

5)更新suffixLength
if(suffixLength == 0)++suffixLength;
else if(levelCode > (3<<suffixLength-1) && suffixLength < 6)++suffixLength

5.編碼最后一個非零系數前零的數目TotalZeros
查標準中的表9-7

6.編碼每個非零系數前零的個數RunBefore
查標準中的表9-10


解碼過程
1.初始化
確定NC值

2.確定TotalCoeffs和TrailingOnes
根據NC值和coeff_token值查表9-5

3.根據TrailingOnes確定拖尾1的符號

4.解析除拖尾系數之外的非零系數的幅值(解碼Levels)
1)確定suffixLength初始值
if(TotalCoeffs>10 && TrailingOnes<3)suffixLength=1;
else suffixLength=0;

2)計算得到Level[i]
先得到level_prefix(形式如{0}^*1: n個0后一個1)
根據suffixLength讀取編碼中的suffixLength位作為level_suffix
levelCode=level_prefix<<suffixLength+level_suffix
if(levelCode%2==0)Level[i]=(levelCode+2)/2
else Level[i]=(-levelCode-1)/2

3)更新suffixLength
if(suffixLength == 0)++suffixLength;
else if(levelCode > (3<<suffixLength-1) && suffixLength < 6)++suffixLength

5.根據得到的TotalCoeff數值和TotalZeros編碼值得到TotalZeros數值

6.解析每個非零系數前零的數目(解碼RunBefore)
zeroleft = TotalZeros;
i=TotalCoeffs-1;
while(zeroleft>0 && i>0)
{
?? 根據zeroleft查找匹配的run_before[i]值;
?? i=i-1;
?? zeroleft = zeroleft-runbefore[i];
?? if(zeroleft==0 || i==0)
?? {
???? run_before[i]=zeroleft;
???? break;
?? }
}

例子:假定用了Num-VLC0表
4*4 Block
{
0,3,-1,0;
0,-1,1,0;
1,0,0,0;
0,0,0,0;
}

Reodered block:
0,3,0,1,-1,-1,0,1,0,...
TotalCoeffs=5
TotalZeros=3
TrailingOnes=3

編碼
Element?? Value????? Code
coeff_token?? TotalCoeffs=5, T1s=3??? 0000100;根據coeff_token到TotalCoeff和TrailingOnes映射表
T1 sign (4)?? +????? 0
T1 sign (3)?? -????? 1
T1 sign (2)?? -????? 1
Level (1)?? +1 (use Level_VLC0)??? 1;
Level (0)?? +3 (use Level_VLC1)??? 0010;
TotalZeros?? 3????? 111;TotalCoeff和TotalZeros的映射表
run_before(4)?? ZerosLeft=3; run_before=1?? 10;run_before表
run_before(3)?? ZerosLeft=2; run_before=0?? 1
run_before(2)?? ZerosLeft=2; run_before=0?? 1
run_before(1)?? ZerosLeft=2; run_before=1?? 01
run_before(0)?? ZerosLeft=1; run_before=1?? No code required; last coefficient.

Decoding:
Code??? Element Value????? Output array
0000100?? coeff_token TotalCoeffs=5, T1s=3?? Empty
0??? T1 sign +????? 1
1??? T1 sign -????? -1, 1
1??? T1 sign -????? -1, -1, 1
1??? Level +1????? 1, -1, -1, 1
0010??? Level +3????? 3, 1, -1, -1, 1
111??? TotalZeros 3????? 3, 1, -1, -1, 1
10??? run_before 1????? 3, 1, -1, -1, 0, 1
1??? run_before 0????? 3, 1, -1, -1, 0, 1
1??? run_before 0????? 3, 1, -1, -1, 0, 1
01??? run_before 1????? 3, 0, 1, -1, -1, 0, 1

?

?

?

?

[轉貼] CAVLC編碼過程詳解——Sunrise

謹以此文獻給QQ群“H.264樂園”和群里那些無私奉獻的同行朋友!
也希望能對剛進入這個領域的朋友有所幫助,歡迎做過CAVLC的同行能批評指正!

編碼過程:
假設有一個4*4數據塊
{
0, 3, -1, 0,
0, -1, 1, 0,
1, 0, 0, 0,
0, 0, 0, 0
}
數據重排列:0,3,0,1,-1,-1,0,1,0……


1) 初始值設定:
非零系數的數目(TotalCoeffs) = 5;
拖尾系數的數目(TrailingOnes)= 3;
最后一個非零系數前零的數目(Total_zeros) = 3;
變量NC=1;
(說明:NC值的確定:色度的直流系數NC=-1;其他系數類型NC值是根據當前塊左邊4*4塊的非零系數數目(NA)當前塊上面4*4塊的非零系數數目(NB)求得的,見畢厚杰書P120表6.10)
suffixLength = 0;
i = TotalCoeffs = 5;

2) 編碼coeff_token:
查標準(BS ISO/IEC 14496-10:2003)Table 9-5,可得:
If (TotalCoeffs == 5 && TrailingOnes == 3 && 0 <= NC < 2)
coeff_token = 0000 100;
Code = 0000 100;

3) 編碼所有TrailingOnes的符號:
逆序編碼,三個拖尾系數的符號依次是+(0),-(1),-(1);
即:
TrailingOne sign[i--] = 0;
TrailingOne sign[i--] = 1;
TrailingOne sign[i--] = 1;
Code = 0000 1000 11;

4) 編碼除了拖尾系數以外非零系數幅值Levels:
過程如下:
(1)將有符號的Level[ i ]轉換成無符號的levelCode;
如果Level[ i ]是正的,levelCode = (Level[ i ]<<1) – 2;??
如果Level[ i ]是負的,levelCode = - (Level[ i ]<<1) – 1;
(2)計算level_prefix:level_prefix = levelCode / (1<<suffixLength);
查表9-6可得所對應的bit string;
(3)計算level_suffix:level_suffix = levelCode % (1<<suffixLength);
(4)根據suffixLength的值來確定后綴的長度;
(5)suffixLength updata:
If ( suffixLength == 0 )
suffixLength++;
else if ( levelCode > (3<<suffixLength-1) && suffixLength <6)
suffixLength++;

回到例子中,依然按照逆序,Level[i--] = 1;(此時i = 1)
levelCode = 0;level_prefix = 0;
查表9-6,可得level_prefix = 0時對應的bit string = 1;
因為suffixLength初始化為0,故該Level沒有后綴;
因為suffixLength = 0,故suffixLength++;
Code = 0000 1000 111;
編碼下一個Level:Level[0] = 3;
levelCode = 4;level_prefix = 2;查表得bit string = 001;
level_suffix = 0;suffixLength = 1;故碼流為0010;
Code = 0000 1000 1110 010;
i = 0,編碼Level結束。

5)編碼最后一個非零系數前零的數目(TotalZeros):
查表9-7,當TotalCoeffs = 5,total_zero = 3時,bit string = 111;
Code = 0000 1000 1110 0101 11;

6) 對每個非零系數前零的個數(RunBefore)進行編碼:
i = TotalCoeffs = 5;ZerosLeft = Total_zeros = 3;查表9-10:
依然按照逆序編碼
ZerosLeft =3, run_before = 1 run_before[4]=10;
ZerosLeft =2, run_before = 0 run_before[3]=1;
ZerosLeft =2, run_before = 0 run_before[2]=1;
ZerosLeft =2, run_before = 1 run_before[1]=01;
ZerosLeft =1, run_before = 1 run_before[0]不需要碼流來表示
Code = 0000 1000 1110 0101 1110 1101;
編碼完畢。

----------------------------------Sunrise------

[[i] 本帖最后由 firstime 于 2008-9-4 02:49 PM 編輯 [/i]]

davesliu 發表于 2006-11-20 12:03 PM

請問斑竹,老畢書上120頁表6.10中第2行和第三行的NA和NB是不是給弄反了?

vcforever 發表于 2006-12-7 11:06 PM

應該是弄反了

dmsd 發表于 2006-12-18 05:42 PM

請問trailing ones是指所有絕對值為1的系數的個數還是連續絕對值為1的系數的個數。

謝謝。

firstime 發表于 2006-12-18 11:29 PM

倒數三個 +/-1

另:可結合本論壇帖子“[url=http://bbs.chinavideo.org/viewthread.php?tid=1057][color=blue][b]CAVLC中的前綴和后綴[/b][/color][/url]”學習。

[[i] 本帖最后由 firstime 于 2008-5-20 09:59 PM 編輯 [/i]]

achen 發表于 2007-1-17 05:50 PM

“如果Level[ i ]是負的,levelCode = - (Level[ i ]<<1) – 1”
假如Level[ i ]=-3,levelCode值是多少啊?
還有能不能詳細講解一下如何確定suffixLength的取值,它跟域值的關系怎么確定?
謝謝!

[[i] 本帖最后由 firstime 于 2007-1-27 10:06 PM 編輯 [/i]]

dcfarmer 發表于 2007-1-28 11:22 AM

討論

是JM86運行后的trace記錄

@160? ?Luma # c & tr.1s(0,0) vlc=0 #c=11 #t1=1? ?? ?? ?000000000001110 ( 11)
@175? ?Luma trailing ones sign (0,0)? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?0 (??0)
@176? ?Luma lev (0,0) k=9 vlc=1 lev= -2? ?? ?? ?? ?? ?? ?? ?? ?? ???11 ( -1)
@178? ?Luma lev (0,0) k=8 vlc=1 lev= -1? ?? ?? ?? ?? ?? ?? ?? ?? ???11 ( -1)
@180? ?Luma lev (0,0) k=7 vlc=1 lev=??1? ?? ?? ?? ?? ?? ?? ?? ?? ???10 (??1)
@182? ?Luma lev (0,0) k=6 vlc=1 lev= -5? ?? ?? ?? ?? ?? ?? ?? ? 000011 ( -5)
@188? ?Luma lev (0,0) k=5 vlc=2 lev=-11? ?? ?? ?? ?? ?? ?? ???00000101 (-11)
@196? ?Luma lev (0,0) k=4 vlc=3 lev= -3? ?? ?? ?? ?? ?? ?? ?? ?? ?1101 ( -3)
@200? ?Luma lev (0,0) k=3 vlc=3 lev=??3? ?? ?? ?? ?? ?? ?? ?? ?? ?1100 (??3)
@204? ?Luma lev (0,0) k=2 vlc=3 lev=??3? ?? ?? ?? ?? ?? ?? ?? ?? ?1100 (??3)
@208? ?Luma lev (0,0) k=1 vlc=3 lev=-12? ?? ?? ?? ?? ?? ?? ?? ? 001111 (-12)
@214? ?Luma lev (0,0) k=0 vlc=3 lev=??9? ?? ?? ?? ?? ?? ?? ?? ? 001000 (??9)
上面這段是trace.txt中的記錄,根據前面的vlc=0 #c=11 #t1=1,就是trailing_ones 的個數是1個(@175? ?Luma trailing ones sign (0,0)? ?? ???0 (??0) )也能說明,但是在下面的level中,明明還要-1,1可以作為trailing_ones的,為什么不把這兩個數當作trailing_ones呢??而是作為level呢????

dcfarmer 發表于 2007-1-28 11:40 AM

回答

接上面的問題,在群里面討論弄明白了
在CAVLC編碼中,從右往左看,算trailing_ones時,在右邊不能有abs()>1的數,還有算trailing_ones的個數的話,也不能被別的abs()>1的數隔斷,如果隔斷的話,只能計數到隔斷數為止,而且要保證個數<=3。例如。。。。2,3,0,0,0,1,1,1,0,0,2 ,這個序列中triailing_ones是沒有的。還有。。。。。1,0,0,-1,3,1,0,0,0,0,算trailing_ones 個數時,只能有一個也就是3后面的“1”算一個,3前面的-1和1由于被3隔斷,所以不能算入其中。

[[i] 本帖最后由 dcfarmer 于 2007-6-7 03:27 PM 編輯 [/i]]

zjh1004 發表于 2007-8-26 09:55 PM

ZerosLeft =1, run_before = 1? ?? ?run_before[0]不需要碼流來表示

請問:為什么不需要碼流來表示?
是因為是最后一位嗎?
查表知:此時 run_before[0]=0

timek 發表于 2007-9-11 06:35 PM

回復 #6 achen 的帖子

Level[ i ]=-3,levelCode值是多少啊?

levelcode應該是3

grassland_fly 發表于 2007-9-12 03:47 PM

[size=12px]ZerosLeft =1, run_before = 1? ?? ?run_before[0]不需要碼流來表示

請問:為什么不需要碼流來表示?
是因為是最后一位嗎?
查表知:此時 run_before[0]=0[/size]
[size=12px] [/size]
[size=12px]---------------------------------------------------------[/size]
[size=12px] [/size]
[size=12px]I think it's because can know the vaule based on the value before. :)[/size]

generalair 發表于 2007-10-22 02:51 PM

2007-1-28 11:22 AM dcfarmer
討論

是JM86運行后的trace記錄

@160? ?Luma # c & tr.1s(0,0) vlc=0 #c=11 #t1=1? ?? ?? ?000000000001110 ( 11)
@175? ?Luma trailing ones sign (0,0)? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?0 (??0)
@176? ?Luma lev (0,0) k=9 vlc=1 lev= -2? ?? ?? ?? ?? ?? ?? ?? ?? ???11 ( -1)
@178? ?Luma lev (0,0) k=8 vlc=1 lev= -1? ?? ?? ?? ?? ?? ?? ?? ?? ???11 ( -1)
@180? ?Luma lev (0,0) k=7 vlc=1 lev=??1? ?? ?? ?? ?? ?? ?? ?? ?? ???10 (??1)
@182? ?Luma lev (0,0) k=6 vlc=1 lev= -5? ?? ?? ?? ?? ?? ?? ?? ? 000011 ( -5)
@188? ?Luma lev (0,0) k=5 vlc=2 lev=-11? ?? ?? ?? ?? ?? ?? ???00000101 (-11)
@196? ?Luma lev (0,0) k=4 vlc=3 lev= -3? ?? ?? ?? ?? ?? ?? ?? ?? ?1101 ( -3)
@200? ?Luma lev (0,0) k=3 vlc=3 lev=??3? ?? ?? ?? ?? ?? ?? ?? ?? ?1100 (??3)
@204? ?Luma lev (0,0) k=2 vlc=3 lev=??3? ?? ?? ?? ?? ?? ?? ?? ?? ?1100 (??3)
@208? ?Luma lev (0,0) k=1 vlc=3 lev=-12? ?? ?? ?? ?? ?? ?? ?? ? 001111 (-12)
@214? ?Luma lev (0,0) k=0 vlc=3 lev=??9? ?? ?? ?? ?? ?? ?? ?? ? 001000 (??9)


請問上面這段TRACE記錄對應的16個系數序列是什么?謝謝

boleaon 發表于 2007-11-8 04:46 PM

好貼...

kdjwang 發表于 2008-10-10 03:52 PM

回復 #10 timek 的帖子

levelcode應該是5,level先乘2為-6,再取反減1
解碼時因為levelcode為奇數,level = (‐levelCode‐1)/2

libra811 發表于 2008-12-29 10:44 PM

剛學習,受用了。謝謝

peiyangpr 發表于 2009-1-4 05:28 PM

畢厚杰P123,6.8.6節中所給例子是否有誤?是否應如下編碼?

0? ?? ???0? ?? ???-1? ?? ???0
5? ?? ???2? ?? ???0? ?? ???0
3? ?? ???0? ?? ???0? ?? ???0
1? ?? ???0? ?? ???0? ?? ???0? ?? ???
數據重排:0,0,5,3,2,-1,0,0,0,1……
其中TotalCoeffs = 5, TrailingOnes = 2, Total_zeros = 5, NC = 3

編碼過程:
元素? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?數值? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?編碼
Coeff_token? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???TotalCoeffs = 5, TrailingOnes = 2? ?? ?? ?? ?? ?0000101
Trailingones_sign_flag(1)? ?? ?? ?? ?? ???+? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?0
Tranlingones_sign_flag(0)? ?? ?? ?? ?? ? -? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 1
Level(2)? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???1 (suffixLenth = 0)? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 1
Level(1)? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???3 (suffixLength = 1)? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???0010
Level(0)? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???5 (suffixLength = 1)? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???000010
Total_zeros? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???5? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 101
Run_before(4)? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?Zeroleft = 5, run_before = 3? ?? ?? ?? ?? ?? ?? ?? ???010
Run_before(4)? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?Zeroleft = 2, run_before = 0? ?? ?? ?? ?? ?? ?? ?? ???1
Run_before(4)? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?Zeroleft = 2, run_before = 0? ?? ?? ?? ?? ?? ?? ?? ???1
Run_before(4)? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?Zeroleft = 2, run_before = 0? ?? ?? ?? ?? ?? ?? ?? ???1
Run_before(4)? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?Zeroleft = 2, run_before = 2? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? 無

最終編碼輸出:000010110010000010101010111

[[i] 本帖最后由 peiyangpr 于 2009-1-4 09:16 PM 編輯 [/i]]

?

residual_block_cavlc( coeffLevel, maxNumCoeff ) {? C????? Descriptor
??? for( i = 0; i < maxNumCoeff; i++ )??????????
??????? coeffLevel[ i ] = 0?????
??? // coeff_token????? 指明了非零系數的個數,拖尾系數的個數。??????
??? coeff_token?
??? if( TotalCoeff( coeff_token ) > 0 ) {??????????
??????? if( TotalCoeff( coeff_token ) > 10??? &&??? TrailingOnes( coeff_token ) <
3 )
??????????? suffixLength = 1??????????
??????? else??????????
??????????? suffixLength = 0??????????
??????? for( i = 0; i < TotalCoeff( coeff_token ); i++ )??????????
??????????? if( i < TrailingOnes( coeff_token ) ) {???????????
??????????????? // trailing_ones_sign_flag? 拖尾系數的符號
??????????????????? -???? 如果trailing_ones_sign_flag = 0,? 相應的拖尾系數是+1。
??????????????????? -???? 否則,trailing_ones_sign_flag =1,相應的拖尾系數是-1。?
??????????????? trailing_ones_sign_flag??
??????????????? level[ i ] = 1 – 2 * trailing_ones_sign_flag??????????
??????????? } else {??????????
??????????????? // level_prefix and level_suffix? 非零系數值的前綴和后綴。?
??????????????? level_prefix?
??????????????? levelCode = ( level_prefix << suffixLength )??????????
??????????????? if( suffixLength > 0??? | |??? level_prefix >= 14 ) {??????????
??????????????????? level_suffix??
??????????????????? levelCode += level_suffix??????????
??????????????? }??????????
??????????????? if( level_prefix??? = =??? 15??? &&??? suffixLength??? = =??? 0 )??????????
??????????????????? levelCode += 15??????????
??????????????? if( i??? = =??? TrailingOnes( coeff_token )??? &&????
????????????????????? TrailingOnes( coeff_token ) < 3 )
??????????????????? levelCode += 2??????????
??????????????? if( levelCode % 2??? = =??? 0 )??????????
??????????????????? level[ i ] = ( levelCode + 2 ) >> 1??????????
??????????????? else??????????
??????????????????? level[ i ] = ( –levelCode – 1 ) >> 1??????????
??????????????? if( suffixLength??? = =??? 0 )??????????
??????????????????? suffixLength = 1??????????
??????????????? if( Abs( level[ i ] )??? >??? ( 3 << ( suffixLength – 1 ) )??? &&????
????????????????????? suffixLength < 6 )
??????????????????? suffixLength++??????????
??????????? }??????????
??????? if( TotalCoeff( coeff_token ) < maxNumCoeff ) {??????????
??????????? // total_zeros??? 系數中 0 的總個數。
??????????? total_zeros???
??????????? zerosLeft = total_zeros??????????
??????? } else??????????
??????????? zerosLeft = 0??????????
??????? for( i = 0; i < TotalCoeff( coeff_token ) – 1; i++ ) {??????????
??????????? if( zerosLeft > 0 ) {??????????
???????????????
??????????????? run_before???
??????????????? run[ i ] = run_before??????????
??????????? } else??????????
??????????????? run[ i ] = 0??????????
??????????? zerosLeft = zerosLeft – run[ i ]??????????
??????? }??????????
??????? run[ TotalCoeff( coeff_token ) – 1 ] = zerosLeft??????????
??????? coeffNum = -1??????????
??????? for( i = TotalCoeff( coeff_token ) – 1; i >= 0; i-- ) {??????????
??????????? coeffNum += run[ i ] + 1??????????
??????????? coeffLevel[ coeffNum ] = level[ i ]????????????
??????? }??????????
??? }??????????
}

?

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/xfding/archive/2010/04/12/5477464.aspx

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/456177.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/456177.shtml
英文地址,請注明出處:http://en.pswp.cn/news/456177.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【MySQL 】學習筆記千行總結

/* Windows服務 */ -- 啟動MySQLnet start mysql -- 創建Windows服務sc create mysql binPath mysqld_bin_path(注意&#xff1a;等號與值之間有空格)/* 連接與斷開服務器 */ mysql -h 地址 -P 端口 -u 用戶名 -p 密碼SHOW PROCESSLIST -- 顯示哪些線程正在運行 SHOW VARIABLES…

CCCC 連續因子

題意&#xff1a; 一個正整數N的因子中可能存在若干連續的數字。例如630可以分解為3*5*6*7&#xff0c;其中5、6、7就是3個連續的數字。給定任一正整數N&#xff0c;要求編寫程序求出最長連續因子的個數&#xff0c;并輸出最小的連續因子序列。 輸入格式&#xff1a; 輸入在一行…

Mybatis怎么能看是否執行了sql語句

項目需要學習mybatis中&#xff0c;本來mybatis也不是什么新技術&#xff0c;無奈之前沒接觸過。 驗證緩存機制時&#xff0c;需要能看到是否sql被執行了。這就需要增加日志的打印 配置如下 在pom中增加如下依賴&#xff1a; <dependency> <groupId>org.bgee.log4j…

定時備份 MySQL 并上傳到七牛

定時備份 MySQL 并上傳到七牛 多數應用場景下&#xff0c;我們需要對重要數據進行備份、并放置到一個安全的地方&#xff0c;以備不時之需。 常見的 MySQL 數據備份方式有&#xff0c;直接打包復制對應的數據庫或表文件(物理備份)、mysqldump 全量邏輯備份、xtrabackup 增量邏輯…

vue_props div賦值props定義變量 templete獲取

vue_props div賦值props定義變量 templete獲取 <div id"app"> <add v-bind:btn"h"></add> </div> <script> var vm new Vue({ el: #app, data: { h: "hello" }, components: { "add": { …

H.264句法和語法總結 句法元素的分層結構

在 H.264 定義的碼流中&#xff0c;句法元素被組織成有層次的結構&#xff0c;分別描述各個層次的信息&#xff0c;如下圖所示 在H.264 中&#xff0c;句法元素共被組織成 序列、圖像、片、宏塊、子宏塊五個層次。 在這樣的結構中&#xff0c;每一層的頭部和它的數據部分形成管…

instanceof 的運用

2019獨角獸企業重金招聘Python工程師標準>>> Java 中的instanceof 運算符是用來在運行時指出對象是否是特定類的一個實例。instanceof通過返回一個布爾值來指出&#xff0c;這個對象是否是這個特定類或者是它的子類的一個實例。 用法&#xff1a; result object i…

R 腳本讀取匯總 Excel 表格數據

主要用到了 xlsx 和 rJava 包&#xff0c;打開 Excel 文件&#xff0c;讀取各表格數據&#xff0c;再寫入到匯總表。 下圖為處理前的原始數據表格&#xff1a; 下圖為處理后的數據&#xff1a; 代碼實現 安裝&加載包的函數實現。installed.packages() 函數獲取所有已安裝…

[Grid Layout] Place grid items on a grid using grid-column and grid-row

It’s possible to position a grid item anywhere on a grid track. To do this, let’s specify some grid-template-columns and grid-template-rows, and to the grid items, we’ll pass grid-column and grid-row some numeric values. <!DOCTYPE html> <html l…

【大數據】最新大數據學習路線(完整詳細版,含整套教程)

大數據學習路線 java(Java se,javaweb) Linux(shell,高并發架構,lucene,solr) Hadoop(Hadoop,HDFS,Mapreduce,yarn,hive,hbase,sqoop,zookeeper,flume) 機器學習(R,mahout) Storm(Storm,kafka,redis) Spark(scala,spark,spark core,spark sql,spark streaming,spark mllib,spa…

264編碼基本概念 FFMpeg的解碼流程

下面轉自http://topic.csdn.net/u/20081020/16/7156e0b2-dbfb-4b4f-af59-2be04cf9a420.html 的8樓 1、NAL、Slice與frame意思及相互關系 NAL指網絡提取層&#xff0c;里面放一些與網絡相關的信息Slice是片的意思&#xff0c;264中把圖像分成一幀&#xff08;frame&#xff09;…

谷歌瀏覽器開發調試工具中Sources面板 js調試等 完全介紹

這次分享的是Chrome開發工具中最有用的面板Sources。 Sources面板幾乎是我最常用到的Chrome功能面板&#xff0c;也是在我看來決解一般問題的主要功能面板。通常只要是開發遇到了js報錯或者其他代碼問題&#xff0c;在審視一遍自己的代碼而一無所獲之后&#xff0c;我首先就會打…

java XML解析防止外部實體注入

/** * 增加防止部實體注入邏輯* <功能詳細描述>* param reader* throws SAXException* see [類、類#方法、類#成員]*/public static void setReaderFeature(SAXReader reader)throws SAXException{reader.setFeature("http://apache.org/xml/features/disallow-doct…

【Python】最新Python學習路線(完整詳細版,含整套教程)

python目前應用最廣的三個崗位&#xff1a;全棧開發、數據分析、運維開發&#xff0c;今天我們就以這三個重點的崗位來做一下自學Python的規劃&#xff0c;希望你在學之前就能有明確的學習方向。 最近開始整理python的資料&#xff0c;博主建立了一個qq群&#xff0c;希望給大家…

程序員,軟件測試知多少?

送給初級程序員的測試認知文作為開發同學&#xff0c;一些基本的測試崗位相關知識還是很有必要了解一下&#xff0c;免的某些同學在工作中和測試同學斗嘴、打架、群毆等以及被測試鄙視....。 我們常常聽說的一些測試專業術語&#xff0c;比如白盒、黑盒、單元測試&#xff0c;相…

ffmpeg最新源代碼(定期更新)

為了方便那些不能連接到ffmpeg的SVN倉庫更新源代碼的用戶&#xff0c;ffmpeg工程組特開辟一個專區&#xff0c;定期更新ffmpeg的源代碼&#xff0c;并將其快照上傳&#xff0c;有需要的朋友可以長期關注本帖。ffmpeg的編譯指令通常為&#xff1a;1、配置&#xff1a;configurat…

vue 入門環境搭建

公司項目要用vue.js來開發&#xff0c;要使用vue來開發前端框架&#xff0c;首先要有環境&#xff0c;所以給大家介紹一下如何搭建vue環境。其實很簡單&#xff1a; 1.首先下載安裝node.js。 去官網https://nodejs.org/zh-cn/下載安裝包。 2.安裝webpack 打開cmd命令界面&#…

【解決】Win10修改host沒有權限問題

Step1&#xff1a;右鍵文件選擇屬性&#xff0c;選擇安全&#xff0c;點擊編輯&#xff1a; Step2&#xff1a;在彈窗中點擊添加&#xff0c;在彈窗中點擊高級&#xff1a; Step3&#xff1a;在彈窗中點擊立即查找&#xff0c;選中當前用戶&#xff0c;點擊確定&#xff1a; …

[已授權] 互聯網定位技術小談

? 誠邀阿里云先知社區邀請&#xff0c;不勝感激&#xff01;今日小編在此為大家介紹一下互聯網中所應用的定位技術。互聯網的發展日新月異&#xff0c;技術迭代很快&#xff0c;各行各業的智慧在互聯網這片藍天下碰撞結晶&#xff0c;造福大眾。今天要講述的集中定位方式&…

H.264解碼器ffmpeg完整優化代碼(包括PC和Windows Mobile版本)

這里把前段時間對ffmpeg0.48進行簡化和修改&#xff0c;包括修正內存泄漏&#xff0c;修改一些語句使Max Speed能夠打開這些。其實代碼還是比較亂的&#xff0c;也有很大的繼續優化空間。這個工作花費了我一些休息時間&#xff0c;不過&#xff0c;我確實學習到了很多。這個代碼…