2020-05-15 03:50:59 +00:00
|
|
|
/**
|
|
|
|
* The MIT License (MIT)
|
|
|
|
*
|
|
|
|
* Copyright (c) 2013-2020 LiPeng
|
|
|
|
*
|
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
|
|
* this software and associated documentation files (the "Software"), to deal in
|
|
|
|
* the Software without restriction, including without limitation the rights to
|
|
|
|
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
|
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
|
|
|
* subject to the following conditions:
|
|
|
|
*
|
|
|
|
* The above copyright notice and this permission notice shall be included in all
|
|
|
|
* copies or substantial portions of the Software.
|
|
|
|
*
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
|
|
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
|
|
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
|
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
|
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
*/
|
2020-05-09 02:51:57 +00:00
|
|
|
|
2020-05-15 03:50:59 +00:00
|
|
|
#ifndef SRS_KERNEL_RTC_RTCP_HPP
|
|
|
|
#define SRS_KERNEL_RTC_RTCP_HPP
|
|
|
|
|
|
|
|
#include <srs_core.hpp>
|
2020-05-09 02:51:57 +00:00
|
|
|
|
|
|
|
#include <vector>
|
|
|
|
#include <set>
|
2020-05-15 03:50:59 +00:00
|
|
|
#include <map>
|
2020-05-09 02:51:57 +00:00
|
|
|
|
2020-05-19 09:49:34 +00:00
|
|
|
#include <srs_kernel_buffer.hpp>
|
|
|
|
#include <srs_kernel_rtc_rtp.hpp>
|
|
|
|
|
2020-05-15 03:50:59 +00:00
|
|
|
const int kRtcpPacketSize = 1500;
|
2020-05-09 02:51:57 +00:00
|
|
|
const uint8_t kRtcpVersion = 0x2;
|
|
|
|
|
2021-04-01 02:47:50 +00:00
|
|
|
// 1500 - 20(ip_header) - 8(udp_header)
|
|
|
|
const int kMaxUDPDataSize = 1472;
|
|
|
|
|
2020-05-15 04:03:43 +00:00
|
|
|
// RTCP Packet Types, @see http://www.networksorcery.com/enp/protocol/rtcp.htm
|
2020-05-19 09:49:34 +00:00
|
|
|
enum SrsRtcpType
|
|
|
|
{
|
2020-05-15 04:03:43 +00:00
|
|
|
SrsRtcpType_fir = 192,
|
|
|
|
SrsRtcpType_sr = 200,
|
|
|
|
SrsRtcpType_rr = 201,
|
|
|
|
SrsRtcpType_sdes = 202,
|
|
|
|
SrsRtcpType_bye = 203,
|
|
|
|
SrsRtcpType_app = 204,
|
|
|
|
SrsRtcpType_rtpfb = 205,
|
|
|
|
SrsRtcpType_psfb = 206,
|
|
|
|
SrsRtcpType_xr = 207,
|
|
|
|
};
|
|
|
|
|
2020-08-10 09:48:53 +00:00
|
|
|
// @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;
|
|
|
|
|
2020-05-15 04:03:43 +00:00
|
|
|
// RTCP Header, @see http://tools.ietf.org/html/rfc3550#section-6.1
|
2020-08-06 09:18:45 +00:00
|
|
|
// @remark The header must be 4 bytes, which align with the max field size 2B.
|
2020-05-15 04:03:43 +00:00
|
|
|
struct SrsRtcpHeader
|
2020-05-09 02:51:57 +00:00
|
|
|
{
|
|
|
|
uint16_t rc:5;
|
|
|
|
uint16_t padding:1;
|
|
|
|
uint16_t version:2;
|
|
|
|
uint16_t type:8;
|
|
|
|
|
|
|
|
uint16_t length:16;
|
2020-08-21 13:14:18 +00:00
|
|
|
|
|
|
|
SrsRtcpHeader() {
|
|
|
|
rc = 0;
|
|
|
|
padding = 0;
|
|
|
|
version = 0;
|
|
|
|
type = 0;
|
|
|
|
length = 0;
|
|
|
|
}
|
2020-05-15 04:03:43 +00:00
|
|
|
};
|
2020-05-09 02:51:57 +00:00
|
|
|
|
2020-05-15 04:03:43 +00:00
|
|
|
class SrsRtcpCommon: public ISrsCodec
|
2020-05-09 02:51:57 +00:00
|
|
|
{
|
|
|
|
protected:
|
2020-05-15 04:03:43 +00:00
|
|
|
SrsRtcpHeader header_;
|
2020-08-10 09:48:53 +00:00
|
|
|
uint32_t ssrc_;
|
2020-05-09 02:51:57 +00:00
|
|
|
uint8_t payload_[kRtcpPacketSize];
|
|
|
|
int payload_len_;
|
2020-08-10 09:48:53 +00:00
|
|
|
|
|
|
|
char* data_;
|
|
|
|
int nb_data_;
|
2020-05-09 02:51:57 +00:00
|
|
|
protected:
|
|
|
|
srs_error_t decode_header(SrsBuffer *buffer);
|
|
|
|
srs_error_t encode_header(SrsBuffer *buffer);
|
|
|
|
public:
|
2020-05-15 04:03:43 +00:00
|
|
|
SrsRtcpCommon();
|
|
|
|
virtual ~SrsRtcpCommon();
|
2020-07-30 10:54:16 +00:00
|
|
|
virtual uint8_t type() const;
|
2020-08-10 09:48:53 +00:00
|
|
|
virtual uint8_t get_rc() const;
|
|
|
|
|
|
|
|
uint32_t get_ssrc();
|
|
|
|
void set_ssrc(uint32_t ssrc);
|
|
|
|
|
|
|
|
char* data();
|
|
|
|
int size();
|
2020-05-19 10:06:12 +00:00
|
|
|
// interface ISrsCodec
|
2020-05-09 02:51:57 +00:00
|
|
|
public:
|
|
|
|
virtual srs_error_t decode(SrsBuffer *buffer);
|
2020-12-18 01:56:40 +00:00
|
|
|
virtual uint64_t nb_bytes();
|
2020-05-09 02:51:57 +00:00
|
|
|
virtual srs_error_t encode(SrsBuffer *buffer);
|
|
|
|
};
|
|
|
|
|
2020-05-15 04:03:43 +00:00
|
|
|
class SrsRtcpApp : public SrsRtcpCommon
|
2020-05-15 01:55:15 +00:00
|
|
|
{
|
2020-05-19 10:06:12 +00:00
|
|
|
private:
|
2020-05-15 01:55:15 +00:00
|
|
|
uint8_t name_[4];
|
|
|
|
public:
|
2020-05-15 04:03:43 +00:00
|
|
|
SrsRtcpApp();
|
|
|
|
virtual ~SrsRtcpApp();
|
2020-05-15 01:55:15 +00:00
|
|
|
|
2020-08-06 09:18:45 +00:00
|
|
|
static bool is_rtcp_app(uint8_t *data, int nb_data);
|
|
|
|
|
2020-07-30 10:54:16 +00:00
|
|
|
virtual uint8_t type() const;
|
2020-05-15 01:55:15 +00:00
|
|
|
|
2020-07-30 10:54:16 +00:00
|
|
|
uint8_t get_subtype() const;
|
|
|
|
std::string get_name() const;
|
|
|
|
srs_error_t get_payload(uint8_t*& payload, int& len);
|
2020-05-15 01:55:15 +00:00
|
|
|
|
|
|
|
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);
|
2020-05-19 10:06:12 +00:00
|
|
|
// interface ISrsCodec
|
2020-05-15 01:55:15 +00:00
|
|
|
public:
|
|
|
|
virtual srs_error_t decode(SrsBuffer *buffer);
|
2020-12-18 01:56:40 +00:00
|
|
|
virtual uint64_t nb_bytes();
|
2020-05-15 01:55:15 +00:00
|
|
|
virtual srs_error_t encode(SrsBuffer *buffer);
|
|
|
|
};
|
|
|
|
|
2020-05-19 09:49:34 +00:00
|
|
|
struct SrsRtcpRB
|
|
|
|
{
|
2020-05-09 02:51:57 +00:00
|
|
|
uint32_t ssrc;
|
|
|
|
uint8_t fraction_lost;
|
|
|
|
uint32_t lost_packets;
|
|
|
|
uint32_t highest_sn;
|
|
|
|
uint32_t jitter;
|
|
|
|
uint32_t lsr;
|
|
|
|
uint32_t dlsr;
|
2020-08-21 13:14:18 +00:00
|
|
|
|
|
|
|
SrsRtcpRB() {
|
|
|
|
ssrc = 0;
|
|
|
|
fraction_lost = 0;
|
|
|
|
lost_packets = 0;
|
|
|
|
highest_sn = 0;
|
|
|
|
jitter = 0;
|
|
|
|
lsr = 0;
|
|
|
|
dlsr = 0;
|
|
|
|
}
|
2020-05-15 04:03:43 +00:00
|
|
|
};
|
2020-05-09 02:51:57 +00:00
|
|
|
|
2020-05-15 04:03:43 +00:00
|
|
|
class SrsRtcpSR : public SrsRtcpCommon
|
2020-05-09 02:51:57 +00:00
|
|
|
{
|
|
|
|
private:
|
|
|
|
uint64_t ntp_;
|
|
|
|
uint32_t rtp_ts_;
|
|
|
|
uint32_t send_rtp_packets_;
|
|
|
|
uint32_t send_rtp_bytes_;
|
2020-08-10 09:48:53 +00:00
|
|
|
|
2020-05-09 02:51:57 +00:00
|
|
|
public:
|
2020-05-15 04:03:43 +00:00
|
|
|
SrsRtcpSR();
|
|
|
|
virtual ~SrsRtcpSR();
|
2020-05-09 02:51:57 +00:00
|
|
|
|
2020-07-30 10:54:16 +00:00
|
|
|
uint8_t get_rc() const;
|
2020-05-15 04:03:43 +00:00
|
|
|
// overload SrsRtcpCommon
|
2020-07-30 10:54:16 +00:00
|
|
|
virtual uint8_t type() 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;
|
2020-05-09 02:51:57 +00:00
|
|
|
|
|
|
|
void set_ntp(uint64_t ntp);
|
|
|
|
void set_rtp_ts(uint32_t ts);
|
|
|
|
void set_rtp_send_packets(uint32_t packets);
|
|
|
|
void set_rtp_send_bytes(uint32_t bytes);
|
2020-05-19 10:06:12 +00:00
|
|
|
// interface ISrsCodec
|
2020-05-09 02:51:57 +00:00
|
|
|
public:
|
|
|
|
virtual srs_error_t decode(SrsBuffer *buffer);
|
2020-12-18 01:56:40 +00:00
|
|
|
virtual uint64_t nb_bytes();
|
2020-05-09 02:51:57 +00:00
|
|
|
virtual srs_error_t encode(SrsBuffer *buffer);
|
|
|
|
};
|
|
|
|
|
2020-05-15 04:03:43 +00:00
|
|
|
class SrsRtcpRR : public SrsRtcpCommon
|
2020-05-09 02:51:57 +00:00
|
|
|
{
|
|
|
|
private:
|
2020-05-19 09:49:34 +00:00
|
|
|
SrsRtcpRB rb_;
|
2020-05-09 02:51:57 +00:00
|
|
|
public:
|
2020-05-15 04:03:43 +00:00
|
|
|
SrsRtcpRR(uint32_t sender_ssrc = 0);
|
|
|
|
virtual ~SrsRtcpRR();
|
2020-05-09 02:51:57 +00:00
|
|
|
|
2020-05-15 04:03:43 +00:00
|
|
|
// overload SrsRtcpCommon
|
2020-07-30 10:54:16 +00:00
|
|
|
virtual uint8_t type() const;
|
2020-05-09 02:51:57 +00:00
|
|
|
|
2020-07-30 10:54:16 +00:00
|
|
|
uint32_t get_rb_ssrc() const;
|
|
|
|
float get_lost_rate() const;
|
|
|
|
uint32_t get_lost_packets() const;
|
|
|
|
uint32_t get_highest_sn() const;
|
|
|
|
uint32_t get_jitter() const;
|
|
|
|
uint32_t get_lsr() const;
|
|
|
|
uint32_t get_dlsr() const;
|
2020-05-09 02:51:57 +00:00
|
|
|
|
|
|
|
void set_rb_ssrc(uint32_t ssrc);
|
|
|
|
void set_lost_rate(float rate);
|
|
|
|
void set_lost_packets(uint32_t count);
|
|
|
|
void set_highest_sn(uint32_t sn);
|
|
|
|
void set_jitter(uint32_t jitter);
|
|
|
|
void set_lsr(uint32_t lsr);
|
|
|
|
void set_dlsr(uint32_t dlsr);
|
|
|
|
void set_sender_ntp(uint64_t ntp);
|
2020-05-19 10:06:12 +00:00
|
|
|
// interface ISrsCodec
|
2020-05-09 02:51:57 +00:00
|
|
|
public:
|
|
|
|
virtual srs_error_t decode(SrsBuffer *buffer);
|
2020-12-18 01:56:40 +00:00
|
|
|
virtual uint64_t nb_bytes();
|
2020-05-09 02:51:57 +00:00
|
|
|
virtual srs_error_t encode(SrsBuffer *buffer);
|
|
|
|
|
|
|
|
};
|
|
|
|
|
2020-05-17 12:20:06 +00:00
|
|
|
// 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
|
|
|
|
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
// |V=2|P| FMT=15 | PT=205 | length |
|
|
|
|
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
// | SSRC of packet sender |
|
|
|
|
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
// | SSRC of media source |
|
|
|
|
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
// | base sequence number | packet status count |
|
|
|
|
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
// | reference time | fb pkt. count |
|
|
|
|
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
// | packet chunk | packet chunk |
|
|
|
|
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
// . .
|
|
|
|
// . .
|
|
|
|
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
// | packet chunk | recv delta | recv delta |
|
|
|
|
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
// . .
|
|
|
|
// . .
|
|
|
|
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
// | recv delta | recv delta | zero padding |
|
|
|
|
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
#define kTwccFbPktHeaderSize (4 + 8 + 8)
|
|
|
|
#define kTwccFbChunkBytes (2)
|
|
|
|
#define kTwccFbPktFormat (15)
|
|
|
|
#define kTwccFbPayloadType (205)
|
|
|
|
#define kTwccFbMaxPktStatusCount (0xffff)
|
|
|
|
#define kTwccFbDeltaUnit (250) // multiple of 250us
|
|
|
|
#define kTwccFbTimeMultiplier (kTwccFbDeltaUnit * (1 << 8)) // multiplicand multiplier/* 250us -> 64ms (1 << 8) */
|
|
|
|
#define kTwccFbReferenceTimeDivisor ((1ll<<24) * kTwccFbTimeMultiplier) // dividend divisor
|
2020-05-15 01:55:15 +00:00
|
|
|
|
|
|
|
#define kTwccFbMaxRunLength 0x1fff
|
|
|
|
#define kTwccFbOneBitElements 14
|
|
|
|
#define kTwccFbTwoBitElements 7
|
|
|
|
#define kTwccFbLargeRecvDeltaBytes 2
|
|
|
|
#define kTwccFbMaxBitElements kTwccFbOneBitElements
|
|
|
|
|
2020-05-15 04:03:43 +00:00
|
|
|
class SrsRtcpTWCC : public SrsRtcpCommon
|
2020-05-09 02:51:57 +00:00
|
|
|
{
|
|
|
|
private:
|
|
|
|
uint32_t media_ssrc_;
|
|
|
|
uint16_t base_sn_;
|
2020-05-15 01:55:15 +00:00
|
|
|
int32_t reference_time_;
|
2020-05-09 02:51:57 +00:00
|
|
|
uint8_t fb_pkt_count_;
|
2020-05-15 01:55:15 +00:00
|
|
|
std::vector<uint16_t> encoded_chucks_;
|
|
|
|
std::vector<uint16_t> pkt_deltas_;
|
|
|
|
|
2020-08-17 03:17:58 +00:00
|
|
|
std::map<uint16_t, srs_utime_t> recv_packets_;
|
2020-05-15 04:03:43 +00:00
|
|
|
std::set<uint16_t, SrsSeqCompareLess> recv_sns_;
|
2020-05-15 01:55:15 +00:00
|
|
|
|
2020-05-17 12:23:57 +00:00
|
|
|
struct SrsRtcpTWCCChunk {
|
2020-05-15 01:55:15 +00:00
|
|
|
uint8_t delta_sizes[kTwccFbMaxBitElements];
|
|
|
|
uint16_t size;
|
|
|
|
bool all_same;
|
|
|
|
bool has_large_delta;
|
2020-08-07 12:11:37 +00:00
|
|
|
SrsRtcpTWCCChunk();
|
2020-05-17 12:23:57 +00:00
|
|
|
};
|
2020-05-15 01:55:15 +00:00
|
|
|
|
|
|
|
int pkt_len;
|
2021-04-01 02:47:50 +00:00
|
|
|
uint16_t next_base_sn_;
|
2020-05-15 01:55:15 +00:00
|
|
|
private:
|
|
|
|
void clear();
|
|
|
|
srs_utime_t calculate_delta_us(srs_utime_t ts, srs_utime_t last);
|
2020-05-17 12:23:57 +00:00
|
|
|
srs_error_t process_pkt_chunk(SrsRtcpTWCCChunk& chunk, int delta_size);
|
|
|
|
bool can_add_to_chunk(SrsRtcpTWCCChunk& chunk, int delta_size);
|
|
|
|
void add_to_chunk(SrsRtcpTWCCChunk& chunk, int delta_size);
|
|
|
|
srs_error_t encode_chunk(SrsRtcpTWCCChunk& chunk);
|
|
|
|
srs_error_t encode_chunk_run_length(SrsRtcpTWCCChunk& chunk);
|
|
|
|
srs_error_t encode_chunk_one_bit(SrsRtcpTWCCChunk& chunk);
|
|
|
|
srs_error_t encode_chunk_two_bit(SrsRtcpTWCCChunk& chunk, size_t size, bool shift);
|
|
|
|
void reset_chunk(SrsRtcpTWCCChunk& chunk);
|
|
|
|
srs_error_t encode_remaining_chunk(SrsRtcpTWCCChunk& chunk);
|
2020-05-09 02:51:57 +00:00
|
|
|
public:
|
2020-05-15 04:03:43 +00:00
|
|
|
SrsRtcpTWCC(uint32_t sender_ssrc = 0);
|
|
|
|
virtual ~SrsRtcpTWCC();
|
2020-05-09 02:51:57 +00:00
|
|
|
|
2020-07-30 10:54:16 +00:00
|
|
|
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;
|
2020-05-09 02:51:57 +00:00
|
|
|
|
|
|
|
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);
|
|
|
|
void add_packet_chuck(uint16_t chuck);
|
2020-05-15 01:55:15 +00:00
|
|
|
void add_recv_delta(uint16_t delta);
|
|
|
|
|
|
|
|
srs_error_t recv_packet(uint16_t sn, srs_utime_t ts);
|
2020-08-17 03:43:29 +00:00
|
|
|
bool need_feedback();
|
2020-08-10 09:48:53 +00:00
|
|
|
|
2020-05-19 10:06:12 +00:00
|
|
|
// interface ISrsCodec
|
2020-05-09 02:51:57 +00:00
|
|
|
public:
|
|
|
|
virtual srs_error_t decode(SrsBuffer *buffer);
|
2020-12-18 01:56:40 +00:00
|
|
|
virtual uint64_t nb_bytes();
|
2020-05-09 02:51:57 +00:00
|
|
|
virtual srs_error_t encode(SrsBuffer *buffer);
|
2020-06-26 07:20:24 +00:00
|
|
|
private:
|
|
|
|
srs_error_t do_encode(SrsBuffer *buffer);
|
2020-05-09 02:51:57 +00:00
|
|
|
};
|
|
|
|
|
2020-05-15 04:03:43 +00:00
|
|
|
class SrsRtcpNack : public SrsRtcpCommon
|
2020-05-09 02:51:57 +00:00
|
|
|
{
|
|
|
|
private:
|
2020-05-17 12:23:57 +00:00
|
|
|
struct SrsPidBlp {
|
2020-05-09 02:51:57 +00:00
|
|
|
uint16_t pid;
|
|
|
|
uint16_t blp;
|
2020-05-15 01:55:15 +00:00
|
|
|
bool in_use;
|
2020-05-17 12:23:57 +00:00
|
|
|
};
|
2020-05-09 02:51:57 +00:00
|
|
|
|
|
|
|
uint32_t media_ssrc_;
|
2020-05-15 04:03:43 +00:00
|
|
|
std::set<uint16_t, SrsSeqCompareLess> lost_sns_;
|
2020-05-09 02:51:57 +00:00
|
|
|
public:
|
2020-05-15 04:03:43 +00:00
|
|
|
SrsRtcpNack(uint32_t sender_ssrc = 0);
|
|
|
|
virtual ~SrsRtcpNack();
|
2020-05-09 02:51:57 +00:00
|
|
|
|
2020-07-30 10:54:16 +00:00
|
|
|
uint32_t get_media_ssrc() const;
|
|
|
|
std::vector<uint16_t> get_lost_sns() const;
|
2021-02-08 08:24:12 +00:00
|
|
|
bool empty();
|
2020-05-09 02:51:57 +00:00
|
|
|
|
|
|
|
void set_media_ssrc(uint32_t ssrc);
|
|
|
|
void add_lost_sn(uint16_t sn);
|
2020-05-19 10:06:12 +00:00
|
|
|
// interface ISrsCodec
|
2020-05-09 02:51:57 +00:00
|
|
|
public:
|
|
|
|
virtual srs_error_t decode(SrsBuffer *buffer);
|
2020-12-18 01:56:40 +00:00
|
|
|
virtual uint64_t nb_bytes();
|
2020-05-09 02:51:57 +00:00
|
|
|
virtual srs_error_t encode(SrsBuffer *buffer);
|
|
|
|
};
|
|
|
|
|
2020-08-10 09:48:53 +00:00
|
|
|
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);
|
2020-12-18 01:56:40 +00:00
|
|
|
virtual uint64_t nb_bytes();
|
2020-08-10 09:48:53 +00:00
|
|
|
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);
|
2020-12-18 01:56:40 +00:00
|
|
|
virtual uint64_t nb_bytes();
|
2020-08-10 09:48:53 +00:00
|
|
|
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);
|
2020-12-18 01:56:40 +00:00
|
|
|
virtual uint64_t nb_bytes();
|
2020-08-10 09:48:53 +00:00
|
|
|
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);
|
2020-12-18 01:56:40 +00:00
|
|
|
virtual uint64_t nb_bytes();
|
2020-08-10 09:48:53 +00:00
|
|
|
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);
|
2020-12-18 01:56:40 +00:00
|
|
|
virtual uint64_t nb_bytes();
|
2020-08-10 09:48:53 +00:00
|
|
|
virtual srs_error_t encode(SrsBuffer *buffer);
|
|
|
|
};
|
|
|
|
|
2020-05-15 04:03:43 +00:00
|
|
|
class SrsRtcpCompound : public ISrsCodec
|
2020-05-09 02:51:57 +00:00
|
|
|
{
|
|
|
|
private:
|
2020-05-15 04:03:43 +00:00
|
|
|
std::vector<SrsRtcpCommon*> rtcps_;
|
2020-05-09 02:51:57 +00:00
|
|
|
int nb_bytes_;
|
2020-08-10 09:48:53 +00:00
|
|
|
char* data_;
|
|
|
|
int nb_data_;
|
2020-05-09 02:51:57 +00:00
|
|
|
public:
|
2020-05-15 04:03:43 +00:00
|
|
|
SrsRtcpCompound();
|
|
|
|
virtual ~SrsRtcpCompound();
|
2020-05-09 02:51:57 +00:00
|
|
|
|
2020-08-11 01:40:27 +00:00
|
|
|
// TODO: FIXME: Should rename it to pop(), because it's not a GET method.
|
2020-05-15 04:03:43 +00:00
|
|
|
SrsRtcpCommon* get_next_rtcp();
|
|
|
|
srs_error_t add_rtcp(SrsRtcpCommon *rtcp);
|
2020-05-09 02:51:57 +00:00
|
|
|
void clear();
|
2020-08-10 09:48:53 +00:00
|
|
|
|
|
|
|
char* data();
|
|
|
|
int size();
|
|
|
|
|
2020-05-19 10:06:12 +00:00
|
|
|
// interface ISrsCodec
|
2020-05-09 02:51:57 +00:00
|
|
|
public:
|
|
|
|
virtual srs_error_t decode(SrsBuffer *buffer);
|
2020-12-18 01:56:40 +00:00
|
|
|
virtual uint64_t nb_bytes();
|
2020-05-09 02:51:57 +00:00
|
|
|
virtual srs_error_t encode(SrsBuffer *buffer);
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|
2020-05-19 10:06:12 +00:00
|
|
|
|