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 ed4332ab08adc778581c142574912206b9a8140c..7730592e8aa8380b3fc3f5d680b6d9c9417540c3 100644 |
--- a/webrtc/video_engine/vie_channel_group.cc |
+++ b/webrtc/video_engine/vie_channel_group.cc |
@@ -193,62 +193,7 @@ ChannelGroup::~ChannelGroup() { |
call_stats_->DeregisterStatsObserver(transport_feedback_adapter_.get()); |
RTC_DCHECK(channel_map_.empty()); |
RTC_DCHECK(!remb_->InUse()); |
- RTC_DCHECK(vie_encoder_map_.empty()); |
-} |
- |
-bool ChannelGroup::CreateSendChannel(int channel_id, |
- Transport* transport, |
- SendStatisticsProxy* stats_proxy, |
- I420FrameCallback* pre_encode_callback, |
- int number_of_cores, |
- 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())); |
- transport_feedback_adapter_->GetBitrateEstimator()->SetMinBitrate( |
- min_bitrate_bps_); |
- call_stats_->RegisterStatsObserver(transport_feedback_adapter_.get()); |
- } |
- transport_feedback_observer = transport_feedback_adapter_.get(); |
- } |
- |
- const std::vector<uint32_t>& ssrcs = config.rtp.ssrcs; |
- RTC_DCHECK(!ssrcs.empty()); |
- rtc::scoped_ptr<ViEEncoder> vie_encoder(new ViEEncoder( |
- channel_id, number_of_cores, process_thread_, stats_proxy, |
- pre_encode_callback, pacer_.get(), bitrate_allocator_.get())); |
- if (!vie_encoder->Init()) { |
- return false; |
- } |
- ViEEncoder* encoder = vie_encoder.get(); |
- if (!CreateChannel(channel_id, transport, number_of_cores, |
- vie_encoder.release(), ssrcs.size(), true, |
- remote_bitrate_estimator_.get(), |
- transport_feedback_observer)) { |
- return false; |
- } |
- ViEChannel* channel = channel_map_[channel_id]; |
- // Connect the encoder with the send packet router, to enable sending. |
- encoder->StartThreadsAndSetSharedMembers(channel->send_payload_router(), |
- channel->vcm_protection_callback()); |
- |
- encoder_state_feedback_->AddEncoder(ssrcs, encoder); |
- std::vector<uint32_t> first_ssrc(1, ssrcs[0]); |
- encoder->SetSsrcs(first_ssrc); |
- return true; |
+ RTC_DCHECK(encoders_.empty()); |
} |
bool ChannelGroup::CreateReceiveChannel( |
@@ -270,14 +215,13 @@ bool ChannelGroup::CreateReceiveChannel( |
} else { |
bitrate_estimator = remote_bitrate_estimator_.get(); |
} |
- return CreateChannel(channel_id, transport, number_of_cores, nullptr, 1, |
- false, bitrate_estimator, nullptr); |
+ return CreateChannel(channel_id, transport, number_of_cores, 1, false, |
+ bitrate_estimator, nullptr); |
} |
bool ChannelGroup::CreateChannel(int channel_id, |
Transport* transport, |
int number_of_cores, |
- ViEEncoder* vie_encoder, |
size_t max_rtp_streams, |
bool sender, |
RemoteBitrateEstimator* bitrate_estimator, |
@@ -295,46 +239,23 @@ bool ChannelGroup::CreateChannel(int channel_id, |
// Register the channel to receive stats updates. |
call_stats_->RegisterStatsObserver(channel->GetStatsObserver()); |
- // Store the channel, add it to the channel group and save the vie_encoder. |
+ // Store the channel and add it to the channel group. |
channel_map_[channel_id] = channel.release(); |
- if (vie_encoder) { |
- rtc::CritScope lock(&encoder_map_crit_); |
- vie_encoder_map_[channel_id] = vie_encoder; |
- } |
- |
return true; |
} |
void ChannelGroup::DeleteChannel(int channel_id) { |
ViEChannel* vie_channel = PopChannel(channel_id); |
- ViEEncoder* vie_encoder = GetEncoder(channel_id); |
- |
call_stats_->DeregisterStatsObserver(vie_channel->GetStatsObserver()); |
SetChannelRembStatus(false, false, vie_channel); |
- // If we're a sender, remove the feedback and stop all encoding threads and |
- // processing. This must be done before deleting the channel. |
- if (vie_encoder) { |
- encoder_state_feedback_->RemoveEncoder(vie_encoder); |
- vie_encoder->StopThreadsAndRemoveSharedMembers(); |
- } |
- |
- unsigned int remote_ssrc = 0; |
- vie_channel->GetRemoteSSRC(&remote_ssrc); |
+ unsigned int remote_ssrc = vie_channel->GetRemoteSSRC(); |
channel_map_.erase(channel_id); |
remote_bitrate_estimator_->RemoveStream(remote_ssrc); |
delete vie_channel; |
- if (vie_encoder) { |
- { |
- rtc::CritScope lock(&encoder_map_crit_); |
- vie_encoder_map_.erase(vie_encoder_map_.find(channel_id)); |
- } |
- delete vie_encoder; |
- } |
- |
LOG(LS_VERBOSE) << "Channel deleted " << channel_id; |
} |
@@ -347,12 +268,22 @@ ViEChannel* ChannelGroup::GetChannel(int channel_id) const { |
return it->second; |
} |
-ViEEncoder* ChannelGroup::GetEncoder(int channel_id) const { |
- rtc::CritScope lock(&encoder_map_crit_); |
- EncoderMap::const_iterator it = vie_encoder_map_.find(channel_id); |
- if (it == vie_encoder_map_.end()) |
- return nullptr; |
- return it->second; |
+void ChannelGroup::AddEncoder(const std::vector<uint32_t>& ssrcs, |
+ ViEEncoder* encoder) { |
+ encoder_state_feedback_->AddEncoder(ssrcs, encoder); |
+ rtc::CritScope lock(&encoder_crit_); |
+ encoders_.push_back(encoder); |
+} |
+ |
+void ChannelGroup::RemoveEncoder(ViEEncoder* encoder) { |
+ encoder_state_feedback_->RemoveEncoder(encoder); |
+ rtc::CritScope lock(&encoder_crit_); |
+ for (auto it = encoders_.begin(); it != encoders_.end(); ++it) { |
+ if (*it == encoder) { |
+ encoders_.erase(it); |
+ return; |
+ } |
+ } |
} |
ViEChannel* ChannelGroup::PopChannel(int channel_id) { |
@@ -395,8 +326,23 @@ CallStats* ChannelGroup::GetCallStats() const { |
return call_stats_.get(); |
} |
-EncoderStateFeedback* ChannelGroup::GetEncoderStateFeedback() const { |
- return encoder_state_feedback_.get(); |
+TransportFeedbackObserver* ChannelGroup::GetTransportFeedbackObserver() { |
+ 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())); |
+ transport_feedback_adapter_->GetBitrateEstimator()->SetMinBitrate( |
+ min_bitrate_bps_); |
+ call_stats_->RegisterStatsObserver(transport_feedback_adapter_.get()); |
+ } |
+ return transport_feedback_adapter_.get(); |
+} |
+ |
+RtcpIntraFrameObserver* ChannelGroup::GetRtcpIntraFrameObserver() const { |
+ return encoder_state_feedback_->GetRtcpIntraFrameObserver(); |
} |
int64_t ChannelGroup::GetPacerQueuingDelayMs() const { |
@@ -422,15 +368,16 @@ void ChannelGroup::SetChannelRembStatus(bool sender, |
} |
} |
+// TODO(mflodman): Move this logic out from ChannelGroup. |
void ChannelGroup::OnNetworkChanged(uint32_t target_bitrate_bps, |
uint8_t fraction_loss, |
int64_t rtt) { |
bitrate_allocator_->OnNetworkChanged(target_bitrate_bps, fraction_loss, rtt); |
int pad_up_to_bitrate_bps = 0; |
{ |
- rtc::CritScope lock(&encoder_map_crit_); |
- for (const auto& encoder : vie_encoder_map_) |
- pad_up_to_bitrate_bps += encoder.second->GetPaddingNeededBps(); |
+ rtc::CritScope lock(&encoder_crit_); |
+ for (const auto& encoder : encoders_) |
+ pad_up_to_bitrate_bps += encoder->GetPaddingNeededBps(); |
} |
pacer_->UpdateBitrate( |
target_bitrate_bps / 1000, |