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

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

目前对于H.264而言,移植的代码主要有JM,x264和T264。移植的时候,就需要对各个代码进行测试,以确定要移植的代码。相对而言,JM的移植更容易,但效率比较差,如果基于科学研究,移植JM的比较多,多见于各高校的研究人员。对企业而言,考虑到实时性的要求,移植以X264和T264居多。

将视频编解码移植到DSP的时候,考虑到DSP系统资源的宝贵,主要考虑的因素是系统空间,包括程序空间和数据空间,所以需要对原始的C代码,进行评估,这就需要对于所移植的代码有一个比较详细的了解。代码空间一般可以通过map文件进行估算。数据空间的估计,需要计算程序中内存的使用情况,除了malloc申请的空间,还包括静态数组,主要是H.264标准中的各种表格数组以及一些全局变量等等。

准备好了这些,就可以开始移植了,移植,也是一个考验你的过程。

做好了移植的准备工作,就进入了开发过程的第一个重要阶段---移植。

    移植开发的时候,最好准备两个版本,一个纯C代码,在VC下编译,运行,另一个是VDSP下的版本(ccs同理),VC版本主要是验证代码运行是否正确,VDSP版本就是移植以后的版本,两个版本同步更新,即尽量保持两个版本的一致性,但能够同时在VC和VDSP下运行。在移植过程中,一般会遇到的问题如下:

  1.头文件的不同,一般问题都是linux下的头文件,在VDSP中没有存在。最典型的就是inttypes.h 和 stdint.h,这种头的作用主要是定义了8字符,16字符,32字符,64字符的数据类型,移植的时候,可以自己建一个头文件或者直接在其他的头文件中把这些数据类型的定义加进去,这样的话,就不会出现问题。其他的类似,要么找相应的头文件替换,要么干脆自己定义。

  2.Int64_t和Uint64_t 的问题, 在第一步中,其实也存在这个问题, 不过我最初是用long和Unsigned long 来代替,不过这样的话,编译是可以通过,但仔细分析,其实是有问题的。一般来讲,64位数的用途有两个,第一种是这个数字可能比较大,当累积到一定的程度,可能超过32位,这种情况下,可以用32位代替,不过最好加上注释,告诉自己这个数可能越界,在后面调试的时候,要提示自己注意一下。另一种用途,是开发者为了速度的要求,对一些变量复制的时候,使用了强制性的指针赋值,这种情况下,就不能直接该成32位数据了,那样的话,虽然编译通过,后面运行,肯定有错误的。这种情况下,可以使用32位数据类型,分两条语句对变量赋值,当然,这是个时候要千万注意,不要把地址搞错了。

3. Inline的问题,移植以后,编译的时候Inline经常会报错。虽然有编译选项可以去掉错误,不过你如果和我一样不熟悉的话,直接去掉 Inline关键字,到后面随着对VDSP熟悉以后,如果有优化的需要,再按照VDSP的语法,为自己想要嵌入的函数增加Inline关键字。

经过上面的修改,一般情况下,编译就没有问题了,当然,这只是移植的第一步。距离成功,还很远!

代码可以编译了以后,你可以尝试着运行,一般情况下,都会出错,并且,链接都会有问题,所以,还需要进行一下工作。

1. 配置LDF文件。因为刚移植的代码,往往数据和程序都非常大,所以,SRAM里面肯定是放不下的,这个时候,链接就会有问题。刚开始的时候,最好把所有的程序和数据都放在SDRAM里面去,这样的,链接就不会有问题了。Stack和heap情况类似,开始的时候,都先放到SDRAM。开始的时候,你需要的是一个可以运行正确的程序,速度倒在其次。

2.Malloc的问题。DSP下的开发,malloc都是一个需要解决的问题。动态申请内存,就算可以运行,结果往往也是不对的。所以,最好进行静态分配,用数组的形式分配,这样做的好处是可以方便自己管理,那些数组多大,放在那里,自己都很清楚,因为优化的时候,有一些是要放在SRAM中,另外一些特别大的才放在SDRAM中,这样才能取的比较好的效果,另外,静态数组也稳定性一些,不需要记着去释放。

3.文件操作。在VDSP的SETTING下,有一个STDIO的开关,其实可以支持文件操作,但是我调试的时候发现,有些情况下是有问题的。比如我在一个循环中使用fread,但是他只有第一次的读取是有效的,但有些时候,它好像又可以。所以,你调试的时候,如果发现结果和VC下运行的不同,可以重点看看,是不是这里出了问题。

4.调试跟踪。经过上面的准备,程序已经可以运行了。你可以在Simulator下仿真,或者板子上直接仿真。在SI下,速度会很慢,不过Sesion里面,有一个blackfin family那个sision,速度还可以,当然,有板子会更好。我们开发的时候,我使用板子的时间总共不到两个月,所以浪费了很多时间,现在回头看看,好心痛。

调试结果OK了的话,说明移植已经成功了。就可以进入下一个最主要的阶段---优化了。

移植搞好了以后,就可以进行优化了,优化是一个长期的,枯燥的,但很有挑战性的工作。做优化,你要熟悉blackfin的汇编指令,熟悉H.264标准,熟悉你所移植的代码结构,在优化过程中,的确是很枯燥的,需要你很有耐性,经常会因为一个小小的错误,让你跟踪几天甚至几星期,但是,当你看到随着你工作的不断进展,程序需要的cycle数越来越少,还是很有成就感的。

在blackfin上做优化,最主要的工作可以分为:

1.系统结构优化。

2.汇编优化。

3 cache和DMA优化。

一个好的优化程序,这几个方面肯定都会涉及。至于各自所起的作用,我没有详细测试。系统结构优化和汇编优化可以先进行。等做到一定程度了,再进行cache和DMA的优化。


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

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

相关文章

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 …

Spring-data-jpa常用方法

转载于:https://www.cnblogs.com/summary-2017/p/7904926.html

面试问题汇总 精选 分析 解答 职业规划 part 1

C/C/C#面试题精选&#xff08;1&#xff09; 题目&#xff08;一&#xff09;&#xff1a;C中我们可以用static修饰一个类的成员函数&#xff0c;也可以用const修饰类的成员函数&#xff08;写在函数的最后表示不能修改成员变量&#xff0c;不是指写在前面表示返回值为常量&am…

java byte md5_Java开发网 - byte[]按自定义编码转换成String(MD5)

差不多了&#xff0c;这样应该就可以了&#xff0c;剩下的就是扩展能接受的类型了。import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class HashPasswords {public String getPassword(byte[] input) {byte[] digest;synchronized (…