1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

RTP: Refine RTCP protocol

This commit is contained in:
winlin 2020-08-10 17:48:53 +08:00
parent f3d8973d67
commit 8f1af9a13a
2 changed files with 819 additions and 72 deletions

File diff suppressed because it is too large Load diff

View file

@ -50,6 +50,12 @@ enum SrsRtcpType
SrsRtcpType_xr = 207,
};
// @see: https://tools.ietf.org/html/rfc4585#section-6.3
const uint8_t kPLI = 1;
const uint8_t kSLI = 2;
const uint8_t kRPSI = 3;
const uint8_t kAFB = 15;
// RTCP Header, @see http://tools.ietf.org/html/rfc3550#section-6.1
// @remark The header must be 4 bytes, which align with the max field size 2B.
struct SrsRtcpHeader
@ -66,8 +72,12 @@ class SrsRtcpCommon: public ISrsCodec
{
protected:
SrsRtcpHeader header_;
uint32_t ssrc_;
uint8_t payload_[kRtcpPacketSize];
int payload_len_;
char* data_;
int nb_data_;
protected:
srs_error_t decode_header(SrsBuffer *buffer);
srs_error_t encode_header(SrsBuffer *buffer);
@ -75,6 +85,13 @@ public:
SrsRtcpCommon();
virtual ~SrsRtcpCommon();
virtual uint8_t type() const;
virtual uint8_t get_rc() const;
uint32_t get_ssrc();
void set_ssrc(uint32_t ssrc);
char* data();
int size();
// interface ISrsCodec
public:
virtual srs_error_t decode(SrsBuffer *buffer);
@ -85,7 +102,6 @@ public:
class SrsRtcpApp : public SrsRtcpCommon
{
private:
uint32_t ssrc_;
uint8_t name_[4];
public:
SrsRtcpApp();
@ -95,12 +111,10 @@ public:
virtual uint8_t type() const;
uint32_t get_ssrc() const;
uint8_t get_subtype() const;
std::string get_name() const;
srs_error_t get_payload(uint8_t*& payload, int& len);
void set_ssrc(uint32_t ssrc);
srs_error_t set_subtype(uint8_t type);
srs_error_t set_name(std::string name);
srs_error_t set_payload(uint8_t* payload, int len);
@ -125,11 +139,11 @@ struct SrsRtcpRB
class SrsRtcpSR : public SrsRtcpCommon
{
private:
uint32_t sender_ssrc_;
uint64_t ntp_;
uint32_t rtp_ts_;
uint32_t send_rtp_packets_;
uint32_t send_rtp_bytes_;
public:
SrsRtcpSR();
virtual ~SrsRtcpSR();
@ -137,13 +151,11 @@ public:
uint8_t get_rc() const;
// overload SrsRtcpCommon
virtual uint8_t type() const;
uint32_t get_sender_ssrc() const;
uint64_t get_ntp() const;
uint32_t get_rtp_ts() const;
uint32_t get_rtp_send_packets() const;
uint32_t get_rtp_send_bytes() const;
void set_sender_ssrc(uint32_t ssrc);
void set_ntp(uint64_t ntp);
void set_rtp_ts(uint32_t ts);
void set_rtp_send_packets(uint32_t packets);
@ -158,7 +170,6 @@ public:
class SrsRtcpRR : public SrsRtcpCommon
{
private:
uint32_t sender_ssrc_;
SrsRtcpRB rb_;
public:
SrsRtcpRR(uint32_t sender_ssrc = 0);
@ -235,7 +246,6 @@ public:
class SrsRtcpTWCC : public SrsRtcpCommon
{
private:
uint32_t sender_ssrc_;
uint32_t media_ssrc_;
uint16_t base_sn_;
uint16_t packet_count_;
@ -289,6 +299,7 @@ public:
void add_recv_delta(uint16_t delta);
srs_error_t recv_packet(uint16_t sn, srs_utime_t ts);
// interface ISrsCodec
public:
virtual srs_error_t decode(SrsBuffer *buffer);
@ -307,7 +318,6 @@ private:
bool in_use;
};
uint32_t sender_ssrc_;
uint32_t media_ssrc_;
std::set<uint16_t, SrsSeqCompareLess> lost_sns_;
public:
@ -326,11 +336,93 @@ 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 int nb_bytes();
virtual srs_error_t encode(SrsBuffer *buffer);
};
class SrsRtcpPli : public SrsRtcpPsfbCommon
{
public:
SrsRtcpPli(uint32_t sender_ssrc = 0);
virtual ~SrsRtcpPli();
// interface ISrsCodec
public:
virtual srs_error_t decode(SrsBuffer *buffer);
virtual int nb_bytes();
virtual srs_error_t encode(SrsBuffer *buffer);
};
class SrsRtcpSli : public SrsRtcpPsfbCommon
{
private:
uint16_t first_;
uint16_t number_;
uint8_t picture_;
public:
SrsRtcpSli(uint32_t sender_ssrc = 0);
virtual ~SrsRtcpSli();
// interface ISrsCodec
public:
virtual srs_error_t decode(SrsBuffer *buffer);
virtual int nb_bytes();
virtual srs_error_t encode(SrsBuffer *buffer);
};
class SrsRtcpRpsi : public SrsRtcpPsfbCommon
{
private:
uint8_t pb_;
uint8_t payload_type_;
char* native_rpsi_;
int nb_native_rpsi_;
public:
SrsRtcpRpsi(uint32_t sender_ssrc = 0);
virtual ~SrsRtcpRpsi();
// interface ISrsCodec
public:
virtual srs_error_t decode(SrsBuffer *buffer);
virtual int nb_bytes();
virtual srs_error_t encode(SrsBuffer *buffer);
};
class SrsRtcpXr : public SrsRtcpCommon
{
public:
SrsRtcpXr (uint32_t ssrc = 0);
virtual ~SrsRtcpXr();
// interface ISrsCodec
public:
virtual srs_error_t decode(SrsBuffer *buffer);
virtual int nb_bytes();
virtual srs_error_t encode(SrsBuffer *buffer);
};
class SrsRtcpCompound : public ISrsCodec
{
private:
std::vector<SrsRtcpCommon*> rtcps_;
int nb_bytes_;
char* data_;
int nb_data_;
public:
SrsRtcpCompound();
virtual ~SrsRtcpCompound();
@ -338,6 +430,10 @@ public:
SrsRtcpCommon* get_next_rtcp();
srs_error_t add_rtcp(SrsRtcpCommon *rtcp);
void clear();
char* data();
int size();
// interface ISrsCodec
public:
virtual srs_error_t decode(SrsBuffer *buffer);