分析入口 webrtc/ideo/vie_remb.cc
void vieremb::onreceivebitratechanged(const
std::vector
& ssrcs,
uint32_t bitrate)
}bitrate_ = bitrate;
// calculate total receive bitrate estimate.
int64_t now = clock_->timeinmilliseconds();
if (now - last_remb_time_ < krembsendintervalms)
last_remb_time_ = now;
if (ssrcs.empty() || receive_modules_.empty())
// send a remb packet.
/*
if (!rtcp_sender_.empty())
else
*/if (!receive_modules_.empty())
else
last_send_bitrate_ = bitrate_;
}if (sender)
}} // namespace webrtc
在改新版webrtc時, 原有的tmmbr/tmmbn改為remb,因為業務需求修改了伺服器邏輯,再使用時,發現remb的請求位元速率一直上不去,分析原因,找個函式作為入口,分析remb的生成計算
呼叫順序
remote_bitrate_estimator_single_stream.cc
void remotebitrateestimatorsinglestream::process()
之後 remote_bitrate_estimator_single_stream.cc
void remotebitrateestimatorsinglestream::updateestimate(int64_t now_ms)
之後 vie_remb.cc
void vieremb::onreceivebitratechanged(const std::vector& ssrcs, uint32_t bitrate)
好吧,發現是在這條道上產生的,之後發現在
remote_bitrate_estimator_single_stream.cc
void remotebitrateestimatorsinglestream::updateestimate(int64_t now_ms)
void remotebitrateestimatorsinglestream::updateestimate(int64_t now_ms)
}
位元速率在此計算?
const ratecontrolinput input(bw_state,
incoming_bitrate_.rate(now_ms),
mean_noise_var);
進入 incoming_bitrate_.rate(now_ms)
**進入,期待解開真相。。。這***都是些啥啥啊
rate_statistics.cc
rtc::optionalratestatistics::rate(int64_t now_ms) const
float scale = scale_ / active_window_size;
return rtc::optional(
static_cast
(accumulated_count_ * scale + 0.5f));
}
scale_ 是固定的8000
accumulated_count_ * scale + 0.5f
accumulated_count_ *scale_ /(now_ms - oldest_time_ + 1) + 0.5f
如果沒有推測錯 accumulated_count_ 就是在now_ms - oldest_time_時間接受到的位元組數 單位kb,
然後計算出單位時間可以接受的頻寬, 單位bit
繼續順藤摸瓜, 驗證推測
void ratestatistics::update(size_t count, int64_t now_ms)
eraseold(now_ms);
// first ever sample, reset window to start now.
if (!isinitialized())
oldest_time_ = now_ms;
uint32_t now_offset = static_cast
(now_ms - oldest_time_);
rtc_dcheck_lt(now_offset, max_window_size_ms_);
uint32_t index = oldest_index_ + now_offset;
if (index >= max_window_size_ms_)
index -= max_window_size_ms_;
buckets_[index].sum += count;
++buckets_[index].samples;
accumulated_count_ += count;
++num_samples_;
}
看到accumulated_count_ += count;
呼叫順序
rtp_stream_receiver.cc
bool rtpstreamreceiver::deliverrtp(const uint8_t* rtp_packet,
size_t rtp_packet_length,
const packettime& packet_time)
之後 congestion_controller.cc
void incomingpacket(int64_t arrival_time_ms,
size_t payload_size,
const rtpheader& header)
之後 remote_bitrate_estimator_single_stream.cc
void remotebitrateestimatorsinglestream::incomingpacket
之後 rate_statistics.cc
void ratestatistics::update(size_t count, int64_t now_ms)
簡單理解 就是接收到資料記個數
???remb就是接受到的頻寬???,是不是**看漏了
webRTC協議分析
http hyper text transport protocol 超文字傳輸協議 應用層協議 包括 sip websocket 和 xmpp websocket 子協議 nat 會話穿透實用工具 回話建立之前會傳送stun報文進行測試 確定是否位於nat之後並發現對映位址和埠 這些資訊用於構建i...
WebRTC研究 audio 丟包判斷
當收到乙個包時,丟包判斷原理 sequence number 當前收到的包的序列號 timestamp 當前收到的包的時間戳 void nacktracker updatelastreceivedpacket uint16 t sequence number,uint32 t timestamp r...
webrtc 和 rtp 協議 之sctp
webrtc和rtp 一 pion的datachannel示例 zoom公司大家其實都知道,會議的體驗很好,因為他們善用了datachannel,有興趣大家可以仔細研究,推敲,到了今天,技術和核心技術得不到大家的理解,很多人依然認為技術可以獲取,缺的是錢,事實上,兩個都缺。sctp協議可以適用tcp...