Pass FecControllerOverride to Vp8FrameBufferControllerFactory::Create
Previously, FecControllerOverride was passed to
Vp8FrameBufferController::SetFecControllerOverride. Passing to
the factory is a more elegant way, since it's only used when
the controller is constructed.
TBR=kwiberg@webrtc.org
Bug: webrtc:10769
Change-Id: Iae599889e7ca9003e3200c2911239cbb763ee65a
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/144380
Reviewed-by: Erik Språng <sprang@webrtc.org>
Commit-Queue: Elad Alon <eladalon@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#28443}
diff --git a/api/BUILD.gn b/api/BUILD.gn
index 77246bc..2ca55c7 100644
--- a/api/BUILD.gn
+++ b/api/BUILD.gn
@@ -649,6 +649,17 @@
]
}
+ rtc_source_set("mock_fec_controller_override") {
+ testonly = true
+ sources = [
+ "test/mock_fec_controller_override.h",
+ ]
+ deps = [
+ ":fec_controller_api",
+ "../test:test_support",
+ ]
+ }
+
rtc_source_set("mock_frame_encryptor") {
testonly = true
sources = [
diff --git a/api/test/mock_fec_controller_override.h b/api/test/mock_fec_controller_override.h
new file mode 100644
index 0000000..a7ec836
--- /dev/null
+++ b/api/test/mock_fec_controller_override.h
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2019 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.
+ */
+
+#ifndef API_TEST_MOCK_FEC_CONTROLLER_OVERRIDE_H_
+#define API_TEST_MOCK_FEC_CONTROLLER_OVERRIDE_H_
+
+#include "api/fec_controller_override.h"
+#include "test/gmock.h"
+
+namespace webrtc {
+
+class MockFecControllerOverride : public FecControllerOverride {
+ public:
+ ~MockFecControllerOverride() override = default;
+
+ MOCK_METHOD1(SetFecAllowed, void(bool fec_allowed));
+};
+
+} // namespace webrtc
+
+#endif // API_TEST_MOCK_FEC_CONTROLLER_OVERRIDE_H_
diff --git a/api/video_codecs/BUILD.gn b/api/video_codecs/BUILD.gn
index f53ae7b..894d23f 100644
--- a/api/video_codecs/BUILD.gn
+++ b/api/video_codecs/BUILD.gn
@@ -120,6 +120,7 @@
deps = [
":video_codecs_api",
+ "../:fec_controller_api",
"../../modules/video_coding:video_coding_utility",
"../../modules/video_coding:webrtc_vp8_temporal_layers",
"../../rtc_base:checks",
diff --git a/api/video_codecs/vp8_frame_buffer_controller.h b/api/video_codecs/vp8_frame_buffer_controller.h
index 94e08a9..f304413 100644
--- a/api/video_codecs/vp8_frame_buffer_controller.h
+++ b/api/video_codecs/vp8_frame_buffer_controller.h
@@ -106,13 +106,6 @@
// The limits are suggestion-only; the controller is allowed to exceed them.
virtual void SetQpLimits(size_t stream_index, int min_qp, int max_qp) = 0;
- // Set a FecControllerOverride, through which the bandwidth allocation
- // decisions made by FecController may be overridden.
- // TODO(bugs.webrtc.org/10769): Update downstream projects, then make
- // this pure-virtual.
- virtual void SetFecControllerOverride(
- FecControllerOverride* fec_controller_override) {}
-
// Number of streamed controlled by |this|.
virtual size_t StreamCount() const = 0;
@@ -188,9 +181,24 @@
virtual std::unique_ptr<Vp8FrameBufferControllerFactory> Clone() const = 0;
// Create a Vp8FrameBufferController instance.
+ // TODO(bugs.webrtc.org/10769): Update downstream projects, then remove
+ // version without |fec_controller_override| and make the other version
+ // pure-virtual.
+ // (In theory, if neither version is overridden, stack overflow would occur.
+ // In practice, all subclasses override at least one version, and following
+ // the update of downstream projects, only one pure-virtual version will
+ // remain.)
virtual std::unique_ptr<Vp8FrameBufferController> Create(
const VideoCodec& codec,
- const VideoEncoder::Settings& settings) = 0;
+ const VideoEncoder::Settings& settings) {
+ return Create(codec, settings, nullptr);
+ }
+ virtual std::unique_ptr<Vp8FrameBufferController> Create(
+ const VideoCodec& codec,
+ const VideoEncoder::Settings& settings,
+ FecControllerOverride* fec_controller_override) {
+ return Create(codec, settings);
+ }
};
} // namespace webrtc
diff --git a/api/video_codecs/vp8_temporal_layers.cc b/api/video_codecs/vp8_temporal_layers.cc
index b29cf65..dd75c61 100644
--- a/api/video_codecs/vp8_temporal_layers.cc
+++ b/api/video_codecs/vp8_temporal_layers.cc
@@ -18,7 +18,8 @@
namespace webrtc {
Vp8TemporalLayers::Vp8TemporalLayers(
- std::vector<std::unique_ptr<Vp8FrameBufferController>>&& controllers)
+ std::vector<std::unique_ptr<Vp8FrameBufferController>>&& controllers,
+ FecControllerOverride* fec_controller_override)
: controllers_(std::move(controllers)) {
RTC_DCHECK(!controllers_.empty());
RTC_DCHECK(absl::c_none_of(
@@ -26,6 +27,9 @@
[](const std::unique_ptr<Vp8FrameBufferController>& controller) {
return controller.get() == nullptr;
}));
+ if (fec_controller_override) {
+ fec_controller_override->SetFecAllowed(true);
+ }
}
void Vp8TemporalLayers::SetQpLimits(size_t stream_index,
@@ -35,11 +39,6 @@
return controllers_[stream_index]->SetQpLimits(0, min_qp, max_qp);
}
-void Vp8TemporalLayers::SetFecControllerOverride(
- FecControllerOverride* fec_controller_override) {
- // Ignore.
-}
-
size_t Vp8TemporalLayers::StreamCount() const {
return controllers_.size();
}
diff --git a/api/video_codecs/vp8_temporal_layers.h b/api/video_codecs/vp8_temporal_layers.h
index efd013e..2ffe6ea 100644
--- a/api/video_codecs/vp8_temporal_layers.h
+++ b/api/video_codecs/vp8_temporal_layers.h
@@ -32,15 +32,13 @@
// realize a temporal layer structure.
class Vp8TemporalLayers final : public Vp8FrameBufferController {
public:
- explicit Vp8TemporalLayers(
- std::vector<std::unique_ptr<Vp8FrameBufferController>>&& controllers);
+ Vp8TemporalLayers(
+ std::vector<std::unique_ptr<Vp8FrameBufferController>>&& controllers,
+ FecControllerOverride* fec_controller_override);
~Vp8TemporalLayers() override = default;
void SetQpLimits(size_t stream_index, int min_qp, int max_qp) override;
- void SetFecControllerOverride(
- FecControllerOverride* fec_controller_override) override;
-
size_t StreamCount() const override;
bool SupportsEncoderFrameDropping(size_t stream_index) const override;
diff --git a/api/video_codecs/vp8_temporal_layers_factory.cc b/api/video_codecs/vp8_temporal_layers_factory.cc
index 1a77323..f7d991c 100644
--- a/api/video_codecs/vp8_temporal_layers_factory.cc
+++ b/api/video_codecs/vp8_temporal_layers_factory.cc
@@ -15,6 +15,7 @@
#include <vector>
#include "absl/memory/memory.h"
+#include "api/fec_controller_override.h"
#include "modules/video_coding/codecs/vp8/default_temporal_layers.h"
#include "modules/video_coding/codecs/vp8/screenshare_layers.h"
#include "modules/video_coding/utility/simulcast_utility.h"
@@ -25,6 +26,13 @@
std::unique_ptr<Vp8FrameBufferController> Vp8TemporalLayersFactory::Create(
const VideoCodec& codec,
const VideoEncoder::Settings& settings) {
+ return Create(codec, settings, nullptr);
+}
+
+std::unique_ptr<Vp8FrameBufferController> Vp8TemporalLayersFactory::Create(
+ const VideoCodec& codec,
+ const VideoEncoder::Settings& settings,
+ FecControllerOverride* fec_controller_override) {
std::vector<std::unique_ptr<Vp8FrameBufferController>> controllers;
const int num_streams = SimulcastUtility::NumberOfSimulcastStreams(codec);
RTC_DCHECK_GE(num_streams, 1);
@@ -44,7 +52,8 @@
}
}
- return absl::make_unique<Vp8TemporalLayers>(std::move(controllers));
+ return absl::make_unique<Vp8TemporalLayers>(std::move(controllers),
+ fec_controller_override);
}
std::unique_ptr<Vp8FrameBufferControllerFactory>
diff --git a/api/video_codecs/vp8_temporal_layers_factory.h b/api/video_codecs/vp8_temporal_layers_factory.h
index 747580f..082bfe2 100644
--- a/api/video_codecs/vp8_temporal_layers_factory.h
+++ b/api/video_codecs/vp8_temporal_layers_factory.h
@@ -23,9 +23,15 @@
std::unique_ptr<Vp8FrameBufferControllerFactory> Clone() const override;
+ // TODO(bugs.webrtc.org/10769): Update downstream projects, then remove.
std::unique_ptr<Vp8FrameBufferController> Create(
const VideoCodec& codec,
const VideoEncoder::Settings& settings) override;
+
+ std::unique_ptr<Vp8FrameBufferController> Create(
+ const VideoCodec& codec,
+ const VideoEncoder::Settings& settings,
+ FecControllerOverride* fec_controller_override) override;
};
} // namespace webrtc