webrtc视频接收端带宽预测(一)---参数输入
2017-06-06 本文已影响258人
ai___believe
收包到触发远端估算流程:
->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中函数分析如下:
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);
//同一个帧,这里会根据有没有时间戳的拓展包头,决定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;
}