微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 用开源API处理DSP视频

用开源API处理DSP视频

时间:10-04 来源:c114中国通信网 点击:

接收卡或网络这种"实时"源。某些源过滤器只是简单地把原始数据传递到剖析器(parser)或分离过滤器(splitter filter),同时其它源过滤器也执行自己的剖析步骤。变换过滤器 (Transform filter)接收原始数据或部分经过处理的数据,进一步处理后再传递到下一级过滤器。

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

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

GStreamer缓冲器

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

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

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

缓冲器创建

基于DaVinci技术的DM644x器件上ARM926的MMU(存储器管理单元)具有虚拟/物理寻址能力。然而,C64x+DSP内核只能够处理物理地址。因此,用于DSP处理的输入和输出缓冲器必须驻存在物理上连续的存储器中。

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

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

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

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

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

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

AV同步处理

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

另外,管道中的所有元件都使用共同的时钟,以

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top