blob: cc485e993a255325ac6803515efd79fb510f44d3 [file] [log] [blame]
Niels Möller4db138e2018-04-19 09:04:13 +02001/*
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 09:07:24 +020011#ifndef TEST_VIDEO_ENCODER_PROXY_FACTORY_H_
12#define TEST_VIDEO_ENCODER_PROXY_FACTORY_H_
Niels Möller4db138e2018-04-19 09:04:13 +020013
14#include <memory>
15#include <vector>
16
17#include "api/video_codecs/video_encoder.h"
18#include "api/video_codecs/video_encoder_factory.h"
Niels Möller4db138e2018-04-19 09:04:13 +020019
20namespace webrtc {
21namespace test {
22
Elad Alon370f93a2019-06-11 14:57:57 +020023namespace {
24const VideoEncoder::Capabilities kCapabilities(false);
25}
26
Niels Möller4db138e2018-04-19 09:04:13 +020027// An encoder factory with a single underlying VideoEncoder object,
28// intended for test purposes. Each call to CreateVideoEncoder returns
29// a proxy for the same encoder, typically an instance of FakeEncoder.
Byoungchan Lee13fe3672022-04-06 10:44:42 +090030class VideoEncoderProxyFactory : public VideoEncoderFactory {
Niels Möller4db138e2018-04-19 09:04:13 +020031 public:
Sergey Silkin443b7ee2019-06-28 12:53:07 +020032 explicit VideoEncoderProxyFactory(VideoEncoder* encoder)
philipel9b058032020-02-10 11:30:00 +010033 : VideoEncoderProxyFactory(encoder, nullptr) {}
34
35 explicit VideoEncoderProxyFactory(VideoEncoder* encoder,
36 EncoderSelectorInterface* encoder_selector)
Sergey Silkin443b7ee2019-06-28 12:53:07 +020037 : encoder_(encoder),
philipel9b058032020-02-10 11:30:00 +010038 encoder_selector_(encoder_selector),
Sergey Silkin443b7ee2019-06-28 12:53:07 +020039 num_simultaneous_encoder_instances_(0),
40 max_num_simultaneous_encoder_instances_(0) {
Mirta Dvornicic1ec2a162018-12-10 09:47:34 +000041 }
Niels Möller4db138e2018-04-19 09:04:13 +020042
43 // Unused by tests.
44 std::vector<SdpVideoFormat> GetSupportedFormats() const override {
Artem Titovd3251962021-11-15 16:57:07 +010045 RTC_DCHECK_NOTREACHED();
Niels Möller4db138e2018-04-19 09:04:13 +020046 return {};
47 }
48
Niels Möller4db138e2018-04-19 09:04:13 +020049 std::unique_ptr<VideoEncoder> CreateVideoEncoder(
50 const SdpVideoFormat& format) override {
Sergey Silkin443b7ee2019-06-28 12:53:07 +020051 ++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 17:06:18 +020055 return std::make_unique<EncoderProxy>(encoder_, this);
Niels Möller4db138e2018-04-19 09:04:13 +020056 }
57
philipel9b058032020-02-10 11:30:00 +010058 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 12:53:07 +020067 int GetMaxNumberOfSimultaneousEncoderInstances() {
68 return max_num_simultaneous_encoder_instances_;
69 }
70
Byoungchan Lee13fe3672022-04-06 10:44:42 +090071 protected:
Sergey Silkin443b7ee2019-06-28 12:53:07 +020072 void OnDestroyVideoEncoder() {
73 RTC_CHECK_GT(num_simultaneous_encoder_instances_, 0);
74 --num_simultaneous_encoder_instances_;
75 }
76
Niels Möller4db138e2018-04-19 09:04:13 +020077 // 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 12:53:07 +020081 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 09:04:13 +020085
86 private:
Elad Alon8f01c4e2019-06-28 15:19:43 +020087 void SetFecControllerOverride(
88 FecControllerOverride* fec_controller_override) override {
89 encoder_->SetFecControllerOverride(fec_controller_override);
90 }
91
Niels Möller4db138e2018-04-19 09:04:13 +020092 int32_t Encode(const VideoFrame& input_image,
Niels Möller87e2d782019-03-07 10:18:23 +010093 const std::vector<VideoFrameType>* frame_types) override {
Niels Möllerc8d2e732019-03-06 12:00:33 +010094 return encoder_->Encode(input_image, frame_types);
Niels Möller4db138e2018-04-19 09:04:13 +020095 }
Elad Alon8f01c4e2019-06-28 15:19:43 +020096
Niels Möller4db138e2018-04-19 09:04:13 +020097 int32_t InitEncode(const VideoCodec* config,
Elad Alon370f93a2019-06-11 14:57:57 +020098 const Settings& settings) override {
99 return encoder_->InitEncode(config, settings);
Niels Möller4db138e2018-04-19 09:04:13 +0200100 }
Elad Alon8f01c4e2019-06-28 15:19:43 +0200101
Niels Möller4db138e2018-04-19 09:04:13 +0200102 int32_t RegisterEncodeCompleteCallback(
103 EncodedImageCallback* callback) override {
104 return encoder_->RegisterEncodeCompleteCallback(callback);
105 }
Elad Alon8f01c4e2019-06-28 15:19:43 +0200106
Niels Möller4db138e2018-04-19 09:04:13 +0200107 int32_t Release() override { return encoder_->Release(); }
Elad Alon8f01c4e2019-06-28 15:19:43 +0200108
Erik Språng16cb8f52019-04-12 13:59:09 +0200109 void SetRates(const RateControlParameters& parameters) override {
110 encoder_->SetRates(parameters);
Niels Möller4db138e2018-04-19 09:04:13 +0200111 }
Elad Alon8f01c4e2019-06-28 15:19:43 +0200112
Erik Språnga1ead6f2018-11-01 17:45:06 +0100113 VideoEncoder::EncoderInfo GetEncoderInfo() const override {
114 return encoder_->GetEncoderInfo();
Niels Möller4db138e2018-04-19 09:04:13 +0200115 }
116
117 VideoEncoder* const encoder_;
Sergey Silkin443b7ee2019-06-28 12:53:07 +0200118 VideoEncoderProxyFactory* const encoder_factory_;
Niels Möller4db138e2018-04-19 09:04:13 +0200119 };
120
philipel9b058032020-02-10 11:30:00 +0100121 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
Mirta Dvornicic4f34d782020-02-26 13:01:19 +0100130 absl::optional<SdpVideoFormat> OnAvailableBitrate(
philipel9b058032020-02-10 11:30:00 +0100131 const DataRate& rate) override {
Mirta Dvornicic4f34d782020-02-26 13:01:19 +0100132 return encoder_selector_->OnAvailableBitrate(rate);
philipel9b058032020-02-10 11:30:00 +0100133 }
134
philipel6daa3042022-04-11 10:48:28 +0200135 absl::optional<SdpVideoFormat> OnResolutionChange(
136 const RenderResolution& resolution) override {
137 return encoder_selector_->OnResolutionChange(resolution);
138 }
139
philipel9b058032020-02-10 11:30:00 +0100140 absl::optional<SdpVideoFormat> OnEncoderBroken() override {
141 return encoder_selector_->OnEncoderBroken();
142 }
143
144 private:
145 EncoderSelectorInterface* const encoder_selector_;
146 };
147
Niels Möller4db138e2018-04-19 09:04:13 +0200148 VideoEncoder* const encoder_;
philipel9b058032020-02-10 11:30:00 +0100149 EncoderSelectorInterface* const encoder_selector_;
Sergey Silkin443b7ee2019-06-28 12:53:07 +0200150
151 int num_simultaneous_encoder_instances_;
152 int max_num_simultaneous_encoder_instances_;
Niels Möller4db138e2018-04-19 09:04:13 +0200153};
154
155} // namespace test
156} // namespace webrtc
157
Niels Möllercbcbc222018-09-28 09:07:24 +0200158#endif // TEST_VIDEO_ENCODER_PROXY_FACTORY_H_