blob: 62dba29c05e72873b977a40be9f6159e2fcc2706 [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
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000013#include "testing/gmock/include/gmock/gmock.h"
14#include "testing/gtest/include/gtest/gtest.h"
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010015#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000016#include "webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h"
kjellander02b3d272016-04-20 05:05:54 -070017#include "webrtc/modules/video_coding/include/video_codec_interface.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);
perkjbc75d972016-05-02 06:31:25 -070042 payload_router.SetSendStreams(streams);
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,
sergeyuac4dc2c2016-08-02 14:33:16 -070047 encoded_image._length, nullptr, _))
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000048 .Times(0);
kjellander02b3d272016-04-20 05:05:54 -070049 EXPECT_EQ(-1, payload_router.Encoded(encoded_image, nullptr, nullptr));
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000050
Per83d09102016-04-15 14:59:13 +020051 payload_router.set_active(true);
kjellander02b3d272016-04-20 05:05:54 -070052 EXPECT_CALL(rtp, SendOutgoingData(encoded_image._frameType, payload_type,
53 encoded_image._timeStamp,
54 encoded_image.capture_time_ms_, &payload,
sergeyuac4dc2c2016-08-02 14:33:16 -070055 encoded_image._length, nullptr, _))
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000056 .Times(1);
kjellander02b3d272016-04-20 05:05:54 -070057 EXPECT_EQ(0, payload_router.Encoded(encoded_image, nullptr, nullptr));
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000058
Per83d09102016-04-15 14:59:13 +020059 payload_router.set_active(false);
kjellander02b3d272016-04-20 05:05:54 -070060 EXPECT_CALL(rtp, SendOutgoingData(encoded_image._frameType, payload_type,
61 encoded_image._timeStamp,
62 encoded_image.capture_time_ms_, &payload,
sergeyuac4dc2c2016-08-02 14:33:16 -070063 encoded_image._length, nullptr, _))
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000064 .Times(0);
kjellander02b3d272016-04-20 05:05:54 -070065 EXPECT_EQ(-1, payload_router.Encoded(encoded_image, nullptr, nullptr));
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000066
Per83d09102016-04-15 14:59:13 +020067 payload_router.set_active(true);
kjellander02b3d272016-04-20 05:05:54 -070068 EXPECT_CALL(rtp, SendOutgoingData(encoded_image._frameType, payload_type,
69 encoded_image._timeStamp,
70 encoded_image.capture_time_ms_, &payload,
sergeyuac4dc2c2016-08-02 14:33:16 -070071 encoded_image._length, nullptr, _))
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000072 .Times(1);
kjellander02b3d272016-04-20 05:05:54 -070073 EXPECT_EQ(0, payload_router.Encoded(encoded_image, nullptr, nullptr));
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000074
perkjbc75d972016-05-02 06:31:25 -070075 streams.clear();
76 payload_router.SetSendStreams(streams);
kjellander02b3d272016-04-20 05:05:54 -070077 EXPECT_CALL(rtp, SendOutgoingData(encoded_image._frameType, payload_type,
78 encoded_image._timeStamp,
79 encoded_image.capture_time_ms_, &payload,
sergeyuac4dc2c2016-08-02 14:33:16 -070080 encoded_image._length, nullptr, _))
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +000081 .Times(0);
kjellander02b3d272016-04-20 05:05:54 -070082 EXPECT_EQ(-1, payload_router.Encoded(encoded_image, nullptr, nullptr));
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);
perkjbc75d972016-05-02 06:31:25 -0700103 payload_router.SetSendStreams(streams);
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
Per83d09102016-04-15 14:59:13 +0200110 payload_router.set_active(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,
sergeyuac4dc2c2016-08-02 14:33:16 -0700114 encoded_image._length, nullptr, _))
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000115 .Times(1);
sergeyuac4dc2c2016-08-02 14:33:16 -0700116 EXPECT_CALL(rtp_2, SendOutgoingData(_, _, _, _, _, _, _, _))
117 .Times(0);
kjellander02b3d272016-04-20 05:05:54 -0700118 EXPECT_EQ(0, payload_router.Encoded(encoded_image, &codec_info_1, nullptr));
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000119
kjellander02b3d272016-04-20 05:05:54 -0700120 CodecSpecificInfo codec_info_2;
121 memset(&codec_info_2, 0, sizeof(CodecSpecificInfo));
122 codec_info_2.codecType = kVideoCodecVP8;
123 codec_info_2.codecSpecific.VP8.simulcastIdx = 1;
124
125 EXPECT_CALL(rtp_2, SendOutgoingData(encoded_image._frameType, payload_type,
126 encoded_image._timeStamp,
127 encoded_image.capture_time_ms_, &payload,
sergeyuac4dc2c2016-08-02 14:33:16 -0700128 encoded_image._length, nullptr, _))
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000129 .Times(1);
sergeyuac4dc2c2016-08-02 14:33:16 -0700130 EXPECT_CALL(rtp_1, SendOutgoingData(_, _, _, _, _, _, _, _))
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000131 .Times(0);
kjellander02b3d272016-04-20 05:05:54 -0700132 EXPECT_EQ(0, payload_router.Encoded(encoded_image, &codec_info_2, nullptr));
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000133
mflodman@webrtc.org50e28162015-02-23 07:45:11 +0000134 // Inactive.
Per83d09102016-04-15 14:59:13 +0200135 payload_router.set_active(false);
sergeyuac4dc2c2016-08-02 14:33:16 -0700136 EXPECT_CALL(rtp_1, SendOutgoingData(_, _, _, _, _, _, _, _))
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000137 .Times(0);
sergeyuac4dc2c2016-08-02 14:33:16 -0700138 EXPECT_CALL(rtp_2, SendOutgoingData(_, _, _, _, _, _, _, _))
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000139 .Times(0);
kjellander02b3d272016-04-20 05:05:54 -0700140 EXPECT_EQ(-1, payload_router.Encoded(encoded_image, &codec_info_1, nullptr));
141 EXPECT_EQ(-1, payload_router.Encoded(encoded_image, &codec_info_2, nullptr));
mflodman@webrtc.org50e28162015-02-23 07:45:11 +0000142
143 // Invalid simulcast index.
perkjbc75d972016-05-02 06:31:25 -0700144 streams.pop_back(); // Remove a stream.
145 payload_router.SetSendStreams(streams);
Per83d09102016-04-15 14:59:13 +0200146 payload_router.set_active(true);
sergeyuac4dc2c2016-08-02 14:33:16 -0700147 EXPECT_CALL(rtp_1, SendOutgoingData(_, _, _, _, _, _, _, _))
mflodman@webrtc.org50e28162015-02-23 07:45:11 +0000148 .Times(0);
sergeyuac4dc2c2016-08-02 14:33:16 -0700149 EXPECT_CALL(rtp_2, SendOutgoingData(_, _, _, _, _, _, _, _))
mflodman@webrtc.org50e28162015-02-23 07:45:11 +0000150 .Times(0);
kjellander02b3d272016-04-20 05:05:54 -0700151 codec_info_2.codecSpecific.VP8.simulcastIdx = 1;
152 EXPECT_EQ(-1, payload_router.Encoded(encoded_image, &codec_info_2, nullptr));
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000153}
154
Per83d09102016-04-15 14:59:13 +0200155TEST(PayloadRouterTest, MaxPayloadLength) {
mflodman@webrtc.orga4ef2ce2015-02-12 09:54:18 +0000156 // Without any limitations from the modules, verify we get the max payload
157 // length for IP/UDP/SRTP with a MTU of 150 bytes.
158 const size_t kDefaultMaxLength = 1500 - 20 - 8 - 12 - 4;
perkjbc75d972016-05-02 06:31:25 -0700159 NiceMock<MockRtpRtcp> rtp_1;
160 NiceMock<MockRtpRtcp> rtp_2;
Peter Boström404686a2016-02-11 23:37:26 +0100161 std::vector<RtpRtcp*> modules;
mflodman@webrtc.orga4ef2ce2015-02-12 09:54:18 +0000162 modules.push_back(&rtp_1);
163 modules.push_back(&rtp_2);
kjellander02b3d272016-04-20 05:05:54 -0700164 PayloadRouter payload_router(modules, 42);
Per83d09102016-04-15 14:59:13 +0200165
166 EXPECT_EQ(kDefaultMaxLength, PayloadRouter::DefaultMaxPayloadLength());
perkjbc75d972016-05-02 06:31:25 -0700167 std::vector<VideoStream> streams(2);
168 payload_router.SetSendStreams(streams);
mflodman@webrtc.orga4ef2ce2015-02-12 09:54:18 +0000169
170 // Modules return a higher length than the default value.
171 EXPECT_CALL(rtp_1, MaxDataPayloadLength())
172 .Times(1)
173 .WillOnce(Return(kDefaultMaxLength + 10));
174 EXPECT_CALL(rtp_2, MaxDataPayloadLength())
175 .Times(1)
176 .WillOnce(Return(kDefaultMaxLength + 10));
Per83d09102016-04-15 14:59:13 +0200177 EXPECT_EQ(kDefaultMaxLength, payload_router.MaxPayloadLength());
mflodman@webrtc.orga4ef2ce2015-02-12 09:54:18 +0000178
179 // The modules return a value lower than default.
180 const size_t kTestMinPayloadLength = 1001;
181 EXPECT_CALL(rtp_1, MaxDataPayloadLength())
182 .Times(1)
183 .WillOnce(Return(kTestMinPayloadLength + 10));
184 EXPECT_CALL(rtp_2, MaxDataPayloadLength())
185 .Times(1)
186 .WillOnce(Return(kTestMinPayloadLength));
Per83d09102016-04-15 14:59:13 +0200187 EXPECT_EQ(kTestMinPayloadLength, payload_router.MaxPayloadLength());
mflodman@webrtc.orga4ef2ce2015-02-12 09:54:18 +0000188}
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000189} // namespace webrtc