Remove UpdateSsrcs from EncoderStateFeedback.

Removes ability to modify set SSRCs from EncoderStateFeedback after
construction.

BUG=webrtc:1695
R=sprang@webrtc.org
TBR=stefan@webrtc.org

Review URL: https://codereview.webrtc.org/1241123002

Cr-Commit-Position: refs/heads/master@{#9603}
diff --git a/webrtc/video/call.cc b/webrtc/video/call.cc
index a739325..adfaa53 100644
--- a/webrtc/video/call.cc
+++ b/webrtc/video/call.cc
@@ -180,8 +180,9 @@
 
   // 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<uint32_t>(), 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 c0d7349..7cd1f9e 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 @@
       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 @@
 
   // 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 4d9db58..55a0c43 100644
--- a/webrtc/video_engine/encoder_state_feedback.cc
+++ b/webrtc/video_engine/encoder_state_feedback.cc
@@ -54,34 +54,16 @@
   assert(encoders_.empty());
 }
 
-void EncoderStateFeedback::UpdateSsrcs(const std::vector<uint32_t>& ssrcs,
-                                       ViEEncoder* encoder) {
+void EncoderStateFeedback::AddEncoder(const std::vector<uint32_t>& 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 d74c6c2..40fbf94 100644
--- a/webrtc/video_engine/encoder_state_feedback.h
+++ b/webrtc/video_engine/encoder_state_feedback.h
@@ -35,11 +35,8 @@
   EncoderStateFeedback();
   ~EncoderStateFeedback();
 
-  // Update SSRCs for an encoder.
-  void UpdateSsrcs(const std::vector<uint32_t>& 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<uint32_t>& 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 eab33d4..07e1990 100644
--- a/webrtc/video_engine/encoder_state_feedback_unittest.cc
+++ b/webrtc/video_engine/encoder_state_feedback_unittest.cc
@@ -68,7 +68,7 @@
 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<uint32_t>(1, ssrc), &encoder);
 
   EXPECT_CALL(encoder, OnReceivedIntraFrameRequest(ssrc))
       .Times(1);
@@ -97,8 +97,10 @@
   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<uint32_t>(1, ssrc_1),
+                                      &encoder_1);
+  encoder_state_feedback_->AddEncoder(std::vector<uint32_t>(1, ssrc_2),
+                                      &encoder_2);
 
   EXPECT_CALL(encoder_1, OnReceivedIntraFrameRequest(ssrc_1))
       .Times(1);
@@ -139,12 +141,4 @@
   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 055e1c3..cb041bd 100644
--- a/webrtc/video_engine/vie_channel_group.cc
+++ b/webrtc/video_engine/vie_channel_group.cc
@@ -193,9 +193,11 @@
                                      int engine_id,
                                      Transport* transport,
                                      int number_of_cores,
-                                     size_t max_rtp_streams,
+                                     const std::vector<uint32_t>& 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<ViEEncoder> vie_encoder(
       new ViEEncoder(channel_id, number_of_cores, *config_.get(),
                      *process_thread_, pacer_.get(), bitrate_allocator_.get(),
@@ -205,8 +207,8 @@
   }
   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 @@
   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<uint32_t> ssrcs;
-  ssrcs.push_back(ssrc);
-  encoder->SetSsrcs(ssrcs);
+  if (!ssrcs.empty()) {
+    encoder_state_feedback_->AddEncoder(ssrcs, encoder);
+    std::vector<uint32_t> 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 37064c8..ff001f9 100644
--- a/webrtc/video_engine/vie_channel_group.h
+++ b/webrtc/video_engine/vie_channel_group.h
@@ -46,7 +46,7 @@
                          int engine_id,
                          Transport* transport,
                          int number_of_cores,
-                         size_t max_rtp_streams,
+                         const std::vector<uint32_t>& ssrcs,
                          bool disable_default_encoder);
   bool CreateReceiveChannel(int channel_id,
                             int engine_id,