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。

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

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

按照改进的算法步骤,解码时,首先从字节流中读取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张子表。从查找一个码字的比较次数来看。


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


    对第一张VLC表采用二叉树一子表法的最大比较次数:


    几种算法的对比与复杂度分析如表4所示。

空间复杂度也是需要考虑的问题。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码表查找给出了改进方案,通过这三种改进方案,避免了对整个码表的查找,对码表的查找在效率上有了很大提高。具有明显的实用意义.

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

  1. H.264算法的DSP移植与优化

    摘要:在TMS320DM643平台上实现H.264基档次编码器的移植与优化显得格外实用和必要.基于对DSP平台的结构特性和H.264的计算复杂度分析,主要从核心算法.数据传输和存储器/Cache使用几 ...

  2. H.264的码率控制算法

    H.264的码率控制算法采用了多种技术,其中包括自适应基本单元层(Adaptive Basic Unit Layer).流量往返模型(Fluid Traffic Model).线性MAD模型.二次率失 ...

  3. H.264码率控制机制

    H.264标准码率控制算法步骤如下: 1.计算当前帧的目标码字,并将其限定到HRD的边界中. 2.通过线性模型(式4.5)预测当前帧中基本单元的MAD. 3.为未编码基本单元分配码字. 4.通过二次R ...

  4. Android视频压缩实现,基于Android系统的H.264视频压缩技术实现

    3.2 底层驱动移植模块设计 Android系统本身是一个庞大的系统,移植需要考虑Android系统的硬件抽象层(HAL)和Linux中的相关设备驱动程序.移植的目的就是为了改动较小的内容,支撑较为庞 ...

  5. SGISTL源码探究-stl_alog.h中的二分查找算法

    前言 在上一小节中我们分析了stl_algo.h中的部分算法.本小节中我们将继续分析其中关于二分查找类的算法,即lower_bound.upper_bound.binary_search.equal_ ...

  6. 直立车模控制中三种滤波算法简单分析(清华卓晴)

    摘自:https://mp.weixin.qq.com/s/WbCh0NFAnsf9y2blQenf7g 让我想起余义的一篇文章也是说到平衡车有三种滤波,我想和卓晴说的是一样的吧. https://b ...

  7. c语言中的常用查找算法

    1.顺序查找: 概念:按照顺序,从第一个元素遍历到最后一个元素,找到就返回元素下标:下面的代码可以帮助你更好的理解: int main {int arr[]={1,2,3,4,5,6,7};int k ...

  8. Java高级工程师必备数据结构算法高效查找算法原理分析与实现

    查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找本文主要介绍比较难理解的树表查找和哈希查找. 查找定义:根据给定的某个值,在查找表中确定一个 ...

  9. php二分查找例题,PHP实现的二分查找算法实例分析

    本文实例讲述了PHP实现的二分查找算法.分享给大家供大家参考,具体如下: 二分查找法需要数组是一个有序的数组 假设我们的数组是一个递增的数组,首先我们需要找到数组的中间位置. 一.要知道中间位置就需要 ...

最新文章

  1. 中国CIO最关心的八大问题(下)
  2. 如何扩展Linux的ip_conntrack
  3. Golang 入门笔记(二)上
  4. CentOS7 64位下MySQL5.7安装与配置(YUM)
  5. ubuntu11.04下配置中文输入法
  6. Windows 系统补丁管理策略
  7. 概念性jQuery内容编辑器
  8. 计算机视觉论文-2021-07-09
  9. 【20160924】GOCVHelper MFC增强算法(2)
  10. java多线程线程池_Java多线程——线程池(ThreadPool)
  11. Echarts数据可视化series-radar雷达图,开发全解+完美注释
  12. cad经典工作空间_最实用的CAD界面的设置
  13. 使用Entity Framwork 保存数据时,提示不能在对象中插入重复键,违反了PRIMARY_KEY约束...
  14. Android 微信分享与QQ分享功能
  15. [原] 计算机调试管理器服务被禁用的解决方法
  16. python opencv 旋转图像大小不变
  17. 【Vue element-admin 如何给侧边栏添加 Badge 计数标记 】
  18. 华为云ModelArts文本分类–外卖评论(附详细图解)
  19. 从零开始学python的第16天
  20. tiktok电商怎么做?tiktok会是跨境电商的新风口吗?

热门文章

  1. PWN-PRACTICE-CTFSHOW-5
  2. 执行本地sql_实用!5个在线 SQL 数据库环境
  3. 【CodeForces - 485A】Factory (水题,抽屉原理,tricks)
  4. 从零实现一个3D目标检测算法(2):点云数据预处理
  5. Apoll进阶课程㉞丨Apollo ROS原理—3
  6. 吴恩达机器学习作业(五):支持向量机
  7. linux搜索pdf文件,桌面应用|如何使用 pdfgrep 从终端搜索 PDF 文件
  8. php 修改文件属性命令行,Linux_linux中如何通过命令修改文件属性,ls -l即可查看目录信息-rw - phpStudy...
  9. 如何释放mysql连接资源_CI框架出现mysql数据库连接资源无法释放的解决方法
  10. 云服务器怎么装mysql_云服务器(windows环境)安装mysql图文教程