Chromium Code Reviews| Index: webrtc/video_engine/vie_channel_group.cc |
| diff --git a/webrtc/video_engine/vie_channel_group.cc b/webrtc/video_engine/vie_channel_group.cc |
| index 25ef7dd3e55dd0d061a7f92c105bf766f78c7284..d7fc4d0f77ac1f3a61478ce5f69a431c657c67c5 100644 |
| --- a/webrtc/video_engine/vie_channel_group.cc |
| +++ b/webrtc/video_engine/vie_channel_group.cc |
| @@ -18,6 +18,7 @@ |
| #include "webrtc/modules/remote_bitrate_estimator/include/send_time_history.h" |
| #include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.h" |
| #include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.h" |
| +#include "webrtc/modules/remote_bitrate_estimator/remote_estimator_proxy.h" |
| #include "webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter.h" |
| #include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp.h" |
| #include "webrtc/modules/utility/interface/process_thread.h" |
| @@ -160,14 +161,18 @@ ChannelGroup::ChannelGroup(ProcessThread* process_thread) |
| bitrate_controller_( |
| BitrateController::CreateBitrateController(Clock::GetRealTimeClock(), |
| this)) { |
| - remote_bitrate_estimator_.reset(new WrappingBitrateEstimator( |
| - remb_.get(), Clock::GetRealTimeClock())); |
| + Clock* clock = Clock::GetRealTimeClock(); |
| + remote_bitrate_estimator_.reset( |
| + new WrappingBitrateEstimator(remb_.get(), clock)); |
| + remote_estimator_proxy_.reset( |
| + new RemoteEstimatorProxy(clock, packet_router_.get())); |
| call_stats_->RegisterStatsObserver(remote_bitrate_estimator_.get()); |
| pacer_thread_->RegisterModule(pacer_.get()); |
| pacer_thread_->Start(); |
| + process_thread->RegisterModule(remote_estimator_proxy_.get()); |
| process_thread->RegisterModule(remote_bitrate_estimator_.get()); |
| process_thread->RegisterModule(call_stats_.get()); |
| process_thread->RegisterModule(bitrate_controller_.get()); |
| @@ -179,7 +184,10 @@ ChannelGroup::~ChannelGroup() { |
| process_thread_->DeRegisterModule(bitrate_controller_.get()); |
| process_thread_->DeRegisterModule(call_stats_.get()); |
| process_thread_->DeRegisterModule(remote_bitrate_estimator_.get()); |
| + process_thread_->DeRegisterModule(remote_estimator_proxy_.get()); |
| call_stats_->DeregisterStatsObserver(remote_bitrate_estimator_.get()); |
| + if (transport_feedback_adapter_.get()) |
| + call_stats_->DeregisterStatsObserver(transport_feedback_adapter_.get()); |
| DCHECK(channel_map_.empty()); |
| DCHECK(!remb_->InUse()); |
| DCHECK(vie_encoder_map_.empty()); |
| @@ -189,7 +197,28 @@ bool ChannelGroup::CreateSendChannel(int channel_id, |
| int engine_id, |
| Transport* transport, |
| int number_of_cores, |
| - const std::vector<uint32_t>& ssrcs) { |
| + const VideoSendStream::Config& config) { |
| + TransportFeedbackObserver* transport_feedback_observer = nullptr; |
| + bool transport_seq_enabled = false; |
| + for (const RtpExtension& extension : config.rtp.extensions) { |
| + if (extension.name == RtpExtension::kTransportSequenceNumber) { |
| + transport_seq_enabled = true; |
| + break; |
| + } |
| + } |
| + if (transport_seq_enabled) { |
| + if (transport_feedback_adapter_.get() == nullptr) { |
| + transport_feedback_adapter_.reset(new TransportFeedbackAdapter( |
| + bitrate_controller_->CreateRtcpBandwidthObserver(), |
| + Clock::GetRealTimeClock(), process_thread_)); |
| + transport_feedback_adapter_->SetBitrateEstimator( |
| + new RemoteBitrateEstimatorAbsSendTime( |
| + transport_feedback_adapter_.get(), Clock::GetRealTimeClock(), |
| + RemoteBitrateEstimator::kDefaultMinBitrateBps)); |
| + call_stats_->RegisterStatsObserver(transport_feedback_adapter_.get()); |
| + } |
| + transport_feedback_observer = transport_feedback_adapter_.get(); |
| + } |
| // TODO(pbos): Remove checks for empty ssrcs and add this check when there's |
| // no base channel. |
| // DCHECK(!ssrcs.empty()); |
| @@ -199,10 +228,12 @@ bool ChannelGroup::CreateSendChannel(int channel_id, |
| if (!vie_encoder->Init()) { |
| return false; |
| } |
| + const std::vector<uint32_t>& ssrcs = config.rtp.ssrcs; |
| ViEEncoder* encoder = vie_encoder.get(); |
| if (!CreateChannel(channel_id, engine_id, transport, number_of_cores, |
| vie_encoder.release(), ssrcs.empty() ? 1 : ssrcs.size(), |
| - true)) { |
| + true, remote_bitrate_estimator_.get(), |
| + transport_feedback_observer)) { |
| return false; |
| } |
| ViEChannel* channel = channel_map_[channel_id]; |
| @@ -218,12 +249,31 @@ bool ChannelGroup::CreateSendChannel(int channel_id, |
| return true; |
| } |
| -bool ChannelGroup::CreateReceiveChannel(int channel_id, |
| - int engine_id, |
| - Transport* transport, |
| - int number_of_cores) { |
| +bool ChannelGroup::CreateReceiveChannel( |
| + int channel_id, |
| + int engine_id, |
| + Transport* transport, |
| + int number_of_cores, |
| + const VideoReceiveStream::Config& config) { |
| + RemoteBitrateEstimator* bitrate_estimator; |
| + TransportFeedbackObserver* feedback_observer; |
| + bool send_side_bwe = false; |
| + for (const RtpExtension& extension : config.rtp.extensions) { |
| + if (extension.name == RtpExtension::kTransportSequenceNumber) { |
| + send_side_bwe = true; |
| + break; |
| + } |
| + } |
| + |
| + if (send_side_bwe) { |
| + bitrate_estimator = remote_estimator_proxy_.get(); |
| + feedback_observer = transport_feedback_adapter_.get(); |
|
stefan-webrtc
2015/09/17 10:33:19
Why do we have something observing feedback on the
sprang_webrtc
2015/09/17 15:08:28
Oops, copy/paste error.
|
| + } else { |
| + bitrate_estimator = remote_bitrate_estimator_.get(); |
| + feedback_observer = nullptr; |
| + } |
| return CreateChannel(channel_id, engine_id, transport, number_of_cores, |
| - nullptr, 1, false); |
| + nullptr, 1, false, bitrate_estimator, feedback_observer); |
| } |
| bool ChannelGroup::CreateChannel(int channel_id, |
| @@ -232,13 +282,15 @@ bool ChannelGroup::CreateChannel(int channel_id, |
| int number_of_cores, |
| ViEEncoder* vie_encoder, |
| size_t max_rtp_streams, |
| - bool sender) { |
| + bool sender, |
| + RemoteBitrateEstimator* bitrate_estimator, |
| + TransportFeedbackObserver* feedback_observer) { |
| rtc::scoped_ptr<ViEChannel> channel(new ViEChannel( |
| channel_id, engine_id, number_of_cores, transport, process_thread_, |
| encoder_state_feedback_->GetRtcpIntraFrameObserver(), |
| - bitrate_controller_->CreateRtcpBandwidthObserver(), nullptr, |
| - remote_bitrate_estimator_.get(), call_stats_->rtcp_rtt_stats(), |
| - pacer_.get(), packet_router_.get(), max_rtp_streams, sender)); |
| + bitrate_controller_->CreateRtcpBandwidthObserver(), feedback_observer, |
| + bitrate_estimator, call_stats_->rtcp_rtt_stats(), pacer_.get(), |
| + packet_router_.get(), max_rtp_streams, sender)); |
| if (channel->Init() != 0) { |
| return false; |
| } |