xref: /aosp_15_r20/external/webrtc/test/video_encoder_proxy_factory.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
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 
11 #ifndef TEST_VIDEO_ENCODER_PROXY_FACTORY_H_
12 #define TEST_VIDEO_ENCODER_PROXY_FACTORY_H_
13 
14 #include <memory>
15 #include <vector>
16 
17 #include "api/video_codecs/video_encoder.h"
18 #include "api/video_codecs/video_encoder_factory.h"
19 
20 namespace webrtc {
21 namespace test {
22 
23 namespace {
24 const VideoEncoder::Capabilities kCapabilities(false);
25 }
26 
27 // 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.
30 class VideoEncoderProxyFactory : public VideoEncoderFactory {
31  public:
VideoEncoderProxyFactory(VideoEncoder * encoder)32   explicit VideoEncoderProxyFactory(VideoEncoder* encoder)
33       : VideoEncoderProxyFactory(encoder, nullptr) {}
34 
VideoEncoderProxyFactory(VideoEncoder * encoder,EncoderSelectorInterface * encoder_selector)35   explicit VideoEncoderProxyFactory(VideoEncoder* encoder,
36                                     EncoderSelectorInterface* encoder_selector)
37       : encoder_(encoder),
38         encoder_selector_(encoder_selector),
39         num_simultaneous_encoder_instances_(0),
40         max_num_simultaneous_encoder_instances_(0) {
41   }
42 
43   // Unused by tests.
GetSupportedFormats()44   std::vector<SdpVideoFormat> GetSupportedFormats() const override {
45     RTC_DCHECK_NOTREACHED();
46     return {};
47   }
48 
CreateVideoEncoder(const SdpVideoFormat & format)49   std::unique_ptr<VideoEncoder> CreateVideoEncoder(
50       const SdpVideoFormat& format) override {
51     ++num_simultaneous_encoder_instances_;
52     max_num_simultaneous_encoder_instances_ =
53         std::max(max_num_simultaneous_encoder_instances_,
54                  num_simultaneous_encoder_instances_);
55     return std::make_unique<EncoderProxy>(encoder_, this);
56   }
57 
GetEncoderSelector()58   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 
GetMaxNumberOfSimultaneousEncoderInstances()67   int GetMaxNumberOfSimultaneousEncoderInstances() {
68     return max_num_simultaneous_encoder_instances_;
69   }
70 
71  protected:
OnDestroyVideoEncoder()72   void OnDestroyVideoEncoder() {
73     RTC_CHECK_GT(num_simultaneous_encoder_instances_, 0);
74     --num_simultaneous_encoder_instances_;
75   }
76 
77   // Wrapper class, since CreateVideoEncoder needs to surrender
78   // ownership to the object it returns.
79   class EncoderProxy final : public VideoEncoder {
80    public:
EncoderProxy(VideoEncoder * encoder,VideoEncoderProxyFactory * encoder_factory)81     explicit EncoderProxy(VideoEncoder* encoder,
82                           VideoEncoderProxyFactory* encoder_factory)
83         : encoder_(encoder), encoder_factory_(encoder_factory) {}
~EncoderProxy()84     ~EncoderProxy() { encoder_factory_->OnDestroyVideoEncoder(); }
85 
86    private:
SetFecControllerOverride(FecControllerOverride * fec_controller_override)87     void SetFecControllerOverride(
88         FecControllerOverride* fec_controller_override) override {
89       encoder_->SetFecControllerOverride(fec_controller_override);
90     }
91 
Encode(const VideoFrame & input_image,const std::vector<VideoFrameType> * frame_types)92     int32_t Encode(const VideoFrame& input_image,
93                    const std::vector<VideoFrameType>* frame_types) override {
94       return encoder_->Encode(input_image, frame_types);
95     }
96 
InitEncode(const VideoCodec * config,const Settings & settings)97     int32_t InitEncode(const VideoCodec* config,
98                        const Settings& settings) override {
99       return encoder_->InitEncode(config, settings);
100     }
101 
RegisterEncodeCompleteCallback(EncodedImageCallback * callback)102     int32_t RegisterEncodeCompleteCallback(
103         EncodedImageCallback* callback) override {
104       return encoder_->RegisterEncodeCompleteCallback(callback);
105     }
106 
Release()107     int32_t Release() override { return encoder_->Release(); }
108 
SetRates(const RateControlParameters & parameters)109     void SetRates(const RateControlParameters& parameters) override {
110       encoder_->SetRates(parameters);
111     }
112 
GetEncoderInfo()113     VideoEncoder::EncoderInfo GetEncoderInfo() const override {
114       return encoder_->GetEncoderInfo();
115     }
116 
117     VideoEncoder* const encoder_;
118     VideoEncoderProxyFactory* const encoder_factory_;
119   };
120 
121   class EncoderSelectorProxy final : public EncoderSelectorInterface {
122    public:
EncoderSelectorProxy(EncoderSelectorInterface * encoder_selector)123     explicit EncoderSelectorProxy(EncoderSelectorInterface* encoder_selector)
124         : encoder_selector_(encoder_selector) {}
125 
OnCurrentEncoder(const SdpVideoFormat & format)126     void OnCurrentEncoder(const SdpVideoFormat& format) override {
127       encoder_selector_->OnCurrentEncoder(format);
128     }
129 
OnAvailableBitrate(const DataRate & rate)130     absl::optional<SdpVideoFormat> OnAvailableBitrate(
131         const DataRate& rate) override {
132       return encoder_selector_->OnAvailableBitrate(rate);
133     }
134 
OnResolutionChange(const RenderResolution & resolution)135     absl::optional<SdpVideoFormat> OnResolutionChange(
136         const RenderResolution& resolution) override {
137       return encoder_selector_->OnResolutionChange(resolution);
138     }
139 
OnEncoderBroken()140     absl::optional<SdpVideoFormat> OnEncoderBroken() override {
141       return encoder_selector_->OnEncoderBroken();
142     }
143 
144    private:
145     EncoderSelectorInterface* const encoder_selector_;
146   };
147 
148   VideoEncoder* const encoder_;
149   EncoderSelectorInterface* const encoder_selector_;
150 
151   int num_simultaneous_encoder_instances_;
152   int max_num_simultaneous_encoder_instances_;
153 };
154 
155 }  // namespace test
156 }  // namespace webrtc
157 
158 #endif  // TEST_VIDEO_ENCODER_PROXY_FACTORY_H_
159