Chromium Code Reviews| 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..046f06e7084f26df397fa8a71dea8198b9ba49cf 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; |
|
danilchap
2017/01/10 13:48:17
add configuration.clock = Clock::GetRealTimeClock(
brandtr
2017/01/11 09:55:24
Done.
|
| + configuration.receiver_only = true; |
| + 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() { |