blob: ac19e5238af7c63e8e6b6de2152ab9eb8b3a0232 [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
Karl Wiberg918f50c2018-07-05 11:40:33 +020017#include "absl/memory/memory.h"
Niels Möller4db138e2018-04-19 09:04:13 +020018#include "api/video_codecs/video_encoder.h"
19#include "api/video_codecs/video_encoder_factory.h"
Niels Möller4db138e2018-04-19 09:04:13 +020020
21namespace webrtc {
22namespace test {
23
Elad Alon370f93a2019-06-11 14:57:57 +020024namespace {
25const VideoEncoder::Capabilities kCapabilities(false);
26}
27
Niels Möller4db138e2018-04-19 09:04:13 +020028// 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.
Niels Möllercbcbc222018-09-28 09:07:24 +020031class VideoEncoderProxyFactory final : public VideoEncoderFactory {
Niels Möller4db138e2018-04-19 09:04:13 +020032 public:
Sergey Silkin443b7ee2019-06-28 12:53:07 +020033 explicit VideoEncoderProxyFactory(VideoEncoder* encoder)
34 : encoder_(encoder),
35 num_simultaneous_encoder_instances_(0),
36 max_num_simultaneous_encoder_instances_(0) {
Mirta Dvornicic1ec2a162018-12-10 09:47:34 +000037 codec_info_.is_hardware_accelerated = false;
38 codec_info_.has_internal_source = false;
39 }
Niels Möller4db138e2018-04-19 09:04:13 +020040
41 // Unused by tests.
42 std::vector<SdpVideoFormat> GetSupportedFormats() const override {
43 RTC_NOTREACHED();
44 return {};
45 }
46
Mirta Dvornicic1ec2a162018-12-10 09:47:34 +000047 CodecInfo QueryVideoEncoder(const SdpVideoFormat& format) const override {
48 return codec_info_;
49 }
50
Niels Möller4db138e2018-04-19 09:04:13 +020051 std::unique_ptr<VideoEncoder> CreateVideoEncoder(
52 const SdpVideoFormat& format) override {
Sergey Silkin443b7ee2019-06-28 12:53:07 +020053 ++num_simultaneous_encoder_instances_;
54 max_num_simultaneous_encoder_instances_ =
55 std::max(max_num_simultaneous_encoder_instances_,
56 num_simultaneous_encoder_instances_);
57 return absl::make_unique<EncoderProxy>(encoder_, this);
Niels Möller4db138e2018-04-19 09:04:13 +020058 }
59
Mirta Dvornicic1ec2a162018-12-10 09:47:34 +000060 void SetIsHardwareAccelerated(bool is_hardware_accelerated) {
61 codec_info_.is_hardware_accelerated = is_hardware_accelerated;
62 }
63 void SetHasInternalSource(bool has_internal_source) {
64 codec_info_.has_internal_source = has_internal_source;
65 }
66
Sergey Silkin443b7ee2019-06-28 12:53:07 +020067 int GetMaxNumberOfSimultaneousEncoderInstances() {
68 return max_num_simultaneous_encoder_instances_;
69 }
70
Niels Möller4db138e2018-04-19 09:04:13 +020071 private:
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
121 VideoEncoder* const encoder_;
Mirta Dvornicic1ec2a162018-12-10 09:47:34 +0000122 CodecInfo codec_info_;
Sergey Silkin443b7ee2019-06-28 12:53:07 +0200123
124 int num_simultaneous_encoder_instances_;
125 int max_num_simultaneous_encoder_instances_;
Niels Möller4db138e2018-04-19 09:04:13 +0200126};
127
128} // namespace test
129} // namespace webrtc
130
Niels Möllercbcbc222018-09-28 09:07:24 +0200131#endif // TEST_VIDEO_ENCODER_PROXY_FACTORY_H_