基于上下文自适应可变长熵编码 CAVLC 原理详细分析

news2024/11/27 8:35:46

CAVLC

CAVLC,即Context-Adaptive Variable-Length Coding,是一种用于视频压缩的编码技术,特别是在MPEG-4视频编码标准中使用。CAVLC是一种熵编码方法,它根据视频数据的上下文信息来调整编码长度,以实现更有效的数据压缩。

CAVLC的主要特点包括:

  1. 上下文适应性:编码器会根据视频帧中的特定上下文来选择最合适的编码长度,例如在图像的平坦区域使用较短的编码,而在边缘区域使用较长的编码。
  2. 可变长度编码:编码的长度不是固定的,而是根据数据的统计特性来确定,这有助于进一步压缩数据。
  3. 效率:CAVLC提供了比固定长度编码更高的压缩效率。

CAVLC通常用于视频编码的残差数据部分,即在变换编码(如DCT)之后,用于编码变换系数。这种编码方式可以显著减少编码后数据的比特率,从而提高视频传输和存储的效率。

CAVLC原理

相关名词解释

  • TotalCoeffs :非零系数,代表ZigZag扫描后序列中非0值的个数;取值 0~16。
  • TrailingOnes :拖尾系数,代表ZigZag扫描后序列中+1,和-1的总个数,取值0~3,如果超过3,则为3,在ZigZag扫描序列中从右到左选取三个,作为拖尾系数,其余的系数就当普通的非零系数;TotalCoeffs和TrailingOnes是通过查表方式,共有4 个变长表格和 1 个定长表格;其中定长表格是6 个比特长,高 4 位表示TotalCoeffs,低 2 位表示TrailingOnes。
  • TotalZeros: 编码最后一个非零系数前零的数目。
  • NC:当前块值,用来决策coeff如何编码的变量; 上述的 5 个表格的选择就是根据 NC 值来决定的。
  • ZerosLeft: 当前系数之前所有的0的个数,其初始值等于TotalZeros。
  • RunBefore: 编码每个非零系数前0的个数。
  • Levels:编码除了拖尾系数之外的非零系数的幅值。

NC 计算

  • 该值的求解过程中,体现了基于上下文的思想。除了色度的直流系数外,其它系数类型的 NC 值是根据当前块左边 4x4 块的非零系数数目(NA)和当前块上面 4x4 块的非零系数数目(NB)求得的。当输入的系数是色度的直流系数时,NC = -1。求 NC 的过程见表 6.10,X 表示与当前块同属于一个片并可用。 选择非零系数数目和拖尾系数数目的编码表格的过程见表 6.11 。
    在这里插入图片描述

Levels 计算

  • 非零系数的幅值(Levels)的组成分为两个部分,前缀(level_prefix)和后缀(level_suffix)。levelSuffixsSize 和 suffixLength 是编码过程中需要使用的两个变量。后缀是长度为 LevelSuffixsSize 位的无符号整数。通常情况下变量 levelSuffixsSize 的值等于变量 suffixLength 的值,有两种情况例外:
    • 当前缀等于 14 时,suffixLength 等于 0,levelSuffixsSize 等于 4。
    • 当前缀等于 15 时,levelSuffixsSize 等于 12。
  • 变量 suffixLength 是基于上下文模式自适应更新的,suffixLength 的更新与当前的 suffixLength 的值以及已经解码好的非零系数的值(Level)有关。suffixLength 数值的初始化以及更新过程如下所示:
    • 普通情况下 suffixLength 初始化为 0,但是当块中有多于 10 个非零系数并且其中拖尾系数的 数目少于 3 个,suffixLength 初始化为 1。
    • 编码在最高频率位置上的非零系数。
    • 如果当前已经解码好的非零系数值大于预先定义好的阈值,变量 suffixLength 加 1。 决定是否要将变量 suffixLength 的值加一的阈值如表 3 所示。第一个阈值是 0,表示在第一个非零系数被编码后,suffixLength 的值总是增加 1。
      在这里插入图片描述
  • Levels 的算法过程
  • 将有符号变成无符号:如果level > 0: levelcode = level << 1 - 2 如果level < 0: levelcode = -(level << 1) - 1 ;(上面的公式对应句法也就是把正数转换为偶数,负数转换为奇数。比如level=1时,levelcode=0,level=-1,levelcode=1)。
  • 根据level_prefix 码表进行查表: level_prefix = levelcode / (1 << suffix_length) 得到level_prefix之后通过查表即可以获得对应该如何编码。(在句法中,有 levelCode = level_prefix << suffix_length,进行转换,就可以得到上面的公式)。
  • Suffix_length表示的是level编码后缀的长度,后缀用0填充,长度为多少就填充多少个0。初始值为0,如果非零系数 > 10且 拖尾数目 < 1的时候,suffix_length初始值为1,if(suffix_length == 0) suffix_length++; else if(level > 3 << (suffix_length - 1) && suffix_length < 6) suffix_length++
    在这里插入图片描述
    在这里插入图片描述

CAVLC示例

  1. 编码残差数据经过变换量化后的4x4 块矩阵举例如下:
    在这里插入图片描述
  2. 量化后矩阵系数有负数的原因:因为在变换前,一般字节的值在 0~255,为了减少像素绝对值的波动,先把数值移位一下,变成-128~127;这样就出现了负数,移位之后再进行变换和量化操作。
  3. 对 4x4 矩阵进行 zigzag 扫描:0、0、5、3、2、-1、0、0、0、1、0、0、0、0、0、0
  4. TotalCoeffs = 5
  5. TrailingOnes = 2
  6. TotalZeros = 5
  7. NC = 3 (假定)
  8. 编码coeff_token:根据TotalCoffes,TrailiingOnes以及NC而确定;确定coeff_token编码为 0000101
    在这里插入图片描述
  9. 编码TrailingOnes:标志位符号Trailing_ones_sign_flag 中 0 表示 +1,1 表示 -1,从右到左依次编码为 01
  10. 编码除拖尾以外的非零系数的Levels:按照 zigzag 的逆序,从右向左。
  • 编码“2”:levelcode = 2 << 1 - 2 = 2; level_prefix = 2 / (1 << 0) = 2; 此时suffix_length == 0,没有后缀,同时suffix_length++,suffix_length = 1. 查表,level_prefix = 2时,编码为“001”,且suffix_length = 0,无后缀,此时编码为:001
  • 编码“3”: levelcode = 3 << 1 - 2 = 4; level_prefix = levelcode / (1 << suffix_length) = 4 / (1 << 1) = 2 ; level_prefix = 2, 编码为“001”,且suffix_length = 1, 填充 1 位“0”,根据公式:if(suffix_length == 0) suffix_length++; else if(level > 3 << (suffix_length - 1) && suffix_length < 6) suffix_length++ ;条件不成立,则此时suffix_length不需要累加 1,suffix_length依旧等于 1,此时编码为:0010
  • 编码"5": levelcode = 5 << 1 - 2 = 8; level_prefix = levelcode / (1 << suffix_length) = 8 / (1 << 1) = 4 ; level_prefix = 4,suffix_length = 1,此时, 编码为“00001”,且此时suffix_length == 1, 填充1位“0”, 根据公式,条件成立,suffix_length需要累加1;suffix_length = 2,最终编码为:000010
  1. 编码最后一个非零系数前的0的个数TotalZeros: 此时TotalZeros = 5, TotalCoeffs = 5, 查第一张表,因为TotalZeros=5,所以此时的编码为 101
    在这里插入图片描述
  2. 对每个非零系数前零的个数RunBefore进行编码,依旧采用ZigZag反序:
  • RunBefore 在以下两种情况下是不需要编码的:
    • 最后一个非零系数(在低频位置上)前零的个数;
    • 如果没有剩余的零需要编码(Σ[RunBefore]=TotalZeros)时,没有必要再进行 RunBefore 的编码;
  • 按照ZigZag逆序分别为 1, -1, 2, 3, 5,查表;
    • 对1编码: zerosLeft = 5, run_before = 3, 编码为010
    • 对-1编码: zerosLeft = 2, run_before = 0, 编码为1
    • 对2编码: zerosLeft = 2, run_before = 0, 编码为1
    • 对3编码: zerosLeft = 2, run_before = 0, 编码为1
    • 对5编码: zerosLeft = 2, run_before = 0, 最后一个系数不需要编码。
      在这里插入图片描述
  1. 最终的CAVLC熵编码之后码流为:0000101010010010000010101010111

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

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

相关文章

【从0到1,训练大模型,从llama3开始】

摘要: 随着大模型越来越多,大家肯定眼花缭乱。不知道选择哪个好,换句话说,不知道哪个才适合自己。 通过社长的实操:chatgpt3.5、gpt4、gpt4o、llama3、通义千问、豆包等大模型,总结是:大家都很好,都能一定程度上的帮助你。 不过怎么说呢,他们什么都懂,但是,什么都不…

sourcetree中常用功能使用方法及gitlab冲突解决

添加至缓存&#xff1a;等于git add 提交&#xff1a;等于git commit 拉取/获取&#xff1a;等于git pull ,在每次要新增代码或者提交代码前需要先拉取一遍服务器中最新的代码&#xff0c;防止服务器有其他人更新了代码&#xff0c;但我们自己本地的代码在我们更新前跟服务器不…

邮件安全篇:企业电子邮件安全涉及哪些方面?

1. 邮件安全概述 企业邮件安全涉及多个方面&#xff0c;旨在保护电子邮件通信的机密性、完整性和可用性&#xff0c;防止数据泄露、欺诈、滥用及其他安全威胁。本文从身份验证与防伪、数据加密、反垃圾邮件和反恶意软件防护、邮件内容过滤与审计、访问控制与权限管理、邮件存储…

面试题 17.14.最小K个数

题目&#xff1a;如下图 答案&#xff1a;如下图 /*** Note: The returned array must be malloced, assume caller calls free().*/ void AdjustDown(int* a,int n,int root) {int parent root;int child parent * 2 1;//默认左孩子是大的&#xff0c;将其与右孩子比较&am…

《机器学习》读书笔记:总结“第5章 神经网络”中的概念

&#x1f4a0;神经网络&#xff08;neural network&#xff09; 神经网络是由具有适应性的简单单元组成的广泛并行互联的网络&#xff0c;它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应。 神经网络中最基本的成分是 神经元(neuron / unit)&#xff0c;即上述定…

机械臂泡水维修|机器人雨后进水维修措施

如果机器人不慎被水淹&#xff0c;别慌&#xff01;我们为你准备了一份紧急的机械臂泡水维修抢修指南&#xff0c;帮助你解决这个问题。 【机器人浸水被淹后紧急维修抢修&#xff5c;如何处理&#xff1f;】 机械臂被淹进水后维修处理方式 1. 机械手淹水后断电断网 首先&am…

Hive分布式SQL计算平台

Hive分布式SQL计算平台 一、Hive 概述二、Hive架构三、Hive客户端 1、Hive有哪些客户端可以使用2、Hive第三方客户端 四、Hive使用语法 1、数据库操作2、内部表&#xff0c;外部表3、数据的导入与导出4、分区表5、分桶表6、复杂类型操作7、数据抽样8、Virtual Columns 虚拟列9…

压缩视频大小的方法 怎么减少视频内存大小 几个简单方法

随着4K、8K高清视频的流行&#xff0c;我们越来越容易遇到视频文件体积过大&#xff0c;导致存储空间不足、传输速度缓慢等问题。视频压缩成为解决这一问题的有效途径&#xff0c;但如何在减小文件大小的同时&#xff0c;保证视频质量不受影响呢&#xff1f;本文将为你揭晓答案…

(10)深入理解pandas的核心数据结构:DataFrame高效数据清洗技巧

目录 前言1. DataFrame数据清洗1.1 处理缺失值&#xff08;NaNs&#xff09;1.1.1 数据准备1.1.2 读取数据1.1.3 查找具有 null 值或缺失值的行和列1.1.4 计算每列缺失值的总数1.1.5 删除包含 null 值或缺失值的行1.1.6 利用 .fillna&#xff08;&#xff09; 方法用Portfolio …

OpenCV Mat类简介,Mat对象创建与赋值 C++实现

在 C 中&#xff0c;OpenCV 提供了一个强大的类 Mat 来表示图像和多维矩阵。Mat 类是 OpenCV 中最基础和最常用的类&#xff0c;用于存储和操作图像数据。 文章目录 Mat类简介Mat 类的定义Mat 类的构造函数 代码示例深拷贝示例赋值示例浅拷贝示例 Mat类简介 Mat 类是一个多维…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【29】Sentinel

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【29】Sentinel 简介熔断降级什么是熔断什么是降级相同点不同点 整合Sentinel自定义sentinel流控返回数据使用Sentinel来保护feign远程调用自定义资源给网关整合Sentinel参考 简介 熔断降…

ChatGPT实战100例 - (20) 如何玩转影刀RPA

文章目录 ChatGPT实战100例 - (20) 如何玩转影刀RPA背景需求需求分析与流程设计一、需求收集二、流程梳理三、可行性分析流程设计(详细步骤)具体步骤的影刀RPA实现流程图总结AIGC在影刀RPA中的使用总结其他RPA步骤中可能用到AIGC的地方展望总结ChatGPT实战100例 - (20) 如何玩…

EasyExcel相关

1. easyexcel–100M EasyExcel是一个基于Java的使用简单、节省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。 节省内存的原因&#xff1a;在解析Excel时没有将文件数据一次性全部加载到内存中&#xff0c;而是从磁盘上一行行读取数据&#xff0c…

深度学习之基础知识整理

现在大语言模型很火&#xff0c;但它的基础仍然是以神经网络为基础的深度学习&#xff0c;不懂神经网络&#xff0c;不了解深度学习&#xff0c;对于大语言模型的二次开发也是整不明白。 那到底需要了解哪些知识&#xff1f;才能看懂深度学习/神经网络的基础模型&#xff0c;想…

后端传递中文到前端 乱码问题

后端代码 前端 乱码 decodeURI(name);使用这个方法,这个方法应该是jquery中的方法 这样就不乱码了

Pointnet++改进即插即用系列:全网首发WTConv2d大接受域的小波卷积|即插即用,提升特征提取模块性能

简介:1.该教程提供大量的首发改进的方式,降低上手难度,多种结构改进,助力寻找创新点!2.本篇文章对Pointnet++特征提取模块进行改进,加入WTConv2d,提升性能。3.专栏持续更新,紧随最新的研究内容。 目录 1.理论介绍 2.修改步骤 2.1 步骤一 2.2 步骤二 2.3 步骤三 1.理…

JVM:垃圾回收器演进

文章目录 一、演进二、Shenandoah三、ZGC 一、演进 二、Shenandoah Shenandoah是由Red Hat开发的一款低延迟的垃圾收集器&#xff0c;Shenandoah并发执行大部分GC工作&#xff0c;包括并发的整理&#xff0c;堆大小对STW的时间基本没有影响。 三、ZGC ZGC是一种可扩展的低延…

MySQL数据库基本用法

了解数据库基本概念 什么是数据库&#xff1f; • 长期存放在计算机内&#xff0c;有组织、可共享的大量数据的集合&#xff0c;是一个数据“仓库” MySQL数据库的特点 • 开源免费&#xff0c;小巧但功能齐全 • 可在Windows和Linux系统上运行 • 操作方便&#xff0c;…

VS2019安装MFC组件

VS2019支持的MFC版本是mfc140 ~ mfc142版本&#xff0c;它兼容VS2015、VS2017之前的老版本程序。 一、MFC的历史版本 MFC的历史版本如下&#xff1a; IDE发布时间工具集版本MSC_VERMSVCMFC版本dllVisual C6.01998V601200MSVC6.06.0mfc42.dll、mfcce400.dllVisual Studio 2002…

记录解决springboot项目上传图片到本地,在html里不能回显的问题

项目场景&#xff1a; 项目场景&#xff1a;在我的博客系统里&#xff1a;有个相册模块&#xff1a;需要把图片上传到项目里&#xff0c;在html页面上显示 解决方案 1.建一个文件夹 例如在windows系统下。可以在项目根目录下建个photos文件夹&#xff0c;把上传的图片文件…