开源API在DSP上进行视频处理技术

时间:2011-06-27

  数字信号处理是将信号以数字方式表示并处理的理论和技术。数字信号处理与模拟信号处理是信号处理的子集。数字信号处理的目的是对真实世界的连续模拟信号进行测量或滤波。因此在进行数字信号处理之前需要将信号从模拟域转换到数字域,这通常通过模数转换器实现。而数字信号处理的输出经常也要变换到模拟域,这是通过数模转换器实现的。

  开源多媒体构架在GPP上一般运行在Linux操作系统下,是这些API的理想对象。利用API可以卸载视频编解码器的计算负荷,大大减小DSP编程的复杂性。API是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。这种方案只要求编程人员具备基本的DSP知识即可,无需编写代码来整合DSP功能与那些运行在GPP上的功能。

  硬件平台的选择

  在选择运行编解码器的硬件平台时,开发人员有几种可选方案。ASIC是一种为专门目的而设计的集成电路。是指应特定用户要求和特定电子系统的需要而设计、制造的集成电路。ASIC的特点是面向特定用户的需求,ASIC在批量生产时与通用集成电路相比具有体积更小、功耗更低、可靠性提高、性能提高、保密性增强、成本降低等优点。它的缺点流片费用很高。此外,比如改动以适应编解码标准,相关实现费用非常高昂。

  另一方面,GPP内核的流片费用相对较低,但由于它们在执行计算密集的信号处理应用时效率低下,故在应用于数字视频处理时性能较低。

  DSP不同于GPP,DSP是为数字视频应用中计算密集的信号处理应用而优化的。它具有单周期乘法器或乘法累加单元,能够加快编解码算法的执行速度。更高性能的DSP还包含有几个可以并行操作的独立执行单元,这使得它们能够每条指令执行好几个操作。此外,DSP还提供完全的软件编程能力,包括现场重编程能力。这就让用户可以先推出MPEG-2产品,以后再升级为H.264视频编解码器。

  图1:只含解码器的范例中的多媒体框架职责和数据流程

  组件集成的挑战

  数字视频系统的开发人员还面临着集成的挑战。数字视频系统包含了多个编码器、解码器、编解码器、多种算法及其它软件,这些组件都必须集成到一个可执行映象中,然后才能在系统上运行内容。集成所有这些组件并确保其运行协调是一件很困难的任务。不同的系统可能需要截然不同的视频、图像、语音、音频和其他多媒体模块。

  许多数字视频开发人员都开始采取开源途径来构建软件。一种常用的方案是从开源获得软件的重要部分,而在可用性和硬件集成方面充分发挥内部能力。开发人员常常参与开源技术开发项目。

  新的API

  API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。API除了有应用“应用程序接口”的意思外,还特指 API的说明文档,也称为帮助文档。

  德州仪器开发出了一款API,该产品能够充分发挥开源多媒体框架中的GStreamer等DSP的优势。这款API使多媒体编程人员可以利用熟悉环境中的DSP编解码引擎,把数字视频编程人员从复杂的DSP编程中解放出来,该接口还能自动高效地在ARM和DSP间进行工作划分。

  图2:GStreamer内数据通过GstBuffer结构进行表征的方法与其它几种操作系统及其相应多媒体框架所采取的方法相一致。

  GStreamer是一种媒体处理库,其通过管道的概念进行工作,媒体在其中按照已定义的方向从输入流到输出。GStreamer能够以一种简化编程过程的方式来提取不同媒体的操作行为,在数字视频编程社群中广受欢迎。通过GStreamer,能够编写出一种能够支持多种不同格式和网络的通用视频或音乐播放器。而且大部分操作由插件执行,并非GStreamer内核。GStreamer的基本功能性主要与注册和加载插件有关,并可提供基类,这些基类定义了GStreamer类的基本功能。

  GStreamer过滤器

  源过滤器负责从从数据源获取原始的多媒体数据以供处理,这里的数据源可以是硬盘文件,或CD或DVD光盘,也可以是电视接收卡或网络这种“实时”源。某些源过滤器只是简单地把原始数据传递到剖析器或分离过滤器,同时其它源过滤器也执行自己的剖析步骤。

  变换过滤器有多种类型,剖析器即是一例。这种过滤器把原始字节流分离为多个样本或帧、压缩器或解压缩器,以及格式转换器。呈现过滤器(Renderer filter)一般接收完全处理过的数据,并在系统显示器上或通过扬声器或某些外部设备进行播放。这一类过滤器还包括“file writer”过滤器和网络传输过滤器,前者可以把数据保存到硬盘或其它持久稳固的存储设备上。

  数据处理在plug-in_chain() 或 plug-in_loop()函数中进行。该函数可能像元件缩放那么简单,也可能像真实的MP3解码器那么复杂。数据被处理后,利用一个gst_pad_push()函数从GStreamer元件(element)的源衬垫(pad)发送出去,由此把数据传递到管道链的下一个元件。

  GStreamer缓冲器

  GStreamer是一个开源的多媒体框架库。利用它,可以构建一系列的媒体处理模块,包括从简单的ogg播放功能到复杂的音频(混音)和视频(非线性编辑)的处理。

  在GStreamer中,缓冲器是数据传输的基本单元。GstBuffer(实例)类提供了把一个存储区定义为流媒体的一部分所必需的全部状态。经由GstBuffer结构,Gstreame内部的数据表示遵循几种其它操作系统及其各自的多媒体构架所采用的方法,允许缓冲器的一小部分成为它自己的缓冲器,利用这种处理机制确保了存储空间不会过早释放。

  图3:复用已分配在驱动器上且在物理上是连续的缓冲的一种有效途径。

  缓冲器通常利用gst_buffer_new()来创建。创建好一个缓冲器之后,一般是为它分配存储器,设置缓冲器数据的大小。该缓冲器能够保存具有给定宽度、高度和每像素位的视频帧。

  缓冲器创建

  基于DaVinci技术的DM644x器件上ARM926的MMU(存储器管理单元)具有虚拟/物理寻址能力。然而,C64x+DSP内核只能够处理物理地址。

  虚拟到物理地址的转换由编解码引擎处理。通过复用(指针指向)某些由驱动器分配的缓冲器,可获得物理上连续的存储器,这里使用了Linux中的一些技术,比如dma_alloc_coherent(),来在内核空间中分配这类存储器。由TI开发的库/内核模块CMEM,允许从用户空间应用来分配物理上连续的存储器。

  输出缓冲器的指针被传递给fbvideosink(通过 GstBuffer)。这个videosink必须把解码后的数据memcpy(复制)到帧缓存中,然后才能显示。由于memcpy操作是一种成本很高的GPP使用,这种方法使得ARM 和DDR接口的负载很重,因而增加了功耗,且效率极低。

  这种技术对非常小的缓冲器是可行的,但在开发人员使用D1大小的缓冲器时,将开始降低系统性能。一种更有效的方案是复用已经驱动器分配了的物理连续缓冲器,并在编解码器引擎和videosink插件之间把指向这些缓冲器的指针来回传递。

  这个API替代方案利用gst_buffer_new()来创建新的缓冲器。当元件获知它将在哪一个源衬垫上推动数据时,就对gst_pad_alloc_buffer()函数进行调用。这允许对应的元件为调用元件的工作提供特殊的“硬件”缓冲器,故而减少了系统所需的memcpys数量。

  视频解码器插件将把从视频呈现过滤器获得的缓冲器用作视频解码器和执行解码的输出缓冲器。一旦解码完成,这个输出缓冲器将被推动给视频呈现过滤器插件。由于解码后的图像已经存在于视频驱动存储器中,在帧被显示时,视频呈现过滤器将只需把目前的显示缓冲器转换为这种特定的缓冲器就可以了。

  AV同步处理

  播放期间的音频/视频同步处理一般需要三类决策:一是重复帧的决策。一般在媒体流的帧的显示时间比帧间隔时间更大时采用。二是显示帧的决策。一般在媒体流的帧的显示时间在和阈值之间时采用。三是跳帧决策。一般在帧的显示时间落后显示时间至少两个帧时采用。这样,跳过当前帧,处理下一个帧,以期弥补下一个帧间隔。

  另外,管道中的所有元件都使用共同的时钟,以便于这些活动的进行。幸运的是,所有这些决策都由GStreamer内核库中的音频视频sink基类来完成。这样一来,AV同步的复杂性大部分都在用户那里被转移了。

  以插件形式开发的接口

  TI开发了一种GStreamer变换过滤器插件,它利用DSP来进行视频解码,运行于ARM上,使用Linux操作系统。TI还提供有Linux外设驱动器,在驱动器接口和编解码引擎API方面符合标准开源机构的要求,由硬件制造商提供的API,事先已针对硬件实现做了优化。如果改用新的硬件,无需改变应用代码就可直接替以新的驱动器。

  硬件的计算资源以一种方式被执行,无需任何汇编编程。其中包括很多复杂的操作,和基于硬件的加速引擎;链接模式下增强型直接存储器访问外设的使用,以提高数据传输效率;以及中断模式和tasklet模式的数据包处理,以灵活满足不同应用的要求。

  由于GStreamer是一种非常流行、广为人知的架构,它已成为数字视频开发的一种标准,在这种环境中充分利用 DSP优势的能力使得编程人员不再需要学习专用DSP编程语言。

  该方案还易于把DSP的功能和GPP内核上运行的典型应用的一些其他要求集成在一起。利用其他GStreamer插件,可以把解码编码与数字视频应用所需的其他操作相结合。这种多媒体架构通过把各种本来需要手工编码的操作整合在一起来实现集成。

  该软件架构可以实现各式广泛的视频产品的设计。利用这种开源结构,能为视频设备设计人员提供社群支持、稳健的基础架构,从而缩短上市时间。


  
上一篇:巧用布线技术提高嵌入式系统PCB的信号完整性
下一篇:宝利通助国家电网公司部署远真解决方案

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料