新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 如何通过开源API在DSP上进行视频处理

如何通过开源API在DSP上进行视频处理

作者:时间:2009-07-09来源:网络收藏

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

例如,我们利用前面提到的CMEM驱动器来分配物理上连续的“输出”缓冲器。编解码引擎对帧解码,并把解码后的帧放在输出缓冲器中。

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

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

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

解码器插件(变换过滤器,编解码器引擎能够充分利用的优势)将把从呈现过滤器获得的缓冲器用作解码器和执行解码的输出缓冲器。一旦解码完成,这个输出缓冲器将被推动(即指针被传递)给视频呈现过滤器插件。由于解码后的图像已经存在于视频驱动存储器中,就不再需要memcpy了,在帧被显示时,视频呈现过滤器将只需把目前的显示缓冲器转换为这种特定的缓冲器就可以了。

AV同步

播放期间的音频/视频(AV)同步一般需要三类决策:一是重复帧的决策。一般在媒体流的帧的显示时间比帧间隔时间更大时采用。二是显示帧的决策。一般在媒体流的帧的显示时间在最小和最大阈值之间时采用。三是跳帧决策。一般在帧的显示时间落后显示时间至少两个帧时采用。这样,跳过当前帧,处理下一个帧,以期弥补下一个帧间隔。持续这样做直到下一个帧被显示或不再剩有帧可供比较。

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

以插件形式开发的接口

TI开发了一种GStreamer变换过滤器插件,它利用来进行视频解码,运行于ARM上,使用Linux操作系统。TI还提供有Linux外设驱动器,在驱动器接口和编解码引擎API方面符合标准机构的要求,后者注意了编程的相当大部分的复杂性。由硬件制造商提供的API,事先已针对硬件实现做了优化。如果改用新的硬件,无需改变应用代码就可直接替以新的驱动器。这种方案大幅度降低了视频开发的成本和交付周期。

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

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

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

总而言之,这一新接口能够利用GStreamer Linux多媒体构架来充分发挥TI的DaVinci处理器平台的软件基础架构的优势。这种整合型的基础架构提供了灵活的构架,能够适应新一代多媒体编解码器的要求。

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


上一页 1 2 3 下一页

评论


相关推荐

技术专区

关闭