【原】CAVLC的个人理解
4x4数据块经过预测、变换、量化后,非零系数主要集中在低频部分,而高频部分大部分是零。数据经过zig-zag扫描后,从左->右(低频->高频),DC系数附近的系数非常大,而高频的非零系数大部分是+1,-1(why? 应该是通过数据统计得到的。理论上推导暂时不知。)
因此可以得出量化后4x4块的特性有几个:
1)、非零系数一般较少,大部分是零,非零集中在DC附近。
2)、高频非零大部分是+1/-1。
3)、相邻的4x4块是相关的。(意思就是说 上面两点特性有关联,比如左边上边4x4非零系数很多,那么当前块很大的概率也是非零系数很多,小概率出现非零系数少的情况。这就给变长编码提供了概率依据。)
CAVLC各个过程说明。
第一步 对非零系数的数目(TotalCoeffs)以及拖尾系数的书目(TrailingOnes)进行编码。
码表的确定是由NC决定的。(why?因为NC是基于同一个slice左边4x4,上边4x4已经编码过的非零系数求平均。根据特性3),选择不同码表也是符合信息论的编码原则)。
亮度码表总共有4个(见标准表9-5):
0≤NC<2 表倾向于小系数(TotalCoef 0,1)的情况,小系数分配更短的比特
2≤NC<4 表倾向于中等大小系数(TotalCoef 0,1,2,3,4)的情况,中小系数分配更短比特
4≤NC<8 表倾向于较大的系数(TotalCoef 0,1,2,3,4,5,6,7,8)的情况。
8≤NC表 定长表,说明每种出现的概率差不多,这样获得的熵最大(由最大熵定理得到)。
有人就有疑问,这些码表是怎么设计出来的?个人觉得应该是根据大量的视频数据统计,获得概率模型,然后设计码表。熵编码离不开概率分布。
第二步 对拖尾系数的符号进行编码
第三步 对除拖尾系数以外的非零系数的幅值(Levels)进行编码。
大部分码表设计只考虑 n≥0的情况,如果出现负数,那么我们先要做一个映射才能使用该编码系统。
if code_num ≥0
levelCode = code_num*2 - 2 把正数映射到大于等于零的偶数上
if code_num <0
levelCode = -code_num*2 -1 把负数映射到大于零的负数上
映射完后开始编码。
这部分原理跟哥伦布编码差不多,不懂的请看我前面写的一篇文章,里面资料讲的很清楚。
http://www.cnblogs.com/irish/p/3170500.html
第四步 对最后一个非零系数前零的数目(TotalZeros)进行编码
查表得到码字
第五步 对每个非零系数前零个数(RunBefore)进行编码
查表得到码字
参考资料:
[1] http://files.cnblogs.com/irish/The_H.264_advanced_video_compression_standard.pdf
[2] http://files.cnblogs.com/irish/CAVLC.pdf
【原】CAVLC的个人理解的更多相关文章
- [原]Jenkins(一)---我理解的jenkins是这样的
/** * lihaibo * 文章内容都是根据自己工作情况实践得出. *版权声明:本博客欢迎转发,但请保留原作者信息! http://www.cnblogs.com/horizonli/p/5330 ...
- [原]Jenkins(一)---我理解的jenkins是这样的(附全套PDF下载)
/** * lihaibo * 文章内容都是根据自己工作情况实践得出. *版权声明:本博客欢迎转发,但请保留原作者信息! http://www.cnblogs.com/horizonli/p/5330 ...
- 拖拽碰撞--原声js(自身理解上新的方法)
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- Mybatis技术原理理——整体流程理解
前言:2018年,是最杂乱的一年!所以你看我的博客,是不是很空! 网上有很多关于Mybatis原理介绍的博文,这里介绍两篇我个人很推荐的博文 Mybatis3.4.x技术内幕和 MyBaits源码分析 ...
- 深入理解BERT Transformer ,不仅仅是注意力机制
来源商业新知网,原标题:深入理解BERT Transformer ,不仅仅是注意力机制 BERT是google最近提出的一个自然语言处理模型,它在许多任务 检测上表现非常好. 如:问答.自然语言推断和 ...
- [原]Jenkins(二)---jenkins之Git+maven+jdk+tomcat
/** * lihaibo * 文章内容都是根据自己工作情况实践得出. *版权声明:本博客欢迎转发,但请保留原作者信息! http://www.cnblogs.com/horizonli/p/5331 ...
- [原]Jenkins(三)---Jenkins初始配置和插件配置
/** * lihaibo * 文章内容都是根据自己工作情况实践得出. *版权声明:本博客欢迎转发,但请保留原作者信息! http://www.cnblogs.com/horizonli/p/5331 ...
- [原]Jenkins(四)---Jenkins添加密钥对
/** * lihaibo * 文章内容都是根据自己工作情况实践得出. *版权声明:本博客欢迎转发,但请保留原作者信息! http://www.cnblogs.com/horizonli/p/5332 ...
- [原]jenkins(五)---jenkins添加项目
/** * lihaibo * 文章内容都是根据自己工作情况实践得出. http://www.cnblogs.com/horizonli/p/5332258.html 版权声明:本博客欢迎转发,但请保 ...
随机推荐
- 用PHP实现单向链表
供参考,代码还可继续打磨 同时放在了我的github上:https://github.com/hheedat/demo/blob/master/learn_php/58_linked_list.php ...
- 不能将“const char [7]”转换为“LPCTSTR”
試試用強制轉換變數型態的方法吧,像這樣(LPCTSTR)"WinSun",若不行再試L"WinSun",再不行試_L"WinSun".
- SQL日期(转)
通常,你需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天.你们大部分人大概都知道怎样把日期进行分割 (年.月.日等),然后仅仅用分割出来的年.月.日等放在几个 ...
- Linux下STM32开发环境的搭建
目录 一.概述 1.目的 2.开发环境描述 3.Eclipse构建的STM32集成开发环境结构 4.GDB / GDB Server 调试模型 二.搭建步骤 三.详细的搭建过程 1.安装eclipse ...
- Class.forName()的作用与使用总结(转载)
转载自:Class.forName()的作用与使用总结 1.Class类简介: Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识.这项信息纪录了每个对象所属的类.虚拟机 ...
- 软件测试 -- alpha测试和beta测试的区别
alpha测试是在用户组织模拟软件系统的运行环境下的一种验收测试,由用户或第三方测试公司进行的测试,模拟各类用户行为对即将面市的软件产品进行测试,试图发现并修改错误. Beta测试是用户公司组织各方面 ...
- 用python实现k近邻算法
用python写程序真的好舒服. code: import numpy as np def read_data(filename): '''读取文本数据,格式:特征1 特征2 -- 类别''' f=o ...
- eclipse中mavean的使用配置
eclipse-jee-neon-R-win32 maven-3.3.9 JDK jdk-8u101-windows-i586 eclipse中配置mavean的步骤就不说了,网上很多教程,也很简单 ...
- chkconfig用法
有时候为了方便管理,我们常常喜欢在Linux中将之安装为服务,然后就可以使用服务来管理. 但是当我们运行安装服务的命令时候,假设服务名为myservice #chkconfig --add myser ...
- [XJOI NOI2015模拟题13] B 最小公倍数 【找规律】
题目链接:XJOI - NOI2015-13 - B 题目分析 通过神奇的观察+打表+猜测,有以下规律和性质: 1) 删除的 n 个数就是 1~n. 2) 当 c = 2 时,如果 n + 1 是偶数 ...