使用OpenGL ES实现离屏视频帧合成与分解的可移植可扩展解决方案

2014年12月24日 14:56    发布者:designapp

        1.0  引言
用于处理离屏页面的视频帧合成与分解模块是视频通信、视频网络、视频安防等多媒体应用中最重要的软件组件之一。离屏页面是指没有在屏幕上显示的那些视频帧。
视频帧合成模块能够接入多个视频输入通道,每个通道可以有各自不同的属性,如像素格式、像素分辨率等。然后将来自这些通道的帧合成到单个或多个视频输出通道(同样可以有不同的属性)的输出帧上。当这种合成帧经编码并从一台设备发送出去时,接收设备中的帧分解模块将会完成相反的功能,即提取输入通道的视频帧中的合成帧。图1和图2显示了这些组件的功能描述。






本文将讨论需要使用这些模块的各种用例,在嵌入式平台上实现帧合成器/分解器的不同方法以及这些方法各自的优缺点,并推荐一种使用OpenGL ES构架和图形处理单元(GPU)的具有高度可移植性和可扩展性的设计解决方案。

【分页导航】
第1页:引言
第2页:视频通信系统
第3页:外部显示器
第4页:3D视频会议
第5页:使用独立于平台的算法
第6页:使用特殊平台缩放器






       
2.0  用例
多媒体系统有许多不同的应用场合需要使用帧合成器/分解器功能性组件。下面的解释讨论了其中的一些使用案例。
2.1  视频通信系统
在涉及到双方进行高清视频呼叫的IP视频通信系统中(即在点到点视频呼叫中),要求每台设备与另外一台设备交换从各自摄像机捕获到的视频帧。每台设备上可能会使用不同的视频压缩技术(如MPEG、H.264等)对捕获到的摄像机图像帧进行压缩/编码。压缩后的比特流再使用各种网络协议(如RTP、UDP)在网络上传送。

在接收端,首先要接收来自发送端的编过码的数据流,然后使用MPEG、H.264等视频解压缩算法进行解码/解压缩。最终在接收端显示解码后的帧。这样,呼叫双方都至少需要具有同时解码从网络上收到的帧和编码自己的摄像机捕获到的帧的功能。
在智能手机、平板电脑等典型的嵌入式系统中,实现点到点视频呼叫所需的这些编码/解码算法因所用的处理器架构而成为可能。这些算法要么在多内核CPU或低功耗数字信号处理器(DSP)上实现,要么使用硬件视频加速器实现。
但在视频会议情况下,会有多台设备进行视频呼叫。因此如果一台设备想要参与视频会议呼叫,它需要支持一个以上的解码实例来解码从多方收到的视频,还需要一个编码实例来编码自己摄像机的内容。
由于设备存在最多一路高清帧的编码和解码电路限制,低端平板电脑和智能手机不可能支持涉及多路高清帧解码和单路高清帧编码的会议呼叫。为了让这种系统支持高清视频会议,它们需要采用所有设备能够拨入的高端视频通信桥。图3显示了这种视频桥的功能。



视频桥接收来自所有设备的多路编码过的输入视频流,然后将它们解码为帧。来自多方的解码帧再合成为单个帧。这种视频桥将为每个连接的用户设备生成合成帧。
视频桥为某个用户设备产生的合成帧包含有除该台设备自己产生的帧以外的所有其它用户设备产生的视频帧。因此为了在所有设备之间建立视频会议,必须至少有一个桥。这种桥可以是一个高端视频卡,也可以是具有更强编码和解码功能的这些设备之一。
正如我们在上述例子中看到的那样,扮演视频桥角色的嵌入式设备需要具有离屏视频帧合成组件。

【分页导航】
第1页:引言
第2页:视频通信系统
第3页:外部显示器
第4页:3D视频会议
第5页:使用独立于平台的算法
第6页:使用特殊平台缩放器






       
2.2  外部显示器
对上述视频会议用例中与视频桥连接的每台设备来说,可能要求从输入的单路视频通道中提取/分解合成视频帧,并将它们显示到各台显示设备,或者出于演示等目的在接收终端的屏幕各窗口上显示。下面的图4就展示了这样的一个用例,其中来自用户A、C和D的帧被显示在用户A的LCD屏幕的各个独立窗口上,而来自用户B的帧显示在诸如HDMI电视机等外部显示器上。




【分页导航】
第1页:引言
第2页:视频通信系统
第3页:外部显示器
第4页:3D视频会议
第5页:使用独立于平台的算法
第6页:使用特殊平台缩放器






       
2.3  3D视频会议
在如图5所示的3D视频会议应用案例中,要求将来自两个摄像传感器的输入帧合成在一起,经编码后在网络上以数据流的形式传输。接收端则要求提取/分解出来自每个摄像传感器的帧,以便将各个通道的帧渲染到显示器的不同通道上,实现立体观看体验。





【分页导航】
第1页:引言
第2页:视频通信系统
第3页:外部显示器
第4页:3D视频会议
第5页:使用独立于平台的算法
第6页:使用特殊平台缩放器






       
3.0  实现
离屏帧合成器/分解器功能可以有多种实现方式:
3.1  使用独立于平台的算法
这种方法采用可以在CPU上运行的通用算法。虽然这种实现具有很好的可移植性,但会导致CPU负担过重。这是因为帧的合成/分解过程通常包含以下一些操作:
●缩放或重新调整视频帧尺寸(放大或缩小)
●输入视频帧在输出帧中的定位
●输入帧的剪切
●输出帧的剪切
●输入通道的Alpha混合
●输入/输出帧的旋转
在帧速率为30fps的视频流情况下,这些操作必须以1/30s即33.33ms的帧周期执行。如果帧的像素分辨率更高,比如720p、1080p,那么处理这些帧将成为CPU很重的负担。CPU负担的加重将导致不良的用户界面,因为I/O互动少了。如果处理器不能在如此短的帧周期内处理完一帧,那么在帧合成过程中有可能发生丢帧现象。

【分页导航】
第1页:引言
第2页:视频通信系统
第3页:外部显示器
第4页:3D视频会议
第5页:使用独立于平台的算法
第6页:使用特殊平台缩放器






       
3.2  使用特殊平台缩放器
一些嵌入式处理器提供特殊平台缩放器的硬件实现,它们实际上是用硬件方式实现的多相过滤器,可以针对不同缩放比例提供可编程的过滤系数。
为了在应用程序中发挥这种特殊平台功能,CPU芯片供应商将提供定制的设备驱动程序。我们可以通过缩放器设备驱动程序使用这种缩放器来实现合成功能。应用程序可以利用不同的输入/输出剪切参数一次调整一个输入帧并合成到输出帧中。一旦缩放器调整好了一个输入帧的大小并将它放到输入帧中,它就会向CPU内核发出中断信号。
针对将N个输入帧合成到一个输出帧的应用而言,它必须在一个帧周期内完成N次尺寸调整操作。这些缩放器非常高效,可以在可接受的时间限制内完成缩放处理。合成帧的输出帧速率取决于单次缩放操作所占用的时间。
如果是N到1的合成、并且输入/输出帧具有相同的像素分辨率,那么



N代表输入数量
T代表一次缩放操作所花的时间
如果合成中的输入/输出帧具有不同的像素分辨率,那么:


  
Tn代表将第n个输入通道的帧缩放后放到输出通道所花的时间。其中n:0->N
上述公式同样可以应用于具有一个输入和N个输出通道的分解器。
虽然使用这种方法可以提供高效的解决方案,但它不具有可移植性。这些硬件功能对嵌入式处理器来说是特定的。要么不同的嵌入式处理器不一定有这些功能,要么是以不同的方式实现,具有不同的功能清单。
控制这些定制硬件的设备驱动程序提供的接口和功能在每种嵌入式处理器上是不同的。而且一般来说,像旋转、Alpha混合等功能无法用这种缩放器硬件来实现。
本文作者:Sharath Bhat

【分页导航】
第1页:引言
第2页:视频通信系统
第3页:外部显示器
第4页:3D视频会议
第5页:使用独立于平台的算法
第6页:使用特殊平台缩放器