具体实施方式
本发明将用对MPEG-2存储和重放设备(数字存储设备,DSD)的语法分析程序例来进行说明,作为DSD-MPEG2语法分析程序参考下列文本。
DSD-MPEG2语法分析程序研究MPEG-2TS数据,包括TSP,并试图从含在这一数据流中的PES数据包部分汇编整个PES数据包。TSP可属于不同的PES数据包,形成不同的基本数据流。简化的MPEG-2传输数据流MTS和有关的基本数据流PES1,PES2示于图1。传输的数据流MTS包括MPEG-2传输的数据包TSP,每个含有报头和数据,或有效载荷。这一有效载荷代表PES数据包的部分,它依次包括报头和数据,或有效载荷。有关的PES数据包PP#1,PP#2形成基本数据流PES1,PES2,用它们中的一个来包含视频数据,和其它音频数据。
PES数据包报头中的“start_code_prefix”具有24比特的长度和固定值000001hex。后续的“stream_id”表示承载的数据流类型(“PES_packet_data_byte”)。这在视频数据流的E0hex至EFhex的范围内,在音频数据流的C0hex至DFhex的范围内。
语法分析程序调查TSP报头值1的“payload_unit_start_indicator”标签,对00000001hex的TSP数据区域,相应于PES数据包的“start_code_prefix”,扩展为32比特。如果这两字段具有期望的值,那么语法分析程序判断在当前的TSP中,新的PES数据包起动了。
PES数据包可携带“代表时间戳”(PTS)和“解码时间戳”(DTS)。DTS表示携带的数据出现的时间,DTS提供关于数据解码时间的信息。“PTS_DTS_flag”同样也包含在PES数据包的报头中,并表示PES数据包是否包含PTS或DTS中。ISO/IEC标准13818-1规定了相继的PTS之间最大0.7秒的间隔。为了确定当前的位置,亦即当前的时间码,可求PTS的值。
在求PTS值期间发生的一个问题是,PTS在视频数据流中并不需要从零开始,但可假定任意(起始)值。在视频数据流中单独帧没有在显示它们的顺序中精确地编码。对于有限的范围,PTS也可变得较小,因为PTS的长度是有限,这也可能导致溢出。此外,PTS可以在已编成串的不同视频数据流之间的转移位置跳过很大的数量。但是,这一PTS跳跃并不意味着回放视频数据的时间码的跳跃。在MPEG-2TS数据流中第一个PTS可以不为零的问题可解决如下:其值为时间码的变量,亦即回放占用的时间,变量在Reset()调用中设置为零。这一变量具有相继加到两个连续的PTS之间的差值。为了保证这一值的单位为毫秒,这一差值要除以90。在两个连续的PTS之间的差大于FFFFhex的情况下(它相应于0.7秒),该差被忽略。当到达这两个汇编的数据流单元的过渡点时,这种情况就会发生。当语法分析程序偶然碰到“假的”PTS时,它与前面PTS之间的差以及它与下一个PTS之间的差可忽略,因为这两个差的大小都大于0.7秒。
两个相邻PTS之间的差包括在时间码的计算中,只要它不大于FFFFhex,后者相应于0.7秒。这一计算只要求PTS最低有效位的16比特,而PTS的长度为33比特。但是,因为只需要16位用于计算,且用32位明显容易进行两个PTS的值FFFFhex的比较,因而PTS中的MSB(最高有效位)通常可忽略。
在转发或换向期间,没有要显示的视频数据通过IEEE 1394总线发送,但只有位置指针在视频文件中移动。文件指针移动的速度就是转发或换向的速度。为此,当前的时间码要连续地确定,且可在显示模块上显示。
为了允许不变的转发或换向速度(它们可以计算),文件指针以不变的时间间隔由规定的时间码间隔移动。为此,必须找到在相应于查找时间码的视频数据流中的数据包。转发或换向方法的基本步骤示于表1中。
表1转发或换向的基本步骤
转发和换向的速度可借助于时间码的差(当前时间码+ΔT)和程序中后续等待时间来设置。循环中等待时间可没有任何限制地选择。时间码差ΔT被确定与这一等待时间匹配,以获得规定的转发或换向速度。
转发或换向速度是规定时间内跳过的时间码间隔。这意味着,例如,10秒的胶片应在1秒内跳过。等待时间不应过长,因为时间码显示只在转发或换向期间长时间间隔后出现。但是,等待时间也不能太短,以使ΔT不会短于两个时间码之间的平均时间间隔。此外,等待时间影响时间显示的清晰度。因为转发和换向期间要知道视频数据流中当前位置的时间码,因而视频数据流必须连续作语法分析。在MPEG-2TS数据流中,这意味着必须全部调查TSP。必须确定PES数据包,并调查发生的PTS。然后PTS必须对错误作校核,如果必要,必须纠正。但是,这一过程需要很长时间,使转发和换向不能很快执行。但转发和换向可采用本发明的信息文件而被明显地简化,该信息文件使当前时间码和含有该时间码的TSP很容易确定。
并不需要每个PES数据包含有PTS。但是,如果它确实含有PTS,这一PTS必须位于PES数据包的起始。一旦找到PTS,大量的TSP可被跳过。但在视频数据流语法分析期间,可跳过的TSP数量预先是不知道的。在这种情况下,可利用本发明的信息文件的先进效果。
图2是本发明的信息文件的图示,原则上,它包含偏移值OP、OB的序列,它表示有多少基本数据包是不相关的,可在转发和换向时跳过。附加信息AI也相对于每一偏移被存储。这三个字段一起形成对每一PES数据包PP的信息块IB。“偏移数据包”OP的值和“偏移字节”OB的值表示基本传输数据包(TSP)TDP数和两个相关TSP之间的字节数,亦即传输数据流MTS中的两个数据包PP#11,PP#12之间的字节数,MTS包含相同的基本数据流EDS中直接互相紧跟的那些PES数据包PP的报头PPH1,PPH2。与各个这种PES数据包PP有关的那些TSP位于这些相关的TSP之间,但与不同的基本数据流的PES数据包有关的TSP也可在那里出现。信息块IB包括两个偏移值OP、OB和附加信息字段AI。附加信息字段AI与数据流中的各数据包PP#11,PP#12有关,且可包含这一数据包的时间戳(PTS)。每一信息文件只与一个数据流有关,优先为视频数据流,因为转发和换向过程是用来面向这种数据流的。
在MPEG2-TS数据流的情况下,信息块中头两个字段OP、OB表示两个相继的PES数据包之间的间隔,每一个具有32比特的长度。在说明应用中的“附加信息”字段AI包含对每一视频格式完成计算和错误纠正的时间码,同样为32比特长度。因而在说明表中的信息块具有MPEG2-TS数据流中3×32=96比特或12字节的长度。但是,在附加信息字段AI存储更多的数据可能更有利,只要不会使信息文件过长,使转发和换向速度再度减低。信息文件中的信息允许立即跳过全部无关的TSP。信息文件I与基本数据流EDS,例如基于MPEG2的视频数据流,之间的导航和同步是从PES数据包到PES数据包执行的。在这种情况下,时间码可直接从信息文件中读出,因而并不需要在每次转发或换向时重新计算。
记录的MPEG2-TS视频数据流不需要以TSP起头,它包含PES数据包的开始(“PES Start”)。如果DSD正在记录活动的数据流,那么,第一个TSP是连续传递的数据流中不确定的数据包。这一情况示于图3。传输数据流MTS以出现“PES Start”的第一个数据包PSP#1之前的两个其它数据包OTH开始。信息文件中第一个偏移值OP1、OB1表示含有“PESStart”的第一个MTS数据包PSP#1与同样含有“PES Start”的第二个MTS数据包PSP#2之间的距离。传输数据MTS中的第一个TSP,并不包含完全的PES数据包,且如果它们与同一个基本数据流有关,也可借助于信息文件而忽略。此外,信息文件中第一项也可能表示与第一PES数据包PSP#1的距离或要跳过的无关TSP OTH的数量。
当视频数据流的记录结束时,最近接收到的TSP无需包含PES数据包的末端。因此,接着的信息块连到MPEG2规定的信息文件中最后的信息块,其“偏移数据包”(“offset packets”)的值为零,于是,继之以含有“PES开始”(“PES Start”)的最后TSP的位置。这种初始PES数据包并不需要完整,在重放时也不应发送。在示于图3所示的例子中,最后的正规信息块OP2、OB2、TC2描述了最后的完整PES数据包(它以PSP#2开头)与不完整的最后PES数据包(它以PSP#3开始)之间的距离。偏移OP2为3,因为第三个顺序TSP包含下一个与同一基本数据流有关的PES数据包报头PSP#3。偏移OB2是以PSP#2开头的PES数据包中字节的总和。时间码TC2相应于显示时间或这一PES数据包PTS。最近的信息块OP3、OB3、TC3包含对偏移值OP3的零值,继之以最后“PES Start”数据包PSP#3的位置。因此,这说明了记录的基本数据流的结束。
首先,借助于信息文件的帮助扫描的视频数据流必须与信息文件同步。为此,需要寻找包含PES数据包起头的视频数据流,即“PES Start”。
信息文件在规定格式的DSD数据流语法分析程序中产生和评估。因此,可能产生特定适应的信息文件,且带有对每一视频格式有独立的附加信息字段和独立的用于信息块的比特长度。
信息文件还常在接收视频数据时创建,也就是说在记录过程中创建。如果对已经存在的记录道没有信息文件,那么像这样的信息文件可在DSD应用程序开始时产生。也可能回放记录时没有按本发明产生的信息文件的视频数据,例如当视频文件被人为复制时。信息文件也可与视频数据一起发送和接收。
列于表2的功能定义在DSD数据流语法分析程序模块中,以提供界面,且允许文件打开、产生或关闭信息文件。
表2DSD数据流语法分析程序功能
OpenInfoFile() |
打开信息文件以便读出 |
CreateInfoFile() |
产生信息文件,并打开以便写入 |
CloseInfoFile() |
关闭信息文件 |
ParsePacket() |
借助为读出已经打开的信息文件的帮助扫描视频数据包 |
ParseStream() |
扫描视频数据流。如果信息文件已被OpenInfoFile()打开,它用于语法分析。如果前面的调用用于CreateInfoFile(),那么,依据当前的视频数据流产生信息文件 |
GetCurrentEndofValidStream() |
在被ParseStream()最后调用之后,返回与视频数据流最后有关部分的位置。这很重要,例如在不以完整PES数据包结束的MPEG2-TS数据流的末端 |
GetStartOfStreamOffset() |
返回视频数据流第一有效部分的位置,当记录从连续数据流的中间开始时,这很重要。在MPEG2-TS数据流的情况下,返回含有“PES Start”的第一个TSP。 |
ResetInfoFilePosition() |
重置信息文件内的指针于文件开始 |
SeekTimeCode() |
搜索信息文件中特定时间码,并返回在视频数据中,为到达正寻道的时间码位置,必须跳过的字节数 |
CheckSync() |
调查视频数据流是否与信息文件同步 |
EndOfInfoFile() |
核对是否已到达信息文件的末端 |
Parsepacket()的调用读出信息文件,Parsestream()的调用读出或产生信息文件,与前而OpeninfoFile()或CreateinfoFile()的功能调用有关。
功能Checksync()核对视频数据流是否与信息文件同步。在MPEG2-TS数据流的情况下,核对是为确定视频数据流中显示位置的“Payload_unit_start_indicator”标记是否置于1和“start_code_prefix”是否含有值000001hex。如果是这样,那么在视频数据流的当前位置含有PES数据包的开头。因为信息文件指示两个TSP(每个包含相邻的“PES Start”)之间的间隔,这对以信息文件帮助扫描视频数据流是必要条件。在这种情况下,该功能返回“真”值。
ParsePscket()的调用扫描MPEG2-TS数据流中单个TSP。ParsePscket()的相继调用含有相继的TSP作为输入参数。用作当前进行语法分析的数据包的时间码从有关的信息文件中读出。因而OpeninfoFile()的上述调用是必须的。图4表示ParsePacket()程序中的步骤。
要语法分析的视频数据首先要与ParsePacket()独立调用时的信息文件同步,后者是借助于在视频数据流(它含有“PES Start”)中搜索第一个TSP来实现的。为此,TSP报头的第一字节,sync-byte,对第一步D1中规定的值47hex作调整。模块变量bFirstPESReached表示这一TSP是否已找到。在第二步D2,ParsePacket()调查这一变量。如果TSP还没有找到,则调用Checksync()。bFirstPESReached的值,依据返回的值可置为“真”。在第三步D3中,这一变量用来再一次核对有PES数据包开头的第一个TSP是否已找到。如果视频数据流已在ParsePacket()调用时与信息文件同步,那么,有关下一个TSP(它含有相关的“PES Start)的偏移可从信息文件中读出。模块变量U32PacketsToNextPES被赋于已确定的偏移值。当调用新功能时,该变量就被确定。于是,信息文件不再读出,直到该变量达到零值。如果从信息文件里读出零偏移D4、D5,即该文件已到结束,那么含有“PES Start”的最后TSP的位置转换成模块变量u64ByteCounterAtPESStart。这一变量值由函数GetcurrentEndOfValidstream()返回。如果没有到达该文件结束,与当前TSP有关的时间码从信息文件中读出,并存入模块变量u32ElapsedTime中。
功能Parsestream()扫描包括一个或更多个TSP的视频数据流的一部分。它不仅支持从信息文件确定时间码,而且也支持这种文件的产生。所用模式取决于前面调用的OpenInfoFile()或CreateInfofile()。在每种情况下,单个视频数据包从要作语法分析的视频数据流循环中提出。该循环是连续的,直到每个数据包通过语法分析。在处理过程中模块变量u32TSPCounter计算提取的数据包,提取的字节在u64Bytecounter中计算。在前面调用OpenInfofile()的事件中,各提取的数据包用作Parsepacket()功能调用的输入参数。一旦有“PES Start”的第一个TSP数据包到达,含在u64Bytecounter中的字节数就转换成模块变量u32CurrentstartOfstreamOffset。
当想要产生信息文件时,当前TSP转换成专用功能Parsetransportpacket()。这一功能确定该TSP是否与基本数据流相关,从这一数据流中提取PRS数据包块,并存入缓存器。以每次功能调用,更多的PES数据包存入缓存器。如果TSP包含新的数据包的起头,那么变量u32TSPCounter的计数存入模块变量u32TSPCounterAtPESStart,且当前的u64ByteCounter值存入u64ByteCounterAtPESStart,所有前面存储的PES数据包块连接在一起,整个PES数据包用专门功能ParsePESPacket()作调查。这一功能确定有关的PTS(如果存在),并把它存入模块变量u32PTS。调查PES数据包也是可能的,例如,确定它们是否包含视频或音频数据流。然后,在ParseTransportPacket()中研究PTS,核对错误并纠正,并计算当前时间码,写入到打开的信息文件中。时间码用上面描述的方法计算。两个含有“PES Start”的相邻TSP之间的距离用模块变量u32TSPCounter,u32TSPCounterAtPESStart,u64ByteCounter和u64ByteCounterAtPESStart计算。
功能GetcurrentEndOfValidStream()返回变量u64ByteCounterAtPESStart,如对ParsePacket()和ParseStream()所说明的那样。于是,它提供了最近作语法分析的含有“PES Start”的TSP的位置。
功能GetStartOfStreamOffset()返回填入ParseStream()的变量u32CurrentStartOfStreamOffset值。如果要重放视频数据流,那么实际传输从返回值开始。这代表了来自在开始回放时转换的不完全PES数据包。因为视频数据流能在任何点开始记录,记录的文件无须以第一个TSP中的“PES Start”开始。变量u32CurrentStartOfStreamOffset最初置为初始值FFFFFFFFhex。如果这一值被该功能返回,这意味着在ParseStream()中未找到“PES Start”。
在信息文件中搜索特定的时间码是用DSD-MPEG2语法分析程序中的SeekTimeCode()程序执行的。正向与反向搜索(搜索类型)的区别已画出。文件指针在视频数据流中为到达适合的TSP必须移动的字节数被返回。在程序的反向搜索路径中,时间码(它小于或等于作为参数转换的时间码)在信息文件中寻找。为此目的,执行表3中的算法。
表3用SeekTimeCode()反向搜索的结构语法。
表3中的总跳计数器表示为到达所要的时间码,在视频数据流中位置指针必须移动的字节数。这是在信息文件中把从PES数据包到PES数据包的偏移值加起来得到的。
在程序的正向途径,时间码在大于或等于作为参数转换的时间码的信息文件中寻找。表4表示正向搜索的结构语法。
表4:用SeekTimeCode()正向搜索的结构语法
在通过表4算法循环的每次运作之后,信息文件的文件指针指向下一个信息块的开始,为此,执行步骤5至8。到达文件结束时,脱离循环,文件指针置于“file start”(“文件开始”)。
下面的文本描述正向和反向指令到转发和换向的转换。
视频数据流中的转发和换向是用上面描述的信息文件来执行的。在程序的开始,假定视频数据流内的位置指针指在含有PES数据包起头(“PESStart”)的TSP,或位于这个数据包前的TSP。为与信息文件同步,正向扫描视频数据流,直到找到有“PES Start”的TSP。图3中对数据流TS中的数据包OTH扫描,直到找到第一个含有“PES Start”的PES数据包PSP#1。然后,借助于SeekTimeCode()的循环,搜索信息文件中离当前时间码为规定时间间隔的时间码,TSP数量或要跳过的字节数由它们的和确定,数据指针在视频数据流中由这一总量移动。
当指令发生改变时,视频数据流与信息文件之间的同步也必须保证。为此,时间码同样要从信息文件中读出,而不是从重放过程中的视频数据流中读出。这有两条理由:首先,时间码无需从PTS重新计算,所以比较快速,且对性能有好处,第二,信息文件在转发或换向之后可能的指令改变事件中,信息文件与视频数据流因此同步。
即使在发生指令改变时,为保持视频数据流与信息文件同步,DSD-MPEG2语法分析程序应遵守如下规则:
1.在执行指令开始,位置指针必须指在视频数据流中包含与信息文件中当前指针位置有关的PES数据包开头的TSP,或位于它之前的TSP。如果位置指针都位于视频数据流和信息文件中的文件开头,那么这一条件因确定而满足。
2.如果视频数据流中的位置指针在重放处理之后没有位于有“PESStart”的TSP,那么信息文件的文件指针指在与下一个有“PES Start”的TSP有关的信息块。如果视频数据流当前的TSP包含“PES Start”,那么,信息文件的文件指针指在与这一TSP有关的信息块。
3.在执行正向或反向指令之后,视频数据流中的位置指针指向有“PES Start”的TSP。信息文件的文件指针指在与这一TSP有关的信息块,一种例外是在执行指令的到达文件结束的情况。在这种情况下,这两种指针都置于文件开头。
在执行指令后,无论是视频文件和信息文件都被关闭。模块变量因此引入,它把当前位置永久存入视频数据流和信息文件中。为此目的,DSD工作模块建立变量u64Filepos,它以每一文件访问已后,视频文件的文件指针的当前位置来更新。DSD-MPEG2语法分析程序确定变量u321nfoFileposition。在DSD工作的StartFile()程序中,文件指针在打开视频文件后置于u64Filepos中的位置。在以相应的DSD-MPEG2语法分析程序模块变量打开信息文件时也这么做。如果不同于当前指令选择的记录道正在回放,这两模块变量必须指于零。
在实际实现中,典型地可获得下列文件之间的量值比,以例说明:
对于65兆字节的视频文件,其信息文件大约为81千字节,相当于0.12%。对于其它229兆字节的视频文件,其信息文件为约146千字节,相当于约0.06%。
所用的传输数据流(TS)是面向数据包的数据流,它主要用于经受错误的通道,通常用于传输或存储。但是,本发明并不取决于传输数据流中所有或部分数据是否有任何相关性。
所用的PES数据包具有高达64千字节的可变尺寸,且可在视频基本数据流中包括内部编码的帧(“I-帧”,约40千字节),或高至两个外部编码的帧(“B-帧”,“P-帧”)。这是因为编码帧的大小是可变的,与帧内容有关。根据本发明的方法允许独立的PES数据包,和独立的视频帧被简单、快速和规范地找到。
本发明的一个重要特性是有关发现PES数据包的信息分别存储,例如在分别的文件或分别的存储区中。这一方法的其它优点是,无需在定位过程中为了在特定基本数据流内定位专门的点,首先从两个或更多个基本数据流中分类存储的传输数据流,而都能导致存储数据流如同其接收时一样无改变地传输。
此外,本发明的方法,使跳到视频数据流中的任何进入点都是可能的,该数据流可从帧编码的观点看,例如,也就是说任何I-帧而不是必须预置可能进入点的固定框架。甚至外部编码的帧,B-帧或P-帧都可跳到它们位于PES数据包的开头。这些点在建立信息文件时自动定位。
相对偏移的指示意味着本方法与整个文件的长度无关。只有最大跳跃宽度被限制了,尽管而它能可靠地预测。在这种情况下,相对于下一个相关TSP或前一个相关TSP的偏移可根据相关的定义来表示。
本发明的方法优先用于必须在面向数据包的数据流中定位的设备中,例如对视频和/或音频数据的记录和回放设备,如个人视频记录器(PVRS)或同类设备,特别是实现转发、转向或回放功能。