Reverse Merged r2884 & r2888 from trunk.
Review URL: https://webrtc-codereview.appspot.com/929005

git-svn-id: http://webrtc.googlecode.com/svn/trunk@2988 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/video_engine/encoder_state_feedback.cc b/webrtc/video_engine/encoder_state_feedback.cc
index cfd0984..64e32e2 100644
--- a/webrtc/video_engine/encoder_state_feedback.cc
+++ b/webrtc/video_engine/encoder_state_feedback.cc
@@ -64,16 +64,13 @@
   return true;
 }
 
-void EncoderStateFeedback::RemoveEncoder(const ViEEncoder* encoder)  {
+void EncoderStateFeedback::RemoveEncoder(uint32_t ssrc)  {
   CriticalSectionScoped lock(crit_.get());
-  SsrcEncoderMap::iterator it = encoders_.begin();
-  while (it != encoders_.end()) {
-    if (it->second == encoder) {
-      encoders_.erase(it++);
-    } else {
-      ++it;
-    }
-  }
+  SsrcEncoderMap::iterator it = encoders_.find(ssrc);
+  if (it == encoders_.end())
+    return;
+
+  encoders_.erase(it);
 }
 
 RtcpIntraFrameObserver* EncoderStateFeedback::GetRtcpIntraFrameObserver() {
@@ -115,10 +112,8 @@
     return;
   }
 
-  ViEEncoder* encoder = it->second;
+  encoders_[new_ssrc] = it->second;
   encoders_.erase(it);
-  encoders_[new_ssrc] = encoder;
-  encoder->OnLocalSsrcChanged(old_ssrc, new_ssrc);
 }
 
 }  // namespace webrtc
diff --git a/webrtc/video_engine/encoder_state_feedback.h b/webrtc/video_engine/encoder_state_feedback.h
index 04d8205..45db92f 100644
--- a/webrtc/video_engine/encoder_state_feedback.h
+++ b/webrtc/video_engine/encoder_state_feedback.h
@@ -38,7 +38,7 @@
   bool AddEncoder(uint32_t ssrc, ViEEncoder* encoder);
 
   // Removes a registered ViEEncoder.
-  void RemoveEncoder(const ViEEncoder* encoder);
+  void RemoveEncoder(uint32_t ssrc);
 
   // Returns an observer to register at the requesting class. The observer has
   // the same lifetime as the EncoderStateFeedback instance.
diff --git a/webrtc/video_engine/encoder_state_feedback_unittest.cc b/webrtc/video_engine/encoder_state_feedback_unittest.cc
index 4133a71..07d1663 100644
--- a/webrtc/video_engine/encoder_state_feedback_unittest.cc
+++ b/webrtc/video_engine/encoder_state_feedback_unittest.cc
@@ -81,7 +81,7 @@
   encoder_state_feedback_->GetRtcpIntraFrameObserver()->OnReceivedRPSI(
       ssrc, rpsi_picture_id);
 
-  encoder_state_feedback_->RemoveEncoder(&encoder);
+  encoder_state_feedback_->RemoveEncoder(ssrc);
 }
 
 // Register multiple encoders and make sure the request is relayed to correct
@@ -125,12 +125,12 @@
   encoder_state_feedback_->GetRtcpIntraFrameObserver()->OnReceivedRPSI(
       ssrc_2, rpsi_pid_2);
 
-  encoder_state_feedback_->RemoveEncoder(&encoder_1);
+  encoder_state_feedback_->RemoveEncoder(ssrc_1);
   EXPECT_CALL(encoder_2, OnReceivedIntraFrameRequest(ssrc_2))
       .Times(1);
   encoder_state_feedback_->GetRtcpIntraFrameObserver()->
       OnReceivedIntraFrameRequest(ssrc_2);
-  encoder_state_feedback_->RemoveEncoder(&encoder_2);
+  encoder_state_feedback_->RemoveEncoder(ssrc_2);
 }
 
 TEST_F(VieKeyRequestTest, AddTwiceError) {
@@ -138,7 +138,7 @@
   MockVieEncoder encoder(process_thread_.get());
   EXPECT_TRUE(encoder_state_feedback_->AddEncoder(ssrc, &encoder));
   EXPECT_FALSE(encoder_state_feedback_->AddEncoder(ssrc, &encoder));
-  encoder_state_feedback_->RemoveEncoder(&encoder);
+  encoder_state_feedback_->RemoveEncoder(ssrc);
 }
 
 }  // namespace webrtc
diff --git a/webrtc/video_engine/vie_channel.cc b/webrtc/video_engine/vie_channel.cc
index bd8c5ae..65ddbac 100644
--- a/webrtc/video_engine/vie_channel.cc
+++ b/webrtc/video_engine/vie_channel.cc
@@ -805,26 +805,10 @@
   return rtp_rtcp_->SetRTXReceiveStatus(true, SSRC);
 }
 
-// TODO(mflodman) Add kViEStreamTypeRtx.
-WebRtc_Word32 ViEChannel::GetLocalSSRC(uint8_t idx, unsigned int* ssrc) {
+WebRtc_Word32 ViEChannel::GetLocalSSRC(uint32_t* ssrc) {
   WEBRTC_TRACE(kTraceInfo, kTraceVideo, ViEId(engine_id_, channel_id_),
                "%s", __FUNCTION__);
-
-  if (idx == 0) {
-    *ssrc = rtp_rtcp_->SSRC();
-    return 0;
-  }
-  CriticalSectionScoped cs(rtp_rtcp_cs_.get());
-  if (idx > simulcast_rtp_rtcp_.size()) {
-    return -1;
-  }
-  std::list<RtpRtcp*>::const_iterator it = simulcast_rtp_rtcp_.begin();
-  for (int i = 1; i < idx; ++i, ++it) {
-    if (it ==  simulcast_rtp_rtcp_.end()) {
-      return -1;
-    }
-  }
-  *ssrc = (*it)->SSRC();
+  *ssrc = rtp_rtcp_->SSRC();
   return 0;
 }
 
diff --git a/webrtc/video_engine/vie_channel.h b/webrtc/video_engine/vie_channel.h
index 107433f..7af08b5 100644
--- a/webrtc/video_engine/vie_channel.h
+++ b/webrtc/video_engine/vie_channel.h
@@ -118,8 +118,8 @@
                         const StreamType usage,
                         const unsigned char simulcast_idx);
 
-  // Gets SSRC for outgoing stream number |idx|.
-  WebRtc_Word32 GetLocalSSRC(uint8_t idx, unsigned int* ssrc);
+  // Gets SSRC for outgoing stream.
+  WebRtc_Word32 GetLocalSSRC(uint32_t* ssrc);
 
   // Gets SSRC for the incoming stream.
   WebRtc_Word32 GetRemoteSSRC(uint32_t* ssrc);
diff --git a/webrtc/video_engine/vie_channel_manager.cc b/webrtc/video_engine/vie_channel_manager.cc
index 9fabd8d..be95b31 100644
--- a/webrtc/video_engine/vie_channel_manager.cc
+++ b/webrtc/video_engine/vie_channel_manager.cc
@@ -121,12 +121,8 @@
 
   // Add ViEEncoder to EncoderFeedBackObserver.
   unsigned int ssrc = 0;
-  int idx = 0;
-  channel_map_[new_channel_id]->GetLocalSSRC(idx, &ssrc);
+  channel_map_[new_channel_id]->GetLocalSSRC(&ssrc);
   encoder_state_feedback->AddEncoder(ssrc, vie_encoder);
-  std::list<unsigned int> ssrcs;
-  ssrcs.push_back(ssrc);
-  vie_encoder->SetSsrcs(ssrcs);
 
   *channel_id = new_channel_id;
   group->AddChannel(*channel_id);
@@ -174,8 +170,7 @@
     }
     // Register the ViEEncoder to get key frame requests for this channel.
     unsigned int ssrc = 0;
-    int stream_idx = 0;
-    channel_map_[new_channel_id]->GetLocalSSRC(stream_idx, &ssrc);
+    channel_map_[new_channel_id]->GetLocalSSRC(&ssrc);
     encoder_state_feedback->AddEncoder(ssrc, vie_encoder);
   } else {
     vie_encoder = ViEEncoderPtr(original_channel);
@@ -229,12 +224,14 @@
     group = FindGroup(channel_id);
     group->SetChannelRembStatus(channel_id, false, false, vie_channel,
                                 vie_encoder);
-    group->GetEncoderStateFeedback()->RemoveEncoder(vie_encoder);
-
     unsigned int remote_ssrc = 0;
     vie_channel->GetRemoteSSRC(&remote_ssrc);
     group->RemoveChannel(channel_id, remote_ssrc);
 
+    unsigned int local_ssrc = 0;
+    vie_channel->GetLocalSSRC(&local_ssrc);
+    group->GetEncoderStateFeedback()->RemoveEncoder(local_ssrc);
+
     // Check if other channels are using the same encoder.
     if (ChannelUsingViEEncoder(channel_id)) {
       vie_encoder = NULL;
@@ -373,24 +370,6 @@
   return true;
 }
 
-void ViEChannelManager::UpdateSsrcs(int channel_id,
-                                    const std::list<unsigned int>& ssrcs) {
-  CriticalSectionScoped cs(channel_id_critsect_);
-  ChannelGroup* channel_group =  FindGroup(channel_id);
-  if (channel_group == NULL) {
-    return;
-  }
-  ViEEncoder* encoder = ViEEncoderPtr(channel_id);
-  assert(encoder);
-
-  EncoderStateFeedback* encoder_state_feedback =
-      channel_group->GetEncoderStateFeedback();
-  for (std::list<unsigned int>::const_iterator it = ssrcs.begin();
-       it != ssrcs.end(); ++it) {
-    encoder_state_feedback->AddEncoder(*it, encoder);
-  }
-}
-
 bool ViEChannelManager::CreateChannelObject(
     int channel_id,
     ViEEncoder* vie_encoder,
diff --git a/webrtc/video_engine/vie_channel_manager.h b/webrtc/video_engine/vie_channel_manager.h
index 04bd37a..2409751 100644
--- a/webrtc/video_engine/vie_channel_manager.h
+++ b/webrtc/video_engine/vie_channel_manager.h
@@ -79,10 +79,6 @@
   // adding a channel.
   bool SetBandwidthEstimationMode(BandwidthEstimationMode mode);
 
-  // Updates the SSRCs for a channel. If one of the SSRCs already is registered,
-  // it will simply be ignored and no error is returned.
-  void UpdateSsrcs(int channel_id, const std::list<unsigned int>& ssrcs);
-
  private:
   // Creates a channel object connected to |vie_encoder|. Assumed to be called
   // protected.
diff --git a/webrtc/video_engine/vie_codec_impl.cc b/webrtc/video_engine/vie_codec_impl.cc
index 7518d17..dd4d37d 100644
--- a/webrtc/video_engine/vie_codec_impl.cc
+++ b/webrtc/video_engine/vie_codec_impl.cc
@@ -10,8 +10,6 @@
 
 #include "video_engine/vie_codec_impl.h"
 
-#include <list>
-
 #include "engine_configurations.h"  // NOLINT
 #include "modules/video_coding/main/interface/video_coding.h"
 #include "system_wrappers/interface/trace.h"
@@ -240,32 +238,6 @@
     }
   }
 
-  // TODO(mflodman) Break out this part in GetLocalSsrcListi().
-  // Update all SSRCs to ViEEncoder.
-  std::list<unsigned int> ssrcs;
-  if (video_codec_internal.numberOfSimulcastStreams == 0) {
-    unsigned int ssrc = 0;
-    if (vie_channel->GetLocalSSRC(0, &ssrc) != 0) {
-      WEBRTC_TRACE(kTraceError, kTraceVideo,
-                   ViEId(shared_data_->instance_id(), video_channel),
-                   "%s: Could not get ssrc", __FUNCTION__);
-    }
-    ssrcs.push_back(ssrc);
-  } else {
-    for (int idx = 0; idx < video_codec_internal.numberOfSimulcastStreams;
-         ++idx) {
-      unsigned int ssrc = 0;
-      if (vie_channel->GetLocalSSRC(idx, &ssrc) != 0) {
-        WEBRTC_TRACE(kTraceError, kTraceVideo,
-                     ViEId(shared_data_->instance_id(), video_channel),
-                     "%s: Could not get ssrc for idx %d", __FUNCTION__, idx);
-      }
-      ssrcs.push_back(ssrc);
-    }
-  }
-  vie_encoder->SetSsrcs(ssrcs);
-  shared_data_->channel_manager()->UpdateSsrcs(video_channel, ssrcs);
-
   // Update the protection mode, we might be switching NACK/FEC.
   vie_encoder->UpdateProtectionMethod();
 
diff --git a/webrtc/video_engine/vie_encoder.cc b/webrtc/video_engine/vie_encoder.cc
index 928ae54..169ed6f 100644
--- a/webrtc/video_engine/vie_encoder.cc
+++ b/webrtc/video_engine/vie_encoder.cc
@@ -73,6 +73,7 @@
     data_cs_(CriticalSectionWrapper::CreateCriticalSection()),
     bitrate_controller_(bitrate_controller),
     paused_(false),
+    time_last_intra_request_ms_(0),
     channels_dropping_delta_frames_(0),
     drop_next_frame_(false),
     fec_enabled_(false),
@@ -811,79 +812,23 @@
   has_received_rpsi_ = true;
 }
 
-void ViEEncoder::OnReceivedIntraFrameRequest(uint32_t ssrc) {
+void ViEEncoder::OnReceivedIntraFrameRequest(uint32_t /*ssrc*/) {
   // Key frame request from remote side, signal to VCM.
   WEBRTC_TRACE(webrtc::kTraceStateInfo, webrtc::kTraceVideo,
                ViEId(engine_id_, channel_id_), "%s", __FUNCTION__);
 
-  int idx = 0;
-  {
-    CriticalSectionScoped cs(data_cs_.get());
-    std::map<unsigned int, int>::iterator stream_it = ssrc_streams_.find(ssrc);
-    if (stream_it == ssrc_streams_.end()) {
-      assert(false);
-      return;
-    }
-    std::map<unsigned int, WebRtc_Word64>::iterator time_it =
-        time_last_intra_request_ms_.find(ssrc);
-    if (time_it == time_last_intra_request_ms_.end()) {
-      time_last_intra_request_ms_[ssrc] = 0;
-    }
-
-    WebRtc_Word64 now = TickTime::MillisecondTimestamp();
-    if (time_last_intra_request_ms_[ssrc] + kViEMinKeyRequestIntervalMs > now) {
-      WEBRTC_TRACE(webrtc::kTraceStream, webrtc::kTraceVideo,
-                   ViEId(engine_id_, channel_id_),
-                   "%s: Not encoding new intra due to timing", __FUNCTION__);
-      return;
-    }
-    time_last_intra_request_ms_[ssrc] = now;
-    idx = stream_it->second;
+  WebRtc_Word64 now = TickTime::MillisecondTimestamp();
+  if (time_last_intra_request_ms_ + kViEMinKeyRequestIntervalMs > now) {
+    WEBRTC_TRACE(webrtc::kTraceStream, webrtc::kTraceVideo,
+                 ViEId(engine_id_, channel_id_),
+                 "%s: Not not encoding new intra due to timing", __FUNCTION__);
+    return;
   }
-  // Release the critsect before triggering key frame.
-  vcm_.IntraFrameRequest(idx);
+  vcm_.IntraFrameRequest(0);
+  time_last_intra_request_ms_ = now;
 }
 
 void ViEEncoder::OnLocalSsrcChanged(uint32_t old_ssrc, uint32_t new_ssrc) {
-  CriticalSectionScoped cs(data_cs_.get());
-  std::map<unsigned int, int>::iterator it = ssrc_streams_.find(old_ssrc);
-  if (it == ssrc_streams_.end()) {
-    return;
-  }
-
-  ssrc_streams_[new_ssrc] = it->second;
-  ssrc_streams_.erase(it);
-
-  std::map<unsigned int, int64_t>::iterator time_it =
-      time_last_intra_request_ms_.find(old_ssrc);
-  int64_t last_intra_request_ms = 0;
-  if (time_it != time_last_intra_request_ms_.end()) {
-    last_intra_request_ms = time_it->second;
-    time_last_intra_request_ms_.erase(time_it);
-  }
-  time_last_intra_request_ms_[new_ssrc] = last_intra_request_ms;
-}
-
-bool ViEEncoder::SetSsrcs(const std::list<unsigned int>& ssrcs) {
-  VideoCodec codec;
-  if (vcm_.SendCodec(&codec) != 0)
-    return false;
-
-  if (codec.numberOfSimulcastStreams > 0 &&
-      ssrcs.size() != codec.numberOfSimulcastStreams) {
-    return false;
-  }
-
-  CriticalSectionScoped cs(data_cs_.get());
-  ssrc_streams_.clear();
-  time_last_intra_request_ms_.clear();
-  int idx = 0;
-  for (std::list<unsigned int>::const_iterator it = ssrcs.begin();
-       it != ssrcs.end(); ++it, ++idx) {
-    unsigned int ssrc = *it;
-    ssrc_streams_[ssrc] = idx;
-  }
-  return true;
 }
 
 // Called from ViEBitrateObserver.
diff --git a/webrtc/video_engine/vie_encoder.h b/webrtc/video_engine/vie_encoder.h
index 339390f..a8dfaba 100644
--- a/webrtc/video_engine/vie_encoder.h
+++ b/webrtc/video_engine/vie_encoder.h
@@ -11,9 +11,6 @@
 #ifndef WEBRTC_VIDEO_ENGINE_VIE_ENCODER_H_
 #define WEBRTC_VIDEO_ENGINE_VIE_ENCODER_H_
 
-#include <list>
-#include <map>
-
 #include "common_types.h"  // NOLINT
 #include "typedefs.h"  //NOLINT
 #include "modules/bitrate_controller/include/bitrate_controller.h"
@@ -137,9 +134,6 @@
   virtual void OnReceivedRPSI(uint32_t ssrc, uint64_t picture_id);
   virtual void OnLocalSsrcChanged(uint32_t old_ssrc, uint32_t new_ssrc);
 
-  // Sets SSRCs for all streams.
-  bool SetSsrcs(const std::list<unsigned int>& ssrcs);
-
   // Effect filter.
   WebRtc_Word32 RegisterEffectFilter(ViEEffectFilter* effect_filter);
 
@@ -173,7 +167,7 @@
   BitrateController* bitrate_controller_;
 
   bool paused_;
-  std::map<unsigned int, int64_t> time_last_intra_request_ms_;
+  WebRtc_Word64 time_last_intra_request_ms_;
   WebRtc_Word32 channels_dropping_delta_frames_;
   bool drop_next_frame_;
 
@@ -188,7 +182,6 @@
   WebRtc_UWord8 picture_id_sli_;
   bool has_received_rpsi_;
   WebRtc_UWord64 picture_id_rpsi_;
-  std::map<unsigned int, int> ssrc_streams_;
 
   ViEFileRecorder file_recorder_;
 
diff --git a/webrtc/video_engine/vie_rtp_rtcp_impl.cc b/webrtc/video_engine/vie_rtp_rtcp_impl.cc
index 0c047d7..c716e77 100644
--- a/webrtc/video_engine/vie_rtp_rtcp_impl.cc
+++ b/webrtc/video_engine/vie_rtp_rtcp_impl.cc
@@ -183,8 +183,7 @@
     shared_data_->SetLastError(kViERtpRtcpInvalidChannelId);
     return -1;
   }
-  uint8_t idx = 0;
-  if (vie_channel->GetLocalSSRC(idx, &SSRC) != 0) {
+  if (vie_channel->GetLocalSSRC(&SSRC) != 0) {
     shared_data_->SetLastError(kViERtpRtcpUnknownError);
     return -1;
   }