Index: webrtc/video/video_receive_stream.cc |
diff --git a/webrtc/video/video_receive_stream.cc b/webrtc/video/video_receive_stream.cc |
index 141e918b7f7301496ed5721b2a7c268042b6f80a..036f6236637d4e1b160df5bba7225bc588f0966c 100644 |
--- a/webrtc/video/video_receive_stream.cc |
+++ b/webrtc/video/video_receive_stream.cc |
@@ -20,9 +20,19 @@ |
#include "webrtc/system_wrappers/interface/logging.h" |
#include "webrtc/video/receive_statistics_proxy.h" |
#include "webrtc/video_encoder.h" |
+#include "webrtc/video_engine/call_stats.h" |
#include "webrtc/video_receive_stream.h" |
namespace webrtc { |
+ |
+static bool UseSendSideBwe(const std::vector<RtpExtension>& extensions) { |
+ for (const auto& extension : extensions) { |
+ if (extension.name == RtpExtension::kTransportSequenceNumber) |
+ return true; |
+ } |
+ return false; |
+} |
+ |
std::string VideoReceiveStream::Decoder::ToString() const { |
std::stringstream ss; |
ss << "{decoder: " << (decoder != nullptr ? "(VideoDecoder)" : "nullptr"); |
@@ -132,18 +142,34 @@ VideoReceiveStream::VideoReceiveStream(int num_cpu_cores, |
ChannelGroup* channel_group, |
int channel_id, |
const VideoReceiveStream::Config& config, |
- webrtc::VoiceEngine* voice_engine) |
+ webrtc::VoiceEngine* voice_engine, |
+ ProcessThread* process_thread) |
: transport_adapter_(config.rtcp_send_transport), |
encoded_frame_proxy_(config.pre_decode_callback), |
config_(config), |
clock_(Clock::GetRealTimeClock()), |
- channel_group_(channel_group), |
- channel_id_(channel_id) { |
+ channel_group_(channel_group) { |
LOG(LS_INFO) << "VideoReceiveStream: " << config_.ToString(); |
- RTC_CHECK(channel_group_->CreateReceiveChannel( |
- channel_id_, &transport_adapter_, num_cpu_cores, config)); |
- vie_channel_ = channel_group_->GetChannel(channel_id_); |
+ bool send_side_bwe = UseSendSideBwe(config_.rtp.extensions); |
+ |
+ RemoteBitrateEstimator* bitrate_estimator = |
+ channel_group_->GetRemoteBitrateEstimator(send_side_bwe); |
+ |
+ vie_channel_.reset(new ViEChannel( |
+ num_cpu_cores, &transport_adapter_, process_thread, |
+ channel_group_->GetRtcpIntraFrameObserver(), |
+ channel_group_->GetBitrateController()->CreateRtcpBandwidthObserver(), |
+ nullptr, bitrate_estimator, |
+ channel_group_->GetCallStats()->rtcp_rtt_stats(), channel_group_->pacer(), |
+ channel_group_->packet_router(), 1, false)); |
+ |
+ RTC_CHECK(vie_channel_->Init() == 0); |
+ |
+ // Register the channel to receive stats updates. |
+ channel_group_->GetCallStats()->RegisterStatsObserver( |
+ vie_channel_->GetStatsObserver()); |
+ |
// TODO(pbos): This is not fine grained enough... |
vie_channel_->SetProtectionMode(config_.rtp.nack.rtp_history_ms > 0, false, |
@@ -175,7 +201,8 @@ VideoReceiveStream::VideoReceiveStream(int num_cpu_cores, |
// TODO(pbos): Remove channel_group_ usage from VideoReceiveStream. This |
// should be configured in call.cc. |
- channel_group_->SetChannelRembStatus(false, config_.rtp.remb, vie_channel_); |
+ channel_group_->SetChannelRembStatus(false, config_.rtp.remb, |
+ vie_channel_.get()); |
for (size_t i = 0; i < config_.rtp.extensions.size(); ++i) { |
const std::string& extension = config_.rtp.extensions[i].name; |
@@ -266,7 +293,14 @@ VideoReceiveStream::~VideoReceiveStream() { |
for (size_t i = 0; i < config_.decoders.size(); ++i) |
vie_channel_->DeRegisterExternalDecoder(config_.decoders[i].payload_type); |
- channel_group_->DeleteChannel(channel_id_); |
+ channel_group_->GetCallStats()->DeregisterStatsObserver( |
+ vie_channel_->GetStatsObserver()); |
+ channel_group_->SetChannelRembStatus(false, false, vie_channel_.get()); |
+ |
+ uint32_t remote_ssrc = vie_channel_->GetRemoteSSRC(); |
+ bool send_side_bwe = UseSendSideBwe(config_.rtp.extensions); |
+ channel_group_->GetRemoteBitrateEstimator(send_side_bwe)->RemoveStream( |
+ remote_ssrc); |
} |
void VideoReceiveStream::Start() { |