Ai
10 Star 41 Fork 20

Gitee 极速下载/Pion-WebRTC

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
此仓库是为了提升国内下载速度的镜像仓库,每日同步一次。 原始仓库: https://github.com/pion/webrtc
克隆/下载
payload_queue.go 2.10 KB
一键复制 编辑 原始数据 按行查看 历史
backkem 提交于 2018-09-25 03:01 +08:00 . SCTP: Notifier & Initialization
package sctp
import (
"sort"
)
type payloadDataArray []*chunkPayloadData
func (s payloadDataArray) search(tsn uint32) (*chunkPayloadData, bool) {
i := sort.Search(len(s), func(i int) bool {
return s[i].tsn >= tsn
})
if i < len(s) && s[i].tsn == tsn {
return s[i], true
}
return nil, false
}
func (s payloadDataArray) sort() {
sort.Slice(s, func(i, j int) bool { return s[i].tsn < s[j].tsn })
}
type payloadQueue struct {
orderedPackets payloadDataArray
dupTSN []uint32
}
func (r *payloadQueue) pushNoCheck(p *chunkPayloadData) {
r.orderedPackets = append(r.orderedPackets, p)
r.orderedPackets.sort()
}
func (r *payloadQueue) push(p *chunkPayloadData, cumulativeTSN uint32) {
_, ok := r.orderedPackets.search(p.tsn)
// If the Data payload is already in our queue or older than our cumulativeTSN marker
if ok || p.tsn <= cumulativeTSN {
// Found the packet, log in dups
r.dupTSN = append(r.dupTSN, p.tsn)
return
}
r.orderedPackets = append(r.orderedPackets, p)
r.orderedPackets.sort()
}
func (r *payloadQueue) pop(tsn uint32) (*chunkPayloadData, bool) {
if len(r.orderedPackets) > 0 && tsn == r.orderedPackets[0].tsn {
pd := r.orderedPackets[0]
r.orderedPackets = r.orderedPackets[1:]
return pd, true
}
return nil, false
}
func (r *payloadQueue) get(tsn uint32) (*chunkPayloadData, bool) {
return r.orderedPackets.search(tsn)
}
func (r *payloadQueue) popDuplicates() []uint32 {
dups := r.dupTSN
r.dupTSN = []uint32{}
return dups
}
func (r *payloadQueue) getGapAckBlocks(cumulativeTSN uint32) (gapAckBlocks []gapAckBlock) {
var b gapAckBlock
if len(r.orderedPackets) == 0 {
return []gapAckBlock{}
}
for i, p := range r.orderedPackets {
if i == 0 {
b.start = uint16(r.orderedPackets[0].tsn - cumulativeTSN)
b.end = b.start
continue
}
diff := uint16(p.tsn - cumulativeTSN)
if b.end+1 == diff {
b.end++
} else {
gapAckBlocks = append(gapAckBlocks, gapAckBlock{
start: b.start,
end: b.end,
})
b.start = diff
b.end = diff
}
}
gapAckBlocks = append(gapAckBlocks, gapAckBlock{
start: b.start,
end: b.end,
})
return gapAckBlocks
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/mirrors/Pion-WebRTC.git
git@gitee.com:mirrors/Pion-WebRTC.git
mirrors
Pion-WebRTC
Pion-WebRTC
v1.1.1

搜索帮助