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
ba5ca8f5
Commit
ba5ca8f5
authored
3 years ago
by
xiongziliang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
修复rtp seq重复导致rtp nack重传列队异常的bug
parent
7a5cf925
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
38 行增加
和
21 行删除
+38
-21
webrtc/Nack.cpp
+30
-14
webrtc/Nack.h
+6
-5
webrtc/WebRtcTransport.cpp
+2
-2
没有找到文件。
webrtc/Nack.cpp
查看文件 @
ba5ca8f5
...
@@ -16,22 +16,22 @@ using namespace mediakit;
...
@@ -16,22 +16,22 @@ using namespace mediakit;
static
constexpr
uint32_t
kMaxNackMS
=
10
*
1000
;
static
constexpr
uint32_t
kMaxNackMS
=
10
*
1000
;
void
NackList
::
push
_b
ack
(
RtpPacket
::
Ptr
rtp
)
{
void
NackList
::
push
B
ack
(
RtpPacket
::
Ptr
rtp
)
{
auto
seq
=
rtp
->
getSeq
();
auto
seq
=
rtp
->
getSeq
();
_nack_cache_seq
.
emplace_back
(
seq
);
_nack_cache_seq
.
emplace_back
(
seq
);
_nack_cache_pkt
.
emplace
(
seq
,
std
::
move
(
rtp
));
_nack_cache_pkt
.
emplace
(
seq
,
std
::
move
(
rtp
));
while
(
get
_cache_ms
()
>
kMaxNackMS
)
{
while
(
get
CacheMS
()
>
kMaxNackMS
)
{
//需要清除部分nack缓存
//需要清除部分nack缓存
pop
_f
ront
();
pop
F
ront
();
}
}
}
}
void
NackList
::
for
_each_nack
(
const
FCI_NACK
&
nack
,
const
function
<
void
(
const
RtpPacket
::
Ptr
&
rtp
)
>
&
func
)
{
void
NackList
::
for
Each
(
const
FCI_NACK
&
nack
,
const
function
<
void
(
const
RtpPacket
::
Ptr
&
rtp
)
>
&
func
)
{
auto
seq
=
nack
.
getPid
();
auto
seq
=
nack
.
getPid
();
for
(
auto
bit
:
nack
.
getBitArray
())
{
for
(
auto
bit
:
nack
.
getBitArray
())
{
if
(
bit
)
{
if
(
bit
)
{
//丢包
//丢包
RtpPacket
::
Ptr
*
ptr
=
get
_r
tp
(
seq
);
RtpPacket
::
Ptr
*
ptr
=
get
R
tp
(
seq
);
if
(
ptr
)
{
if
(
ptr
)
{
func
(
*
ptr
);
func
(
*
ptr
);
}
}
...
@@ -40,7 +40,7 @@ void NackList::for_each_nack(const FCI_NACK &nack, const function<void(const Rtp
...
@@ -40,7 +40,7 @@ void NackList::for_each_nack(const FCI_NACK &nack, const function<void(const Rtp
}
}
}
}
void
NackList
::
pop
_f
ront
()
{
void
NackList
::
pop
F
ront
()
{
if
(
_nack_cache_seq
.
empty
())
{
if
(
_nack_cache_seq
.
empty
())
{
return
;
return
;
}
}
...
@@ -48,7 +48,7 @@ void NackList::pop_front() {
...
@@ -48,7 +48,7 @@ void NackList::pop_front() {
_nack_cache_seq
.
pop_front
();
_nack_cache_seq
.
pop_front
();
}
}
RtpPacket
::
Ptr
*
NackList
::
get
_r
tp
(
uint16_t
seq
)
{
RtpPacket
::
Ptr
*
NackList
::
get
R
tp
(
uint16_t
seq
)
{
auto
it
=
_nack_cache_pkt
.
find
(
seq
);
auto
it
=
_nack_cache_pkt
.
find
(
seq
);
if
(
it
==
_nack_cache_pkt
.
end
())
{
if
(
it
==
_nack_cache_pkt
.
end
())
{
return
nullptr
;
return
nullptr
;
...
@@ -56,19 +56,35 @@ RtpPacket::Ptr *NackList::get_rtp(uint16_t seq) {
...
@@ -56,19 +56,35 @@ RtpPacket::Ptr *NackList::get_rtp(uint16_t seq) {
return
&
it
->
second
;
return
&
it
->
second
;
}
}
uint32_t
NackList
::
get_cache_ms
()
{
uint32_t
NackList
::
getCacheMS
()
{
if
(
_nack_cache_seq
.
size
()
<
2
)
{
auto
back_stamp
=
getRtpStamp
(
_nack_cache_seq
.
back
());
if
(
back_stamp
==
-
1
)
{
_nack_cache_seq
.
pop_back
();
return
0
;
return
0
;
}
}
uint32_t
back
=
_nack_cache_pkt
[
_nack_cache_seq
.
back
()]
->
getStampMS
(
false
);
uint32_t
front
=
_nack_cache_pkt
[
_nack_cache_seq
.
front
()]
->
getStampMS
(
false
);
auto
front_stamp
=
getRtpStamp
(
_nack_cache_seq
.
front
());
if
(
back
>=
front
)
{
if
(
front_stamp
==
-
1
)
{
return
back
-
front
;
_nack_cache_seq
.
pop_front
();
return
0
;
}
if
(
back_stamp
>=
front_stamp
)
{
return
back_stamp
-
front_stamp
;
}
}
//很有可能回环了
//很有可能回环了
return
back
+
(
UINT32_MAX
-
front
);
return
back_stamp
+
(
UINT32_MAX
-
front_stamp
);
}
int64_t
NackList
::
getRtpStamp
(
uint16_t
seq
)
{
auto
it
=
_nack_cache_pkt
.
find
(
seq
);
if
(
it
==
_nack_cache_pkt
.
end
())
{
return
-
1
;
}
return
it
->
second
->
getStampMS
(
false
);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////
void
NackContext
::
received
(
uint16_t
seq
,
bool
is_rtx
)
{
void
NackContext
::
received
(
uint16_t
seq
,
bool
is_rtx
)
{
...
...
This diff is collapsed.
Click to expand it.
webrtc/Nack.h
查看文件 @
ba5ca8f5
...
@@ -20,13 +20,14 @@ public:
...
@@ -20,13 +20,14 @@ public:
NackList
()
=
default
;
NackList
()
=
default
;
~
NackList
()
=
default
;
~
NackList
()
=
default
;
void
push
_b
ack
(
mediakit
::
RtpPacket
::
Ptr
rtp
);
void
push
B
ack
(
mediakit
::
RtpPacket
::
Ptr
rtp
);
void
for
_each_nack
(
const
mediakit
::
FCI_NACK
&
nack
,
const
std
::
function
<
void
(
const
mediakit
::
RtpPacket
::
Ptr
&
rtp
)
>
&
cb
);
void
for
Each
(
const
mediakit
::
FCI_NACK
&
nack
,
const
std
::
function
<
void
(
const
mediakit
::
RtpPacket
::
Ptr
&
rtp
)
>
&
cb
);
private
:
private
:
void
pop_front
();
void
popFront
();
uint32_t
get_cache_ms
();
uint32_t
getCacheMS
();
mediakit
::
RtpPacket
::
Ptr
*
get_rtp
(
uint16_t
seq
);
int64_t
getRtpStamp
(
uint16_t
seq
);
mediakit
::
RtpPacket
::
Ptr
*
getRtp
(
uint16_t
seq
);
private
:
private
:
std
::
deque
<
uint16_t
>
_nack_cache_seq
;
std
::
deque
<
uint16_t
>
_nack_cache_seq
;
...
...
This diff is collapsed.
Click to expand it.
webrtc/WebRtcTransport.cpp
查看文件 @
ba5ca8f5
...
@@ -652,7 +652,7 @@ void WebRtcTransportImp::onRtcp(const char *buf, size_t len) {
...
@@ -652,7 +652,7 @@ void WebRtcTransportImp::onRtcp(const char *buf, size_t len) {
}
}
auto
&
track
=
it
->
second
;
auto
&
track
=
it
->
second
;
auto
&
fci
=
fb
->
getFci
<
FCI_NACK
>
();
auto
&
fci
=
fb
->
getFci
<
FCI_NACK
>
();
track
->
nack_list
.
for
_each_nack
(
fci
,
[
&
](
const
RtpPacket
::
Ptr
&
rtp
)
{
track
->
nack_list
.
for
Each
(
fci
,
[
&
](
const
RtpPacket
::
Ptr
&
rtp
)
{
//rtp重传
//rtp重传
onSendRtp
(
rtp
,
true
,
true
);
onSendRtp
(
rtp
,
true
,
true
);
});
});
...
@@ -807,7 +807,7 @@ void WebRtcTransportImp::onSendRtp(const RtpPacket::Ptr &rtp, bool flush, bool r
...
@@ -807,7 +807,7 @@ void WebRtcTransportImp::onSendRtp(const RtpPacket::Ptr &rtp, bool flush, bool r
if
(
!
rtx
)
{
if
(
!
rtx
)
{
//统计rtp发送情况,好做sr汇报
//统计rtp发送情况,好做sr汇报
track
->
rtcp_context_send
->
onRtp
(
rtp
->
getSeq
(),
rtp
->
getStamp
(),
rtp
->
ntp_stamp
,
rtp
->
sample_rate
,
rtp
->
size
()
-
RtpPacket
::
kRtpTcpHeaderSize
);
track
->
rtcp_context_send
->
onRtp
(
rtp
->
getSeq
(),
rtp
->
getStamp
(),
rtp
->
ntp_stamp
,
rtp
->
sample_rate
,
rtp
->
size
()
-
RtpPacket
::
kRtpTcpHeaderSize
);
track
->
nack_list
.
push
_b
ack
(
rtp
);
track
->
nack_list
.
push
B
ack
(
rtp
);
#if 0
#if 0
//此处模拟发送丢包
//此处模拟发送丢包
if (rtp->type == TrackVideo && rtp->getSeq() % 100 == 0) {
if (rtp->type == TrackVideo && rtp->getSeq() % 100 == 0) {
...
...
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论