Make SetREMBData accept vector of SSRCs.

BUG=
R=pbos@webrtc.org, stefan@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/32049004

git-svn-id: http://webrtc.googlecode.com/svn/trunk@7697 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/modules/rtp_rtcp/interface/rtp_rtcp.h b/webrtc/modules/rtp_rtcp/interface/rtp_rtcp.h
index 7b0a4f8..e117b23 100644
--- a/webrtc/modules/rtp_rtcp/interface/rtp_rtcp.h
+++ b/webrtc/modules/rtp_rtcp/interface/rtp_rtcp.h
@@ -540,8 +540,7 @@
     virtual int32_t SetREMBStatus(const bool enable) = 0;
 
     virtual int32_t SetREMBData(const uint32_t bitrate,
-                                const uint8_t numberOfSSRC,
-                                const uint32_t* SSRC) = 0;
+                                const std::vector<uint32_t>& ssrcs) = 0;
 
     /*
     *   (IJ) Extended jitter report.
diff --git a/webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h b/webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h
index 2caa631..7e187c7 100644
--- a/webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h
+++ b/webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h
@@ -196,8 +196,8 @@
       bool());
   MOCK_METHOD1(SetREMBStatus,
       int32_t(const bool enable));
-  MOCK_METHOD3(SetREMBData,
-      int32_t(const uint32_t bitrate, const uint8_t numberOfSSRC, const uint32_t* SSRC));
+  MOCK_METHOD2(SetREMBData,
+      int32_t(const uint32_t bitrate, const std::vector<uint32_t>& ssrcs));
   MOCK_CONST_METHOD0(IJ,
       bool());
   MOCK_METHOD1(SetIJStatus,
diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_format_remb_unittest.cc b/webrtc/modules/rtp_rtcp/source/rtcp_format_remb_unittest.cc
index c055fd4..17671b7 100644
--- a/webrtc/modules/rtp_rtcp/source/rtcp_format_remb_unittest.cc
+++ b/webrtc/modules/rtp_rtcp/source/rtcp_format_remb_unittest.cc
@@ -116,13 +116,13 @@
   EXPECT_EQ(0, rtcp_sender_->SetREMBStatus(false));
   EXPECT_FALSE(rtcp_sender_->REMB());
 
-  EXPECT_EQ(0, rtcp_sender_->SetREMBData(1234, 0, NULL));
+  EXPECT_EQ(0, rtcp_sender_->SetREMBData(1234, std::vector<uint32_t>()));
 }
 
 TEST_F(RtcpFormatRembTest, TestNonCompund) {
   uint32_t SSRC = 456789;
   EXPECT_EQ(0, rtcp_sender_->SetRTCPStatus(kRtcpNonCompound));
-  EXPECT_EQ(0, rtcp_sender_->SetREMBData(1234, 1, &SSRC));
+  EXPECT_EQ(0, rtcp_sender_->SetREMBData(1234, std::vector<uint32_t>(1, SSRC)));
   RTCPSender::FeedbackState feedback_state =
       dummy_rtp_rtcp_impl_->GetFeedbackState();
   EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state, kRtcpRemb));
@@ -131,7 +131,8 @@
 TEST_F(RtcpFormatRembTest, TestCompund) {
   uint32_t SSRCs[2] = {456789, 98765};
   EXPECT_EQ(0, rtcp_sender_->SetRTCPStatus(kRtcpCompound));
-  EXPECT_EQ(0, rtcp_sender_->SetREMBData(1234, 2, SSRCs));
+  EXPECT_EQ(0, rtcp_sender_->SetREMBData(
+      1234, std::vector<uint32_t>(SSRCs, SSRCs + 2)));
   RTCPSender::FeedbackState feedback_state =
       dummy_rtp_rtcp_impl_->GetFeedbackState();
   EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state, kRtcpRemb));
diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc b/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc
index afe8019..1752ab9 100644
--- a/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc
+++ b/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc
@@ -120,9 +120,6 @@
 
     _sequenceNumberFIR(0),
 
-    _lengthRembSSRC(0),
-    _sizeRembSSRC(0),
-    _rembSSRC(NULL),
     _rembBitrate(0),
 
     _tmmbrHelp(),
@@ -145,7 +142,6 @@
 }
 
 RTCPSender::~RTCPSender() {
-  delete [] _rembSSRC;
   delete [] _appData;
 
   while (!internal_report_blocks_.empty()) {
@@ -251,24 +247,12 @@
 
 int32_t
 RTCPSender::SetREMBData(const uint32_t bitrate,
-                        const uint8_t numberOfSSRC,
-                        const uint32_t* SSRC)
+                        const std::vector<uint32_t>& ssrcs)
 {
     CriticalSectionScoped lock(_criticalSectionRTCPSender);
     _rembBitrate = bitrate;
+    remb_ssrcs_ = ssrcs;
 
-    if(_sizeRembSSRC < numberOfSSRC)
-    {
-        delete [] _rembSSRC;
-        _rembSSRC = new uint32_t[numberOfSSRC];
-        _sizeRembSSRC = numberOfSSRC;
-    }
-
-    _lengthRembSSRC = numberOfSSRC;
-    for (int i = 0; i < numberOfSSRC; i++)
-    {
-        _rembSSRC[i] = SSRC[i];
-    }
     _sendREMB = true;
     // Send a REMB immediately if we have a new REMB. The frequency of REMBs is
     // throttled by the caller.
@@ -1048,7 +1032,7 @@
 RTCPSender::BuildREMB(uint8_t* rtcpbuffer, int& pos)
 {
     // sanity
-    if(pos + 20 + 4 * _lengthRembSSRC >= IP_PACKET_SIZE)
+    if(pos + 20 + 4 * remb_ssrcs_.size() >= IP_PACKET_SIZE)
     {
         return -2;
     }
@@ -1058,7 +1042,7 @@
     rtcpbuffer[pos++]=(uint8_t)206;
 
     rtcpbuffer[pos++]=(uint8_t)0;
-    rtcpbuffer[pos++]=_lengthRembSSRC + 4;
+    rtcpbuffer[pos++]=remb_ssrcs_.size() + 4;
 
     // Add our own SSRC
     RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _SSRC);
@@ -1073,7 +1057,7 @@
     rtcpbuffer[pos++]='M';
     rtcpbuffer[pos++]='B';
 
-    rtcpbuffer[pos++] = _lengthRembSSRC;
+    rtcpbuffer[pos++] = remb_ssrcs_.size();
     // 6 bit Exp
     // 18 bit mantissa
     uint8_t brExp = 0;
@@ -1090,10 +1074,10 @@
     rtcpbuffer[pos++]=(uint8_t)(brMantissa >> 8);
     rtcpbuffer[pos++]=(uint8_t)(brMantissa);
 
-    for (int i = 0; i < _lengthRembSSRC; i++)
+    for (size_t i = 0; i < remb_ssrcs_.size(); i++)
     {
-      RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, _rembSSRC[i]);
-        pos += 4;
+      RtpUtility::AssignUWord32ToBuffer(rtcpbuffer + pos, remb_ssrcs_[i]);
+      pos += 4;
     }
     return 0;
 }
diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_sender.h b/webrtc/modules/rtp_rtcp/source/rtcp_sender.h
index 06c373b..668c7c7 100644
--- a/webrtc/modules/rtp_rtcp/source/rtcp_sender.h
+++ b/webrtc/modules/rtp_rtcp/source/rtcp_sender.h
@@ -133,8 +133,7 @@
     int32_t SetREMBStatus(const bool enable);
 
     int32_t SetREMBData(const uint32_t bitrate,
-                        const uint8_t numberOfSSRC,
-                        const uint32_t* SSRC);
+                        const std::vector<uint32_t>& ssrcs);
 
     /*
     *   TMMBR
@@ -334,10 +333,8 @@
     uint8_t         _sequenceNumberFIR GUARDED_BY(_criticalSectionRTCPSender);
 
     // REMB
-    uint8_t       _lengthRembSSRC GUARDED_BY(_criticalSectionRTCPSender);
-    uint8_t       _sizeRembSSRC GUARDED_BY(_criticalSectionRTCPSender);
-    uint32_t*     _rembSSRC GUARDED_BY(_criticalSectionRTCPSender);
     uint32_t      _rembBitrate GUARDED_BY(_criticalSectionRTCPSender);
+    std::vector<uint32_t>  remb_ssrcs_ GUARDED_BY(_criticalSectionRTCPSender);
 
     TMMBRHelp           _tmmbrHelp GUARDED_BY(_criticalSectionRTCPSender);
     uint32_t      _tmmbr_Send GUARDED_BY(_criticalSectionRTCPSender);
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.cc b/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
index 69b5bb4..f8713e2 100644
--- a/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
+++ b/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
@@ -873,9 +873,8 @@
 }
 
 int32_t ModuleRtpRtcpImpl::SetREMBData(const uint32_t bitrate,
-                                       const uint8_t number_of_ssrc,
-                                       const uint32_t* ssrc) {
-  return rtcp_sender_.SetREMBData(bitrate, number_of_ssrc, ssrc);
+                                       const std::vector<uint32_t>& ssrcs) {
+  return rtcp_sender_.SetREMBData(bitrate, ssrcs);
 }
 
 // (IJ) Extended jitter report.
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.h b/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.h
index a015a3e..4975812 100644
--- a/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.h
+++ b/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.h
@@ -205,8 +205,7 @@
   virtual int32_t SetREMBStatus(const bool enable) OVERRIDE;
 
   virtual int32_t SetREMBData(const uint32_t bitrate,
-                              const uint8_t number_of_ssrc,
-                              const uint32_t* ssrc) OVERRIDE;
+                              const std::vector<uint32_t>& ssrcs) OVERRIDE;
 
   // (IJ) Extended jitter report.
   virtual bool IJ() const OVERRIDE;
diff --git a/webrtc/video/rampup_tests.cc b/webrtc/video/rampup_tests.cc
index 011ef6a..3238704 100644
--- a/webrtc/video/rampup_tests.cc
+++ b/webrtc/video/rampup_tests.cc
@@ -108,8 +108,7 @@
       TriggerTestDone();
     }
   }
-  rtp_rtcp_->SetREMBData(
-      bitrate, static_cast<uint8_t>(ssrcs.size()), &ssrcs[0]);
+  rtp_rtcp_->SetREMBData(bitrate, ssrcs);
   rtp_rtcp_->Process();
 }
 
@@ -235,8 +234,7 @@
     const std::vector<unsigned int>& ssrcs,
     unsigned int bitrate) {
   CriticalSectionScoped lock(crit_.get());
-  rtp_rtcp_->SetREMBData(
-      bitrate, static_cast<uint8_t>(ssrcs.size()), &ssrcs[0]);
+  rtp_rtcp_->SetREMBData(bitrate, ssrcs);
   rtp_rtcp_->Process();
   last_remb_bps_ = bitrate;
 }
diff --git a/webrtc/video/video_send_stream_tests.cc b/webrtc/video/video_send_stream_tests.cc
index b5f5d88..8aae703 100644
--- a/webrtc/video/video_send_stream_tests.cc
+++ b/webrtc/video/video_send_stream_tests.cc
@@ -829,7 +829,7 @@
       rtcp_sender.SetRemoteSSRC(kSendSsrcs[0]);
       if (remb_value > 0) {
         rtcp_sender.SetREMBStatus(true);
-        rtcp_sender.SetREMBData(remb_value, 0, NULL);
+        rtcp_sender.SetREMBData(remb_value, std::vector<uint32_t>());
       }
       RTCPSender::FeedbackState feedback_state;
       EXPECT_EQ(0, rtcp_sender.SendRTCP(feedback_state, kRtcpRr));
@@ -1059,7 +1059,8 @@
                           "bps",
                           false);
         if (total_bitrate_bps > kHighBitrateBps) {
-          rtp_rtcp_->SetREMBData(kRembBitrateBps, 1, &header.ssrc);
+          rtp_rtcp_->SetREMBData(kRembBitrateBps,
+                                 std::vector<uint32_t>(1, header.ssrc));
           rtp_rtcp_->Process();
           bitrate_capped_ = true;
         } else if (bitrate_capped_ &&
diff --git a/webrtc/video_engine/vie_remb.cc b/webrtc/video_engine/vie_remb.cc
index d04f0a3..2cf794c 100644
--- a/webrtc/video_engine/vie_remb.cc
+++ b/webrtc/video_engine/vie_remb.cc
@@ -136,8 +136,7 @@
   list_crit_->Leave();
 
   if (sender) {
-    // TODO(holmer): Change RTP module API to take a const vector reference.
-    sender->SetREMBData(bitrate_, ssrcs.size(), &ssrcs[0]);
+    sender->SetREMBData(bitrate_, ssrcs);
   }
 }
 
diff --git a/webrtc/video_engine/vie_remb_unittest.cc b/webrtc/video_engine/vie_remb_unittest.cc
index 1f0b70c..272833d 100644
--- a/webrtc/video_engine/vie_remb_unittest.cc
+++ b/webrtc/video_engine/vie_remb_unittest.cc
@@ -53,12 +53,12 @@
   vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
 
   TickTime::AdvanceFakeClock(1000);
-  EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, 1, _))
+  EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, ssrcs))
       .Times(1);
   vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
 
   // Lower bitrate to send another REMB packet.
-  EXPECT_CALL(rtp, SetREMBData(bitrate_estimate - 100, 1, _))
+  EXPECT_CALL(rtp, SetREMBData(bitrate_estimate - 100, ssrcs))
         .Times(1);
   vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate - 100);
 
@@ -78,14 +78,14 @@
   vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
   // Call OnReceiveBitrateChanged twice to get a first estimate.
   TickTime::AdvanceFakeClock(1000);
-  EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, 1, _))
+  EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, ssrcs))
         .Times(1);
   vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
 
   // Lower the estimate with more than 3% to trigger a call to SetREMBData right
   // away.
   bitrate_estimate = bitrate_estimate - 100;
-  EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, 1, _))
+  EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, ssrcs))
       .Times(1);
   vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
 }
@@ -104,7 +104,7 @@
   vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]);
 
   // Call OnReceiveBitrateChanged twice to get a first estimate.
-  EXPECT_CALL(rtp_0, SetREMBData(bitrate_estimate[0], 2, _))
+  EXPECT_CALL(rtp_0, SetREMBData(bitrate_estimate[0], ssrcs))
         .Times(1);
   TickTime::AdvanceFakeClock(1000);
   vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]);
@@ -112,7 +112,7 @@
   vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1] + 100);
 
   // Lower the estimate to trigger a callback.
-  EXPECT_CALL(rtp_0, SetREMBData(bitrate_estimate[1], 2, _))
+  EXPECT_CALL(rtp_0, SetREMBData(bitrate_estimate[1], ssrcs))
       .Times(1);
   vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1]);
 
@@ -135,17 +135,17 @@
   vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
   // Call OnReceiveBitrateChanged twice to get a first estimate.
   TickTime::AdvanceFakeClock(1000);
-  EXPECT_CALL(rtp_0, SetREMBData(bitrate_estimate, 2, _))
+  EXPECT_CALL(rtp_0, SetREMBData(bitrate_estimate, ssrcs))
       .Times(1);
   vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
 
   // Increased estimate shouldn't trigger a callback right away.
-  EXPECT_CALL(rtp_0, SetREMBData(_, _, _))
+  EXPECT_CALL(rtp_0, SetREMBData(_, _))
       .Times(0);
   vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate + 1);
 
   // Decreasing the estimate less than 3% shouldn't trigger a new callback.
-  EXPECT_CALL(rtp_0, SetREMBData(_, _, _))
+  EXPECT_CALL(rtp_0, SetREMBData(_, _))
       .Times(0);
   int lower_estimate = bitrate_estimate * 98 / 100;
   vie_remb_->OnReceiveBitrateChanged(ssrcs, lower_estimate);
@@ -169,13 +169,13 @@
   vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
   // Call OnReceiveBitrateChanged twice to get a first estimate.
   TickTime::AdvanceFakeClock(1000);
-  EXPECT_CALL(rtp_0, SetREMBData(bitrate_estimate, 2, _))
+  EXPECT_CALL(rtp_0, SetREMBData(bitrate_estimate, ssrcs))
       .Times(1);
   vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
 
   // Decrease estimate to trigger a REMB.
   bitrate_estimate = bitrate_estimate - 100;
-  EXPECT_CALL(rtp_0, SetREMBData(bitrate_estimate, 2, _))
+  EXPECT_CALL(rtp_0, SetREMBData(bitrate_estimate, ssrcs))
       .Times(1);
   vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
 
@@ -186,7 +186,7 @@
   vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
 
   bitrate_estimate = bitrate_estimate - 100;
-  EXPECT_CALL(rtp_1, SetREMBData(bitrate_estimate, 2, _))
+  EXPECT_CALL(rtp_1, SetREMBData(bitrate_estimate, ssrcs))
         .Times(1);
   vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
 
@@ -205,18 +205,18 @@
   vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
   // Call OnReceiveBitrateChanged twice to get a first estimate.
   TickTime::AdvanceFakeClock(1000);
-  EXPECT_CALL(rtp, SetREMBData(_, _, _))
+  EXPECT_CALL(rtp, SetREMBData(_, _))
         .Times(1);
   vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
 
   // Lower the estimate, should trigger a call to SetREMBData right away.
   bitrate_estimate = bitrate_estimate - 100;
-  EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, 1, _))
+  EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, ssrcs))
       .Times(1);
   vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
 
   // Call OnReceiveBitrateChanged again, this should not trigger a new callback.
-  EXPECT_CALL(rtp, SetREMBData(_, _, _))
+  EXPECT_CALL(rtp, SetREMBData(_, _))
       .Times(0);
   vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
   vie_remb_->RemoveReceiveChannel(&rtp);
@@ -237,13 +237,13 @@
 
   // Call OnReceiveBitrateChanged twice to get a first estimate.
   TickTime::AdvanceFakeClock(1000);
-  EXPECT_CALL(rtp, SetREMBData(_, _, _))
+  EXPECT_CALL(rtp, SetREMBData(_, _))
       .Times(1);
   vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
 
   // Lower the estimate to trigger a new packet REMB packet.
   bitrate_estimate = bitrate_estimate - 100;
-  EXPECT_CALL(rtp, SetREMBData(_, _, _))
+  EXPECT_CALL(rtp, SetREMBData(_, _))
       .Times(1);
   vie_remb_->OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
 }