blob: 5f56a20700fb97128586faaf028abac52f79a164 [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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020013#include "call/video_config.h"
14#include "modules/rtp_rtcp/include/rtp_rtcp.h"
15#include "modules/rtp_rtcp/mocks/mock_rtp_rtcp.h"
16#include "modules/video_coding/include/video_codec_interface.h"
17#include "test/gmock.h"
18#include "test/gtest.h"
19#include "video/payload_router.h"
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000020
21using ::testing::_;
22using ::testing::AnyNumber;
23using ::testing::NiceMock;
24using ::testing::Return;
25
26namespace webrtc {
27
Per83d09102016-04-15 14:59:13 +020028TEST(PayloadRouterTest, SendOnOneModule) {
perkjbc75d972016-05-02 06:31:25 -070029 NiceMock<MockRtpRtcp> rtp;
Peter Boström404686a2016-02-11 23:37:26 +010030 std::vector<RtpRtcp*> modules(1, &rtp);
perkjbc75d972016-05-02 06:31:25 -070031 std::vector<VideoStream> streams(1);
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000032
kjellander02b3d272016-04-20 05:05:54 -070033 uint8_t payload = 'a';
34 int8_t payload_type = 96;
35 EncodedImage encoded_image;
36 encoded_image._timeStamp = 1;
37 encoded_image.capture_time_ms_ = 2;
38 encoded_image._frameType = kVideoFrameKey;
39 encoded_image._buffer = &payload;
40 encoded_image._length = 1;
41
42 PayloadRouter payload_router(modules, payload_type);
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000043
kjellander02b3d272016-04-20 05:05:54 -070044 EXPECT_CALL(rtp, SendOutgoingData(encoded_image._frameType, payload_type,
45 encoded_image._timeStamp,
46 encoded_image.capture_time_ms_, &payload,
Sergey Ulanov525df3f2016-08-02 17:46:41 -070047 encoded_image._length, nullptr, _, _))
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000048 .Times(0);
sergeyu2cb155a2016-11-04 11:39:29 -070049 EXPECT_NE(
50 EncodedImageCallback::Result::OK,
51 payload_router.OnEncodedImage(encoded_image, nullptr, nullptr).error);
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000052
sprang1a646ee2016-12-01 06:34:11 -080053 payload_router.SetActive(true);
kjellander02b3d272016-04-20 05:05:54 -070054 EXPECT_CALL(rtp, SendOutgoingData(encoded_image._frameType, payload_type,
55 encoded_image._timeStamp,
56 encoded_image.capture_time_ms_, &payload,
Sergey Ulanov525df3f2016-08-02 17:46:41 -070057 encoded_image._length, nullptr, _, _))
sergeyu7b9feee2016-11-17 16:16:14 -080058 .Times(1)
59 .WillOnce(Return(true));
sergeyu2cb155a2016-11-04 11:39:29 -070060 EXPECT_EQ(
61 EncodedImageCallback::Result::OK,
62 payload_router.OnEncodedImage(encoded_image, nullptr, nullptr).error);
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000063
sprang1a646ee2016-12-01 06:34:11 -080064 payload_router.SetActive(false);
kjellander02b3d272016-04-20 05:05:54 -070065 EXPECT_CALL(rtp, SendOutgoingData(encoded_image._frameType, payload_type,
66 encoded_image._timeStamp,
67 encoded_image.capture_time_ms_, &payload,
Sergey Ulanov525df3f2016-08-02 17:46:41 -070068 encoded_image._length, nullptr, _, _))
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000069 .Times(0);
sergeyu2cb155a2016-11-04 11:39:29 -070070 EXPECT_NE(
71 EncodedImageCallback::Result::OK,
72 payload_router.OnEncodedImage(encoded_image, nullptr, nullptr).error);
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000073
sprang1a646ee2016-12-01 06:34:11 -080074 payload_router.SetActive(true);
kjellander02b3d272016-04-20 05:05:54 -070075 EXPECT_CALL(rtp, SendOutgoingData(encoded_image._frameType, payload_type,
76 encoded_image._timeStamp,
77 encoded_image.capture_time_ms_, &payload,
Sergey Ulanov525df3f2016-08-02 17:46:41 -070078 encoded_image._length, nullptr, _, _))
sergeyu7b9feee2016-11-17 16:16:14 -080079 .Times(1)
80 .WillOnce(Return(true));
sergeyu2cb155a2016-11-04 11:39:29 -070081 EXPECT_EQ(
82 EncodedImageCallback::Result::OK,
83 payload_router.OnEncodedImage(encoded_image, nullptr, nullptr).error);
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000084}
85
Per83d09102016-04-15 14:59:13 +020086TEST(PayloadRouterTest, SendSimulcast) {
perkjbc75d972016-05-02 06:31:25 -070087 NiceMock<MockRtpRtcp> rtp_1;
88 NiceMock<MockRtpRtcp> rtp_2;
Peter Boström404686a2016-02-11 23:37:26 +010089 std::vector<RtpRtcp*> modules;
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000090 modules.push_back(&rtp_1);
91 modules.push_back(&rtp_2);
perkjbc75d972016-05-02 06:31:25 -070092 std::vector<VideoStream> streams(2);
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000093
kjellander02b3d272016-04-20 05:05:54 -070094 int8_t payload_type = 96;
95 uint8_t payload = 'a';
96 EncodedImage encoded_image;
97 encoded_image._timeStamp = 1;
98 encoded_image.capture_time_ms_ = 2;
99 encoded_image._frameType = kVideoFrameKey;
100 encoded_image._buffer = &payload;
101 encoded_image._length = 1;
102
103 PayloadRouter payload_router(modules, payload_type);
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000104
kjellander02b3d272016-04-20 05:05:54 -0700105 CodecSpecificInfo codec_info_1;
106 memset(&codec_info_1, 0, sizeof(CodecSpecificInfo));
107 codec_info_1.codecType = kVideoCodecVP8;
108 codec_info_1.codecSpecific.VP8.simulcastIdx = 0;
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000109
sprang1a646ee2016-12-01 06:34:11 -0800110 payload_router.SetActive(true);
kjellander02b3d272016-04-20 05:05:54 -0700111 EXPECT_CALL(rtp_1, SendOutgoingData(encoded_image._frameType, payload_type,
112 encoded_image._timeStamp,
113 encoded_image.capture_time_ms_, &payload,
Sergey Ulanov525df3f2016-08-02 17:46:41 -0700114 encoded_image._length, nullptr, _, _))
sergeyu7b9feee2016-11-17 16:16:14 -0800115 .Times(1)
116 .WillOnce(Return(true));
Sergey Ulanov525df3f2016-08-02 17:46:41 -0700117 EXPECT_CALL(rtp_2, SendOutgoingData(_, _, _, _, _, _, _, _, _)).Times(0);
sergeyu2cb155a2016-11-04 11:39:29 -0700118 EXPECT_EQ(EncodedImageCallback::Result::OK,
119 payload_router.OnEncodedImage(encoded_image, &codec_info_1, nullptr)
120 .error);
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000121
kjellander02b3d272016-04-20 05:05:54 -0700122 CodecSpecificInfo codec_info_2;
123 memset(&codec_info_2, 0, sizeof(CodecSpecificInfo));
124 codec_info_2.codecType = kVideoCodecVP8;
125 codec_info_2.codecSpecific.VP8.simulcastIdx = 1;
126
127 EXPECT_CALL(rtp_2, SendOutgoingData(encoded_image._frameType, payload_type,
128 encoded_image._timeStamp,
129 encoded_image.capture_time_ms_, &payload,
Sergey Ulanov525df3f2016-08-02 17:46:41 -0700130 encoded_image._length, nullptr, _, _))
sergeyu7b9feee2016-11-17 16:16:14 -0800131 .Times(1)
132 .WillOnce(Return(true));
Sergey Ulanov525df3f2016-08-02 17:46:41 -0700133 EXPECT_CALL(rtp_1, SendOutgoingData(_, _, _, _, _, _, _, _, _))
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000134 .Times(0);
sergeyu2cb155a2016-11-04 11:39:29 -0700135 EXPECT_EQ(EncodedImageCallback::Result::OK,
136 payload_router.OnEncodedImage(encoded_image, &codec_info_2, nullptr)
137 .error);
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000138
mflodman@webrtc.org50e28162015-02-23 07:45:11 +0000139 // Inactive.
sprang1a646ee2016-12-01 06:34:11 -0800140 payload_router.SetActive(false);
Sergey Ulanov525df3f2016-08-02 17:46:41 -0700141 EXPECT_CALL(rtp_1, SendOutgoingData(_, _, _, _, _, _, _, _, _))
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000142 .Times(0);
Sergey Ulanov525df3f2016-08-02 17:46:41 -0700143 EXPECT_CALL(rtp_2, SendOutgoingData(_, _, _, _, _, _, _, _, _))
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000144 .Times(0);
sergeyu2cb155a2016-11-04 11:39:29 -0700145 EXPECT_NE(EncodedImageCallback::Result::OK,
146 payload_router.OnEncodedImage(encoded_image, &codec_info_1, nullptr)
147 .error);
148 EXPECT_NE(EncodedImageCallback::Result::OK,
149 payload_router.OnEncodedImage(encoded_image, &codec_info_2, nullptr)
150 .error);
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000151}
152
sprang1a646ee2016-12-01 06:34:11 -0800153TEST(PayloadRouterTest, SimulcastTargetBitrate) {
154 NiceMock<MockRtpRtcp> rtp_1;
155 NiceMock<MockRtpRtcp> rtp_2;
156 std::vector<RtpRtcp*> modules;
157 modules.push_back(&rtp_1);
158 modules.push_back(&rtp_2);
159 PayloadRouter payload_router(modules, 42);
160 payload_router.SetActive(true);
161
162 BitrateAllocation bitrate;
163 bitrate.SetBitrate(0, 0, 10000);
164 bitrate.SetBitrate(0, 1, 20000);
165 bitrate.SetBitrate(1, 0, 40000);
166 bitrate.SetBitrate(1, 1, 80000);
167
168 BitrateAllocation layer0_bitrate;
169 layer0_bitrate.SetBitrate(0, 0, 10000);
170 layer0_bitrate.SetBitrate(0, 1, 20000);
171
172 BitrateAllocation layer1_bitrate;
173 layer1_bitrate.SetBitrate(0, 0, 40000);
174 layer1_bitrate.SetBitrate(0, 1, 80000);
175
176 EXPECT_CALL(rtp_1, SetVideoBitrateAllocation(layer0_bitrate)).Times(1);
177 EXPECT_CALL(rtp_2, SetVideoBitrateAllocation(layer1_bitrate)).Times(1);
178
179 payload_router.OnBitrateAllocationUpdated(bitrate);
180}
181
sprangd0fc37a2017-06-22 05:40:25 -0700182TEST(PayloadRouterTest, SimulcastTargetBitrateWithInactiveStream) {
183 // Set up two active rtp modules.
184 NiceMock<MockRtpRtcp> rtp_1;
185 NiceMock<MockRtpRtcp> rtp_2;
186 std::vector<RtpRtcp*> modules;
187 modules.push_back(&rtp_1);
188 modules.push_back(&rtp_2);
189 PayloadRouter payload_router(modules, 42);
190 payload_router.SetActive(true);
191
192 // Create bitrate allocation with bitrate only for the first stream.
193 BitrateAllocation bitrate;
194 bitrate.SetBitrate(0, 0, 10000);
195 bitrate.SetBitrate(0, 1, 20000);
196
197 // Expect only the first rtp module to be asked to send a TargetBitrate
198 // message. (No target bitrate with 0bps sent from the second one.)
199 EXPECT_CALL(rtp_1, SetVideoBitrateAllocation(bitrate)).Times(1);
200 EXPECT_CALL(rtp_2, SetVideoBitrateAllocation(_)).Times(0);
201
202 payload_router.OnBitrateAllocationUpdated(bitrate);
203}
204
sprang1a646ee2016-12-01 06:34:11 -0800205TEST(PayloadRouterTest, SvcTargetBitrate) {
206 NiceMock<MockRtpRtcp> rtp_1;
207 std::vector<RtpRtcp*> modules;
208 modules.push_back(&rtp_1);
209 PayloadRouter payload_router(modules, 42);
210 payload_router.SetActive(true);
211
212 BitrateAllocation bitrate;
213 bitrate.SetBitrate(0, 0, 10000);
214 bitrate.SetBitrate(0, 1, 20000);
215 bitrate.SetBitrate(1, 0, 40000);
216 bitrate.SetBitrate(1, 1, 80000);
217
218 EXPECT_CALL(rtp_1, SetVideoBitrateAllocation(bitrate)).Times(1);
219
220 payload_router.OnBitrateAllocationUpdated(bitrate);
221}
222
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000223} // namespace webrtc