From be850e1b1de5bf046080ac1df7de67a3d6d12d1c Mon Sep 17 00:00:00 2001 From: noahric Date: Fri, 20 Jan 2017 01:07:26 -0800 Subject: [PATCH] Clear out cached codecs when calculating new codec lists. Without this, every time WebRtcVideoEngine2 calls supported_codecs(), the codec list grows. BUG=webrtc:7020 Review-Url: https://codereview.webrtc.org/2639423006 Cr-Commit-Position: refs/heads/master@{#16178} --- webrtc/media/BUILD.gn | 1 + .../media/engine/webrtcvideoencoderfactory.cc | 2 + .../webrtcvideoencoderfactory_unittest.cc | 38 +++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 webrtc/media/engine/webrtcvideoencoderfactory_unittest.cc diff --git a/webrtc/media/BUILD.gn b/webrtc/media/BUILD.gn index 23aa0f0746..060b6afa9a 100644 --- a/webrtc/media/BUILD.gn +++ b/webrtc/media/BUILD.gn @@ -338,6 +338,7 @@ if (rtc_include_tests) { "engine/videoencodersoftwarefallbackwrapper_unittest.cc", "engine/webrtcmediaengine_unittest.cc", "engine/webrtcvideocapturer_unittest.cc", + "engine/webrtcvideoencoderfactory_unittest.cc", "engine/webrtcvideoengine2_unittest.cc", "engine/webrtcvoiceengine_unittest.cc", ] diff --git a/webrtc/media/engine/webrtcvideoencoderfactory.cc b/webrtc/media/engine/webrtcvideoencoderfactory.cc index c7e5ac47fd..a332d86b60 100644 --- a/webrtc/media/engine/webrtcvideoencoderfactory.cc +++ b/webrtc/media/engine/webrtcvideoencoderfactory.cc @@ -22,6 +22,7 @@ webrtc::VideoEncoder* WebRtcVideoEncoderFactory::CreateVideoEncoder( const std::vector& WebRtcVideoEncoderFactory::supported_codecs() const { + codecs_.clear(); const std::vector& encoder_codecs = codecs(); for (const VideoCodec& encoder_codec : encoder_codecs) { codecs_.push_back(cricket::VideoCodec(encoder_codec.name)); @@ -38,6 +39,7 @@ webrtc::VideoEncoder* WebRtcVideoEncoderFactory::CreateVideoEncoder( const std::vector& WebRtcVideoEncoderFactory::codecs() const { + encoder_codecs_.clear(); const std::vector& codecs = supported_codecs(); for (const cricket::VideoCodec& codec : codecs) { encoder_codecs_.push_back( diff --git a/webrtc/media/engine/webrtcvideoencoderfactory_unittest.cc b/webrtc/media/engine/webrtcvideoencoderfactory_unittest.cc new file mode 100644 index 0000000000..967c33b3d2 --- /dev/null +++ b/webrtc/media/engine/webrtcvideoencoderfactory_unittest.cc @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include "webrtc/media/engine/webrtcvideoencoderfactory.h" + +#include "webrtc/test/gtest.h" + +class WebRtcVideoEncoderFactoryForTest + : public cricket::WebRtcVideoEncoderFactory { + public: + WebRtcVideoEncoderFactoryForTest() { + codecs_.push_back(VideoCodec(webrtc::kVideoCodecH264, "H264")); + codecs_.push_back(VideoCodec(webrtc::kVideoCodecVP8, "VP8")); + } + + const std::vector& codecs() const override { return codecs_; } + + void DestroyVideoEncoder(webrtc::VideoEncoder* encoder) override {} + + std::vector codecs_; +}; + +TEST(WebRtcVideoEncoderFactoryTest, TestMultipleCallsToSupportedCodecs) { + WebRtcVideoEncoderFactoryForTest factory; + EXPECT_EQ(2u, factory.supported_codecs().size()); + EXPECT_EQ("H264", factory.supported_codecs()[0].name); + EXPECT_EQ("VP8", factory.supported_codecs()[1].name); + + // The codec list doesn't grow when called repeatedly. + EXPECT_EQ(2u, factory.supported_codecs().size()); +}