发明的详细描述
本发明提供了一组接口,数据结构和用于表达多媒体数据多路分配器的事件,这些事件共同称为多路分配器API。该API允许用户使用混合流数据,例如统一格式的DV,MPEG2,ASF等等,以产生基本流数据,例如音频和视频(压缩的和非压缩的)。多路分配器API根据混合流初始化数据,支持新的流描述符的动态生成,同时,根据混合流样本,也支持新的流描述符的动态生成。此外,多路分配器API支持利用关于混合流的元数据的频带初始化输出,也支持利用混合流样本的频带初始化,以及支持多路分配器样本的产生,该样本能够横跨多个缓冲区。在Microsoft公司的媒体基础结构的内容中,多路分配器API最初由下面将描述的媒体处理器控制,输出发送到媒体处理器。多路分配器API设计为:便于任何多媒体结构应当能够以定义明确的方式使用多路分配器。
转到附图,其中同样的参考标记指同样的元件,本发明表示为在一个适当的计算机环境中实现。尽管不需要,本发明将描述计算机可执行指令的总体环境,例如程序模块,由个人计算机执行。通常,程序模块包括例程,程序,对象,组件,数据结构等等,它们执行特定的任务或者执行特定的抽象数据类型。
而且,熟悉本技术领域的人员知道本发明可以由其它的计算机系统配置实现,包括手动设备,多处理器系统,基于微处理器或者可编程的用户电子设备,网络PC,小型机,大型计算机,以及类似的设备。本发明也可以在分布式计算机环境中实现,其中任务由远程处理设备执行,它们是通过通信网络相连的。在分布式计算机环境中,程序模块可以位于本地存储器设备,也可以位于远程存储器设备。
图1表示适当的计算机系统环境100的实例,本发明在该环境中执行。该计算机系统环境100仅是一个合适的计算机环境的实例,并且不规定为对本发明的功能或者使用的范围的任何限制。计算机环境100也不能被解释为依赖或者需要涉及基本运行环境100的组件中的一个或者器结合。
本发明可操作的多个其它通用目的或者特定目的的计算机系统环境或配置。公知的计算机系统,环境,和/或配置的实例,它们适用于本发明,包括,但是不限于:个人计算机,服务器计算机,手持或膝上型设备,图形输入设备,多处理器系统,微处理器系统,机顶盒,可编程用户电子设备,网络PC,小型计算机,大型计算机,分布式计算机环境,包括任何上述系统或者设备,以及类似设备。
本发明可以通过计算机可执行指令的通用内容描述,例如程序模块,被计算机执行。通常,程序模块包括例程,程序,对象,组件,数据结构等等,它们执行特定的任务或者执行特定的抽象数据类型。本发明也可以在分布式计算机环境下实现,其中任务由远程处理设备执行,它们通过通信网络连接。在分布式计算机环境中,程序模块可以位于本地和/或包括存储器设备的远程计算机存储媒体。
参考图1,用于执行本发明的一个基本系统,包括一个以计算机110的形式的通用目的计算设备。计算机110的组件可以包括,但是不限于,处理单元120,系统存储器130,系统总线121,它将各个系统组件耦合到包括处理单元120的系统存储器。该系统总线121可以为几种总线结构中的任何一种,包括一个存储器总线或者存储器控制器,外围总线,利用任何一种总线结构的本地总线。以实例的方式,但是并不作为限制,这样的结构包括工业标准结构(ISA)总线,微通道结构(MCA)总线,增强ISA(EISA)总线,视频电子标准协会(VESA)本地总线,以及外围设备互连(PCI)总线,也称为中层(Mezzanine)总线。
通常,计算机110包括一种计算机可读存储媒体。计算机可读存储媒体可以是任何可用媒体,它们能被计算机110访问,并且包括易失和非易失的媒体,以及可擦除和不可擦除的媒体。以实例的方式,但是并不限于,计算机可读媒体可以包括计算机存储媒体和通信媒体。计算机存储媒体包括易失和非易失的,可擦除的和不可擦除的媒体,它们是以用于信息存储任何方法或技术执行的,例如计算机可读指令,数据结构,程序模块或其它数据。计算机存储媒体包括,但是不限于,RAM,ROM,EEPROM,闪存或其它存储器技术,CD-ROM,数字通用盘(DVD)或者其它光盘存储器,卡型盒式磁带,磁带,磁盘存储器或者磁性存储设备,或者任何其它媒体,它们用于存储预期的信息,并且能被计算机110访问。通信媒体典型的表现为计算机可读指令,数据结构,程序模块或者其它在调制的数据信号中的数据,所述调制的数据信号是例如载波或者其它传输机制,也包括任何信息发送媒体。术语“调制的数据信号”的含义是一个信号,该信号具有一个或多个特征集或者以这样的方式改变以便在信号中对信息编码。通过实例的方式,但是并不限于,通信媒体包括有线媒体,例如有线网络或者直接有线连接,也包括无线媒体,例如声音的,射频(RF),红外线的,以及其它无线媒体。上述的任意结合应当也包括在计算机可读媒体的范围之内。
系统存储器130包括计算机存储媒体,其形式有易失和/或非易失存储器的形式,例如只读存储器(ROM)131和随机访问存储器(RAM)132。基本输入/输出系统133(BIOS),通常存储在ROM131中,所述系统包括基本例程,帮助在计算机110的部件之间转换信息,例如在启动期间。RAM132通常包括数据和/或程序模块,能立即访问处理单元120和/或当前由处理单元120运行。通过实例的方式,但是并不限于,图1表示操作系统134,应用程序135,其它程序模块136,以及程序数据137。
计算机110也可以包括其它可擦除/不可擦除,易失/非易失计算机存储媒体。
通过实例的方式,图1表示硬盘驱动器141,它从不可擦除或非易失磁性媒体读取(数据)或向其中写(数据),磁盘驱动器151,从可擦除或非易失磁性媒体读取(数据)或向其中写(数据),非易失磁盘152,以及光盘驱动器155,它从可擦除,非易失光盘156读取(数据)或向其中写(数据),例如CD ROM或者其它光学媒体。其它可擦除/不可擦除,易失/非易失计算机存储媒体,能用于基本操作环境,包括但是并不限于,卡式盒磁带,闪存卡,数字通用盘,数字视频磁带,固态RAM,固态ROM,以及类似设备。硬盘驱动器141通常通过不可擦除存储器接口,例如接口140,连接到系统总线121,而磁盘驱动器151,以及光盘驱动器155通常通过可擦除存储器接口,例如接口150,连接到系统总线121。
以上讨论并且在图1中所表示的这些驱动器和他们的相关计算机存储媒体,提供计算机可读指令,数据结构,程序模块和用于计算机110的其它数据的存储。
图1中,例如,硬盘驱动器141如图示的存储操作系统144,应用程序145,其它程序模块146,以及程序数据147。应当注意的是,这些组件可以相同或者不同于操作系统134,应用程序135,其它程序模块136,程序数据137。操作系统144,应用程序145,其它程序模块146,以及程序数据147在此图中被给出不同的数字,在最小值的情况下,表明它们为不同的副本。通过输入设备,例如键盘162,指示设备161,通常是指鼠标,轨迹球或者触摸板,麦克风163,以及图形输入板或者电数字转换器164,用户可以输入命令和信息到计算机110中。其它输入设备(未示出)可以包括操纵杆,游戏垫,碟形卫星天线,扫描仪或者类似设备。
通过耦合至系统总线的用户输入接口160,这些以及其它输入设备经常被连接到处理单元120,但是也可以由其它接口和总线结构连接,例如并行端口,游戏端口,或者通用串行总线(USB)。监视器191或者其它类型的显示设备也通过接口被连接到系统总线121,例如通过视频接口190。监视器191也可以与触摸屏或者类似的设备集成。应当注意的是监视器和/或触摸屏可以物理连接到外壳,计算机设备110,例如图形输入型个人计算机,也在该外壳中。此外,计算机例如计算机设备110也可以包括其它外围输出设备,例如扬声器197和打印机196,它们可以通过输出外围接口194或类似的设备相连。
计算机110可以在网络环境中运行,所述网络环境逻辑连接到一个或多个远程计算机的,例如远程计算机180,。该远程计算机180可以是个人计算机,服务器,路由器,网络PC,对等设备或者其它通用网络结点,以及通常包括多个或者所有的上述涉及到计算机110的部件,尽管图1中仅表示了存储器设备181。图1中描述的逻辑连接包括局域网(LAN)171和广域网(WAN)173,但是也可以包括其它网络。这样的网络环境对于办公室,企业计算机网络,intranet和Intnet来说是平常事。例如,计算机系统110可以包括源机器,数据来源于此,而远程计算机180可以包括目标机器。应当注意的是源和目的机器不需要被网络或其它装置连接,但是相反的,数据可以通过任何媒体移动,该媒体被源平台写或者被目的平台或者平台读。
当使用LAN网络环境的时候,通过网络接口或适配器170,计算机110被连接到LAN171。当使用WAN网络环境的时候,计算机110通常包括调制解调器172或者其它用于建立覆盖WAN173的通信的装置,例如Internet。该调制解调器172,可以是内部的或者是外部的,通过用户输入接口160,或者其它适当的机制,可以连接到系统总线121上。在网络环境中,描述的程序模块涉及计算机110,或者它的一部分,可以被存储在远程存储器设备上。通过实例的方式,但是并不限于,图1表示驻留在存储器设备181上的远程应用程序185。可以理解的是,所示的网络连接为基本的并且其它在可以被使用的计算机之间建立通信连接的装置。
在下面的说明中,本发明将参考激活和操作的象征性表达来描述,所述操作由一个或多个计算机执行,除非另指出。因此,应当理解,这样的激活或者操作,它们被计算机执行的次数,包括由以结构化形式表达数据的电信号的计算机处理单元的控制。该控制在计算机存储器系统中转换数据或保持数据,它们以熟悉本技术领域的人员好理解的方式,再配置或者否则改变计算机的操作。
数据被保持在其中的数据结构为存储器物理定位,存储器具有由数据的格式定义的特定属性。尽管本发明是在前述环境下描述的,但是这并不是限制,因为本领域的的技术人员能够理解前述的对各种激活和操作也可以用硬件执行。
转到图2,本发明的多路分配器可以在媒体基本结构中运行,它是应用Microsoft多媒体结构的一个实例。尽管图2表示媒体基础结构中的多路分配器,应该认识到,本发明的多路分配器API在其它多媒体结构中是有用的。在描述多路分配器之前,将描述该媒体基础。媒体基础为组件化结构。如图所示,媒体基础包括核心层211组件,它们在媒体基础中负责一些功能的基础单元,以及控制层201组件,利用底层的核心组件,负责执行更一般的任务。
核心层211组件包括媒体源210以及流源214,通过一般的定义明确的接口,提供多媒体数据。媒体源210描述表达,包括将被访问的流。存在许多媒体源的执行,用于提供来自不同多媒体文件类型或者设备的多媒体数据。核心层211进一步包括在块208中表示的转换,通过一般的定义明确的接口,其对多媒体数据执行一些种类的转换操作。转换实例为多媒体数字信号编解码器,视频载体,音频重取样器,统计处理器,颜色重取样器,以及其它设备。本发明的多路分配器是在图2中所示的结构中的转换,所述多路分配器执行交错多媒体数据作为输入,并且将数据分离为独立的有用多媒体数据的媒体流。块208进一步包括多路复用器,它执行独立的媒体流,并将它们组合成被插入的多媒体数据。多路复用器共享一个通用的定义明确的接口,并且存在多个实例,用于多路复用到不同的多媒体数据类型。核心层211进一步包括流接收器212和媒体接收器230。
媒体接收器230通过一个一般的定义明确的接口接收多媒体数据作为输入。存在多个媒体接收器,用于执行不同的多媒体数据功能。例如,将多媒体数据写入一个给定的文件类型,或者在使用视频卡的监视器上显示多媒体数据。
控制层组件201使用核心层211组件,以通过一种较简单的方式执行较高级别的任务。通常对于给定的任务,控制层组件将使用多个不同的核心层组件。
例如,回放多媒体文件将包括一个媒体源从盘上读取文件,并且解析数据,还包括一个或多个转换以将压缩的多媒体数据解压缩,以及一个或多个媒体接收器以显示多媒体数据。控制层201包括媒体引擎260,与应用程序202交互,以接收和发送媒体流,媒体部分240,媒体处理器220和在媒体部分240中表示的拓扑下载器250。拓扑下载器250是一个控制层组件,负责描述核心层组件之间的数据流。控制层组件能够被配置为避免控制层所使用的对更多的初始核心层组件的访问。通过系统的数据流以媒体源210开始流过媒体部分240,到达媒体处理器220,并且在媒体接收器230处输出。媒体处理器230以拓扑的形式运行媒体源和其它组件的流水线。当发生拓扑事件的时候,媒体部分240指引,并且拓扑下载器250保证前述拓扑形式的事件的发生。媒体部分240也配置媒体处理器220并且使用由媒体处理器210返回的样本。上述过程在媒体引擎260的内容中进行,以及将样本从媒体处理器220发送到媒体接收器,它与媒体引擎260的调用程序(例如,应用程序202)通信。拓扑中的组件包括媒体源210组件,以及媒体接收器230组件以及其它结点。媒体基础系统200提供接口,以及连接流媒体对象的安排。该系统允许用户利用拓扑的概念,通过符号提取确定一般或特定源之间的连接,传输,以及接收器对象。
下面转到图3,将描述多路分配器300的概况。在下面的说明中,将在描述中参考命令。下面即将描述这些命令。多路分配器API将数据格式从数据源中分离出来。多路分配器API执行对数据的多路复用,作为数据的内存储器缓冲区,并且执行多路分配操作。这具有预定的效果:即很多不同的数据源能够利用相同的多路分配器实例以执行该操作。例如,DV数据能够直接来自DV摄像机,但是也被存储为硬盘上的一个文件。在这种情况下,有两段代码用于产生多路复用的DV数据(例如,一段与摄像机通信,另一段与文件系统通信),但是可以使用同样的多路分配器。多路分配器300支持IMFDemultiplxer(IMF多路分配器)接口,并且用于将混合流分开成为其基本流部分。多路分配器300以同步的方式运行(类似于DMO),并且处理由混合流变换而引起的在现存的基本流的动态变化。其接收并产生样本,该样本通过IMFSample(IMF样本)接口表示,并且调节产生的横跨多个缓冲区的样本。
混合流302为一个单独流,其包括多个基本流。一个基本流304,306是类似元素的流(例如,视频,音频等等)。在混合样本308与基本样本310,312之间不需要任何的一一对应。例如,在每一个混合样本中,可能或者不可能存在一个应用每一个基本流的完整的基本样本。此外,也不存在特殊的设备,对基本样本以正确的顺序在混合流中的要求。来自流的基本样本可以不共享的同样的时间标记。一个基本流可能与其它流有所偏移。在流的持续时间,一些混合流仅能够获得一组基本流。一些混合流在不同的时间可以具有不同的基本流组。
每一组等同的基本流被称为表达320。每一组具有一个对应的表达描述符322。该表达描述符322具有两个主要目的。其一,它描述每一个基本流的媒体类型。其次,它提供选择哪一个有效流将被多路分配器300提取的机制。CurrentPresentation(当前表达)324始终描述当前输出流的所选的流和数据类型。
在样本被多路分配器300处理之前,用于转换被多路复用的样本为基本样本的一个分离算法需要知道哪些流将被提取。该信息包含在表达描述符322中。在流被选择之前,表达描述符为“未决的”。一旦流被选择,该表达描述符为“激活的”。为了使表达描述符为激活的,通过调用获得未决表达描述符,从未决表达队列326中重新取得。该适当的流被选择,然后调用器则调用设置表达描述符方法。在这一点(如果符合某些条件),该表达变成激活表达324,并且从未决表达队列326中删除。如果来自前一个激活表达的所有的输出已经被服务,仅能有一个未决表达变成激活的。
多路分配器300包括至少两组队列。它们是输入队列330和输出队列340,342。当ProcessInput()在多路分配器300中被调用的时候,输入立即被处理或者输入进入输入队列330。一旦数据被处理,它将被输入到一个输出队列340,342。在现存的输出队列中,该数据类型和流总是对应于当前激活表达324。
现在已经描述了多路分配器300的全部描述符,下面将描述多路分配器300的状态和转换。在下面的描述中,将参照命令。这些命令将在下面描述。现在转到图4,当多路分配器300已经被创建但是没有调用Initialize(初始化)的时候,多路分配器300在未初始化状态400。初始化仅是该状态下在多路分配器对象300上的有效操作。调用Initialize()将使多路分配器300转换到未决状态402。
未决状态402表明没有有效的激活表达。ProcessOutput(处理输出)的调用将失败。为了设置激活的表达,媒体处理器220调用GetPendingPresentationDescriptor(),选择适当的流并调用SetPresentationDescriptor()。如果GetPendingPresentationDescriptor()的调用失败,则调用ProcessOutput()。那么再次调用GetPendingPresentationDescriptor(),直到获得表达描述符322。一旦在多路分配器300上设置了PresentationDescriptor(表达描述符),将转换为Nuetral(中性)状态404。调用Flush()将丢弃所有的队列输入和输出数据,并将多路分配器300转换为未决状态402。
在中性状态404,所有的功能调用(除了初始化之外)是有效的。当在ProcessInput(处理输入)调用处发现一个新的表达的时候,以及来自当前表达的最后样本从输出队列处被服务的时候,多路分配器300将转换到未决状态402。
一些流具有固定的、有限的持续时间,能够根据流内容被检测。当检测到这一条件的时候,以及所有的输出已经被服务的时候,多路分配器将转换到流结束状态406。所有的其它调用将返回一个适当的出错代码。
当一个未回收的错误出现在多路分配器300中的时候,将转换到错误状态408。错误状态408能够从任何其它状态到达。当多路分配器300将被删除的时候,调用Release(),然后,在多路分配器300从系统中被删除之前,多路分配器300转换到结束状态410。当多路分配器300的最后参考被释放时,无论多路分配器300处什么状态都将该多路分配器300从存储器中删除。可以从任何状态调用Release(),包括未初始化状态。
目前已经描述了多路分配器300的状态和转换,下面将描述命令。这些命令包括Initialize(),SetPresentationDescriptor(),GetPresentationDescriptor(),GetPendingPresentationDescriptor(),ProcessInput(),ProcessOutput(),和Flush()。
图5中所示的基本数据结构图,用于构成本发明多路分配器API的七个信息的表示基本信息数据结构460。可以看到,信息数据结构460包括多个字段4621-N。在最佳实施例中,第一字段4621预留为标题。其它字段为参数。
根据本发明的数据结构,构成初始化命令。从图6所示的数据结构中可以看到,初始化命令480根据多个字段482-490构成。这些字段具有一个标题字段482,流描述对象字段484,媒体类型字段486,主类型计数字段488,以及主类型阵列字段490。每一个不同的命令以类似的方式构成,如图5所示,下面将提供逐一描述。
Initialize()方法配置和初始化多路分配器对象300。混合流描述符可以包括媒体数据,适合于初始化该多路分配器的状态(包括任何标题数据等等)。该命令的语法如下:
HRESULT Initialize(
IMFStreamDescriptor*pMuxedStreamDescriptor,
IMFMediaType*pSelectedMediaType,
DWORDcMajorTypes,
DUID*aMajorTypes,
);
pMuxedStreamDescriptor参数为一个输入参数,并且是一个指向流描述符对象的指针,其描述混合流。该参数的主要目的是允许任何可以在多路分配器300使用的流描述符的元数据。pSelectedMediaType参数为一个输入参数,为pMuxedStreamDescriptor规定所选择的媒体类型。这是对应于调用ProcessInout()中通过多路分配器300的样本的媒体类型。cMajorTypes参数为一个输入参数,为aMajorTypes阵列中的多个主类型。该参数可以为零。aMajorTypes参数为一个输入参数,并且它是基本流的一个主类型阵列,作为来自多路分配器300的输出而检索,所述流是调用者所感兴趣的。如果cMajorTypes等于零,该参数可以为空。
在阵列中找到的每一个主类型的默认流将在表达描述符中被选择,该描述符由GetPendingPresstationDescriptor()返回。如果该方法成功,该方法返回一个S_OK值。如果该方法失败,其返回一个错误代码。如果一个表达为有效的,那么它能够通过GetPendingPresstationDescriptor(获得未决表达描述符)方法恢复。如果表达在初始化之后无效,则在数据通过处理输入反馈给多路分配器之后,表达可以变得有效。
表达描述符方法在多路分配器300上设置激活的表达描述符,所述表达描述符表明调用者感兴趣的新的流选择。表达描述符必须是一个通过获得表达描述符方法或获得未决表达描述符方法产生的描述符。该命令的语法为:
HRESULT SetPresentationDescriptor(
IMFPresentationDescriptor*pPresentationDescriptor
);
pPresentationDescriptor参数是一个指向表达描述符对象的指针。如果该方法成功,其返回S_OK。如果表达描述符为无效的,将返回MF_E_INVALID_PRESENTATION。如果表达描述符为未决表达并且将从当前激活表达仍然未决输出,则返回MF_E_OUTPUT_PENDING。如果存在从当前激活表达的未决输出,则未决表达可以不调用SetPresentationDescriptor()。SetPresentationDescriptor()可以被激活表达调用,以选择或取消选择流。如果流被取消选择,那么来自在输出队列的该流的所有的样本都丢失了。如果选择新的流,那么来自流的样本在将来某时将变得有效。因为不同的流具有不同的输入和输出缓冲区要求,它在新的流样本的有效之处,将依赖单各的多路分配器。
获得表达描述符方法恢复多路分配器300上的当前激活表达描述符的副本。
该命令的语法为:
HRESULT GetPresentationDescriptor(
IMFPresentationDescriptor*ppPresentationDescriptor
);
ppPresentationDescriptor参数是一个指针,指示一个表达描述符对象。如果该方法成功,其返回S_OK。如果失败,返回一个出错代码。如果存在未决输出,那么获得表达描述符返回对应该输出的表达描述符。
获得未决表达描述符方法恢复下一个未决表达。该命令的语法为:
HRESULT GetPendingPresentationDescriptor(
IMFPresentationDescriptor*ppPendingPresentationDescriptor
);
ppPendingPresentationDescriptor参数是一个指针,表明表达描述符对象。如果该方法成功,返回S_OK。如果不存在未决表达,则该方法返回ME_E_PRESENTATION_NOT_AVAILABLE。如果处理输入被调用几次,可以有几个未决表达队列。该方法将仅返回下一个未决表达。一旦当前激活表达的所有输出都被处理过了,那么通过调用设置表达而使未决表达变成激活的。
处理输入方法为调用者将一个新的输入混合流样本提供到多路分配器。如果多路分配器检测到表达中存在新的流,则*pfNewPresentationAvailable将被设置为TRUE(真),并且调用者能够通过::GetPendingPresentationDescriptor恢复未决表达描述符。该命令的语法为:
HRESULT ProcessInput(
IMFSample*pSample
BOOL*pfNewPresentationAvailable
);
pSample参数是一个指向样本对象的指针。如果该方法成功,返回S_OK。如果调用处理输入的结果在新的表达描述符中被加入到未决表达队列,pfNewPresentationAvailable参数返回TRUE(真)。关于调用处理输入或者处理输出,多路分配操作可以被多路分配器执行。在任一情况下,数据在调用处理输入将被排队,直到用户调用处理输出,或者数据被调用Flush()丢弃。在一次中仅一个表达可以为激活的。当新的表达为有效的时候,调用者必须通过调用处理输出清空所有的未决输出,通过调用GetPendingPresentationDescriptor(获得未决表达描述符),恢复新的表达,然后则通过调用GetPresentation(设置表达),设置激活的表达。
处理输入方法允许调用者恢复一个基本流或者来自激活表达的流。该命令的语法为:
HRESULT ProcessOutput(
DWORD dwStreamIdentifier,
IMFSample*ppSample
);
dwStreamIdentifier参数是一个32位值,包括流识别符,来自激活表达用于样本请求。ppSample参数是一个指示样本对象指针。如果该方法成功,返回S_OK。如果失败,则返回出错代码。如果流终点已经到达,将返回MF_E_ENDOFSTREAM出错代码。如果返回E_NO_MORE_DATA,没有有效数据处理。与另一个多路分配器数据样本一起调用ProcessInput()可以减轻出错。当有效数据的处理闭塞的时候,因为激活的表达不再有效,该方法将返回MF_E_NEW_PRESENTATION。当表达改变的时候,存在新的一组有效流。用户必须向多路分配器300指明哪一个流将被提取。调用获得未决表达描述符,选择预期的流,并且调用SetPresentationDescriptor()将允许来自输入队列的更多样本的处理。如果需要,多路分配器对象300将为样本分配空间。多路分配操作可以由多路分配器或者通过调用处理输入或者处理输出来执行。在另一种情况下,关于调用处理输入的数据将被排队,直到用户调用处理输出或者数据随着调用Flush()被丢弃。
刷新方法允许调用者刷新多路分配器300中的所有当前队列输入和输出样本。刷新也清除激活表达描述符。当上游数据被查找到一个新的位置或者调用者简单地需要丢弃所有的缓冲数据的时候做这些。该命令的语法为:
HRESULTFlush();
刷新命令没有参数。如果该方法成功,返回S_OK。如果失败,返回出错代码。调用刷新,清除来自多路分配器300的所有数据,也清除激活表达描述符。
根据特定的多路分配器,通过调用获得未决表达,未决表达可以立即变得有效,或者调用者可以重复调用处理输入,直到未决表达变得有效。
现在已经描述了多路分配器300的命令,下面将描述典型的操作,其中源(例如,应用程序202)不与接收混合流的接收器通信。现在转到图7,源表示了混合流,用于应用程序选择(例如,视频俘获源表示DV或者TV源表示一个MPEG2程序流)(步骤500)。控制层201判断应用程序是否与混合流的接收器通信(步骤502)。如果应用程序202没有与混合流的接收器通信,媒体部分240下载适当的多路分配器并且将其以混合流描述符初始化(步骤504)。
如果来自多路分配器的表达有效(步骤506),媒体部分240试图利用基本流描述符通信(步骤508)。建立其它拓扑(步骤510)。所表示的基本流被媒体处理器220利用DMO处理(例如,解码器)。
如果表达无效,那么媒体部分使用空媒体接收器终止混合流的拓扑,直到有更多信息为有效(步骤512)。无论该部分什么时候开始,并且样本为流,多路分配器300为给定的样本,直到表达描述符变得有效(步骤514)。通过调用IMFMediaStream::ProcessSample被表示混合流的媒体处理器结点调用来执行。媒体处理器220在底层混合流,例如AVI源表示DV流调用IMFMediaStream::ProcessSample。当混合流样本被恢复,媒体处理器在多路分配器300上调用IMFDemultiplexer::ProcessInput。处理样本和处理输入调用持续,直到新的表达标志在IMFDemultiplexer::ProcessInput的返回值为TRUE(真)。由于多路分配器的改变,通过当前拓扑需要更新的事件,该媒体处理器220则发信号至媒体部分240。媒体部分240调用IMFDemultiplexer::GetCurrentPresentation,以获得向新的有效基本流描述符的访问。当表达描述符变得有效,该媒体部分能够利用基本流描述符重新通信(步骤516)。
已经描述了用于多媒体数据流的多路分配器API。多路分配器API包括一组接口,数据结构和用于表达多媒体数据的多路分配器的事件。该API允许用户使用混合流数据,例如统一方式的DV,以产生基本流数据,例如音频和视频(压缩的和非压缩的)。该API允许多路分配器用作独立的组件。该API减小了对大量API的需求,因为滤波器和给定的滤波器不再需要与API接口连接的能力,用于附属于每一个在系统中的滤波器,其中不支持继承滤波器。同时,多路分配器可以平稳地闭锁,因为媒体处理器控制多路分配器,并且滤波器图表中没有滤波器。
以上所有的引用参考,包括专利,专利申请,出版物,在此全部引用作为参考。
纵观多个可能的实施例,本发明的基本原理得以实现,应该认识到,此处参考附图所描述的实施例,仅用于解释说明,不能作为对本发明范围的限制。
例如,熟悉本技术的人员将认识到以软件形式所表示的实施例的元件可以以硬件的形式实现,反之亦然,或者所表示的实施例可以在设置和细节方面被更改,而不脱离本发明的精神。因此,本发明在此希望在范围内的所有的这些实施例在由下述权利要求及等价内容的范围内表示。