Stop leaking FlexfecReceiveStream objects after call shutdown.

BUG=webrtc:7017

Review-Url: https://codereview.webrtc.org/2645703003
Cr-Commit-Position: refs/heads/master@{#16212}
diff --git a/webrtc/media/engine/fakewebrtccall.cc b/webrtc/media/engine/fakewebrtccall.cc
index d189f91..896d0b9 100644
--- a/webrtc/media/engine/fakewebrtccall.cc
+++ b/webrtc/media/engine/fakewebrtccall.cc
@@ -378,7 +378,7 @@
   return nullptr;
 }
 
-const std::list<FakeFlexfecReceiveStream>&
+const std::vector<FakeFlexfecReceiveStream*>&
 FakeCall::GetFlexfecReceiveStreams() {
   return flexfec_receive_streams_;
 }
@@ -486,21 +486,24 @@
 
 webrtc::FlexfecReceiveStream* FakeCall::CreateFlexfecReceiveStream(
     const webrtc::FlexfecReceiveStream::Config& config) {
-  flexfec_receive_streams_.push_back(FakeFlexfecReceiveStream(config));
+  FakeFlexfecReceiveStream* fake_stream = new FakeFlexfecReceiveStream(config);
+  flexfec_receive_streams_.push_back(fake_stream);
   ++num_created_receive_streams_;
-  return &flexfec_receive_streams_.back();
+  return fake_stream;
 }
 
 void FakeCall::DestroyFlexfecReceiveStream(
     webrtc::FlexfecReceiveStream* receive_stream) {
-  for (auto it = flexfec_receive_streams_.begin();
-       it != flexfec_receive_streams_.end(); ++it) {
-    if (&(*it) == receive_stream) {
-      flexfec_receive_streams_.erase(it);
-      return;
-    }
+  auto it = std::find(flexfec_receive_streams_.begin(),
+                      flexfec_receive_streams_.end(),
+                      static_cast<FakeFlexfecReceiveStream*>(receive_stream));
+  if (it == flexfec_receive_streams_.end()) {
+    ADD_FAILURE()
+        << "DestroyFlexfecReceiveStream called with unknown parameter.";
+  } else {
+    delete *it;
+    flexfec_receive_streams_.erase(it);
   }
-  ADD_FAILURE() << "DestroyFlexfecReceiveStream called with unknown parameter.";
 }
 
 webrtc::PacketReceiver* FakeCall::Receiver() {
diff --git a/webrtc/media/engine/fakewebrtccall.h b/webrtc/media/engine/fakewebrtccall.h
index c862c1c..9ceda0f 100644
--- a/webrtc/media/engine/fakewebrtccall.h
+++ b/webrtc/media/engine/fakewebrtccall.h
@@ -20,7 +20,6 @@
 #ifndef WEBRTC_MEDIA_ENGINE_FAKEWEBRTCCALL_H_
 #define WEBRTC_MEDIA_ENGINE_FAKEWEBRTCCALL_H_
 
-#include <list>
 #include <memory>
 #include <string>
 #include <vector>
@@ -230,7 +229,7 @@
   const std::vector<FakeAudioReceiveStream*>& GetAudioReceiveStreams();
   const FakeAudioReceiveStream* GetAudioReceiveStream(uint32_t ssrc);
 
-  const std::list<FakeFlexfecReceiveStream>& GetFlexfecReceiveStreams();
+  const std::vector<FakeFlexfecReceiveStream*>& GetFlexfecReceiveStreams();
 
   rtc::SentPacket last_sent_packet() const { return last_sent_packet_; }
 
@@ -299,7 +298,7 @@
   std::vector<FakeAudioSendStream*> audio_send_streams_;
   std::vector<FakeVideoReceiveStream*> video_receive_streams_;
   std::vector<FakeAudioReceiveStream*> audio_receive_streams_;
-  std::list<FakeFlexfecReceiveStream> flexfec_receive_streams_;
+  std::vector<FakeFlexfecReceiveStream*> flexfec_receive_streams_;
 
   int num_created_send_streams_;
   int num_created_receive_streams_;
diff --git a/webrtc/media/engine/webrtcvideoengine2.cc b/webrtc/media/engine/webrtcvideoengine2.cc
index da045ec..2031ca5 100644
--- a/webrtc/media/engine/webrtcvideoengine2.cc
+++ b/webrtc/media/engine/webrtcvideoengine2.cc
@@ -2126,6 +2126,9 @@
 }
 
 WebRtcVideoChannel2::WebRtcVideoReceiveStream::~WebRtcVideoReceiveStream() {
+  if (flexfec_stream_) {
+    call_->DestroyFlexfecReceiveStream(flexfec_stream_);
+  }
   call_->DestroyVideoReceiveStream(stream_);
   ClearDecoders(&allocated_decoders_);
 }
diff --git a/webrtc/media/engine/webrtcvideoengine2_unittest.cc b/webrtc/media/engine/webrtcvideoengine2_unittest.cc
index 4667ea8..dd332f6 100644
--- a/webrtc/media/engine/webrtcvideoengine2_unittest.cc
+++ b/webrtc/media/engine/webrtcvideoengine2_unittest.cc
@@ -9,7 +9,6 @@
  */
 
 #include <algorithm>
-#include <list>
 #include <map>
 #include <memory>
 #include <vector>
@@ -2424,6 +2423,27 @@
   EXPECT_EQ(-1, config.rtp.flexfec.payload_type);
 }
 
+TEST_F(WebRtcVideoChannel2FlexfecTest, SetRecvCodecsWithFec) {
+  AddRecvStream(
+      CreatePrimaryWithFecFrStreamParams("cname", kSsrcs1[0], kFlexfecSsrc));
+  const std::vector<FakeFlexfecReceiveStream*>& streams =
+      fake_call_->GetFlexfecReceiveStreams();
+
+  cricket::VideoRecvParameters recv_parameters;
+  recv_parameters.codecs.push_back(GetEngineCodec("VP8"));
+  recv_parameters.codecs.push_back(GetEngineCodec("flexfec-03"));
+  ASSERT_TRUE(channel_->SetRecvParameters(recv_parameters));
+  ASSERT_EQ(1U, streams.size());
+  const FakeFlexfecReceiveStream* stream_with_recv_params = streams.front();
+  EXPECT_EQ(GetEngineCodec("flexfec-03").id,
+            stream_with_recv_params->GetConfig().payload_type);
+  EXPECT_EQ(kFlexfecSsrc, stream_with_recv_params->GetConfig().remote_ssrc);
+  EXPECT_EQ(1U,
+            stream_with_recv_params->GetConfig().protected_media_ssrcs.size());
+  EXPECT_EQ(kSsrcs1[0],
+            stream_with_recv_params->GetConfig().protected_media_ssrcs[0]);
+}
+
 TEST_F(WebRtcVideoChannel2Test,
        SetSendCodecRejectsRtxWithoutAssociatedPayloadType) {
   const int kUnusedPayloadType = 127;
@@ -2865,15 +2885,15 @@
 
   AddRecvStream(
       CreatePrimaryWithFecFrStreamParams("cname", kSsrcs1[0], kFlexfecSsrc));
-  const std::list<FakeFlexfecReceiveStream>& streams =
+  const std::vector<FakeFlexfecReceiveStream*>& streams =
       fake_call_->GetFlexfecReceiveStreams();
 
   ASSERT_EQ(1U, streams.size());
-  const FakeFlexfecReceiveStream& stream = streams.front();
-  EXPECT_EQ(GetEngineCodec("flexfec-03").id, stream.GetConfig().payload_type);
-  EXPECT_EQ(kFlexfecSsrc, stream.GetConfig().remote_ssrc);
-  ASSERT_EQ(1U, stream.GetConfig().protected_media_ssrcs.size());
-  EXPECT_EQ(kSsrcs1[0], stream.GetConfig().protected_media_ssrcs[0]);
+  const FakeFlexfecReceiveStream* stream = streams.front();
+  EXPECT_EQ(GetEngineCodec("flexfec-03").id, stream->GetConfig().payload_type);
+  EXPECT_EQ(kFlexfecSsrc, stream->GetConfig().remote_ssrc);
+  ASSERT_EQ(1U, stream->GetConfig().protected_media_ssrcs.size());
+  EXPECT_EQ(kSsrcs1[0], stream->GetConfig().protected_media_ssrcs[0]);
 
   cricket::VideoRecvParameters recv_parameters;
   recv_parameters.codecs.push_back(GetEngineCodec("VP8"));
@@ -2914,7 +2934,7 @@
 TEST_F(WebRtcVideoChannel2FlexfecTest, SetSendParamsWithFecEnablesFec) {
   AddRecvStream(
       CreatePrimaryWithFecFrStreamParams("cname", kSsrcs1[0], kFlexfecSsrc));
-  const std::list<FakeFlexfecReceiveStream>& streams =
+  const std::vector<FakeFlexfecReceiveStream*>& streams =
       fake_call_->GetFlexfecReceiveStreams();
 
   cricket::VideoRecvParameters recv_parameters;
@@ -2922,28 +2942,28 @@
   recv_parameters.codecs.push_back(GetEngineCodec("flexfec-03"));
   ASSERT_TRUE(channel_->SetRecvParameters(recv_parameters));
   ASSERT_EQ(1U, streams.size());
-  const FakeFlexfecReceiveStream& stream_with_recv_params = streams.front();
+  const FakeFlexfecReceiveStream* stream_with_recv_params = streams.front();
   EXPECT_EQ(GetEngineCodec("flexfec-03").id,
-            stream_with_recv_params.GetConfig().payload_type);
-  EXPECT_EQ(kFlexfecSsrc, stream_with_recv_params.GetConfig().remote_ssrc);
+            stream_with_recv_params->GetConfig().payload_type);
+  EXPECT_EQ(kFlexfecSsrc, stream_with_recv_params->GetConfig().remote_ssrc);
   EXPECT_EQ(1U,
-            stream_with_recv_params.GetConfig().protected_media_ssrcs.size());
+            stream_with_recv_params->GetConfig().protected_media_ssrcs.size());
   EXPECT_EQ(kSsrcs1[0],
-            stream_with_recv_params.GetConfig().protected_media_ssrcs[0]);
+            stream_with_recv_params->GetConfig().protected_media_ssrcs[0]);
 
   cricket::VideoSendParameters send_parameters;
   send_parameters.codecs.push_back(GetEngineCodec("VP8"));
   send_parameters.codecs.push_back(GetEngineCodec("flexfec-03"));
   ASSERT_TRUE(channel_->SetSendParameters(send_parameters));
   ASSERT_EQ(1U, streams.size());
-  const FakeFlexfecReceiveStream& stream_with_send_params = streams.front();
+  const FakeFlexfecReceiveStream* stream_with_send_params = streams.front();
   EXPECT_EQ(GetEngineCodec("flexfec-03").id,
-            stream_with_send_params.GetConfig().payload_type);
-  EXPECT_EQ(kFlexfecSsrc, stream_with_send_params.GetConfig().remote_ssrc);
+            stream_with_send_params->GetConfig().payload_type);
+  EXPECT_EQ(kFlexfecSsrc, stream_with_send_params->GetConfig().remote_ssrc);
   EXPECT_EQ(1U,
-            stream_with_send_params.GetConfig().protected_media_ssrcs.size());
+            stream_with_send_params->GetConfig().protected_media_ssrcs.size());
   EXPECT_EQ(kSsrcs1[0],
-            stream_with_send_params.GetConfig().protected_media_ssrcs[0]);
+            stream_with_send_params->GetConfig().protected_media_ssrcs[0]);
 }
 
 TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectDuplicateFecPayloads) {