一种减小附加延时的实时流缓存去抖方法
技术领域
本发明涉及一种减小附加延时的实时流缓存去抖方法,属于在分组网,包括IP网和以太网上传输实时流技术领域。
背景技术
在IP网络上传输实时流时,由于网络延时的不确定性,会引入实时流的时间抖动和乱序。为了保证实时流的质量,需要在实时流的接收端缓存一定数量的包,然后按照固定的时间间隔发送各个包,以附加延时为代价来消除时间抖动和乱序,这种方法称为“缓存去抖”。实现缓存去抖的关键技术是队列调度。
已有技术中,一般采用基于软件实现的链表方法来进行缓存去抖。图1是其实现框图。每个实时流通道维护一个缓存去抖链表,链表节点的内容为各个实时流数据包的时间、缓存地址等信息。实时流数据包的处理流程如下:
1、当输入接收到一个实时流数据包时,向共享缓存管理申请实时流数据包数据缓存。
2、共享缓存管理为该实时流数据包分配存储空间,返回指向该存储空间的缓存地址。
3、输入得到存储空间的缓存地址后,把实时流数据包写入到共享缓存中去,然后把该实时流数据包的时间、缓存地址等信息传递给实时流数据包队列调度。
4、队列调度首先生成一个新的实时流数据包节点,然后按照实时流数据包的发送时间顺序把该节点插入到缓存去抖链表的合适位置。
5、实时流数据包队列调度维护每个通道的实时流数据包发送时间,当某一个通道的发送时间到来时,队列调度从该通道的缓存去抖链表中查找发送的实时流数据包。如果查询到了符合发送条件的实时流数据包,则输出从共享缓存中读取实时流数据包并且发送出去。
6、队列调度删除该节点,共享缓存管理回收该实时流数据包的存储空间。
上述方法的缺点是:
(1)链表的维护比较复杂。通常是在链表的末尾插入实时流数据包的,此时需要遍历整个链表才能找到实时流数据包的插入位置。如果是乱序的实时流数据包,则需要比较链表中前后两个实时流数据包和待插入实时流数据包的序列号,才能找到该实时流数据包的插入位置。无论是哪种情况,链表操作都比较复杂。由于链表的节点个数和实时流数据包发送时间的不确定性,实时流数据包插入操作所花费的时间也具有很大的不确定性。
(2)每个通道的实时流数据包发送时间是彼此独立的,当有多个通道同时发出发送请求时,难以保证每个实时流数据包都能够得到及时的响应,最后发送的通道会引入比较大的延时。如果某一个通道的相邻两个实时流数据包发送请求的响应时间不相等,就会引入附加的“抖动”,抖动的大小取决于同时提出发送请求的通道个数和队列调度的处理过程。队列调度的处理过程和处理时间都带有很大的不确定性。
因此上述方法处理过程复杂,又有很大的不确定性,单个处理器所能够处理的通道数都不大,一般在几百~一千个通道之间,使单通道成本比较高。
发明内容
本发明的目的是针对已有技术存在的缺点,提出一种减小附加延时的实时流缓存去抖方法,在处理过程中去除已有技术中的缓存去抖链表,使通道信息和实时流数据包数据存储空间被所有通道平均分配,并简化实时流数据包的写入过程,统一维护所有通道的语音包发送时间,建立实时流存储通道与读通道之间的关联。在通道发生用户切换时,根据读通道自行确定与写通道相对应的存储通道,以减小实时流发送中的附加时延。
本方法提出的减小附加延时的实时流缓存去抖方法,包括如下各步骤:
1、接收实时流,并将实时流存入输入缓存中;
2、若输入缓存中已有完整的实时流,则向读写仲裁发出写实时流请求,并给出请求的写实时流通道号;
3、发送时间维护以固定的时间间隔向读写仲裁发出读实时流请求,同时向读实时流给出请求的读实时流通道号和实时流的发送位置;
4、读写仲裁对读请求信号与写请求信号进行仲裁;
5、经仲裁后,若为写实时流请求,则确定实时流的存储通道;
6、写实时流流程从通道信息中读取写请求的实时流通道信息,计算写实时流的写入位置,并将该实时流从输入缓存写入到共享缓存中;
7、经仲裁后,若为读实时流请求,则进行读实时流流程:从通道信息中读取请求的读实时流所属的通道信息,并根据给定的读实时流通道号和实时流发送位置,从共享缓存中读取相应实时流,将其存入输出缓存中;
8、检查输出缓存,若发现有完整的实时流,则发送实时流。
上述方法中的发送时间维护包括以下各步骤:
(1)在20毫秒内发送0通道至32K-1通道的第0个发送位置的实时流;
(2)在下一个20毫秒内发送0通道至32K-1通道的第1个发送位置的实时流;
(3)在又一个20毫秒内发送0通道至32K-1通道的第2个发送位置的实时流;
(4)依此类推,在最后20毫秒内发送0通道至32K-1通道的第15个发送位置的实时流;
(5)重复进行上述步骤1至4。
上述方法中的读写仲裁包括以下步骤:
(1)当写实时流流程结束后,首先判断是否有读实时流请求,若有,则进行读实时流操作;
(2)若没有读实时流请求,则进一步判断是否有写实时流请求,若有,则进行写实时流操作:
(3)当读实时流流程结束后,首先判断是否有写实时流请求,若有,则进行写实时流操作;
(4)若没有写实时流请求,则判断是否有读实时流请求,若有,则进行读实时流操作。
上述方法中确定实时流存储通道的过程包括以下步骤:
(1)建立实时流通道占用标识表、写通道与共享缓存中的存储通道之间的映射表;
(2)从实时流的包头信息判断是否发生用户切换,若不发生切换,则从上述映射表中读取与写通道号相对应的存储通道号,若发生切换,则进行以下第(3)步;
(3)以读通道号为起始地址,从上述实时流通道占用标识表中查找空闲通道,将查找到的第一个空闲通道作为存储通道。
还可以在上述第(1)步中,同时建立写通道与共享缓存中的存储通道之间的逆映射表;在上述第(3)步中,当发生用户切换时,若查找到空闲通道,则存储通道为有效,若查找不到空闲通道,则存储通道为无效,将写通道号与存储通道有效与否的信息写入上述写通道与共享缓存中的存储通道之间的逆映射表中;读实时流请求时,从上述逆映射表中读取存储通道有效与否的信息,若存储通道无效,则读实时流结束,若有效,则读取请求的读实时流所属的通道信息。
上述方法中,写实时流流程包括以下步骤:
(1)根据实时流包头信息进行判断,选择重置算法或时间戳算法计算实时流的写入位置;其中,若使用重置算法,则计算实时流写入位置,若使用时间戳算法,则先计算实时流写入位置,再判断实时流是否丢弃,若丢弃该实时流,则根据连续丢包标志判断是否用重置算法强制写入实时流;
(2)根据确定的实时流存储通道、上述计算的实时流写入位置以及包头信息中的实时流长度,将实时流写入共享缓存中;
(3)将实时流的时间戳、实时流长度、实时流有效信息、实时流去抖缓存深度写入通道信息中。
上述写实时流流程中,用以计算实时流写入位置的重置算法为,将当前通道的发送位置与当前写入实时流的去抖缓存深度之和作为实时流写入位置。
上述写实时流流程中,用以计算实时流写入位置的时间戳算法的计算过程如下:
(1)计算实时流的相对写入位置:
相对写入位置=(实时流的时间戳+80-通道的时间戳)/160,
若该实时流是一个实时流段的第一个实时流,则相对写入位置=(实时流的时间戳+80-通道的时间戳)/160+(实时流的去抖缓存深度-通道的去抖缓存深度);
(2)判断该实时流是否丢弃:
若上述实时流的相对写入位置小于0,则进一步判断,若当前通道上一个实时流的写入位置与实时流的相对写入位置之和小于当前通道的发送位置,则丢弃该实时流;
若上述实时流的相对写入位置大于或等于0,则进一步判断,若当前通道的上一个实时流的写入位置与实时流的相对写入位置之和大于当前通道的发送位置与16之和,则丢弃该实时流;
(3)计算实时流的写入位置:对上述第2步判断后没有丢弃的实时流,则该实时流的写入位置等于当前通道的上一个实时流的写入位置与该实时流的相对写入位置之和。
上述写实时流流程中,连续丢包标志判断过程为:连续丢包标志的初始值为0,每收到一个实时流,连续丢包标志向左移一位,若该实时流被丢弃,则连续丢包标志1填入1,否则连续丢包标志1填入0,若连续丢包标志的每一位都是1,表明连续n个实时流都被丢弃,则使用重置算法计算该实时流的写入位置,并且把该实时流存入到共享缓存中。
上述方法的共享缓存中,存储实时流的容量按32K个通道平均分为32K“行”,其中的第n行分配给通道n,n为整数,0≤n≤32K-1,每一行的容量为256×64位;通道信息的容量按32K个通道平均分为32K“行”,其中的第i行分配给通道i,i为整数,0≤i≤32K-1,每一行的容量为8×32位。
上述方法中所述的读实时流流程包括以下步骤:
(1)根据发送时间维护流程给定的通道号,利用通道信息的地址分配表计算出通道信息起始地址,从通道信息中读取实时流有效信息,若无效,则结束读实时流,若有效,则读取实时流长度信息;
(2)根据上述给定的通道号和实时流发送位置,以及上述读出的实时流长度信息,从共享缓存中读取相应的实时流,存入输出缓存中;同时清除通道信息中的上述实时流有效的信息。
本发明提出的减小附加延时的实时流缓存去抖方法具有以下优点:
1、本方法中,省去了已有技术中的缓存去抖链表,由发送时间维护流程统一维护所有实时流的发送时间,而且每个通道中相邻两个实时流的发送时间间隔固定,每次只有一个通道的一个包提出请求,因而避免了已有技术中由于多个通道同时提出读语音包请求而引入的附加抖动。
2、本发明提出的根据读通道自行确定实时流存储通道的方法可以在不降低实时流处理速度和实时流通道容量的前提下将附加延时减小到最小,并且附加延时的大小可控,在工作中可以根据实际需要确定通道查找范围,调整附加延时大小。
3、本发明提出的实时流缓存去抖实现方法,对不同长度、不同去抖缓存深度的实时流,其处理时间基本上没有太大的差异,处理性能稳定。
4、存储空间容量的平均分配以及各个处理过程的并行进行,使本方法能够处理的缓存去抖通道数大于其它任何已有方法,因而单通道成本低。而且只要提高硬件处理频率,增加存储器的容量,本发明设计的方法可以很容易地实现更大通道数的缓存去抖。
5、本发明方法的移植性较好,可适用于任意打包间隔的实时流处理,如5毫秒间隔、10毫秒间隔、30毫秒间隔、40毫秒间隔等。
附图说明
图1是已有技术的基于链表实现缓存去抖的实时流处理框图。
图2是本发明提出的缓存去抖流程图。
图3是本方法的一个实施例中发送时间维护顺序示意图。
图4是本方法中读写仲裁流程图。
图5是本方法中确定实时流存储通道的流程图。
图6是本方法的一个实施例的流程图。
图7是本方法中写实时流流程图。
图8是本方法中连续丢包标志示意图。
图9是本方法中共享缓存结构示意图。
图10是本方法中读实时流流程图。
图11是本方法的一个实时例中确定语音流存储通道的操作示意图。
具体实施方式
如图2所示,本方法首先接收实时流,并将实时流存入输入缓存中;若输入缓存中已有完整的实时流,则向读写仲裁发出写实时流请求,并给出请求的写实时流通道号;发送时间维护以固定的时间间隔向读写仲裁发出读实时流请求,同时向读实时流给出请求的读实时流通道号和实时流的发送位置;读写仲裁对读请求信号与写请求信号进行仲裁;经仲裁后,若为写实时流请求,则确定实时流的存储通道;写实时流流程从通道信息中读取写请求的实时流通道信息,计算写实时流的写入位置,并将该实时流从输入缓存写入到共享缓存中;经仲裁后,若为读实时流请求,则从通道信息中读取请求的读实时流所属的通道信息,并根据给定的读实时流通道号和实时流发送位置,从共享缓存中读取相应实时流,将其存入输出缓存中;检查输出缓存,若发现有完整的实时流,则发送实时流。
上述方法的一个实施例中,发送时间维护流程可以如图3所示,在20毫秒内发送0通道至32K-1通道的第0个发送位置的实时流;在下一个20毫秒内发送0通道至32K-1通道的第1个发送位置的实时流;在又一个20毫秒内发送0通道至32K-1通道的第2个发送位置的实时流;依此类推,在最后20毫秒内发送0通道至32K-1通道的第15个发送位置的实时流。
上述方法中读写仲裁的流程如图4所示,当写实时流流程结束后,首先判断是否有读实时流请求,若有,则进行读实时流操作;若没有读实时流请求,则进一步判断是否有写实时流请求,若有,则进行写实时流操作:当读实时流流程结束后,首先判断是否有写实时流请求,若有,则进行写实时流操作;若没有写实时流请求,则判断是否有读实时流请求,若有,则进行读实时流操作。
上述方法中,确定实时流存储通道的流程如图5所示,首先建立实时流通道占用标识表、写通道与共享缓存中的存储通道之间的映射表;从实时流的包头信息判断是否发生用户切换,若不发生切换,则从上述映射表中读取与写通道号相对应的存储通道号,若发生切换,则以读通道号为起始地址,从上述实时流通道占用标识表中查找空闲通道,将查找到的第一个空闲通道作为存储通道。还可以在建立实时流通道占用标识表和写通道与共享缓存中的存储通道之间的映射表的同时建立写通道与共享缓存中的存储通道之间的逆映射表;当发生用户切换时,若查找到空闲通道,则存储通道为有效,若查找不到空闲通道,则存储通道为无效,将写通道号与存储通道有效与否的信息写入上述写通道与共享缓存中的存储通道之间的逆映射表中;读实时流请求时,从上述逆映射表中读取存储通道有效与否的信息,若存储通道无效,则读实时流结束,若有效,则读取请求的读实时流所属的通道信息,其过程如图6所示。
上述方法中,写实时流流程如图7所示,首先根据实时流包头信息进行判断,选择重置算法或时间戳算法计算实时流的写入位置;其中,若使用重置算法,则计算实时流写入位置,若使用时间戳算法,则先计算实时流写入位置,再判断实时流是否丢弃,若丢弃该实时流,则根据连续丢包标志判断是否用重置算法强制写入实时流;根据确定的实时流存储通道、上述计算的实时流写入位置以及包头信息中的实时流长度,将实时流写入共享缓存中;将实时流的时间戳、实时流长度、实时流有效信息、实时流去抖缓存深度写入通道信息中。其中的重置算法为,将当前通道的发送位置与当前写入实时流的去抖缓存深度之和作为实时流写入位置;其中的时间戳算法的计算过程为:
(1)计算实时流的相对写入位置:
相对写入位置=(实时流的时间戳+80-通道的时间戳)/160,
若该实时流是一个实时流段的第一个实时流,则相对写入位置=(实时流的时间戳+80-通道的时间戳)/160+(实时流的去抖缓存深度-通道的去抖缓存深度);
(2)判断该实时流是否丢弃:
若上述实时流的相对写入位置小于0,则进一步判断,若当前通道上一个实时流的写入位置与实时流的相对写入位置之和小于当前通道的发送位置,则丢弃该实时流;
若上述实时流的相对写入位置大于或等于0,则进一步判断,若当前通道的上一个实时流的写入位置与实时流的相对写入位置之和大于当前通道的发送位置与16之和,则丢弃该实时流;
(3)计算实时流的写入位置:
对上述第2步判断后没有丢弃的实时流,则该实时流的写入位置等于当前通道的上一个实时流的写入位置与该实时流的相对写入位置之和。
上述连续丢包标志判断过程如图8所示,设连续丢包标志的初始值为0,每收到一个实时流,连续丢包标志向左移一位,若该实时流被丢弃,则连续丢包标志1填入1,否则连续丢包标志1填入0,若连续丢包标志的每一位都是1,表明连续n个实时流都被丢弃,则使用重置算法计算该实时流的写入位置,并且把该实时流存入到共享缓存中。
上述方法中,共享缓存的结构如图9所示,将存储实时流的容量按32K个通道平均分为32K“行”,其中的第0行分配给通道0,第1行分配给通道1,第2行分配给通道2……,第32K-1行分配给通道32K-1,每一行的容量为256×64位;通道信息的容量按32K个通道平均分为32K“行”,其中的第0行分配给通道0,第1行分配给通道1,第2行分配给通道2……,第32K-1行分配给通道32K-1,每一行的容量为8×32位。
上述方法中,读实时流流程如图10所示,首先根据发送时间维护流程给定的通道号,利用通道信息的地址分配表计算出通道信息起始地址,从通道信息中读取实时流有效信息,若无效,则结束读实时流,若有效,则读取实时流长度信息;根据上述给定的通道号和实时流发送位置,以及上述读出的实时流长度信息,从共享缓存中读取相应的实时流,存入输出缓存中;同时清除通道信息中的上述实时流有效的信息。
下面以实时流中的实时语音流为例,详细介绍本发明的内容。
本发明方法的一个实施例中,采用16M×64位的SDRAM作为语音流的共享缓存。SDRAM容量被32K个通道平均分为32K“行”,第0行SDRAM分配给存储通道0,第1行SDRAM分配给存储通道1,第2行SDRAM分配给存储通道2……,第32K-1行SDRAM分配给存储通道32K-1。每一行SDRAM的容量为16M×64位/32K=512×64位。SDRAM的地址分配如下:
地址范围(24位十六进制地址) |
功能分配 |
000000~0001FF |
缓存存储通道0的语音流 |
000200~0003FF |
缓存存储通道1的语音流 |
000400~0005FF |
缓存存储通道2的语音流 |
000600~0007FF |
缓存存储通道3的语音流 |
…… |
…… |
FFFC00~FFFDFF |
缓存存储通道32K-2的语音流 |
FFFE00~FFFFFF |
缓存存储通道32K-1的语音流 |
本实施例中,采用1M×32位的SSRAM存储通道信息。SSRAM容量被32K个通道平均分为32K“行”,SSRAM中通道信息的地址分配表如下表所示:
地址范围(20位十六进制地址) |
功能分配 |
00000~0001D |
共享缓存中的存储通道0的通道信息 |
0001E |
写通道0与共享缓存中的存储通道之间的映射表 |
0001F |
写通道与共享缓存中的存储通道0之间的逆映射表 |
00020~0003D |
共享缓存中的存储通道1的通道信息 |
0003E |
写通道1与共享缓存中的存储通道之间的映射表 |
0003F |
写通道与共享缓存中的存储通道1之间的逆映射表 |
…… |
…… |
FFFC0~FFFDD |
共享缓存中的存储通道32K-2的通道信息 |
FFFDE |
写通道32K-2与共享缓存中的存储通道之间的映射表 |
FFFDF |
写通道与共享缓存中的存储通道32K-2之间的逆映射表 |
FFFE0~FFFFD |
共享缓存中的存储通道32K-1的通道信息 |
FFFFE |
写通道32K-1与共享缓存中的存储通道之间的映射表 |
FFFFF |
写通道与共享缓存中的存储通道32K-1之间的逆映射表 |
写通道与共享缓存中的存储通道之间的映射表记录写通道号对应的存储通道号,数据格式如下:
位 |
含义 |
取值 |
31~16 |
保留使用 |
0 |
14~0 |
存储通道号 |
0~32767 |
写通道与共享缓存中的存储通道之间的逆映射表记录存储通道号对应的写通道号和存储通道有效与否的信息,数据格式如下:
位 |
含义 |
取值 |
31~16 |
保留使用 |
0 |
15 |
存储通道有效与否的信息 |
1/0 |
14~0 |
写通道号 |
0~32767 |
本实施例中的发送时间维护流程按照存储通道号由小到大的顺序发送32K个通道的语音流,首先在20毫秒内发送存储通道0~32K-1的第0个位置的语音流,然后在下一个20毫秒内发送存储通道0~32K-1的第1个位置的语音流,再在下一个20毫秒内发送存储通道0~32K-1的第2个位置的语音流,……最后在20毫秒内发送存储通道0~32K-1的第15个位置的语音流,然后从第0个位置开始重复发送。
本实施例中,读写仲裁的过程为:当写语音流流程结束后,首先判断是否有读语音流请求,如果有,则进行读语音流操作;如果没有读语音流请求,则进一步判断是否有写语音流请求,如果有则进行写语音流操作。当读语音流流程结束后,首先判断是否有写语音流请求,如果有则进行写语音流操作;如果没有写语音流请求则判断是否有读语音流请求,如果有则进行读语音流操作。
本实施例中,读语音流操作,首先根据发送时间维护流程给定的读通道号,利用通道信息的地址分配表计算出该读通道对应的写通道与共享缓存中的存储通道之间的逆映射表的地址,从上述逆映射表中读取存储通道有效与否的信息,若存储通道无效,则读语音流结束,若有效,则利用通道信息的地址分配表计算出该通道对应的通道信息起始地址,从通道信息中读取语音流有效信息,并进行读语音流操作。
本实施例中,确定语音流存储通道的过程为,首先由语音流的包头信息判断是否发生用户切换,若发生用户切换,以读通道号为起始地址,从上述实时流通道占用标识表中查找空闲通道,将查找到的第一个空闲通道作为存储通道,并将该存储通道号写入上述写通道与共享缓存中的存储通道之间的映射表中。若未发生用户切换,则从写通道与存储通道之间的映射表中读取与写通道号相对应的存储通道号。确定语音流存储通道的操作完成后开始写语音流操作。
在本实施例中,发生用户切换时确定语音流存储通道的操作示意图如图11所示。如图11中所示,当前时刻读通道指向通道1,位置指针指向位置0,此时写通道0发生用户切换,在语音流通道占用标识表中从通道1向后查找256个通道,若此时通道100为空闲通道,则通道100就是写通道0的存储通道,该语音流将在(100/32K-1)×20毫秒=0.06毫秒之后被读出。
本实施例中,写语音流的过程为:首先根据语音流包头信息进行判断,选择重置算法或时间戳算法计算语音流的写入位置;其中,若使用重置算法,则计算语音流的写入位置;若使用时间戳算法,则计算语音流的写入位置并判断语音流是否丢弃,若丢弃该语音流,则根据连续丢包标志判断是否用重置算法强制写入语音流。如果该语音流没有被丢弃,则根据存储通道、语音流写入位置、语音流长度,将语音流写入共享缓存中;同时将语音流写入位置、语音流的时间戳、语音流长度、语音流有效信息、语音流去抖缓存深度等写入通道信息中,其中写入的语音流写入位置即为通道的语音流写入位置,写入的语音流的时间戳即为通道的时间戳;写入的语音流的去抖缓存深度即为通道的去抖缓存深度。
上述写语音流流程中,计算语音流的写入位置的算法有两种,一种是重置算法,另一种是时间戳算法。
重置算法计算的当前语音流写入位置为:当前通道的发送位置与当前写入语音流的去抖缓存深度之和。
时间戳算法的计算过程如下:
1)计算语音流的相对写入位置:将语音流的时间戳减去通道的时间戳,得到了语音流和当前通道的上一个语音流的时间戳差值,该差值除以160(20毫秒,即通道的语音流时间间隔),其结果四舍五入到最近的整数,就得到了语音流的相对写入位置。即相对写入位置=(语音流的时间戳+80-通道的时间戳)/160。如果该语音流是一个语音段的第一个语音流,则相对写入位置还要考虑去抖缓存深度的变化,即相对写入位置=(语音流的时间戳+80-通道的时间戳)/160+(语音流的去抖缓存深度-通道的去抖缓存深度)。
2)判断该语音流是否丢弃。
若语音流的相对写入位置小于0,说明该语音流是一个乱序包。如果当前通道上一个语音流的写入位置与语音流的相对写入位置之和小于当前通道的发送位置,表明该语音流来得太“晚”了,其发送时间已经过去了,则丢弃现语音流。
若语音流的相对写入位置大于或等于0,如果当前通道的上一个语音流的写入位置与语音流的相对写入位置之和大于当前通道的发送位置与16之和,则表明该语音流来得太“早”了,已经超出了该通道的存储极限,则丢弃该语音流。
3)计算语音流的写入位置
如果没有丢弃该语音流,则该语音流的写入位置=(当前通道的上一个语音流的写入位置+该语音流的相对写入位置)。