blob: def76b73a6588620b6159ca5846625a3b9c9f827 [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,
Sergey Ulanov4c7f4cd2016-08-02 15:14:39 -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,
Sergey Ulanov4c7f4cd2016-08-02 15:14:39 -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,
Sergey Ulanov4c7f4cd2016-08-02 15:14:39 -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,
Sergey Ulanov4c7f4cd2016-08-02 15:14:39 -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,
Sergey Ulanov4c7f4cd2016-08-02 15:14:39 -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,
Sergey Ulanov4c7f4cd2016-08-02 15:14:39 -0700114 encoded_image._length, nullptr, _, _))
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000115 .Times(1);
Sergey Ulanov4c7f4cd2016-08-02 15:14:39 -0700116 EXPECT_CALL(rtp_2, SendOutgoingData(_, _, _, _, _, _, _, _, _)).Times(0);
kjellander02b3d272016-04-20 05:05:54 -0700117 EXPECT_EQ(0, payload_router.Encoded(encoded_image, &codec_info_1, nullptr));
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000118
kjellander02b3d272016-04-20 05:05:54 -0700119 CodecSpecificInfo codec_info_2;
120 memset(&codec_info_2, 0, sizeof(CodecSpecificInfo));
121 codec_info_2.codecType = kVideoCodecVP8;
122 codec_info_2.codecSpecific.VP8.simulcastIdx = 1;
123
124 EXPECT_CALL(rtp_2, SendOutgoingData(encoded_image._frameType, payload_type,
125 encoded_image._timeStamp,
126 encoded_image.capture_time_ms_, &payload,
Sergey Ulanov4c7f4cd2016-08-02 15:14:39 -0700127 encoded_image._length, nullptr, _, _))
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000128 .Times(1);
Sergey Ulanov4c7f4cd2016-08-02 15:14:39 -0700129 EXPECT_CALL(rtp_1, SendOutgoingData(_, _, _, _, _, _, _, _, _))
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000130 .Times(0);
kjellander02b3d272016-04-20 05:05:54 -0700131 EXPECT_EQ(0, payload_router.Encoded(encoded_image, &codec_info_2, nullptr));
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000132
mflodman@webrtc.org50e28162015-02-23 07:45:11 +0000133 // Inactive.
Per83d09102016-04-15 14:59:13 +0200134 payload_router.set_active(false);
Sergey Ulanov4c7f4cd2016-08-02 15:14:39 -0700135 EXPECT_CALL(rtp_1, SendOutgoingData(_, _, _, _, _, _, _, _, _))
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000136 .Times(0);
Sergey Ulanov4c7f4cd2016-08-02 15:14:39 -0700137 EXPECT_CALL(rtp_2, SendOutgoingData(_, _, _, _, _, _, _, _, _))
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000138 .Times(0);
kjellander02b3d272016-04-20 05:05:54 -0700139 EXPECT_EQ(-1, payload_router.Encoded(encoded_image, &codec_info_1, nullptr));
140 EXPECT_EQ(-1, payload_router.Encoded(encoded_image, &codec_info_2, nullptr));
mflodman@webrtc.org50e28162015-02-23 07:45:11 +0000141
142 // Invalid simulcast index.
perkjbc75d972016-05-02 06:31:25 -0700143 streams.pop_back(); // Remove a stream.
144 payload_router.SetSendStreams(streams);
Per83d09102016-04-15 14:59:13 +0200145 payload_router.set_active(true);
Sergey Ulanov4c7f4cd2016-08-02 15:14:39 -0700146 EXPECT_CALL(rtp_1, SendOutgoingData(_, _, _, _, _, _, _, _, _))
mflodman@webrtc.org50e28162015-02-23 07:45:11 +0000147 .Times(0);
Sergey Ulanov4c7f4cd2016-08-02 15:14:39 -0700148 EXPECT_CALL(rtp_2, SendOutgoingData(_, _, _, _, _, _, _, _, _))
mflodman@webrtc.org50e28162015-02-23 07:45:11 +0000149 .Times(0);
kjellander02b3d272016-04-20 05:05:54 -0700150 codec_info_2.codecSpecific.VP8.simulcastIdx = 1;
151 EXPECT_EQ(-1, payload_router.Encoded(encoded_image, &codec_info_2, nullptr));
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000152}
153
Per83d09102016-04-15 14:59:13 +0200154TEST(PayloadRouterTest, MaxPayloadLength) {
mflodman@webrtc.orga4ef2ce2015-02-12 09:54:18 +0000155 // Without any limitations from the modules, verify we get the max payload
156 // length for IP/UDP/SRTP with a MTU of 150 bytes.
157 const size_t kDefaultMaxLength = 1500 - 20 - 8 - 12 - 4;
perkjbc75d972016-05-02 06:31:25 -0700158 NiceMock<MockRtpRtcp> rtp_1;
159 NiceMock<MockRtpRtcp> rtp_2;
Peter Boström404686a2016-02-11 23:37:26 +0100160 std::vector<RtpRtcp*> modules;
mflodman@webrtc.orga4ef2ce2015-02-12 09:54:18 +0000161 modules.push_back(&rtp_1);
162 modules.push_back(&rtp_2);
kjellander02b3d272016-04-20 05:05:54 -0700163 PayloadRouter payload_router(modules, 42);
Per83d09102016-04-15 14:59:13 +0200164
165 EXPECT_EQ(kDefaultMaxLength, PayloadRouter::DefaultMaxPayloadLength());
perkjbc75d972016-05-02 06:31:25 -0700166 std::vector<VideoStream> streams(2);
167 payload_router.SetSendStreams(streams);
mflodman@webrtc.orga4ef2ce2015-02-12 09:54:18 +0000168
169 // Modules return a higher length than the default value.
170 EXPECT_CALL(rtp_1, MaxDataPayloadLength())
171 .Times(1)
172 .WillOnce(Return(kDefaultMaxLength + 10));
173 EXPECT_CALL(rtp_2, MaxDataPayloadLength())
174 .Times(1)
175 .WillOnce(Return(kDefaultMaxLength + 10));
Per83d09102016-04-15 14:59:13 +0200176 EXPECT_EQ(kDefaultMaxLength, payload_router.MaxPayloadLength());
mflodman@webrtc.orga4ef2ce2015-02-12 09:54:18 +0000177
178 // The modules return a value lower than default.
179 const size_t kTestMinPayloadLength = 1001;
180 EXPECT_CALL(rtp_1, MaxDataPayloadLength())
181 .Times(1)
182 .WillOnce(Return(kTestMinPayloadLength + 10));
183 EXPECT_CALL(rtp_2, MaxDataPayloadLength())
184 .Times(1)
185 .WillOnce(Return(kTestMinPayloadLength));
Per83d09102016-04-15 14:59:13 +0200186 EXPECT_EQ(kTestMinPayloadLength, payload_router.MaxPayloadLength());
mflodman@webrtc.orga4ef2ce2015-02-12 09:54:18 +0000187}
mflodman@webrtc.org02270cd2015-02-06 13:10:19 +0000188} // namespace webrtc