blob: e41d6f215a39a0cb8aa4601f35e6298502944c75 [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
Patrik Höglundb6b29e02018-06-21 16:58:01 +020018#include "api/fec_controller.h"
19#include "api/test/video_quality_test_fixture.h"
Jiawei Ouc2ebe212018-11-08 10:02:56 -080020#include "api/video/video_bitrate_allocator_factory.h"
Patrik Höglundb6b29e02018-06-21 16:58:01 +020021#include "call/fake_network_pipe.h"
Steve Anton10542f22019-01-11 09:11:00 -080022#include "media/engine/internal_decoder_factory.h"
23#include "media/engine/internal_encoder_factory.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020024#include "test/call_test.h"
Ilya Nikolaevskiy1f0a84a2019-02-05 14:35:33 +010025#include "test/frame_change_extractor.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020026#include "test/frame_generator.h"
Christoffer Rodbrob4bb4eb2017-11-13 13:03:52 +010027#include "test/layer_filtering_transport.h"
Niels Möller88be9722018-10-10 10:58:52 +020028#include "video/video_analyzer.h"
henrika255750b2018-08-27 16:13:37 +020029#ifdef WEBRTC_WIN
30#include "modules/audio_device/win/core_audio_utility_win.h"
31#endif
ivica5d6a06c2015-09-17 05:30:24 -070032
33namespace webrtc {
34
Patrik Höglundb6b29e02018-06-21 16:58:01 +020035class VideoQualityTest :
36 public test::CallTest, public VideoQualityTestFixtureInterface {
ivica5d6a06c2015-09-17 05:30:24 -070037 public:
Ying Wang0dd1b0a2018-02-20 12:50:27 +010038 explicit VideoQualityTest(
Artem Titove269cb42018-08-29 09:59:23 +020039 std::unique_ptr<InjectionComponents> injection_components);
Patrik Höglundb6b29e02018-06-21 16:58:01 +020040
41 void RunWithAnalyzer(const Params& params) override;
42 void RunWithRenderers(const Params& params) override;
43
44 const std::map<uint8_t, webrtc::MediaType>& payload_type_map() override {
45 return payload_type_map_;
46 }
ivica5d6a06c2015-09-17 05:30:24 -070047
sprangce4aef12015-11-02 07:23:20 -080048 static void FillScalabilitySettings(
49 Params* params,
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +010050 size_t video_idx,
sprangce4aef12015-11-02 07:23:20 -080051 const std::vector<std::string>& stream_descriptors,
sprang1168fd42017-06-21 09:00:17 -070052 int num_streams,
sprangce4aef12015-11-02 07:23:20 -080053 size_t selected_stream,
54 int num_spatial_layers,
55 int selected_sl,
Sergey Silkin57027362018-05-15 09:12:05 +020056 InterLayerPredMode inter_layer_pred,
sprangce4aef12015-11-02 07:23:20 -080057 const std::vector<std::string>& sl_descriptors);
58
Patrik Höglundb6b29e02018-06-21 16:58:01 +020059 // Helper static methods.
60 static VideoStream DefaultVideoStream(const Params& params, size_t video_idx);
61 static VideoStream DefaultThumbnailStream();
62 static std::vector<int> ParseCSV(const std::string& str);
63
ivica5d6a06c2015-09-17 05:30:24 -070064 protected:
minyue20c84cc2017-04-10 16:57:57 -070065 std::map<uint8_t, webrtc::MediaType> payload_type_map_;
66
ivica5d6a06c2015-09-17 05:30:24 -070067 // No-op implementation to be able to instantiate this class from non-TEST_F
68 // locations.
69 void TestBody() override;
70
sprangce4aef12015-11-02 07:23:20 -080071 // Helper methods accessing only params_.
72 std::string GenerateGraphTitle() const;
Artem Titove269cb42018-08-29 09:59:23 +020073 void CheckParamsAndInjectionComponents();
sprangce4aef12015-11-02 07:23:20 -080074
sprangce4aef12015-11-02 07:23:20 -080075 // Helper methods for setting up the call.
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +010076 void CreateCapturers();
77 std::unique_ptr<test::FrameGenerator> CreateFrameGenerator(size_t video_idx);
ilnika014cc52017-03-07 04:21:04 -080078 void SetupThumbnailCapturers(size_t num_thumbnail_streams);
Niels Möllercbcbc222018-09-28 09:07:24 +020079 std::unique_ptr<VideoDecoder> CreateVideoDecoder(
80 const SdpVideoFormat& format);
Niels Möller88be9722018-10-10 10:58:52 +020081 std::unique_ptr<VideoEncoder> CreateVideoEncoder(const SdpVideoFormat& format,
82 VideoAnalyzer* analyzer);
minyuea27172d2016-11-01 05:59:29 -070083 void SetupVideo(Transport* send_transport, Transport* recv_transport);
ilnika014cc52017-03-07 04:21:04 -080084 void SetupThumbnails(Transport* send_transport, Transport* recv_transport);
Christoffer Rodbro39a44b22018-08-07 17:07:24 +020085 void StartAudioStreams();
Christoffer Rodbroc2a02882018-08-07 14:10:56 +020086 void StartThumbnails();
87 void StopThumbnails();
ilnika014cc52017-03-07 04:21:04 -080088 void DestroyThumbnailStreams();
henrika255750b2018-08-27 16:13:37 +020089 // Helper method for creating a real ADM (using hardware) for all platforms.
90 rtc::scoped_refptr<AudioDeviceModule> CreateAudioDevice();
Christoffer Rodbroc2a02882018-08-07 14:10:56 +020091 void InitializeAudioDevice(Call::Config* send_call_config,
henrika255750b2018-08-27 16:13:37 +020092 Call::Config* recv_call_config,
93 bool use_real_adm);
Sebastian Jansson3bd2c792018-07-13 13:29:03 +020094 void SetupAudio(Transport* transport);
ivica5d6a06c2015-09-17 05:30:24 -070095
palmkviste75f2042016-09-28 06:19:48 -070096 void StartEncodedFrameLogs(VideoReceiveStream* stream);
97
Christoffer Rodbrob4bb4eb2017-11-13 13:03:52 +010098 virtual std::unique_ptr<test::LayerFilteringTransport> CreateSendTransport();
99 virtual std::unique_ptr<test::DirectTransport> CreateReceiveTransport();
100
Niels Möller1c931c42018-12-18 16:08:11 +0100101 std::vector<std::unique_ptr<rtc::VideoSourceInterface<VideoFrame>>>
102 thumbnail_capturers_;
Sebastian Janssone6d7c3e2018-07-11 15:00:41 +0200103 Clock* const clock_;
ilnikcb8c1462017-03-09 09:23:30 -0800104
Niels Möllercbcbc222018-09-28 09:07:24 +0200105 test::FunctionVideoDecoderFactory video_decoder_factory_;
106 InternalDecoderFactory internal_decoder_factory_;
Sebastian Janssone6d7c3e2018-07-11 15:00:41 +0200107 test::FunctionVideoEncoderFactory video_encoder_factory_;
Niels Möller88be9722018-10-10 10:58:52 +0200108 test::FunctionVideoEncoderFactory video_encoder_factory_with_analyzer_;
Jiawei Ouc2ebe212018-11-08 10:02:56 -0800109 std::unique_ptr<VideoBitrateAllocatorFactory>
110 video_bitrate_allocator_factory_;
Sebastian Janssone6d7c3e2018-07-11 15:00:41 +0200111 InternalEncoderFactory internal_encoder_factory_;
ilnika014cc52017-03-07 04:21:04 -0800112 std::vector<VideoSendStream::Config> thumbnail_send_configs_;
113 std::vector<VideoEncoderConfig> thumbnail_encoder_configs_;
114 std::vector<VideoSendStream*> thumbnail_send_streams_;
115 std::vector<VideoReceiveStream::Config> thumbnail_receive_configs_;
116 std::vector<VideoReceiveStream*> thumbnail_receive_streams_;
117
Ilya Nikolaevskiy1f0a84a2019-02-05 14:35:33 +0100118 std::unique_ptr<FrameChangeExtractor> frame_change_extractor_;
119
palmkviste75f2042016-09-28 06:19:48 -0700120 int receive_logs_;
121 int send_logs_;
122
sprangce4aef12015-11-02 07:23:20 -0800123 Params params_;
Artem Titove269cb42018-08-29 09:59:23 +0200124 std::unique_ptr<InjectionComponents> injection_components_;
Ilya Nikolaevskiya4259f62017-12-05 13:19:45 +0100125
Niels Möller88be9722018-10-10 10:58:52 +0200126 // Set non-null when running with analyzer.
127 std::unique_ptr<VideoAnalyzer> analyzer_;
128
Sebastian Jansson3bd2c792018-07-13 13:29:03 +0200129 // Note: not same as similarly named member in CallTest. This is the number of
130 // separate send streams, the one in CallTest is the number of substreams for
131 // a single send stream.
Ilya Nikolaevskiy255d1cd2017-12-21 18:02:59 +0100132 size_t num_video_streams_;
henrika255750b2018-08-27 16:13:37 +0200133
134#ifdef WEBRTC_WIN
135 // Windows Core Audio based ADM needs to run on a COM initialized thread.
136 // Only referenced in combination with --audio --use_real_adm flags.
137 std::unique_ptr<webrtc_win::ScopedCOMInitializer> com_initializer_;
138#endif
ivica5d6a06c2015-09-17 05:30:24 -0700139};
140
141} // namespace webrtc
142
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200143#endif // VIDEO_VIDEO_QUALITY_TEST_H_