微波EDA网,见证研发工程师的成长!
首页 > 应用设计 > 消费类电子 > DVB系统中多路TS流的软件复用关键技术及实现

DVB系统中多路TS流的软件复用关键技术及实现

时间:01-10 来源:与非网 点击:
节目的组成结构等情况。 PSI 主要包括以下四个表:节目关联表(PAT: Program Association Table)、条件访问表(CAT: Conditional Access Table)、节目映射表(PMT: Program Map Table)、网络信息表 NIT: Network Information Table),本文需要涉及到节目关联表 PAT 和节目映射表 PMT。

由于 TS 流复用后的相关联内容发生了变化,因此要对 PSI 信息进行处理。PSI 信息的处理 包括 PAT 和 PMT 表的替换,PID 的重映射,还有就是连续计数器的修改,虽然这不算 PSI 信息, 但是这部分工作与 PSI 信息修改关系很密切, 同时在实际的实现过程中可以同时完成。

复用后的流中有多路节目,原来每一路节目中的 PAT 和 PMT 都只有自身的内容,为此需要 将 PAT 和 PMT 替换。首先根据输入流的数目和预占的频道号,在一开始动态生成 PAT 表,PMT 表则在最初计算好,生成静态的 PMT 对应替换即可,同时根据每个 PMT_PID找到实现 计算好的 PMT 表,将其中的视音频 PID 找到,作为将要替换的视音频 PID。之所以在一开 始生成或者直接使用静态表是因为 PAT 和 PMT有 32 位 CRC,无法完成实时计算。

PMT 表替换后,每一路流中原有的视音频帧的 PID 应与其对应替换的 PMT 表中的视音频 PID 保持一致,即需要进行 PID 重映射。 在传输流处理过程中,先分析每一个读入的 TS 帧,根据 PID的不同,选择替换的内容,如果是 PAT 和 PMT 表,则整个 TS帧替换,如果 是视音频帧,则只替换 PID,替换之后,应该对连续计数器加一。

需要注意的是,单路传输流的构成并不一样,有的传输流是一路音频一路视频,有的是一路 视频两路音频;有的 PCR 的 PID与视频的 PID相同,有的则不同。所以,应该为每一种情 况都准备一张 PMT 表,在新素材到来时,根据分析出来的 PSI 信息的情况,决定选用那一 张 PMT 表。这样作虽然要创建很多静态表,增加了系统内存的占用,但是却能使程序简单 化,易于实现,同时不用随时计算 32 位的 CRC,提高了程序的稳定性。在素材文件切换时, 如果 PMT 表需要发生变化,需要修改 PMT 表的版本号。

每一路流都有 PAT,假使复用的路数为 n,如果每一路的 PAT 都去替换,就会使得 PAT 表 发送频率提升为原来的 n 倍。MPEG-2 规定,PSI 信息传送的频率每秒不低于 25 次,协议 中只规定了下限,没有规定上限,虽然每一路都替换,并不违背协议,但是很多复用器和解 码器在 PSI 信息过多的时候就会工作不正常,这是因为 PSI 信息的 32位 CRC 校验很耗时, 所以通常只替换其中一路的 PAT, 其余的都用空包代替。 PSI 信息合成具体流程如图 4 所示。

4.TS流的节目时钟参考值修正

在 MPEG-2 编码器中有一个系统时钟,该系统时钟用来生成一个共同的时序以便音频/视频 能够正确地解码与播放,同时可以用来指示在采样瞬间系统时钟的瞬时值[6]。正是由于编 码器中有共同的系统时钟,解码器中的时钟可以根据节目时钟参考(PCR)重新恢复,并通 过时间标记的正确使用为解码器中操作的正确同步提供基准。

时钟处理和码率有很大的相关性,某个时间段的码率就是这段时间的数据量与时钟差值的比。为了防止在码率出现波动的时 PCR 时钟差值越界,导致解码器不能正常工作,复用后 输出码率应该比所有单路节目的总码率稍大。在实际中,如果真的出现这种情况,为了避免 所有节目不能正常播放,本文采取的方法是停掉其中某一路,这样降低输出总码率中的有效 码率,保证其他节目正常播放。在这里需要说明的是,MPEG-2 中 TS流有两种,一种 是恒码率流,一种是变码率流,本文研究的复用是针对恒码率流的复用。

根据 MPEG-2 标准,TS流中的 PCR字段长度为 48b, PCR 也是另外一种时间标记,是编码 器 27MHz 时基的 42b 采样值,解码器利用它来恢复系统时钟并进行恰当的解码操作,它有 两个部分组成:一部分以本地参考时钟的 1/300 (90kHz) 为单位,称为 program_clock_reference_base ,为 33b 字段;另外一部分称为
program_clock_reference_extension,是以本地参考时钟(27MHz)为单位的 9b字段。



其中 sysclkfre 为系统时钟 27MHZ。PCR 的单位是 1 /27M 秒,分为两部分表示。实际编程中,当得到一个新的 PCR 值,用式(1)和式 (2) 得到 PCR_base ( 33bit) 和 PCR_ext ( 9bit)两 部分,填入 TS 帧中。在输出码率恒定的情况下,每一个 TS 帧传输所用的时间△PCR 值可以通过下式计算:


其中 nCoderate 为输出的总码率。△PCR 就是每一个 TS帧的时间刻度。

系统开始运行时,确定一个 PCR 的初始值,并为每一路申请一个计数器 nCounter变量,计数在两个 PCR 帧之间的 TS帧数,根据以下公式计算新的 PCR值:


式中,PCR_old 代表上一个 PCR 的值,PCR_new 代表当前新 PCR 的值。在得到新的 PCR 值之后, 用公式(1)(2)(3) 计算出 PCR_base和 PCR_ext 写入帧中, 同时 PCR_old = PCR new, nCounter=0。 nCouter 是对整个传输流而言的,不管 TS 帧是不是当前计算的这路 TS 的内 容,或者空帧,nCounter都要累加。

在 MPEG2 协议中,PCR 由 PCR_base(33bit)和 PCR_ext(9bit)表示,总共 42bit,当 PCR的值 超过 42bit 所能表达的范围时,需要循环重新开始。由于 PCR 和 PTS以及 DTS的关系,在 重新开始循环 PCR 的时候,一定要将 PTS 和 DTS 也重新回 0,同时要将 PCR 帧中调整域 中的 discontinuity_indicator字段置 1。

由于市场上的解码器千差万别, 有的解码器中并没有为PCR留足42bit, 在这种解码器中PCR 通常会在解码器端被提前回 0,而 PTS 和 DTS 并没有随之一起复位,这就会造成解码器的 上溢,导致播放不正常。所以在实际中,本文判断 PCR 是否达到回 0 的阀值略低于 42bit 所能表达的最大值,这样会提高对解码设备的适应性,同时不会造成协议上的冲突。PCR 时钟处理的具体流程如图 5 所示

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top