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:
parent
f3d8973d67
commit
8f1af9a13a
2 changed files with 819 additions and 72 deletions
File diff suppressed because it is too large
Load diff
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue