inline bool isnewersequencenumber(uint16_t sequence_number,
uint16_t prev_sequence_number)
return sequence_number != prev_sequence_number &&
static_cast(sequence_number - prev_sequence_number) < 0x8000;
}
rtp序列號sequence number
用兩位元組表示,時間戳timestamp
用四位元組表示。所以序列號以及時間戳就存在乙個取值範圍。由於是無符號數,所以序列號範圍為:[0,2^16-1]
,時間戳範圍為:[0,2^32-1]
。當達到最大值時,將發生所謂的迴繞。例如,序列號到了2^16-1,下個包序列號就將是0。所以我們不能直接根據數學意義上的大小進行序列號以及時間戳的比較。
在webrtc中定義了乙個大小比較演算法,包含數字迴繞處理,判斷是否是更新的數字。下面說下演算法原理:總結起來就是1)假設有兩個
u
型別的無符號整數:value
,prev_value
;2)定義乙個常量
kbreakpoint
,為u
型別取值範圍的一半;3)
value > prev_value
,滿足value - prev_value = kbreakpoint
時,value
大於prev_value
;4)
value
與prev_value
不相等,滿足(u)(valude - prev_value) < kbreakpoint
時,value
大於prev_value
。5)
value
<prev_value
不相等,滿足(u)(valude - prev_value) > kbreakpoint
,由於是usign型別大於kbreakpoint其實就是負數,value
小於prev_value
。
value
與prev_value
距離小於取值範圍的一半且不相等或者value
與prev_value
距離等於取值範圍的一半,value
大於prev_value
,就可以說明value
大於prev_value
。
timestamp比較也是同樣的方法。
inline bool isnewertimestamp(uint32_t timestamp, uint32_t prev_timestamp)
return timestamp != prev_timestamp &&
static_cast(timestamp - prev_timestamp) < 0x80000000;
}
bool streamstatisticianimpl::inorderpacketinternal(
uint16_t sequence_number) const else
}
bool streamstatisticianimpl::isretransmitofoldpacket(
const rtpheader& header, int64_t min_rtt) const
uint32_t frequency_khz = header.payload_type_frequency / 1000;
assert(frequency_khz > 0);
int64_t time_diff_ms = clock_->timeinmilliseconds() -
last_receive_time_ms_;
// diff in time stamp since last received in order.
uint32_t timestamp_diff = header.timestamp - last_received_timestamp_;
uint32_t rtp_time_stamp_diff_ms = timestamp_diff / frequency_khz;
int64_t max_delay_ms = 0;
if (min_rtt == 0)
} else
return time_diff_ms > rtp_time_stamp_diff_ms + max_delay_ms;
}
bool rtpstreamreceiver::ispacketretransmitted(const rtpheader& header,
bool in_order) const
!in_order && statistician->isretransmitofoldpacket(header, min_rtt)
滿足亂序,且加上rtt時間後還是過去的的時間就是nack重傳包。
WebRTC中丟包重傳機制的實現
當網路質量突然變的很差並開始丟包時,聲音聽起來音質會變差,畫面幀速會下降,甚至會完全卡住。我們可能需要某種機制來應對這種情況。在webrtc中,主要有兩種機制來應該網路變差的情況 前向糾錯 在每個資料報中,您將新增一些關於前乙個資訊的資訊,以防丟失,您需要重新構建它們 flexfec是webrtc ...
poj 3660 floyd判定名次 傳遞閉包
要求 n個牛,每個牛有乙個不同的rank,且1 rank n,m個條件,每個條件有兩個數字,代表兩個牛的序號,表示前乙個牛比後乙個牛的rank大。條件不會自相矛盾。問能確定幾個牛具體的rank值。方法 floyd 1.一頭牛若被lose頭牛打敗,戰勝win頭牛,且lose win n 1,即可確定r...
如何判定乙個TCP應答包為dupack?
首先需要明白tcp包中的sequence和ack sequence的含義 1.sequence 是表示傳送方的當前包的起始資料序列號 2.ack sequence則是表示對接收方的應答序列號,它是指對方下乙個包要使用的起始sequence。上一接收包的sequence加上len之後的值 那麼再來看什...