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