mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2026-06-19 06:42:21 +08:00
for rtc send can receive rtcp xr, player can calculate rtt , for metaRTC player send rtcp xr
This commit is contained in:
@@ -45,6 +45,10 @@ Buffer::Ptr RtcpContext::createRtcpRR(uint32_t rtcp_ssrc, uint32_t rtp_ssrc) {
|
||||
throw std::runtime_error("没有实现, rtp发送者尝试发送rr包");
|
||||
}
|
||||
|
||||
Buffer::Ptr RtcpContext::createRtcpXRDLRR(uint32_t rtcp_ssrc, uint32_t rtp_ssrc) {
|
||||
throw std::runtime_error("没有实现, rtp发送者尝试发送xr dlrr包");
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void RtcpContextForSend::onRtcp(RtcpHeader *rtcp) {
|
||||
@@ -72,6 +76,18 @@ void RtcpContextForSend::onRtcp(RtcpHeader *rtcp) {
|
||||
}
|
||||
break;
|
||||
}
|
||||
case RtcpType::RTCP_XR:{
|
||||
auto rtcp_xr = (RtcpXRRRTR*)rtcp;
|
||||
if(rtcp_xr->bt == 4){
|
||||
_xr_xrrtr_recv_last_rr[rtcp_xr->ssrc] = ((rtcp_xr->ntpmsw & 0xFFFF) << 16) | ((rtcp_xr->ntplsw >> 16) & 0xFFFF);
|
||||
_xr_rrtr_recv_sys_stamp[rtcp_xr->ssrc] = getCurrentMillisecond();
|
||||
}else if(rtcp_xr->bt == 5){
|
||||
TraceL<<"for sender not recive dlrr";
|
||||
}else{
|
||||
TraceL<<"not support xr bt "<<rtcp_xr->bt;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
@@ -103,6 +119,34 @@ Buffer::Ptr RtcpContextForSend::createRtcpSR(uint32_t rtcp_ssrc) {
|
||||
return RtcpHeader::toBuffer(std::move(rtcp));
|
||||
}
|
||||
|
||||
toolkit::Buffer::Ptr RtcpContextForSend::createRtcpXRDLRR(uint32_t rtcp_ssrc, uint32_t rtp_ssrc){
|
||||
auto rtcp = RtcpXRDLRR::create(1);
|
||||
rtcp->bt = 5;
|
||||
rtcp->reserved = 0;
|
||||
rtcp->block_length = htons(3);
|
||||
rtcp->ssrc = htonl(rtcp_ssrc);
|
||||
rtcp->items.ssrc = htonl(rtp_ssrc);
|
||||
|
||||
if(_xr_xrrtr_recv_last_rr.find(rtp_ssrc) == _xr_xrrtr_recv_last_rr.end()){
|
||||
rtcp->items.lrr = 0;
|
||||
WarnL;
|
||||
}else{
|
||||
rtcp->items.lrr = htonl(_xr_xrrtr_recv_last_rr[rtp_ssrc]);
|
||||
}
|
||||
|
||||
if(_xr_rrtr_recv_sys_stamp.find(rtp_ssrc) == _xr_rrtr_recv_sys_stamp.end()){
|
||||
rtcp->items.dlrr = 0;
|
||||
WarnL;
|
||||
} else {
|
||||
// now - Last SR time,单位毫秒
|
||||
auto delay = getCurrentMillisecond() - _xr_rrtr_recv_sys_stamp[rtp_ssrc];
|
||||
// in units of 1/65536 seconds
|
||||
auto dlsr = (uint32_t)(delay / 1000.0f * 65536);
|
||||
rtcp->items.dlrr = htonl(dlsr);
|
||||
}
|
||||
return RtcpHeader::toBuffer(std::move(rtcp));
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void RtcpContextForRecv::onRtp(uint16_t seq, uint32_t stamp, uint64_t ntp_stamp_ms, uint32_t sample_rate, size_t bytes) {
|
||||
|
||||
Reference in New Issue
Block a user