OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include <memory> | 11 #include <memory> |
12 | 12 |
13 #include "testing/gmock/include/gmock/gmock.h" | 13 #include "testing/gmock/include/gmock/gmock.h" |
14 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
15 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h" | 15 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h" |
16 #include "webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h" | 16 #include "webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h" |
17 #include "webrtc/modules/video_coding/include/video_codec_interface.h" | |
18 #include "webrtc/video/payload_router.h" | 17 #include "webrtc/video/payload_router.h" |
19 | 18 |
20 using ::testing::_; | 19 using ::testing::_; |
21 using ::testing::AnyNumber; | 20 using ::testing::AnyNumber; |
22 using ::testing::NiceMock; | 21 using ::testing::NiceMock; |
23 using ::testing::Return; | 22 using ::testing::Return; |
24 | 23 |
25 namespace webrtc { | 24 namespace webrtc { |
26 | 25 |
27 TEST(PayloadRouterTest, SendOnOneModule) { | 26 TEST(PayloadRouterTest, SendOnOneModule) { |
28 MockRtpRtcp rtp; | 27 MockRtpRtcp rtp; |
29 std::vector<RtpRtcp*> modules(1, &rtp); | 28 std::vector<RtpRtcp*> modules(1, &rtp); |
30 | 29 |
31 uint8_t payload = 'a'; | 30 PayloadRouter payload_router(modules); |
32 int8_t payload_type = 96; | |
33 EncodedImage encoded_image; | |
34 encoded_image._timeStamp = 1; | |
35 encoded_image.capture_time_ms_ = 2; | |
36 encoded_image._frameType = kVideoFrameKey; | |
37 encoded_image._buffer = &payload; | |
38 encoded_image._length = 1; | |
39 | |
40 PayloadRouter payload_router(modules, payload_type); | |
41 payload_router.SetSendingRtpModules(modules.size()); | 31 payload_router.SetSendingRtpModules(modules.size()); |
42 | 32 |
43 EXPECT_CALL(rtp, SendOutgoingData(encoded_image._frameType, payload_type, | 33 uint8_t payload = 'a'; |
44 encoded_image._timeStamp, | 34 FrameType frame_type = kVideoFrameKey; |
45 encoded_image.capture_time_ms_, &payload, | 35 int8_t payload_type = 96; |
46 encoded_image._length, nullptr, _)) | 36 |
| 37 EXPECT_CALL(rtp, SendOutgoingData(frame_type, payload_type, 0, 0, _, 1, |
| 38 nullptr, nullptr)) |
47 .Times(0); | 39 .Times(0); |
48 EXPECT_EQ(-1, payload_router.Encoded(encoded_image, nullptr, nullptr)); | 40 EXPECT_FALSE(payload_router.RoutePayload(frame_type, payload_type, 0, 0, |
| 41 &payload, 1, nullptr, nullptr)); |
49 | 42 |
50 payload_router.set_active(true); | 43 payload_router.set_active(true); |
51 EXPECT_CALL(rtp, SendOutgoingData(encoded_image._frameType, payload_type, | 44 EXPECT_CALL(rtp, SendOutgoingData(frame_type, payload_type, 0, 0, _, 1, |
52 encoded_image._timeStamp, | 45 nullptr, nullptr)) |
53 encoded_image.capture_time_ms_, &payload, | |
54 encoded_image._length, nullptr, _)) | |
55 .Times(1); | 46 .Times(1); |
56 EXPECT_EQ(0, payload_router.Encoded(encoded_image, nullptr, nullptr)); | 47 EXPECT_TRUE(payload_router.RoutePayload(frame_type, payload_type, 0, 0, |
| 48 &payload, 1, nullptr, nullptr)); |
57 | 49 |
58 payload_router.set_active(false); | 50 payload_router.set_active(false); |
59 EXPECT_CALL(rtp, SendOutgoingData(encoded_image._frameType, payload_type, | 51 EXPECT_CALL(rtp, SendOutgoingData(frame_type, payload_type, 0, 0, _, 1, |
60 encoded_image._timeStamp, | 52 nullptr, nullptr)) |
61 encoded_image.capture_time_ms_, &payload, | |
62 encoded_image._length, nullptr, _)) | |
63 .Times(0); | 53 .Times(0); |
64 EXPECT_EQ(-1, payload_router.Encoded(encoded_image, nullptr, nullptr)); | 54 EXPECT_FALSE(payload_router.RoutePayload(frame_type, payload_type, 0, 0, |
| 55 &payload, 1, nullptr, nullptr)); |
65 | 56 |
66 payload_router.set_active(true); | 57 payload_router.set_active(true); |
67 EXPECT_CALL(rtp, SendOutgoingData(encoded_image._frameType, payload_type, | 58 EXPECT_CALL(rtp, SendOutgoingData(frame_type, payload_type, 0, 0, _, 1, |
68 encoded_image._timeStamp, | 59 nullptr, nullptr)) |
69 encoded_image.capture_time_ms_, &payload, | |
70 encoded_image._length, nullptr, _)) | |
71 .Times(1); | 60 .Times(1); |
72 EXPECT_EQ(0, payload_router.Encoded(encoded_image, nullptr, nullptr)); | 61 EXPECT_TRUE(payload_router.RoutePayload(frame_type, payload_type, 0, 0, |
| 62 &payload, 1, nullptr, nullptr)); |
73 | 63 |
74 payload_router.SetSendingRtpModules(0); | 64 payload_router.SetSendingRtpModules(0); |
75 EXPECT_CALL(rtp, SendOutgoingData(encoded_image._frameType, payload_type, | 65 EXPECT_CALL(rtp, SendOutgoingData(frame_type, payload_type, 0, 0, _, 1, |
76 encoded_image._timeStamp, | 66 nullptr, nullptr)) |
77 encoded_image.capture_time_ms_, &payload, | |
78 encoded_image._length, nullptr, _)) | |
79 .Times(0); | 67 .Times(0); |
80 EXPECT_EQ(-1, payload_router.Encoded(encoded_image, nullptr, nullptr)); | 68 EXPECT_FALSE(payload_router.RoutePayload(frame_type, payload_type, 0, 0, |
| 69 &payload, 1, nullptr, nullptr)); |
81 } | 70 } |
82 | 71 |
83 TEST(PayloadRouterTest, SendSimulcast) { | 72 TEST(PayloadRouterTest, SendSimulcast) { |
84 MockRtpRtcp rtp_1; | 73 MockRtpRtcp rtp_1; |
85 MockRtpRtcp rtp_2; | 74 MockRtpRtcp rtp_2; |
86 std::vector<RtpRtcp*> modules; | 75 std::vector<RtpRtcp*> modules; |
87 modules.push_back(&rtp_1); | 76 modules.push_back(&rtp_1); |
88 modules.push_back(&rtp_2); | 77 modules.push_back(&rtp_2); |
89 | 78 |
90 int8_t payload_type = 96; | 79 PayloadRouter payload_router(modules); |
91 uint8_t payload = 'a'; | |
92 EncodedImage encoded_image; | |
93 encoded_image._timeStamp = 1; | |
94 encoded_image.capture_time_ms_ = 2; | |
95 encoded_image._frameType = kVideoFrameKey; | |
96 encoded_image._buffer = &payload; | |
97 encoded_image._length = 1; | |
98 | |
99 PayloadRouter payload_router(modules, payload_type); | |
100 payload_router.SetSendingRtpModules(modules.size()); | 80 payload_router.SetSendingRtpModules(modules.size()); |
101 | 81 |
102 CodecSpecificInfo codec_info_1; | 82 uint8_t payload_1 = 'a'; |
103 memset(&codec_info_1, 0, sizeof(CodecSpecificInfo)); | 83 FrameType frame_type_1 = kVideoFrameKey; |
104 codec_info_1.codecType = kVideoCodecVP8; | 84 int8_t payload_type_1 = 96; |
105 codec_info_1.codecSpecific.VP8.simulcastIdx = 0; | 85 RTPVideoHeader rtp_hdr_1; |
| 86 rtp_hdr_1.simulcastIdx = 0; |
106 | 87 |
107 payload_router.set_active(true); | 88 payload_router.set_active(true); |
108 EXPECT_CALL(rtp_1, SendOutgoingData(encoded_image._frameType, payload_type, | 89 EXPECT_CALL(rtp_1, SendOutgoingData(frame_type_1, payload_type_1, 0, 0, _, 1, |
109 encoded_image._timeStamp, | 90 nullptr, &rtp_hdr_1)) |
110 encoded_image.capture_time_ms_, &payload, | |
111 encoded_image._length, nullptr, _)) | |
112 .Times(1); | 91 .Times(1); |
113 EXPECT_CALL(rtp_2, SendOutgoingData(_, _, _, _, _, _, _, _)) | 92 EXPECT_CALL(rtp_2, SendOutgoingData(_, _, _, _, _, _, _, _)) |
114 .Times(0); | 93 .Times(0); |
115 EXPECT_EQ(0, payload_router.Encoded(encoded_image, &codec_info_1, nullptr)); | 94 EXPECT_TRUE(payload_router.RoutePayload(frame_type_1, payload_type_1, 0, 0, |
| 95 &payload_1, 1, nullptr, &rtp_hdr_1)); |
116 | 96 |
117 CodecSpecificInfo codec_info_2; | 97 uint8_t payload_2 = 'b'; |
118 memset(&codec_info_2, 0, sizeof(CodecSpecificInfo)); | 98 FrameType frame_type_2 = kVideoFrameDelta; |
119 codec_info_2.codecType = kVideoCodecVP8; | 99 int8_t payload_type_2 = 97; |
120 codec_info_2.codecSpecific.VP8.simulcastIdx = 1; | 100 RTPVideoHeader rtp_hdr_2; |
121 | 101 rtp_hdr_2.simulcastIdx = 1; |
122 EXPECT_CALL(rtp_2, SendOutgoingData(encoded_image._frameType, payload_type, | 102 EXPECT_CALL(rtp_2, SendOutgoingData(frame_type_2, payload_type_2, 0, 0, _, 1, |
123 encoded_image._timeStamp, | 103 nullptr, &rtp_hdr_2)) |
124 encoded_image.capture_time_ms_, &payload, | |
125 encoded_image._length, nullptr, _)) | |
126 .Times(1); | 104 .Times(1); |
127 EXPECT_CALL(rtp_1, SendOutgoingData(_, _, _, _, _, _, _, _)) | 105 EXPECT_CALL(rtp_1, SendOutgoingData(_, _, _, _, _, _, _, _)) |
128 .Times(0); | 106 .Times(0); |
129 EXPECT_EQ(0, payload_router.Encoded(encoded_image, &codec_info_2, nullptr)); | 107 EXPECT_TRUE(payload_router.RoutePayload(frame_type_2, payload_type_2, 0, 0, |
| 108 &payload_2, 1, nullptr, &rtp_hdr_2)); |
130 | 109 |
131 // Inactive. | 110 // Inactive. |
132 payload_router.set_active(false); | 111 payload_router.set_active(false); |
133 EXPECT_CALL(rtp_1, SendOutgoingData(_, _, _, _, _, _, _, _)) | 112 EXPECT_CALL(rtp_1, SendOutgoingData(_, _, _, _, _, _, _, _)) |
134 .Times(0); | 113 .Times(0); |
135 EXPECT_CALL(rtp_2, SendOutgoingData(_, _, _, _, _, _, _, _)) | 114 EXPECT_CALL(rtp_2, SendOutgoingData(_, _, _, _, _, _, _, _)) |
136 .Times(0); | 115 .Times(0); |
137 EXPECT_EQ(-1, payload_router.Encoded(encoded_image, &codec_info_1, nullptr)); | 116 EXPECT_FALSE(payload_router.RoutePayload(frame_type_1, payload_type_1, 0, 0, |
138 EXPECT_EQ(-1, payload_router.Encoded(encoded_image, &codec_info_2, nullptr)); | 117 &payload_1, 1, nullptr, &rtp_hdr_1)); |
| 118 EXPECT_FALSE(payload_router.RoutePayload(frame_type_2, payload_type_2, 0, 0, |
| 119 &payload_2, 1, nullptr, &rtp_hdr_2)); |
139 | 120 |
140 // Invalid simulcast index. | 121 // Invalid simulcast index. |
141 payload_router.SetSendingRtpModules(1); | 122 payload_router.SetSendingRtpModules(1); |
142 payload_router.set_active(true); | 123 payload_router.set_active(true); |
143 EXPECT_CALL(rtp_1, SendOutgoingData(_, _, _, _, _, _, _, _)) | 124 EXPECT_CALL(rtp_1, SendOutgoingData(_, _, _, _, _, _, _, _)) |
144 .Times(0); | 125 .Times(0); |
145 EXPECT_CALL(rtp_2, SendOutgoingData(_, _, _, _, _, _, _, _)) | 126 EXPECT_CALL(rtp_2, SendOutgoingData(_, _, _, _, _, _, _, _)) |
146 .Times(0); | 127 .Times(0); |
147 codec_info_2.codecSpecific.VP8.simulcastIdx = 1; | 128 rtp_hdr_1.simulcastIdx = 1; |
148 EXPECT_EQ(-1, payload_router.Encoded(encoded_image, &codec_info_2, nullptr)); | 129 EXPECT_FALSE(payload_router.RoutePayload(frame_type_1, payload_type_1, 0, 0, |
| 130 &payload_1, 1, nullptr, &rtp_hdr_1)); |
149 } | 131 } |
150 | 132 |
151 TEST(PayloadRouterTest, MaxPayloadLength) { | 133 TEST(PayloadRouterTest, MaxPayloadLength) { |
152 // Without any limitations from the modules, verify we get the max payload | 134 // Without any limitations from the modules, verify we get the max payload |
153 // length for IP/UDP/SRTP with a MTU of 150 bytes. | 135 // length for IP/UDP/SRTP with a MTU of 150 bytes. |
154 const size_t kDefaultMaxLength = 1500 - 20 - 8 - 12 - 4; | 136 const size_t kDefaultMaxLength = 1500 - 20 - 8 - 12 - 4; |
155 MockRtpRtcp rtp_1; | 137 MockRtpRtcp rtp_1; |
156 MockRtpRtcp rtp_2; | 138 MockRtpRtcp rtp_2; |
157 std::vector<RtpRtcp*> modules; | 139 std::vector<RtpRtcp*> modules; |
158 modules.push_back(&rtp_1); | 140 modules.push_back(&rtp_1); |
159 modules.push_back(&rtp_2); | 141 modules.push_back(&rtp_2); |
160 PayloadRouter payload_router(modules, 42); | 142 PayloadRouter payload_router(modules); |
161 | 143 |
162 EXPECT_EQ(kDefaultMaxLength, PayloadRouter::DefaultMaxPayloadLength()); | 144 EXPECT_EQ(kDefaultMaxLength, PayloadRouter::DefaultMaxPayloadLength()); |
163 payload_router.SetSendingRtpModules(modules.size()); | 145 payload_router.SetSendingRtpModules(modules.size()); |
164 | 146 |
165 // Modules return a higher length than the default value. | 147 // Modules return a higher length than the default value. |
166 EXPECT_CALL(rtp_1, MaxDataPayloadLength()) | 148 EXPECT_CALL(rtp_1, MaxDataPayloadLength()) |
167 .Times(1) | 149 .Times(1) |
168 .WillOnce(Return(kDefaultMaxLength + 10)); | 150 .WillOnce(Return(kDefaultMaxLength + 10)); |
169 EXPECT_CALL(rtp_2, MaxDataPayloadLength()) | 151 EXPECT_CALL(rtp_2, MaxDataPayloadLength()) |
170 .Times(1) | 152 .Times(1) |
(...skipping 10 matching lines...) Expand all Loading... |
181 .WillOnce(Return(kTestMinPayloadLength)); | 163 .WillOnce(Return(kTestMinPayloadLength)); |
182 EXPECT_EQ(kTestMinPayloadLength, payload_router.MaxPayloadLength()); | 164 EXPECT_EQ(kTestMinPayloadLength, payload_router.MaxPayloadLength()); |
183 } | 165 } |
184 | 166 |
185 TEST(PayloadRouterTest, SetTargetSendBitrates) { | 167 TEST(PayloadRouterTest, SetTargetSendBitrates) { |
186 MockRtpRtcp rtp_1; | 168 MockRtpRtcp rtp_1; |
187 MockRtpRtcp rtp_2; | 169 MockRtpRtcp rtp_2; |
188 std::vector<RtpRtcp*> modules; | 170 std::vector<RtpRtcp*> modules; |
189 modules.push_back(&rtp_1); | 171 modules.push_back(&rtp_1); |
190 modules.push_back(&rtp_2); | 172 modules.push_back(&rtp_2); |
191 PayloadRouter payload_router(modules, 42); | 173 PayloadRouter payload_router(modules); |
192 payload_router.SetSendingRtpModules(modules.size()); | 174 payload_router.SetSendingRtpModules(modules.size()); |
193 | 175 |
194 const uint32_t bitrate_1 = 10000; | 176 const uint32_t bitrate_1 = 10000; |
195 const uint32_t bitrate_2 = 76543; | 177 const uint32_t bitrate_2 = 76543; |
196 std::vector<uint32_t> bitrates(2, bitrate_1); | 178 std::vector<uint32_t> bitrates(2, bitrate_1); |
197 bitrates[1] = bitrate_2; | 179 bitrates[1] = bitrate_2; |
198 EXPECT_CALL(rtp_1, SetTargetSendBitrate(bitrate_1)) | 180 EXPECT_CALL(rtp_1, SetTargetSendBitrate(bitrate_1)) |
199 .Times(1); | 181 .Times(1); |
200 EXPECT_CALL(rtp_2, SetTargetSendBitrate(bitrate_2)) | 182 EXPECT_CALL(rtp_2, SetTargetSendBitrate(bitrate_2)) |
201 .Times(1); | 183 .Times(1); |
202 payload_router.SetTargetSendBitrates(bitrates); | 184 payload_router.SetTargetSendBitrates(bitrates); |
203 | 185 |
204 bitrates.resize(1); | 186 bitrates.resize(1); |
205 EXPECT_CALL(rtp_1, SetTargetSendBitrate(bitrate_1)) | 187 EXPECT_CALL(rtp_1, SetTargetSendBitrate(bitrate_1)) |
206 .Times(1); | 188 .Times(1); |
207 EXPECT_CALL(rtp_2, SetTargetSendBitrate(bitrate_2)) | 189 EXPECT_CALL(rtp_2, SetTargetSendBitrate(bitrate_2)) |
208 .Times(0); | 190 .Times(0); |
209 payload_router.SetTargetSendBitrates(bitrates); | 191 payload_router.SetTargetSendBitrates(bitrates); |
210 } | 192 } |
211 } // namespace webrtc | 193 } // namespace webrtc |
OLD | NEW |