mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
Fix crash when process rtcp feedback message. v5.0.159, v6.0.52 (#3591)
--------- Co-authored-by: johzzy <hellojinqiang@gmail.com>
This commit is contained in:
parent
7f997b39ae
commit
113a3dd85e
8 changed files with 60 additions and 67 deletions
|
@ -717,10 +717,6 @@ void SrsRtcpTWCC::clear()
|
|||
next_base_sn_ = 0;
|
||||
}
|
||||
|
||||
uint32_t SrsRtcpTWCC::get_media_ssrc() const
|
||||
{
|
||||
return media_ssrc_;
|
||||
}
|
||||
uint16_t SrsRtcpTWCC::get_base_sn() const
|
||||
{
|
||||
return base_sn_;
|
||||
|
@ -746,10 +742,6 @@ vector<uint16_t> SrsRtcpTWCC::get_recv_deltas() const
|
|||
return pkt_deltas_;
|
||||
}
|
||||
|
||||
void SrsRtcpTWCC::set_media_ssrc(uint32_t ssrc)
|
||||
{
|
||||
media_ssrc_ = ssrc;
|
||||
}
|
||||
void SrsRtcpTWCC::set_base_sn(uint16_t sn)
|
||||
{
|
||||
base_sn_ = sn;
|
||||
|
@ -1217,11 +1209,6 @@ SrsRtcpNack::~SrsRtcpNack()
|
|||
{
|
||||
}
|
||||
|
||||
uint32_t SrsRtcpNack::get_media_ssrc() const
|
||||
{
|
||||
return media_ssrc_;
|
||||
}
|
||||
|
||||
vector<uint16_t> SrsRtcpNack::get_lost_sns() const
|
||||
{
|
||||
vector<uint16_t> sn;
|
||||
|
@ -1236,11 +1223,6 @@ bool SrsRtcpNack::empty()
|
|||
return lost_sns_.empty();
|
||||
}
|
||||
|
||||
void SrsRtcpNack::set_media_ssrc(uint32_t ssrc)
|
||||
{
|
||||
media_ssrc_ = ssrc;
|
||||
}
|
||||
|
||||
void SrsRtcpNack::add_lost_sn(uint16_t sn)
|
||||
{
|
||||
lost_sns_.insert(sn);
|
||||
|
@ -1377,7 +1359,7 @@ srs_error_t SrsRtcpNack::encode(SrsBuffer *buffer)
|
|||
return err;
|
||||
}
|
||||
|
||||
SrsRtcpPsfbCommon::SrsRtcpPsfbCommon()
|
||||
SrsRtcpFbCommon::SrsRtcpFbCommon()
|
||||
{
|
||||
header_.padding = 0;
|
||||
header_.type = SrsRtcpType_psfb;
|
||||
|
@ -1386,22 +1368,22 @@ SrsRtcpPsfbCommon::SrsRtcpPsfbCommon()
|
|||
//ssrc_ = sender_ssrc;
|
||||
}
|
||||
|
||||
SrsRtcpPsfbCommon::~SrsRtcpPsfbCommon()
|
||||
SrsRtcpFbCommon::~SrsRtcpFbCommon()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
uint32_t SrsRtcpPsfbCommon::get_media_ssrc() const
|
||||
uint32_t SrsRtcpFbCommon::get_media_ssrc() const
|
||||
{
|
||||
return media_ssrc_;
|
||||
}
|
||||
|
||||
void SrsRtcpPsfbCommon::set_media_ssrc(uint32_t ssrc)
|
||||
void SrsRtcpFbCommon::set_media_ssrc(uint32_t ssrc)
|
||||
{
|
||||
media_ssrc_ = ssrc;
|
||||
}
|
||||
|
||||
srs_error_t SrsRtcpPsfbCommon::decode(SrsBuffer *buffer)
|
||||
srs_error_t SrsRtcpFbCommon::decode(SrsBuffer *buffer)
|
||||
{
|
||||
/*
|
||||
@doc: https://tools.ietf.org/html/rfc4585#section-6.1
|
||||
|
@ -1432,12 +1414,12 @@ srs_error_t SrsRtcpPsfbCommon::decode(SrsBuffer *buffer)
|
|||
return err;
|
||||
}
|
||||
|
||||
uint64_t SrsRtcpPsfbCommon::nb_bytes()
|
||||
uint64_t SrsRtcpFbCommon::nb_bytes()
|
||||
{
|
||||
return kRtcpPacketSize;
|
||||
}
|
||||
|
||||
srs_error_t SrsRtcpPsfbCommon::encode(SrsBuffer *buffer)
|
||||
srs_error_t SrsRtcpFbCommon::encode(SrsBuffer *buffer)
|
||||
{
|
||||
return srs_error_new(ERROR_RTC_RTCP, "not support");
|
||||
}
|
||||
|
@ -1762,6 +1744,9 @@ srs_error_t SrsRtcpCompound::decode(SrsBuffer *buffer)
|
|||
} else if (15 == header->rc) {
|
||||
//twcc
|
||||
rtcp = new SrsRtcpTWCC();
|
||||
} else {
|
||||
// common fb
|
||||
rtcp = new SrsRtcpFbCommon();
|
||||
}
|
||||
} else if(header->type == SrsRtcpType_psfb) {
|
||||
if(1 == header->rc) {
|
||||
|
@ -1775,7 +1760,7 @@ srs_error_t SrsRtcpCompound::decode(SrsBuffer *buffer)
|
|||
rtcp = new SrsRtcpRpsi();
|
||||
} else {
|
||||
// common psfb
|
||||
rtcp = new SrsRtcpPsfbCommon();
|
||||
rtcp = new SrsRtcpFbCommon();
|
||||
}
|
||||
} else if(header->type == SrsRtcpType_xr) {
|
||||
rtcp = new SrsRtcpXr();
|
||||
|
|
|
@ -206,6 +206,28 @@ public:
|
|||
|
||||
};
|
||||
|
||||
// @doc: https://tools.ietf.org/html/rfc4585#section-6.1
|
||||
// As RFC 4585 says, all FB messages MUST use a common packet format,
|
||||
// inlucde Transport layer FB message and Payload-specific FB message.
|
||||
class SrsRtcpFbCommon : public SrsRtcpCommon
|
||||
{
|
||||
protected:
|
||||
uint32_t media_ssrc_;
|
||||
public:
|
||||
SrsRtcpFbCommon();
|
||||
virtual ~SrsRtcpFbCommon();
|
||||
|
||||
uint32_t get_media_ssrc() const;
|
||||
void set_media_ssrc(uint32_t ssrc);
|
||||
|
||||
// interface ISrsCodec
|
||||
public:
|
||||
virtual srs_error_t decode(SrsBuffer *buffer);
|
||||
virtual uint64_t nb_bytes();
|
||||
virtual srs_error_t encode(SrsBuffer *buffer);
|
||||
};
|
||||
|
||||
|
||||
// The Message format of TWCC, @see https://tools.ietf.org/html/draft-holmer-rmcat-transport-wide-cc-extensions-01#section-3.1
|
||||
// 0 1 2 3
|
||||
// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
|
@ -247,10 +269,9 @@ public:
|
|||
#define kTwccFbLargeRecvDeltaBytes 2
|
||||
#define kTwccFbMaxBitElements kTwccFbOneBitElements
|
||||
|
||||
class SrsRtcpTWCC : public SrsRtcpCommon
|
||||
class SrsRtcpTWCC : public SrsRtcpFbCommon
|
||||
{
|
||||
private:
|
||||
uint32_t media_ssrc_;
|
||||
uint16_t base_sn_;
|
||||
int32_t reference_time_;
|
||||
uint8_t fb_pkt_count_;
|
||||
|
@ -286,14 +307,12 @@ public:
|
|||
SrsRtcpTWCC(uint32_t sender_ssrc = 0);
|
||||
virtual ~SrsRtcpTWCC();
|
||||
|
||||
uint32_t get_media_ssrc() const;
|
||||
uint16_t get_base_sn() const;
|
||||
uint32_t get_reference_time() const;
|
||||
uint8_t get_feedback_count() const;
|
||||
std::vector<uint16_t> get_packet_chucks() const;
|
||||
std::vector<uint16_t> get_recv_deltas() const;
|
||||
|
||||
void set_media_ssrc(uint32_t ssrc);
|
||||
void set_base_sn(uint16_t sn);
|
||||
void set_reference_time(uint32_t time);
|
||||
void set_feedback_count(uint8_t count);
|
||||
|
@ -312,7 +331,7 @@ private:
|
|||
srs_error_t do_encode(SrsBuffer *buffer);
|
||||
};
|
||||
|
||||
class SrsRtcpNack : public SrsRtcpCommon
|
||||
class SrsRtcpNack : public SrsRtcpFbCommon
|
||||
{
|
||||
private:
|
||||
struct SrsPidBlp {
|
||||
|
@ -321,17 +340,14 @@ private:
|
|||
bool in_use;
|
||||
};
|
||||
|
||||
uint32_t media_ssrc_;
|
||||
std::set<uint16_t, SrsSeqCompareLess> lost_sns_;
|
||||
public:
|
||||
SrsRtcpNack(uint32_t sender_ssrc = 0);
|
||||
virtual ~SrsRtcpNack();
|
||||
|
||||
uint32_t get_media_ssrc() const;
|
||||
std::vector<uint16_t> get_lost_sns() const;
|
||||
bool empty();
|
||||
|
||||
void set_media_ssrc(uint32_t ssrc);
|
||||
void add_lost_sn(uint16_t sn);
|
||||
// interface ISrsCodec
|
||||
public:
|
||||
|
@ -340,25 +356,7 @@ public:
|
|||
virtual srs_error_t encode(SrsBuffer *buffer);
|
||||
};
|
||||
|
||||
class SrsRtcpPsfbCommon : public SrsRtcpCommon
|
||||
{
|
||||
protected:
|
||||
uint32_t media_ssrc_;
|
||||
public:
|
||||
SrsRtcpPsfbCommon();
|
||||
virtual ~SrsRtcpPsfbCommon();
|
||||
|
||||
uint32_t get_media_ssrc() const;
|
||||
void set_media_ssrc(uint32_t ssrc);
|
||||
|
||||
// interface ISrsCodec
|
||||
public:
|
||||
virtual srs_error_t decode(SrsBuffer *buffer);
|
||||
virtual uint64_t nb_bytes();
|
||||
virtual srs_error_t encode(SrsBuffer *buffer);
|
||||
};
|
||||
|
||||
class SrsRtcpPli : public SrsRtcpPsfbCommon
|
||||
class SrsRtcpPli : public SrsRtcpFbCommon
|
||||
{
|
||||
public:
|
||||
SrsRtcpPli(uint32_t sender_ssrc = 0);
|
||||
|
@ -371,7 +369,7 @@ public:
|
|||
virtual srs_error_t encode(SrsBuffer *buffer);
|
||||
};
|
||||
|
||||
class SrsRtcpSli : public SrsRtcpPsfbCommon
|
||||
class SrsRtcpSli : public SrsRtcpFbCommon
|
||||
{
|
||||
private:
|
||||
uint16_t first_;
|
||||
|
@ -388,7 +386,7 @@ public:
|
|||
virtual srs_error_t encode(SrsBuffer *buffer);
|
||||
};
|
||||
|
||||
class SrsRtcpRpsi : public SrsRtcpPsfbCommon
|
||||
class SrsRtcpRpsi : public SrsRtcpFbCommon
|
||||
{
|
||||
private:
|
||||
uint8_t pb_;
|
||||
|
@ -407,7 +405,7 @@ public:
|
|||
virtual srs_error_t encode(SrsBuffer *buffer);
|
||||
};
|
||||
|
||||
class SrsRtcpXr : public SrsRtcpCommon
|
||||
class SrsRtcpXr : public SrsRtcpFbCommon
|
||||
{
|
||||
public:
|
||||
SrsRtcpXr (uint32_t ssrc = 0);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue