AVS软件解码器的优化

AVS软件解码器的优化
董斌 , 姜昱明
(西安 电子科技大学计算机学院,陕西 西安,710071))
摘 要: 主要研究了AVS标准的视频压缩部分,指出了影响解码速度的瓶颈并提出了一种优化方案.使
用从程序结构入手结合使用SIMD指令集的方案来优化AVS软件解码器.实验结果表明优化方案可行并且
解码器的运算速度得到了很大的提高.
关键词: AVS;视频压缩;SIMD;优化
Optimization of AVS software decoder
DONG Bin , JIANG Yu-ming
(School of Computer Science and Engineering, XIDIAN university, xi'an, 710071)
Abstract: The video compression part of AVS(Audio Video Coding Standard) was mainly studied, the bottleneck
affecting the decoding speed of AVS decoder was pointed out and an optimization scheme was given. The software decoder
was optimized starting from program structure and in combination of SIMD instructions. The results of experiment shows the
scheme is available and the speed of the decoder is highly improved.
key words: AVS;video compression;SIMD;optimization
1 引言
近年来,视频压缩技术发展迅速,国际上出现了多种视频压缩标准和建议,如MPEG1,MPEG2,
MPEG4,H.261,H.263以及最近制定的H.264/AVC.我国在参与国际标准制订的基础上,提出了自主
的数字音视频编解码技术标准AVS,达到了当前的国际先进水平.
AVS标准包括系统,视频,音频和数字版权管理等四个主要技术标准和一致性测试等支撑标准.
视频部分是最复杂的部分,主要针对高分辨率视频(SDTV, HDTV等).从MPEG1开始国内外已有很多
个人和公司进行了大量编解码器的优化工作,例如芬兰Nokia研究中心的Ville Lappalainen[1][2],和
Tampere University of Technology 的Timo D.H m l inen [1][2]等人一直致力于H263,H26L和H264的
优化,美国的Vsoft公司在P4 3.0G的机器上实现了标清视频的实时编解码[3],这些优化工作对已有音
视频标准的推广和应用起到了极大的作用.
董斌,1979年生,男,河北沧州人,在读硕士生; 共5页第1页
在优化过程中,SIMD扩展指令集被大量采用,大家熟知的MMX,SSE,SSE2,3DNow!等都是
这类扩展指令集,SIMD指令可以在一个CPU指令执行周期内用一道指令完成处理多个数据的并行操
作.为了便于优化代码,一般使用指令集的Intrinsics函数,它是外表类似普通函数,需要使用Intel
的编译器提供支持,可以被编译器直接编译成SIMD指令的函数集合,有关指令集和Intrinsics的使用
可以参考文献[4][5]中的相关内容.
本文首先介绍了AVS标准的主要特点,接着介绍了解码器的测试环境并对瓶颈部分进行简要分
析,最后从程序结构和利用SSE2的Intrinsics两个方面出发对瓶颈部分进行的优化,同时给出相应
实验结果和本文的结论.
2 AVS视频标准
AVS作为基于国际开放技术和我国自主研发的专利技术而制定出来的一套音视频编码标准,有
以下几个特点[6]:
第一:帧内预测对亮度和色度均使用8x8块大小,分别有5种和4种预测模式;帧间预测的运
动向量精确到1/4象素并且支持四种块大小的运动补偿预测, B帧中的宏块可以采用5种编码模式之
一进行编码,最多只用两个运动矢量,两个参考帧进行帧间预测,提高了运功补偿(MC)的精度;
第二:采用类似于DCT的8x8整数变换,整数变化后可以完全避免反变换中产生误差,并将残
差块的变换和量化作为一个过程,;
第三:对量化后的变换系数使用基于上下文的变长编码(CAVLC)方法进行熵编码,为了提高编
码的效率而定义了19个查找表,对于其他待编码参数使用零阶通用哥伦布编码;
3 测试环境和瓶颈分析
测试在一台P4 3.2GHz,1G内存,L1 Cache为20KB, L2 Cache为512KB的机器上进行,操作
系统使用Windows XP professional ,优化分析软件使用Intel Vtune7.1, 编译器使用Intel Complier 8.0,
优化选项使用Maximize Speed.
测试所使用的序列及压制测试码流的条件参照文献[7]选定.为了减少其他运行中程序和解码过
程中I/O操作的影响,实验过程中不将重构好的图像写入硬盘并在计算机重新启动后进行测试,最后
所得的数据取15次解码的平均时间.
表1 优化前各个解码模块的性能数据 表2 优化后各个解码模块的性能数据

解码每个宏块过程主要包括熵解码(VLD),反量化(IQ),反变换(IT),运动补偿(MC),重构(MR)
和循环滤波(DeBlock)等6个模块以及初始化等相关操作,试验中以解码QP为32的city序列(码率为
3.7Mbit/s @ 30.00 Hz)为例使用Intell Vtune7.1工具进行性能分析,得出解码器优化前后每个解码模块
的性能数据,详见表1和表2.其中的前3项数据采用基于事件的采样(EBS[8]),就是对程序执行中各
种事件发生的次数进行采样,由表1中的数据Clockticks[8]和Instructions Retired[8]表明MC模块中指令
执行的频率最高,MR和IQ+IT个模块次之;L2 Cache Read Misses [8]表示从L2 Cache读入数据时的失
效率,MC模块是42.8%为最高,MR模块次之.表1中最后两项数据采用基于时间的采样(TBS[8]),
在每个函数的入口和出口处设置标记计算每个函数的实际运行时间,占用解码时间最多的模块依次
共5页第2页
为MC,MR和IQ+IT,VLD和DeBlock模块占用的解码时间较少.根据以上这些解码模块的数据,
在优化时着重优化MC,MR和IQ+IT 三个模块.
4 AVS软件解码器的优化
4.1 程序流程的优化
首先,将宏块的运动向量,预测模式,参考帧索引等初始化操作集中到帧解码一级,使用memset
函数进行批量处理;
其次,对函数结构进行调整,将解码宏块的过程分为解码亮度和色度宏块,而不是统一的使用
一个函数进行解码,这种处理可以减少了跳转的次数和分支预测失败的可能性;并且将语句较少的
函数直接用展开到调用它的函数中(函数提升),减少了函数调用过程中压栈出栈所消耗的时间.
最后,对重构部分的函数结构进行调整,这个模块占用较多的解码时间主要是因为不必要的数
据拷贝导致访存的增加,并且函数内部还要进行色度重构和亮度重构的判断.优化中减少了程序中
冗余的数据拷贝过程,直接在运动补偿后进行图像重构,并且分别进行亮度和色度的重构操作来减
少分支预测失败引起的延迟.
4.2 动补偿过程的优化
由表1可知MC占用大部分解码时间,因为这一部分既是计算密集又是访存密集.计算密集是
因为如上所述的插值过程要通过滤波器精确计算每个分象素预测点的值,而且为了保证预测值在
[0,255] 范围内,要对计算出来的预测值进行饱和操作;访存密集是因为参考帧不能全部装入L2
Cache中,例如存储标清序列(720*576)每个亮度参考帧至少要占用607.5KB存储空间,而Pentium4
处理器的L2 Cache容量为512KB,CPU要频繁的访问内存来取得操作数,由表1可知L2的读失效
率为67.7%,可知程序执行时的访存时间开销巨大.
运动补偿中使用运动矢量在参考图像中找到预测参考样本,当运动矢量指向的参考样本在参考
图像外面时,使用图像内距离参考样本最近的整数样本(边缘或角样本)代替,参考软件中通过对数组
下标取min和max函数实现,这种处理方法增加了判断过程,使CPU的流水线经常处于断流状态,
消耗了很多处理时间.优化中采用padding方法将参考图像向四周进行扩展来减少判断,扩展出来
的样本点取参考图像中最近的边界点,并且将原来数组的水平和垂直下标分别加上padding的宽度
来能保证能正确访问扩展后的图像.运动矢量的有效范围很大(AVS的基准档次6.2级别规定最大垂
直运动矢量范围(帧编码)[-512, +511.75],但是如果运动补偿所需的参考样本全在参考图像外面时,
不论运动向量延伸多大,所得到的预测块象素值都是相同的,所以将padding的宽度定为16.文献
[1]中提及使用padding的方法由于增加了访存需求而不会得到较好的效果,我们认为这是由于该文
献中的优化主要针对QCIF这种较小格式进行优化,所以对padding的宽度比较敏感所致,而本文中
的优化针对较大格式720P的图像进行.实验中,padding操作不会超过解码时间的0.1%,因此可以
忽略.
亮度插值中得到一个1/4象素点最多使用13*8或者8*13个参考样本, 可以通过MV找到参考帧
中的参考块,并且将此参考块读入新开一块13*13大小的buffer,这样在取得参考帧象素时可以减少
L2 Cache的读失效率.为了保证预测值在[0,255]内,原来程序中使用逗号表达式操作来保证预测值
在[0,255]范围内,SSE2指令的饱和操作指令可以方便的将预测值限定在此范围内,通过以上优化,
MC部分的数据见表2可得Clockticks,L2 Cache Read Misses 和Self time[8] 三项数据都比优化前有明
显的减少,这个模块解码时间是原来的18.9%.
4.3 反变换和反量化部分的优化
AVS中采用基于8x8块大小的类DCT变换,其变换系数采用整数后可以完全避免反变换中产
生误差,保证不会损失数据的精度,使得编解码端的数据匹配,其核心变换矩阵和具体变换过程见文
献[9].反变换采用蝶型快速算法,中间数据 控制在16位二进制数以内.每次变换过程中所需进行变
共5页第3页
换的64个数据可以一次装入CPU的L1 Data Cache,由表1可知L2 Cache Read Misses 只有0.3%,
所以这个模块是计算密集型的.在不改动蝶型算法的前提下对反变换使用SSE2的Intrinsics函数进
行优化,充分发挥SIMD指令集的优势.优化后的各项数据见表2,Clockticks和Self time两项数据
均比优化前减少,解码时间比优化前快了4.4倍.
5 结论
本文提出了一种AVS视频解码器的优化方案,该方案主要从修改程序结构和针对瓶颈模块优化
两个方面入手.修改程序结构方面主要是使得程序的模块化更加清晰并且优化了内存数据的读取;
优化时间瓶颈时主要采用Intrinsics函数重写瓶颈模块.
表 4 解码参考序列的测试结果
在优化工作中为保证不降低解码后图像的质量而没有涉及到算法级的优化,验证实验采用选取
了4个典型的测试序列并分别对每个序列使用4个不同的QP值来进行编码,所得的压缩码流的码
率范围在0.3~11.4Mbps之内.用未优化和优化过的解码器分别对16个码流进行解码测试,所得解
码速度因为各个码流的码率不同而相差较大,测试的详细结果见表3(NOPT和OPT表示解码器优化
前后的解码速度,f/s表示帧/秒),优化后解码器速度最慢的是25.4f/s,最快为39.5f/s,分别是未优
化解码器速度的4.2和5倍,解码速度大为提高.
参考文献:
[1]V.Lappalainen,A.Hallapuro, and T.D..H m l inen. .Complexity of optimized H.26L video decoder implementation
.IEEE Trans, Circuits Syst. Video Technol, VOL13, pp. 717-725, JUL 2003.
[2]V Lappalainen, T D. H m l inen, and P Liuha. Overview of research efforts on media ISA extensions and their usage
in video coding. IEEE Trans, Circuits Syst. Video Technol, VOL 12,pp.660-6701, AUG 2002.
[3]J.Yoshida. H.264 video coding surges into view
http://www.eetimes.com/article/ showArticle.jhtml articleId=18309407&sub_taxonomyID=6257
[4]Intel Corp. The IA-32 Intel Architecture Software Developer's Manual Volume 2 Instruction Set Reference . USA: Intel
Corp, 2003.
[5]Intel Corp. Intel C++ Class Libraries for SIMD Operations User's Guide. USA: Intel Corp, 2002.
[6]Fan..Liang, Siwei Ma, Feng Wu. Overview of AVS Video Standard . ICME2004;
[7].AVS视频专题组. 视频编码技术测试通用条件 . AVS N1055, 2003.7;
[8] Intel Corp. Help for VTune(TM) Performance Analyzer. USA: Intel Corp, 2003.
[9]AVS工作组. 音视频编码 第二部分:视频(草案).北京:AVS工作组, 2003.11;
共5页第4页
本人联系方式:
通信地址:董斌 西安电子科技大学176#信箱
邮政编码:710071,联系电话:13700287560,E-mail:bdong@126.com
硕士导师:姜昱明,入学年月:2002年9月,主要研究方向:计算机图形学与图像处理
共5页第5页

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

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

相关文章

IOS7.1.1真的像网上流传的那么好?没有任何问题么??

IOS7.1.1推送更新之后到处看到网上说711好的~~ 那么IOS7.1.1真的像网上现在流传的那么好么? 其实不然,IOS7.1.1目前众多网友反映说升级ios7.1.1之后APPstore连接不上了,提示无法连接到APPstore。 这个问题也不难解决~还是之前的老办法~ 那么今…

三校生计算机对口本科有哪些学校,宝山三校生五月对口高考报名

多次复习生活不可能像你想象得那么好,但也不会像你想象得那么糟。我觉得人的脆弱和坚强都超乎自己的想象。多种方式结合起来复习单一的复习方法,易产生消极情绪和疲劳,如果采用交谈复习法、讨论复习法、自我检查复习法多样化的复习方法&#…

localhost 已拒绝连接_【Python】MongoDB数据库的连接和操作

安装Python 要连接 MongoDB 需要 MongoDB 驱动。pip安装:python3 -m pip3 install pymongo创建数据库import pymongo myclient pymongo.MongoClient("mongodb://localhost:27017/")mydb myclient["loaderman"]注意: 在 MongoDB 中&#xff0c…

checkbox已设置为checked--true-但不勾选问题解决方法(只第一次勾选有效)

一、出现的问题及解决方法: 今天在写一个table相关插件的时候无意中发现了这样一个问题,记得以前在写这种控制checkbox选中与非选中的代码时并没有这种bug,当时也是用的checked属性,而现在却行不通了。 于是乎做了以下测试&#x…

Python 错误和异常小结[转]

原文链接 http://blog.csdn.net/sinchb/article/details/8392827 事先说明哦,这不是一篇关于Python异常的全面介绍的文章,这只是在学习Python异常后的一篇笔记式的记录和小结性质的文章。什么?你还不知道什么是异常,额... 1.Py…

Django REST framework 认证、权限和频率组件

认证与权限频率组件 身份验证是将传入请求与一组标识凭据(例如请求来自的用户或其签名的令牌)相关联的机制。然后 权限 和 限制 组件决定是否拒绝这个请求。 简单来说就是: 认证确定了你是谁权限确定你能不能访问某个接口限制确定你访问某…

高速率AVS整数变换的汇编实现与优化

1 引言 AVS标准Ⅲ采用的8x8整数变换在获得较H.264更高的压缩率和主观图像质量的同时,增加了算法的实现复杂性和时间开销。本文重点研究AVS编解码器的整数变换模块,针对不同的算法实现模式,在原有Visual C6.0整数变换模…

计算机与广播电视论文,浅谈广播电视中计算机技术的作用论文.pdf

1、计算机技术在广播电视的媒体内容中有重要应用在以往的广播电视中, 媒体内容主要分为音频和视频两种信号, 在传输的过程中使用的是模拟信号, 但模拟信号受到的外界干扰因素较为明显, 因此广播电视传播的媒体内容受到影响&#x…

opencv安装教程python3.7_Mac下安装使用Python-OpenCV,解决opencv3安装完成无法使用的问题 - pytorch中文网...

OpenCV是一个跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。 Mac安装OpenCV 在我们的深度学习的过程中,对于图像&#…

NodeJS在CentOs7下安装

node下载地址:https://nodejs.org/en/download/ 1.安装gcc $ yum install gcc-c 2.解压最新版本 $ mkdir /usr/local/node$ tar zxvf node-v6.11.4.tar.gz $ cd node-v6.11.4$ ./configure --prefix/usr/local/node# 在当前目录下编译安装Node$ make$ make install 3.验证安装 …

Python功能之反射

有如下文件: index.py 1<span style"font-family:宋体, SimSun;">#!/usr/bin/env python<br data-filtered"filtered"># -*- coding:utf-8 -*-<br data-filtered"filtered">__author__ ryan<br data-filtered"filter…

Django REST framework 分页

分页模式 rest framework中提供了三种分页模式&#xff1a; from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination 全局配置 REST_FRAMEWORK {DEFAULT_PAGINATION_CLASS: rest_framework.pagination.LimitOffsetPaginat…

解析H.264视频编解码DSP实现与优化

引言 基于互联网的数字视频产业前景看好&#xff0c;而3G的规模部署&#xff0c;也会推动移动视频通信成为现实。但数字化后的视频图像具有数据海量性&#xff0c;给图像的存储和传输造成较大的困难。数字视频产业&#xff0c;是指数字内容中以数字视频形态为主的文化创意和传播…

ap计算机科学a买什么书,准备AP*计算机科学A考试-第1部分

你将学到什么Identify the use and proper use of Variables, Conditionals, Objects and primitives, control structures, booleans, lists and arrays, and Exceptions.Implement problem descriptions in well designed code.Identify and begin to design algorithms to s…

python 打包exe_python如何封装为exe

1、首先进入python安装路径D:\Python27\Scripts下&#xff0c;查看pip或easy_install是否安装。2、确保安装了pip或者easy_install&#xff0c;在cmd命令行下输入“easy_install”&#xff0c;没有提示“xxx不是内部或外部命令……”&#xff0c;就说明easy install工具安装成功…

CentOS7安装Hadoop2.7完整步骤

总体思路&#xff0c;准备主从服务器&#xff0c;配置主服务器可以无密码SSH登录从服务器&#xff0c;解压安装JDK&#xff0c;解压安装Hadoop&#xff0c;配置hdfs、mapreduce等主从关系。 1、环境&#xff0c;3台CentOS7&#xff0c;64位&#xff0c;Hadoop2.7需要64位Linux&…

Django REST framework 解析器和渲染器

解析器的作用 解析器的作用就是服务端接收客户端传过来的数据&#xff0c;把数据解析成自己可以处理的数据。本质就是对请求体中的数据进行解析。 在了解解析器之前&#xff0c;我们要先知道Accept以及ContentType请求头。 Accept是告诉对方我能解析什么样的数据&#xff0c…

MyBatis的学习之路(二)

上篇文章介绍了MyBatis的配置文件&#xff0c;现在来介绍实体映射文件Mapper.xml。 说道实体映射文件&#xff0c;就不得不说一下实体与表之间的映射关系&#xff1a;单表映射和多表映射。 a. 单表映射 1 public class Admin{ 2 private String id; 3 private String n…

计算机一级实验素材题目,计算机一级EXCEL操作题整理素材(12页)-原创力文档...

素材摘录&#xff0c;文档可编辑分享PAGE 页码页码/NUMPAGES 总页数总页数单元格合并首先选中你要合并的单元格&#xff0c;然后找到EXCEL上的开始分区里的这种图标或者是含有“合并”两字的位置如图1-1&#xff0c;如果题目要求的是要你合并单元格并让内容居中&#xff0c;你就…

python爬取toefl_spark学习进度6-Python爬取数据的四个简单实例

今天本来想把昨天安装的intellij配置好&#xff0c;但是一直显示没有网络&#xff0c;网上查了相关资料也没有查出来解决办法。然后暂停了intellij的配置&#xff0c;开始做了几个Python爬取简单数据的实例&#xff0c;先做了几个最简单的&#xff0c;以后再加大难度&#xff0…