CAVLC熵编码

转载 2015年07月08日 16:31:19
编码过程: 
假设有一个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; 

编码完毕。


HEVC学习(二十) —— 熵编码之一

从本篇开始,接下来的若干篇会逐步分析HM 9.1中有关熵编码的过程。在此以及以后的几篇,我都默认大家对熵编码(针对CABAC,因为HEVC只有这一种编码方式,而H.264有CAVLC和CABAC两种)...
  • HEVC_CJL
  • HEVC_CJL
  • 2013年01月04日 15:46
  • 17735

h264CAVLC自适应上下文变长编码原理

熵编码是无损压缩编码方法,它生成的码流可以经解码无失真地恢复出原数据。熵编码是建立在随机过程的统计特性基础上的。 称H(X )为信息源 X的熵(entropy),单位为 bit/符号, 通常也称为 ...
  • xietingcandice
  • xietingcandice
  • 2014年11月18日 16:31
  • 1152

数字视频编码概述(熵编码/Huffman编码)

1. 数字视频压缩的必要性和可能性 按ITU-R BT. 601建议,数字化后的输入图像格式为720*576像素,帧频为25帧/s,采样格式为4:2:2,量化精度为8bit, 则数码率:(72...
  • u013354805
  • u013354805
  • 2015年11月30日 16:18
  • 2056

【H.264/AVC视频编解码技术详解】十三、熵编码算法(3):CAVLC原理

《H.264/AVC视频编解码技术详解》视频教程已经在“CSDN学院”上线,视频中详述了H.264的背景、标准协议和实现,并通过一个实战工程的形式对H.264的标准进行解析和实现,欢迎观看!“纸上得来...
  • shaqoneal
  • shaqoneal
  • 2017年01月24日 01:03
  • 2245

【H.264/AVC视频编解码技术详解】十三、熵编码算法(4):H.264使用CAVLC解析宏块的残差数据

《H.264/AVC视频编解码技术详解》视频教程已经在“CSDN学院”上线,视频中详述了H.264的背景、标准协议和实现,并通过一个实战工程的形式对H.264的标准进行解析和实现,欢迎观看!“纸上得来...
  • shaqoneal
  • shaqoneal
  • 2017年03月28日 23:00
  • 1757

十三、熵编码算法(3):CAVLC原理

GitHub代码地址:点击这里 上下文自适应的变长编码(Context-based Adaptive Variable Length Coding, CAVLC) 1. 引言 在...
  • liu0808
  • liu0808
  • 2017年05月17日 22:24
  • 458

CAVLC.rar详细编码过程

  • 2012年08月07日 11:23
  • 18KB
  • 下载

CAVLC基于上下文自适应的可变长编码

熵编码的基本原理:熵编码是无损压缩编码方法,它生成的马路可以经解码无失真地恢复出原数据,熵编码是简历在随机过程的统计基础上。        自信息量:设X可发出的消息符号集合为A={ai|i=1...
  • wh8_2011
  • wh8_2011
  • 2017年02月02日 22:33
  • 261

h264CAVLC编码实例

再来一个例子:
  • xietingcandice
  • xietingcandice
  • 2014年11月18日 16:33
  • 478

基于上下文的自适应变长编码CAVLC原理与流程

CAVLC -CAVLC概念 AVLC的全称是Context-Adaptive Varialbe-Length Coding,即基于上下文的自适应变长编码。CAVLC的本质是变长编码,它的特性主要体...
  • a514223963
  • a514223963
  • 2012年08月23日 11:03
  • 2386
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CAVLC熵编码
举报原因:
原因补充:

(最多只允许输入30个字)