blob: a283ea5477f0b515d7d5923d09b4af98bc8286d5 [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"
13#include <string>
14
15#include "api/test/mock_video_encoder_factory.h"
16#include "api/video_codecs/vp8_temporal_layers.h"
Florent Castellie7862cc2018-12-06 13:38:24 +010017#include "modules/video_coding/include/video_codec_interface.h"
18#include "test/gmock.h"
19#include "test/gtest.h"
20#include "test/video_codec_settings.h"
21
22namespace webrtc {
23namespace testing {
24
25using ::testing::_;
26using ::testing::NiceMock;
27using ::testing::Return;
28
29class MockEncoder : public VideoEncoder {
30 public:
31 // TODO(nisse): Valid overrides commented out, because the gmock
32 // methods don't use any override declarations, and we want to avoid
33 // warnings from -Winconsistent-missing-override. See
34 // http://crbug.com/428099.
35 MockEncoder() {}
36 virtual ~MockEncoder() {}
37
38 MOCK_METHOD3(InitEncode,
39 int32_t(const VideoCodec* codec_settings,
40 int32_t number_of_cores,
41 size_t max_payload_size));
42
43 MOCK_METHOD1(RegisterEncodeCompleteCallback, int32_t(EncodedImageCallback*));
44
45 MOCK_METHOD0(Release, int32_t());
46
Niels Möllerb859b322019-03-07 12:40:01 +010047 MOCK_METHOD2(
Florent Castellie7862cc2018-12-06 13:38:24 +010048 Encode,
49 int32_t(const VideoFrame& inputImage,
Niels Möller87e2d782019-03-07 10:18:23 +010050 const std::vector<VideoFrameType>* frame_types) /* override */);
Florent Castellie7862cc2018-12-06 13:38:24 +010051
52 MOCK_CONST_METHOD0(GetEncoderInfo, VideoEncoder::EncoderInfo(void));
53};
54
55TEST(EncoderSimulcastProxy, ChoosesCorrectImplementation) {
56 const std::string kImplementationName = "Fake";
57 const std::string kSimulcastAdaptedImplementationName =
58 "SimulcastEncoderAdapter (Fake, Fake, Fake)";
59 VideoCodec codec_settings;
60 webrtc::test::CodecSettings(kVideoCodecVP8, &codec_settings);
61 codec_settings.simulcastStream[0] = {test::kTestWidth,
62 test::kTestHeight,
63 test::kTestFrameRate,
64 2,
65 2000,
66 1000,
67 1000,
68 56};
69 codec_settings.simulcastStream[1] = {test::kTestWidth,
70 test::kTestHeight,
71 test::kTestFrameRate,
72 2,
73 3000,
74 1000,
75 1000,
76 56};
77 codec_settings.simulcastStream[2] = {test::kTestWidth,
78 test::kTestHeight,
79 test::kTestFrameRate,
80 2,
81 5000,
82 1000,
83 1000,
84 56};
85 codec_settings.numberOfSimulcastStreams = 3;
86
87 NiceMock<MockEncoder>* mock_encoder = new NiceMock<MockEncoder>();
88 NiceMock<MockVideoEncoderFactory> simulcast_factory;
89
90 EXPECT_CALL(*mock_encoder, InitEncode(_, _, _))
91 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
92 VideoEncoder::EncoderInfo encoder_info;
93 encoder_info.implementation_name = kImplementationName;
94 EXPECT_CALL(*mock_encoder, GetEncoderInfo())
95 .WillRepeatedly(Return(encoder_info));
96
97 EXPECT_CALL(simulcast_factory, CreateVideoEncoderProxy(_))
98 .Times(1)
99 .WillOnce(Return(mock_encoder));
100
101 EncoderSimulcastProxy simulcast_enabled_proxy(&simulcast_factory,
102 SdpVideoFormat("VP8"));
103 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
104 simulcast_enabled_proxy.InitEncode(&codec_settings, 4, 1200));
105 EXPECT_EQ(kImplementationName,
106 simulcast_enabled_proxy.GetEncoderInfo().implementation_name);
107
108 NiceMock<MockEncoder>* mock_encoder1 = new NiceMock<MockEncoder>();
109 NiceMock<MockEncoder>* mock_encoder2 = new NiceMock<MockEncoder>();
110 NiceMock<MockEncoder>* mock_encoder3 = new NiceMock<MockEncoder>();
111 NiceMock<MockEncoder>* mock_encoder4 = new NiceMock<MockEncoder>();
112 NiceMock<MockVideoEncoderFactory> nonsimulcast_factory;
113
114 EXPECT_CALL(*mock_encoder1, InitEncode(_, _, _))
115 .WillOnce(
116 Return(WEBRTC_VIDEO_CODEC_ERR_SIMULCAST_PARAMETERS_NOT_SUPPORTED));
117 EXPECT_CALL(*mock_encoder1, GetEncoderInfo())
118 .WillRepeatedly(Return(encoder_info));
119
120 EXPECT_CALL(*mock_encoder2, InitEncode(_, _, _))
121 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
122 EXPECT_CALL(*mock_encoder2, GetEncoderInfo())
123 .WillRepeatedly(Return(encoder_info));
124
125 EXPECT_CALL(*mock_encoder3, InitEncode(_, _, _))
126 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
127 EXPECT_CALL(*mock_encoder3, GetEncoderInfo())
128 .WillRepeatedly(Return(encoder_info));
129
130 EXPECT_CALL(*mock_encoder4, InitEncode(_, _, _))
131 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
132 EXPECT_CALL(*mock_encoder4, GetEncoderInfo())
133 .WillRepeatedly(Return(encoder_info));
134
135 EXPECT_CALL(nonsimulcast_factory, CreateVideoEncoderProxy(_))
136 .Times(4)
137 .WillOnce(Return(mock_encoder1))
138 .WillOnce(Return(mock_encoder2))
139 .WillOnce(Return(mock_encoder3))
140 .WillOnce(Return(mock_encoder4));
141
142 EncoderSimulcastProxy simulcast_disabled_proxy(&nonsimulcast_factory,
143 SdpVideoFormat("VP8"));
144 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
145 simulcast_disabled_proxy.InitEncode(&codec_settings, 4, 1200));
146 EXPECT_EQ(kSimulcastAdaptedImplementationName,
147 simulcast_disabled_proxy.GetEncoderInfo().implementation_name);
148
149 // Cleanup.
150 simulcast_enabled_proxy.Release();
151 simulcast_disabled_proxy.Release();
152}
153
154TEST(EncoderSimulcastProxy, ForwardsTrustedSetting) {
155 NiceMock<MockEncoder>* mock_encoder = new NiceMock<MockEncoder>();
156 NiceMock<MockVideoEncoderFactory> simulcast_factory;
157
158 EXPECT_CALL(*mock_encoder, InitEncode(_, _, _))
159 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
160
161 EXPECT_CALL(simulcast_factory, CreateVideoEncoderProxy(_))
162 .Times(1)
163 .WillOnce(Return(mock_encoder));
164
165 EncoderSimulcastProxy simulcast_enabled_proxy(&simulcast_factory,
166 SdpVideoFormat("VP8"));
167 VideoCodec codec_settings;
168 webrtc::test::CodecSettings(kVideoCodecVP8, &codec_settings);
169 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
170 simulcast_enabled_proxy.InitEncode(&codec_settings, 4, 1200));
171
172 VideoEncoder::EncoderInfo info;
173 info.has_trusted_rate_controller = true;
174 EXPECT_CALL(*mock_encoder, GetEncoderInfo()).WillRepeatedly(Return(info));
175
176 EXPECT_TRUE(
177 simulcast_enabled_proxy.GetEncoderInfo().has_trusted_rate_controller);
178}
179
180TEST(EncoderSimulcastProxy, ForwardsHardwareAccelerated) {
181 NiceMock<MockEncoder>* mock_encoder = new NiceMock<MockEncoder>();
182 NiceMock<MockVideoEncoderFactory> simulcast_factory;
183
184 EXPECT_CALL(*mock_encoder, InitEncode(_, _, _))
185 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
186
187 EXPECT_CALL(simulcast_factory, CreateVideoEncoderProxy(_))
188 .Times(1)
189 .WillOnce(Return(mock_encoder));
190
191 EncoderSimulcastProxy simulcast_enabled_proxy(&simulcast_factory,
192 SdpVideoFormat("VP8"));
193 VideoCodec codec_settings;
194 webrtc::test::CodecSettings(kVideoCodecVP8, &codec_settings);
195 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
196 simulcast_enabled_proxy.InitEncode(&codec_settings, 4, 1200));
197
198 VideoEncoder::EncoderInfo info;
199
200 info.is_hardware_accelerated = false;
201 EXPECT_CALL(*mock_encoder, GetEncoderInfo()).WillOnce(Return(info));
202 EXPECT_FALSE(
203 simulcast_enabled_proxy.GetEncoderInfo().is_hardware_accelerated);
204
205 info.is_hardware_accelerated = true;
206 EXPECT_CALL(*mock_encoder, GetEncoderInfo()).WillOnce(Return(info));
207 EXPECT_TRUE(simulcast_enabled_proxy.GetEncoderInfo().is_hardware_accelerated);
208}
209
210TEST(EncoderSimulcastProxy, ForwardsInternalSource) {
211 NiceMock<MockEncoder>* mock_encoder = new NiceMock<MockEncoder>();
212 NiceMock<MockVideoEncoderFactory> simulcast_factory;
213
214 EXPECT_CALL(*mock_encoder, InitEncode(_, _, _))
215 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
216
217 EXPECT_CALL(simulcast_factory, CreateVideoEncoderProxy(_))
218 .Times(1)
219 .WillOnce(Return(mock_encoder));
220
221 EncoderSimulcastProxy simulcast_enabled_proxy(&simulcast_factory,
222 SdpVideoFormat("VP8"));
223 VideoCodec codec_settings;
224 webrtc::test::CodecSettings(kVideoCodecVP8, &codec_settings);
225 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
226 simulcast_enabled_proxy.InitEncode(&codec_settings, 4, 1200));
227
228 VideoEncoder::EncoderInfo info;
229
230 info.has_internal_source = false;
231 EXPECT_CALL(*mock_encoder, GetEncoderInfo()).WillOnce(Return(info));
232 EXPECT_FALSE(simulcast_enabled_proxy.GetEncoderInfo().has_internal_source);
233
234 info.has_internal_source = true;
235 EXPECT_CALL(*mock_encoder, GetEncoderInfo()).WillOnce(Return(info));
236 EXPECT_TRUE(simulcast_enabled_proxy.GetEncoderInfo().has_internal_source);
237}
238
239} // namespace testing
240} // namespace webrtc