完善fci相关代码

This commit is contained in:
xia-chu 2021-04-26 21:03:04 +08:00
parent aa54adb1ab
commit 2d8ef45e4d
6 changed files with 88 additions and 55 deletions

View File

@ -12,6 +12,7 @@
#include <assert.h> #include <assert.h>
#include "Rtcp.h" #include "Rtcp.h"
#include "Util/logger.h" #include "Util/logger.h"
#include "RtcpFCI.h"
namespace mediakit { namespace mediakit {
@ -493,18 +494,65 @@ string RtcpFB::dumpString() const {
printer << RtcpHeader::dumpHeader(); printer << RtcpHeader::dumpHeader();
printer << "ssrc:" << ssrc << "\r\n"; printer << "ssrc:" << ssrc << "\r\n";
printer << "ssrc_media:" << ssrc_media << "\r\n"; printer << "ssrc_media:" << ssrc_media << "\r\n";
auto fci = (uint8_t *)&ssrc_media + sizeof(ssrc_media); auto fci_data = (uint8_t *)&ssrc_media + sizeof(ssrc_media);
auto fci_len = getSize() - sizeof(RtcpFB); auto fci_len = getSize() - sizeof(RtcpFB);
if (fci_len) {
switch ((RtcpType) pt) { switch ((RtcpType) pt) {
case RtcpType::RTCP_PSFB : { case RtcpType::RTCP_PSFB : {
switch ((PSFBType) report_count) {
case PSFBType::RTCP_PSFB_SLI : {
FCI_SLI *fci = (FCI_SLI *) fci_data;
fci->check(fci_len);
printer << "fci:" << psfbTypeToStr((PSFBType) report_count) << " " << fci->dumpString();
break;
}
case PSFBType::RTCP_PSFB_PLI : {
CHECK(fci_len == 0);
printer << "fci:" << psfbTypeToStr((PSFBType) report_count);
break;
}
case PSFBType::RTCP_PSFB_FIR : {
FCI_FIR *fci = (FCI_FIR *) fci_data;
fci->check(fci_len);
printer << "fci:" << psfbTypeToStr((PSFBType) report_count) << " " << fci->dumpString();
break;
}
case PSFBType::RTCP_PSFB_REMB : {
FCI_REMB *fci = (FCI_REMB *) fci_data;
fci->check(fci_len);
printer << "fci:" << psfbTypeToStr((PSFBType) report_count) << " " << fci->dumpString();
break;
}
default:{
printer << "fci:" << psfbTypeToStr((PSFBType) report_count) << " " << hexdump(fci_data, fci_len);
break;
}
}
break; break;
} }
case RtcpType::RTCP_RTPFB : { case RtcpType::RTCP_RTPFB : {
switch ((RTPFBType) report_count) {
case RTPFBType::RTCP_RTPFB_NACK : {
FCI_NACK *fci = (FCI_NACK *) fci_data;
fci->check(fci_len);
printer << "fci:" << rtpfbTypeToStr((RTPFBType) report_count) << " " << fci->dumpString();
break;
}
case RTPFBType::RTCP_RTPFB_TWCC : {
FCI_TWCC *fci = (FCI_TWCC *) fci_data;
fci->check(fci_len);
printer << "fci:" << rtpfbTypeToStr((RTPFBType) report_count) << " " << fci->dumpString(fci_len);
break;
}
default: {
printer << "fci:" << rtpfbTypeToStr((RTPFBType) report_count) << " " << hexdump(fci_data, fci_len);
break; break;
} }
} }
printer << "fci:" << hexdump(fci, fci_len); break;
}
default: /*不可达*/ assert(0); break;
} }
return std::move(printer); return std::move(printer);
} }

View File

@ -85,7 +85,7 @@ namespace mediakit {
XX(RTCP_PSFB_TSTR, 5)\ XX(RTCP_PSFB_TSTR, 5)\
XX(RTCP_PSFB_TSTN, 6)\ XX(RTCP_PSFB_TSTN, 6)\
XX(RTCP_PSFB_VBCM, 7) \ XX(RTCP_PSFB_VBCM, 7) \
XX(RTCP_PSFB_AFB, 15) XX(RTCP_PSFB_REMB, 15)
//https://tools.ietf.org/html/rfc4585#section-6.2 //https://tools.ietf.org/html/rfc4585#section-6.2
//6.2. Transport Layer Feedback Messages //6.2. Transport Layer Feedback Messages

View File

@ -453,7 +453,7 @@ map<uint16_t, std::pair<SymbolStatus, uint32_t/*stamp*/> > FCI_TWCC::getPacketCh
string FCI_TWCC::dumpString(size_t total_size) const { string FCI_TWCC::dumpString(size_t total_size) const {
_StrPrinter printer; _StrPrinter printer;
auto map = getPacketChunkList(total_size); auto map = getPacketChunkList(total_size);
printer << "twcc fci, base_seq:" << getBaseSeq() << ",pkt_status_count:" << getPacketCount() << ", ref time:" << getReferenceTime() << ", fb count:" << (int)fb_pkt_count << "\n"; printer << "twcc fci, base_seq:" << getBaseSeq() << ", pkt_status_count:" << getPacketCount() << ", ref time:" << getReferenceTime() << ", fb count:" << (int)fb_pkt_count << "\n";
for (auto &pr : map) { for (auto &pr : map) {
printer << "rtp seq:" << pr.first <<", packet status:" << (int)(pr.second.first) << ", delta:" << pr.second.second << "\n"; printer << "rtp seq:" << pr.first <<", packet status:" << (int)(pr.second.first) << ", delta:" << pr.second.second << "\n";
} }

View File

@ -1257,18 +1257,29 @@ void RtcConfigure::RtcTrackConfigure::setDefaultSetting(TrackType type){
//此处调整偏好的编码格式优先级 //此处调整偏好的编码格式优先级
preferred_codec = {CodecAAC, CodecG711U, CodecG711A, CodecOpus}; preferred_codec = {CodecAAC, CodecG711U, CodecG711A, CodecOpus};
rtcp_fb = {"transport-cc"}; rtcp_fb = {"transport-cc"};
extmap = {"1 urn:ietf:params:rtp-hdrext:ssrc-audio-level"}; extmap = {"1 urn:ietf:params:rtp-hdrext:ssrc-audio-level",
"2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time",
"3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01",
"4 urn:ietf:params:rtp-hdrext:sdes:mid",
"5 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id",
"6 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id"};
break; break;
} }
case TrackVideo: { case TrackVideo: {
//此处调整偏好的编码格式优先级 //此处调整偏好的编码格式优先级
preferred_codec = {CodecH264, CodecH265}; preferred_codec = {CodecH264, CodecH265};
rtcp_fb = {"nack", "ccm fir", "nack pli", "goog-remb", "transport-cc"}; rtcp_fb = {"nack", "ccm fir", "nack pli", "goog-remb", "transport-cc"};
extmap = {"2 urn:ietf:params:rtp-hdrext:toffset", extmap = {"14 urn:ietf:params:rtp-hdrext:toffset",
"3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time", "2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time",
"4 urn:3gpp:video-orientation", "13 urn:3gpp:video-orientation",
"5 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01", "3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01",
"6 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay"}; "12 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay",
"11 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type",
"7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing",
"8 http://www.webrtc.org/experiments/rtp-hdrext/color-space",
"4 urn:ietf:params:rtp-hdrext:sdes:mid",
"5 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id",
"6 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id"};
break; break;
} }
case TrackApplication: { case TrackApplication: {

View File

@ -544,7 +544,7 @@ void WebRtcTransportImp::onRtcp(const char *buf, size_t len) {
} }
case RtcpType::RTCP_PSFB: case RtcpType::RTCP_PSFB:
case RtcpType::RTCP_RTPFB: { case RtcpType::RTCP_RTPFB: {
InfoL << rtcp->dumpString(); InfoL << "\n" << rtcp->dumpString();
break; break;
} }
default: break; default: break;

View File

@ -1,37 +1,11 @@
# 致谢与声明 14 urn:ietf:params:rtp-hdrext:toffset
本文件夹下部分文件提取自[MediaSoup](https://github.com/versatica/mediasoup) ,分别为: 2 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
13 urn:3gpp:video-orientation
- ice相关功能 3 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01
- IceServer.cpp 12 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay
- IceServer.hpp 11 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type
- StunPacket.cpp 7 http://www.webrtc.org/experiments/rtp-hdrext/video-timing
- StunPacket.hpp 8 http://www.webrtc.org/experiments/rtp-hdrext/color-space
- Utils.hpp 4 urn:ietf:params:rtp-hdrext:sdes:mid
5 urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id
- dtls相关功能 6 urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id
- DtlsTransport.cpp
- DtlsTransport.hpp
- srtp相关功能
- SrtpSession.cpp
- SrtpSession.hpp
以上源码有一定的修改和裁剪感谢MediaSoup开源项目及作者
用户在使用本项目的同时应该同时遵循MediaSoup的开源协议。
同时,在此也感谢开源项目[easy_webrtc_server](https://github.com/Mihawk086/easy_webrtc_server) 及作者,
在集成MediaSoup相关代码前期主要参考这个项目。
另外,感谢[big panda](<2381267071@qq.com>) 开发并贡献的webrtc js测试客户端(www/webrtc目录下文件)
其开源项目地址为https://gitee.com/xiongguangjie/zlmrtcclient.js
# 现状与规划
ZLMediaKit的WebRTC相关功能目前仅供测试与开发现在还不成熟后续主要工作有
- 1、完善webrtc rtcp相关功能包括丢包重传、带宽检测等功能。
- 2、实现rtp重传等相关功能。
- 3、实现simulecast相关功能。
- 4、fec、rtp扩展等其他功能。
- 5、如果精力允许逐步替换MediaSoup相关代码改用自有版权代码。