修复webrtc rtx包计入receiver report统计导致simulcast推流失效的问题

This commit is contained in:
ziyue 2021-07-14 21:39:30 +08:00
parent 6bc39058ab
commit 6ddd420f1c
4 changed files with 17 additions and 27 deletions

View File

@ -36,7 +36,7 @@ public:
~RtpReceiverImp() override = default; ~RtpReceiverImp() override = default;
bool inputRtp(TrackType type, uint8_t *ptr, size_t len){ bool inputRtp(TrackType type, uint8_t *ptr, size_t len){
return RtpTrack::inputRtp(type, _sample_rate, ptr, len); return RtpTrack::inputRtp(type, _sample_rate, ptr, len).operator bool();
} }
private: private:

View File

@ -31,18 +31,18 @@ void RtpTrack::clear() {
PacketSortor<RtpPacket::Ptr>::clear(); PacketSortor<RtpPacket::Ptr>::clear();
} }
bool RtpTrack::inputRtp(TrackType type, int sample_rate, uint8_t *ptr, size_t len) { RtpPacket::Ptr RtpTrack::inputRtp(TrackType type, int sample_rate, uint8_t *ptr, size_t len) {
if (len < RtpPacket::kRtpHeaderSize) { if (len < RtpPacket::kRtpHeaderSize) {
WarnL << "rtp包太小:" << len; WarnL << "rtp包太小:" << len;
return false; return nullptr;
} }
if (len > RTP_MAX_SIZE) { if (len > RTP_MAX_SIZE) {
WarnL << "超大的rtp包:" << len << " > " << RTP_MAX_SIZE; WarnL << "超大的rtp包:" << len << " > " << RTP_MAX_SIZE;
return false; return nullptr;
} }
if (!sample_rate) { if (!sample_rate) {
//无法把时间戳转换成毫秒 //无法把时间戳转换成毫秒
return false; return nullptr;
} }
RtpHeader *header = (RtpHeader *) ptr; RtpHeader *header = (RtpHeader *) ptr;
if (header->version != RtpPacket::kRtpVersion) { if (header->version != RtpPacket::kRtpVersion) {
@ -50,7 +50,7 @@ bool RtpTrack::inputRtp(TrackType type, int sample_rate, uint8_t *ptr, size_t le
} }
if (!header->getPayloadSize(len)) { if (!header->getPayloadSize(len)) {
//无有效负载的rtp包 //无有效负载的rtp包
return false; return nullptr;
} }
//比对缓存ssrc //比对缓存ssrc
@ -68,7 +68,7 @@ bool RtpTrack::inputRtp(TrackType type, int sample_rate, uint8_t *ptr, size_t le
if (_ssrc_alive.elapsedTime() < 3 * 1000) { if (_ssrc_alive.elapsedTime() < 3 * 1000) {
//接受正确ssrc的rtp在10秒内那么我们认为存在多路rtp,忽略掉ssrc不匹配的rtp //接受正确ssrc的rtp在10秒内那么我们认为存在多路rtp,忽略掉ssrc不匹配的rtp
WarnL << "ssrc不匹配,rtp已丢弃:" << ssrc << " != " << _ssrc; WarnL << "ssrc不匹配,rtp已丢弃:" << ssrc << " != " << _ssrc;
return false; return nullptr;
} }
InfoL << "rtp流ssrc切换:" << _ssrc << " -> " << ssrc; InfoL << "rtp流ssrc切换:" << _ssrc << " -> " << ssrc;
_ssrc = ssrc; _ssrc = ssrc;
@ -90,14 +90,11 @@ bool RtpTrack::inputRtp(TrackType type, int sample_rate, uint8_t *ptr, size_t le
data[3] = len & 0xFF; data[3] = len & 0xFF;
//拷贝rtp //拷贝rtp
memcpy(&data[4], ptr, len); memcpy(&data[4], ptr, len);
//设置ntp时间戳 //设置ntp时间戳
rtp->ntp_stamp = _ntp_stamp.getNtpStamp(ntohl(rtp->getHeader()->stamp), sample_rate); rtp->ntp_stamp = _ntp_stamp.getNtpStamp(ntohl(rtp->getHeader()->stamp), sample_rate);
onBeforeRtpSorted(rtp); onBeforeRtpSorted(rtp);
auto seq = rtp->getSeq(); sortPacket(rtp->getSeq(), rtp);
sortPacket(seq, std::move(rtp)); return rtp;
return true;
} }
void RtpTrack::setNtpStamp(uint32_t rtp_stamp, uint32_t sample_rate, uint64_t ntp_stamp_ms){ void RtpTrack::setNtpStamp(uint32_t rtp_stamp, uint32_t sample_rate, uint64_t ntp_stamp_ms){

View File

@ -175,7 +175,7 @@ public:
void clear(); void clear();
uint32_t getSSRC() const; uint32_t getSSRC() const;
bool inputRtp(TrackType type, int sample_rate, uint8_t *ptr, size_t len); RtpPacket::Ptr inputRtp(TrackType type, int sample_rate, uint8_t *ptr, size_t len);
void setNtpStamp(uint32_t rtp_stamp, uint32_t sample_rate, uint64_t ntp_stamp_ms); void setNtpStamp(uint32_t rtp_stamp, uint32_t sample_rate, uint64_t ntp_stamp_ms);
protected: protected:
@ -236,7 +236,7 @@ public:
* @return true * @return true
*/ */
bool handleOneRtp(int index, TrackType type, int sample_rate, uint8_t *ptr, size_t len){ bool handleOneRtp(int index, TrackType type, int sample_rate, uint8_t *ptr, size_t len){
return _track[index].inputRtp(type, sample_rate, ptr, len); return _track[index].inputRtp(type, sample_rate, ptr, len).operator bool();
} }
/** /**

View File

@ -594,14 +594,15 @@ public:
~RtpChannel() override = default; ~RtpChannel() override = default;
bool inputRtp(TrackType type, int sample_rate, uint8_t *ptr, size_t len, bool is_rtx){ RtpPacket::Ptr inputRtp(TrackType type, int sample_rate, uint8_t *ptr, size_t len, bool is_rtx) {
if (!is_rtx) { auto rtp = RtpTrack::inputRtp(type, sample_rate, ptr, len);
RtpHeader *rtp = (RtpHeader *) ptr; if (!is_rtx && rtp) {
auto seq = ntohs(rtp->seq);
//统计rtp接受情况便于生成nack rtcp包 //统计rtp接受情况便于生成nack rtcp包
auto seq = rtp->getSeq();
_nack_ctx.received(seq); _nack_ctx.received(seq);
_rtcp_context.onRtp(seq, rtp->getStamp(), rtp->ntp_stamp, sample_rate, len);
} }
return RtpTrack::inputRtp(type, sample_rate, ptr, len); return rtp;
} }
Buffer::Ptr createRtcpRR(RtcpHeader *sr, uint32_t ssrc) { Buffer::Ptr createRtcpRR(RtcpHeader *sr, uint32_t ssrc) {
@ -609,14 +610,6 @@ public:
return _rtcp_context.createRtcpRR(ssrc, getSSRC()); return _rtcp_context.createRtcpRR(ssrc, getSSRC());
} }
protected:
void onBeforeRtpSorted(const RtpPacket::Ptr &rtp) override {
//统计rtp收到的情况好做rr汇报
_rtcp_context.onRtp(rtp->getSeq(), rtp->getStamp(), rtp->ntp_stamp, rtp->sample_rate,
rtp->size() - RtpPacket::kRtpTcpHeaderSize);
RtpTrackImp::onBeforeRtpSorted(rtp);
}
private: private:
NackContext _nack_ctx; NackContext _nack_ctx;
RtcpContext _rtcp_context{true}; RtcpContext _rtcp_context{true};