blob: e0b3deae609302ccd558fe65a61236f116a1d1ca [file] [log] [blame]
ivica5d6a06c2015-09-17 05:30:24 -07001/*
2 * Copyright (c) 2015 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 */
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020010#ifndef VIDEO_VIDEO_QUALITY_TEST_H_
11#define VIDEO_VIDEO_QUALITY_TEST_H_
ivica5d6a06c2015-09-17 05:30:24 -070012
minyue20c84cc2017-04-10 16:57:57 -070013#include <map>
kwiberg27f982b2016-03-01 11:52:33 -080014#include <memory>
ivica5d6a06c2015-09-17 05:30:24 -070015#include <string>
mflodmand1590b22015-12-09 07:07:59 -080016#include <vector>
ivica5d6a06c2015-09-17 05:30:24 -070017
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "media/engine/simulcast_encoder_adapter.h"
19#include "test/call_test.h"
20#include "test/frame_generator.h"
ivica5d6a06c2015-09-17 05:30:24 -070021
22namespace webrtc {
23
24class VideoQualityTest : public test::CallTest {
25 public:
26 // Parameters are grouped into smaller structs to make it easier to set
27 // the desired elements and skip unused, using aggregate initialization.
28 // Unfortunately, C++11 (as opposed to C11) doesn't support unnamed structs,
29 // which makes the implementation of VideoQualityTest a bit uglier.
30 struct Params {
minyue626bc952016-10-31 05:47:02 -070031 Params();
32 ~Params();
ilnik566c43b2017-03-07 04:42:54 -080033 struct CallConfig {
minyue626bc952016-10-31 05:47:02 -070034 bool send_side_bwe;
35 Call::Config::BitrateConfig call_bitrate_config;
ilnik98436952017-07-13 00:47:03 -070036 int num_thumbnails;
minyue626bc952016-10-31 05:47:02 -070037 } call;
ilnik566c43b2017-03-07 04:42:54 -080038 struct Video {
minyue626bc952016-10-31 05:47:02 -070039 bool enabled;
ivica5d6a06c2015-09-17 05:30:24 -070040 size_t width;
41 size_t height;
42 int32_t fps;
43 int min_bitrate_bps;
44 int target_bitrate_bps;
45 int max_bitrate_bps;
mflodman48a4beb2016-07-01 13:03:59 +020046 bool suspend_below_min_bitrate;
ivica5d6a06c2015-09-17 05:30:24 -070047 std::string codec;
sprangce4aef12015-11-02 07:23:20 -080048 int num_temporal_layers;
49 int selected_tl;
ivica5d6a06c2015-09-17 05:30:24 -070050 int min_transmit_bps;
brandtr1293aca2016-11-16 22:47:29 -080051 bool ulpfec;
52 bool flexfec;
ilnik6b826ef2017-06-16 06:53:48 -070053 std::string clip_name; // "Generator" to generate frames instead.
Tarun Chawla8e857d12017-05-31 19:20:57 +053054 size_t capture_device_index;
ivica5d6a06c2015-09-17 05:30:24 -070055 } video;
ilnik566c43b2017-03-07 04:42:54 -080056 struct Audio {
minyue626bc952016-10-31 05:47:02 -070057 bool enabled;
58 bool sync_video;
minyue4c8b9422017-03-21 04:11:43 -070059 bool dtx;
minyue626bc952016-10-31 05:47:02 -070060 } audio;
ilnik566c43b2017-03-07 04:42:54 -080061 struct Screenshare {
ivica5d6a06c2015-09-17 05:30:24 -070062 bool enabled;
erikvarga579de6f2017-08-29 09:12:57 -070063 bool generate_slides;
ivica5d6a06c2015-09-17 05:30:24 -070064 int32_t slide_change_interval;
65 int32_t scroll_duration;
ilnik8d8185c2017-04-12 04:52:55 -070066 std::vector<std::string> slides;
ivica5d6a06c2015-09-17 05:30:24 -070067 } screenshare;
ilnik566c43b2017-03-07 04:42:54 -080068 struct Analyzer {
ivica5d6a06c2015-09-17 05:30:24 -070069 std::string test_label;
sprangce4aef12015-11-02 07:23:20 -080070 double avg_psnr_threshold; // (*)
71 double avg_ssim_threshold; // (*)
ivica5d6a06c2015-09-17 05:30:24 -070072 int test_durations_secs;
73 std::string graph_data_output_filename;
sprangce4aef12015-11-02 07:23:20 -080074 std::string graph_title;
ivica5d6a06c2015-09-17 05:30:24 -070075 } analyzer;
76 FakeNetworkPipe::Config pipe;
ilnik566c43b2017-03-07 04:42:54 -080077 struct SS { // Spatial scalability.
sprangce4aef12015-11-02 07:23:20 -080078 std::vector<VideoStream> streams; // If empty, one stream is assumed.
79 size_t selected_stream;
80 int num_spatial_layers;
81 int selected_sl;
82 // If empty, bitrates are generated in VP9Impl automatically.
83 std::vector<SpatialLayer> spatial_layers;
ilnik6b826ef2017-06-16 06:53:48 -070084 // If set, default parameters will be used instead of |streams|.
85 bool infer_streams;
sprangce4aef12015-11-02 07:23:20 -080086 } ss;
ilnik98436952017-07-13 00:47:03 -070087 struct Logging {
88 bool logs;
89 std::string rtc_event_log_name;
90 std::string rtp_dump_name;
91 std::string encoded_frame_base_path;
92 } logging;
ivica5d6a06c2015-09-17 05:30:24 -070093 };
94
95 VideoQualityTest();
96 void RunWithAnalyzer(const Params& params);
minyue73208662016-08-18 06:28:55 -070097 void RunWithRenderers(const Params& params);
ivica5d6a06c2015-09-17 05:30:24 -070098
sprangce4aef12015-11-02 07:23:20 -080099 static void FillScalabilitySettings(
100 Params* params,
101 const std::vector<std::string>& stream_descriptors,
sprang1168fd42017-06-21 09:00:17 -0700102 int num_streams,
sprangce4aef12015-11-02 07:23:20 -0800103 size_t selected_stream,
104 int num_spatial_layers,
105 int selected_sl,
106 const std::vector<std::string>& sl_descriptors);
107
ivica5d6a06c2015-09-17 05:30:24 -0700108 protected:
minyue20c84cc2017-04-10 16:57:57 -0700109 std::map<uint8_t, webrtc::MediaType> payload_type_map_;
110
ivica5d6a06c2015-09-17 05:30:24 -0700111 // No-op implementation to be able to instantiate this class from non-TEST_F
112 // locations.
113 void TestBody() override;
114
sprangce4aef12015-11-02 07:23:20 -0800115 // Helper methods accessing only params_.
116 std::string GenerateGraphTitle() const;
117 void CheckParams();
118
119 // Helper static methods.
120 static VideoStream DefaultVideoStream(const Params& params);
ilnika014cc52017-03-07 04:21:04 -0800121 static VideoStream DefaultThumbnailStream();
sprangce4aef12015-11-02 07:23:20 -0800122 static std::vector<int> ParseCSV(const std::string& str);
123
124 // Helper methods for setting up the call.
perkja49cbd32016-09-16 07:53:41 -0700125 void CreateCapturer();
ilnika014cc52017-03-07 04:21:04 -0800126 void SetupThumbnailCapturers(size_t num_thumbnail_streams);
minyuea27172d2016-11-01 05:59:29 -0700127 void SetupVideo(Transport* send_transport, Transport* recv_transport);
ilnika014cc52017-03-07 04:21:04 -0800128 void SetupThumbnails(Transport* send_transport, Transport* recv_transport);
129 void DestroyThumbnailStreams();
ilnik2a8c2f52017-02-15 02:23:28 -0800130 void SetupScreenshareOrSVC();
minyuea27172d2016-11-01 05:59:29 -0700131 void SetupAudio(int send_channel_id,
132 int receive_channel_id,
minyuea27172d2016-11-01 05:59:29 -0700133 Transport* transport,
134 AudioReceiveStream** audio_receive_stream);
ivica5d6a06c2015-09-17 05:30:24 -0700135
palmkviste75f2042016-09-28 06:19:48 -0700136 void StartEncodedFrameLogs(VideoSendStream* stream);
137 void StartEncodedFrameLogs(VideoReceiveStream* stream);
138
ivica2d4e6c52015-09-23 01:57:06 -0700139 // We need a more general capturer than the FrameGeneratorCapturer.
minyuea27172d2016-11-01 05:59:29 -0700140 std::unique_ptr<test::VideoCapturer> video_capturer_;
ilnika014cc52017-03-07 04:21:04 -0800141 std::vector<std::unique_ptr<test::VideoCapturer>> thumbnail_capturers_;
kwiberg27f982b2016-03-01 11:52:33 -0800142 std::unique_ptr<test::FrameGenerator> frame_generator_;
minyuea27172d2016-11-01 05:59:29 -0700143 std::unique_ptr<VideoEncoder> video_encoder_;
Rasmus Brandt31027342017-09-29 13:48:12 +0000144 std::unique_ptr<cricket::WebRtcVideoEncoderFactory> vp8_encoder_factory_;
ilnikcb8c1462017-03-09 09:23:30 -0800145
ilnika014cc52017-03-07 04:21:04 -0800146 std::vector<std::unique_ptr<VideoEncoder>> thumbnail_encoders_;
147 std::vector<VideoSendStream::Config> thumbnail_send_configs_;
148 std::vector<VideoEncoderConfig> thumbnail_encoder_configs_;
149 std::vector<VideoSendStream*> thumbnail_send_streams_;
150 std::vector<VideoReceiveStream::Config> thumbnail_receive_configs_;
151 std::vector<VideoReceiveStream*> thumbnail_receive_streams_;
152
ivica5d6a06c2015-09-17 05:30:24 -0700153 Clock* const clock_;
sprangce4aef12015-11-02 07:23:20 -0800154
palmkviste75f2042016-09-28 06:19:48 -0700155 int receive_logs_;
156 int send_logs_;
157
kthelgason2bc68642017-02-07 07:02:22 -0800158 VideoSendStream::DegradationPreference degradation_preference_ =
sprangc5d62e22017-04-02 23:53:04 -0700159 VideoSendStream::DegradationPreference::kMaintainFramerate;
sprangce4aef12015-11-02 07:23:20 -0800160 Params params_;
ivica5d6a06c2015-09-17 05:30:24 -0700161};
162
163} // namespace webrtc
164
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200165#endif // VIDEO_VIDEO_QUALITY_TEST_H_