blob: 935de5f3e94c4b14e5ae7d88db4b8eb9888f5736 [file] [log] [blame]
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +00001/*
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 */
10
kwiberg27f982b2016-03-01 11:52:33 -080011#include <memory>
12
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010013#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000014#include "webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h"
kjellander02b3d272016-04-20 05:05:54 -070015#include "webrtc/modules/video_coding/include/video_codec_interface.h"
kwibergac9f8762016-09-30 22:29:43 -070016#include "webrtc/test/gmock.h"
17#include "webrtc/test/gtest.h"
Peter Boström7623ce42015-12-09 12:13:30 +010018#include "webrtc/video/payload_router.h"
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000019
20using ::testing::_;
21using ::testing::AnyNumber;
22using ::testing::NiceMock;
23using ::testing::Return;
24
25namespace webrtc {
26
Per83d09102016-04-15 14:59:13 +020027TEST(PayloadRouterTest, SendOnOneModule) {
perkjbc75d972016-05-02 06:31:25 -070028 NiceMock<MockRtpRtcp> rtp;
Peter Boström404686a2016-02-11 23:37:26 +010029 std::vector<RtpRtcp*> modules(1, &rtp);
perkjbc75d972016-05-02 06:31:25 -070030 std::vector<VideoStream> streams(1);
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000031
kjellander02b3d272016-04-20 05:05:54 -070032 uint8_t payload = 'a';
33 int8_t payload_type = 96;
34 EncodedImage encoded_image;
35 encoded_image._timeStamp = 1;
36 encoded_image.capture_time_ms_ = 2;
37 encoded_image._frameType = kVideoFrameKey;
38 encoded_image._buffer = &payload;
39 encoded_image._length = 1;
40
41 PayloadRouter payload_router(modules, payload_type);
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000042
kjellander02b3d272016-04-20 05:05:54 -070043 EXPECT_CALL(rtp, SendOutgoingData(encoded_image._frameType, payload_type,
44 encoded_image._timeStamp,
45 encoded_image.capture_time_ms_, &payload,
Sergey Ulanov525df3f2016-08-02 17:46:41 -070046 encoded_image._length, nullptr, _, _))
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000047 .Times(0);
sergeyu2cb155a2016-11-04 11:39:29 -070048 EXPECT_NE(
49 EncodedImageCallback::Result::OK,
50 payload_router.OnEncodedImage(encoded_image, nullptr, nullptr).error);
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000051
sprang1a646ee2016-12-01 06:34:11 -080052 payload_router.SetActive(true);
kjellander02b3d272016-04-20 05:05:54 -070053 EXPECT_CALL(rtp, SendOutgoingData(encoded_image._frameType, payload_type,
54 encoded_image._timeStamp,
55 encoded_image.capture_time_ms_, &payload,
Sergey Ulanov525df3f2016-08-02 17:46:41 -070056 encoded_image._length, nullptr, _, _))
sergeyu7b9feee2016-11-17 16:16:14 -080057 .Times(1)
58 .WillOnce(Return(true));
sergeyu2cb155a2016-11-04 11:39:29 -070059 EXPECT_EQ(
60 EncodedImageCallback::Result::OK,
61 payload_router.OnEncodedImage(encoded_image, nullptr, nullptr).error);
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000062
sprang1a646ee2016-12-01 06:34:11 -080063 payload_router.SetActive(false);
kjellander02b3d272016-04-20 05:05:54 -070064 EXPECT_CALL(rtp, SendOutgoingData(encoded_image._frameType, payload_type,
65 encoded_image._timeStamp,
66 encoded_image.capture_time_ms_, &payload,
Sergey Ulanov525df3f2016-08-02 17:46:41 -070067 encoded_image._length, nullptr, _, _))
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000068 .Times(0);
sergeyu2cb155a2016-11-04 11:39:29 -070069 EXPECT_NE(
70 EncodedImageCallback::Result::OK,
71 payload_router.OnEncodedImage(encoded_image, nullptr, nullptr).error);
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000072
sprang1a646ee2016-12-01 06:34:11 -080073 payload_router.SetActive(true);
kjellander02b3d272016-04-20 05:05:54 -070074 EXPECT_CALL(rtp, SendOutgoingData(encoded_image._frameType, payload_type,
75 encoded_image._timeStamp,
76 encoded_image.capture_time_ms_, &payload,
Sergey Ulanov525df3f2016-08-02 17:46:41 -070077 encoded_image._length, nullptr, _, _))
sergeyu7b9feee2016-11-17 16:16:14 -080078 .Times(1)
79 .WillOnce(Return(true));
sergeyu2cb155a2016-11-04 11:39:29 -070080 EXPECT_EQ(
81 EncodedImageCallback::Result::OK,
82 payload_router.OnEncodedImage(encoded_image, nullptr, nullptr).error);
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000083}
84
Per83d09102016-04-15 14:59:13 +020085TEST(PayloadRouterTest, SendSimulcast) {
perkjbc75d972016-05-02 06:31:25 -070086 NiceMock<MockRtpRtcp> rtp_1;
87 NiceMock<MockRtpRtcp> rtp_2;
Peter Boström404686a2016-02-11 23:37:26 +010088 std::vector<RtpRtcp*> modules;
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000089 modules.push_back(&rtp_1);
90 modules.push_back(&rtp_2);
perkjbc75d972016-05-02 06:31:25 -070091 std::vector<VideoStream> streams(2);
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000092
kjellander02b3d272016-04-20 05:05:54 -070093 int8_t payload_type = 96;
94 uint8_t payload = 'a';
95 EncodedImage encoded_image;
96 encoded_image._timeStamp = 1;
97 encoded_image.capture_time_ms_ = 2;
98 encoded_image._frameType = kVideoFrameKey;
99 encoded_image._buffer = &payload;
100 encoded_image._length = 1;
101
102 PayloadRouter payload_router(modules, payload_type);
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000103
kjellander02b3d272016-04-20 05:05:54 -0700104 CodecSpecificInfo codec_info_1;
105 memset(&codec_info_1, 0, sizeof(CodecSpecificInfo));
106 codec_info_1.codecType = kVideoCodecVP8;
107 codec_info_1.codecSpecific.VP8.simulcastIdx = 0;
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000108
sprang1a646ee2016-12-01 06:34:11 -0800109 payload_router.SetActive(true);
kjellander02b3d272016-04-20 05:05:54 -0700110 EXPECT_CALL(rtp_1, SendOutgoingData(encoded_image._frameType, payload_type,
111 encoded_image._timeStamp,
112 encoded_image.capture_time_ms_, &payload,
Sergey Ulanov525df3f2016-08-02 17:46:41 -0700113 encoded_image._length, nullptr, _, _))
sergeyu7b9feee2016-11-17 16:16:14 -0800114 .Times(1)
115 .WillOnce(Return(true));
Sergey Ulanov525df3f2016-08-02 17:46:41 -0700116 EXPECT_CALL(rtp_2, SendOutgoingData(_, _, _, _, _, _, _, _, _)).Times(0);
sergeyu2cb155a2016-11-04 11:39:29 -0700117 EXPECT_EQ(EncodedImageCallback::Result::OK,
118 payload_router.OnEncodedImage(encoded_image, &codec_info_1, nullptr)
119 .error);
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000120
kjellander02b3d272016-04-20 05:05:54 -0700121 CodecSpecificInfo codec_info_2;
122 memset(&codec_info_2, 0, sizeof(CodecSpecificInfo));
123 codec_info_2.codecType = kVideoCodecVP8;
124 codec_info_2.codecSpecific.VP8.simulcastIdx = 1;
125
126 EXPECT_CALL(rtp_2, SendOutgoingData(encoded_image._frameType, payload_type,
127 encoded_image._timeStamp,
128 encoded_image.capture_time_ms_, &payload,
Sergey Ulanov525df3f2016-08-02 17:46:41 -0700129 encoded_image._length, nullptr, _, _))
sergeyu7b9feee2016-11-17 16:16:14 -0800130 .Times(1)
131 .WillOnce(Return(true));
Sergey Ulanov525df3f2016-08-02 17:46:41 -0700132 EXPECT_CALL(rtp_1, SendOutgoingData(_, _, _, _, _, _, _, _, _))
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000133 .Times(0);
sergeyu2cb155a2016-11-04 11:39:29 -0700134 EXPECT_EQ(EncodedImageCallback::Result::OK,
135 payload_router.OnEncodedImage(encoded_image, &codec_info_2, nullptr)
136 .error);
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000137
mflodman@webrtc.org50e28162015-02-23 07:45:11 +0000138 // Inactive.
sprang1a646ee2016-12-01 06:34:11 -0800139 payload_router.SetActive(false);
Sergey Ulanov525df3f2016-08-02 17:46:41 -0700140 EXPECT_CALL(rtp_1, SendOutgoingData(_, _, _, _, _, _, _, _, _))
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000141 .Times(0);
Sergey Ulanov525df3f2016-08-02 17:46:41 -0700142 EXPECT_CALL(rtp_2, SendOutgoingData(_, _, _, _, _, _, _, _, _))
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000143 .Times(0);
sergeyu2cb155a2016-11-04 11:39:29 -0700144 EXPECT_NE(EncodedImageCallback::Result::OK,
145 payload_router.OnEncodedImage(encoded_image, &codec_info_1, nullptr)
146 .error);
147 EXPECT_NE(EncodedImageCallback::Result::OK,
148 payload_router.OnEncodedImage(encoded_image, &codec_info_2, nullptr)
149 .error);
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000150}
151
Per83d09102016-04-15 14:59:13 +0200152TEST(PayloadRouterTest, MaxPayloadLength) {
mflodman@webrtc.orga4ef2ce2015-02-12 09:54:18 +0000153 // Without any limitations from the modules, verify we get the max payload
154 // length for IP/UDP/SRTP with a MTU of 150 bytes.
155 const size_t kDefaultMaxLength = 1500 - 20 - 8 - 12 - 4;
perkjbc75d972016-05-02 06:31:25 -0700156 NiceMock<MockRtpRtcp> rtp_1;
157 NiceMock<MockRtpRtcp> rtp_2;
Peter Boström404686a2016-02-11 23:37:26 +0100158 std::vector<RtpRtcp*> modules;
mflodman@webrtc.orga4ef2ce2015-02-12 09:54:18 +0000159 modules.push_back(&rtp_1);
160 modules.push_back(&rtp_2);
kjellander02b3d272016-04-20 05:05:54 -0700161 PayloadRouter payload_router(modules, 42);
Per83d09102016-04-15 14:59:13 +0200162
163 EXPECT_EQ(kDefaultMaxLength, PayloadRouter::DefaultMaxPayloadLength());
perkjbc75d972016-05-02 06:31:25 -0700164 std::vector<VideoStream> streams(2);
mflodman@webrtc.orga4ef2ce2015-02-12 09:54:18 +0000165
166 // Modules return a higher length than the default value.
167 EXPECT_CALL(rtp_1, MaxDataPayloadLength())
168 .Times(1)
169 .WillOnce(Return(kDefaultMaxLength + 10));
170 EXPECT_CALL(rtp_2, MaxDataPayloadLength())
171 .Times(1)
172 .WillOnce(Return(kDefaultMaxLength + 10));
Per83d09102016-04-15 14:59:13 +0200173 EXPECT_EQ(kDefaultMaxLength, payload_router.MaxPayloadLength());
mflodman@webrtc.orga4ef2ce2015-02-12 09:54:18 +0000174
175 // The modules return a value lower than default.
176 const size_t kTestMinPayloadLength = 1001;
177 EXPECT_CALL(rtp_1, MaxDataPayloadLength())
178 .Times(1)
179 .WillOnce(Return(kTestMinPayloadLength + 10));
180 EXPECT_CALL(rtp_2, MaxDataPayloadLength())
181 .Times(1)
182 .WillOnce(Return(kTestMinPayloadLength));
Per83d09102016-04-15 14:59:13 +0200183 EXPECT_EQ(kTestMinPayloadLength, payload_router.MaxPayloadLength());
mflodman@webrtc.orga4ef2ce2015-02-12 09:54:18 +0000184}
sprang1a646ee2016-12-01 06:34:11 -0800185
186TEST(PayloadRouterTest, SimulcastTargetBitrate) {
187 NiceMock<MockRtpRtcp> rtp_1;
188 NiceMock<MockRtpRtcp> rtp_2;
189 std::vector<RtpRtcp*> modules;
190 modules.push_back(&rtp_1);
191 modules.push_back(&rtp_2);
192 PayloadRouter payload_router(modules, 42);
193 payload_router.SetActive(true);
194
195 BitrateAllocation bitrate;
196 bitrate.SetBitrate(0, 0, 10000);
197 bitrate.SetBitrate(0, 1, 20000);
198 bitrate.SetBitrate(1, 0, 40000);
199 bitrate.SetBitrate(1, 1, 80000);
200
201 BitrateAllocation layer0_bitrate;
202 layer0_bitrate.SetBitrate(0, 0, 10000);
203 layer0_bitrate.SetBitrate(0, 1, 20000);
204
205 BitrateAllocation layer1_bitrate;
206 layer1_bitrate.SetBitrate(0, 0, 40000);
207 layer1_bitrate.SetBitrate(0, 1, 80000);
208
209 EXPECT_CALL(rtp_1, SetVideoBitrateAllocation(layer0_bitrate)).Times(1);
210 EXPECT_CALL(rtp_2, SetVideoBitrateAllocation(layer1_bitrate)).Times(1);
211
212 payload_router.OnBitrateAllocationUpdated(bitrate);
213}
214
215TEST(PayloadRouterTest, SvcTargetBitrate) {
216 NiceMock<MockRtpRtcp> rtp_1;
217 std::vector<RtpRtcp*> modules;
218 modules.push_back(&rtp_1);
219 PayloadRouter payload_router(modules, 42);
220 payload_router.SetActive(true);
221
222 BitrateAllocation bitrate;
223 bitrate.SetBitrate(0, 0, 10000);
224 bitrate.SetBitrate(0, 1, 20000);
225 bitrate.SetBitrate(1, 0, 40000);
226 bitrate.SetBitrate(1, 1, 80000);
227
228 EXPECT_CALL(rtp_1, SetVideoBitrateAllocation(bitrate)).Times(1);
229
230 payload_router.OnBitrateAllocationUpdated(bitrate);
231}
232
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000233} // namespace webrtc