blob: f67e65bc13797428c0cc7cc61ca678a526870ebc [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"
Jiawei Ouc2ebe212018-11-08 18:02:5620#include "api/video/video_bitrate_allocator_factory.h"
Patrik Höglundb6b29e02018-06-21 14:58:0121#include "call/fake_network_pipe.h"
Niels Möllercbcbc222018-09-28 07:07:2422#include "media/engine/internaldecoderfactory.h"
Niels Möller19a68d42018-04-13 11:37:5223#include "media/engine/internalencoderfactory.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3124#include "test/call_test.h"
25#include "test/frame_generator.h"
Christoffer Rodbrob4bb4eb2017-11-13 12:03:5226#include "test/layer_filtering_transport.h"
Niels Möller88be9722018-10-10 08:58:5227#include "video/video_analyzer.h"
henrika255750b2018-08-27 14:13:3728#ifdef WEBRTC_WIN
29#include "modules/audio_device/win/core_audio_utility_win.h"
30#endif
ivica5d6a06c2015-09-17 12:30:2431
32namespace webrtc {
33
Patrik Höglundb6b29e02018-06-21 14:58:0134class VideoQualityTest :
35 public test::CallTest, public VideoQualityTestFixtureInterface {
ivica5d6a06c2015-09-17 12:30:2436 public:
Ying Wang0dd1b0a2018-02-20 11:50:2737 explicit VideoQualityTest(
Artem Titove269cb42018-08-29 07:59:2338 std::unique_ptr<InjectionComponents> injection_components);
Patrik Höglundb6b29e02018-06-21 14:58:0139
40 void RunWithAnalyzer(const Params& params) override;
41 void RunWithRenderers(const Params& params) override;
42
43 const std::map<uint8_t, webrtc::MediaType>& payload_type_map() override {
44 return payload_type_map_;
45 }
ivica5d6a06c2015-09-17 12:30:2446
sprangce4aef12015-11-02 15:23:2047 static void FillScalabilitySettings(
48 Params* params,
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:5949 size_t video_idx,
sprangce4aef12015-11-02 15:23:2050 const std::vector<std::string>& stream_descriptors,
sprang1168fd42017-06-21 16:00:1751 int num_streams,
sprangce4aef12015-11-02 15:23:2052 size_t selected_stream,
53 int num_spatial_layers,
54 int selected_sl,
Sergey Silkin57027362018-05-15 07:12:0555 InterLayerPredMode inter_layer_pred,
sprangce4aef12015-11-02 15:23:2056 const std::vector<std::string>& sl_descriptors);
57
Patrik Höglundb6b29e02018-06-21 14:58:0158 // Helper static methods.
59 static VideoStream DefaultVideoStream(const Params& params, size_t video_idx);
60 static VideoStream DefaultThumbnailStream();
61 static std::vector<int> ParseCSV(const std::string& str);
62
ivica5d6a06c2015-09-17 12:30:2463 protected:
minyue20c84cc2017-04-10 23:57:5764 std::map<uint8_t, webrtc::MediaType> payload_type_map_;
65
ivica5d6a06c2015-09-17 12:30:2466 // No-op implementation to be able to instantiate this class from non-TEST_F
67 // locations.
68 void TestBody() override;
69
sprangce4aef12015-11-02 15:23:2070 // Helper methods accessing only params_.
71 std::string GenerateGraphTitle() const;
Artem Titove269cb42018-08-29 07:59:2372 void CheckParamsAndInjectionComponents();
sprangce4aef12015-11-02 15:23:2073
sprangce4aef12015-11-02 15:23:2074 // Helper methods for setting up the call.
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:5975 void CreateCapturers();
76 std::unique_ptr<test::FrameGenerator> CreateFrameGenerator(size_t video_idx);
ilnika014cc52017-03-07 12:21:0477 void SetupThumbnailCapturers(size_t num_thumbnail_streams);
Niels Möllercbcbc222018-09-28 07:07:2478 std::unique_ptr<VideoDecoder> CreateVideoDecoder(
79 const SdpVideoFormat& format);
Niels Möller88be9722018-10-10 08:58:5280 std::unique_ptr<VideoEncoder> CreateVideoEncoder(const SdpVideoFormat& format,
81 VideoAnalyzer* analyzer);
minyuea27172d2016-11-01 12:59:2982 void SetupVideo(Transport* send_transport, Transport* recv_transport);
ilnika014cc52017-03-07 12:21:0483 void SetupThumbnails(Transport* send_transport, Transport* recv_transport);
Christoffer Rodbro39a44b22018-08-07 15:07:2484 void StartAudioStreams();
85 void StartThumbnailCapture();
86 void StopThumbnailCapture();
Christoffer Rodbroc2a02882018-08-07 12:10:5687 void StartThumbnails();
88 void StopThumbnails();
ilnika014cc52017-03-07 12:21:0489 void DestroyThumbnailStreams();
henrika255750b2018-08-27 14:13:3790 // Helper method for creating a real ADM (using hardware) for all platforms.
91 rtc::scoped_refptr<AudioDeviceModule> CreateAudioDevice();
Christoffer Rodbroc2a02882018-08-07 12:10:5692 void InitializeAudioDevice(Call::Config* send_call_config,
henrika255750b2018-08-27 14:13:3793 Call::Config* recv_call_config,
94 bool use_real_adm);
Sebastian Jansson3bd2c792018-07-13 11:29:0395 void SetupAudio(Transport* transport);
ivica5d6a06c2015-09-17 12:30:2496
palmkviste75f2042016-09-28 13:19:4897 void StartEncodedFrameLogs(VideoReceiveStream* stream);
98
Christoffer Rodbrob4bb4eb2017-11-13 12:03:5299 virtual std::unique_ptr<test::LayerFilteringTransport> CreateSendTransport();
100 virtual std::unique_ptr<test::DirectTransport> CreateReceiveTransport();
101
Sebastian Janssonf1f363f2018-08-13 12:24:58102 std::vector<std::unique_ptr<test::TestVideoCapturer>> thumbnail_capturers_;
Sebastian Janssone6d7c3e2018-07-11 13:00:41103 Clock* const clock_;
ilnikcb8c1462017-03-09 17:23:30104
Niels Möllercbcbc222018-09-28 07:07:24105 test::FunctionVideoDecoderFactory video_decoder_factory_;
106 InternalDecoderFactory internal_decoder_factory_;
Sebastian Janssone6d7c3e2018-07-11 13:00:41107 test::FunctionVideoEncoderFactory video_encoder_factory_;
Niels Möller88be9722018-10-10 08:58:52108 test::FunctionVideoEncoderFactory video_encoder_factory_with_analyzer_;
Jiawei Ouc2ebe212018-11-08 18:02:56109 std::unique_ptr<VideoBitrateAllocatorFactory>
110 video_bitrate_allocator_factory_;
Sebastian Janssone6d7c3e2018-07-11 13:00:41111 InternalEncoderFactory internal_encoder_factory_;
ilnika014cc52017-03-07 12:21:04112 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
palmkviste75f2042016-09-28 13:19:48118 int receive_logs_;
119 int send_logs_;
120
sprangce4aef12015-11-02 15:23:20121 Params params_;
Artem Titove269cb42018-08-29 07:59:23122 std::unique_ptr<InjectionComponents> injection_components_;
Ilya Nikolaevskiya4259f62017-12-05 12:19:45123
Niels Möller88be9722018-10-10 08:58:52124 // Set non-null when running with analyzer.
125 std::unique_ptr<VideoAnalyzer> analyzer_;
126
Sebastian Jansson3bd2c792018-07-13 11:29:03127 // Note: not same as similarly named member in CallTest. This is the number of
128 // separate send streams, the one in CallTest is the number of substreams for
129 // a single send stream.
Ilya Nikolaevskiy255d1cd2017-12-21 17:02:59130 size_t num_video_streams_;
henrika255750b2018-08-27 14:13:37131
132#ifdef WEBRTC_WIN
133 // Windows Core Audio based ADM needs to run on a COM initialized thread.
134 // Only referenced in combination with --audio --use_real_adm flags.
135 std::unique_ptr<webrtc_win::ScopedCOMInitializer> com_initializer_;
136#endif
ivica5d6a06c2015-09-17 12:30:24137};
138
139} // namespace webrtc
140
Mirko Bonadei92ea95e2017-09-15 04:47:31141#endif // VIDEO_VIDEO_QUALITY_TEST_H_