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