blob: d2fa2ed9a2abfc4d75533d22d0c8b115275d9ea4 [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 */
10#ifndef WEBRTC_VIDEO_VIDEO_QUALITY_TEST_H_
11#define WEBRTC_VIDEO_VIDEO_QUALITY_TEST_H_
12
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
ilnikcb8c1462017-03-09 09:23:30 -080018#include "webrtc/modules/video_coding/codecs/vp8/simulcast_encoder_adapter.h"
ivica5d6a06c2015-09-17 05:30:24 -070019#include "webrtc/test/call_test.h"
20#include "webrtc/test/frame_generator.h"
21#include "webrtc/test/testsupport/trace_to_stderr.h"
22
23namespace webrtc {
24
25class VideoQualityTest : public test::CallTest {
26 public:
27 // Parameters are grouped into smaller structs to make it easier to set
28 // the desired elements and skip unused, using aggregate initialization.
29 // Unfortunately, C++11 (as opposed to C11) doesn't support unnamed structs,
30 // which makes the implementation of VideoQualityTest a bit uglier.
31 struct Params {
minyue626bc952016-10-31 05:47:02 -070032 Params();
33 ~Params();
ilnik566c43b2017-03-07 04:42:54 -080034 struct CallConfig {
minyue626bc952016-10-31 05:47:02 -070035 bool send_side_bwe;
36 Call::Config::BitrateConfig call_bitrate_config;
37 } 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;
palmkviste75f2042016-09-28 06:19:48 -070053 std::string encoded_frame_base_path;
ilnik6b826ef2017-06-16 06:53:48 -070054 std::string clip_name; // "Generator" to generate frames instead.
Tarun Chawla8e857d12017-05-31 19:20:57 +053055 size_t capture_device_index;
ivica5d6a06c2015-09-17 05:30:24 -070056 } video;
ilnik566c43b2017-03-07 04:42:54 -080057 struct Audio {
minyue626bc952016-10-31 05:47:02 -070058 bool enabled;
59 bool sync_video;
minyue4c8b9422017-03-21 04:11:43 -070060 bool dtx;
minyue626bc952016-10-31 05:47:02 -070061 } audio;
ilnik566c43b2017-03-07 04:42:54 -080062 struct Screenshare {
ivica5d6a06c2015-09-17 05:30:24 -070063 bool enabled;
64 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;
77 bool logs;
ilnik566c43b2017-03-07 04:42:54 -080078 struct SS { // Spatial scalability.
sprangce4aef12015-11-02 07:23:20 -080079 std::vector<VideoStream> streams; // If empty, one stream is assumed.
80 size_t selected_stream;
81 int num_spatial_layers;
82 int selected_sl;
83 // If empty, bitrates are generated in VP9Impl automatically.
84 std::vector<SpatialLayer> spatial_layers;
ilnik6b826ef2017-06-16 06:53:48 -070085 // If set, default parameters will be used instead of |streams|.
86 bool infer_streams;
sprangce4aef12015-11-02 07:23:20 -080087 } ss;
ilnika014cc52017-03-07 04:21:04 -080088 int num_thumbnails;
ivica5d6a06c2015-09-17 05:30:24 -070089 };
90
91 VideoQualityTest();
92 void RunWithAnalyzer(const Params& params);
minyue73208662016-08-18 06:28:55 -070093 void RunWithRenderers(const Params& params);
ivica5d6a06c2015-09-17 05:30:24 -070094
sprangce4aef12015-11-02 07:23:20 -080095 static void FillScalabilitySettings(
96 Params* params,
97 const std::vector<std::string>& stream_descriptors,
98 size_t selected_stream,
99 int num_spatial_layers,
100 int selected_sl,
101 const std::vector<std::string>& sl_descriptors);
102
ivica5d6a06c2015-09-17 05:30:24 -0700103 protected:
minyue20c84cc2017-04-10 16:57:57 -0700104 std::map<uint8_t, webrtc::MediaType> payload_type_map_;
105
ivica5d6a06c2015-09-17 05:30:24 -0700106 // No-op implementation to be able to instantiate this class from non-TEST_F
107 // locations.
108 void TestBody() override;
109
sprangce4aef12015-11-02 07:23:20 -0800110 // Helper methods accessing only params_.
111 std::string GenerateGraphTitle() const;
112 void CheckParams();
113
114 // Helper static methods.
115 static VideoStream DefaultVideoStream(const Params& params);
ilnika014cc52017-03-07 04:21:04 -0800116 static VideoStream DefaultThumbnailStream();
sprangce4aef12015-11-02 07:23:20 -0800117 static std::vector<int> ParseCSV(const std::string& str);
118
119 // Helper methods for setting up the call.
perkja49cbd32016-09-16 07:53:41 -0700120 void CreateCapturer();
ilnika014cc52017-03-07 04:21:04 -0800121 void SetupThumbnailCapturers(size_t num_thumbnail_streams);
minyuea27172d2016-11-01 05:59:29 -0700122 void SetupVideo(Transport* send_transport, Transport* recv_transport);
ilnika014cc52017-03-07 04:21:04 -0800123 void SetupThumbnails(Transport* send_transport, Transport* recv_transport);
124 void DestroyThumbnailStreams();
ilnik2a8c2f52017-02-15 02:23:28 -0800125 void SetupScreenshareOrSVC();
minyuea27172d2016-11-01 05:59:29 -0700126 void SetupAudio(int send_channel_id,
127 int receive_channel_id,
128 Call* call,
129 Transport* transport,
130 AudioReceiveStream** audio_receive_stream);
ivica5d6a06c2015-09-17 05:30:24 -0700131
palmkviste75f2042016-09-28 06:19:48 -0700132 void StartEncodedFrameLogs(VideoSendStream* stream);
133 void StartEncodedFrameLogs(VideoReceiveStream* stream);
134
ivica2d4e6c52015-09-23 01:57:06 -0700135 // We need a more general capturer than the FrameGeneratorCapturer.
minyuea27172d2016-11-01 05:59:29 -0700136 std::unique_ptr<test::VideoCapturer> video_capturer_;
ilnika014cc52017-03-07 04:21:04 -0800137 std::vector<std::unique_ptr<test::VideoCapturer>> thumbnail_capturers_;
kwiberg27f982b2016-03-01 11:52:33 -0800138 std::unique_ptr<test::TraceToStderr> trace_to_stderr_;
139 std::unique_ptr<test::FrameGenerator> frame_generator_;
minyuea27172d2016-11-01 05:59:29 -0700140 std::unique_ptr<VideoEncoder> video_encoder_;
ilnikcb8c1462017-03-09 09:23:30 -0800141 std::unique_ptr<VideoEncoderFactory> vp8_encoder_factory_;
142
ilnika014cc52017-03-07 04:21:04 -0800143 std::vector<std::unique_ptr<VideoEncoder>> thumbnail_encoders_;
144 std::vector<VideoSendStream::Config> thumbnail_send_configs_;
145 std::vector<VideoEncoderConfig> thumbnail_encoder_configs_;
146 std::vector<VideoSendStream*> thumbnail_send_streams_;
147 std::vector<VideoReceiveStream::Config> thumbnail_receive_configs_;
148 std::vector<VideoReceiveStream*> thumbnail_receive_streams_;
149
ivica5d6a06c2015-09-17 05:30:24 -0700150 Clock* const clock_;
sprangce4aef12015-11-02 07:23:20 -0800151
palmkviste75f2042016-09-28 06:19:48 -0700152 int receive_logs_;
153 int send_logs_;
154
kthelgason2bc68642017-02-07 07:02:22 -0800155 VideoSendStream::DegradationPreference degradation_preference_ =
sprangc5d62e22017-04-02 23:53:04 -0700156 VideoSendStream::DegradationPreference::kMaintainFramerate;
sprangce4aef12015-11-02 07:23:20 -0800157 Params params_;
ivica5d6a06c2015-09-17 05:30:24 -0700158};
159
160} // namespace webrtc
161
162#endif // WEBRTC_VIDEO_VIDEO_QUALITY_TEST_H_