H.264解码器中CAVLC码表查找算法的分析与优化

0 引言
    近年来,随着信息技术飞速发展和互联网的日益普及,尤其是以视频为信息主要来源的多媒体领域越来越受到人们的关注。H.264是ITU-T的视频编码专家组(VCEG)和ISO/IEC的活动图像编码专家组(MPEG)的联合视频组(Joint Video Tearn,JVT)开发的一个新的数字视频编码标准,它既是ITU-T的H.264,又是ISO/IEC的MPEG-4的一部分。H.264和以前的标准一样,也是DPCM加变换编码的混合编码模式。H.264标准可分为三档:基本档次(其简单版本,应用面广);主要档次(采用了多项提高图像质量和增加压缩比的技术措施,可用于SDTV、HDTV和DVD等);扩展档次(可用于各种网络的视频流传输)。
    H.264/AVC的编解码框架的基本结构与早期的编码标准(H.263、MPEG4等)相似,都是由运动估计、变换、量化、熵编码、环路去块效应滤波器等功能单元组成的。H.264视频编码框架的主要变化包括:引入了环内去块效应滤波器,去块效应处理后的宏块被保存在内存中用于对后续宏块的预侧;采用了多参考帧运动估计,需要在内存中保留多个参考视频帧;引入了帧内预测机制,可以通过同一帧内的宏块进行预测;采用了新的整型变换方式,取代了以前的离散余弦变换(DCT);H.264与以前视频标准在运动估计的模式上也有了较大的变化,H.264支持7种模式的可变块运动估计。此外,在熵编码中还引入了上下文自适应的变长编码(CAVLC)和二进制算术编码(CABAC)。
    在熵编码方面,H.264使用了CABAC和CAVLC两种不同的编码方式。CABAC熵编码是一种基于区间划分的算术编码方式。这种编码方式的效率很高,接近信息熵值,但算法相对复杂,编解码速度较慢。CAVLC是一种可变长编码,它根据已编码语法元素的情况动态调整编码中使用的码表,在编码过程中有些语法元素是组合编码的,当对这些元素进行查找时就会耗费很长的时间。因此对CAVLC的优化显得格外重要。

1 原码表查找算法
    原码表的存储结构为二维表结构。存储的内容为码字,二维坐标分别代表解码后的两个语法元素。对于二维表结构。若通过坐标查找内容是很容易的;而通过内容查找坐标,就需要对整个表进行遍历。JM中的码表查找算法就是通过遍历整个码表实现的,步骤如下:
    (1)取码表的中的一个码字;
    (2)根据码字长度从码流中取出相应长度的bit;
    (3)比较此码字和bit串,若相同则查找成功,否则若码表中还有码字,回步骤(1),否则查找失败。

2 算法的优化分析
2.1 基于前缀零分组子表搜索算法
   
基于上下文自适应的变长编码的解码算法需要不断的读取码流,判断,直到在码表中找到该码字,如此反复,直至解码整个块。由此可见该过程的时间空间复杂度都是相当高的。由于变长码为霍夫曼前缀码,所以可以根据码表的特性,按照码字长度将原来的一个码表,按照码字长度对原码表进行分割,以Coeff_token码表为例,原码表如表1所示,表中NC=-1。

H.264解码器中CAVLC码表查找算法的分析与优化

    在参考模型中,搜索码表算法过程如下:
    (1)从最短码长开始,读出该长度二进制数据流对应的码字;
    (2)遍历码表,如找到该码字进行步骤(4),否则进入(3);
    (3)码字长度加1,重定位指针位置,重复步骤(2);
    (4)读取该码字对应值,更新指针位置。
    从上面过程中不难发现,码字长度的不确定性使得在读取字节流时只能一次次的试探,导致了效率的下降。如果可以将变长码的读取采取固定的策略,一次读取固定的长度,之后再做判断,再读取一定长度,这样将判断的次数也固定,从理论上可以降低不断搜索和重定位指针带来的时间和空间复杂性。利用可以利用码表中码字前缀零数目的不同,将表1拆分为两个子表,如表2,表3所示NC为-1。

H.264解码器中CAVLC码表查找算法的分析与优化

    改进后的码表搜索算法如下:
    (1)读取最大码字长度的二进制流;
    (2)根据不同的前缀零位数、右移位、判零以确定码字所在子表;
    (3)直接根据码值读取对应值,更新指针位置。
    新的搜索过程不但避免了不确定性,而且无需遍历码表,这样可以在一定程度上提高变长解码的效率。

H.264解码器中CAVLC码表查找算法的分析与优化

    按照改进的算法步骤,解码时,首先从字节流中读取8位码字,由于前缀零个数分为大于3和小于3的两种情形,所以右移5位,若为零,则查找表2,否则查找表 1,根据码值直接解码出±1个数,非零系数数目。此外在设计代码时,还可利用二叉搜索树的特性,设计搜索过程,提高解码效率.

2.2 二叉树一子表混合法
    拆分成子表后建立的数组中存在冗余现象。如当0≤N<2且Pre-Zeros<6时,一共有13个码字。为了保留原先的查表方式以TC和 Tls为矩阵下标的特点,必须要用4×7矩阵,多余位置零。由于实际搜索的对象是矩阵,怎么确定Pre-Zeros值,以保证在分块数一定的情况下,使用的矩阵较小,成为提高搜索效率的关键。从表中可以看到,对不同的N值对应的列,子表之间的Pre-zeros的分界点选取了不同的阈值。按照表2中的分块方法,矩阵的平均大小为4×6.5。相比JM中使用一个4×17矩阵,搜索效率理论上可以提高(17-6.5)/6.5=1.615倍(假设每张子表的使用概率相同)。以0≤N<2的一张VLC表为例,共分成4张子表。从查找一个码字的比较次数来看。

H.264解码器中CAVLC码表查找算法的分析与优化
    可知,子表法查找比较次数的理论最小值为H.264解码器中CAVLC码表查找算法的分析与优化此时要求n=s2。如果在第一个步骤(确定子表)中改为采用二分法,则H.264解码器中CAVLC码表查找算法的分析与优化这种情况下就可以对以上码表中前缀连零再细化,将相同连零个数的码字放在一起,增加子表数而减少子表中的码字结点数,可以进一步提高查找效率。
    从以上分析可见,二叉树的查找效率是最高的。因此可以将二叉树应用到子表法中,对每一张子表分别建树。对于二叉树来说,查找时间与树的深度有关。观察子表中的码字,发现它们都有不同长度的连零作为前缀,如果直接建树将导致树的不平衡并增加了树的深度。为了解决这个问题,可以考虑在同一张子表中为每个码字去除相同个数的连零前缀,然后建立二叉树。在解码时,先忽略这些连零个数,再进行树的查找。在最理想情况下,这种查找方法的一次查找的平均比较次数为:

    H.264解码器中CAVLC码表查找算法的分析与优化
    对第一张VLC表采用二叉树一子表法的最大比较次数:

    H.264解码器中CAVLC码表查找算法的分析与优化
    几种算法的对比与复杂度分析如表4所示。

H.264解码器中CAVLC码表查找算法的分析与优化

    空间复杂度也是需要考虑的问题。JM参考实现中为Tls和TC的联合码表建立了2个3×4×17的三维数组共需要408 B的存储空间。二叉树法经过统计,一棵树共有124个结点,其中叶结点62个,其余62个结点为根结点或枝结点。建3棵二叉树所需要的空间为 (62×4+62×2)×3=1 116 B。子表法将码表分成12张子表,每张子表用2个二维数组表示,而数组的平均大小为4×6.5,则共要4×6.5×12×2=624 B。

3 结 语
    H.264是现在视频编解码领域研究的热点也是未来发展的方向,它将代替MPEG2成为主流的信源压缩标准。H.264应用领域非常广泛。将H.264的编解码速度尽可能的提高,可以使其在更多的领域中应用,如数字电视,消费电子类产品,网络通信,可视电话等现在热门领域。在此专门对于CAVLC码表查找给出了改进方案,通过这三种改进方案,避免了对整个码表的查找,对码表的查找在效率上有了很大提高。具有明显的实用意义.

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

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

相关文章

python求加速度_如何利用Python 为自然语言处理加速度

自去年发布 Python 的指代消解包(coreference resolution package)之后&#xff0c;很多用户开始用它来构建许多应用程序&#xff0c;而这些应用与我们最初的对话应用完全不同。利用 spaCy 和一点点 Cython 给 NLP 加速。自去年发布 Python 的指代消解包(coreference resolutio…

druid.properties文件的配置

# druid.properties文件的配置 driverClassNamecom.mysql.jdbc.Driver urljdbc:mysql://127.0.0.1:3306/plan usernameroot password # 初始化连接数量 initialSize5 # 最大连接数 maxActive10 # 最大超时时间 maxWait3000

jquery+easyui开发、培训文档

目 录 1.... Accordion&#xff08;可折叠标签&#xff09;....................................................................................... 2 1.1 实例.............................................................................................…

HAProxy用法详解 全网最详细中文文档

一、HAProxy简介&#xff08;1&#xff09;HAProxy 是一款提供高可用性、负载均衡以及基于TCP&#xff08;第四层&#xff09;和HTTP&#xff08;第七层&#xff09;应用的代理软件&#xff0c;支持虚拟主机&#xff0c;它是免费、快速并且可靠的一种解决方案。 HAProxy特别适用…

mp4文件格式系列

mp4文件格式系列1 - 综述Overview and Introduction Core Concepts MP4文件格式中&#xff0c;所有的内容存在一个称为movie的容器中。一个movie可以由多个tracks组成。每个track就是一个随时间变化的媒体序列&#xff0c;例如&#xff0c;视频帧序列。track里的每个时间单…

JDBC笔记-李伟杰版

JDBC 03 2019/8/1 9:51:41 笔记网站 全球加速: http://zaixianke.com 北京节点: http://itdage.cnJDBC 事务 *** 在dos命令行操作oracle时 , 执行DML , 需要结束事务 (commit提交 或 rollback回退) 在JDBC中, 事务是自动提交的, 每执行一条DML语句, 事务就自动提交一次…

局域网网络风暴检测工具_【思唯网络学院】从原理到配置,最全的VLAN说明就在这了!...

有关VLAN的技术标准IEEE 802.1Q早在1999年6月份就由IEEE委员正式颁布实施了&#xff0c;而且最早的VLNA技术早在1996年Cisco(思科)公司就提出了。随着几年来的发展&#xff0c;VLAN技术得到广泛的支持&#xff0c;在大大小小的企业网络中广泛应用&#xff0c;成为当前最为热门的…

SQL server 基本语句

--查询数据库是否存在 if exists ( select * from sysdatabases where [name]TestDB) print Yes, the DB exists else print No, need a new one? --新建一个数据库 create database TestDB on ( name TestData, filename G:\DBS\KeyTest.mdf, size 3, filegrowth 2 ) log…

pythonselenium模拟登陆爬取信息_python3 使用selenium模拟登陆天眼查抓取数据

由于之前用Scrapy 抓了一些公司的名称&#xff0c;但是没有准确的联系方式&#xff0c;所以就自己就学习了一下使用selenium自动化工具&#xff0c;速度比较慢&#xff0c;网上也有很多这方面的代码&#xff0c;但是大部分的网页解析部分都出错了&#xff0c;可能是这种网站定时…

mp4格式

下面的软件下载地址&#xff1a;http://download.csdn.net/source/2607382 ftyp: 这是一个筐&#xff0c;可以装mdat等其他Box。 例&#xff1a;00 00 00 14 66 74 79 70 69 73 6F 6D 00 00 02 00 6D 70 34 31 语义为&#xff1a;ftyp: Major brand: isom Minor version: 5…

PyQt5案例汇总(简洁版)

01菜单栏 import sys from PyQt5.QtWidgets import QMainWindow, QAction, qApp, QApplication from PyQt5.QtGui import QIconclass Example(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):exitAct QAction(QIcon(exit.png), &Exit,…

个人关于浮动的理解

浮动带来的影响&#xff1a; ①. 能够让浮动之后的元素布局产生混乱 &#xff08;元素浮动后脱离了标准文档流&#xff0c;它的布局也就不再遵循标准文档流的规则&#xff0c;多个浮动元素在一起的时候就会随着窗口的变化而变化&#xff0c;也就失去了稳定的布局&#xff09; ②…

接口测试 rest-assured 使用指南

转载&#xff1a;https://testerhome.com/topics/7060 原文&#xff1a;https://github.com/rest-assured/rest-assured/wiki/Usage本文github地址&#xff1a;https://github.com/RookieTester/rest-assured-doc 注意&#xff0c;如果您正在使用1.9.0或者更早的版本请参考旧文…

python中格式化字符串的作用_python中字符串格式化的意义(化妆)

格式 描述%%百分号标记 #就是输出一个%%c字符及其ASCII码%s字符串%d有符号整数(十进制)%u无符号整数(十进制)%o无符号整数(八进制)%x无符号整数(十六进制)%X无符号整数(十六进制大写字符)%e浮点数字(科学计数法)%E浮点数字(科学计数法&#xff0c;用E代替e)%f浮点数字(用小数点…

MongoDB的快速手动安装

就是关于MongoDB主从库的安装配置和启动。网上关于MongoDB的安装有大量的文章供大家学习。我这里提供一个Windows环境下MongoDB主从库的快速手动安装的方法&#xff0c;只需要三步即可。 先下载的安装包&#xff0c;解压缩后找到bin文件夹&#xff0c;将bin文件夹拷贝至你自己的…

MP4音频解码信息

文章转载自&#xff1a;http://blog.csdn.net/flyingqr/archive/2010/02/02/5282600.aspx 版权归原作者&#xff0c;编辑&#xff1a;小乙哥 MP4文件格式分为头部和数据两部分&#xff0c;头部是由许多被称作Atom的结构单元嵌套或排列而成&#xff0c;数据部分则完全为实际数据…

时序图 分支_UML用例图

UML用例图用例图有以下东东:用例参与者关联系统边界用例使用椭圆来表示&#xff0c;椭圆里边写上用例的名称:这里的用例可以理解为一个动作或行为,或者一个对象。参与者用一个小人儿,在小人儿下面写上参与者名称,例如学生:关联用一条线表示:把很多个用例放到一个大的矩形框里。…

Python脚本实现汉子转拼音

起步 中华文化博大精深&#xff0c;是中华民族的财富&#xff0c;吸收和继承发扬中 华文化&#xff0c;是现代每个炎黄子孙无可推卸的天职。 今天小编就交大家用python写一个脚本,实现汉子和拼音之间的转换 pinyin.py 汉字转拼音,With Python Example: from pinyin impor…

MySQL innodb_table_stats表不存在的解决方法

在做实验时&#xff0c;使用mysqldump命令报错[rootlinux-mysql02 3306]# mysqldump -uroot -p123456 -S /u02/data/3306/mysql.sock -A -B --events | gzip > /opt/rep.sql.gzmysqldump: Got error: 1146: Table mysql.innodb_index_stats doesnt exist when using LOCK TA…

自定义封装 banner 组件

1. 效果图预览 2.基本功能 一个简单方便的轮播图组件&#xff0c;基于viewpager 基础上进行的封装。可设置 项目中图片&#xff0c;网络图片&#xff0c; View&#xff1b;支持循环自动播放&#xff0c;手势滑动切换&#xff0c;item点击事件,可设置 点点的样式宽高、颜色、大小…