From 37096f8ed073091fb452f72168678fa42c9de6b0 Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Tue, 13 Apr 2021 22:27:57 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84rtcp=E7=9A=84=E5=AE=9A?= =?UTF-8?q?=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Rtcp/Rtcp.cpp | 8 +- src/Rtcp/Rtcp.h | 51 +++++++++--- src/Rtcp/RtcpFCI.cpp | 18 ++++- src/Rtcp/RtcpFCI.h | 185 +++++++++++++++++++++++++++++++++++-------- 4 files changed, 210 insertions(+), 52 deletions(-) diff --git a/src/Rtcp/Rtcp.cpp b/src/Rtcp/Rtcp.cpp index aa958665..afee33be 100644 --- a/src/Rtcp/Rtcp.cpp +++ b/src/Rtcp/Rtcp.cpp @@ -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::create(const std::initializer_list & 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([](){ diff --git a/src/Rtcp/Rtcp.h b/src/Rtcp/Rtcp.h index c257420f..88fa5475 100644 --- a/src/Rtcp/Rtcp.h +++ b/src/Rtcp/Rtcp.h @@ -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) \ @@ -43,7 +42,8 @@ namespace mediakit { XX(RTCP_AVB, 208) \ 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_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,7 +531,8 @@ private: void net2Host(size_t size); } PACKED; -//6.1. Common Packet Format for Feedback Messages +// 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 // Figure 3: @@ -569,7 +600,7 @@ public: /* 可选 */ uint8_t reason_len; - char reason; + char reason[1]; public: /** diff --git a/src/Rtcp/RtcpFCI.cpp b/src/Rtcp/RtcpFCI.cpp index 724f03b2..60faf0ab 100644 --- a/src/Rtcp/RtcpFCI.cpp +++ b/src/Rtcp/RtcpFCI.cpp @@ -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 \ No newline at end of file diff --git a/src/Rtcp/RtcpFCI.h b/src/Rtcp/RtcpFCI.h index d55ef1ea..adb4abf3 100644 --- a/src/Rtcp/RtcpFCI.h +++ b/src/Rtcp/RtcpFCI.h @@ -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