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