Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Z
ZLMediaKit
概览
Overview
Details
Activity
Cycle Analytics
版本库
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
问题
0
Issues
0
列表
Board
标记
里程碑
合并请求
0
Merge Requests
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
Snippets
成员
Collapse sidebar
Close sidebar
活动
图像
聊天
创建新问题
作业
提交
Issue Boards
Open sidebar
张翔宇
ZLMediaKit
Commits
fcf641df
Commit
fcf641df
authored
Oct 17, 2020
by
xiongziliang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
优化rtp排序算法
parent
29652483
全部展开
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
49 行增加
和
9 行删除
+49
-9
src/Rtsp/RtpReceiver.h
+49
-9
tests/test_sortor.cpp
+0
-0
没有找到文件。
src/Rtsp/RtpReceiver.h
查看文件 @
fcf641df
...
...
@@ -61,33 +61,75 @@ public:
* @param packet 包负载
*/
void
sortPacket
(
SEQ
seq
,
T
packet
)
{
if
(
seq
<
_next_seq_out
&&
_next_seq_out
-
seq
>
kMax
)
{
//回环
++
_seq_cycle_count
;
if
(
seq
<
_next_seq_out
)
{
if
(
_next_seq_out
-
seq
<
kMax
)
{
//过滤seq回退包(回环包除外)
return
;
}
}
else
if
(
_next_seq_out
&&
seq
-
_next_seq_out
>
(
0xFFFF
>>
1
))
{
//过滤seq跳变非常大的包(防止回环时乱序时收到非常大的seq)
return
;
}
//放入排序缓存
_rtp_sort_cache_map
.
emplace
(
seq
,
std
::
move
(
packet
));
//尝试输出排序后的包
tryPopPacket
();
}
void
flush
(){
//清空缓存
while
(
!
_rtp_sort_cache_map
.
empty
())
{
popIterator
(
_rtp_sort_cache_map
.
begin
());
}
}
private
:
void
popPacket
()
{
auto
it
=
_rtp_sort_cache_map
.
begin
();
if
(
it
->
first
>=
_next_seq_out
)
{
//过滤回跳包
popIterator
(
it
);
return
;
}
if
(
_next_seq_out
-
it
->
first
>
(
0xFFFF
>>
1
))
{
//产生回环了
if
(
_rtp_sort_cache_map
.
size
()
<
2
*
kMin
)
{
//等足够多的数据后才处理回环, 因为后面还可能出现大的SEQ
return
;
}
++
_seq_cycle_count
;
//找到大的SEQ并清空掉,然后从小的SEQ重新开始排序
auto
hit
=
_rtp_sort_cache_map
.
upper_bound
((
SEQ
)
(
_next_seq_out
-
_rtp_sort_cache_map
.
size
()));
while
(
hit
!=
_rtp_sort_cache_map
.
end
())
{
//回环前,清空剩余的大的SEQ的数据
_cb
(
hit
->
first
,
hit
->
second
);
hit
=
_rtp_sort_cache_map
.
erase
(
hit
);
}
//下一个回环的数据
popIterator
(
_rtp_sort_cache_map
.
begin
());
return
;
}
//删除回跳的数据包
_rtp_sort_cache_map
.
erase
(
it
);
}
void
popIterator
(
typename
map
<
SEQ
,
T
>::
iterator
it
)
{
_cb
(
it
->
first
,
it
->
second
);
_next_seq_out
=
it
->
first
+
1
;
_rtp_sort_cache_map
.
erase
(
it
);
}
void
tryPopPacket
()
{
bool
flag
=
false
;
int
count
=
0
;
while
((
!
_rtp_sort_cache_map
.
empty
()
&&
_rtp_sort_cache_map
.
begin
()
->
first
==
_next_seq_out
))
{
//找到下个包,直接输出
popPacket
();
flag
=
true
;
++
count
;
}
if
(
flag
)
{
if
(
count
)
{
setSortSize
();
}
else
if
(
_rtp_sort_cache_map
.
size
()
>
_max_sort_size
)
{
//排序缓存溢出,不再继续排序
...
...
@@ -97,11 +139,9 @@ private:
}
void
setSortSize
()
{
_max_sort_size
=
2
*
_rtp_sort_cache_map
.
size
();
_max_sort_size
=
kMin
+
_rtp_sort_cache_map
.
size
();
if
(
_max_sort_size
>
kMax
)
{
_max_sort_size
=
kMax
;
}
else
if
(
_max_sort_size
<
kMin
)
{
_max_sort_size
=
kMin
;
}
}
...
...
tests/test_sortor.cpp
查看文件 @
fcf641df
差异被折叠。
点击展开。
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论