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

摘要:在TMS320DM643平台上实现H.264基档次编码器的移植与优化显得格外实用和必要。基于对DSP平台的结构特性和H.264的计算复杂度分析,主要从核心算法、数据传输和存储器/Cache使用几方面对H.264编码器进行了优化。实验结果表明,对于CIF格式的视频序列,优化后的H.264编码器能够达到每秒高于24帧的编码速度,满足了视频处理对于实时性的要求。
关键词:H.264编码;TMS320DM643;算法优化

0 引言
    针对视频通信中传输带宽或存储容量与视频质量的矛盾,ITU-T的VCEG和ISO/IEC的MPEG联合制定了低码率视频压缩标准H.264。相对于以往的标准,H.264除了增强了网络适应能力外,大幅度提高了压缩编码效率,在相同的码率下能够获得更高的主客观质量。2003年5月,H.264/AVC标准正式推出,正式名称为H.264 MPEG-4 part 10 AVC(Advanced Video Coding),以下简称为H.264标准。

1 编码器
    H.264仍采用图像预测和变换编码相结合的编码结构,编码器采用的仍是变换和预测的混合编码法。输入的帧或场以宏块为单位被编码器处理。首先,按帧内或帧间预测编码的方法进行处理。如果采用帧内预测编码,其预测值PRED是由当前片中前面己编码的参考图像经运动补偿(MC)后得出,与解码所需的一些边信息(如预测模式量化参数、运动矢量等)一起组成一个压缩后的码流,经NAL(网络自适应层)供传输和存储用。为了提供进一步预测用的参考图像,编码器必须有重建图像的功能。因此必须使残差图像经反量化、反变换后得到。为了去除编码解码环路中产生的噪声,为了提高参考帧的图像质量,从而提高压缩图像性能,设置了一个环路滤波器。即重建图像可用作参考图像。
1.1 视频编码的硬件结构
    H.264视频编码器硬件结构如图1所示。FLASH模块用于存放程序,EEPROM用于存放编码系统的初始化配置信息和系统MAC层地址。片内SRAM用于缓存当前正在处理的宏块数据,以及一些频繁调用的数据段和程序段。外接存储器SDRAM主要用于存储原始帧、参考帧和重建帧的源数据。片内、片外存储器之间的数据传输借助EDMA在后台操作,这样可并行处理数据传输和运算操作,提高效率。


1.2 DSP芯片简介
    DM643的EDMA可在64个独立的通路上,提供超过2GB/s的I/O带宽。此外,运用两级片内高速缓存Cache和64位外部存储器接口(EMIF),可方便地实现与同步/异步存储器的无缝连接。DM643还集成了多种新型的片内外设,以适应于媒体数字化处理和网络通信的应用:(1)三个可配置的视频端口,提供和通用视频A/D和D/A芯片的无缝接口;(2)压控晶体振荡器插值控制端口,用于与MPEG-2传输流接口时的系统时钟恢复;(3)管理数据输入输出模块,用于列举系统中的物理层设备并监视它们的连接状态。

1.3 H.264编码算法的主要特征
    H.264编码算法进行了一系列的改进和扩展,明显改善编码效率的特征如下:
    (1)网络适配层NAL:传统的视频编码编完的视频码流在任何应用领域下都是统一的码流模式,视频码流仅有视频编码层。(2)自适应块大小编码模式:H.264允许使用16×16、16×8、8×16、8×8、8×4、4×8、4×4等子块预测和编码模式,采用更小块和自适应编码的方式,使预测残差的数据量减少,进一步降低了码率。(3)多帧运动补偿技术:传统的视频压缩编码采用一个或两个解码帧作为当前预测的参考帧。

2 算法优化
    如上所述,运动估计,整数余弦变换/反整数余弦变换,量化是H.264编码器中最耗时的部分。因此,这3项是优化的主要对象。
2.1 运动估计
    视频序列图像在时间上存在很强的相关性,采用运动估计和运动补偿技术可以消除时间冗余以提高编码效率。运动估计粗略分为全局运动估计、基于像素点运动估计、基于块运动估计和基于区域地运动估计。
    H.264标准采用块运动估计匹配算法,它包含匹配原则(主要有MAD、MSE和NCCF三类),搜索范围,搜索方案等。但是搜索算法是影响块匹配算法性能的主要因素。在整像素的运动估计中,采用了基于菱形搜索算法。
2.2 CPU与缓存之间的数据传输
    DM643有一个两级(Level2)高性能Cache结构,它们都有16 kB的独立存储器,并且均可以被存入两级Cache中。两级Cache可以被设置为Cache,SRAM或者Cache,SRAM的一部分。CPU与Cache之间的数据读取过程如图3所示。

2.3 ICT/反ICT和量化
    原始的ICT/IICT和量化算法不能够充分发挥DSP的并行优势,以至于8个功能单元在编码的过程中都处于闲置状态,存储器中的数据被频繁重复的访问也导致了DSP运行效率的降低。在图4所示中,提出对于ICT/IICT和量化部分的算法图例,一个宏块中所有基于4×4块的IC-T/IICT变换都能够同时执行,这充分利用了DSP的8个功能单元。实验结果表明,经量化后,计算一个ICT/HCT的4×4块仅仅需要12个平均周期。这一优化不但提高了算法的速度又显著地降低了码流大小,使视频信号的实时处理成为可能。



3 实验结果分析
    在600 MHz的TMS320DM643平台上,通过开发软件CCS载入开源代码X264构架对CIF格式的5个视频序列(Akiyo,News,Foreman,Footba-ll,Mobile)进行了相关实验。在这5个视频序列中,Akiyo和News序列有较低的运动级别,背景变化画面人物运动幅度不大,而Foreman和Fo-otball有高的运动级别,运动剧烈有场景切换,最后一种Mobile序列则有复杂的背景。表1列出了在量化步长(QP)为25的情况下,原始H.264编码器和优化后的H.264编码器之间的对比结果。从中可以看出,原始的编码器的编码速度是2~3 f/s,而优化后的编码速度是前者的10倍多。



4 总结
    本系统采用TMS320DM643作为的核心处理器,这款DSP芯片主要是为实现低功耗、高性能而专门设计的定点DSP芯片。它具有高度灵活的可操作性和高速的处理能力,先进的多总线结构,主要应用在通信、数据采集等系统中,特别在实时性方面效果最佳。
    本设计借助开源代码X264在CCS开发平台进行试验,测试了编码优化前后的帧率等各种性能,旨在寻求更高效的视屏编码算法。


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

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

相关文章

IDA*与A*

我实在懒得写博客了,直接放上来之前讲课做的的PPT得了。 PPT_Source Code.zip 转载于:https://www.cnblogs.com/zzzc18/p/8323927.html

java 子类 父类 转换_Java子类与父类之间的类型转换

1.向上转换父类的引用变量指向子类变量时,子类对象向父类对象向上转换。从子类向父类的转换不需要什么限制,只需直接蒋子类实例赋值给父类变量即可,这也是Java中多态的实现机制。2.向下转换在父类变量调用子类特有的、不是从父类继承来的方法…

H.264视频编解码的代码移植和优化

基于DSP系统开发的视频编解码系统,国内几乎都是走的移植,优化的路线,并且移植的代码,都是开源的。毕竟花费大量的人力,物力去开发一套自己的代码,并不见得比一些成熟的开源代码效率更高,健壮性更…

SublimeText2 快捷键

SublimeText2 快捷键,与对应功能一览表: 快捷键功能ctrlshiftn打开新Sublimectrlshiftw关闭Sublime,关闭所有打开文件ctrlshiftt重新打开最近关闭文件ctrln新建文件ctrls保存ctrlshifts另存为ctrlf4关闭文件ctrlw关闭ctrlk, ctrlb切换侧边栏显…

java-linux-eclipse配置

转载于:https://www.cnblogs.com/sheying/p/8327517.html

n皇后问题java_经典n皇后问题java代码实现

问题描述:在n*n的二维表格,把n个皇后在表格上,要求同一行、同一列或同一斜线上不能有2个以上的皇后。例如八皇后有92种解决方案,五皇后有10种解决方案。public class TestQueen {int n; //皇后的个数int num 0; // 记录方案数int…

ffmpeg mplayer x264 代码重点详解 详细分析

ffmpeg和mplayer中求平均值得方法 1 ordinary c language level #define avg2(a,b) ((ab1)>>1) #define avg4(a,b,c,d) ((abcd2)>>2) 显而易见...,注意a,b宏表达式可能引出的副作用 2 SIMD by software…

nagios监控服务器的搭建

nagios 概述: 开源的免费的网络监视工具。 监控: windows, Linux,Unix,交换机和路由器。报警。 Nagios是插件式的结构,它本身没有任何监控功能,所有的监控都是通过插件进行的,因此其是高度模块化和富于弹性的。Nagios…

BZOJ1031: [JSOI2007]字符加密Cipher

1031: [JSOI2007]字符加密Cipher Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 7882 Solved: 3425[Submit][Status][Discuss]Description 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考。一天,他突然想出了一种他认为是终极的加密办法&#…

java栈顶元素_栈在Java类库中的实现

栈是一种后进先出的数据结构。在它之上,主要有三种操作:(1)判断栈是否为空——empty();(2)在栈顶添加一个元素——push(E);(3)删除并返回栈顶元素——pop()。在Java类库中,Stack类实现了栈,它继承自Vector类…

LoadRunner远程监测Centos服务性能配置过程

由于公司的需要,经过一段时间的探索,参考了很多业内人士的文档,终于完成LoadRunner远程监测centos服务器的配置过程。 首先监测所需要服务是否存,如果存在就不必要安装,如果不存在,需要安装对应的服务。 监…

day 68 增删改查 语法

1 普通正则 2 分组正则 url(r/blog/(\d)/(\d),views.blog) blog(request,arq1,arq2) 按照位置传参 3 分组命名 url(r/blog/(?P<year>\d)/(?P<month>\d),views.blog) blog(request,year,month) 4 用name 指定别名 url(r/blog/(?P<year>\d)/(?P…

编译器入门 语法分析器 java_从零开始写个编译器吧 - Parser 语法分析器

Parser(语法分析器)的编写相对于 Tokenizer (词法分析器)要复杂得多&#xff0c;因此&#xff0c;在编写之前可能也会铺垫得更多一些。当然&#xff0c;本系列旨在“写出”一个编译器&#xff0c;所以理论方面只会简单介绍 tao 语言所涉及的部分。之前的几章中&#xff0c;我纯…

017——数组(十七) asort ksort rsort arsort krsort

<?php /*** 数组 asort ksort rsort arsort krsort*///asort()对数组按值排序&#xff0c;保留键名&#xff1a; /*$arrarray(bbs_url>bbs.lantian.com,web_url>www.lantian.com,bbs_name>免费视频教程,www_name>PHP项目开发, ); asort($arr); print_r($arr);…

v4l打开video设备 ,执行VIDIOC_DQBUF,出现Resource temporarily unavailable 问题

如果你在执行VIDIOC_DQBUF突然提示以下错误&#xff1a; error: VIDIOC_DQBUF: Resource temporarily unavailable 那么很可能是你使用非阻塞方式打开设备文件的造成的。 Resource temporarily unavailable是一种EAGAIN的错误。EAGAIN是较常见的一种错误(比如用在非阻塞操作…

ubuntu下无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用)

sudo apt-get install git E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E: 无法锁定管理目录(/var/lib/dpkg/)&#xff0c;是否有其他进程正占用它&#xff1f; 当执行sudo apt-get相关的命令&#xff0c;会显示上面类似的错误 参考别人的解决方法是 sudo r…

java get方法不序列化_Java中的Json序列化,不容忽视的getter

在开发的过程中&#xff0c;经常会碰到和自己预期不一样的情况。有的时候自己去研究一下还是很有趣的。这两天在写java web的时候&#xff0c;碰到了一个对象序列化的问题。问题重现public class AjaxJson {private boolean success;private String msg;private Object obj;pri…

mysql 通过echo的方式写入数据库 中文乱码解决方案

echo "set names utf8;insert into xxx (path, sn, time, flag) values ($wav, $sn, $secs, op);" | MYSQL echo "set names utf8;insert into xxx (path, sn, time, flag) values ($wav, $sn, $secs, op);" 前面增加 set names utf8;

getParameter和getAttribute的区别

转自http://blog.csdn.net/java_xiaobin/article/details/45363897 1.getAttribute是取得jsp中 用setAttribute設定的attribute 2.parameter得到的是string&#xff1b;attribute得到的是object 3.request.getParameter()方法传递的数据&#xff0c;会从Web客户端传到Web服务器…

java int字母,从Java中获取int,也包含字母

How can I get the int value from a string such as 423e - i.e. a string that contains a number but also maybe a letter?Integer.parseInt() fails since the string must be entirely a number.解决方案Unless youre talking about base 16 numbers (for which theres …