diff --git a/webrtc/video/call.cc b/webrtc/video/call.cc index a73932509b..adfaa53b45 100644 --- a/webrtc/video/call.cc +++ b/webrtc/video/call.cc @@ -180,8 +180,9 @@ Call::Call(const Call::Config& config) // TODO(pbos): Remove base channel when CreateReceiveChannel no longer // requires one. - CHECK(channel_group_->CreateSendChannel( - base_channel_id_, 0, &transport_adapter_, num_cpu_cores_, 1, true)); + CHECK(channel_group_->CreateSendChannel(base_channel_id_, 0, + &transport_adapter_, num_cpu_cores_, + std::vector(), true)); if (config.overuse_callback) { overuse_observer_proxy_.reset( diff --git a/webrtc/video/video_send_stream.cc b/webrtc/video/video_send_stream.cc index c0d73490f8..7cd1f9eab0 100644 --- a/webrtc/video/video_send_stream.cc +++ b/webrtc/video/video_send_stream.cc @@ -20,7 +20,6 @@ #include "webrtc/system_wrappers/interface/logging.h" #include "webrtc/system_wrappers/interface/trace_event.h" #include "webrtc/video/video_capture_input.h" -#include "webrtc/video_engine/encoder_state_feedback.h" #include "webrtc/video_engine/vie_channel.h" #include "webrtc/video_engine/vie_channel_group.h" #include "webrtc/video_engine/vie_defines.h" @@ -121,8 +120,8 @@ VideoSendStream::VideoSendStream( stats_proxy_(Clock::GetRealTimeClock(), config) { DCHECK(!config_.rtp.ssrcs.empty()); CHECK(channel_group->CreateSendChannel(channel_id_, 0, &transport_adapter_, - num_cpu_cores, - config_.rtp.ssrcs.size(), true)); + num_cpu_cores, config_.rtp.ssrcs, + true)); vie_channel_ = channel_group_->GetChannel(channel_id_); vie_encoder_ = channel_group_->GetEncoder(channel_id_); @@ -495,9 +494,6 @@ bool VideoSendStream::SetSendCodec(VideoCodec video_codec) { // Update used SSRCs. vie_encoder_->SetSsrcs(used_ssrcs); - EncoderStateFeedback* encoder_state_feedback = - channel_group_->GetEncoderStateFeedback(); - encoder_state_feedback->UpdateSsrcs(used_ssrcs, vie_encoder_); // Update the protection mode, we might be switching NACK/FEC. vie_encoder_->UpdateProtectionMethod(vie_encoder_->nack_enabled(), diff --git a/webrtc/video_engine/encoder_state_feedback.cc b/webrtc/video_engine/encoder_state_feedback.cc index 4d9db5847d..55a0c43946 100644 --- a/webrtc/video_engine/encoder_state_feedback.cc +++ b/webrtc/video_engine/encoder_state_feedback.cc @@ -54,34 +54,16 @@ EncoderStateFeedback::~EncoderStateFeedback() { assert(encoders_.empty()); } -void EncoderStateFeedback::UpdateSsrcs(const std::vector& ssrcs, - ViEEncoder* encoder) { +void EncoderStateFeedback::AddEncoder(const std::vector& ssrcs, + ViEEncoder* encoder) { + DCHECK(!ssrcs.empty()); CriticalSectionScoped lock(crit_.get()); - SsrcEncoderMap::iterator it = encoders_.begin(); - while (it != encoders_.end()) { - if (it->second == encoder) { - encoders_.erase(it++); - } else { - ++it; - } - } for (uint32_t ssrc : ssrcs) { DCHECK(encoders_.find(ssrc) == encoders_.end()); encoders_[ssrc] = encoder; } } -bool EncoderStateFeedback::AddEncoder(uint32_t ssrc, ViEEncoder* encoder) { - CriticalSectionScoped lock(crit_.get()); - if (encoders_.find(ssrc) != encoders_.end()) { - // Two encoders must not have the same ssrc. - return false; - } - - encoders_[ssrc] = encoder; - return true; -} - void EncoderStateFeedback::RemoveEncoder(const ViEEncoder* encoder) { CriticalSectionScoped lock(crit_.get()); SsrcEncoderMap::iterator it = encoders_.begin(); diff --git a/webrtc/video_engine/encoder_state_feedback.h b/webrtc/video_engine/encoder_state_feedback.h index d74c6c2ed0..40fbf94377 100644 --- a/webrtc/video_engine/encoder_state_feedback.h +++ b/webrtc/video_engine/encoder_state_feedback.h @@ -35,11 +35,8 @@ class EncoderStateFeedback { EncoderStateFeedback(); ~EncoderStateFeedback(); - // Update SSRCs for an encoder. - void UpdateSsrcs(const std::vector& ssrc, ViEEncoder* encoder); - - // Adds an encoder to receive feedback for a unique ssrc. - bool AddEncoder(uint32_t ssrc, ViEEncoder* encoder); + // Adds an encoder to receive feedback for a set of SSRCs. + void AddEncoder(const std::vector& ssrc, ViEEncoder* encoder); // Removes a registered ViEEncoder. void RemoveEncoder(const ViEEncoder* encoder); diff --git a/webrtc/video_engine/encoder_state_feedback_unittest.cc b/webrtc/video_engine/encoder_state_feedback_unittest.cc index eab33d407a..07e1990481 100644 --- a/webrtc/video_engine/encoder_state_feedback_unittest.cc +++ b/webrtc/video_engine/encoder_state_feedback_unittest.cc @@ -68,7 +68,7 @@ class VieKeyRequestTest : public ::testing::Test { TEST_F(VieKeyRequestTest, CreateAndTriggerRequests) { const int ssrc = 1234; MockVieEncoder encoder(process_thread_.get(), &pacer_); - EXPECT_TRUE(encoder_state_feedback_->AddEncoder(ssrc, &encoder)); + encoder_state_feedback_->AddEncoder(std::vector(1, ssrc), &encoder); EXPECT_CALL(encoder, OnReceivedIntraFrameRequest(ssrc)) .Times(1); @@ -97,8 +97,10 @@ TEST_F(VieKeyRequestTest, MultipleEncoders) { const int ssrc_2 = 5678; MockVieEncoder encoder_1(process_thread_.get(), &pacer_); MockVieEncoder encoder_2(process_thread_.get(), &pacer_); - EXPECT_TRUE(encoder_state_feedback_->AddEncoder(ssrc_1, &encoder_1)); - EXPECT_TRUE(encoder_state_feedback_->AddEncoder(ssrc_2, &encoder_2)); + encoder_state_feedback_->AddEncoder(std::vector(1, ssrc_1), + &encoder_1); + encoder_state_feedback_->AddEncoder(std::vector(1, ssrc_2), + &encoder_2); EXPECT_CALL(encoder_1, OnReceivedIntraFrameRequest(ssrc_1)) .Times(1); @@ -139,12 +141,4 @@ TEST_F(VieKeyRequestTest, MultipleEncoders) { encoder_state_feedback_->RemoveEncoder(&encoder_2); } -TEST_F(VieKeyRequestTest, AddTwiceError) { - const int ssrc = 1234; - MockVieEncoder encoder(process_thread_.get(), &pacer_); - EXPECT_TRUE(encoder_state_feedback_->AddEncoder(ssrc, &encoder)); - EXPECT_FALSE(encoder_state_feedback_->AddEncoder(ssrc, &encoder)); - encoder_state_feedback_->RemoveEncoder(&encoder); -} - } // namespace webrtc diff --git a/webrtc/video_engine/vie_channel_group.cc b/webrtc/video_engine/vie_channel_group.cc index 055e1c3a19..cb041bda2e 100644 --- a/webrtc/video_engine/vie_channel_group.cc +++ b/webrtc/video_engine/vie_channel_group.cc @@ -193,9 +193,11 @@ bool ChannelGroup::CreateSendChannel(int channel_id, int engine_id, Transport* transport, int number_of_cores, - size_t max_rtp_streams, + const std::vector& ssrcs, bool disable_default_encoder) { - DCHECK_GT(max_rtp_streams, 0u); + // TODO(pbos): Remove checks for empty ssrcs and add this check when there's + // no base channel. + // DCHECK(!ssrcs.empty()); rtc::scoped_ptr vie_encoder( new ViEEncoder(channel_id, number_of_cores, *config_.get(), *process_thread_, pacer_.get(), bitrate_allocator_.get(), @@ -205,8 +207,8 @@ bool ChannelGroup::CreateSendChannel(int channel_id, } ViEEncoder* encoder = vie_encoder.get(); if (!CreateChannel(channel_id, engine_id, transport, number_of_cores, - vie_encoder.release(), max_rtp_streams, true, - disable_default_encoder)) { + vie_encoder.release(), ssrcs.empty() ? 1 : ssrcs.size(), + true, disable_default_encoder)) { return false; } ViEChannel* channel = channel_map_[channel_id]; @@ -214,14 +216,11 @@ bool ChannelGroup::CreateSendChannel(int channel_id, encoder->StartThreadsAndSetSharedMembers(channel->send_payload_router(), channel->vcm_protection_callback()); - // Register the ViEEncoder to get key frame requests for this channel. - unsigned int ssrc = 0; - int stream_idx = 0; - channel->GetLocalSSRC(stream_idx, &ssrc); - encoder_state_feedback_->AddEncoder(ssrc, encoder); - std::vector ssrcs; - ssrcs.push_back(ssrc); - encoder->SetSsrcs(ssrcs); + if (!ssrcs.empty()) { + encoder_state_feedback_->AddEncoder(ssrcs, encoder); + std::vector first_ssrc(1, ssrcs[0]); + encoder->SetSsrcs(first_ssrc); + } return true; } diff --git a/webrtc/video_engine/vie_channel_group.h b/webrtc/video_engine/vie_channel_group.h index 37064c8976..ff001f97d8 100644 --- a/webrtc/video_engine/vie_channel_group.h +++ b/webrtc/video_engine/vie_channel_group.h @@ -46,7 +46,7 @@ class ChannelGroup : public BitrateObserver { int engine_id, Transport* transport, int number_of_cores, - size_t max_rtp_streams, + const std::vector& ssrcs, bool disable_default_encoder); bool CreateReceiveChannel(int channel_id, int engine_id,