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) {