Commit 8702ad10 by xia-chu

完善rtcp feedback相关代码

parent caceb90b
...@@ -179,6 +179,8 @@ public: ...@@ -179,6 +179,8 @@ public:
#endif #endif
//rtcp类型,RtcpType //rtcp类型,RtcpType
uint32_t pt: 8; uint32_t pt: 8;
private:
//长度 //长度
uint32_t length: 16; uint32_t length: 16;
...@@ -207,15 +209,16 @@ public: ...@@ -207,15 +209,16 @@ public:
/** /**
* 根据length字段获取rtcp总长度 * 根据length字段获取rtcp总长度
* 使用net2Host转换成主机字节序后才可使用此函数
*/ */
size_t getSize() const; size_t getSize() const;
protected:
/** /**
* 网络字节序转换为主机字节序 * 设置rtcp length字段
* @param size rtcp总长度,单位字节
*/ */
void net2Host(); void setSize(size_t size);
protected:
/** /**
* 打印字段详情 * 打印字段详情
...@@ -476,7 +479,7 @@ public: ...@@ -476,7 +479,7 @@ public:
//SdesType //SdesType
uint8_t type; uint8_t type;
//text长度股,可以为0 //text长度股,可以为0
uint8_t length; uint8_t txt_len;
//不定长 //不定长
char text[1]; char text[1];
//最后以RTCP_SDES_END结尾 //最后以RTCP_SDES_END结尾
...@@ -521,7 +524,7 @@ public: ...@@ -521,7 +524,7 @@ public:
* @param item_text SdesItem列表,只赋值length和text部分 * @param item_text SdesItem列表,只赋值length和text部分
* @return SDES包 * @return SDES包
*/ */
static std::shared_ptr<RtcpSdes> create(const std::initializer_list<string> &item_text); static std::shared_ptr<RtcpSdes> create(const std::vector<string> &item_text);
/** /**
* 获取SdesItem对象指针列表 * 获取SdesItem对象指针列表
...@@ -560,8 +563,8 @@ private: ...@@ -560,8 +563,8 @@ private:
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// : Feedback Control Information (FCI) : // : Feedback Control Information (FCI) :
// : : // : :
// rtcpfb和psfb的数据结构一致
class RtcpPli : public RtcpHeader { class RtcpFB : public RtcpHeader {
public: public:
friend class RtcpHeader; friend class RtcpHeader;
uint32_t ssrc; uint32_t ssrc;
...@@ -569,9 +572,14 @@ public: ...@@ -569,9 +572,14 @@ public:
public: public:
/** /**
* 创建pli * 创建psfb类型的反馈
*/ */
static std::shared_ptr<RtcpPli> create(); static std::shared_ptr<RtcpFB> create(PSFBType fmt, const void *fci = nullptr, size_t fci_len = 0);
/**
* 创建rtpfb类型的反馈包
*/
static std::shared_ptr<RtcpFB> create(RTPFBType fmt, const void *fci = nullptr, size_t fci_len = 0);
private: private:
/** /**
...@@ -585,6 +593,9 @@ private: ...@@ -585,6 +593,9 @@ private:
* @param size 字节长度,防止内存越界 * @param size 字节长度,防止内存越界
*/ */
void net2Host(size_t size); void net2Host(size_t size);
private:
static std::shared_ptr<RtcpFB> create_l(RtcpType type, int fmt, const void *fci, size_t fci_len);
} PACKED; } PACKED;
//BYE //BYE
...@@ -621,7 +632,7 @@ public: ...@@ -621,7 +632,7 @@ public:
* @param reason 原因 * @param reason 原因
* @return rtcp bye包 * @return rtcp bye包
*/ */
static std::shared_ptr<RtcpBye> create(const std::initializer_list<uint32_t> &ssrc, const string &reason); static std::shared_ptr<RtcpBye> create(const std::vector<uint32_t> &ssrc, const string &reason);
/** /**
* 获取ssrc列表 * 获取ssrc列表
......
...@@ -544,21 +544,9 @@ void WebRtcTransportImp::onRtcp(const char *buf, size_t len) { ...@@ -544,21 +544,9 @@ void WebRtcTransportImp::onRtcp(const char *buf, size_t len) {
onShutdown(SockException(Err_eof, "rtcp bye message received")); onShutdown(SockException(Err_eof, "rtcp bye message received"));
break; break;
} }
case RtcpType::RTCP_PSFB: { case RtcpType::RTCP_PSFB:
//todo 支持pli等更多类型的rtcp
break;
}
case RtcpType::RTCP_RTPFB: { case RtcpType::RTCP_RTPFB: {
//todo 测试打印twcc InfoL << rtcp->dumpString();
RtcpPli *rtpfb = (RtcpPli *)rtcp;
auto fci = (uint8_t *)rtpfb + sizeof (RtcpPli);
if(rtpfb->report_count == 15){
//TWCC
FCI_TWCC *twcc = (FCI_TWCC *) (fci);
auto fci_size = rtpfb->getSize() - 12;
InfoL << hexdump(fci, fci_size);
InfoL << "\n" << twcc->dumpString(fci_size);
}
break; break;
} }
default: break; default: break;
...@@ -591,10 +579,10 @@ void WebRtcTransportImp::onSortedRtp(const RtpPayloadInfo &info, RtpPacket::Ptr ...@@ -591,10 +579,10 @@ void WebRtcTransportImp::onSortedRtp(const RtpPayloadInfo &info, RtpPacket::Ptr
if (_pli_ticker.elapsedTime() > 2000) { if (_pli_ticker.elapsedTime() > 2000) {
//定期发送pli请求关键帧,方便非rtc等协议 //定期发送pli请求关键帧,方便非rtc等协议
_pli_ticker.resetTime(); _pli_ticker.resetTime();
auto pli = RtcpPli::create(); auto pli = RtcpFB::create(PSFBType::RTCP_PSFB_PLI);
pli->ssrc = htonl(0); pli->ssrc = htonl(0);
pli->ssrc_media = htonl(_recv_video_ssrc); pli->ssrc_media = htonl(_recv_video_ssrc);
sendRtcpPacket((char *) pli.get(), sizeof(RtcpPli), true); sendRtcpPacket((char *) pli.get(), pli->getSize(), true);
} }
if (_push_src) { if (_push_src) {
_push_src->onWrite(std::move(rtp), false); _push_src->onWrite(std::move(rtp), false);
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论