Inter_arrival模块分析

概述:该模块主要是为了获取发送端时间差值,到达时间差值,包组间包个数差值。通过获取这些参数传递给后续模块进行延迟估计。

包组的概念:webrtc中计算延迟不是一个个包计算,而是通过将包进行分组,然后计算包组间的延迟,这样一是可以减少计算量,二也是可以使之更加平滑。

具体方法:差值计算是在inter_arrival模块进行获取。timestamp:表示数据包的发送时间。arrival_time_ms:表示数据包到达时间单位ms。timestamp_delta:表示数据包两个组之间发送时间间隔(也就是下图中T2-T1)。arrival_time_delta_ms:表示数据包两个组之间到达时间间隔(也就是下图t2-t1)。packet_size_delta:表示两个组之间数据包差值(也就是G2-G1)

bool InterArrival::ComputeDeltas(uint32_t timestamp,
                                 int64_t arrival_time_ms,
                                 int64_t system_time_ms,
                                 size_t packet_size,
                                 uint32_t* timestamp_delta,
                                 int64_t* arrival_time_delta_ms,
                                 int* packet_size_delta) 

序列图如下:(引用)

Inter_arrival模块分析_第1张图片

其中每个组的数据量大小为5ms数据(发送端时间差值),所以内部会维护一个变量用于记录当前数据包的发送时间和到达时间,以及该组的第一个包的时间,该结构体内部size:组内包个数。first_timestamp:组内第一个包发送端时间。timestamp:组内最新一个包发送端时间。complete_time_ms:组内最新一个包到达时间。

struct TimestampGroup {
    TimestampGroup()
        : size(0),
          first_timestamp(0),
          timestamp(0),
          complete_time_ms(-1) {}

    bool IsFirstPacket() const {
      return complete_time_ms == -1;
    }

    size_t size;
    uint32_t first_timestamp;
    uint32_t timestamp;
    int64_t complete_time_ms;
    int64_t last_system_time_ms;
  }; 

TimestampGroup current_timestamp_group_;
TimestampGroup prev_timestamp_group_;

每次根据判断当前的包是属于当前组还是一个最新组,如果是当前组则只是更新当前组的最新包时间戳。如果是最新组则说明当前组满了,则通过当前组和prev_timestamp_group进行比对获取两个组之间差值。

if (NewTimestampGroup(arrival_time_ms, timestamp)) {

    if (prev_timestamp_group_.complete_time_ms >= 0) {
      *timestamp_delta = current_timestamp_group_.timestamp -
                         prev_timestamp_group_.timestamp;
      *arrival_time_delta_ms = current_timestamp_group_.complete_time_ms -
                               prev_timestamp_group_.complete_time_ms;
    }
}

此时重点为如何判断是否属于最新组,通过发送端时间进行比对,此时注意时间戳单位。其中原理就是如果在5ms之外则说明是最新组。其中该模块会涉及到一些乱序等突发情况的处理。

总结:以上就是通过包组的概念进行发送接收时间差值的获取。

你可能感兴趣的:(WebRTC)