gstreamer中的rtpjitterbuffer

1. 简介:

    rtpjitterbuffer在gstreamer中是比较重要的一个组件,gstreamer中对rtp处理的组合组件rtpbin中就包含了rtpjitterbuffer,rtpjitterbuffer在rtpbin整个处理中起到了至关重要的作用,包括了对rtp包的乱序重排,丢包重传请求事件的激活等。

2. 功能:

    rtpjitterbuffer在gstreamer中并不单纯是对时间抖动的计算,还有其他如下功能:

    1) 重复包判断并丢弃

    2) 乱序包重排

    3) 延迟计算估计

    4) 网络丢包或包延迟处理,包括了丢包的重传请求事件的触发及其时间间隔控制、丢包向下游的事件处理。

3. 组件内部机制

    rtpjitterbuffer内部主要有三个线程:

    1) 主线程,接受上游包的处理线程,包括rtp和rtcp包的处理。

    2) 定时器线程,当丢包发生时,会给对应包添加一个定时器,超时后对这个包进行对应处理(重传或者不重传),如果在定时器到来之前收到这个包,会移除对应的定时器。

    3) 数据推送线程,当rtpjitterbuffer工作在PUSH模式下时候,会额外开辟一个线程用来进行数据的推送。

4. 简单流程

    1) 当上游有数据到来时,会通过注册的chain函数进行包的处理,这里主要讨论RTP包,函数为gst_rtp_jitter_buffer_chain。

    2) 当该包连续,则会添加该序号包,类型为BUFFER的item到jbuf中,在jbuf中收到连续的包,会按顺序从jbuf中pop出来,并push至下游。

    3) 当某个时刻出现丢包,或者某个包乱序到来,这时候主线程中会为缺失的序号的包注册一个定时器,根据配置计算出超时时间。

    4) 定时器线程在自己循环中,根据超时时间进入睡眠,等待超时时间到来。

    5) 如果包在定时器超时时间之内到来,则会清除定时器,并发送该序号包,类型为BUFFER的item到jbuf上,如果jbuf上看到包序号连续,则推送至下游。

    6) 定时器线程睡醒,这时候去检查定时器,如果定时器仍然存在,则认为出现丢包,根据配置可以选择反馈NACK,或者直接认为丢包。

    7) 假如有重传,这时候会刷新定时器的超时时间,再次发送NACK请求,直至超过了重试次数或者设置的最大期限。

    8) 确认丢包后,会发送一个类型为LOST的该序号的item至jbuf,推送线程发现序号连上了以后会将包推送至下游。

如下图:

    序号为5的包没及时到达,紫色线为包延迟,红色线为包丢失。

gstreamer中的rtpjitterbuffer_第1张图片

你可能感兴趣的:(开源代码阅读,传输协议)