blob: 5560fb8918fdc1a98969fde7dcdb1f36a1a9899d [file] [log] [blame]
Niels Möller4db138e2018-04-19 07:04:131/*
2 * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Niels Möllercbcbc222018-09-28 07:07:2411#ifndef TEST_VIDEO_ENCODER_PROXY_FACTORY_H_
12#define TEST_VIDEO_ENCODER_PROXY_FACTORY_H_
Niels Möller4db138e2018-04-19 07:04:1313
14#include <memory>
15#include <vector>
16
Danil Chapovalov802552a2024-03-18 16:06:2017#include "api/environment/environment.h"
Niels Möller4db138e2018-04-19 07:04:1318#include "api/video_codecs/video_encoder.h"
19#include "api/video_codecs/video_encoder_factory.h"
Niels Möller4db138e2018-04-19 07:04:1320
21namespace webrtc {
22namespace test {
23
Elad Alon370f93a2019-06-11 12:57:5724namespace {
25const VideoEncoder::Capabilities kCapabilities(false);
26}
27
Niels Möller4db138e2018-04-19 07:04:1328// An encoder factory with a single underlying VideoEncoder object,
29// intended for test purposes. Each call to CreateVideoEncoder returns
30// a proxy for the same encoder, typically an instance of FakeEncoder.
Byoungchan Lee13fe3672022-04-06 01:44:4231class VideoEncoderProxyFactory : public VideoEncoderFactory {
Niels Möller4db138e2018-04-19 07:04:1332 public:
Sergey Silkin443b7ee2019-06-28 10:53:0733 explicit VideoEncoderProxyFactory(VideoEncoder* encoder)
philipel9b058032020-02-10 10:30:0034 : VideoEncoderProxyFactory(encoder, nullptr) {}
35
36 explicit VideoEncoderProxyFactory(VideoEncoder* encoder,
37 EncoderSelectorInterface* encoder_selector)
Sergey Silkin443b7ee2019-06-28 10:53:0738 : encoder_(encoder),
philipel9b058032020-02-10 10:30:0039 encoder_selector_(encoder_selector),
Sergey Silkin443b7ee2019-06-28 10:53:0740 num_simultaneous_encoder_instances_(0),
Jared Siskin7220ee92023-05-03 09:06:1441 max_num_simultaneous_encoder_instances_(0) {}
Niels Möller4db138e2018-04-19 07:04:1342
43 // Unused by tests.
44 std::vector<SdpVideoFormat> GetSupportedFormats() const override {
Artem Titovd3251962021-11-15 15:57:0745 RTC_DCHECK_NOTREACHED();
Niels Möller4db138e2018-04-19 07:04:1346 return {};
47 }
48
Danil Chapovalov802552a2024-03-18 16:06:2049 std::unique_ptr<VideoEncoder> Create(const Environment& env,
50 const SdpVideoFormat& format) override {
Sergey Silkin443b7ee2019-06-28 10:53:0751 ++num_simultaneous_encoder_instances_;
52 max_num_simultaneous_encoder_instances_ =
53 std::max(max_num_simultaneous_encoder_instances_,
54 num_simultaneous_encoder_instances_);
Mirko Bonadei317a1f02019-09-17 15:06:1855 return std::make_unique<EncoderProxy>(encoder_, this);
Niels Möller4db138e2018-04-19 07:04:1356 }
57
philipel9b058032020-02-10 10:30:0058 std::unique_ptr<EncoderSelectorInterface> GetEncoderSelector()
59 const override {
60 if (encoder_selector_ != nullptr) {
61 return std::make_unique<EncoderSelectorProxy>(encoder_selector_);
62 }
63
64 return nullptr;
65 }
66
Sergey Silkin443b7ee2019-06-28 10:53:0767 int GetMaxNumberOfSimultaneousEncoderInstances() {
68 return max_num_simultaneous_encoder_instances_;
69 }
70
Byoungchan Lee13fe3672022-04-06 01:44:4271 protected:
Sergey Silkin443b7ee2019-06-28 10:53:0772 void OnDestroyVideoEncoder() {
73 RTC_CHECK_GT(num_simultaneous_encoder_instances_, 0);
74 --num_simultaneous_encoder_instances_;
75 }
76
Niels Möller4db138e2018-04-19 07:04:1377 // Wrapper class, since CreateVideoEncoder needs to surrender
78 // ownership to the object it returns.
79 class EncoderProxy final : public VideoEncoder {
80 public:
Sergey Silkin443b7ee2019-06-28 10:53:0781 explicit EncoderProxy(VideoEncoder* encoder,
82 VideoEncoderProxyFactory* encoder_factory)
83 : encoder_(encoder), encoder_factory_(encoder_factory) {}
84 ~EncoderProxy() { encoder_factory_->OnDestroyVideoEncoder(); }
Niels Möller4db138e2018-04-19 07:04:1385
86 private:
Elad Alon8f01c4e2019-06-28 13:19:4387 void SetFecControllerOverride(
88 FecControllerOverride* fec_controller_override) override {
89 encoder_->SetFecControllerOverride(fec_controller_override);
90 }
91
Niels Möller4db138e2018-04-19 07:04:1392 int32_t Encode(const VideoFrame& input_image,
Niels Möller87e2d782019-03-07 09:18:2393 const std::vector<VideoFrameType>* frame_types) override {
Niels Möllerc8d2e732019-03-06 11:00:3394 return encoder_->Encode(input_image, frame_types);
Niels Möller4db138e2018-04-19 07:04:1395 }
Elad Alon8f01c4e2019-06-28 13:19:4396
Niels Möller4db138e2018-04-19 07:04:1397 int32_t InitEncode(const VideoCodec* config,
Elad Alon370f93a2019-06-11 12:57:5798 const Settings& settings) override {
99 return encoder_->InitEncode(config, settings);
Niels Möller4db138e2018-04-19 07:04:13100 }
Elad Alon8f01c4e2019-06-28 13:19:43101
Niels Möller4db138e2018-04-19 07:04:13102 int32_t RegisterEncodeCompleteCallback(
103 EncodedImageCallback* callback) override {
104 return encoder_->RegisterEncodeCompleteCallback(callback);
105 }
Elad Alon8f01c4e2019-06-28 13:19:43106
Niels Möller4db138e2018-04-19 07:04:13107 int32_t Release() override { return encoder_->Release(); }
Elad Alon8f01c4e2019-06-28 13:19:43108
Erik Språng16cb8f52019-04-12 11:59:09109 void SetRates(const RateControlParameters& parameters) override {
110 encoder_->SetRates(parameters);
Niels Möller4db138e2018-04-19 07:04:13111 }
Elad Alon8f01c4e2019-06-28 13:19:43112
Erik Språnga1ead6f22018-11-01 16:45:06113 VideoEncoder::EncoderInfo GetEncoderInfo() const override {
114 return encoder_->GetEncoderInfo();
Niels Möller4db138e2018-04-19 07:04:13115 }
116
117 VideoEncoder* const encoder_;
Sergey Silkin443b7ee2019-06-28 10:53:07118 VideoEncoderProxyFactory* const encoder_factory_;
Niels Möller4db138e2018-04-19 07:04:13119 };
120
philipel9b058032020-02-10 10:30:00121 class EncoderSelectorProxy final : public EncoderSelectorInterface {
122 public:
123 explicit EncoderSelectorProxy(EncoderSelectorInterface* encoder_selector)
124 : encoder_selector_(encoder_selector) {}
125
126 void OnCurrentEncoder(const SdpVideoFormat& format) override {
127 encoder_selector_->OnCurrentEncoder(format);
128 }
129
Florent Castelli8037fc62024-08-29 13:00:40130 std::optional<SdpVideoFormat> OnAvailableBitrate(
philipel9b058032020-02-10 10:30:00131 const DataRate& rate) override {
Mirta Dvornicic4f34d782020-02-26 12:01:19132 return encoder_selector_->OnAvailableBitrate(rate);
philipel9b058032020-02-10 10:30:00133 }
134
Florent Castelli8037fc62024-08-29 13:00:40135 std::optional<SdpVideoFormat> OnResolutionChange(
philipel6daa3042022-04-11 08:48:28136 const RenderResolution& resolution) override {
137 return encoder_selector_->OnResolutionChange(resolution);
138 }
139
Florent Castelli8037fc62024-08-29 13:00:40140 std::optional<SdpVideoFormat> OnEncoderBroken() override {
philipel9b058032020-02-10 10:30:00141 return encoder_selector_->OnEncoderBroken();
142 }
143
144 private:
145 EncoderSelectorInterface* const encoder_selector_;
146 };
147
Niels Möller4db138e2018-04-19 07:04:13148 VideoEncoder* const encoder_;
philipel9b058032020-02-10 10:30:00149 EncoderSelectorInterface* const encoder_selector_;
Sergey Silkin443b7ee2019-06-28 10:53:07150
151 int num_simultaneous_encoder_instances_;
152 int max_num_simultaneous_encoder_instances_;
Niels Möller4db138e2018-04-19 07:04:13153};
154
155} // namespace test
156} // namespace webrtc
157
Niels Möllercbcbc222018-09-28 07:07:24158#endif // TEST_VIDEO_ENCODER_PROXY_FACTORY_H_