CABAC编解码原理分析

news2024/11/24 2:19:05

CABAC编解码原理分析


文章目录

  • CABAC编解码原理分析
  • 一、二进制算数编码
  • 二、CABAC编码
  • 三、CABAC编解码与普通的二元算术编码的区别
  • 四、 CABAC编解码中各个变量的计算:
  • 五、 一些其他问题:
  • 六、 总结:
  • 七、参考资料


一、二进制算数编码

cabac是一种特数的二进制算数编码,假设我们有由“0”和“1”组成的字符串需要编码,且“0”和“1”的出现的概率概率分别为0.4和0.6,那么我们分配如下初始概率区间:

01
[0, 0.4)[0.4, 1]

我们按照这个概率区间对“1100”进行编码请添加图片描述

  • 1,如图所示,编码第一个“1”时,区间长度为1,(0,0.4)为“0”的编码区间,(0.4,0.6)为“1”的编码区间,因此第一个“1”编码完成后,区间长度L变为0.6(0.4~1);此时重新划分编码区间 区间长度 L = 1 − 0.4 = 0.6 L=1-0.4=0.6 L=10.4=0.6; 因此“0”的编码区间变为(0.4,0.4+L*0.4),也就是(0.4,0.64);
  • 2,依次类推。将 1100这四个数编码完成后,编码区间为(0.64,0.6976),我们取这个区间的任意一个数,就能在知道长度和编码概率的情况下,恢复这个数;
  • 3,假设我们取0.65,解码端恢复这个数时,首先判断0.65在(0.4,1)这个区间,因此第一位为“1”,再判断其在(0.64,1)这个区间,因此第2位也是“1”,依次类推,可恢复编码前的数据“1100”,当然了,这种编码方式需要知道原始数据的长度和编码后的区间,不然会一直判断下去;

二、CABAC编码

🐺我们以上的编码是按照,0出现的概率为0.4,1出现的概率为0.6来进行编码的,但实际应用中,我们怎么得到这个真实的概率呢?
🐰CABAC中我们根据如下几个条件对其进行分类,有一张大的查找表look_up确定每个分类的“0”和“1”的概率:

  • 1,不同的语法元素
  • 2,该宏块(MB)的上方宏块,左面宏块的情况;
  • 3,该语法元素的比特位

举个例子,假设一个4bit的语法元素,syn;

🐸首先我们判断上方宏块的情况condA(上方宏块可访问则condA为1,否则为0), 和左面宏块的编码情况condB(上方宏块可访问则condB为1,否则为0), syn语法元素的基准值为Ctxoffset(查表确定,这里假设为0),偏差Ctxinc = f(condA, condB, bin), 这里的bin代表当前编码是第几个比特,f(condA, condB, bin)的表达式每个语法元素都不一样,需要翻书确认(详见参考资料【4】)本文假定Ctxinc = f(condA, condB, bin) = condA + condB + bin,总的查表地址如下所示
C t x i d x = C t x o f f s e t + C t x i n c = C t x o f f s e t + f ( c o n d A , c o n d B , b i n ) Ctxidx=Ctxoffset+Ctxinc=Ctxoffset + f(condA, condB, bin) Ctxidx=Ctxoffset+Ctxinc=Ctxoffset+f(condA,condB,bin)
🐯假设syn为1100,且上方和左方的宏块都不可获取(比如最左上角的宏块),

  • 我们编码第一个“1”时,计算Ctxidx = 0,从 look_up[0]中获取此时1和0的概率,进行编码,由于编码的是“1”,因此我们编码完成后需要增大look_up[0]中“1”的概率,减小0的概率;
  • 编码第二个“1”时,Ctxidx = 1, 我们同样先从 look_up[1]中获取此时1和0的概率,进行编码,由于编码的是“1”,因此我们编码完成后需要增大look_up[1]中“1”的概率,减小0的概率;
  • 我们编码第三个“0”时,计算Ctxidx = 2,从 look_up[2]中获取此时1和0的概率,进行编码,由于编码的是“0”,因此我们编码完成后需要增大look_up[2]中“0”的概率,减小1的概率;
  • 编码第四个“0”时,Ctxidx = 3, 我们同样先从 look_up[3]中获取此时1和0的概率,进行编码,由于编码的是“0 ”,因此我们编码完成后需要增大look_up[3]中“0”的概率,减小1的概率;

也就是说, CABAC会在编码过程中不断的更新该情况下“0”“1”出现的概率,以求编码时用到的概率趋近于真实的概率;
至于概率和编码的关系,就需要参考香农定理了,网上有很多,这里就不多做解释了;

三、CABAC编解码与普通的二元算术编码的区别

  • 2.1 cabac里面1,和0出现的概率是不断变换的:
    🐶cabac编码为每个语法元素的每个bit都分配了一个概率模型;每个语法元素的概率模型的基地址为Ctxoffset,根据上方和左边LCU的情况,计算出每个比特的偏移地址ctxinc,从而得到ctxIdk = ctxoffset + ctxinc;
    🐭在一个slice开始时,为每个模型分配一个初始概率值,每编码1bit,对该bit的概率模型进行更新;

  • 2.2 cabac输出编码区间的溢出情况:
    🐹普通二元算术编码的编码区间越来越小,最终输出一个很小的区间;
    🐰cabac则是设定区间大小为【0,510】,当区间小于256时,就扩大区间,并输出0/1的方式,记录扩大区间的情况(书中称为“归一化”)。
    🐸解码时,初始区间为【0,510】,根据编码端扩大区间时输出的码流(书中记为OFFSET,也就是“区间归一化”过程输出的码流),来还原区间变化过程,从而达到解码的作用;
    🐶这个归一化的过程有点复杂,可以简单理解为当编码区间变为(0.6,1)时,那么无论后面怎么编码,最终的编码出的值都肯定大于0.5,我们就现输出一个0.5,即小数位的第一个比特是1,当编码区间变为(0.6,0.75)时,无论后面怎么编码,肯定都小于0.75,因此小数位第二位肯定是0,此时就可以先输出个“0”,虽然不准确,但大概就是这么个意思;

四、 CABAC编解码中各个变量的计算:

  • 🐨LPS : 低概率符号(0或1,如1.1所说,概率是会变化的)
  • 🐻MPS :高概率符号(1,或0,与LPS相反)
  • 🐷L,R:区间左边界和区间长度;【0,510】就是L=0,R=510;
  • 🐽 R L P S R_{LPS} RLPS : LPS编码区间的长度;
  • 🐮 R M P S R_{MPS} RMPS:MPS编码区间的长度;
  • 🐗编码区间【L , L+R】 = 【L,L+R—LPS】 【L+R—LPS, L+R】
  • 🐵 σ \sigma σ : 代表MPS的概率,这个值越大,MPS对应的概率越大
  • 🐒 o f f s e t offset offset : 初始为编码出来的前9bit码流;
  • 🐴readbits(1) : 表示读入1bit码流,用于解码时更新offset值,从而更新编码区间

🐎 🐫 🐑 🐘 🐼 🐍 🐦 🐤 🐥 🐣 🐔 🐧 🐢 🐛 🐝 🐜 🐞 🐌 🐙 🐠

五、 一些其他问题:

  • 5.1 怎么判断一个语法元素结束了呢?
    🐎 这个和二值化的方式有关,比如FL二值化,有cmax;U则是0为一个语法元素的最后1bit;

  • 5.2 怎么判断当前编码或解码的元素是什么?
    🐫编码时,语法元素有严格的编码条件和编码顺序,比如h264的编码,若为p帧,第一个一定是编码mb_skip_flag,若mb_skip_flag为0,下一个必定编码mb_type,若mb_type为pcm,则必定编码残差系数;
    🐑解码端同理,若为p帧,第一个一定解码mb_skip_flag,若解码出的mb_skip_flag为0,下一个语法元素一定是mb_type,否则是end_of_slice_flag,知道下一个编码的语法元素,自然就知道其对应的ctxoffset,二值化方式等信息了;

六、 总结:

本文只是对博主学习CABAC期间一些疑问的点的总结,完整的学习cabac编码建议阅读官方标准协议(参考文献【3】);个人认为,学习好cabac,必须得去读官方协议文档,不然很难弄明白;

七、参考资料

  1. 博客园的一个大佬,写的很全,对理解H264帮助很大
  2. CSDN : H.265/HEVC编码原理及其处理流程的分析
  3. H264官方标准协议下载链接(英)
  4. 新一代高效视频编码H.265/HEVC:原理、标准与实现,作者:万帅、杨付正

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

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

相关文章

Nginx网络服务的配置

目录 一、Nginx概述 二、Nginx相对于Apache的优点 三、配置Nginx网络服务 1.编译安装和启用Nginx服务 2.修改Nginx主配置文件 一、Nginx概述 Nginx是一款高性能、轻量级Web服务软件。稳定性高,系统资源消耗低,对HTTP并发连接的处理能力高&#xff…

DNS 监控工具

域名系统 (DNS) 解析(也称为 DNS 查找)是在现代 IT 基础架构中建立连接和通信所需的基本组件之一。这是将人类可读的域或主机名与机器可读的 IP 地址映射的过程,使用户更容易访问组织的公共和专用网络上的主机。在最基…

SpringBoot 三级缓存解决循环依赖源码分析

文章目录 1. 不使用三级缓存可能存在的问题2. 源码分析2.1 对象实例的创建过程2.2 三级缓存的处理 3. 遗留问题 1. 不使用三级缓存可能存在的问题 在 SpringBoot 框架中,如果只存在两级缓存,那么当发生循环依赖的时候可能存在异常的对象创建流程如下图所…

如何解析 Impala 的 C++ 报错堆栈

生产环境用的都是release build,C代码产生的报错堆栈里没有函数名,很难像Java报错堆栈那样方便定位问题。下面是一个常见的启动报错,一般在CLASSPATH设置有误时发生: I0619 19:13:00.951988 5279 status.cc:129] Failed to find…

【全新升级版】R语言实战(第3版),超过30万学习者入手的R语言教程

在我刚入学那会儿初次接触R语言,看的第一本工具书就是《R语言实战》,收获良多,当时还只是第二版。最近和人民邮电出版社的好朋友交流发现,他告诉我上个月刚刚出版了《R语言实战 第三版》 ,豆瓣评分9.2,被称…

Linux之生产者消费者模型(上)——单生产者单消费者

文章目录 前言一、生产者消费者模型1.生产消费2.生产消费关系321原则生产消费模型的特点 二、基于阻塞队列(blockqueue)的生产消费模型1.概念2.单生产单消费模型代码运行分析两种情况导致的现象生产者生产的慢,消费者消费的快生产者生产的快&…

精彩回顾 | “XR云新未来:弹性算力赋能可交互、沉浸式商业实践” 赋能云端虚拟世界

6月15日,由平行云联合首都在线共同主办,中关村软件园协办,以“XR云新未来|弹性算力赋能可交互、沉浸式商业实践”为主题的XR行业交流盛会在北京成功举办。 活动邀请多位XR行业大咖,共同见证首都在线联合平行云发布Cloud XR平台。…

MySQL数据库——索引

MySQL数据库——索引 一、索引基本常识1.索引的概念2.索引的作用3.创建索引的依据 二、索引的分类1.普通索引2.唯一索引3.主键索引4.组合索引5.全文索引 三、索引的查看与删除1.查看索引2.删除索引 一、索引基本常识 数据库索引是数据库管理系统中一个排序的数据结构&#xff0…

OpenGL 深度测试

1.简介 深度缓冲就像颜色缓冲(Color Buffer)(储存所有的片段颜色:视觉输出)一样,在每个片段中储存了信息,并且(通常)和颜色缓冲有着一样的宽度和高度。深度缓冲是由窗口系统自动创建的&#xf…

6 从0开始学PyTorch | 构建模型、损失函数、广播机制

前面都在学一些PyTorch的基本操作,从这一节开始,真正进入到模型训练的环节了。原作者很贴心的一步步教我们实现训练步骤,并且还从一个最简单的例子出发,讲了优化方案。 宏观上的训练过程 image.png 当然这里所说的训练还没有到深…

vue进阶-vue-cli

CLI是Command-Line Interface,翻译为命令行界面,但是俗称脚手架。 Vue-CLI是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速搭建 Vue 开发环境以及对应的 webpack 配置。 vue项目相关文件以 .vue 为后缀,需要事先安装 N…

【LeetCode热题100】打卡第25天:柱状图中最大的矩形

文章目录 柱状图中最大的矩形⛅前言🔒题目🔑题解 柱状图中最大的矩形 ⛅前言 大家好,我是知识汲取者,欢迎来到我的LeetCode热题100刷题专栏! 精选 100 道力扣(LeetCode)上最热门的题目&#xf…

GEE:绘制一个点的Landsat1985-2020年逐日NDVI时间序列折线图

作者:CSDN @ _养乐多_ 本文记录了在GoogleEarthEngine(GEE)平台上选择一个点,根据该点在时间段内所有有效像素值绘制折线图的代码。 结果如下图所示, 文章目录 一、代码二、代码链接一、代码 var roi = geometry Map.addLayer(roi, {color

6.15集合1 和 泛型

举例 1:中药店,每个抽屉外面贴着标签 举例 2:超市购物架上很多瓶子,每个瓶子装的是什么,有标签 举例 3:家庭厨房中 集合 我们接下来要学习的内容是Java基础中一个很重要的部分:集合 1 Coll…

【服务器数据恢复】AIX下raid故障导致pool无法加载的数据恢复案例

服务器数据恢复环境: IBM P740小型机AIX操作系统Sybase数据库V7000存储。V7000存储配置了12块SAS机械硬盘(其中一块为热备盘)组建一组raid5磁盘阵列。存储设备一共创建了2组Mdisk,加到一个pool中。 服务器故障: IBM V…

网络管理与维护(三)网络安全

网络安全 网络安全威胁 非授权访问 信息泄漏 破坏数据完整性 拒绝服务攻击 利用网络传播病毒 安全服务和安全机制 总结 1.通常可以把网络信息安全的问题划分为物理层、网络层、数据层和内容层四个层面。 2.网络存在的威胁主要表现: 非授权访问、信息泄漏、破坏数…

基于Django+Vue开发的社区疫情管理系统(附源码)

基于Django、Django Rest framework、Vue的前后端分离的社区疫情管理系统。 一、系统功能 用户管理(只有管理员有权限) 用户注册用户登录修改用户信息删除用户修改密码权限管理 首页数据展示 国内疫情数据展示国内疫情新闻近30日的感染人数(…

【论文阅读】Adap-t: Adaptively Modulating Embedding Magnitude for Recommendation

【论文阅读】Adap-𝜏: Adaptively Modulating Embedding Magnitude for Recommendation 文章目录 【论文阅读】Adap-𝜏: Adaptively Modulating Embedding Magnitude for Recommendation1. 来源2. 介绍3. 模型解读3.1 准备工作3.1.1 任务说明3.1.2 基于嵌…

Linux:http服务(Apache 2.4.57)源码编译——配置网站 || 入门到入土

目录 1.下载源码包 2.配置httpd运行环境 3.编译源码包安装apache软件 4.优化执行路径 5.添加httpd系统服务 正文 1.httpd服务器的基本配置 2.本章持续更新 我的服务器为centos7系统 1.下载源码包 访问官方网站↓↓↓ Welcome! - The Apache HTTP Server Project ↑↑…

ONLYOFFICE Docs 7.4 版本大大增强了图形编辑功能!

ONLYOFFICE Docs 7.4 版本大大增强了图形编辑功能! 书接上文: 北冰洋汽水我的最爱https://mp.weixin.qq.com/s?__bizMzI2MjUyNzkyNw&mid2247493734&idx1&sn416c4ee5756ea59883591d3c2c4a6ae4&chksmea4b66bedd3cefa89050e25b661e0be16…