blob: b741ad331aa4c95e94933578bc283d13761210f5 [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
kwiberg27f982b2016-03-01 11:52:33 -080013#include <memory>
ivica5d6a06c2015-09-17 05:30:24 -070014#include <string>
mflodmand1590b22015-12-09 07:07:59 -080015#include <vector>
ivica5d6a06c2015-09-17 05:30:24 -070016
17#include "webrtc/test/call_test.h"
18#include "webrtc/test/frame_generator.h"
19#include "webrtc/test/testsupport/trace_to_stderr.h"
20
21namespace webrtc {
22
23class VideoQualityTest : public test::CallTest {
24 public:
25 // Parameters are grouped into smaller structs to make it easier to set
26 // the desired elements and skip unused, using aggregate initialization.
27 // Unfortunately, C++11 (as opposed to C11) doesn't support unnamed structs,
28 // which makes the implementation of VideoQualityTest a bit uglier.
29 struct Params {
minyue626bc952016-10-31 05:47:02 -070030 Params();
31 ~Params();
ivica5d6a06c2015-09-17 05:30:24 -070032 struct {
minyue626bc952016-10-31 05:47:02 -070033 bool send_side_bwe;
34 Call::Config::BitrateConfig call_bitrate_config;
35 } call;
36 struct {
37 bool enabled;
ivica5d6a06c2015-09-17 05:30:24 -070038 size_t width;
39 size_t height;
40 int32_t fps;
41 int min_bitrate_bps;
42 int target_bitrate_bps;
43 int max_bitrate_bps;
mflodman48a4beb2016-07-01 13:03:59 +020044 bool suspend_below_min_bitrate;
ivica5d6a06c2015-09-17 05:30:24 -070045 std::string codec;
sprangce4aef12015-11-02 07:23:20 -080046 int num_temporal_layers;
47 int selected_tl;
ivica5d6a06c2015-09-17 05:30:24 -070048 int min_transmit_bps;
brandtr1293aca2016-11-16 22:47:29 -080049 bool ulpfec;
50 bool flexfec;
palmkviste75f2042016-09-28 06:19:48 -070051 std::string encoded_frame_base_path;
ivica5d6a06c2015-09-17 05:30:24 -070052 std::string clip_name;
53 } video;
minyue626bc952016-10-31 05:47:02 -070054 struct {
55 bool enabled;
56 bool sync_video;
57 } audio;
58 struct {
ivica5d6a06c2015-09-17 05:30:24 -070059 bool enabled;
60 int32_t slide_change_interval;
61 int32_t scroll_duration;
62 } screenshare;
minyue626bc952016-10-31 05:47:02 -070063 struct {
ivica5d6a06c2015-09-17 05:30:24 -070064 std::string test_label;
sprangce4aef12015-11-02 07:23:20 -080065 double avg_psnr_threshold; // (*)
66 double avg_ssim_threshold; // (*)
ivica5d6a06c2015-09-17 05:30:24 -070067 int test_durations_secs;
68 std::string graph_data_output_filename;
sprangce4aef12015-11-02 07:23:20 -080069 std::string graph_title;
ivica5d6a06c2015-09-17 05:30:24 -070070 } analyzer;
71 FakeNetworkPipe::Config pipe;
72 bool logs;
minyue73208662016-08-18 06:28:55 -070073 struct { // Spatial scalability.
sprangce4aef12015-11-02 07:23:20 -080074 std::vector<VideoStream> streams; // If empty, one stream is assumed.
75 size_t selected_stream;
76 int num_spatial_layers;
77 int selected_sl;
78 // If empty, bitrates are generated in VP9Impl automatically.
79 std::vector<SpatialLayer> spatial_layers;
80 } ss;
ivica5d6a06c2015-09-17 05:30:24 -070081 };
sprangce4aef12015-11-02 07:23:20 -080082 // (*) Set to -1.1 if generating graph data for simulcast or SVC and the
83 // selected stream/layer doesn't have the same resolution as the largest
84 // stream/layer (to ignore the PSNR and SSIM calculation errors).
ivica5d6a06c2015-09-17 05:30:24 -070085
86 VideoQualityTest();
87 void RunWithAnalyzer(const Params& params);
minyue73208662016-08-18 06:28:55 -070088 void RunWithRenderers(const Params& params);
ivica5d6a06c2015-09-17 05:30:24 -070089
sprangce4aef12015-11-02 07:23:20 -080090 static void FillScalabilitySettings(
91 Params* params,
92 const std::vector<std::string>& stream_descriptors,
93 size_t selected_stream,
94 int num_spatial_layers,
95 int selected_sl,
96 const std::vector<std::string>& sl_descriptors);
97
ivica5d6a06c2015-09-17 05:30:24 -070098 protected:
99 // No-op implementation to be able to instantiate this class from non-TEST_F
100 // locations.
101 void TestBody() override;
102
sprangce4aef12015-11-02 07:23:20 -0800103 // Helper methods accessing only params_.
104 std::string GenerateGraphTitle() const;
105 void CheckParams();
106
107 // Helper static methods.
108 static VideoStream DefaultVideoStream(const Params& params);
109 static std::vector<int> ParseCSV(const std::string& str);
110
111 // Helper methods for setting up the call.
perkja49cbd32016-09-16 07:53:41 -0700112 void CreateCapturer();
minyuea27172d2016-11-01 05:59:29 -0700113 void SetupVideo(Transport* send_transport, Transport* recv_transport);
sprangce4aef12015-11-02 07:23:20 -0800114 void SetupScreenshare();
minyuea27172d2016-11-01 05:59:29 -0700115 void SetupAudio(int send_channel_id,
116 int receive_channel_id,
117 Call* call,
118 Transport* transport,
119 AudioReceiveStream** audio_receive_stream);
ivica5d6a06c2015-09-17 05:30:24 -0700120
palmkviste75f2042016-09-28 06:19:48 -0700121 void StartEncodedFrameLogs(VideoSendStream* stream);
122 void StartEncodedFrameLogs(VideoReceiveStream* stream);
123
ivica2d4e6c52015-09-23 01:57:06 -0700124 // We need a more general capturer than the FrameGeneratorCapturer.
minyuea27172d2016-11-01 05:59:29 -0700125 std::unique_ptr<test::VideoCapturer> video_capturer_;
kwiberg27f982b2016-03-01 11:52:33 -0800126 std::unique_ptr<test::TraceToStderr> trace_to_stderr_;
127 std::unique_ptr<test::FrameGenerator> frame_generator_;
minyuea27172d2016-11-01 05:59:29 -0700128 std::unique_ptr<VideoEncoder> video_encoder_;
ivica5d6a06c2015-09-17 05:30:24 -0700129 Clock* const clock_;
sprangce4aef12015-11-02 07:23:20 -0800130
palmkviste75f2042016-09-28 06:19:48 -0700131 int receive_logs_;
132 int send_logs_;
133
sprangce4aef12015-11-02 07:23:20 -0800134 Params params_;
ivica5d6a06c2015-09-17 05:30:24 -0700135};
136
137} // namespace webrtc
138
139#endif // WEBRTC_VIDEO_VIDEO_QUALITY_TEST_H_