收包到觸發(fā)遠端估算流程:
->bool UdpSocket2WorkerWindows::Process()
->void UdpSocket2Windows::IOCompleted
->void UdpTransportImpl::IncomingRTPCallback
->void UdpTransportImpl::IncomingRTPFunction
->void VideoChannelTransport::IncomingRTPPacket
->int ViENetworkImpl::ReceivedRTPPacket
->int32_t ViEChannel::ReceivedRTPPacket
->int ViEReceiver::ReceivedRTPPacket
->int ViEReceiver::InsertRTPPacket
->void IncomingPacket
->bool ViEReceiver::ReceivePacket//這一步是對媒體處理激捏,即插入jitterbuffer
->void RemoteBitrateEstimatorImpl::IncomingPacket
inter_arrival.cc中函數(shù)分析如下:
timestamp:rtp包中的時間戳
first_timestamp:當前幀第一個包中的時間戳
size:當前幀累計的包大小
complete_time_ms:包到達的時間
calculated_deltas:表示計算了一些delta耳胎,用來做返回值
bool InterArrival::ComputeDeltas(uint32_t timestamp,
int64_t arrival_time_ms,
size_t packet_size,
uint32_t* timestamp_delta,
int64_t* arrival_time_delta_ms,
int* packet_size_delta) {
assert(timestamp_delta != NULL);
assert(arrival_time_delta_ms != NULL);
assert(packet_size_delta != NULL);
bool calculated_deltas = false;
if (current_timestamp_group_.IsFirstPacket()) {//開始階段
// We don't have enough data to update the filter, so we store it until we
// have two frames of data to process.
current_timestamp_group_.timestamp = timestamp;
current_timestamp_group_.first_timestamp = timestamp;
} else if (!PacketInOrder(timestamp)) {//不亂序
return false;
} else if (NewTimestampGroup(arrival_time_ms, timestamp)) {//新的一幀
// First packet of a later frame, the previous frame sample is ready.
if (prev_timestamp_group_.complete_time_ms >= 0) {//prev_timestamp_group_這里是上上一個
*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;
assert(*arrival_time_delta_ms >= 0);
*packet_size_delta = static_cast<int>(current_timestamp_group_.size) -
static_cast<int>(prev_timestamp_group_.size);
calculated_deltas = true;
}
prev_timestamp_group_ = current_timestamp_group_;
// The new timestamp is now the current frame.
current_timestamp_group_.first_timestamp = timestamp;
current_timestamp_group_.timestamp = timestamp;
current_timestamp_group_.size = 0;
}
else {
current_timestamp_group_.timestamp = LatestTimestamp(
current_timestamp_group_.timestamp, timestamp);
//同一個幀,這里會根據(jù)有沒有時間戳的拓展包頭,決定timestamp有沒有變化
}
// Accumulate the frame size.
current_timestamp_group_.size += packet_size;
current_timestamp_group_.complete_time_ms = arrival_time_ms;
return calculated_deltas;
}
BelongsToBurst大概意思是兩個包之間收到的間隔很小或者傳輸時延小于0
bool InterArrival::BelongsToBurst(int64_t arrival_time_ms,
uint32_t timestamp) const {
if (!burst_grouping_) {
return false;
}
assert(current_timestamp_group_.complete_time_ms >= 0);
int64_t arrival_time_delta_ms = arrival_time_ms -
current_timestamp_group_.complete_time_ms;
uint32_t timestamp_diff = timestamp - current_timestamp_group_.timestamp;
int64_t ts_delta_ms = timestamp_to_ms_coeff_ * timestamp_diff + 0.5;
if (ts_delta_ms == 0)
return true;
int propagation_delta_ms = arrival_time_delta_ms - ts_delta_ms;
return propagation_delta_ms < 0 &&
arrival_time_delta_ms <= kBurstDeltaThresholdMs;
}