mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-11-26 20:47:08 +08:00
完善rtcp的定义
This commit is contained in:
parent
29c8c9bf26
commit
37096f8ed0
@ -38,7 +38,7 @@ const char *psfbTypeToStr(PSFBType type) {
|
||||
#define SWITCH_CASE(key, value) case PSFBType::key : return #value "(" #key ")";
|
||||
PSFB_TYPE_MAP(SWITCH_CASE)
|
||||
#undef SWITCH_CASE
|
||||
default: return "unknown payload-specific fb message (rfc4585) type";
|
||||
default: return "unknown payload-specific fb message fmt type";
|
||||
}
|
||||
}
|
||||
|
||||
@ -385,7 +385,7 @@ string SdesItem::dumpString() const{
|
||||
printer << "ssrc:" << ssrc << "\r\n";
|
||||
printer << "type:" << sdesTypeToStr((SdesType) type) << "\r\n";
|
||||
printer << "length:" << (int) length << "\r\n";
|
||||
printer << "text:" << (length ? string(&text, length) : "") << "\r\n";
|
||||
printer << "text:" << (length ? string(text, length) : "") << "\r\n";
|
||||
return std::move(printer);
|
||||
}
|
||||
|
||||
@ -403,7 +403,7 @@ std::shared_ptr<RtcpSdes> RtcpSdes::create(const std::initializer_list<string> &
|
||||
for (auto &text : item_text) {
|
||||
item_ptr->length = (0xFF & text.size());
|
||||
//确保赋值\0为RTCP_SDES_END
|
||||
memcpy(&(item_ptr->text), text.data(), item_ptr->length + 1);
|
||||
memcpy(item_ptr->text, text.data(), item_ptr->length + 1);
|
||||
item_ptr = (SdesItem *) ((char *) item_ptr + item_ptr->totalBytes());
|
||||
}
|
||||
|
||||
@ -555,7 +555,7 @@ void RtcpBye::net2Host(size_t size) {
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
#if 1
|
||||
#include "Util/onceToken.h"
|
||||
|
||||
static toolkit::onceToken token([](){
|
||||
|
@ -25,8 +25,7 @@ namespace mediakit {
|
||||
#pragma pack(push, 1)
|
||||
#endif // defined(_WIN32)
|
||||
|
||||
//https://datatracker.ietf.org/doc/rfc3550
|
||||
|
||||
//http://www.networksorcery.com/enp/protocol/rtcp.htm
|
||||
#define RTCP_PT_MAP(XX) \
|
||||
XX(RTCP_FIR, 192) \
|
||||
XX(RTCP_NACK, 193) \
|
||||
@ -44,6 +43,7 @@ namespace mediakit {
|
||||
XX(RTCP_RSI, 209) \
|
||||
XX(RTCP_TOKEN, 210)
|
||||
|
||||
//https://tools.ietf.org/html/rfc3550#section-6.5
|
||||
#define SDES_TYPE_MAP(XX) \
|
||||
XX(RTCP_SDES_END, 0) \
|
||||
XX(RTCP_SDES_CNAME, 1) \
|
||||
@ -69,19 +69,49 @@ namespace mediakit {
|
||||
// 1: Picture Loss Indication (PLI)
|
||||
// 2: Slice Loss Indication (SLI)
|
||||
// 3: Reference Picture Selection Indication (RPSI)
|
||||
// 4-14: unassigned
|
||||
// 15: Application layer FB (AFB) message
|
||||
// 4: FIR https://tools.ietf.org/html/rfc5104#section-4.3.1.1
|
||||
// 5: TSTR https://tools.ietf.org/html/rfc5104#section-4.3.2.1
|
||||
// 6: TSTN https://tools.ietf.org/html/rfc5104#section-4.3.2.1
|
||||
// 7: VBCM https://tools.ietf.org/html/rfc5104#section-4.3.4.1
|
||||
// 8-14: unassigned
|
||||
// 15: REMB / Application layer FB (AFB) message, https://tools.ietf.org/html/draft-alvestrand-rmcat-remb-03
|
||||
// 16-30: unassigned
|
||||
// 31: reserved for future expansion of the sequence number space
|
||||
|
||||
#define PSFB_TYPE_MAP(XX) \
|
||||
XX(RTCP_PSFB_PLI, 1) \
|
||||
XX(RTCP_PSFB_SLI, 2) \
|
||||
XX(RTCP_PSFB_RPSI, 3) \
|
||||
XX(RTCP_PSFB_FIR, 4) \
|
||||
XX(RTCP_PSFB_TSTR, 5)\
|
||||
XX(RTCP_PSFB_TSTN, 6)\
|
||||
XX(RTCP_PSFB_VBCM, 7) \
|
||||
XX(RTCP_PSFB_AFB, 15)
|
||||
|
||||
//https://tools.ietf.org/html/rfc4585#section-6.2
|
||||
//6.2. Transport Layer Feedback Messages
|
||||
//
|
||||
// Transport layer FB messages are identified by the value RTPFB as RTCP
|
||||
// message type.
|
||||
//
|
||||
// A single general purpose transport layer FB message is defined in
|
||||
// this document: Generic NACK. It is identified by means of the FMT
|
||||
// parameter as follows:
|
||||
//
|
||||
// 0: unassigned
|
||||
// 1: Generic NACK
|
||||
// 2: reserved https://tools.ietf.org/html/rfc5104#section-4.2
|
||||
// 3: TMMBR https://tools.ietf.org/html/rfc5104#section-4.2.1.1
|
||||
// 4: TMMBN https://tools.ietf.org/html/rfc5104#section-4.2.2.1
|
||||
// 5-14: unassigned
|
||||
// 15 transport-cc https://tools.ietf.org/html/draft-holmer-rmcat-transport-wide-cc-extensions-01
|
||||
// 16-30: unassigned
|
||||
// 31: reserved for future expansion of the identifier number space
|
||||
#define RTPFB_TYPE_MAP(XX) \
|
||||
XX(RTCP_RTPFB_NACK, 1) \
|
||||
XX(RTCP_RTPFB_TMMBR, 3) \
|
||||
XX(RTCP_RTPFB_TMMBN, 4) \
|
||||
XX(RTCP_RTPFB_TWCC, 15)
|
||||
|
||||
//rtcp类型枚举
|
||||
enum class RtcpType : uint8_t {
|
||||
#define XX(key, value) key = value,
|
||||
@ -436,7 +466,7 @@ public:
|
||||
//text长度股,可以为0
|
||||
uint8_t length;
|
||||
//不定长
|
||||
char text;
|
||||
char text[1];
|
||||
//最后以RTCP_SDES_END结尾
|
||||
//只字段为占位字段,不代表真实位置
|
||||
uint8_t end;
|
||||
@ -501,6 +531,7 @@ private:
|
||||
void net2Host(size_t size);
|
||||
} PACKED;
|
||||
|
||||
// https://tools.ietf.org/html/rfc4585#section-6.1
|
||||
// 6.1. Common Packet Format for Feedback Messages
|
||||
//
|
||||
// All FB messages MUST use a common packet format that is depicted in
|
||||
@ -569,7 +600,7 @@ public:
|
||||
|
||||
/* 可选 */
|
||||
uint8_t reason_len;
|
||||
char reason;
|
||||
char reason[1];
|
||||
|
||||
public:
|
||||
/**
|
||||
|
@ -1,5 +1,17 @@
|
||||
//
|
||||
// Created by xzl on 2021/4/13.
|
||||
//
|
||||
/*
|
||||
* Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
|
||||
*
|
||||
* This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
|
||||
*
|
||||
* Use of this source code is governed by MIT license that can be found in the
|
||||
* LICENSE file in the root of the source tree. All contributing project authors
|
||||
* may be found in the AUTHORS file in the root of the source tree.
|
||||
*/
|
||||
|
||||
|
||||
#include "RtcpFCI.h"
|
||||
|
||||
namespace mediakit {
|
||||
|
||||
|
||||
}//namespace mediakit
|
@ -1,4 +1,4 @@
|
||||
/*
|
||||
/*
|
||||
* Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
|
||||
*
|
||||
* This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
|
||||
@ -13,42 +13,17 @@
|
||||
|
||||
#include "Rtcp.h"
|
||||
|
||||
//https://tools.ietf.org/html/rfc4585
|
||||
|
||||
namespace mediakit {
|
||||
|
||||
//https://tools.ietf.org/html/rfc4585#section-6.2.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
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// | PID | BLP |
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
//
|
||||
// Figure 4: Syntax for the Generic NACK message
|
||||
|
||||
class FCI_NACK {
|
||||
public:
|
||||
// The PID field is used to specify a lost packet. The PID field
|
||||
// refers to the RTP sequence number of the lost packet.
|
||||
uint16_t pid;
|
||||
// bitmask of following lost packets (BLP): 16 bits
|
||||
uint16_t blp;
|
||||
} PACKED;
|
||||
/////////////////////////////////////////// PSFB ////////////////////////////////////////////////////
|
||||
|
||||
//PSFB fmt = 2
|
||||
//https://tools.ietf.org/html/rfc4585#section-6.3.2.2
|
||||
// The Slice Loss Indication uses one additional FCI field, the content
|
||||
// of which is depicted in Figure 6. The length of the FB message MUST
|
||||
// be set to 2+n, with n being the number of SLIs contained in the FCI
|
||||
// field.
|
||||
//
|
||||
// 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
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// | First | Number | PictureID |
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
//
|
||||
// Figure 6: Syntax of the Slice Loss Indication (SLI)
|
||||
//
|
||||
class FCI_SLI {
|
||||
public:
|
||||
uint32_t first : 13;
|
||||
@ -56,11 +31,8 @@ public:
|
||||
uint32_t pic_id : 6;
|
||||
} PACKED;
|
||||
|
||||
//PSFB fmt = 3
|
||||
//https://tools.ietf.org/html/rfc4585#section-6.3.3.2
|
||||
//6.3.3.2. Format
|
||||
//
|
||||
// The FCI for the RPSI message follows the format depicted in Figure 7:
|
||||
//
|
||||
// 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
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
@ -68,8 +40,6 @@ public:
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// | defined per codec ... | Padding (0) |
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
//
|
||||
// Figure 7: Syntax of the Reference Picture Selection Indication (RPSI)
|
||||
class FCI_RPSI {
|
||||
public:
|
||||
//The number of unused bits required to pad the length of the RPSI
|
||||
@ -99,7 +69,62 @@ public:
|
||||
// MUST be indicated by the PB field.
|
||||
} PACKED;
|
||||
|
||||
//tools.ietf.org/html/draft-alvestrand-rmcat-remb-03
|
||||
//PSFB fmt = 4
|
||||
//https://tools.ietf.org/html/rfc5104#section-4.3.1.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
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// | SSRC |
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// | Seq nr. | Reserved |
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
class FCI_FIR {
|
||||
|
||||
} PACKED;
|
||||
|
||||
//PSFB fmt = 5
|
||||
//https://tools.ietf.org/html/rfc5104#section-4.3.2.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
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// | SSRC |
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// | Seq nr. | Reserved | Index |
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
class FCI_TSTR {
|
||||
|
||||
} PACKED;
|
||||
|
||||
//PSFB fmt = 6
|
||||
//https://tools.ietf.org/html/rfc5104#section-4.3.2.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
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// | SSRC |
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// | Seq nr. | Reserved | Index |
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
class FCI_TSTN {
|
||||
|
||||
} PACKED;
|
||||
|
||||
//PSFB fmt = 7
|
||||
//https://tools.ietf.org/html/rfc5104#section-4.3.4.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
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// | SSRC |
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// | Seq nr. |0| Payload Type| Length |
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// | VBCM Octet String.... | Padding |
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
class FCI_VBCM {
|
||||
|
||||
} PACKED;
|
||||
|
||||
//PSFB fmt = 15
|
||||
//https://tools.ietf.org/html/draft-alvestrand-rmcat-remb-03
|
||||
// 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
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
@ -144,5 +169,95 @@ public:
|
||||
|
||||
} PACKED;
|
||||
|
||||
/////////////////////////////////////////// RTPFB ////////////////////////////////////////////////////
|
||||
|
||||
//RTPFB fmt = 1
|
||||
//https://tools.ietf.org/html/rfc4585#section-6.2.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
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// | PID | BLP |
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
class FCI_NACK {
|
||||
public:
|
||||
// The PID field is used to specify a lost packet. The PID field
|
||||
// refers to the RTP sequence number of the lost packet.
|
||||
uint16_t pid;
|
||||
// bitmask of following lost packets (BLP): 16 bits
|
||||
uint16_t blp;
|
||||
} PACKED;
|
||||
|
||||
//RTPFB fmt = 3
|
||||
//https://tools.ietf.org/html/rfc5104#section-4.2.1.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
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// | SSRC |
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// | MxTBR Exp | MxTBR Mantissa |Measured Overhead|
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
class FCI_TMMBR {
|
||||
public:
|
||||
//SSRC (32 bits): The SSRC value of the media sender that is
|
||||
// requested to obey the new maximum bit rate.
|
||||
uint32_t ssrc;
|
||||
|
||||
// MxTBR Exp (6 bits): The exponential scaling of the mantissa for the
|
||||
// maximum total media bit rate value. The value is an
|
||||
// unsigned integer [0..63].
|
||||
uint32_t max_tbr_exp: 6;
|
||||
|
||||
// MxTBR Mantissa (17 bits): The mantissa of the maximum total media
|
||||
// bit rate value as an unsigned integer.
|
||||
uint32_t max_mantissa: 17;
|
||||
|
||||
// Measured Overhead (9 bits): The measured average packet overhead
|
||||
// value in bytes. The measurement SHALL be done according
|
||||
// to the description in section 4.2.1.2. The value is an
|
||||
// unsigned integer [0..511].
|
||||
uint32_t measured_overhead: 9;
|
||||
} PACKED;
|
||||
|
||||
//RTPFB fmt = 4
|
||||
// https://tools.ietf.org/html/rfc5104#section-4.2.2.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
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// | SSRC |
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// | MxTBR Exp | MxTBR Mantissa |Measured Overhead|
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
class FCI_TMMBN : public FCI_TMMBR{
|
||||
public:
|
||||
|
||||
} PACKED;
|
||||
|
||||
//RTPFB fmt = 15
|
||||
//https://tools.ietf.org/html/draft-holmer-rmcat-transport-wide-cc-extensions-01#section-3.1
|
||||
//https://zhuanlan.zhihu.com/p/206656654
|
||||
//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
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// | 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 |
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
class FCI_TWCC : public FCI_TMMBR{
|
||||
public:
|
||||
|
||||
} PACKED;
|
||||
|
||||
} //namespace mediakit
|
||||
#endif //ZLMEDIAKIT_RTCPFCI_H
|
||||
|
Loading…
Reference in New Issue
Block a user