`
mmdev
  • 浏览: 13238686 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

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的优化。


分享到:
评论

相关推荐

    深入理解视频编解码技术(基于H.264标准及参考模型)

    《深入理解视频编解码技术:基于H.264标准及参考模型》主要介绍基于H.264标准及参考模型的视频编...《深入理解视频编解码技术:基于H.264标准及参考模型》共享相关的资料和源代码,请到北京航空航天大学出版社网站下载。

    Android H.264视频编解码.zip

    本资料包"Android H.264视频编解码.zip"可能包含了关于如何在Android系统中实现H.264编码和解码的相关教程、源代码示例或库。 一、H.264编码技术 H.264,也称为MPEG-4 Part 10或AVC(Advanced Video Coding),是一...

    TMS320DM642上移植的H.264编解码算法源码

    H.264编解码算法分为编码器和解码器两部分,编码器负责将原始视频数据转换成压缩比特流,解码器则负责从比特流恢复出原始视频。 三、H.264编解码流程 1. 分析与预处理:视频流被分割成一帧一帧的图像,然后每个...

    H.264解码器的DSP移植及优化

    本论文详细探讨了H.264解码器在Texas Instruments的TMS320C64x DSP上的移植与优化过程,旨在实现高效能的视频解码。 H.264标准,全称为Advanced Video Coding,由ITU-T的VCEG(视频编码专家组)和ISO/IEC的MPEG...

    H.264编解码的CUDA实现,并行加速算法

    标题提到的“H.264编解码的CUDA实现”是指将H.264编码和解码过程移植到CUDA平台上,利用GPU进行并行处理,以提高处理速度和效率。这样的实现方式可以显著提升视频处理的速度,尤其是在处理大量视频数据时,如视频...

    基于S3C2440的H.264软编解码器实现.pdf

    在嵌入式系统领域,基于S3C2440处理器的H.264软编解码器的实现是一项关键技术。S3C2440是一款由Samsung公司设计的ARM9微处理器,广泛应用于各种嵌入式设备,如便携式媒体播放器、数字电视和监控系统等。H.264标准,...

    基于S3C2440的H.264软编解码器实现

    实验结果显示,在QCIF(Quarter CIF)分辨率下,基于S3C2440的H.264软编解码器能够实现近实时的视频解码与播放。这一成果验证了在资源受限的嵌入式设备上,H.264视频处理的可行性。 为了进一步提升编解码效率,满足...

    基于ARM9的H.264编解码器实现.pdf

    H.264(也称为AVC)是ITU-T和ISO/IEC联合视频小组开发的新一代视频压缩标准,具有高压缩率和低码流的特点,适用于网络传输视频数据,但其编解码计算复杂度较高,需要进行优化以满足实时处理需求。 首先,文章介绍...

    Symbian平台下基于FFmpeg的H.264解码器的移植.pdf

    在移动设备上实现高质量的视频播放,尤其是在Symbian平台上,移植开源的FFmpeg H.264解码器是一个重要的技术步骤。本文主要探讨了如何将FFmpeg的H.264解码器移植到Symbian操作系统,并强调了移植过程中需关注的关键...

    JM86_ccs.rar_H.264_H.264 代码_JM86

    在嵌入式系统中,H.264的移植通常是将高效的编码算法适配到特定硬件平台,以实现视频编解码功能,这可能涉及到优化代码以适应有限的处理器资源和内存限制。 在标签中,"h.264"和"h.264_代码"再次强调了这个项目与H....

    有关h.264的ffmpeg的源代码

    这个压缩包中的"有关h.264的ffmpeg的源代码"显然提供了FFmpeg库中与H.264编码相关的部分,对于学习和开发基于H.264的视频处理应用非常有价值。 1. FFmpeg框架: FFmpeg由一系列的库组成,包括libavcodec(编码/解码...

    H.264.pdf,编码解码

    ### H.264编码解码技术及其在TI-DSP DM642...通过对原始代码进行适当的调整和优化,可以在DM642这样的高性能DSP上实现高效的H.264编解码。这一过程不仅要求深入理解H.264的技术细节,还需要熟悉目标平台的特性和限制。

    H.264视频编码器的实现

    H.264视频编码器的实现有多种方法,不过大部分都是进行移植、优化的操作。H.264代码要在DSP的软件平台CCS环境下运行,需要注意几个问题:如配置文件、库文件的改动、数据类型的调整、汇编程序的处理、内存终结模式的...

    H.264在DM6446的移植的文章

    《H.264在DM6446上的移植与优化》 H.264是一种高效的视频编码标准,广泛应用于视频传输、存储和播放等领域。DM6446是TI公司推出的一款...通过精心的移植和优化,可以在DM6446平台上实现高效、高质量的H.264视频编码。

    h.264 硬件实现

    通过FPGA实现H.264编解码,可以提供比软件实现更高的速度和更低的功耗,特别是在实时视频处理应用中,这是非常关键的。 H.264编码过程主要包括:帧间预测、帧内预测、变换、量化、熵编码等步骤。在FPGA上实现这些...

    H.264解码-封装成dll Decoder H.264

    在IT行业中,H.264编码是一种...总的来说,"H.264解码-封装成dll Decoder H.264"是一个涉及到视频编码标准、解码算法、模块化设计和跨平台兼容性的综合技术课题。掌握这些知识对于开发高效、灵活的多媒体应用至关重要。

    基于H264编解码DSP的实现.pdf

    本文探讨了基于H.264编解码DSP的实现问题,重点研究了H.264视频压缩协议和TMS320DM642 DSP处理器。通过深入研究H.264标准和技术特点,结合x264编码器的优势,实现了高效的视频编解码功能。此外,还介绍了一个实际...

    根据ffmpeg修改wince下h.264解码程序

    FFmpeg是一个开源项目,包含了众多音频、视频处理工具,其中包括H.264编解码器。在Windows CE(简称Wince)系统上,由于其资源限制和与标准桌面操作系统不同的环境,对H.264视频的解码需要特别处理。本主题将深入...

Global site tag (gtag.js) - Google Analytics