看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 output = 0000 100;
3) 编码所有TrailingOnes的符号:
逆序编码,三个拖尾系数的符号依次是+(0),-(1),-(1);
即:
TrailingOne sign[i--] = 0;
TrailingOne sign[i--] = 1;
TrailingOne sign[i--] = 1;
Code output = 0000 100 0 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++;
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 output = 0000 100 011 1;
编码下一个Level:Level[0] = 3;
levelCode = 4;level_prefix = 2;查表得bit string = 001;
level_suffix = 0;suffixLength = 1;故码流为0010;
Code output = 0000 100 011 1 0010 ;
i = 0,编码Level结束。
5)编码最后一个非零系数前零的数目(TotalZeros):
查表9-7,当TotalCoeffs = 5,total_zero = 3时,bit string = 111;
Code output = 0000 100 011 1 0010 111;
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 output = 0000 100 011 1 0010 111 10 1 1 01 ;
编码完毕。(CAVLC主要是查表,标准中的表是通过大量实验的出来的!)
解码过程:
接收码流为:0000 1000 1110 0101 1110 1101
计算NC = 1
解码详细过程如下:
1. 根据Coeff_token和NC查表(见标准表9-5),得到非零系数数目TotalCoeffs和拖尾系数数目TrailingOnes
NC = 1选择对应的表,Coeff_token为0000100,查表得到TotalCoeffs=5 TrailingOnes=3
输出序列:无
2. 解析拖尾系数
由第一步得到拖尾系数有3个,输入拖尾系数符号编码码流011,得到两个拖尾系数由先到后是 -1,-1,1
output :-1,-1,1(反序输出)
3. 解析除拖尾系数外的非零系数的幅值(level)
(1) 确定后缀长度SuffixLength
(2) 根据码流查表9-6得到前缀LevelPrefix
(3) 根据前缀和后缀,得到
LevelCode=(levelprefix<<suffixlength)+levelsuffix
(4) Levelcode为偶数 level=(level+2)/2
Levelcode为奇数 level=(-level-1)/2
(5) 根据设定的阈值确定是否update Suffixlegth
回到例子中,按照逆序
i=0, Sufixlegth=0,查表9-6,1对应的前缀levelprefix=0,levelcode=0,
计算得到level=1 , i++ , sufixlegth++(第一次都要加)
i=1,sufixlegth=1,查表0010(3为前缀,1位后缀)对应的前缀 levelprefix=2,计算levelcode=4,level=3,i++
i=2 >= TotalCoeffs-TrailingOnes,除拖尾系数外的非零系数解析完毕
output:3,1,-1,-1,1
4. 解析每个非零系数前零的个数
根据TotalCoeffs=5和输入码流111查表9-7得到TotalZeros=3
初始i=TotalCoeffs-1=4 ,zeroleft=TotalZeros=3 , 5个非零系数前零的数目解析如下:
i=4,zeroleft=3,根据码流10,查表9-10,runbefor=1,
输出序列:3,1,-1,-1,0,1
i=3,zeroleft=3-1=2,根据码流1,查表runbefore=0,
输出序列:3,1,-1,-1,0,1
i=2,zeroleft=2-0=2,根据码流1,查表runbefore=0,
输出序列:3,1,-1,-1,0,1
i=1,zeroleft=2-0=2,根据码流01,查表runbefore=1,
输出序列:3,0,1,-1,-1,0,1
i=0,zeroleft=2-1=1,输出序列:0,3,0,1,-1,-1,0,1
5. 解码完毕,将剩下的元素用0补齐,反序排列就可以得到4*4矩阵。
6. 最后还原为一个4*4数据块
{
0 , 3 , -1 , 0,
0, -1 , 1, 0,
1 , 0 , 0 , 0,
0 , 0 , 0 , 0
}
分享到:
相关推荐
基于H.264 CAVLC的音视频同步算法,陈锐,李冰,针对多媒体网络应用中经常出现的音视频不同步的问题,提出两种基于H.264/AVC视频编码标准的音视频同步算法。这两种算法均是基于H.264
一种改进的H.264 CAVLC解码算法,王涛,尹勇,传统的CAVLC解码方法仅针对其单个的性能进行了优化,即解码速度或者是存储空间。为了提高H.264标准中CAVLC解码模块的整体性能,提出了
详细介绍了H.264标准编码器中商编码CAVLC的具体操作过程。
H.264解码器中CAVLC码表查找算法的改进,刘莉媛,穆翠英,H.264视频编码标准在基本档次和扩展档次采用基于上下文的自适应可变长编码(CAVLC)熵编码方法,但标准并未明确规定CAVLC的具体编解码方法
H.264 中的上下文自适应的可变长编码算法的分析与实现 ...本文对 H.264 中的上下文自适应的可变长编码算法(CAVLC)进行了深入分析和实现,旨在帮助读者更好地理解 H.264 相关技术的优越性和 CAVLC 算法的原理和实现。
H264协议中熵编码算法分析,包括指数编码,CAVLC,和CABAC,举例分析算法的细节,一看就懂。
6.10.1基于Lagrangian优化算法的H.264编码控制模型 148 6.10.2 实验结果和性能分析 151 6.11 去方块滤波 153 6.11.1 去方块滤波基本概念 154 6.11.2 边界分析 155 6.11.3 滤波过程 157 6.12 其余特征 160 6.12.1 ...
本文档对H.264中的CAVLC编码进行详细的讲解,举了一个例子,进行代码级的跟踪
H.264 CAVLC中使用的现代视频编码标准包括有效的熵编码技术。 它消除了变换后的量化系数的冗余,并显着减小了量化系数。 在现有方法中,CAVLC实现对Chroma和Luma块进行编码,这导致编码块中的吞吐量较低。 在本文中...
为了提高多视点立体视频的解码速度,基于H.264/MVC标准,根据码字前缀的特点,将原有码表划分为若干区域,精确了查表范围,优化了熵解码中CAVLC的查表过程,并将优化后的解码器移植到播放器中。实验结果表明,提出的...
H.264 CAVLC硬體原始碼下載,內附測試檔案。
对H.264/AVC的视频解码问题进行了研究,给出了H.264解码核的硬件实现方案,对熵解码CAVLC查表方案进行了优化. 介绍了句法预测模块、反量化、逆DCT以及帧内预测模块的具体实现结构;并引入流水线、并行处理和状态机...
基于FPGA的H.264解码IP核中CAVLC熵解码模块的设计.pdf
H.264熵编码简介,其中,包括CAVLC,CABAC
H.264/AVC标准中CAVLC和CABAC熵编码算法研究,郑幸福,龙昭华,本本文主要分析H.264中两种熵编码技术:基于上下文自适应可变长编码(CAVLC, Context-Based Adaptive Variable Length Coding)和基于上下文二进制算
H.264解码器中CAVLC码表查找算法的改进.pdf
H.264协议中的三种熵编码算法的解码算法,即包括 CAVLC CABAC 指数编码,对于英语不好的协议初学者挺不错的。
摘 要: 设计了一种H.264标准的CAVLC编码器,对原有软件流程进行部分改进,提出了并行处理各编码子模块的算法结构。重点对非零系数级(level)编码模块进行优化,采用并行处理和流水线相结合的结构,减少了cavlc...
摘 要:Exp-Golomb和CAVLC是H.264引入的新的熵编码形式,通过引入上下文的方式,减少编码码流,提高鲁棒性。该文提出一种熵编码的硬件结构,采用全0子块探测,双RAM结构,流水线技术,以及通过计算代替查找表的方法...