blob: 15fdaaf9af1844c5a958a333c1d5b50df20a5830 [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
47 MOCK_METHOD3(
48 Encode,
49 int32_t(const VideoFrame& inputImage,
50 const CodecSpecificInfo* codecSpecificInfo,
51 const std::vector<FrameType>* frame_types) /* override */);
52
53 MOCK_CONST_METHOD0(GetEncoderInfo, VideoEncoder::EncoderInfo(void));
54};
55
56TEST(EncoderSimulcastProxy, ChoosesCorrectImplementation) {
57 const std::string kImplementationName = "Fake";
58 const std::string kSimulcastAdaptedImplementationName =
59 "SimulcastEncoderAdapter (Fake, Fake, Fake)";
60 VideoCodec codec_settings;
61 webrtc::test::CodecSettings(kVideoCodecVP8, &codec_settings);
62 codec_settings.simulcastStream[0] = {test::kTestWidth,
63 test::kTestHeight,
64 test::kTestFrameRate,
65 2,
66 2000,
67 1000,
68 1000,
69 56};
70 codec_settings.simulcastStream[1] = {test::kTestWidth,
71 test::kTestHeight,
72 test::kTestFrameRate,
73 2,
74 3000,
75 1000,
76 1000,
77 56};
78 codec_settings.simulcastStream[2] = {test::kTestWidth,
79 test::kTestHeight,
80 test::kTestFrameRate,
81 2,
82 5000,
83 1000,
84 1000,
85 56};
86 codec_settings.numberOfSimulcastStreams = 3;
87
88 NiceMock<MockEncoder>* mock_encoder = new NiceMock<MockEncoder>();
89 NiceMock<MockVideoEncoderFactory> simulcast_factory;
90
91 EXPECT_CALL(*mock_encoder, InitEncode(_, _, _))
92 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
93 VideoEncoder::EncoderInfo encoder_info;
94 encoder_info.implementation_name = kImplementationName;
95 EXPECT_CALL(*mock_encoder, GetEncoderInfo())
96 .WillRepeatedly(Return(encoder_info));
97
98 EXPECT_CALL(simulcast_factory, CreateVideoEncoderProxy(_))
99 .Times(1)
100 .WillOnce(Return(mock_encoder));
101
102 EncoderSimulcastProxy simulcast_enabled_proxy(&simulcast_factory,
103 SdpVideoFormat("VP8"));
104 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
105 simulcast_enabled_proxy.InitEncode(&codec_settings, 4, 1200));
106 EXPECT_EQ(kImplementationName,
107 simulcast_enabled_proxy.GetEncoderInfo().implementation_name);
108
109 NiceMock<MockEncoder>* mock_encoder1 = new NiceMock<MockEncoder>();
110 NiceMock<MockEncoder>* mock_encoder2 = new NiceMock<MockEncoder>();
111 NiceMock<MockEncoder>* mock_encoder3 = new NiceMock<MockEncoder>();
112 NiceMock<MockEncoder>* mock_encoder4 = new NiceMock<MockEncoder>();
113 NiceMock<MockVideoEncoderFactory> nonsimulcast_factory;
114
115 EXPECT_CALL(*mock_encoder1, InitEncode(_, _, _))
116 .WillOnce(
117 Return(WEBRTC_VIDEO_CODEC_ERR_SIMULCAST_PARAMETERS_NOT_SUPPORTED));
118 EXPECT_CALL(*mock_encoder1, GetEncoderInfo())
119 .WillRepeatedly(Return(encoder_info));
120
121 EXPECT_CALL(*mock_encoder2, InitEncode(_, _, _))
122 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
123 EXPECT_CALL(*mock_encoder2, GetEncoderInfo())
124 .WillRepeatedly(Return(encoder_info));
125
126 EXPECT_CALL(*mock_encoder3, InitEncode(_, _, _))
127 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
128 EXPECT_CALL(*mock_encoder3, GetEncoderInfo())
129 .WillRepeatedly(Return(encoder_info));
130
131 EXPECT_CALL(*mock_encoder4, InitEncode(_, _, _))
132 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
133 EXPECT_CALL(*mock_encoder4, GetEncoderInfo())
134 .WillRepeatedly(Return(encoder_info));
135
136 EXPECT_CALL(nonsimulcast_factory, CreateVideoEncoderProxy(_))
137 .Times(4)
138 .WillOnce(Return(mock_encoder1))
139 .WillOnce(Return(mock_encoder2))
140 .WillOnce(Return(mock_encoder3))
141 .WillOnce(Return(mock_encoder4));
142
143 EncoderSimulcastProxy simulcast_disabled_proxy(&nonsimulcast_factory,
144 SdpVideoFormat("VP8"));
145 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
146 simulcast_disabled_proxy.InitEncode(&codec_settings, 4, 1200));
147 EXPECT_EQ(kSimulcastAdaptedImplementationName,
148 simulcast_disabled_proxy.GetEncoderInfo().implementation_name);
149
150 // Cleanup.
151 simulcast_enabled_proxy.Release();
152 simulcast_disabled_proxy.Release();
153}
154
155TEST(EncoderSimulcastProxy, ForwardsTrustedSetting) {
156 NiceMock<MockEncoder>* mock_encoder = new NiceMock<MockEncoder>();
157 NiceMock<MockVideoEncoderFactory> simulcast_factory;
158
159 EXPECT_CALL(*mock_encoder, InitEncode(_, _, _))
160 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
161
162 EXPECT_CALL(simulcast_factory, CreateVideoEncoderProxy(_))
163 .Times(1)
164 .WillOnce(Return(mock_encoder));
165
166 EncoderSimulcastProxy simulcast_enabled_proxy(&simulcast_factory,
167 SdpVideoFormat("VP8"));
168 VideoCodec codec_settings;
169 webrtc::test::CodecSettings(kVideoCodecVP8, &codec_settings);
170 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
171 simulcast_enabled_proxy.InitEncode(&codec_settings, 4, 1200));
172
173 VideoEncoder::EncoderInfo info;
174 info.has_trusted_rate_controller = true;
175 EXPECT_CALL(*mock_encoder, GetEncoderInfo()).WillRepeatedly(Return(info));
176
177 EXPECT_TRUE(
178 simulcast_enabled_proxy.GetEncoderInfo().has_trusted_rate_controller);
179}
180
181TEST(EncoderSimulcastProxy, ForwardsHardwareAccelerated) {
182 NiceMock<MockEncoder>* mock_encoder = new NiceMock<MockEncoder>();
183 NiceMock<MockVideoEncoderFactory> simulcast_factory;
184
185 EXPECT_CALL(*mock_encoder, InitEncode(_, _, _))
186 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
187
188 EXPECT_CALL(simulcast_factory, CreateVideoEncoderProxy(_))
189 .Times(1)
190 .WillOnce(Return(mock_encoder));
191
192 EncoderSimulcastProxy simulcast_enabled_proxy(&simulcast_factory,
193 SdpVideoFormat("VP8"));
194 VideoCodec codec_settings;
195 webrtc::test::CodecSettings(kVideoCodecVP8, &codec_settings);
196 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
197 simulcast_enabled_proxy.InitEncode(&codec_settings, 4, 1200));
198
199 VideoEncoder::EncoderInfo info;
200
201 info.is_hardware_accelerated = false;
202 EXPECT_CALL(*mock_encoder, GetEncoderInfo()).WillOnce(Return(info));
203 EXPECT_FALSE(
204 simulcast_enabled_proxy.GetEncoderInfo().is_hardware_accelerated);
205
206 info.is_hardware_accelerated = true;
207 EXPECT_CALL(*mock_encoder, GetEncoderInfo()).WillOnce(Return(info));
208 EXPECT_TRUE(simulcast_enabled_proxy.GetEncoderInfo().is_hardware_accelerated);
209}
210
211TEST(EncoderSimulcastProxy, ForwardsInternalSource) {
212 NiceMock<MockEncoder>* mock_encoder = new NiceMock<MockEncoder>();
213 NiceMock<MockVideoEncoderFactory> simulcast_factory;
214
215 EXPECT_CALL(*mock_encoder, InitEncode(_, _, _))
216 .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
217
218 EXPECT_CALL(simulcast_factory, CreateVideoEncoderProxy(_))
219 .Times(1)
220 .WillOnce(Return(mock_encoder));
221
222 EncoderSimulcastProxy simulcast_enabled_proxy(&simulcast_factory,
223 SdpVideoFormat("VP8"));
224 VideoCodec codec_settings;
225 webrtc::test::CodecSettings(kVideoCodecVP8, &codec_settings);
226 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
227 simulcast_enabled_proxy.InitEncode(&codec_settings, 4, 1200));
228
229 VideoEncoder::EncoderInfo info;
230
231 info.has_internal_source = false;
232 EXPECT_CALL(*mock_encoder, GetEncoderInfo()).WillOnce(Return(info));
233 EXPECT_FALSE(simulcast_enabled_proxy.GetEncoderInfo().has_internal_source);
234
235 info.has_internal_source = true;
236 EXPECT_CALL(*mock_encoder, GetEncoderInfo()).WillOnce(Return(info));
237 EXPECT_TRUE(simulcast_enabled_proxy.GetEncoderInfo().has_internal_source);
238}
239
240} // namespace testing
241} // namespace webrtc