CABAC编码

H.264/AVC标准采用了很多新技术和新方法,大大提高了视频编码效率,其中CABAC便是H.264/AVC采用的新型熵编码方法之一。CABAC采用了高效的算术编码思想,同时充分考虑了视频流相关统计特性,大大提高了编码效率。概括起来,CABAC有三个丰要特点:
      (1)上下文建模提供编码符号条件概率分布的估计。利用适当的上下文模型,在编码当前符号时,根据已编码的临近符号的概率统计,在不同的概率模型间转换,借此去掉符号间的冗余。
      (2)算术编码可以给每一个符号字母分配非整数比特,因此符号能以接近它的熵率被编码。这对概率大于O.5的符号很有效。如果选择了高效的概率模型,符号概率常常大于O.5,这时分数比特就比UVLC的整数比特(至少1比特)高效得多。
      (3)自适应的算术编码可以使熵编码器自适应动态符号的概率统计。一般情况下,运动矢量的概率统计随空间、时间的不同,或序列、码牢的不同可以发生较大的变化。因此,自适应模型由于充分利用已编码符号的概率统计,可使算术编码更好地适应当前符号的概率,从而提高了编码效率。

CABAC包括三个部分:二进制化、上下文建模和二进制算术编码


下面对每个部分进行详述:
(1)二进制化
       CABAC是二进制算术编码,对非二进制符号如运动矢量、宏块类型、参考帧号以及变换量化后的残差数据,需要预先进行二进制化。在H.264/AVC标准中,CABAC二进制化方案由基本方案和串接方案组成。基本方案有一元码(Unary binarization,U),截断一元码(Truncatedunary binarization,TU),K阶指数哥伦布码(Kthorder Exp_golomb binarization,UEGK)和定长码(Fixed.1ength binarization,FL)四种。串接方案由基本方案串接而成。不同的二进制化方案适用于不同类型的语法元素。对于数值变化范围较大的残差数据(如运动矢量与运动矢量预测值间的残差数据MVD)用UEGK码表示对于简单的符号标志元素用FL码表示。下面是四种基本方案的编码方法:

U二进制化编码:此方法将一个无符号整数X,编码为X个“1”并加上一个后缀位“0”。例如,整数3转换为“lllO”。

TU二进制化编码:此方法根据参数cMax采用不同的转换方法。如果无符号整数x<cMax,用Unary binarization方法转换;如果x=cMax,X被转换成X个“1”。

UEGK二进制化编码:用此方法转换后的码字由两部分构成:前缀和后缀。前缀部分由Unary binarization转换得到。

FL二进制化编码:此方法为语法元素工设定固定的长度。假如0≤X<cMax,其长度L=

      CABAC把待编码的语法元素按照一定的规则转换为只用“0”和“l”表示的二进制比特流,称为比特流(bin string),然后采用不同的概率模型对bin string进行编码,充分考虑了视频流的相关性,能适应信号统计特性的变化,容易达到渐进性能。在编码过程中,bin string的信源符号被分为大概率符号(Most Probability Symbol,MPS)和小概率符号(Least Probability Symbol,LPS)。若MPS为“0”,则LPS为“l"。反之,若NIPS为“l",则LPS为“0”。但当MPS与LPS的出现概率相差比较大时,根据信息熵的原理,bin string的熵值比较小,压缩效果比较好。如果MPS与LPS出现概率相当或者相等,bin string的熵值就比较大,则压缩效果不明显。

(2)上下文建模
      编码符号具有上下文相关性,利用已编码符号提供的上下文信息,为编码符号选择合适的概率模型,这就是上下文建模。它是为了对与运动、模式和结构信息相关的句法元素进行编码而设计的。通过对上下文模型的构建,摹本概率模型能够适应随视频图像而改变的统计特性,降低符号间的冗余度,并大大减少运算开支。
      CABAC将片作为算术编码的牛命周期,H.264/AVC标准将一个片内可能出现的数据划分为399个上下文模型,每个模型均有自己的上下文序号(Ctxldx),每个不同的字符依据对应的上下文模型,来索引自身的概率查找表。即收到字符后,先索引该字符的Ctxldx,才能找到它的概率查找表(TransldxLPS)。这些模型的划分精确到比特,几乎大多数的比特和它们邻近的比特处于不同的上下文模型中。查找每个比特所对应的上下文模型有两个步骤:
      第一步:确定该比特所属的句法元素。CABAC为每个句法元素分配了一个上下文模型区间,详见Table9.1l。
      第二步:按照某一个法则为当前比特在上一步中得到的区间中找到对应的Ctxldx。该法则对不同的句法元素各不相同,它通常用表来表示。那些399个上下文模型模型分为4种类型:第一种类型根据左边和上边的语法元素对当前的语法元素进行预测。第二种类型仅用于宏块类型和予宏块类型。其中第n比特的类型要参考前面已编码的n-1比特所采用的类型。第三、四种类型只用于残差。第三种类型不依赖前面的编码数据,而是依赖扫描路径的位置。第四种类型还包括对编码积聚数量的计算。在CABAC中用“个有代表性的概率值来表示LPS的概率。这64个概率值通过公式(3.1)和(3.2)来计算产生:

值可以用7个比特来表示。

 

       前文提到CABAC的生命期是片,每个片开始,要对399种上下文模型全部过行初始化工作,初始化的步骤是:

 

 

 

 

 

 

 

 

 

 

(3)二进制算术编码
       概率估计和编码器构成了一个自适应二进制算术编码器。概率估计是在前一次上下文建模阶段更新后的概率估计。在对每个二进制数值编码过后,这个概率估计的值又要根据刚刚编码的二进制符号进行调整。二进制算术编码是算术编码的特殊情况,其原理与一般算术编码一样。所不同的是,在二进制算术编码中编码序列只有“0"和“l一两种符号,所涉及的概率也只有P(0)和P(1)。概率区间分成两份,一份是MPS的编码区间,一份是LPS的编码区间。区间长度由每个信源符号的概率决定,LPS的编码区间总应该小于MPS的编码区间。若把LPS的概率记为Q,则MPS的概率记为P=I-Q。在编码进程中,如果有连续的LPS输入,有可能出现Q>P的情况,此时MPS和LPS所代表的信源符号要互换,以确保MPS所代表的信源符号的概率始终大于LPS所代表的信源符号的概率。在每个片开始时,CABAC进行初始化,建立了一个概率状态表。在进行二进制算术编码时,每一位的概率状态值通过查概率状态表得到。而且每编码完一位,就要对概率状态表中的状态值进行更新。概率状态值的更新是这样实现的:如果编码的比特位(binval)是NIPS,概率状态值a加l,这意味着R值减小,(1.R)值增大,这实际就是表示下一次出现MPS的概率增大,出现LPS的概率减小。如果a=62,表示(1.n)已经达到最大,这时a不再改变,直到出现LPS。如果编码的比特位biIlvm是LPS,且a=0,表示MPS和LPS的概率相等,MPS和LPS的值进行互换。具体的概率值更新参考公式(3.3)

 

 

       为了方便观察,我们给出CABAC概牢估计与更新模型图(如图3.2)。在处理binval时,概率的刷新有两个方向:如果binval是LPS,则LPS的概率变大,顺着下图中的虚线向左寻找;如果binval是MPS,则LPS的概率变小,顺着下图中的实线向右寻找。我们可以看到,当出现MPS时的更新值都只是简单地指向当前值的下一位,即a+l。也即,当前处理的字符为MPS时,区间递进只是了区间的长度发生了改变,而作为影响实际输出值的L却没有发生改变,这个现象意味着如果输入流中连续出现大量的MPS,或者MPS相对LPS出现的概率比较高时,可以达到极高的压缩效果,编码输出的码率也更接近熵率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455731.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【教程分享】Jmeter入门教程

好&#xff01;回归学长每周的教程分享&#xff01; PART2 >今天又来分享Jmter 因为最近好像有相关工作内容 提前准备资修一下 分享仅供参考- JMeter的作用对软件做压力测试 1.能够对HTTP和FTP服务器进行压力和性能测试&#xff0c; 也可以对任何数据库进行同样的测试&…

快速傅里叶变换python_FFT快速傅里叶变换的python实现过程解析

FFT是DFT的高效算法&#xff0c;能够将时域信号转化到频域上&#xff0c;下面记录下一段用python实现的FFT代码。 # encodingutf-8 import numpy as np import pylab as pl # 导入和matplotlib同时安装的作图库pylab sampling_rate 8000 # 采样频率8000Hz fft_size 512 # 采样…

rabbitmq的安装全过程

2019独角兽企业重金招聘Python工程师标准>>> 1 首先下载安装依赖elang 添加yum支持 cd /usr/local/src/ mkdir rabbitmq cd rabbitmq wget http://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm rpm -Uvh erlang-solutions-1.0-1.noarch.rpm rp…

【框架学习分享】HttpRunner

今天文章分为两部分 :) PART1 HttpRunner内容分享/ PART2 关于后厂村儿 10 Minutes HttpRunner: PART 1 首先感谢作者开源&#x1f44d; 因为最近工作需要用到HttpRunner&#xff0c; 于是便趁着周末学了下这个测试框架&#xff0c;感觉还可以~ 所以分享一下今天的学习记…

python报名_2019年少儿Python创意编程比赛报名时间

2019年Python创意编程比赛时间及相关规定&#xff1a;参赛对象 Python创意编程比赛设初中组和高中组。 全国各地初中、高中(含中等职业学校)在校学生均以个人名义报名参加。 参赛步骤 Python创意编程比赛分初评、复评和终评三个阶段&#xff0c;初评和复评以线上形式开展&#…

【分享】后厂村鲜为人知的另一面

好&#xff01;回归学长每周的杂谈分享&#xff01; 有人说“后厂村”像一座孤岛&#xff0c; 这里远离喧嚣&#xff0c;没有生活气息。 而刚刚到厂的学长&#xff0c; 却想和你分享他鲜为人知的另一面。 内容整理源于网络看客原创侵删 说起后厂村&#xff0c;也许是老北京人…

windows 下安装rabbitmq

2019独角兽企业重金招聘Python工程师标准>>> 1、下载 下载地址&#xff1a;http://www.rabbitmq.com/download.html 2、Windows上安装 2.1 安装安装Erlang 下载erlang&#xff1a;http://www.erlang.org/download/otp_win64_17.3.exe 安装&#xff1a; erlang安装完…

【Kubernetes】k8s 的基本使用指令

今天分享如题&#xff1a; Kubernetes 最近更新缓慢由于工作太忙惹&#xff0c;忙里偷闲整理愿能与君共勉&#x1f4aa; K8S对我来说是个新的技术栈&#xff0c;程序员就是需要一直充电&#x1f50b; 加油&#xff0c;一起进步&#x1f4aa; 结构模型 k8s 是经典的一对多模…

c语言 malloc_C语言快速入门——动态内存分配

在前面一系列的字符串操作中&#xff0c;我们都是先定义一个固定大小的字符数组&#xff0c;然后根据所需&#xff0c;或拷贝、或连接、或格式化来为这个数组提供内容。固定大小的数组意味着在程序运行期间&#xff0c;数组所占用的内存是确定的(即划分了固定数量的内存)&#…

【经验分享】工程开发与Coding规范

今天分享分为两部分 :) PART01 工程开发代码规范分享/ PART02 关于某易云自动签到听歌分享- 5Mins DevCoding Rule: PART 1 了解真实工程开发&#x1f3d7;..... 本篇内容分享的宗旨: 学长工作经验之谈仅作分享&#x1f3f7; Ready,Go 代码管理——工具篇 •工程上首先需要…

过滤器与拦截器区别

过滤器与拦截器区别 参考&#xff1a;http://www.cnblogs.com/dreamroute/p/4198087.html?utm_sourcetuicool 过滤器 过滤器是一个程序&#xff0c;它先于与之相关的servlet或JSP页面运行在服务器上。它是随你的web应用启动而启动的&#xff0c;只初始化一次&#xff0c;以后就…

二进制-高效位运算

数独 数独是介绍位运算的好例子&#xff0c;运用位运算和不运用效率差别还是挺大的。我们先看数独需求: 1、当前数字所在行数字均含1-9&#xff0c;不重复 2、当前数字所在列数字均含1-9&#xff0c;不重复 3、当前数字所在宫&#xff08;即3x3的大格&#xff09;数字均含1-9&a…

pytorch resnet50_PyTorch终于能用上谷歌云TPU,推理性能提升4倍,我们该如何薅羊毛?...

晓查 发自 凹非寺量子位 报道 | 公众号 QbitAIFacebook在PyTorch开发者大会上正式推出了PyTorch 1.3&#xff0c;并宣布了对谷歌云TPU的全面支持&#xff0c;而且还可以在Colab中调用云TPU。之前机器学习开发者虽然也能在Colab中使用PyTorch&#xff0c;但是支持云TPU还是第一次…

Android Studio主题设置、颜色背景配置

2019独角兽企业重金招聘Python工程师标准>>> color-themes 效果展示 打开http://color-themes.com/有很多样式可供选择 1. Monokai Sublime Text 3(color theme) 2. Solarized Light (color theme) 3. Visual Studio 2015 Dark(color theme) 导入方式 下载主…

Java多线程实现异步调用

在Java平台,实现异步调用的角色有如下三个角色&#xff1a;调用者、 提货单 、真实数据&#xff0c;一个调用者在调用耗时操作,不能立即返回数据时,先返回一个提货单 .然后在过一断时间后凭提货单来获取真正的数据.去蛋糕店买蛋糕&#xff0c;不需要等蛋糕做出来(假设现做要很长…

sql server 2008 r2卸载重装_免费下载:Intouch软件、Windows操作系统、SQL数据库,VB6.0、C#...

为大家整理了常用的Windows操作系统和安装软件&#xff0c;基本上都是经过我们项目测试OK的版本&#xff0c;以后项目调试就齐全了&#xff0c;不用再“东奔西走”&#xff0c;“小鹿乱撞”了。整理不易&#xff0c;若对您有帮助请关注并转发&#xff0c;以便帮助到更多的人。I…

Android ToolBar 使用完全解析

ToolBar简介 ToolBar是Android 5.0推出的一个新的导航控件用于取代之前的ActionBar&#xff0c;由于其高度的可定制性、灵活性、具有Material Design风格等优点&#xff0c;越来越多的应用也用上了ToolBar&#xff0c;比如常用的知乎软件其顶部导航栏正是使用ToolBar。官方考虑…

【零散积累】传输文件(sz/rz/scp命令)

来自wiki迁移页面路径&#xff1a;刘旺的主页 / 个人零散积累 / 01> 传输文件&#xff08;sz/rz/scp命令&#xff09; 工作中的传输文件会出现在linux之间&#xff0c;或者linux与windows之间。 一、怎么实现linux与windows之间的文件传输&#xff1f; 1.sz和rz是什么 s…

x264_macroblock_cache_load()

功能:完成将已编码数据参数和待编码数据装入到h->mb.cache中,下图是BUF中存储的数据在以MB为单位的时候的存储顺序 x264_macroblock_cache_load( h, i_mb_x, i_mb_y );//是把当前宏块的up宏块和left宏块的intra4x4_pred_mode&#xff0c;non_zero_count加载进来&#xff0c…

生活中常见物联网实例_物联网网关常见问题解答(一)

1.为什么物联网解决方案需要网关&#xff1f;物联网网关弥合了设备&#xff0c;传感器&#xff0c;设备&#xff0c;系统和云之间的通信鸿沟。通过系统地连接云&#xff0c;物联网网关提供了本地处理和存储&#xff0c;并具有基于传感器输入的数据自主控制现场设备的功能。物联…