blob: 7fc38ee4f997700f53f26b296545dbeb4e98279b [file] [log] [blame]
ivica5d6a06c2015-09-17 12:30:241/*
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 04:47:3110#ifndef VIDEO_VIDEO_QUALITY_TEST_H_
11#define VIDEO_VIDEO_QUALITY_TEST_H_
ivica5d6a06c2015-09-17 12:30:2412
minyue20c84cc2017-04-10 23:57:5713#include <map>
kwiberg27f982b2016-03-01 19:52:3314#include <memory>
ivica5d6a06c2015-09-17 12:30:2415#include <string>
mflodmand1590b22015-12-09 15:07:5916#include <vector>
ivica5d6a06c2015-09-17 12:30:2417
Patrik Höglundb6b29e02018-06-21 14:58:0118#include "api/fec_controller.h"
19#include "api/test/video_quality_test_fixture.h"
20#include "call/fake_network_pipe.h"
Niels Möller19a68d42018-04-13 11:37:5221#include "media/engine/internalencoderfactory.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3122#include "test/call_test.h"
23#include "test/frame_generator.h"
Christoffer Rodbrob4bb4eb2017-11-13 12:03:5224#include "test/layer_filtering_transport.h"
henrika255750b2018-08-27 14:13:3725#ifdef WEBRTC_WIN
26#include "modules/audio_device/win/core_audio_utility_win.h"
27#endif
ivica5d6a06c2015-09-17 12:30:2428
29namespace webrtc {
30
Patrik Höglundb6b29e02018-06-21 14:58:0131class VideoQualityTest :
32 public test::CallTest, public VideoQualityTestFixtureInterface {
ivica5d6a06c2015-09-17 12:30:2433 public:
Ying Wang0dd1b0a2018-02-20 11:50:2734 explicit VideoQualityTest(
Artem Titove269cb42018-08-29 07:59:2335 std::unique_ptr<InjectionComponents> injection_components);
Patrik Höglundb6b29e02018-06-21 14:58:0136
37 void RunWithAnalyzer(const Params& params) override;
38 void RunWithRenderers(const Params& params) override;
39
40 const std::map<uint8_t, webrtc::MediaType>& payload_type_map() override {
41 return payload_type_map_;
42 }
ivica5d6a06c2015-09-17 12:30:2443
sprangce4aef12015-11-02 15:23:2044 static void FillScalabilitySettings(
45 Params* params,
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:5946 size_t video_idx,
sprangce4aef12015-11-02 15:23:2047 const std::vector<std::string>& stream_descriptors,
sprang1168fd42017-06-21 16:00:1748 int num_streams,
sprangce4aef12015-11-02 15:23:2049 size_t selected_stream,
50 int num_spatial_layers,
51 int selected_sl,
Sergey Silkin57027362018-05-15 07:12:0552 InterLayerPredMode inter_layer_pred,
sprangce4aef12015-11-02 15:23:2053 const std::vector<std::string>& sl_descriptors);
54
Patrik Höglundb6b29e02018-06-21 14:58:0155 // Helper static methods.
56 static VideoStream DefaultVideoStream(const Params& params, size_t video_idx);
57 static VideoStream DefaultThumbnailStream();
58 static std::vector<int> ParseCSV(const std::string& str);
59
ivica5d6a06c2015-09-17 12:30:2460 protected:
minyue20c84cc2017-04-10 23:57:5761 std::map<uint8_t, webrtc::MediaType> payload_type_map_;
62
ivica5d6a06c2015-09-17 12:30:2463 // No-op implementation to be able to instantiate this class from non-TEST_F
64 // locations.
65 void TestBody() override;
66
sprangce4aef12015-11-02 15:23:2067 // Helper methods accessing only params_.
68 std::string GenerateGraphTitle() const;
Artem Titove269cb42018-08-29 07:59:2369 void CheckParamsAndInjectionComponents();
sprangce4aef12015-11-02 15:23:2070
sprangce4aef12015-11-02 15:23:2071 // Helper methods for setting up the call.
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:5972 void CreateCapturers();
73 std::unique_ptr<test::FrameGenerator> CreateFrameGenerator(size_t video_idx);
ilnika014cc52017-03-07 12:21:0474 void SetupThumbnailCapturers(size_t num_thumbnail_streams);
Sebastian Janssone6d7c3e2018-07-11 13:00:4175 std::unique_ptr<VideoEncoder> CreateVideoEncoder(
76 const SdpVideoFormat& format);
minyuea27172d2016-11-01 12:59:2977 void SetupVideo(Transport* send_transport, Transport* recv_transport);
ilnika014cc52017-03-07 12:21:0478 void SetupThumbnails(Transport* send_transport, Transport* recv_transport);
Christoffer Rodbro39a44b22018-08-07 15:07:2479 void StartAudioStreams();
80 void StartThumbnailCapture();
81 void StopThumbnailCapture();
Christoffer Rodbroc2a02882018-08-07 12:10:5682 void StartThumbnails();
83 void StopThumbnails();
ilnika014cc52017-03-07 12:21:0484 void DestroyThumbnailStreams();
henrika255750b2018-08-27 14:13:3785 // Helper method for creating a real ADM (using hardware) for all platforms.
86 rtc::scoped_refptr<AudioDeviceModule> CreateAudioDevice();
Christoffer Rodbroc2a02882018-08-07 12:10:5687 void InitializeAudioDevice(Call::Config* send_call_config,
henrika255750b2018-08-27 14:13:3788 Call::Config* recv_call_config,
89 bool use_real_adm);
Sebastian Jansson3bd2c792018-07-13 11:29:0390 void SetupAudio(Transport* transport);
ivica5d6a06c2015-09-17 12:30:2491
palmkviste75f2042016-09-28 13:19:4892 void StartEncodedFrameLogs(VideoSendStream* stream);
93 void StartEncodedFrameLogs(VideoReceiveStream* stream);
94
Christoffer Rodbrob4bb4eb2017-11-13 12:03:5295 virtual std::unique_ptr<test::LayerFilteringTransport> CreateSendTransport();
96 virtual std::unique_ptr<test::DirectTransport> CreateReceiveTransport();
97
Sebastian Janssonf1f363f2018-08-13 12:24:5898 std::vector<std::unique_ptr<test::TestVideoCapturer>> thumbnail_capturers_;
Sebastian Janssone6d7c3e2018-07-11 13:00:4199 Clock* const clock_;
ilnikcb8c1462017-03-09 17:23:30100
Sebastian Janssone6d7c3e2018-07-11 13:00:41101 test::FunctionVideoEncoderFactory video_encoder_factory_;
102 InternalEncoderFactory internal_encoder_factory_;
ilnika014cc52017-03-07 12:21:04103 std::vector<VideoSendStream::Config> thumbnail_send_configs_;
104 std::vector<VideoEncoderConfig> thumbnail_encoder_configs_;
105 std::vector<VideoSendStream*> thumbnail_send_streams_;
106 std::vector<VideoReceiveStream::Config> thumbnail_receive_configs_;
107 std::vector<VideoReceiveStream*> thumbnail_receive_streams_;
108
palmkviste75f2042016-09-28 13:19:48109 int receive_logs_;
110 int send_logs_;
111
sprangce4aef12015-11-02 15:23:20112 Params params_;
Artem Titove269cb42018-08-29 07:59:23113 std::unique_ptr<InjectionComponents> injection_components_;
Ilya Nikolaevskiya4259f62017-12-05 12:19:45114
Sebastian Jansson3bd2c792018-07-13 11:29:03115 // Note: not same as similarly named member in CallTest. This is the number of
116 // separate send streams, the one in CallTest is the number of substreams for
117 // a single send stream.
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59118 size_t num_video_streams_;
henrika255750b2018-08-27 14:13:37119
120#ifdef WEBRTC_WIN
121 // Windows Core Audio based ADM needs to run on a COM initialized thread.
122 // Only referenced in combination with --audio --use_real_adm flags.
123 std::unique_ptr<webrtc_win::ScopedCOMInitializer> com_initializer_;
124#endif
ivica5d6a06c2015-09-17 12:30:24125};
126
127} // namespace webrtc
128
Mirko Bonadei92ea95e2017-09-15 04:47:31129#endif // VIDEO_VIDEO_QUALITY_TEST_H_