专利名称:音频视频交互传输系统的流生成器的制作方法
技术领域:
本发明涉及音频视频交互(AVI)传输系统的流生成器(flowbuilder)。
音频视频交互(AVI)系统是建议采用的广播娱乐系统,在该系统中,复合信号从广播站传送到接收站。AVI信号如同在当前的电视系统中那样,包括音频和视频组分,还包括交互应用组分。接收站包括数据处理器,该数据处理器根据交互应用组分来提取交互应用组分、提供分别叠加在广播的视频和音频上的屏幕显示和伴音、以及对收视者的输入作出反应。接收站中的数据处理器还可以包括诸如调制解调器这样的通信设备,以便再根据交互应用组分将来自收视者的信息回传给广播机构或诸如广告客户这样的另一方。
交互应用组分由多个模块组成,其中包括目录模块,该模块充当构成交互节目部分的其它模块的目录。此外,至少有一个代码模块,它包含被接收站中的数据处理器执行的可执行代码。特别是,称为自动执行模块的一个代码模块包含着启动交互应用的执行所必需的可执行代码。自动地从交互应用组分提取该自动执行模块,并在接收站中的数据处理器首次检测到交互应用组分的存在时对其进行执行。还可以有一个或多个数据模块,该数据模块(或这些数据模块)包含着将要被接收站中的数据处理器根据在代码模块(或在一些代码模块)中的可执行代码进行处理的数据。最后,AVI复合信号还可以包括信号模块,用以将消息发送给交互应用。
为了使收视者能够随时加入AVI应用以便根据他们自己的步调继续将交互进行下去,以及为了将在接收站中的数据处理器所需的存储器数量减至最小,设想了在AVI信号中不断地重复代码和数据模块。可能需要使某些模块比其它模块更经常地重复。例如,为了使收视者首次调谐AVI复合信号的时刻和收视者可以开始进行交互的时刻之间的时间最短,也许需要比在交互组分中的其它模块更经常地重复目录模块和自动执行模块。此外,也许需要保证在某一预定的时刻之前将某一模块传输给接收站。例如,在打字幕的情形中,包含字幕的数据模块必须在发出这些字词的音频组分之前到达接收机。
应用编程人员在对该应用进行编程时知道哪一个模块应当比其它模块更经常地被重复和/或哪一个模块必须在预定的时刻之前被传输。编程人员因此能够提供规定哪些模块要被包括在交互应用组分中的数据并提供这些模块的调度数据,作为应用准备的一部分。需要提供对如此提供的模块和调度数据进行分析、产生满足任何需要的调度约束的交互组分数据流并最大限度地符合任何其它的调度约束的机制。
根据本发明的原理,一种产生音频视频交互(AVI)复合信号的、表示应用程序的交互组分数据流的方法包括以下步骤首先产生表示应用程序的程序文件;然后产生确定交互组分的数据结构的流数据;最后根据流数据有选择地将程序文件插入到数据流中从而产生数据流。用于产生这样的交互组分数据流的设备包括表示应用程序的程序文件源和确定交互组分的数据结构的流数据源。一个流生成器根据来自流数据源的数据有选择地将来自文件源的文件插入到交互组分中。
在附图中
图1是包括本发明的流生成器的发射站的局部的方框图;图2是包括本发明的流生成器的数据处理系统的方框图;图3是说明图1所示的流生成器的操作的数据流程图;图4是说明目录文件的结构的存储器布局图,它有助于理解图3所示的流生成器的操作;图5是说明在图3所示的流生成器中使用的模块文件和调度文件的结构和相互关系的存储器布局图;图6是由在图3所示的流生成器中的调度模块执行的处理的流程图;图7是有助于理解图6所示的调度进程的时序图。
图1是包括本发明的流生成器的发射站的局部的方框图。在图1中,应用编程人员将诸如代码和数据文件这样的应用文件和规定要被包括在应用组分数据流中的模块和这些模块的调度信息的流数据提供给流生成器10的相应输入端。流生成器10的输出端与传送分组器(transport packetizer)20的输入端连接。传送分组器20的输出端与多路转换器30的第一输入端连接。多路转换器30的输出端与携带AVI数据流的传送介质连接。多路转换器30的第二输入端接收被分组的视频表示数据信息,多路转换器30的第三输入端接收被分组的音频表示数据信号。
图2是包括本发明的流生成器10的数据处理系统的方框图。在图2中,中央处理部件(CPU)11通过系统总线14与读/写存储器(RAM)12和只读存储器(ROM)13连接。图2的数据处理系统还包括给应用编程人员提供数据的用户输入设备16和从应用编程人员接收数据的显示设备15,两者也与系统总线连接。海量存储设备17也与系统总线连接,可用来暂存包含应用文件、流数据文件和应用编程人员使用的应用生成器的程序的文件。CPU11、RAM12、ROM13、显示设备15、用户输入设备16和海量存储设备17按照数据处理系统中已知的方式操作,它们的操作将不详细描述。例如,迄今描述的图2的数据处理系统可在已知的个人计算机(PC)或工作站中实现。其它已知设备、例如网络适配器、调制解调器、打印机、总线扩展器等也可以与数据处理系统中的系统总线连接。
分组器输出适配器18提供了一个附加的输出端口,该输出端口是(图1的)传送分组器20的接口。分组器输出适配器18也与系统总线14连接,并且可以仅仅是一个串行或并行输出端口,就象当前用作打印机的接口那样。但是,也可要求专门设计的输出适配器。数据处理系统接口设计领域的普通技术人员懂得如何设计和实现任何这样的输出适配器。分组器输出适配器18的输出端与流生成器10的输出端19连接。输出端19与传送分组器20的输入端连接。
参看图1和图2,在操作时,应用编程人员利用用户输入设备16和显示设备15来产生代码和数据文件的源数据。源数据暂存在海量存储设备17中。应用生成器中的编译程序(它也存储在海量存储设备17中)按照已知的方式将源数据翻译成为可执行代码文件以及相关的数据文件,并将这些文件存储在海量存储设备17中。以类似的方式,应用编程人员产生用于规定要被包括在交互组分中的模块和它们的特性以及对模块插入交互组分数据流进行调度的源流数据。以下将更详细地描述这一源数据的内容。流生成器10对源流数据进行处理,把代码和数据文件与模块联系起来、对将模块插入应用组分数据流进行调度以及产生该数据流。流生成器10的输出是交互组分数据流,该数据流中的每一规定模块被恰当地定序并在合适的时刻出现。该输出通过输出端19提供给传送分组器20。传送分组器20按照已知的方式对交互组分数据流进行分组。多路转换器30也按照已知的方式对分组数据流以及分组视频和音频组分进行多路转换以便形成AVI数据流。
图3是说明图1和图2所示流生成器10的操作的数据流程图。在图3中,应用生成器5从应用编程人员接收表示交互应用程序的、由可执行代码的数据组成的源数据。应用生成器5产生包含代码和数据文件的文件集合104。还可以在流生成器10内产生模块。例如,可以在流生成器10内产生信号模块和/或小的数据模块并在内部对它们进行处理。(虽然可以如此产生任何类型的模块,但应用生成器5事实上更多地产生代码和较大的数据模块。)图3的其余部分表示通过流生成器10的数据流动。
流生成器10分析应用编程人员提供的源流数据。以下将详细描述源流数据的格式。流数据包括(1)与应用有关的数据,(2)规定要被包括在应用中的模块和它们的特性的数据,(3)把代码和数据文件与模块联系起来的数据,以及(4)对模块在应用组分数据流中的出现进行调度的数据。流数据在步骤102中被处理,更准确地说,被进行分析。与应用有关的数据和规定模块和它们的特性的数据传送给步骤106。步骤106构成目录模块并将构成的目录模块存储在目录文件108中。
图4是说明目录文件108的结构的存储器布局图。在图4中,目录文件108中的数据字段用水平带来表示,记录由粗水平线来分隔。目录文件108具有包含应用数据的第一记录,应用数据包括应用标识符、运行应用所需的译码器存储器、和应用中的模块总数。当与应用有关的数据被步骤106接收时,它就被存储和被分析。将适当的数据放在目录文件108的第一记录的相应字段中。目录文件108还具有用于在应用中的每一模块的一个记录,该记录包括模块标识符、存储器运行这一模块所需的模块长度、和其它标志。当规定模块和其特性的数据被步骤106接收时,它也被存储和被分析。如果该数据与新定义的模块有关,则就在目录文件108中产生一个新的记录。然后将适当的模块数据放入该新记录的相应字段中。在数据被步骤106接收时,可以更新以前定义的记录中的字段。例如,每当新定义一模块,就用加一来更新应用记录中的、指定在该应用中的模块的总数的字段。
包含应用数据的源流数据语句是Application(APPIN_ID,APPLN_MEMORY)(实际的编程语句可以具有不同的形式,并且/或者包含不同的或额外的自变量,这些自变量为简明起见已被省略。此外,系统编程领域的普通技术人员将能够选择诸如面向目标编程这样的编程范例和诸如C++编程环境这样的编程环境来产生和处理这样的编程语句)。当步骤102识别出流数据中的该语句时,它就被传送给构成目录模块步骤106,该构成目录模块处理106初始化目录模块文件108,并将应用标识符(APPLN ID)和所需的应用存储器(APPLN MEMORY)插入第一记录的相应字段中。
有四条可能的规定模块和它们的特性的源流数据语句appAutoExec(MODULE_ID,MODULE_MEMORY)appCode(MODULE_ID,MODULE_MEMORY)appDate(MODULE_ID,MODULE_MEMORY)appSignal()第一条编程语句标识包含在接收站首次检测到交互组分时被自动地执行的代码的自动执行模块。第二条编程语句标识包含可执行代码的模块而第三条编程语句标识包含数据的模块。当这些编程语句之一被步骤102识别时,它就被传送给构成目录模块处理106,该构成目录模块步骤106建立新的模块记录,并将模块标识符(MODULE_ID)和所需的模块存储器(MODULE_MEMORY)插入新建立的模块记录的相应字段中。这些编程语句的最后一条指定信号模块。这是将信号发送给接收站的特殊模块。在最佳实施例中,信号模块被限制为120个字符并且没有被指定出模块名。
再参看图3,在流动数据在步骤102中被进行分析时,把代码和数据文件与模块联系起来的数据提供给处理110。步骤110从文件集合104检索合适的代码和/或数据文件、从目录文件108的相关模块记录检索数据。步骤110利用检索数据来格式化并产生包含该文件的数据的文件并将其存储在模块文件集合112中。
图5的右手侧是说明模块文件112的结构的存储器布局图。被包括在交互组分数据流中的每一模块都具有在模块文件112中的一个记录,该记录包含实际构成模块的数据,该数据将通过传送介质传送给接收站。如图5所示,每一模块包括包含与该模块相关的数据的标题字段和模块数据字段。标题字段包括模块标识符、模块版本编号和模块长度,此时它将包含循环冗余检验(CRC)码。这些信息中的某些可以根据文件集合104中的代码或数据文件来确定,某些可以由步骤106保持的模块相关的数据来提供。模块数据字段包含构成该模块的可执行代码或数据,它是从文件集合104中的指定的代码或数据文件检索出的。在最佳实施例中,将标题数据字段形成标题数据包,模块数据字段将在(图1的)传送分组器20中被分组成为多个同样大小的数据包。
包含把代码和数据文件与模块联系起来的数据的源流数据语句是MODULE_ID.module Source(Module File)或MODULE_ID.module Source(Module Buffer)第一条语句把来自文件集合104的代码或数据文件与以前定义的模块联系起来;第二条语句把以前由在源流数据中的适当的编程语句(未表示出来)定义的存储器缓冲器与以前定义的模块联系起来。如上所述,第二条语句允许应用编程人员在源流数据中定义模块数据。当步骤102识别出流数据中的这两条语句中的任一条时,该条语句就被传送给格式化模块步骤110,该格式化模块步骤110在模块文件112中建立新的记录,并将编程语句的模块标识符(MODULE_ID)、模块版本编号(如果该语句对于相同的模块被多次调用,则处理110就自动地维护该模块版本编号)、和模块长度(来自目录文件108中的相应记录)放入到模块文件112中新建立的记录的标题字段中。然后文件集合104的指定的代码或数据文件(对于第一条语句)或存储器缓冲器(对于第二条语句)的内容就被拷贝到在模块文件112中新建立的记录的模块数据字段中去。
再参看图3,当流数据在步骤102中被进行分析时,将对模块在应用分量数据流中的出现进行调度的数据传送给步骤114。步骤114收集应用编程人员提供的所有调度信息。收集的调度数据可以包含模块必要的预定时间和任选的预定时间。以下将更详细地描述不同类型的调度请求。当已收集了所有的调度信息时,就给步骤114提供指令来对模块进行调度。然后对收集的调度数据进行处理并试图根据收集的调度数据对模块进行调度。如果不能够满足全部必要的预定时间,则调度请求就失败,将诊断信息返回给应用编程人员。否则就产生将模块放入交互组分数据流中的定时信息并将其存储在调度文件116中。以下将更详细地描述产生调度文件116的过程。
图5的左手侧是说明调度文件116的结构的存储器布局图。调度文件116具有一个对于模块在交互组分数据流中的每次出现(也称为事例(instance))的记录,该记录包含该出现与交互程序的开始的时间偏移、指向在模块文件112中的、包含将要在时间偏移处被放入交互组分数据流的模块数据的记录的指针;要被放入数据流的传输单元的长度;以及在要被包括在被调度的传输单元中的数据的模块数据字段内的偏移。按照时间偏移的次序来维护调度文件116中的各记录(即,从与第一个被调度模块相关的记录直到与最后的被调度模块相关的记录)。关于这些字段的更详细的描述在下面给出。
在图5中,调度文件116中的第一个记录包含用于将模块文件112中的第一个模块插入交互组分数据流的调度数据,这由从该记录的模块指针字段指向模块文件112中的第一个记录的箭头所表示。调度文件116中的第二个记录与模块文件112中的第四个模块相关,调度文件116中的第三个记录与模块文件112中的第三个模块相关。
如上所述,应用编程人员可以给包含必要的和任选的预定时间的流生成器10提供调度数据。在最佳实施例中,有四类模块调度请求目录模块、定时模块、灵活时间模块和最大插入模块(max-insert module)。
如上所述,流生成器10中的步骤106根据来自应用编程人员的流数据自动地产生目录模块。调度模块处理114在交互组分数据流的开始处(时间偏移=O)自动地放置目录模块的事例。在最佳实施例中,这是不能够改变的,因此在此时任何其它模块的所需的调度请求将导致是错误的冲突,并将发出诊断信息。
可以利用两条编程语句中的一条根据来自应用编程人员的流数据对目录模块的其它事例进行调度insertDirectory(insertionTime)或
insertDirectory(insertionTime,moduleSpacing,insertionDuration).第一条语句要求在时间偏移insertionTime处将目录模块的事例插入交互组分数据流。第二条语句要求在insertionDuration的持续时间内、从时间偏移insertionTime开始、间隔时间偏移moduleSpacing地插入多个事例。如果省略了insertionDuration自变量,则插入目录模块的多个事例(instance),至到交互程序结束为止。与由这些编程语句表示的插入请求(和随后的所有插入请求)有关的数据被暂存在流生成器10的内部数据结构(未表示出来)中。在不存在应用编程人员的任何这样的调度请求的条件下,目录模块就按照与自动执行模块相同的频率被自动地调度(以下描述)。
MODULE_ID.insertModule(insertionTime)该语句要求在时间偏移insertionTime处将模块MODULE_ID的事例插入数据流。对任何模块可以进行任意多次这样的调度请求。定时调度请求是必要的调度请求。为了调度的成功,所有的定时调度请求必须无冲突地得到满足。与所有这样的调度请求有关的数据被存储在流生成器10的内部数据结构中。
灵活时间模块调度请求是在调度时间上有某种灵活性的模块调度请求。有若干种灵活时间模块调度请求。第一种是在当前系统时间之后的第一个可用时刻将被请求模块的一个事例插入交互组分数据流的请求,第一个可用时刻是流生成器10利用没有在此描述的编程语句进行维护的时间偏移值。请求调度这种灵活时间模块的编程语句是
MODULE_ID.insertModule()该编程语句的形式与定时模块调度请求(上面)的相同,没有规定插入时间偏移。
第二种灵活时间模块调度请求是将被请求模块的多个事例插入交互组分数据流的请求。请求调度这种灵活时间模块的编程语句是MODULE_ID.insertModule(insertionTime,moduleSpacing,insertionPeriod)该语句要求将被请求模块MODULE ID的多个事例插入交互组分数据流。第一个事例在insertionTime之后的第一个可用时间偏移处被插入。被请求模块MODULE_ID的事例之间的时间间隔为时间偏移间隔moduleSpacing。在从insertionTime起的时间偏移持续时间insertionPeriod内插入事例。如果省略了insertionPeriod自变量,则在insertionTime和交互应用的结束之间插入被请求模块的多个事例。如果不能够对多个事例的任一个进行调度,则调度失败,发出诊断信息。最大插入模块调度请求的编程语句是MODULE_ID.insertModule(insertionTime,MAXIMUM_INSERTION,insertionPeriod).该语句类似于灵活时间模块请求(上面)的多事例形式,预先定义的常数MAXIMUM_INSERTION作为moduleSpacing自变量来提供。在这一情形中,在时间偏移持续时间insertionPeriod内有多少能嵌入的所请求的模块MODULE ID的事例便插入多少到交互分量数据流中去。但是,在这一情形中,如果没有事例能够被调度,则调度仍然继续,因此,不发出诊断信息。
如上所述,在全部调度请求都已被接收和处理之后,就提供一条指令来对交互组分数据流进行调度。这种指令的编程语句是ScheduleFlow().如上所述,根据该指令,对存储在流生成器10的内部数据结构中的、表示所有以前输入的调度请求的以前存储数据进行分析,并产生调度文件116。
一般来说,当任一模块请求被调度时,交互组分数据流中的开始时间偏移从该请求来确定,而该模块的结束时间偏移根据模块长度和交互组分的传输速率来确定。对照已被调度的模块来检验由调度请求表示的时间段,以便确定是否存在任何冲突。如果存在冲突,则采取消解行动,这取决于正在被处理的调度请求的类型(定时、灵活时间等)。否则,则在表示新近被调度的模块的(图5的)调度文件116中建立一个新的记录。
参看图5,在调度文件116的新的记录中,开始时间偏移被插入到时间偏移字段,指向包括将要在该时间偏移处被传送的模块的模块文件112中的入口的指针被插入到模块指针字段。模块长度是从模块标题检索的,并被插入到传输单元长度字段,传输单元偏移最初设定为0。可以按照以下描述的方式作为冲突消解过程的一部分来改变这最后两个字段。
图6是图3的调度模块步骤114根据scheduleFlow()编程语句所执行的步骤200的流程图,图7是有助于理解图6所示的调度步骤的时序图。在图7中,用长方形来表示模块,模块的标识符位于相应等时线上的长方形内,每一等时线表示在调度步骤中的不同时刻的交互组分数据流的相同部分。
在图6中,过程开始于步200。在步202,如上所述,第一目录模块在时间偏移0时插入到交互分量数据流。参看图5,调度文件116中的第一个记录表示该第一个目录模块,模块文件112中的第一个记录包含该目录模块。在这一情形中,时间偏移字段的值为0,模块指针指向模块文件112中的目录模块入口。传输单元长度包含目录模块的长度,传输单元偏移为0。参看图7,等时线a)表示在时刻0该第一目录模块300插入后的数据流。
在步204,对所有定时模块请求进行调度。如上所述,定时模块请求可用于任何类型的模块,包括目录模块在内。首先,对所有定时目录模块进行调度。然后按照其余的定时模块请求在(图3的)源数据流中出现的次序对它们进行调度。如上所述,确定每一定时模块请求的开始和结束时间偏移。如果这两个时间偏移中的任何一个与以前调度的模块重叠,则存在冲突。在这种情形中,调度失败,发出诊断信息。
例如,图7的等时线b)表示步206结束之后的数据源。在这一例子中,在时刻t1作出定时目录模块请求。根据这一请求,在数据流中插入目录模块的事例302。然后按照这样的次序在时刻t2作出自动执行模块的定时模块请求,在时刻t3作出代码1模块的定时模块请求。根据这些请求,自动执行模块的事例304在时刻t2插入到数据流,代码1模块的事例306在时刻t3插入到数据流。但是,如果在时刻t4接着作出定时模块请求,则将造成与以前调度的代码1模块的冲突,调度失败,将发出诊断信息。
在步206,对应用编程人员作出的多事例灵活时间请求的那些目录模块调度请求或者由流生成器10(按照如上所述的与自动执行模块相同的重复频率)自动地产生的那些目录模块调度请求进行处理。对目录模块的多个事例进行调度是从第一个被请求的或自动地被产生的事例开始直到最后一个被请求的或自动地被产生的事例(即交互程序的结束)。对每一个被请求的事例,计算所需的开始时刻。如果在该所需的开始时刻已对一模块进行调度,则寻找尽可能地接近所需的开始时刻的没有其它模块已被调度的时刻,该时刻可以在所需开始时刻之前或在其之后。然后从该时刻开始对目录模块进行调度。
如果在可用的时隙内不能够嵌入整个目录模块,则将该目录模块分成为多个传输单元。将在第一个可用时隙尽可能多的能嵌入的目录模块插入到数据流中的传输单元,将该目录模块的余下部分嵌入到占据全部随后可用时隙的传输单元中,直到整个目录模块已被传送为止。如果该目录模块的最后的传输单元超过了下一个目录模块事例的所需开始时刻,则调度失败,产生诊断信息。
参看图5,当一模块被分割时,对插入到数据流的每一传输单元在调度文件116中建立单独的记录。这样地来建立第一个记录,其时间偏移是模块第一部分的开始时刻,模块指针指向包含所需模块(此时为目录模块)的模块文件112中的记录。传输单元长度被设定为能够在第一部分中被传输的字节数,传输单元偏移被设定为0。然后这样地建立调度文件116中的第二记录,其时间偏移是数据流中下一个可用时隙的开始时刻,模块指针仍然指向包含所需模块的模块文件112中的记录。在这一情形中,传输单元长度包含能够在第二部分中被传输的字节数,传输单元偏移被设定为指向在模块文件112的所需模块记录中的模块字段内要被传输的下一个字节。类似地建立调度文件116中的各相继的记录,直到整个模块已被传输为止。
现在参看图7,等时线c)表示步206结束之后的数据流。在这一例子中,作出编程人员的灵活时间目录模块请求,以便从所需时刻t5开始插入该目录模块的多个事例,各事例之间间隔着模块间隔(SPACING),直到交互分量数据流的结束。在这一情形中,所需时刻t5与以前所调度的自动执行模块304重叠。与t5最接近的可用时刻是时刻t6、即该自动执行模块304的结束。有足够的自由时间来传送整个目录模块,因此设置调度文件116的一入口以便在时刻t6将目录模块的整个事例308插入到数据流。目录模块的下一个事例的所需开始时刻是在时刻t7。这一时刻是可用的,但是,没有足够的时间来包括目录模块的整个事例,该目录模块必须被分割。
目录模块事例的第一部分310(标为“D”)开始于时刻t7,结束于时刻t3,时刻t3是以前调度的代码1模块事例306的开始时刻。目录模块事例的第二部分(标为“IR”)312开始于时刻t8,该时刻t8是代码1模块事例306的结束,结束于时刻t9。如图7中的线链接部分310和312所示,第一部分310和第二部分312的组合包括了目录模块的整个事例。
如上所述,对于目录模块的这一事例产生了(图5的)调度文件116中的两个记录。第一个记录放置在代码1模块记录之前,该记录包括t7的时间偏移、包含着在第一部分中的字节数B1的传输长度字段、和0的传输单元偏移。第二个记录放置在代码1模块记录之后,该记录包括t8的时间偏移、包含着在第二部分中的字节数B2的传输长度字段、和B1+1的传输单元偏移。这两个记录的模块指针都指向模块文件112中包含着目录模块的记录。
再参看图7,目录模块下一个事例的所需开始时刻是时刻t10,该时刻是时刻t7+SPACING(间隔)。因为这一时刻是可用的,以及有足够的可用的时间用于目录模块的整个事例,所以按照如上所述的方式设置(图5的)调度文件116中的一个记录以便从时刻t10开始将目录模块的事例314插入到数据流。如果目录模块以前的事例(310,312)的结束时刻t9比下一个示例的所需开始时刻t10晚(这是可能出现的,例如,如果代码1模块的事例306的持续时间较长),则调度就失败了,从而发出诊断信息。直到交互组分程序结束之前,继续插入被SPACING(间隔)分隔开的目录模块的事例的上述过程。还可以规定用于将模块的多个事例插入到数据流的时间段(如上所述)。如果已作出了这样的请求,则只要事例的所需开始时间在规定的时间段内,就插入目录模块事例。
再参看图6,在步208,灵活时间模块被调度。如上所述,有两类灵活时间模块请求。第一类是单事例灵活时间模块请求,第二类是多事例灵活时间模块请求。在步208,首先按照应用编程人员在源流数据中提供单事例灵活时间模块请求的次序对所有的单个事例灵活时间模块请求(这些请求可以包括对目录模块单个事例的请求)进行调度。如上所述,所需开始时刻根据源流数据中的请求来确定。如果所需开始时刻是可用的,则在调度文件116中这样地建立一个记录,其所需开始时刻存储在时间偏移字段中,模块指针指向模块文件112中包含着所需模块的记录。如上所述,如果可用时间不足以传输所需模块的整个事例,则该模块可被分割成为各个部分。如果所需开始时刻不是可用的,则在下一个可用时刻插入所需模块,如果需要,所需模块可被分割成为各个部分。如上所述,插入时间间隔可以由应用编程人员来规定。如果不能够在所需开始时刻的插入时间间隔内对所需模块进行调度,则调度失败,发出诊断信息。
参看图7,等时线d)表示步208的第一部分结束之后的数据流。在等时线d)中,在插入时间间隔(PERIOD)内的时刻t3对信号模块S的事例进行调度的请求被处理。但是,时刻t3不是可用的,因此寻找下一个可用时隙。这一时隙位于时刻t9,该时刻t9是目录模块事例的第二部分312的结束。因为这一时隙在插入时间间隔(PERIOD)内,所以按照下面描述的方式从时刻t9开始将该信号模块S的事例316插入到数据流。如果缩短了插入时间间隔(PERIOD),以致使其不延伸到时刻t9,则这一调度请求失败,发出诊断信息。
再参看图6,在步208对多事例灵活时间模块请求进行调度。在对下一个模块请求进行调度之前对一个模块的全部被请求事例进行调度。如以上详细描述的那样,任何这种调度请求的调度过程与多个事例目录模块请求的调度过程相同,在此将不再详细描述。以数据流中的第一个所需事例开始到数据流中的最后一个所需事例为止,对各事例进行调度。所需开始时刻根据调度请求来确定。如果所需开始时刻是可用的,则在调度文件116中建立记录,以便在该时刻插入需要模块的事例。如果所需时刻不是可用的,则寻找下一个可用时刻,并在该时刻插入该事例。如果没有足够的时间来插入整个事例,则将该事例分成若干部分。如果不能够在下一个事例的所需开始时刻之前调度整个事例,则调度失败,发出诊断信息。
应用编程人员可以以两种方式来改变对多个事例灵活时间模块请求进行调度的次序。首先,可以利用源流数据中的编程语句来给予每一模块一个优先级。给模块指定优先级的编程语句是MODULE_ID.set Priority(priorityValue)在最佳实施例中,priorityValue 0是最高的优先级,较小的值具有比较大的值高的优先级。在多个事例灵活时间模块请求正在被调度时,在对较低优先级模块的任何事例进行调度之前先对具有较高优先级的模块的全部事例进行调度。
其次,即使应用编程人员没有给各模块设置优先级,各模块根据它们在源流数据中被定义的次序接受优先级,在源流数据中被较早定义的模块具有比被较后定义的模块高的优先级。在这一情形中,当多个事例灵活时间模块请求正在被调度时,在对被较后定义的模块的任何事例进行调度之前先对在源流数据中被较早定义的模块的全部事例进行调度。
再参看图7,等时线e)表示步208的第二部分已结束之后的数据流。在等时线e)中,从时刻t10开始,在各事例之间以间隔着模块间隔(SPACING)的方式来插入数据模块的多个事例的一个灵活时间请求被处理。因为时刻t10不是可用的,所以数据模块的事例318在下一个可用时刻t11插入。下一个所需插入时刻t12是在时刻t10之后的SPACING时刻。时刻t12又不是可用的,因此数据模块的下一个事例320在下一个可用时刻t13插入。下一个所需时刻t14是时刻t12之后的SPACING时刻。该时刻是可用的,因此数据模块的事例322在时刻t14插入(只部分地示于图7)。
再参看图6,然后在步210对全部最大插入模块请求进行处理。每一最大插入模块请求包括开始时刻和一时间间隔,在此时间间隔内将尽可能多的被请求模块的事例插入到数据流。对于任一单个事例,寻找下一个可用时刻。在调度文件116中这样地来建立记录,将其时间偏移设定为这一时刻,模块指针指向模块文件中包含所需模块的记录。如果有足够的时间来插入所需模块的整个事例,则将传输单元长度设定为模块的长度,将传输偏移设定为0。否则,就如上所述,对模块进行分割。
可以有许多由应用编程人员提交的最大插入模块请求。(如上所述,或者明显地由应用编程人员利用setPriority编程语句、或者由在源数据流中的模块定义语句的位置)指定给每一模块的优先级影响着模块示例的调度。从最高优先级开始,在下一个可用时刻对处于该优先级的每一被请求项目的一个事例进行调度。然后处理下一较低优先级,在下一个可用时刻再对处于该优先级的每一被请求项目的一个事例进行调度。如此进行下去,直到处于最低优先级的每一项目的一个事例被调度为止。然后从最高优先级开始重复该过程。流生成器10在优先级的调度事例中循环,直到再没有可用时间为止。
参看图7,已对三个小的数据模块A、B和C处理了最大插入模块请求,A具有最高优先级,B具有中间优先级,而C具有最低优先级。因为数据模块A具有最高优先级,所以在下一个可用时刻t15首先对数据模块A的一个事例324进行调度。然后在下一个可用时刻t16对下一个较低优先级的数据模块B的一个事例326进行调度。然后在下一个可用时刻t17对下一个较低优先级的数据模块C的一个事例328进行调度。因为模块C具有最低优先级,所以流生成器10循环回到最高优先级。再在下一个可用时刻t18对最高优先级的数据模块A的一个事例330进行调度。然后在下一个可用时刻t19对下一个较低优先级的数据模块B的一个事例332进行调度。然后在下一个可用时刻t20对最低优先级的数据模块C的一个事例进行调度。但是,在从时刻t20开始的可用时间内不能嵌入模块C的整个事例,因此以如上所述的方式将数据模块C分割成为两部分。在时刻t20对第一部分334进行调度,在时刻t21对第二部分336进行调度。如此进行下去,直到全部可用的时隙填满数据模块A、B和C的事例为止。
再参看图3,当全部可用时间已填入了最大插入模块时,调度文件116就完成了。然后步骤118通过处理调度文件116和模块文件112中的数据来实时地产生交互分量数据流。步骤118从(图1的)传输系统中(未表示出来)的系统时钟接收(也未表示出来)时钟信号。当交互程序被启动时,步骤118读出调度文件中的第一个记录。然后将系统时钟的时间与在该第一个记录中的时间偏移字段比较。当系统时钟的时间与时间偏移字段相同时,就是对被调度的模块进行分组的时候了。首先,将标题数据提供给(图1的)分组器20。该数据包括来自模块文件112中的标题字段的模块标识符、模块中的全部字节数和模块版本编号、以及来自调度文件116中的相应字段的传输单元长度和偏移。该标题数据被分组成为称为标题或辅助数据包的特殊类型的单个数据包。其次,从模块文件112中检索模块指针指向的模块文件112的记录的模块数据,并将其提供给传送分组器20。调度文件116中的当前记录的传输单元长度字段表示要被提供给传送分组器20的模块数据的字节数,传输单元偏移字段表示在模块数据文件112中的被指定记录的模块数据字段中的模块数据的开始位置。传送分组器20对在相继的数据包中的模块数据进行分组并将其提供给多路转换器30,多路转换器30再将交互组分数据包与视频和音频数据包组合在一起,并将被多路转换的数据包流提供给传送介质。步骤118然后读出下一个记录,重复该过程,直到交互处理结束为止。
权利要求
1.一种产生音频视频交互(AVI)复合信号的表示应用程序的交互组分数据流的方法,其特征在于以下步骤产生表示应用程序的程序文件;产生确定交互组分的数据结构的流数据;以及通过根据流数据有选择地将程序文件插入到数据流中来产生数据流。
2.如权利要求1的方法,其特征在于,数据流产生步骤包括以下步骤对流数据进行分析以便将其分成表示应用程序的数据、规定模块和它们的特性的数据、将程序文件与模块联系起来的数据、以及表示交互组分中的各模块的调度的数据;响应表示应用程序的数据和规定模块和它们的特性的数据来构成目录模块;响应将程序文件与模块联系起来的数据来格式化模块;以及响应表示交互组分中的各模块的调度的数据来将各模块调度进数据流。
3.如权利要求2的方法,其特征在于表示模块调度的数据包括各相继的调度请求,其中每一调度请求规定一个模块;对于每一调度请求,模块调度步骤包括以下步骤确定在调度请求和以前被调度的模块之间是否存在冲突;如果存在冲突就执行冲突消解处理;如果不存在冲突就对数据流中的规定模块的事例进行调度。
4.如权利要求3的方法,其特征在于调度请求是在被请求的预定时刻对定时模块进行调度的请求;以及冲突确定步骤包括以下步骤根据请求的预定时刻确定插入开始时刻;根据识别的模块的大小和预定的传输速度确定插入结束时刻;确定插入开始时刻和插入结束时刻中的任一时刻是否与模块以前被调度的事例重叠;及如果插入开始时刻和插入结束时刻中的任一时刻与模块以前被调度的事例重叠就断定存在冲突;及冲突消解步骤包括以下步骤断定调度步骤已经失败;发出诊断信息。
5.如权利要求4的方法,其特征在于规定的模块是目录模块。
6.如权利要求3的方法,其特征在于相继的调度请求之一是在被请求的预定时刻对灵活时间模块进行调度的请求;以及事例调度步骤包括以下步骤确定被请求的预定时刻是否与模块以前被调度的事例重叠;如果被请求的预定时刻不与以前被调度的模块重叠,就将事例开始时刻设定为被请求的预定时刻,否则,就将事例开始时刻设定为数据流中的没有模块被调度的下一个时刻;根据规定模块的大小和预定的传输速度确定是否有足够的时间将规定模块的整个事例插入到数据流;如果有足够的时间,就在事例开始时刻将模块的整个事例插入到数据流,否则,就从事例开始时刻起将模块插入到数据流开始时的多个相继的可用时隙中去。
7.如权利要求6的方法,其特征在于调度请求是在被请求的预定时刻和在规定模块的插入时间间隔内对灵活时间模块进行调度的请求;冲突确定步骤包括以下步骤确定事例开始时刻是否在插入时间间隔内;及如果事例开始时刻不在插入时间间隔内就断定存在冲突;及冲突消解步骤包括以下步骤断定调度步骤已经失败;发出诊断信息。
8.如权利要求6的方法,其特征在于调度请求之一是从被请求的预定时刻起相距一个模块间隔时间的调度灵活时间模块的多个事例的请求;模块调度步骤还包括以下步骤以等于被递增了模块间隔时间的以前开始时刻的所需开始时刻来重复事例调度步骤,直到应用程序结束为止;冲突确定步骤包括以下步骤确定规定模块的以前被调度的事例的结束插入时刻;确定该结束插入时刻是否晚于规定模块当前事例的事例开始时刻;及如果该结束插入时刻晚于规定模块当前事例的事例开始时刻,就断定存在冲突;及冲突消解步骤包括以下步骤断定调度步骤已经失败;发出诊断信息。
9.如权利要求8的方法,其特征在于模块的特性是优先级值;构成目录模块的步骤包括根据规定了模块和它们的特性的数据将优先级值指定给模块的步骤;相继的调度请求的一个子集是在被请求的预定时刻对灵活时间模块进行调度的请求;事例调度步骤包括以下步骤初始地选择规定被指定了最高的优先级值的模块的调度请求的子集中的一个;执行被选择的调度请求的重复步骤;选择规定被指定了下一较低的优先级值的模块的调度请求的子集中的下一个;及重复执行和选择步骤,直到指定给在被选择的调度请求中被规定的模块的优先级值是最低的优先级值为止,然后重复初始的选择步骤。
10.如权利要求8的方法,其特征在于,重复步骤重复事例调度步骤,直到应用程序结束为止。
11.如权利要求8的方法,其特征在于调度请求之一是一个从被请求的预定时刻起,在规定模块的插入时间间隔内对被模块间隔时间的灵活时间模块的多个事例进行调度的请求;及重复步骤从被请求的预定时刻起重复事例调度步骤,直到插入时间间隔结束为止。
12.如权利要求6的方法,其特征在于,规定的模块是目录模块。
13.如权利要求3的方法,其特征在于相继的调度请求之一是在被请求的预定时刻对最大插入模块进行调度的请求;及事例调度步骤包括以下步骤从被请求的预定时刻起将事例开始时刻设定为数据流中没有模块被调度的下一个时刻;根据规定模块的大小和预定的传输速度确定是否有足够的时间将规定模块的整个事例插入到数据流中;如果有足够的时间,就在事例开始时刻将模块的整个事例插入到数据流,否则,就从事例开始时刻起将模块插入到数据流中的多个可用时隙中去;及重复设定、确定和插入步骤。
14.如权利要求13的方法,其特征在于重复步骤重复到应用程序结束为止。
15.如权利要求13的方法,其特征在于调度请求之一是在被请求的调度时刻、在规定模块的插入时间间隔内对最大插入模块进行调度的请求;及重复步骤重复到应用程序结束为止。
16.如权利要求13的方法,其特征在于模块的特性是优先级值;数据流产生步骤还包括根据规定了各模块和它们的特性的数据来给模块指定优先级值的步骤;相继的调度请求的一个子集是在被请求的预定时刻对最大插入模块进行调度的请求;及事例调度步骤还包括以下步骤初始地选择规定被指定了最高的优先级值的模块的调度请求的子集中的一个;对被选的调度请求执行设定、确定和插入步骤;选择规定被指定了下一较低的优先级值的模块的调度请求的子集中的下一个;及重复执行和选择步骤,直到指定给在被选择的调度请求中被规定的模块的优先级值是最低的优先级值为止,然后重复初始的选择步骤。
17.如权利要求13的方法,其特征在于,重复步骤重复到应用程序结束为止。
18.如权利要求13的方法,其特征在于调度请求之一是在被请求的调度时刻、在规定模块的插入时间间隔内对最大插入模块进行调度的请求;及重复步骤重复到插入时间间隔结束为止。
19.如权利要求2的方法,其特征在于,对模块进行调度的步骤包括首先把目录模块作为数据流中的第一个模块来进行调度的步骤。
20.如权利要求2的方法,其特征在于表示模块调度的数据包括其各自分别规定一个模块的相继的调度请求,从由定时模块请求、灵活时间模块请求和最大插入模块请求组成的集合中选择每一请求;及对模块进行调度的步骤包括以下步骤自动地把目录模块作为数据流中的第一个模块来进行调度;然后对数据流中的定时模块请求进行调度;然后如果在相继的调度请求中没有规定目录模块的调度请求,则自动地将目录模块调度到数据流中去;然后将灵活时间模块请求调度到数据流中去;然后将最大插入模块请求调度到数据流中去。
21.如权利要求20的方法,其特征在于相继的调度请求之一规定自动执行模块;如果在相继的调度请求中没有规定目录模块的调度请求,则自动地对目录模块进行调度的步骤就包括在数据流中按照与自动执行模块相同的频率对目录模块进行调度的步骤。
22.一种产生音频视频交互(AVI)复合信号的交互组分的设备,该交互组分表示应用程序,该设备的特征在于表示应用程序的程序文件源;确定交互组分的数据结构的流数据源;及根据流数据源的数据有选择地将文件源的文件插入(30)交互组分的流生成器(10)。
23.如权利要求22的设备,其特征在于文件源包括表示应用程序的数据源;以及应用生成器,响应应用程序数据源来产生程序文件。
24.如权利要求22的设备,其特征在于交互组分包括携带多个模块的相继的传输单元;流数据包括表示应用程序的数据、规定模块和它们的特性的数据、把程序文件与模块联系起来的数据、以及表示交互组分中的模块的调度的数据;流生成器包括分析程序,对流数据进行分析,使其被分成表示应用程序的数据、规定模块和它们的特性的数据、把程序文件与模块联系起来的数据、以及表示在交互组分中的模块的调度的数据;目录模块构成程序,响应表示应用程序的被分析数据和规定各模块和它们的特性的被分析数据来构成目录模块文件,该目录模块文件包括一个含有应用数据的记录和一个用于每一被规定模块的、含有模块表示数据的记录;模块格式化程序,响应把程序文件与模块联系起来的被分析数据来构成模块文件,该模块文件包括用于每一相关的程序文件和模块的、含有与模块相关的程序文件的记录;以及模块调度程序,响应表示模块的调度的被分析数据来产生调度文件,该调度文件包括用于交互组分中的每一传输单元的、包含指向包括将要在传输单元中被传送的程序文件的模块文件中的记录的指针和传输单元将要被传输的时刻的记录。
全文摘要
用于产生音频视频交互(AVI)复合信号的、表示应用程序的交互组分数据流的方法和设备。该方法的步骤是产生表示应用程序的程序文件,产生确定交互组分的数据结构的流数据,最后根据该流数据有选择地将程序文件插入数据流来产生数据流。该设备包括表示应用程序的程序文件源、确定交互组分的数据结构的流数据源、以及根据流数据源的数据有选择地将文件源的文件插入(30)交互组分的流生成器(16)。
文档编号H04N7/52GK1120776SQ9510813
公开日1996年4月17日 申请日期1995年6月29日 优先权日1994年6月30日
发明者小·A·W·杰瑟普, K·约瑟夫斯 申请人:Rca汤姆森许可公司