背景技术
近年来,GPU的强大并行计算能力被逐渐应用到视频编解码中。文献[Shen 2005,G.Shen,G.-P.Gao,S.Li,H.-Y.Shum,and Y.-Q.Zhang,"Accelerate video decoding withgeneric GPU,"IEEE Trans.Circuits Syst.Video Technol.,vol.15,no.5,pp.685-693,May 2005.]将微软公司WMV-8解码器中的运动补偿、重构、色彩空间转换这3个模块移植到GPU中,取得了较好的加速效果。文献[Fang 2005,Fang B.,Shen G.,Li S.,Chen H.:Techniques for efficeitne dct/idct implementation on generic gpu.InProceedings of IEEE International Symposium on Circuits and Systems(2005),pp.1126--1129.]提出了许多新的技术在通用可编程GPU上实现DC、IDCT,实验结果表明该方法明显快于在CPU上使用MMX优化的IDCT算法。文献[Pieters 2007a:Pieters,B.,Rijsselbergen,D.V.,Neve,W.D.,,de Walle,R.V.,2007.Performance evaluation ofh.264/avc decoding and visualization using the GPU.In:Proceedings of SPIE onApplications of Digital Image Processing,vol.6696,pp.669606-1–669606-13.;Pieters 2007b:Pieters,D.Van Rijsselbergen,W.De Neve and R.Van de Walle"Motioncompensation and reconstruction of H.264/AVC video bitstreams using the GPU",WIAMIS\'07:Proc.8th Int.Workshop Image Analysis for Multimedia InteractiveServices,pp.69,2007.]将H.264中运动补偿、重构、色彩空间转换移入GPU,实现了高清视频的实时解码。文献[Kung 2008,M.Kung,O.Au,P.Wong and C.Liu"Block based parallelmotion estimation using programmable graphics hardware",Proc.Int.Conf.Audio,Language and Image Processing,pp.599-603,2008]通过重新排列4*4块的编码顺序,去除块之间的相关性,实现了运动估计的GPU加速。实验结果表明,该方法比CPU优化的SDVTD快了45倍。
在传统的视频解码的完整流程中,视频解码的流处理需要占据接近50%的CPU资源,动态补偿则占据约12%,去块滤波占8%,视频变换则占2.6%,四项加起来总CPU占用超过70%。如果没有硬件加速支持,完全依靠CPU负责解码的话,将导致CPU占用率居高不下、发热量剧增,甚至无法播放视频。基于GPU的强大并行能力和在视频图像处理领域的巨大潜力,Nvidia公司针对上述问题在GPU上开发了新一代PureVideo HD解码引擎支持H.264硬件解码,将所有图像解码工作交由显示核心负责,包括支持降低噪声,支持边缘增强锐利度和图像细节,支持图像色彩校正,校正显示屏屏幕与电视屏幕在色彩特性上的差异,确保输出图像质素与显示屏相若。支持LCD锐利化,增强色彩信号,对某些过慢反应时间的LCD显示屏进行补偿,消除残影。此外PureVideo的开发环境DXVA还定义了一组可以让图形驱动实现运算加速的硬件驱动接口(Device Driver Interfaces/DDIs)。但是GPU上视频编解码的核心硬件VP(Video Processor)作为独立的处理部件与GPU上执行并行计算和图形处理的CUDA架构并不是硬件一体的,而且其硬件视频处理的运行模式与GPU图形处理器上的运行模式为分离独立模式,整个视频的处理和三维图形的处理在逻辑流程上是完全分离的,给需要同时进行视频图像处理和3D图形绘制的虚实融合应用带来障碍。
在多路视频与大规模三维虚实融合绘制与可视化的场景及其应用系统中,当面对多路视频输入的虚实融合处理与计算时,无论视频解码还是融合场景的3D图形绘制处理,都面临庞大的计算量。虽然PureVideo的开发环境DXVA还定义了一组可以让图形驱动实现运算加速的硬件驱动接口(Device Driver Interfaces/DDIs),但是由于GPU上视频编解码的核心硬件VP(Video Processor)作为独立的处理部件与GPU上执行并行计算和图形处理的CUDA架构并不是硬件一体的,而且其硬件视频处理的运行模式与GPU图形处理器上的运行模式为分离独立模式,整个视频的处理和三维图形的处理流程是完全分离的。在视频与图形的处理过程中,视频的数据输入及后处理数据输出与图形的数据输入及后处理数据输出完全隔离,数据无法在显存中直接有效共享,往往只能间接通过PCIE通道进入内存后再通过纹理绑定的形式进行从视频数据到图形纹理数据的交换和共享。由于视频解码之后的图像数据量几乎可以达到Gb/s级,PCIE通道带宽基本被完全占用。此外,视频的解码和三维虚拟场景的绘制是被视为两个单独的任务进行处理,仅仅在视频解码的数据被指定打包成纹理数据之后才进入绘制的流水线,导致多路视频中大量的视频解码数据并不能适应或者符合三维图形绘制引擎中纹理映射和融合绘制的需求:
1)有效性需求:有m路视频输入,但是在浏览三维场景的某一时刻,只有其中某些视频所对应的三维场景部分位于当前的视点观察范围之内,则只有这些处于观察范围之内的n(n≤m)路视频才是有效的,其他则是无效的。针对无效视频的解码以及执行后续融合绘制操作都对最终的可视结果不产生任何影响,因此是无用的,但是执行解码会形成额外的系统开销从而导致系统性能的下降;
2)准确性需求:在保证视频信息的有效性基础之上,在浏览三维场景的某一时刻,处于当前的视点观察范围之内的n路有效视频,视频彼此之间的时间和空间分辨率往往存在不一致现象,即视频质量的需求不一样。例如位于距离视点较近距离的三维场景上出现的视频对象应该清晰度高,而距离视点较远的三维场景上出现的视频对象允许清晰度较低。每个视频对象都应该根据其所依附的当前三维场景的具体状况而采取相应的视频质量,而不应该所有的视频在解码时都采用最高清晰度标准进行解码,因为对n路有效视频按照原始最高清晰度标准解码对最终的可视结果不产生任何影响,因此是无用的,但是上述无用的解码开销会形成无谓的浪费从而导致系统性能的下降;此外,视频解码的帧速率应该是与当前三维场景绘制的帧速率相匹配的,即解码出来的视频帧的速率应该接近当前场景绘制的帧速率,因为当前场景的绘制帧速率是三维场景展示的决定性因素,过高的视频解码帧速率并不会带来更好的视觉效果,反而会造成系统资源的浪费和系统性能的下降。
3)可靠性需求:对同时出现在三维场景中的n路有效视频对象,需要精确计算出需要解码的初始视频帧,同时保证场景中多路视频对象播放时的时间的一致性。即在三维场景中同时出现的A和B两个来源于实时监控的视频对象,视频A的当前显示的播放时间为ta,视频B的当前显示播放时间为tb,则|ta-tb|需要小于某一个较小的误差阈值ε,使得两个视频对象的所播放的内容在视觉效果上基本同步的。
显然,在面向基于视频的虚实融合图形应用中,如果每一秒甚至每一帧都进行大量的视频解码之后的图像数据交换,对于整个虚实融合计算和显示的时间和效率影响将是灾难性的。三维图形绘制与计算中往往涉及大规模的三维场景模型,同时场景的绘制可能还包含多重纹理映射、多遍绘制及多目标绘制、半透明、透明绘制等复杂绘制方法与手段,需要占用大量的系统计算和存储资源,给虚拟现实系统或者增强现实系统的实时性需求带来了极大的挑战。满足三维图形绘制引擎中实时纹理映射和融合绘制需求的系统和方法,需要多路视频解码所在的视频处理模块和纹理映射所在的三维图形绘制模块两者协调组织在一起,并协同完成基于视频的实时虚实融合绘制任务。
具体实施方式
为使本发明的上述目的、特征和优点能够更加明显易懂,下面通过具体实施例和附图,对本发明做进一步说明。
图1是本发明方法的总体流程图。首先多路视频流输入至GPU上的视频对象缓冲区。视频对象缓冲区由buffer管理与调度(缓冲区管理与调度)模块进行缓冲区对象的添加,删除,视频流的数据缓冲暂存,视频流数据的清空等,该接口同时为视频与图形处理统一框架中的视频解码器提供原始视频数据,成为统一框架中的数据输入接口。该视频对象缓冲区中的视频对象通过SVC(Scaled Video Coding)视频解码器与图像纹理缓冲进行数据的单向转换,即将视频缓冲区中的视频对象经过视频处理解码之后转成三维虚拟场景模型绘制所需要的表面纹理对象,以利于虚实融合的计算。其次,视频对象的解码线程受视频对象所依赖的三维场景对应部分的视觉特性的控制和驱动,包括首先对三维场景的对应部分计算其可见性(视域可见性、背向面可见性、遮挡可见性)评估,然后对基于SVC策略编码的视频对象进行分层属性信息的计算和判定,包括空间分层分辨率,时间分层分辨率,从而决定其解码恢复的视频图像的质量。针对各个视频对象,三维虚拟现实系统会定时跟这些视频对象进行时间同步,以确保各个视频帧解码和播放的时间一致性,时间同步通过三维绘制系统向各个解码线程发送同步时间戳实现。经过GPU视频解码器进行解码以后,所有按照同步时间解码相应的时间片段而得到的图像序列和纹理ID绑定并存放在图像纹理缓冲区中,缓冲区中的图像纹理会被定期清理以容纳更新的视频图像。三维虚实融合场景的绘制中需要用到大量的视频纹理,因此构造一个新型的时间相关的时空纹理映射函数,从而向图像纹理缓冲中的纹理进行采样,并映射到三维场景的表面,并一起完成其他真实感绘制相关的操作。图像纹理缓冲区中的纹理图像在被采样访问结束之后,该幅纹理图像将会被销毁。三维场景经过纹理映射和其它光照等绘制结束之后,输出基于视频的虚实融合绘制的结果。
上述方案满足了视频虚实融合的有效性需求、准确性需求和可靠性需求,其基本过程如下:针对视频对象缓冲区中存储的由多路视频流所输入的视频对象,首先根据三维场景空间信息采取计算视频对象可见性的方法,从m路视频所对应的视频对象中选择出n路有效视频,以满足视频虚实融合的有效性需求;然后采取计算视频对象质量或者分辨率的方法,分别计算出n路视频中每一个有效视频对象的分辨率(包括时间分层分辨率和空间分层分辨率),以满足视频虚实融合的准确性需求;然后根据当前时间,计算出每个视频对象的起始解码时间,并且找到其对应的起始解码的I帧,后续的解码则从当前的I帧开始,上述工作满足虚实融合的可靠性需求。当三维场景的观察参数发生变化时,例如视点的位置、观察朝向、焦距等相机参数发生变化,或者三维场景中的视频对象本身发生变化时,则需要重新计算视频对象的可见性、分辨率和起始解码的I帧。视频对象按照分辨率需求解码之后所获得的每一帧图像都将直接作为图像纹理对象驻留在显存中,三维场景绘制的流程中,显示视频对象的部分则需要绑定相应的纹理对象并将纹理图像映射在三维场景中的物体的表面,上述执行一个视频纹理映射操作,最终结合场景的绘制需求,例如光照明或者其它半透明、多层纹理、法向纹理映射等多种真实感细节特效绘制等,绘制出融合了多路视频输入作为场景表面细节增强的三维虚拟场景或者增强现实场景。
一.视频对象可见性计算
视频与三维场景的融合过程中,视频对象是依附于三维场景中的某些区域或者模型的表面的,当进行虚实融合绘制之前,首先要确定这些视频对象所依附的三维场景的区域或者模型表面是否可见,从而确定这些视频的可见性。因此,首先进行的可见性判断的主要目标是当用户基于特定的视点位置或区域时,能够迅速判断出视频对象所依附的三维场景表面是否可见。对于视频对象所依附的三维场景的表面,采用的可见性的判断和剔除算法有以下三种:背向面判断剔除(back-face culling),视域体判断剔除(VFC,viewfrustum culling),和遮挡判断剔除(occlusion culling)。如图2所示。
1)视域体判断剔除
输入视频对象K所依附的三维场景表面Gk如果完全位于当前视点的观察三维场景视域体之外,则该部分的三维场景表面相对于当前视点不可见,标记可见性状态vk=0;否则该部分的三维场景表面部分(相交)或者完全(包含)位于视域体之内,标记可见性状态vk=1。在判断的过程中,为了提高判断的效率,采用三维场景表面的包围盒(又称为包围体)代替三维场景表面本身进行近似判断,即判断包围体是完全在视域体之内(包含),还是完全在视域体之外(排除),或是有一部分与视域体相交。对于完全在视域体外的包围盒所对应的三维场景表面Gk,直接赋予其可见性vk=0;否则标记可见性状态vk=1。
随着视点位置不断变化,视域体也在随之发生相应变化,如何根据当前视点信息快速计算视域体的6个平面成为整个VFC算法的基础。本发明采用了基于视点投影矩阵的快速计算方法。
首先计算当前相机的视点投影矩阵M(view projection matrix),M=P×V,其中P是投影矩阵(projection matrix),V是视点矩阵(view matrix),通过矩阵M可以将当前的世界坐标系转换成另一个仿射坐标系,在这个仿射坐标系中:原来的视域体转换成了一个立方体,令世界坐标系下的一个点为:v=(x,y,z,w),w=1,经过矩阵M变换之后得到的点为v′=(x′,y′,z′,w′),即有:
其中:
若此时点v′在视域体转换成的立方体之内,则点v在世界坐标系下的视域体内。
此时:v′满足:
-w′<x′<w′
-w′<y′<w′
-w′<z′<w′
下面以视域体的右侧面为例,阐述世界坐标系下的平面方程推导过程。视域体右侧面对应仿射坐标系下立方体的右侧面,则有:
x′<w′
即有:
也即:
根据空间解析几何,视域体右侧平面方程即为:
将此方程整理成nT·v+d=0的形式:
则有:nT=(m30-m00,m31-m01,m32-m02),
d=m33-m03
同理可以推导出视域体其他各个面的方程,总结如表1所示。
表1:视域体各面方程参数一览表
平面 |
法向量nT |
d |
Far |
(m30-m20,m31-m21,m32-m22) |
m33-m23 |
Near |
(m30+m20,m31+m21,m32+m22) |
m33+m23 |
Left |
(m30+m00,m31+m01,m32+m02) |
m33+m03 |
Right |
(m30-m00,m31-m01,m32-m02) |
m33-m03 |
Top |
(m30-m10,m31-m11,m32-m12) |
m33-m13 |
Bottom |
(m30+m10,m31+m11,m32+m12) |
m33-m13 |
三维场景中的三维模型形状千变万化,直接判断其是否在视域体之内显然不切实际,本发明使用模型的包围盒或者包围体(Bounding Volume/Bounding Box)作为近似,采用了基于轴对齐包围盒(Axis Aligned Bounding Box,AABB)的快速计算方法,这种方法只需要2个顶点就可以直接确定包围盒与视域体的相交情况,这两个点称为“正侧点(Positive vertex)”和“负侧点(Negative vertex)”(下文简称p点和n点),相对于检测平面π,p点的有向距离最大,而n点的有向距离最小,如图3所示,如果p点在平面π的负方向,那么AABB完全在视域体之外,否则进一步检测n点,若n点在平面π的负方向,则AABB与视域体相交,否则完全包含在其内部。
与传统方法相比,该算法极大的减少了计算次数,符合实时绘制要求,通常的算法需要计算包围盒8个顶点与视域体的空间位置关系,这需要48次“点-面”位置关系计算,在模型数量巨大的情况下,效率很低,根本无法满足实时渲染的要求。
2)背向面判断剔除
针对所有通过上述视域体判断的输入视频对象K(vk=1的视频对象)所依附的三维场景表面Gk,如果属于相对当前视点观察三维场景时的背向面,则该部分的三维场景表面相对于当前视点不可见,标记对应视频对象的可见性状态vk=0。背向面的判断有多种常用处理方法,在实施例中,选择从多边形所在平面上的任意一点做一条指向视点的向量,如果这个向量与多边形法线之间的夹角大于等于90°,即两个向量的点乘运算≤0,则多边形为背向面,标记对应视频对象的可见性状态vk=0,需要被剔除;否则多边形为正向面,标记视频对象的可见性状态vk=1。
3)遮挡判断剔除
针对所有通过上述视域体判断和背向面判断得到的输入视频对象K(vk=1的视频对象)所依附的三维场景表面Gk,它们处于视域体之内,但是有一些模型表面可能被其他物体完全遮挡,如图2中阴影区内黑色虚线所表示的几何形状,因此通过遮挡判断剔除方法,找出被其它三维场景完全遮挡的三维场景表面,标记其对应视频对象的可见性状态vk=0,否则对应视频对象的可见性状态vk=1。
由于图形处理器GPU具有快速光栅化的能力,而且随着硬件技术的发展提供了相应的API接口,支持遮挡查询操作(Occlusion Query)。因此,本实施例中采用遮挡查询操作进行遮挡判断工作。具体步骤为:
1)初始化一个查询;
2)禁用写入帧和写深度缓冲区的操作,同时关闭其他所有多余状态;
3)选取输入视频对象K所依附的三维场景表面Gk的一个简单、保守表示,通常是其包围体进行单独一遍绘制并光栅化到深度缓冲区(depth buffer),由于只需要知道深度信息,绘制过程避免了像素点颜色着色,纹理、光照信息的多次反复计算等操作;
4)GPU统计能够通过深度测试的片元(fragments)数目,结束遮挡查询;
5)获取查询结果,即包围体的可见像素数目,如果绘制的像素数目大于某个阈值(通常为0),则对应视频对象的可见性状态vk=1,否则其可见性状态vk=0;
该基于GPU硬件遮挡查询的可见性判断充分利用GPU内部的并行计算能力,节省CPU计算资源。因为在GPU执行遮挡查询的阶段,仅对深度缓冲区(depth buffer)进行了单独的一遍渲染,之后仅对于能够通过深度测试,即在屏幕可见的模型像素进行着色渲染,无形之中节约了大量代价高昂的渲染操作。
通过上述三项可见性测试判断的视频对象称为可见的有效视频对象,进入下一阶段的处理。
二.视频对象的LOD(Level of detail)评估
本发明所针对的视频源为当前的主流视频源,当前的主流视频源包含MPEG4、H.264等及其更高版本的视频源都支持扩展性视频编码,即分层视频编码(Layered VideoCoding或者Scalable Video Coding,SVC)。分层编码是将视频内容压缩成多个子比特流(Substream),其中一个比特流作为基本位流,形成基本层(Base Layer)视频数据流,解码器可以对其进行独立解码,并产生粗糙质量的视频序列;而其它的比特流则形成增强层(Enhancement Layer)视频数据流,解码器必须依靠基本位流才能对其进行解码,解码后的视频质量将大大优于仅依靠基本位流解码的视频质量。通过将视频信息进行分层,动态调整编码速度,以适应不同网络环境下网络带宽所发生的变化,具有网络带宽适应能力,特别适用于网络传输。传统的动态分层解码的依赖于网络传输环境作为判据,而在虚实融合的虚拟现实系统中,本发明提出基于三维可视效果的动态分层解码策略。在分层视频编码方式下,如果要得到最佳的视频解码效果,必须对所有比特流(基本层和增强层)进行解码还原,但是在三维虚拟现实系统或者增强现实系统中,视频对象是作为三维场景中的某些局部表面的附属外观特征而存在的,其视觉感知的需求与三维场景及视点属性(或者相机属性)的密切相关,因此针对三维场景实际漫游浏览时进行三维成像所需要的视频质量,解码还原到恰当合适的视频的时间和空间分层分辨率以满足上述需求,即本发明所述的视频对象的LOD,包含空间层次细节(spatial LOD)和时间层次细节(temporal LOD)。
1)视频对象空间分层的分辨率评估
针对所有通过上述视频对象可见性判断得到的输入视频对象K所依附的三维场景表面Gk,及其包围盒(或包围体)Bk,进行下述的空间分层的分辨率评估计算。利用包围盒在成像平面上的近似投影面积作为计算视频对象空间分辨率(空间层次细节)的依据。Bk的投影面积的计算方法算法如图4-6所示。
首先,按照可见面的数目,将包围盒在屏幕的投影分成以下3种情况,如图4所示,(a)图所示为情况1:一个面可见,2D多边形包括4个可见顶点;(b)图所示为情况2:2个面可见,2D多边形包括6个可见顶点;(c)图所示为情况3:3个面可见,2D多边形包括7个可见顶点。
包围盒的6个平面把3维空间划分成了27区域,那么只要根据视点位置,计算出它所在的区域,就可以判断包围盒在屏幕投影的情况。给包围盒的顶点进行编号,并规定6个面的名称,如图5所示:
其次,建立一种从视点所在区域到2D多边形顶点标号顺序(顺时针)的映射,如图所示情形,标号顺序为:0,3,7,6,2,1,可见面为前面和顶面。对场景中的所有包围盒,每一帧实时计算这个序列是非常低效的,为此引入查找表技术,将事先计算好的顶点序列存于此表中,根据视点所在区域的编码进行快速查找。定义包围盒的外侧为平面正侧(用1表示),内侧为平面负侧(用0表示),设计区域编码方法如表2所示:
表2.区域编码
Bit位 |
5 |
4 |
3 |
2 |
1 |
0 |
代表面 |
后 |
前 |
顶 |
底 |
右 |
左 |
如:000000代表包围盒的内部区域,理论上编码存在26=64种组合,实际上存在一些无效情况,如:第0,1位均为1(表明视点同时在左侧和右侧平面的外侧)的情形,所以需要约束条件以排除这些情况,具体描述是:第2n位与第2n+1位不可以同时为1,这里n=0,1,2。
使用向量运算来确定视点所在区域,设视点位置为P,若向量与向量的点乘运算<0,即夹角小于90°,则P在底面的负侧;反之,P在底面的正侧(把P在平面上的情况归类于在平面的正侧),以此类推其他6个面,将计算出的区域编码所对应的十进制数值作为索引,则可得到区域编码与顶点序列的映射关系表。特别的,当视点在包围盒内的情况,设定此时num值为-1,作为特殊情况标记,表示直接使用最精细层的LOD模型进行渲染,其他情况,当num值为0时,表示是无效情况,直接抛出异常,否则读取索引序列。
由于投影多边形是封闭图形,且索引序列按照顶点顺时针顺序环绕一圈,所以可以使用围线积分(Contour Integral)的方法,如图6所示,计算有向面积之和,其绝对值就是最终投影多边形的面积Sk,即Sk=Proj(Bk)。对于不同的显示设备,单位投影面积所占据屏幕的像素数不同,设为#pixels_per_unit,则包围盒所对应的场景部分投影所占据的屏幕的像素数为Nk=Sk*#pixels_per_unit。
设视频对象K的空间分级(或者空间分层)由最低分辨率至最高分辨率依次为则其分级对应的分辨率所占据的像素数为单调函数则如果存在i使得 则当前视频对象K解码的合适的空间分层值为
2)视频对象时间分层的分辨率评估
在视频对象空间分层评估之后,要进行其时间分层的评估。时间分层的评估将决定视频对象播放的帧速率。根据前述原则,视频播放的帧速率需要与当前三维虚拟现实系统的绘制的帧速率相匹配,即在满足整个虚实融合的虚拟现实系统显示的实时性的前提条件下,合理分配时间,计算得到符合条件的视频解码的时间分层。
三维虚实融合的虚拟现实系统的运行时间按照如下公式划分:
RT=ETsystem+max(ETCPU,ETGPU)
其中:
及
其中,system代表三维虚拟现实系统之外,由于其他运行的系统和应用程序抢占CPU或者GPU最远而导致的额外运行时延,nr代表非绘制相关的系统任务,r为三维场景绘制任务,fs代表GPU程序的环境和框架准备与构建的任务,mm此处代表多媒体的数据组织及解码等任务,idle代表运行空闲的时间。
下面对各个分解因素进行分析:
首先,ETsysstem系统时间是一个不可预测的变量,因为即使将三维虚拟现实系统的优先级提升到一个非常高的水平,仍然无法阻止操作系统后台及其他程序的运行对资源的消耗。而且,这不是一个可预测的分布,并没有一种行之有效的方法或者已知函数可以刻画系统运行对于资源的消耗。但是,system带来的影响通常可以忽略不计,特别是在如今硬件水平不断提高的情况下。
其次,max(ETCPU,ETGPU)一项中,在实时三维绘制系统中,ETGPU一项时间应小于ETCPU。这是一个普遍共识,只要程序优化得当,现代CPU的处理能力足以完成所分配的任务。实际的三维绘制系统中,在在线运行run-time阶段实际运行中CPU使用率常常不到15%。
再次,ETGPU各项中,最为关键的影响因素是绘制和多媒体视频相关工作和因为设计良好的系统,应该能够保证GPU空闲时间为0。所代表的GPU程序的运行环境和框架准备与构建的任务的执行时间与GPU中执行绘制任务和视频任务相比也是几乎可以忽略不计的。
最后,毋庸置疑,大多数情况下的主要瓶颈在于和而在绘制一个由部件X1,X2...Xn构成的三维场景S时,绘制任意两个部件的组合的时间满足:
对此,本发明提出对一个三维场景进行在GPU上执行多路视频解码并虚实融合的时间估计方法:
其中,c1、c2、c3为实验得出的经验系数,#tv()为场景中顶点变换的数量,#pix()为场景中需要绘制的像素数量,VideoTex()为需要进行基于视频对象的纹理映射的纹理数量,VideoDecorder()为场景中视频解码的总时间,上述时间计算表达式是考虑了在GPU中视频解码和三维场景的绘制的可并行性。
为满足实时性,需要其中ε为时间阈值,由于一般实时性的定义为帧速率超过25帧每秒(fps),因此一般为40ms。因此满足上述条件的方程式即可以改写为:
而其中代表第i个视频对象的时间分层所代表的分辨率,f()函数代表该视频对象按照其对应的时间分层和空间分层进行解码所耗费的代价函数,而g()函数代表该视频对象按照时间分成和空间分层进行解码所获得的视频帧作为纹理数据进行纹理映射时耗费的时间代价函数。
根据上述不等式求解出每个视频对象K进行解码时满足条件的合适的时间分层所代表的分辨率该时间分层所代表的分辨率与空间分层所代表的分辨率共同决定了每个有效地输入视频对象的分层解码状态。
三.视频对象的解码时间同步
对同时出现在三维场景中的n路有效视频对象,设定以三维虚拟现实的起始运行时间为基准时间tbase,系统当前的运行时间为Tcurrent,每隔一定的时间步长δ,三维虚拟现实系统发送一个时间戳同步信号给当前活动的视频对象进行时间同步,每个视频对象K的解码线程接收到系统当前运行时间戳Tcurrent之后,会计算当前视频对象K的解码出来的视频帧的时间tk与Tcurrent的差Δt=Tcurrent-tk,
1)如果Δt<0,说明当前视频对象K的解码速度快于系统指定的速度,则将当前视频对象K的解码时间延迟Δt,以等待一定时间之后,使得当前解码时间tk与系统的时间一致;
2)如果Δt<0,说明当前视频对象K的解码速度慢于系统指定的速度,则当前视频对象的解码速度需要加快,搜索当前视频对象K中的两个I帧分别为Ia和Ia+1,使得tIa<Tcurrent<tIa+1,则视频对象K等待tIa+1-Tcurrent时长之后,开始解码Ia+1,使得当前视频对象更新之后的解码时间tk与系统的时间保持一致。
3)如果三维虚拟现实系统中当前某一个视频对象由无效转为有效,即该视频对象通过了前面所述步骤的判断和检测,则该视频对象获取向虚拟现实系统获取时间戳Tcurrent,并查找由此时间向后出现的第一个I帧,即tI>Tcurrent,则该视频对象在等待tI-Tcurrent时长之后开始解码,解出第一个I帧。
上述的时间同步操作,使得当前场景中多路有效视频对象播放时的时间的一致性。即在三维场景中同时出现的A和B两个来源于实时监控的视频对象,假定视频A的当前显示的播放时间为ta,视频B的当前显示播放时间为tb,则通过上述方法使得|ta-tb|满足小于某一个较小的误差阈值ε,使得两个视频对象的所播放的内容是视觉上基本同步的。
四.视频对象的GPU分层解码
以目前主流的H.264/MPEG-4视频格式为本发明的主要对象,其他支持分层编码机制的视频编解码格式皆可以采用本发明所采用的方法。H.264/MPEG-4 AVC的编解码方案流程主要包括如下5个部分:精密运动估计与帧内估计(Estimation)、变换(Transform)及逆变换、量化(Quantization)及逆量化、环路滤波器(Loop Filter)、熵编码(EntropyCoding)。H.264/MPEG-4在GPU上的高清解码过程分为4个步骤,第一即对熵编码处理,这里面包括了CABAC/CAVLC,第二步实行逆变换计算,第三步进行运动补偿,然后就是去块滤波。4个步骤都可以完全由GPU来完成而无需CPU干预。本实施例采用了Nvidia提供的CUDADecoder API实现了GPU上的视频解码,其分层解码的步骤和原理如下面所述。
分层解码:由于扩展性视频编码是将视频内容压缩成多个子比特流(Substream),其中一个比特流作为基本位流,形成基本层(Base Layer)视频数据流。针对每个有效的视频对象K,GPU解码器可以对其进行独立解码,并产生粗糙质量的视频序列;而其它的比特流则形成增强层(Enhancement Layer)视频数据流,解码器必须依靠基本位流才能对其进行解码,解码后的视频质量将大大优于仅依靠基本位流解码的视频质量。在分层视频编码方式下,本发明根据前述计算得到视频的时间分层所代表的分辨率与空间分层所代表的分辨率对所有n个视频对象的比特流(基本层和增强层)进行解码还原。
视频对象的时间分层解码:首先按照视频对象K的时间分辨率进行解码,由于视频以相同的空间分辨率、不同的帧率将原始视频信息压缩成两层——基本层和增强层,不同的时间分辨率就是对视频帧序列进行时间采样(即抽帧),以此来改变帧率。通常将I帧和P帧(前项预测帧)作为基本层,以低帧率进行编码。将B帧(双向预测帧)作为增强层,以较高的帧率进行编码。因为B帧本身不作为运动补偿的基准帧,B帧的丢弃对其它各帧的质量没有影响。当然,P帧也可以作为增强层,但是由于P帧是对前后的B帧和后继的P帧进行解码的基准帧,因此,丢弃P帧将直接或间接影响前后B帧和P帧的解码。假定视频K的所有时间分辨率增强层按照时间分辨率从低至高分别标记为f1,f2,…fm,则由于时间分辨率并不能够确保恰好等于其中某一个fi(1≦i≦m),因此寻找则将当前视频对象K的增强层解压缩分辨率设为fi+1,采用GPU解码器将增强层的解码一直进行到i+1层,获得当前视点条件下用户所需要的时间分层解码之后的视频。
视频对象空间分层解码:其次按照其不同的空间分辨率进行解码,由于空间分层多分辨率编码是将原始视频信息压成两层——基本层和增强层,不同的空间分辨率就是对视频序列帧进行空间采样。基本层以较低的空间分辨率进行编码。增强层在基本层的基础上形成高分辨率图像的空间预测。这样,空间抽样随着层次的增加,分辨率逐渐提高,同时码率也越来越高。GPU解码器在解码了视频对象K的基本层之后,依据值持续从最低层的增强层一直到所在的层,将上述满足视觉精度需求的空间分层视频解码出来。
上述视频时间分层解码和空间分层解码既可以按照顺序先后组合进行,也可以单独进行。
精确的时间帧定位:当获取了三维虚拟现实系统的运行时刻之后,的视频解码就要按照该时刻进行解码播放,即视频帧的精确时间定位。针对每一个有效视频对象,以ffmpeg为实施例说明如何用跳转的函数进行某一时刻视频帧的定位av_seek_frame(fmtContext,videoStreamId,CurrentTime,AVSEEK_FLAG_BACKWARD);
前面两个参数都是用来指明视频流的,第三个参数是想要跳转的时间戳,第四个参数有如下三个枚举值:
AVSEEK_FLAG_BACKWARD:若设置CurrentTime时间为1秒,但是只有0秒和2秒上才有I帧,则时间从0秒的I帧开始进行解码。
AVSEEK_FLAG_ANY:若设置CurrentTime时间为1秒,但是只有0秒和2秒上才有I帧,则时间从2秒开始的I帧开始解码。
AVSEEK_FLAG_FRAME:若设置CurrentTime时间为1秒,但是只有0秒和2秒上才有I帧,则时间从2秒开始的I帧开始解码。
视频对象进行同步或者状态由无效转换为有效视频对象时,需要精确定位视频帧的位置,如果希望查找当前时间Tcurrent之前的I帧,则可以采用AVSEEK_FLAG_BACKWARD,也是就往前找最近的I帧;如果希望查找当前时间Tcurrent之后的I帧,则可以采用AVSEEK_FLAG_ANY,也是就往后找最近的I帧。
在实际系统中一次视频的解码时间定位操作如下:
同步线程:将系统当前时间戳Tcurrent发送给各个视频对象的解码线程;
视频解码线程:收到新的时间戳Tcurrent后随即更新本地的时间,并调用av_seek_frame找到Tcurrent前向最近的I帧(假设它的时间戳为Tcurrent-t)
在上述视频对象解码时间同步部分,已经论述了如何将各个视频的解码时间进行同步,但是由于其中大量涉及解码线程的等待操作,虽然使得解码时间得到同步,但是会造成在3D视频播放过程中的暂停或者跳帧现象。在实际的实施例中,为了消除视频暂停和跳帧现象,我们采用下述的更改解码帧速率的策略。假设当前视频的解码时间慢于系统所设定的解码时间(或者说解码的速度慢于系统需求的速度),当前系统所设定的解码时间是Tcurrent,Tcurrent所对应的解码帧为B帧(如图7所示)。则首先搜索到系统设定的解码时间Tcurrent之前的I帧,该帧对应的解码时间是Tcurrent-t0,Tcurrent之后的I帧,该帧对应的解码时间是Tcurrent+t1。则当前视频并不会立刻跳到Tcurrent+t1所对应的I帧,并在等待t1(即解码线程休眠)之后开始执行Tcurrent+t1所对应的I帧,而是会从Tcurrent-t0开始不停地解码每一帧(这个速度大概是每秒50-60帧),这个解码帧速率会高于原本的正常的解码帧速率,也就是加快了解码的速度和进度,而在大概2*t的时间后,帧的解码时间会赶上Tcurrent的进度,此时解码和播放速度恢复正常,如图7所示。针对当前视频的解码时间块于系统所设定的解码时间(或者说解码的速度块于系统需求的速度)这种情况,我们可以采用同样的原理减慢解码的速度和进度,从而达到跟三维虚拟现实系统的时间同步一致,并且多个视频对象彼此之间的解码速度和进度也是同步一致的。
实际使用的测试的t的值一般都在1秒内的一个较小的值,也就是一般在2秒内播放速度会恢复正常视频的速度。
解码视频帧的纹理映射:多路有效视频在执行完某一段时刻的解码之后,输出至图像纹理缓冲区,该缓冲区占据GPU显存的一部分空间,设定缓冲区大小为η。在图像纹理缓冲区中的每一个视频对象都对应的存储了一系列连续的图像纹理,每一张图像纹理分别对应某一个瞬时时刻,则Ktm,Ktm+1,…Ktn代表并涵盖了视频对象K从tm时刻至tn时刻的视频离散得出的图像序列,一般tn-tm所代表的时间间隔小于1秒钟。在图像纹理缓冲中为每一张纹理图像打上时间标签,同时绑定一个纹理ID。在场景模型的绘制的纹理映射部分,需要根据时间映射函数,找到准确的视频帧所对应的纹理图像,纹理采样在对应的纹理对象内进行。
为了避免图像纹理缓冲区的由于过量视频解码数据涌入而造成的溢出或者可能形成的系统故障,该缓冲区的管理采用自动更新策略。1)每一张被使用过的(即进行过纹理映射)的纹理都立刻被打上删除标记;2)每一张纹理都带有一个时间标签t,如果Tcurrent-t>δ,δ为设定的某一个极小的时间量,则该张纹理被打上删除标记。3)每隔一定的时间间隔,检查缓冲区中的图像纹理,将所有被打上删除标记的图像纹理删除,并释放其所占据的显存空间;4)如果某一时刻缓冲区检测到溢出,则立刻执行步骤3)所述的删除和释放存储空间的操作;5)如果步骤4)所述的操作执行完毕之后缓冲区依然被检测到溢出,则执行下述两种方案之一或者同时执行这两种方案。方案一:将纹理缓冲区大小η扩大为η*2,;方案二:将时间量δ缩小为δ/2。
三维场景的绘制中需要用到本发明提出的视频纹理映射,采用逆向视频纹理映射方法。在逆向视频纹理映射中,按三维场景启动绘制之后屏幕光栅化产生的像素(此部分像素一定是从视频对象所对应的三维场景几何部分Gk而来)顺序访问图像纹理缓冲区中的对应纹理图像及其中的纹理元素,对纹理图案进行随机采样。
本发明设计的新型面向视频的时空纹理映射的算法可表示为如下的映射关系的描述。传统的纹理映射为给定三维空间表面F∈R3和二维参数域D∈R2,对于F中的任意一点(x,y,z),通过纹理映射Φ找到它的纹理参数域中的对应点(u,v)。而新型的视频纹理映射可以表示为如下的映射关系,给定具有时间维度的四维空间F∈R4和具有时间维度的三维参数空间D∈R3,对于F中的任意一点(x,y,z,t),其中t为F域中的时间维度,通过纹理映射Φ找到它的视频纹理参数域中的对应点(u,v,τ),其中τ为视频纹理域中的时间维度。即:
在具体的实现中,每一个有效的视频对象与三维场景空间中相关的模型区域的关联关系不相同,因此为每一个视频对象K及其关联区域Gk都建立一个映射函数Φi。通过上述纹理映射函数关系的确定,对于绘制场景时三维空间中任意一点,都能够找到在视频纹理域中的对应纹理点。在视频纹理域中的查找是首先通过参数τ所确定的时间找到图像纹理缓冲中相对应的具有时间标签的纹理图像,然后通过参数u,v访问该纹理图像的对应纹素。如果对应纹理图像的结果尚未从视频解码过程中生成完毕,则纹理映射模块可以等待所需纹理图像及其对象准备完毕之后再进行。
本发明的纹理映射同样采用双线性滤波,这是目前通用的纹理映射算法,用来解决点采样产生的块状效应,算法步骤如下:
(1)对传入纹理单元的纹理坐标(u,v)处理,取出(u,v)小数部分(ufrac,vfrac)以及(u,v)在纹理图片中像素位置的整数部分(uint,vint):
(2)从纹理图片中读取(uint,vint),(uint+1,vint),(uint,vint+1),(uint+1,vint+1)处4个纹素值C1,C2,C3,C4;
(3)按公式(2)进行双线性插值:
C=(1-ufrac)(1-vfrac)C1+(ufrac)(1-vfrac)C2+
(1-ufrac)(vfrac)C3+(ufrac)(vfrac)C4
图8-11为本发明方法的绘制效果图。其中,图8为三维虚拟场景与多路视频输入进行虚实融合的绘制效果图,图9为当前视点条件下选择合适的视频分层解码进行虚实融合的效果图,图10为一个实例中开启((a)图)和关闭((b)图)基于视频的虚实融合的效果对比图,图11为另一个实例中开启((a)图)和关闭((b)图)基于视频的虚实融合的效果对比图。
以上实施例仅用以说明本发明的技术方案而非对其进行限制,本领域的普通技术人员可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明的精神和范围,本发明的保护范围应以权利要求所述为准。