Pass Environment to custom FecController at construction

To allow custom FecController use propagated rather than global field trials
note that there is one FecControllerFactory per peer connection factory,
but FecController is created per peer connection and may use per peer connection field trials.

Bug: webrtc:10335
Change-Id: Id25bfaf4b49d4f6d551730c8fd55596ddc49ab47
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/333400
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#41478}
This commit is contained in:
Danil Chapovalov 2024-01-03 18:39:27 +01:00 committed by WebRTC LUCI CQ
parent b64eef1234
commit 55a61898a8
5 changed files with 24 additions and 4 deletions

View file

@ -889,6 +889,8 @@ rtc_source_set("fec_controller_api") {
deps = [ deps = [
"../modules:module_fec_api", "../modules:module_fec_api",
"../rtc_base:checks",
"environment",
"video:video_frame_type", "video:video_frame_type",
] ]
} }

View file

@ -14,8 +14,10 @@
#include <memory> #include <memory>
#include <vector> #include <vector>
#include "api/environment/environment.h"
#include "api/video/video_frame_type.h" #include "api/video/video_frame_type.h"
#include "modules/include/module_fec_types.h" #include "modules/include/module_fec_types.h"
#include "rtc_base/checks.h"
namespace webrtc { namespace webrtc {
// TODO(yinwa): work in progress. API in class FecController should not be // TODO(yinwa): work in progress. API in class FecController should not be
@ -87,8 +89,23 @@ class FecController {
class FecControllerFactoryInterface { class FecControllerFactoryInterface {
public: public:
virtual std::unique_ptr<FecController> CreateFecController() = 0;
virtual ~FecControllerFactoryInterface() = default; virtual ~FecControllerFactoryInterface() = default;
// TODO: bugs.webrtc.org/10335 - make pure virtual when implemented by derived
// classes.
virtual std::unique_ptr<FecController> CreateFecController(
const Environment& env) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
return CreateFecController();
#pragma clang diagnostic pop
}
// TODO: bugs.webrtc.org/10335 - delete when implementation is removed from
// the derived classes.
[[deprecated]] virtual std::unique_ptr<FecController> CreateFecController() {
RTC_CHECK_NOTREACHED();
}
}; };
} // namespace webrtc } // namespace webrtc

View file

@ -920,7 +920,7 @@ webrtc::VideoSendStream* Call::CreateVideoSendStream(
} }
std::unique_ptr<FecController> fec_controller = std::unique_ptr<FecController> fec_controller =
config_.fec_controller_factory config_.fec_controller_factory
? config_.fec_controller_factory->CreateFecController() ? config_.fec_controller_factory->CreateFecController(env_)
: std::make_unique<FecControllerDefault>(&env_.clock()); : std::make_unique<FecControllerDefault>(&env_.clock());
return CreateVideoSendStream(std::move(config), std::move(encoder_config), return CreateVideoSendStream(std::move(config), std::move(encoder_config),
std::move(fec_controller)); std::move(fec_controller));

View file

@ -572,7 +572,7 @@ void CallTest::CreateVideoSendStreams() {
if (fec_controller_factory_.get()) { if (fec_controller_factory_.get()) {
video_send_streams_[i] = sender_call_->CreateVideoSendStream( video_send_streams_[i] = sender_call_->CreateVideoSendStream(
video_send_configs_[i].Copy(), video_encoder_configs_[i].Copy(), video_send_configs_[i].Copy(), video_encoder_configs_[i].Copy(),
fec_controller_factory_->CreateFecController()); fec_controller_factory_->CreateFecController(send_env_));
} else { } else {
video_send_streams_[i] = sender_call_->CreateVideoSendStream( video_send_streams_[i] = sender_call_->CreateVideoSendStream(
video_send_configs_[i].Copy(), video_encoder_configs_[i].Copy()); video_send_configs_[i].Copy(), video_encoder_configs_[i].Copy());

View file

@ -430,7 +430,8 @@ SendVideoStream::SendVideoStream(CallClient* sender,
if (config.stream.fec_controller_factory) { if (config.stream.fec_controller_factory) {
send_stream_ = sender_->call_->CreateVideoSendStream( send_stream_ = sender_->call_->CreateVideoSendStream(
std::move(send_config), std::move(encoder_config), std::move(send_config), std::move(encoder_config),
config.stream.fec_controller_factory->CreateFecController()); config.stream.fec_controller_factory->CreateFecController(
sender_->env_));
} else { } else {
send_stream_ = sender_->call_->CreateVideoSendStream( send_stream_ = sender_->call_->CreateVideoSendStream(
std::move(send_config), std::move(encoder_config)); std::move(send_config), std::move(encoder_config));