Index: webrtc/call/flexfec_receive_stream_impl.cc |
diff --git a/webrtc/call/flexfec_receive_stream_impl.cc b/webrtc/call/flexfec_receive_stream_impl.cc |
index 95bcfc14dc1de9bc2cedee29fff729e314c6ba5a..f5272c9029dd48f2e8ba77866a0df0c81fe81b1c 100644 |
--- a/webrtc/call/flexfec_receive_stream_impl.cc |
+++ b/webrtc/call/flexfec_receive_stream_impl.cc |
@@ -10,10 +10,16 @@ |
#include "webrtc/call/flexfec_receive_stream_impl.h" |
-#include <utility> |
+#include <string> |
#include "webrtc/base/checks.h" |
#include "webrtc/base/logging.h" |
+#include "webrtc/modules/rtp_rtcp/include/flexfec_receiver.h" |
+#include "webrtc/modules/rtp_rtcp/include/receive_statistics.h" |
+#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h" |
+#include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h" |
+#include "webrtc/modules/utility/include/process_thread.h" |
+#include "webrtc/system_wrappers/include/clock.h" |
namespace webrtc { |
@@ -97,33 +103,77 @@ std::unique_ptr<FlexfecReceiver> MaybeCreateFlexfecReceiver( |
recovered_packet_receiver)); |
} |
+std::unique_ptr<RtpRtcp> CreateRtpRtcpModule( |
+ ReceiveStatistics* receive_statistics, |
+ Transport* rtcp_send_transport, |
+ RtcpRttStats* rtt_stats) { |
+ RtpRtcp::Configuration configuration; |
+ configuration.audio = false; |
+ configuration.receiver_only = true; |
+ configuration.clock = Clock::GetRealTimeClock(); |
+ configuration.receive_statistics = receive_statistics; |
+ configuration.outgoing_transport = rtcp_send_transport; |
+ configuration.rtt_stats = rtt_stats; |
+ std::unique_ptr<RtpRtcp> rtp_rtcp(RtpRtcp::CreateRtpRtcp(configuration)); |
+ return rtp_rtcp; |
+} |
+ |
} // namespace |
FlexfecReceiveStreamImpl::FlexfecReceiveStreamImpl( |
const Config& config, |
- RecoveredPacketReceiver* recovered_packet_receiver) |
- : started_(false), |
- config_(config), |
- receiver_( |
- MaybeCreateFlexfecReceiver(config_, recovered_packet_receiver)) { |
+ RecoveredPacketReceiver* recovered_packet_receiver, |
+ RtcpRttStats* rtt_stats, |
+ ProcessThread* process_thread) |
+ : config_(config), |
+ started_(false), |
+ receiver_(MaybeCreateFlexfecReceiver(config_, recovered_packet_receiver)), |
+ rtp_receive_statistics_( |
+ ReceiveStatistics::Create(Clock::GetRealTimeClock())), |
+ rtp_rtcp_(CreateRtpRtcpModule(rtp_receive_statistics_.get(), |
+ config_.rtcp_send_transport, |
+ rtt_stats)), |
+ process_thread_(process_thread) { |
LOG(LS_INFO) << "FlexfecReceiveStreamImpl: " << config_.ToString(); |
+ |
+ // RTCP reporting. |
+ rtp_rtcp_->SetSendingMediaStatus(false); |
+ rtp_rtcp_->SetRTCPStatus(config_.rtcp_mode); |
+ rtp_rtcp_->SetSSRC(config_.local_ssrc); |
+ process_thread_->RegisterModule(rtp_rtcp_.get()); |
} |
FlexfecReceiveStreamImpl::~FlexfecReceiveStreamImpl() { |
LOG(LS_INFO) << "~FlexfecReceiveStreamImpl: " << config_.ToString(); |
Stop(); |
+ process_thread_->DeRegisterModule(rtp_rtcp_.get()); |
} |
bool FlexfecReceiveStreamImpl::AddAndProcessReceivedPacket( |
- RtpPacketReceived packet) { |
+ const RtpPacketReceived& packet) { |
{ |
rtc::CritScope cs(&crit_); |
if (!started_) |
return false; |
} |
+ |
if (!receiver_) |
return false; |
- return receiver_->AddAndProcessReceivedPacket(std::move(packet)); |
+ |
+ if (!receiver_->AddAndProcessReceivedPacket(packet)) |
+ return false; |
+ |
+ // Do not report media packets in the RTCP RRs generated by |rtp_rtcp_|. |
+ if (packet.Ssrc() == config_.remote_ssrc) { |
+ RTPHeader header; |
+ packet.GetHeader(&header); |
+ // FlexFEC packets are never retransmitted. |
+ const bool kNotRetransmitted = false; |
+ rtp_receive_statistics_->IncomingPacket(header, packet.size(), |
+ kNotRetransmitted); |
+ } |
+ |
+ return true; |
} |
void FlexfecReceiveStreamImpl::Start() { |