blob: 591e7523de69f44cdab52361bbb2fe07a8327bc9 [file] [log] [blame]
Florent Castellie7862cc2018-12-06 13:38:24 +01001/*
2 * Copyright (c) 2017 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 */
11
12#include "media/engine/encoder_simulcast_proxy.h"
Jonas Olssona4d87372019-07-05 19:08:33 +020013
Florent Castellie7862cc2018-12-06 13:38:24 +010014#include <string>
15
Erik Språng9e79e6b2019-04-25 16:01:03 +020016#include "api/test/mock_video_encoder.h"
Florent Castellie7862cc2018-12-06 13:38:24 +010017#include "api/test/mock_video_encoder_factory.h"
Elad Alon370f93a2019-06-11 14:57:57 +020018#include "api/video_codecs/video_encoder.h"
Florent Castellie7862cc2018-12-06 13:38:24 +010019#include "api/video_codecs/vp8_temporal_layers.h"
Florent Castellie7862cc2018-12-06 13:38:24 +010020#include "modules/video_coding/include/video_codec_interface.h"
21#include "test/gmock.h"
22#include "test/gtest.h"
23#include "test/video_codec_settings.h"
24
25namespace webrtc {
26namespace testing {
Elad Alon370f93a2019-06-11 14:57:57 +020027namespace {
28const VideoEncoder::Capabilities kCapabilities(false);
29const VideoEncoder::Settings kSettings(kCapabilities, 4, 1200);
30} // namespace
Florent Castellie7862cc2018-12-06 13:38:24 +010031
32using ::testing::_;
33using ::testing::NiceMock;
34using ::testing::Return;
35
Florent Castellie7862cc2018-12-06 13:38:24 +010036TEST(EncoderSimulcastProxy, ChoosesCorrectImplementation) {
37 const std::string kImplementationName = "Fake";
38 const std::string kSimulcastAdaptedImplementationName =
39 "SimulcastEncoderAdapter (Fake, Fake, Fake)";
40 VideoCodec codec_settings;
41 webrtc::test::CodecSettings(kVideoCodecVP8, &codec_settings);
42 codec_settings.simulcastStream[0] = {test::kTestWidth,
43 test::kTestHeight,
44 test::kTestFrameRate,
45 2,
46 2000,
47 1000,
48 1000,
49 56};
50 codec_settings.simulcastStream[1] = {test::kTestWidth,
51 test::kTestHeight,
52 test::kTestFrameRate,
53 2,
54 3000,
55 1000,
56 1000,
57 56};
58 codec_settings.simulcastStream[2] = {test::kTestWidth,
59 test::kTestHeight,
60 test::kTestFrameRate,
61 2,
62 5000,
63 1000,
64 1000,
65 56};
66 codec_settings.numberOfSimulcastStreams = 3;
67
Erik Språng9e79e6b2019-04-25 16:01:03 +020068 NiceMock<MockVideoEncoder>* mock_encoder = new NiceMock<MockVideoEncoder>();
Florent Castellie7862cc2018-12-06 13:38:24 +010069 NiceMock<MockVideoEncoderFactory> simulcast_factory;
70
Elad Alon370f93a2019-06-11 14:57:57 +020071 EXPECT_CALL(*mock_encoder, InitEncode(_, _))
Florent Castellie7862cc2018-12-06 13:38:24 +010072 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
73 VideoEncoder::EncoderInfo encoder_info;
74 encoder_info.implementation_name = kImplementationName;
75 EXPECT_CALL(*mock_encoder, GetEncoderInfo())
76 .WillRepeatedly(Return(encoder_info));
77
78 EXPECT_CALL(simulcast_factory, CreateVideoEncoderProxy(_))
79 .Times(1)
80 .WillOnce(Return(mock_encoder));
81
82 EncoderSimulcastProxy simulcast_enabled_proxy(&simulcast_factory,
83 SdpVideoFormat("VP8"));
84 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
Elad Alon370f93a2019-06-11 14:57:57 +020085 simulcast_enabled_proxy.InitEncode(&codec_settings, kSettings));
Florent Castellie7862cc2018-12-06 13:38:24 +010086 EXPECT_EQ(kImplementationName,
87 simulcast_enabled_proxy.GetEncoderInfo().implementation_name);
88
Erik Språng9e79e6b2019-04-25 16:01:03 +020089 NiceMock<MockVideoEncoder>* mock_encoder1 = new NiceMock<MockVideoEncoder>();
90 NiceMock<MockVideoEncoder>* mock_encoder2 = new NiceMock<MockVideoEncoder>();
91 NiceMock<MockVideoEncoder>* mock_encoder3 = new NiceMock<MockVideoEncoder>();
92 NiceMock<MockVideoEncoder>* mock_encoder4 = new NiceMock<MockVideoEncoder>();
Florent Castellie7862cc2018-12-06 13:38:24 +010093 NiceMock<MockVideoEncoderFactory> nonsimulcast_factory;
94
Elad Alon370f93a2019-06-11 14:57:57 +020095 EXPECT_CALL(*mock_encoder1, InitEncode(_, _))
Florent Castellie7862cc2018-12-06 13:38:24 +010096 .WillOnce(
97 Return(WEBRTC_VIDEO_CODEC_ERR_SIMULCAST_PARAMETERS_NOT_SUPPORTED));
98 EXPECT_CALL(*mock_encoder1, GetEncoderInfo())
99 .WillRepeatedly(Return(encoder_info));
100
Elad Alon370f93a2019-06-11 14:57:57 +0200101 EXPECT_CALL(*mock_encoder2, InitEncode(_, _))
Florent Castellie7862cc2018-12-06 13:38:24 +0100102 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
103 EXPECT_CALL(*mock_encoder2, GetEncoderInfo())
104 .WillRepeatedly(Return(encoder_info));
105
Elad Alon370f93a2019-06-11 14:57:57 +0200106 EXPECT_CALL(*mock_encoder3, InitEncode(_, _))
Florent Castellie7862cc2018-12-06 13:38:24 +0100107 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
108 EXPECT_CALL(*mock_encoder3, GetEncoderInfo())
109 .WillRepeatedly(Return(encoder_info));
110
Elad Alon370f93a2019-06-11 14:57:57 +0200111 EXPECT_CALL(*mock_encoder4, InitEncode(_, _))
Florent Castellie7862cc2018-12-06 13:38:24 +0100112 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
113 EXPECT_CALL(*mock_encoder4, GetEncoderInfo())
114 .WillRepeatedly(Return(encoder_info));
115
116 EXPECT_CALL(nonsimulcast_factory, CreateVideoEncoderProxy(_))
117 .Times(4)
118 .WillOnce(Return(mock_encoder1))
119 .WillOnce(Return(mock_encoder2))
120 .WillOnce(Return(mock_encoder3))
121 .WillOnce(Return(mock_encoder4));
122
123 EncoderSimulcastProxy simulcast_disabled_proxy(&nonsimulcast_factory,
124 SdpVideoFormat("VP8"));
125 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
Elad Alon370f93a2019-06-11 14:57:57 +0200126 simulcast_disabled_proxy.InitEncode(&codec_settings, kSettings));
Florent Castellie7862cc2018-12-06 13:38:24 +0100127 EXPECT_EQ(kSimulcastAdaptedImplementationName,
128 simulcast_disabled_proxy.GetEncoderInfo().implementation_name);
129
130 // Cleanup.
131 simulcast_enabled_proxy.Release();
132 simulcast_disabled_proxy.Release();
133}
134
135TEST(EncoderSimulcastProxy, ForwardsTrustedSetting) {
Erik Språng9e79e6b2019-04-25 16:01:03 +0200136 NiceMock<MockVideoEncoder>* mock_encoder = new NiceMock<MockVideoEncoder>();
Florent Castellie7862cc2018-12-06 13:38:24 +0100137 NiceMock<MockVideoEncoderFactory> simulcast_factory;
138
Elad Alon370f93a2019-06-11 14:57:57 +0200139 EXPECT_CALL(*mock_encoder, InitEncode(_, _))
Florent Castellie7862cc2018-12-06 13:38:24 +0100140 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
141
142 EXPECT_CALL(simulcast_factory, CreateVideoEncoderProxy(_))
143 .Times(1)
144 .WillOnce(Return(mock_encoder));
145
146 EncoderSimulcastProxy simulcast_enabled_proxy(&simulcast_factory,
147 SdpVideoFormat("VP8"));
148 VideoCodec codec_settings;
149 webrtc::test::CodecSettings(kVideoCodecVP8, &codec_settings);
150 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
Elad Alon370f93a2019-06-11 14:57:57 +0200151 simulcast_enabled_proxy.InitEncode(&codec_settings, kSettings));
Florent Castellie7862cc2018-12-06 13:38:24 +0100152
153 VideoEncoder::EncoderInfo info;
154 info.has_trusted_rate_controller = true;
155 EXPECT_CALL(*mock_encoder, GetEncoderInfo()).WillRepeatedly(Return(info));
156
157 EXPECT_TRUE(
158 simulcast_enabled_proxy.GetEncoderInfo().has_trusted_rate_controller);
159}
160
161TEST(EncoderSimulcastProxy, ForwardsHardwareAccelerated) {
Erik Språng9e79e6b2019-04-25 16:01:03 +0200162 NiceMock<MockVideoEncoder>* mock_encoder = new NiceMock<MockVideoEncoder>();
Florent Castellie7862cc2018-12-06 13:38:24 +0100163 NiceMock<MockVideoEncoderFactory> simulcast_factory;
164
Elad Alon370f93a2019-06-11 14:57:57 +0200165 EXPECT_CALL(*mock_encoder, InitEncode(_, _))
Florent Castellie7862cc2018-12-06 13:38:24 +0100166 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
167
168 EXPECT_CALL(simulcast_factory, CreateVideoEncoderProxy(_))
169 .Times(1)
170 .WillOnce(Return(mock_encoder));
171
172 EncoderSimulcastProxy simulcast_enabled_proxy(&simulcast_factory,
173 SdpVideoFormat("VP8"));
174 VideoCodec codec_settings;
175 webrtc::test::CodecSettings(kVideoCodecVP8, &codec_settings);
176 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
Elad Alon370f93a2019-06-11 14:57:57 +0200177 simulcast_enabled_proxy.InitEncode(&codec_settings, kSettings));
Florent Castellie7862cc2018-12-06 13:38:24 +0100178
179 VideoEncoder::EncoderInfo info;
180
181 info.is_hardware_accelerated = false;
182 EXPECT_CALL(*mock_encoder, GetEncoderInfo()).WillOnce(Return(info));
183 EXPECT_FALSE(
184 simulcast_enabled_proxy.GetEncoderInfo().is_hardware_accelerated);
185
186 info.is_hardware_accelerated = true;
187 EXPECT_CALL(*mock_encoder, GetEncoderInfo()).WillOnce(Return(info));
188 EXPECT_TRUE(simulcast_enabled_proxy.GetEncoderInfo().is_hardware_accelerated);
189}
190
191TEST(EncoderSimulcastProxy, ForwardsInternalSource) {
Erik Språng9e79e6b2019-04-25 16:01:03 +0200192 NiceMock<MockVideoEncoder>* mock_encoder = new NiceMock<MockVideoEncoder>();
Florent Castellie7862cc2018-12-06 13:38:24 +0100193 NiceMock<MockVideoEncoderFactory> simulcast_factory;
194
Elad Alon370f93a2019-06-11 14:57:57 +0200195 EXPECT_CALL(*mock_encoder, InitEncode(_, _))
Florent Castellie7862cc2018-12-06 13:38:24 +0100196 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
197
198 EXPECT_CALL(simulcast_factory, CreateVideoEncoderProxy(_))
199 .Times(1)
200 .WillOnce(Return(mock_encoder));
201
202 EncoderSimulcastProxy simulcast_enabled_proxy(&simulcast_factory,
203 SdpVideoFormat("VP8"));
204 VideoCodec codec_settings;
205 webrtc::test::CodecSettings(kVideoCodecVP8, &codec_settings);
206 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
Elad Alon370f93a2019-06-11 14:57:57 +0200207 simulcast_enabled_proxy.InitEncode(&codec_settings, kSettings));
Florent Castellie7862cc2018-12-06 13:38:24 +0100208
209 VideoEncoder::EncoderInfo info;
210
211 info.has_internal_source = false;
212 EXPECT_CALL(*mock_encoder, GetEncoderInfo()).WillOnce(Return(info));
213 EXPECT_FALSE(simulcast_enabled_proxy.GetEncoderInfo().has_internal_source);
214
215 info.has_internal_source = true;
216 EXPECT_CALL(*mock_encoder, GetEncoderInfo()).WillOnce(Return(info));
217 EXPECT_TRUE(simulcast_enabled_proxy.GetEncoderInfo().has_internal_source);
218}
219
220} // namespace testing
221} // namespace webrtc