[fix] fix rtcp common header

This commit is contained in:
dijunkun
2025-02-26 17:30:24 +08:00
parent ee70280056
commit b7a5066c6b
29 changed files with 334 additions and 259 deletions

View File

@@ -209,7 +209,7 @@ void IceTransport::OnReceiveBuffer(NiceAgent *agent, guint stream_id,
bool IceTransport::ParseRtcpPacket(const uint8_t *buffer, size_t size,
RtcpPacketInfo *rtcp_packet_info) {
CommonHeader rtcp_block;
RtcpCommonHeader rtcp_block;
// If a sender report is received but no DLRR, we need to reset the
// roundTripTime stat according to the standard, see
// https://www.w3.org/TR/webrtc-stats/#dom-rtcremoteoutboundrtpstreamstats-roundtriptime
@@ -227,7 +227,7 @@ bool IceTransport::ParseRtcpPacket(const uint8_t *buffer, size_t size,
switch (rtcp_block.type()) {
case RtcpPacket::RtcpPayloadType::SR:
LOG_INFO("Sender report");
// valid = HandleSenderReport(rtcp_block, rtcp_packet_info);
valid = HandleSenderReport(rtcp_block, rtcp_packet_info);
// received_blocks[rtcp_packet_info->remote_ssrc].sender_report = true;
break;
case RtcpPacket::RtcpPayloadType::RR:
@@ -301,8 +301,21 @@ bool IceTransport::ParseRtcpPacket(const uint8_t *buffer, size_t size,
return true;
}
bool IceTransport::HandleSenderReport(const RtcpCommonHeader &rtcp_block,
RtcpPacketInfo *rtcp_packet_info) {
SenderReport sender_report;
if (!sender_report.Parse(rtcp_block)) {
return false;
}
if (ice_transport_controller_) {
ice_transport_controller_->OnSenderReport(sender_report);
}
return true;
}
bool IceTransport::HandleCongestionControlFeedback(
const CommonHeader &rtcp_block, RtcpPacketInfo *rtcp_packet_info) {
const RtcpCommonHeader &rtcp_block, RtcpPacketInfo *rtcp_packet_info) {
webrtc::rtcp::CongestionControlFeedback feedback;
if (!feedback.Parse(rtcp_block) || feedback.packets().empty()) {
return false;
@@ -319,7 +332,7 @@ bool IceTransport::HandleCongestionControlFeedback(
return true;
}
bool IceTransport::HandleNack(const CommonHeader &rtcp_block,
bool IceTransport::HandleNack(const RtcpCommonHeader &rtcp_block,
RtcpPacketInfo *rtcp_packet_info) {
webrtc::rtcp::Nack nack;
if (!nack.Parse(rtcp_block)) {

View File

@@ -130,10 +130,13 @@ class IceTransport {
bool ParseRtcpPacket(const uint8_t *buffer, size_t size,
RtcpPacketInfo *rtcp_packet_info);
bool HandleCongestionControlFeedback(const CommonHeader &rtcp_block,
bool HandleSenderReport(const RtcpCommonHeader &rtcp_block,
RtcpPacketInfo *rtcp_packet_info);
bool HandleCongestionControlFeedback(const RtcpCommonHeader &rtcp_block,
RtcpPacketInfo *rtcp_packet_info);
bool HandleNack(const CommonHeader &rtcp_block,
bool HandleNack(const RtcpCommonHeader &rtcp_block,
RtcpPacketInfo *rtcp_packet_info);
private:

View File

@@ -332,6 +332,24 @@ int IceTransportController::CreateAudioCodec() {
return 0;
}
void IceTransportController::OnSenderReport(const SenderReport& sender_report) {
if (video_channel_receive_ &&
sender_report.SenderSsrc() == video_channel_receive_->GetRemoteSsrc()) {
video_channel_receive_->OnSenderReport(clock_->CurrentTimeUs(),
sender_report.NtpTimestamp());
} else if (audio_channel_receive_ &&
sender_report.SenderSsrc() ==
audio_channel_receive_->GetRemoteSsrc()) {
audio_channel_receive_->OnSenderReport(clock_->CurrentTimeUs(),
sender_report.NtpTimestamp());
} else if (data_channel_receive_ &&
sender_report.SenderSsrc() ==
data_channel_receive_->GetRemoteSsrc()) {
data_channel_receive_->OnSenderReport(clock_->CurrentTimeUs(),
sender_report.NtpTimestamp());
}
}
void IceTransportController::OnCongestionControlFeedback(
const webrtc::rtcp::CongestionControlFeedback& feedback) {
std::optional<webrtc::TransportPacketsFeedback> feedback_msg =
@@ -376,7 +394,7 @@ void IceTransportController::PostUpdates(webrtc::NetworkControlUpdate update) {
target_bitrate_ = update.target_rate.has_value()
? update.target_rate->target_rate.bps()
: 0;
LOG_WARN("Target bitrate [{}]bps", target_bitrate_);
// LOG_WARN("Target bitrate [{}]bps", target_bitrate_);
video_encoder_->SetTargetBitrate(target_bitrate_);
}

View File

@@ -61,6 +61,7 @@ class IceTransportController
void OnReceiveCompleteData(const char *data, size_t size);
public:
void OnSenderReport(const SenderReport &sender_report);
void OnCongestionControlFeedback(
const webrtc::rtcp::CongestionControlFeedback &feedback);