zoukankan      html  css  js  c++  java
  • 嵌入式视频处理考虑(一)


    引言:

    作为消费者,我们对于各种形式的视频系统都已经非常熟悉了。但是从嵌入式开发人员的角度来看,视频就好像是一张纷繁复杂的网络,里面充满了各种不同的分辨率、格式、标准与显示等。


     

    视频端口特性

    为了处理视频流,处理器必须有一个合适的接口,以便以高数据传输速率输入和输出数据。有些处理器通过其自身的外部存储器接口与FPGA或FIFO连接实现了上述高速数据接口。一般情况下,这类器件主要用来协调处理器输入与输出的恒定但速度较慢的视频流,和外部存储器控制器的偶尔但极快速的视频流之间的关系。

    不过,这种方式还是存在问题。例如,FPGA和FIFO价格昂贵,往往和视频处理器本身的价格差不多。另外,用外部存储器接口来传输视频数据,会占用这些系统中其他主要用途的带宽,也就是说处理器内核与外部存储器之间来回传输视频数据需要的带宽。

    FIFO原理

    所以,媒体处理系统中最好有一个专用的视频接口。在Blackfin处理器中,这个专用视频接口就是并行外设接口(Parallel Peripheral Interface ,PPI)。PPI是多功能并行接口,可以配置为8位或16位两种宽度。该接口还支持双向数据传输,包括3条同步信号线和一个时钟引脚,与外部时钟相连。PPI接口可以无粘合地对ITU-R BT.656数据进行解码,还可以和ITU-R BT.601视频流接口。作为高速模数转换器(ADC)和数模转换器(DAC)的传输通道,PPI是一种灵活而快速的接口。PPI还可以仿真外部处理器的主控接口,甚至还可以用作无粘合的TFT-LCD控制器。

    PPI具有一些内建的特性,可以降低系统的成本,提高数据传输速率。例如,在BT.656模式下,PPI可以对输入视频流进行解码,并自动忽略除活动视频之外的所有信号,从而有效的将NTSC输入视频流的速率从27MB/s降低到20MB/s,并且显著的降低了处理食品所需的片外存储空间。反过来,PPI还可以忽略活动视频区域的数据,而仅仅读入嵌入在垂直消隐间隔内的附属数据,如下图。

    PPI中,对BT.656各个区域进行有选择性的屏蔽

    类似的,PPI还可以将隔行扫描视频流中相隔的场忽略掉,换句话说,它不会把这些数据传输给DMA控制器。虽然这样做可以立即将输入带宽降低50%,但同时也消除了50%的视频源信息,有时候这种折中是无法让人接受的。尽管如此,在输入视频的分辨率远远大于输出视频分辨率的时候,这还是一个有用的特性。

    与上面类似,PPI接口允许“跳过”奇数或者偶数分量,从而又一次节约了所跳过的像素需要的DMA带宽。例如,对于4:2:2YcrCb视频流而言,这个特性允许只读入亮度或者色度分量,从而为不同处理器之间算法的分割提供方便,也就是说,一个处理器读入亮度信号,而另一个处理器读入色度信号。另外,该接口还提供一种简单的方法,可以将图像或者视频流转换为灰度图像或者视频(仅亮度)。最后,在一些交错I/O数据的高速转换器应用中,这一特性还可以用于分离同相和正交数据分量。

    最重要的是,PPI是一种与格式无关的接口,因为它并没有针对特定的视频标准进行硬件连线。PPI还允许用户对行的长度和帧的大小进行编程。这对于那些需要CIF或QCIF视频,而不需要标准的NTSC/PAL格式的应用有很大帮助。一般而言,只要输入的视频信号具有合适的EAV/SAV码子(用于BT.656视频),或者硬件同步信号(用于BT.601视频),PPI就可以对其进行处理。


     

    数据封包

    虽然BT.656和BT.601建议允许用10比特表示像素,但是这个字长对于图像处理来说并不是很友好的。问题是,大多数处理器在处理8比特、16比特或32比特的数据时效率非常高,但是对于其他字长的数据,则会存在数据搬移效率低下的问题。例如10比特的像素值仅仅比8比特的像素值多了2比特,但是大多数处理器会将这些数据作为16比特来处理,其高6位比特固定为0 。这样做,不仅消耗了内部数据传输(DMA)总线的带宽,而且还浪费了大量的存储空间——这正是视频应用中的不足之处,此时若干个整频的视频数据通常要存储在外部存储器中。

    由数据宽度大于8比特带来的低效率问题还有未优化的数据封包。通常,高性能的媒体处理器会与其外围设备约定一种数据封包机制,用来处理外部和处理器内部数据移动,其目标是尽可能减小数据输入和流出外围设备时给这些总线带来的总体负担。

    因此,一个8比特的视频流以27MB/s的速率输入外围设备时,可能经过数据封包后到了内部32 比特总线上,这样要求这个总线以仅仅27/4,即6.75MHz提供服务。不过,需要注意的是,总的数据传输速率仍然不变(6.75MHz*32bit=27MB/s)。对比而言,10比特的视频流以27MB/s的速率输入,只能以两个16比特的形式封包到内部32比特总线上,从而总的传输速率仅仅降到了27/2即13.5MHz。这种情况下,由于每个16比特的数据中仅有10 比特是有效的,从而造成内部总线带宽的37.5%没有被有效利用。


     

    可能的数据流

    对多媒体系统中视频端口的一些连接方式进行考察,展现出系统作为一个整体是如何与内部每一个组件相互依存的,将对我们有很大的帮助。下图(a)中,图形源端将数据发送到PPI,然后DMA将这些数据再搬移到一级缓存中,在一级缓存中数据经过处理后变为最终的形式,然后通过高速串行接口发送出去。对于低分辨率视频处理和JPEG等图形压缩算法来书,这个模型工作的非常好,它将视频分成一些较小的宏块(包含若干行)来处理,每个宏块在处理之后就再也用不上了。这种处理流程对于数据转换应用也非常有用。

    在下图(b)中,视频数据没有被送入一级缓存,而是直接写入了三级缓存中。这种配置形式支持例如MPEG-2和NPEG-4算法,这些算法需要将中间的视频帧数据存储起来,以执行时间轴上的压缩。在这种应用场景下,一级缓存和三级缓存之间的双向DMA数据流就可以完成像素宏块以及其他中间数据的传输。

    可能的视频端口传输方式


     

    视频ALU

    大多数视频应用都需要处理8比特的数据,因为单个的像素(不管是RGB还是YCbCr格式)一般都是按照字节组织的。因此8比特的视频ALU(Arithmetic and Logic Unit,算术与逻辑单元)和基于字节的地址产生方式对像素的处理会产生重大差异。这一点是非常重要的,因为嵌入式媒体处理器一般工作在16比特或32比特模式下。

    Blackfin处理器专门有一些指令是为了高效处理8比特视频数据而设计的。下表中归纳了一些专门的指令,综合起来运用这些指令就可以实现各种各样的视频操作。

    DMA考虑

    二维DMA为系统级提供了诸多优势。对于初学者来说,二维DMA可以方便和外部存储器之间的宏块传输,允许在实际传输过程中进行数据操作。这样就消除了传输不连续数据时的额外开销。同时,通过选择性的传输数据也降低了数据的带宽,也就是说,只传输图像中需要的部分,而不是传输整幅图像。

    举一个例子,二维DMA还允许以一种处理起来更加自然的顺序将数据搬移到存储器中。下图中,RGB数据可能从一个CCD传感器中以隔行RGB888的格式输入到处理器的二级缓存(L2),但是通过使用二维DMA,可以分别将R、G、和B数据传输到三级缓存中。将视频和图像数据中的颜色空间分量拆分或者合并,节省了处理之前额外的数据搬移。

    用二维DMA解交织数据


     

    平面和交错缓存格式

    该如何决定是将存储器结构定义为交错型还是平面型?交错数据的优点是,它是图像传感器最自然的输出格式,是视频编码器最自然的输入格式。但是,平面缓存(也就是说每一种像素分量使用单独的存储区域)往往对视频算法是更有效的存储结构。因为这些视频和图像处理算法(包括JPEG和MPEG)中,有许多是分别在亮度空间和色度空间工作的。而且,更重要的是,在三级缓存中访问平面缓存要比大跨度的找交错数据更加有效,因为,当以平面方式构造缓存时,SDRAM页面的延迟效应被扩展到了更大的样本空间中。

    双缓存

    为了保证当前数据不被新的数据覆盖,常常需要双缓存。管理一个视频显示缓冲区是这种策略的一个极好的例子。通常来讲,有些系统中,视频源和最终的显示内容之间存在着不同的速率,这就需要在就的内容和新的视频帧之间有一个平滑的切换。使用双缓存可以解决这个问题。一个缓存指向当前的视频帧,以确定的刷新速率向显示屏发送数据。另一个缓存存储最新的输出帧。当最后一个缓存被填满后,DMA发出中断信号,表示应该将新的一帧数据发送到显示屏了。从这一刻开始,第一个缓存开始填充新的刚刚处理过的视频数据,而第二个缓存则输出当前显示帧。这两个缓存以“乒乓”的方式来回进行切换。

    另外也应该注意到,为了给同步提供更多的余量,同时降低中断的频率和与之对应的延迟时间,除了使用两个缓存外,也可以使用多个缓存。


    版权所有权归卿萃科技,转载请注明出处  

    作者:卿萃科技ALIFPGA  

    原文地址:卿萃科技FPGA极客空间 微信公众号


    扫描二维码关注卿萃科技FPGA极客空间


     



  • 相关阅读:
    POJ 3411 Paid Roads(DFS)
    POJ 1699 Best Sequence(DFS)
    Codeforces Round #191 (Div. 2)
    Windows && Linux 搭建python开发环境
    zabbix 源码编译安装
    智能运维基础设施
    Redis
    ubuntu16.04 安装 mysql
    Python必须知道的基础语法
    ubuntu && CentOS && RedHat 离线安装docker
  • 原文地址:https://www.cnblogs.com/alifpga/p/7654699.html
Copyright © 2011-2022 走看看