blob: 9feed1455f902230560486cd4d8be8660576316a [file] [log] [blame]
stefan@webrtc.org360e3762013-08-22 09:29:561/*
2 * Copyright (c) 2013 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
Mirko Bonadei92ea95e2017-09-15 04:47:3111#ifndef TEST_FAKE_ENCODER_H_
12#define TEST_FAKE_ENCODER_H_
stefan@webrtc.org360e3762013-08-22 09:29:5613
Yves Gerey3e707812018-11-28 15:47:4914#include <stddef.h>
15#include <stdint.h>
Jonas Olssona4d87372019-07-05 17:08:3316
brandtr49ce67c2017-02-11 08:25:1817#include <memory>
Yves Gerey665174f2018-06-19 13:03:0518#include <vector>
stefan@webrtc.org360e3762013-08-22 09:29:5619
Elad Alon8f01c4e2019-06-28 13:19:4320#include "api/fec_controller_override.h"
Artem Titovd15a5752021-02-10 13:31:2421#include "api/sequence_checker.h"
Danil Chapovalov22ed3662019-03-19 18:39:4922#include "api/task_queue/task_queue_factory.h"
Yves Gerey3e707812018-11-28 15:47:4923#include "api/video/encoded_image.h"
24#include "api/video/video_bitrate_allocation.h"
25#include "api/video/video_frame.h"
26#include "api/video_codecs/video_codec.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3127#include "api/video_codecs/video_encoder.h"
Yves Gerey3e707812018-11-28 15:47:4928#include "modules/video_coding/include/video_codec_interface.h"
Markus Handella3765182020-07-08 11:13:3229#include "rtc_base/synchronization/mutex.h"
Yves Gerey3e707812018-11-28 15:47:4930#include "rtc_base/thread_annotations.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3131#include "system_wrappers/include/clock.h"
stefan@webrtc.org360e3762013-08-22 09:29:5632
33namespace webrtc {
pbos@webrtc.orgcb5118c2013-09-03 09:10:3734namespace test {
stefan@webrtc.org360e3762013-08-22 09:29:5635
36class FakeEncoder : public VideoEncoder {
37 public:
38 explicit FakeEncoder(Clock* clock);
brandtr49ce67c2017-02-11 08:25:1839 virtual ~FakeEncoder() = default;
stefan@webrtc.org360e3762013-08-22 09:29:5640
pbos@webrtc.org3349ae02014-03-13 12:52:2741 // Sets max bitrate. Not thread-safe, call before registering the encoder.
Markus Handella3765182020-07-08 11:13:3242 void SetMaxBitrate(int max_kbps) RTC_LOCKS_EXCLUDED(mutex_);
43 void SetQp(int qp) RTC_LOCKS_EXCLUDED(mutex_);
pbos@webrtc.orgcb5118c2013-09-03 09:10:3744
Elad Alon8f01c4e2019-06-28 13:19:4345 void SetFecControllerOverride(
46 FecControllerOverride* fec_controller_override) override;
47
Markus Handell409784d2020-05-18 21:15:2148 int32_t InitEncode(const VideoCodec* config, const Settings& settings)
Markus Handella3765182020-07-08 11:13:3249 RTC_LOCKS_EXCLUDED(mutex_) override;
Miguel Casas-Sanchez47650702015-05-30 00:21:4050 int32_t Encode(const VideoFrame& input_image,
Markus Handell409784d2020-05-18 21:15:2151 const std::vector<VideoFrameType>* frame_types)
Markus Handella3765182020-07-08 11:13:3252 RTC_LOCKS_EXCLUDED(mutex_) override;
Markus Handell409784d2020-05-18 21:15:2153 int32_t RegisterEncodeCompleteCallback(EncodedImageCallback* callback)
Markus Handella3765182020-07-08 11:13:3254 RTC_LOCKS_EXCLUDED(mutex_) override;
kjellander@webrtc.org14665ff2015-03-04 12:58:3555 int32_t Release() override;
Markus Handell409784d2020-05-18 21:15:2156 void SetRates(const RateControlParameters& parameters)
Markus Handella3765182020-07-08 11:13:3257 RTC_LOCKS_EXCLUDED(mutex_) override;
58 int GetConfiguredInputFramerate() const RTC_LOCKS_EXCLUDED(mutex_);
Erik Språngdf351f42018-11-06 10:33:1559 EncoderInfo GetEncoderInfo() const override;
Peter Boströmb7d9a972015-12-18 15:01:1160
61 static const char* kImplementationName;
stefan@webrtc.org360e3762013-08-22 09:29:5662
pbos@webrtc.org273a4142014-12-01 15:23:2163 protected:
Ilya Nikolaevskiyb0588e62018-08-27 12:12:2764 struct FrameInfo {
65 bool keyframe;
66 struct SpatialLayer {
67 SpatialLayer() = default;
68 SpatialLayer(int size, int temporal_id)
69 : size(size), temporal_id(temporal_id) {}
70 // Size of a current frame in the layer.
71 int size = 0;
72 // Temporal index of a current frame in the layer.
73 int temporal_id = 0;
74 };
75 std::vector<SpatialLayer> layers;
76 };
77
Niels Möller87e2d782019-03-07 09:18:2378 FrameInfo NextFrame(const std::vector<VideoFrameType>* frame_types,
Ilya Nikolaevskiyb0588e62018-08-27 12:12:2779 bool keyframe,
80 uint8_t num_simulcast_streams,
81 const VideoBitrateAllocation& target_bitrate,
Niels Möller5b69aa62020-08-14 13:32:1482 SpatialLayer simulcast_streams[kMaxSimulcastStreams],
Markus Handella3765182020-07-08 11:13:3283 int framerate) RTC_LOCKS_EXCLUDED(mutex_);
Ilya Nikolaevskiyb0588e62018-08-27 12:12:2784
Niels Möllerd7380712019-03-06 09:09:4785 // Called before the frame is passed to callback_->OnEncodedImage, to let
Niels Möller08ae7ce2020-09-23 13:58:1286 // subclasses fill out CodecSpecificInfo, possibly modify |encoded_image| or
87 // |buffer|.
88 virtual CodecSpecificInfo EncodeHook(
89 EncodedImage& encoded_image,
90 rtc::scoped_refptr<EncodedImageBuffer> buffer);
Niels Möllerd7380712019-03-06 09:09:4791
Markus Handell409784d2020-05-18 21:15:2192 void SetRatesLocked(const RateControlParameters& parameters)
Markus Handella3765182020-07-08 11:13:3293 RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_);
Markus Handell409784d2020-05-18 21:15:2194
Markus Handella3765182020-07-08 11:13:3295 FrameInfo last_frame_info_ RTC_GUARDED_BY(mutex_);
pbos@webrtc.orgde1429e2014-04-28 13:00:2196 Clock* const clock_;
Ilya Nikolaevskiyb0588e62018-08-27 12:12:2797
Markus Handella3765182020-07-08 11:13:3298 VideoCodec config_ RTC_GUARDED_BY(mutex_);
99 EncodedImageCallback* callback_ RTC_GUARDED_BY(mutex_);
100 RateControlParameters current_rate_settings_ RTC_GUARDED_BY(mutex_);
101 int max_target_bitrate_kbps_ RTC_GUARDED_BY(mutex_);
102 bool pending_keyframe_ RTC_GUARDED_BY(mutex_);
103 uint32_t counter_ RTC_GUARDED_BY(mutex_);
104 mutable Mutex mutex_;
Ilya Nikolaevskiyb0588e62018-08-27 12:12:27105 bool used_layers_[kMaxSimulcastStreams];
Markus Handella3765182020-07-08 11:13:32106 absl::optional<int> qp_ RTC_GUARDED_BY(mutex_);
sprang4847ae62017-06-27 14:06:52107
108 // Current byte debt to be payed over a number of frames.
109 // The debt is acquired by keyframes overshooting the bitrate target.
110 size_t debt_bytes_;
stefan@webrtc.org360e3762013-08-22 09:29:56111};
stefan@webrtc.org79c33592014-08-06 09:24:53112
Niels Möllerd7380712019-03-06 09:09:47113class FakeH264Encoder : public FakeEncoder {
stefan@webrtc.org79c33592014-08-06 09:24:53114 public:
115 explicit FakeH264Encoder(Clock* clock);
brandtr49ce67c2017-02-11 08:25:18116 virtual ~FakeH264Encoder() = default;
stefan@webrtc.org79c33592014-08-06 09:24:53117
stefan@webrtc.org79c33592014-08-06 09:24:53118 private:
Niels Möller08ae7ce2020-09-23 13:58:12119 CodecSpecificInfo EncodeHook(
120 EncodedImage& encoded_image,
121 rtc::scoped_refptr<EncodedImageBuffer> buffer) override;
Niels Möllerd7380712019-03-06 09:09:47122
Markus Handella3765182020-07-08 11:13:32123 int idr_counter_ RTC_GUARDED_BY(local_mutex_);
124 Mutex local_mutex_;
stefan@webrtc.org79c33592014-08-06 09:24:53125};
asapersson@webrtc.org049e4ec2014-11-20 10:19:46126
127class DelayedEncoder : public test::FakeEncoder {
128 public:
129 DelayedEncoder(Clock* clock, int delay_ms);
brandtr49ce67c2017-02-11 08:25:18130 virtual ~DelayedEncoder() = default;
asapersson@webrtc.org049e4ec2014-11-20 10:19:46131
perkj803d97f2016-11-01 18:45:46132 void SetDelay(int delay_ms);
Miguel Casas-Sanchez47650702015-05-30 00:21:40133 int32_t Encode(const VideoFrame& input_image,
Niels Möller87e2d782019-03-07 09:18:23134 const std::vector<VideoFrameType>* frame_types) override;
asapersson@webrtc.org049e4ec2014-11-20 10:19:46135
136 private:
Niels Möller1e062892018-02-07 09:18:32137 int delay_ms_ RTC_GUARDED_BY(sequence_checker_);
Sebastian Janssonb55015e2019-04-09 11:44:04138 SequenceChecker sequence_checker_;
asapersson@webrtc.org049e4ec2014-11-20 10:19:46139};
brandtr696c9c62016-12-19 13:47:28140
141// This class implements a multi-threaded fake encoder by posting
142// FakeH264Encoder::Encode(.) tasks to |queue1_| and |queue2_|, in an
brandtr49ce67c2017-02-11 08:25:18143// alternating fashion. The class itself does not need to be thread safe,
mflodmancc3d4422017-08-03 15:27:51144// as it is called from the task queue in VideoStreamEncoder.
brandtre78d2662017-01-16 13:57:16145class MultithreadedFakeH264Encoder : public test::FakeH264Encoder {
brandtr696c9c62016-12-19 13:47:28146 public:
Danil Chapovalov22ed3662019-03-19 18:39:49147 MultithreadedFakeH264Encoder(Clock* clock,
148 TaskQueueFactory* task_queue_factory);
brandtr49ce67c2017-02-11 08:25:18149 virtual ~MultithreadedFakeH264Encoder() = default;
150
151 int32_t InitEncode(const VideoCodec* config,
Elad Alon370f93a2019-06-11 12:57:57152 const Settings& settings) override;
brandtr696c9c62016-12-19 13:47:28153
154 int32_t Encode(const VideoFrame& input_image,
Niels Möller87e2d782019-03-07 09:18:23155 const std::vector<VideoFrameType>* frame_types) override;
brandtr696c9c62016-12-19 13:47:28156
157 int32_t EncodeCallback(const VideoFrame& input_image,
Niels Möller87e2d782019-03-07 09:18:23158 const std::vector<VideoFrameType>* frame_types);
brandtr696c9c62016-12-19 13:47:28159
brandtr49ce67c2017-02-11 08:25:18160 int32_t Release() override;
161
brandtr696c9c62016-12-19 13:47:28162 protected:
163 class EncodeTask;
164
Danil Chapovalov22ed3662019-03-19 18:39:49165 TaskQueueFactory* const task_queue_factory_;
Niels Möller1e062892018-02-07 09:18:32166 int current_queue_ RTC_GUARDED_BY(sequence_checker_);
Danil Chapovalov22ed3662019-03-19 18:39:49167 std::unique_ptr<TaskQueueBase, TaskQueueDeleter> queue1_
168 RTC_GUARDED_BY(sequence_checker_);
169 std::unique_ptr<TaskQueueBase, TaskQueueDeleter> queue2_
170 RTC_GUARDED_BY(sequence_checker_);
Sebastian Janssonb55015e2019-04-09 11:44:04171 SequenceChecker sequence_checker_;
brandtr696c9c62016-12-19 13:47:28172};
173
pbos@webrtc.orgcb5118c2013-09-03 09:10:37174} // namespace test
stefan@webrtc.org360e3762013-08-22 09:29:56175} // namespace webrtc
176
Mirko Bonadei92ea95e2017-09-15 04:47:31177#endif // TEST_FAKE_ENCODER_H_