OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 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 <list> | 11 #include <list> |
12 #include <memory> | 12 #include <memory> |
13 #include <vector> | 13 #include <vector> |
14 | 14 |
15 #include "testing/gmock/include/gmock/gmock.h" | 15 #include "testing/gmock/include/gmock/gmock.h" |
16 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
17 #include "webrtc/base/buffer.h" | 17 #include "webrtc/base/buffer.h" |
18 #include "webrtc/base/rate_limiter.h" | 18 #include "webrtc/base/rate_limiter.h" |
19 #include "webrtc/call/mock/mock_rtc_event_log.h" | 19 #include "webrtc/call/mock/mock_rtc_event_log.h" |
20 #include "webrtc/modules/rtp_rtcp/include/rtp_cvo.h" | 20 #include "webrtc/modules/rtp_rtcp/include/rtp_cvo.h" |
21 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" | 21 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" |
22 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" | 22 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" |
23 #include "webrtc/modules/rtp_rtcp/source/rtp_format_video_generic.h" | 23 #include "webrtc/modules/rtp_rtcp/source/rtp_format_video_generic.h" |
24 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extension.h" | 24 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extension.h" |
| 25 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h" |
| 26 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h" |
| 27 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h" |
25 #include "webrtc/modules/rtp_rtcp/source/rtp_sender.h" | 28 #include "webrtc/modules/rtp_rtcp/source/rtp_sender.h" |
26 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_video.h" | 29 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_video.h" |
27 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" | 30 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" |
28 #include "webrtc/system_wrappers/include/stl_util.h" | 31 #include "webrtc/system_wrappers/include/stl_util.h" |
29 #include "webrtc/test/mock_transport.h" | 32 #include "webrtc/test/mock_transport.h" |
30 #include "webrtc/typedefs.h" | 33 #include "webrtc/typedefs.h" |
31 | 34 |
32 namespace webrtc { | 35 namespace webrtc { |
33 | 36 |
34 namespace { | 37 namespace { |
35 const int kTransmissionTimeOffsetExtensionId = 1; | 38 const int kTransmissionTimeOffsetExtensionId = 1; |
36 const int kAbsoluteSendTimeExtensionId = 14; | 39 const int kAbsoluteSendTimeExtensionId = 14; |
37 const int kTransportSequenceNumberExtensionId = 13; | 40 const int kTransportSequenceNumberExtensionId = 13; |
38 const int kPayload = 100; | 41 const int kPayload = 100; |
39 const int kRtxPayload = 98; | 42 const int kRtxPayload = 98; |
40 const uint32_t kTimestamp = 10; | 43 const uint32_t kTimestamp = 10; |
41 const uint16_t kSeqNum = 33; | 44 const uint16_t kSeqNum = 33; |
42 const int kTimeOffset = 22222; | 45 const int kTimeOffset = 22222; |
43 const int kMaxPacketLength = 1500; | 46 const int64_t kAbsoluteSendTimeMs = 1234567890ll; |
44 const uint32_t kAbsoluteSendTime = 0x00aabbcc; | 47 const uint32_t kAbsoluteSendTime = |
| 48 AbsoluteSendTime::MsTo24Bits(kAbsoluteSendTimeMs); |
45 const uint8_t kAudioLevel = 0x5a; | 49 const uint8_t kAudioLevel = 0x5a; |
46 const uint16_t kTransportSequenceNumber = 0xaabbu; | 50 const uint16_t kTransportSequenceNumber = 0xaabbu; |
47 const uint8_t kAudioLevelExtensionId = 9; | 51 const uint8_t kAudioLevelExtensionId = 9; |
48 const int kAudioPayload = 103; | 52 const int kAudioPayload = 103; |
49 const uint64_t kStartTime = 123456789; | 53 const uint64_t kStartTime = 123456789; |
50 const size_t kMaxPaddingSize = 224u; | 54 const size_t kMaxPaddingSize = 224u; |
51 const int kVideoRotationExtensionId = 5; | 55 const int kVideoRotationExtensionId = 5; |
52 const VideoRotation kRotation = kVideoRotation_270; | 56 const VideoRotation kRotation = kVideoRotation_270; |
53 | 57 |
54 using testing::_; | 58 using testing::_; |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
155 SimulatedClock fake_clock_; | 159 SimulatedClock fake_clock_; |
156 testing::NiceMock<MockRtcEventLog> mock_rtc_event_log_; | 160 testing::NiceMock<MockRtcEventLog> mock_rtc_event_log_; |
157 MockRtpPacketSender mock_paced_sender_; | 161 MockRtpPacketSender mock_paced_sender_; |
158 testing::StrictMock<MockTransportSequenceNumberAllocator> seq_num_allocator_; | 162 testing::StrictMock<MockTransportSequenceNumberAllocator> seq_num_allocator_; |
159 testing::StrictMock<MockSendPacketObserver> send_packet_observer_; | 163 testing::StrictMock<MockSendPacketObserver> send_packet_observer_; |
160 RateLimiter retransmission_rate_limiter_; | 164 RateLimiter retransmission_rate_limiter_; |
161 std::unique_ptr<RTPSender> rtp_sender_; | 165 std::unique_ptr<RTPSender> rtp_sender_; |
162 int payload_; | 166 int payload_; |
163 LoopbackTransportTest transport_; | 167 LoopbackTransportTest transport_; |
164 const bool kMarkerBit; | 168 const bool kMarkerBit; |
165 uint8_t packet_[kMaxPacketLength]; | 169 std::unique_ptr<RtpPacketToSend> packet_; |
166 | 170 |
167 void VerifyRTPHeaderCommon(const RTPHeader& rtp_header) { | 171 void VerifyRTPHeaderCommon(const RTPHeader& rtp_header) { |
168 VerifyRTPHeaderCommon(rtp_header, kMarkerBit, 0); | 172 VerifyRTPHeaderCommon(rtp_header, kMarkerBit, 0); |
169 } | 173 } |
170 | 174 |
171 void VerifyRTPHeaderCommon(const RTPHeader& rtp_header, bool marker_bit) { | 175 void VerifyRTPHeaderCommon(const RTPHeader& rtp_header, bool marker_bit) { |
172 VerifyRTPHeaderCommon(rtp_header, marker_bit, 0); | 176 VerifyRTPHeaderCommon(rtp_header, marker_bit, 0); |
173 } | 177 } |
174 | 178 |
175 void VerifyRTPHeaderCommon(const RTPHeader& rtp_header, | 179 void VerifyRTPHeaderCommon(const RTPHeader& rtp_header, |
176 bool marker_bit, | 180 bool marker_bit, |
177 uint8_t number_of_csrcs) { | 181 uint8_t number_of_csrcs) { |
178 EXPECT_EQ(marker_bit, rtp_header.markerBit); | 182 EXPECT_EQ(marker_bit, rtp_header.markerBit); |
179 EXPECT_EQ(payload_, rtp_header.payloadType); | 183 EXPECT_EQ(payload_, rtp_header.payloadType); |
180 EXPECT_EQ(kSeqNum, rtp_header.sequenceNumber); | 184 EXPECT_EQ(kSeqNum, rtp_header.sequenceNumber); |
181 EXPECT_EQ(kTimestamp, rtp_header.timestamp); | 185 EXPECT_EQ(kTimestamp, rtp_header.timestamp); |
182 EXPECT_EQ(rtp_sender_->SSRC(), rtp_header.ssrc); | 186 EXPECT_EQ(rtp_sender_->SSRC(), rtp_header.ssrc); |
183 EXPECT_EQ(number_of_csrcs, rtp_header.numCSRCs); | 187 EXPECT_EQ(number_of_csrcs, rtp_header.numCSRCs); |
184 EXPECT_EQ(0U, rtp_header.paddingLength); | 188 EXPECT_EQ(0U, rtp_header.paddingLength); |
185 } | 189 } |
186 | 190 |
| 191 void BuildRtpPacket(uint8_t payload, |
| 192 bool marker_bit, |
| 193 uint32_t timestamp, |
| 194 int64_t capture_time_ms) { |
| 195 packet_ = rtp_sender_->AllocatePacket(false); |
| 196 ASSERT_TRUE(packet_); |
| 197 packet_->SetPayloadType(payload); |
| 198 packet_->SetMarker(marker_bit); |
| 199 packet_->SetTimestamp(timestamp); |
| 200 packet_->set_capture_time_ms(capture_time_ms); |
| 201 ASSERT_TRUE(rtp_sender_->PrepareToSend(packet_.get())); |
| 202 } |
| 203 |
187 void SendPacket(int64_t capture_time_ms, int payload_length) { | 204 void SendPacket(int64_t capture_time_ms, int payload_length) { |
188 uint32_t timestamp = capture_time_ms * 90; | 205 uint32_t timestamp = capture_time_ms * 90; |
189 int32_t rtp_length = rtp_sender_->BuildRtpHeader( | 206 packet_ = rtp_sender_->AllocatePacket(false); |
190 packet_, kPayload, kMarkerBit, timestamp, capture_time_ms); | 207 ASSERT_TRUE(packet_); |
191 ASSERT_GE(rtp_length, 0); | 208 packet_->SetPayloadType(kPayload); |
| 209 packet_->SetMarker(kMarkerBit); |
| 210 packet_->SetTimestamp(timestamp); |
| 211 packet_->set_capture_time_ms(capture_time_ms); |
| 212 packet_->AllocatePayload(payload_length); |
| 213 ASSERT_TRUE(rtp_sender_->PrepareToSend(packet_.get())); |
192 | 214 |
193 // Packet should be stored in a send bucket. | 215 // Packet should be stored in a send bucket. |
194 EXPECT_TRUE(rtp_sender_->SendToNetwork( | 216 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet_), |
195 packet_, payload_length, rtp_length, capture_time_ms, | 217 kAllowRetransmission, |
196 kAllowRetransmission, RtpPacketSender::kNormalPriority)); | 218 RtpPacketSender::kNormalPriority)); |
197 } | 219 } |
198 | 220 |
199 void SendGenericPayload() { | 221 void SendGenericPayload() { |
200 const uint8_t kPayload[] = {47, 11, 32, 93, 89}; | 222 const uint8_t kPayload[] = {47, 11, 32, 93, 89}; |
201 const uint32_t kTimestamp = 1234; | 223 const uint32_t kTimestamp = 1234; |
202 const uint8_t kPayloadType = 127; | 224 const uint8_t kPayloadType = 127; |
203 const int64_t kCaptureTimeMs = fake_clock_.TimeInMilliseconds(); | 225 const int64_t kCaptureTimeMs = fake_clock_.TimeInMilliseconds(); |
204 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC"; | 226 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC"; |
205 EXPECT_EQ(0, rtp_sender_->RegisterPayload(payload_name, kPayloadType, 90000, | 227 EXPECT_EQ(0, rtp_sender_->RegisterPayload(payload_name, kPayloadType, 90000, |
206 0, 1500)); | 228 0, 1500)); |
(...skipping 20 matching lines...) Expand all Loading... |
227 new RTPSenderVideo(&fake_clock_, rtp_sender_.get())); | 249 new RTPSenderVideo(&fake_clock_, rtp_sender_.get())); |
228 } | 250 } |
229 std::unique_ptr<RTPSenderVideo> rtp_sender_video_; | 251 std::unique_ptr<RTPSenderVideo> rtp_sender_video_; |
230 | 252 |
231 void VerifyCVOPacket(uint8_t* data, | 253 void VerifyCVOPacket(uint8_t* data, |
232 size_t len, | 254 size_t len, |
233 bool expect_cvo, | 255 bool expect_cvo, |
234 RtpHeaderExtensionMap* map, | 256 RtpHeaderExtensionMap* map, |
235 uint16_t seq_num, | 257 uint16_t seq_num, |
236 VideoRotation rotation) { | 258 VideoRotation rotation) { |
237 webrtc::RtpUtility::RtpHeaderParser rtp_parser(data, len); | 259 RtpPacketReceived rtp_parsed_packet(map); |
| 260 ASSERT_TRUE(rtp_parsed_packet.Parse(data, len)); |
238 | 261 |
239 webrtc::RTPHeader rtp_header; | 262 EXPECT_EQ(payload_, rtp_parsed_packet.PayloadType()); |
240 size_t length = static_cast<size_t>(rtp_sender_->BuildRtpHeader( | 263 EXPECT_EQ(seq_num, rtp_parsed_packet.SequenceNumber()); |
241 packet_, kPayload, expect_cvo /* marker_bit */, kTimestamp, 0)); | 264 EXPECT_EQ(kTimestamp, rtp_parsed_packet.Timestamp()); |
242 if (expect_cvo) { | 265 EXPECT_EQ(rtp_sender_->SSRC(), rtp_parsed_packet.Ssrc()); |
243 ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionLength(), | 266 EXPECT_TRUE(rtp_parsed_packet.Csrcs().empty()); |
244 length); | 267 EXPECT_EQ(0U, rtp_parsed_packet.padding_size()); |
245 } else { | 268 uint8_t cvo = 0; |
246 ASSERT_EQ(kRtpHeaderSize, length); | 269 EXPECT_EQ(expect_cvo, |
247 } | 270 rtp_parsed_packet.GetExtension<VideoOrientation>(&cvo)); |
248 ASSERT_TRUE(rtp_parser.Parse(&rtp_header, map)); | 271 EXPECT_EQ(ConvertVideoRotationToCVOByte(rotation), cvo); |
249 ASSERT_FALSE(rtp_parser.RTCP()); | |
250 EXPECT_EQ(payload_, rtp_header.payloadType); | |
251 EXPECT_EQ(seq_num, rtp_header.sequenceNumber); | |
252 EXPECT_EQ(kTimestamp, rtp_header.timestamp); | |
253 EXPECT_EQ(rtp_sender_->SSRC(), rtp_header.ssrc); | |
254 EXPECT_EQ(0, rtp_header.numCSRCs); | |
255 EXPECT_EQ(0U, rtp_header.paddingLength); | |
256 EXPECT_EQ(ConvertVideoRotationToCVOByte(rotation), | |
257 rtp_header.extension.videoRotation); | |
258 } | 272 } |
259 }; | 273 }; |
260 | 274 |
261 TEST_F(RtpSenderTestWithoutPacer, | 275 TEST_F(RtpSenderTestWithoutPacer, |
262 RegisterRtpTransmissionTimeOffsetHeaderExtension) { | 276 RegisterRtpTransmissionTimeOffsetHeaderExtension) { |
263 EXPECT_EQ(0u, rtp_sender_->RtpHeaderExtensionLength()); | 277 EXPECT_EQ(0u, rtp_sender_->RtpHeaderExtensionLength()); |
264 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | 278 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( |
265 kRtpExtensionTransmissionTimeOffset, | 279 kRtpExtensionTransmissionTimeOffset, |
266 kTransmissionTimeOffsetExtensionId)); | 280 kTransmissionTimeOffsetExtensionId)); |
267 EXPECT_EQ(kRtpOneByteHeaderLength + kTransmissionTimeOffsetLength, | 281 EXPECT_EQ(kRtpOneByteHeaderLength + kTransmissionTimeOffsetLength, |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
312 kAbsoluteSendTimeLength), | 326 kAbsoluteSendTimeLength), |
313 rtp_sender_->RtpHeaderExtensionLength()); | 327 rtp_sender_->RtpHeaderExtensionLength()); |
314 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAudioLevel, | 328 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAudioLevel, |
315 kAudioLevelExtensionId)); | 329 kAudioLevelExtensionId)); |
316 EXPECT_EQ(RtpUtility::Word32Align( | 330 EXPECT_EQ(RtpUtility::Word32Align( |
317 kRtpOneByteHeaderLength + kTransmissionTimeOffsetLength + | 331 kRtpOneByteHeaderLength + kTransmissionTimeOffsetLength + |
318 kAbsoluteSendTimeLength + kAudioLevelLength), | 332 kAbsoluteSendTimeLength + kAudioLevelLength), |
319 rtp_sender_->RtpHeaderExtensionLength()); | 333 rtp_sender_->RtpHeaderExtensionLength()); |
320 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | 334 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( |
321 kRtpExtensionVideoRotation, kVideoRotationExtensionId)); | 335 kRtpExtensionVideoRotation, kVideoRotationExtensionId)); |
322 EXPECT_TRUE(rtp_sender_->ActivateCVORtpHeaderExtension()); | |
323 EXPECT_EQ(RtpUtility::Word32Align(kRtpOneByteHeaderLength + | 336 EXPECT_EQ(RtpUtility::Word32Align(kRtpOneByteHeaderLength + |
324 kTransmissionTimeOffsetLength + | 337 kTransmissionTimeOffsetLength + |
325 kAbsoluteSendTimeLength + | 338 kAbsoluteSendTimeLength + |
326 kAudioLevelLength + kVideoRotationLength), | 339 kAudioLevelLength + kVideoRotationLength), |
327 rtp_sender_->RtpHeaderExtensionLength()); | 340 rtp_sender_->RtpHeaderExtensionLength()); |
328 | 341 |
329 // Deregister starts. | 342 // Deregister starts. |
330 EXPECT_EQ(0, rtp_sender_->DeregisterRtpHeaderExtension( | 343 EXPECT_EQ(0, rtp_sender_->DeregisterRtpHeaderExtension( |
331 kRtpExtensionTransmissionTimeOffset)); | 344 kRtpExtensionTransmissionTimeOffset)); |
332 EXPECT_EQ(RtpUtility::Word32Align(kRtpOneByteHeaderLength + | 345 EXPECT_EQ(RtpUtility::Word32Align(kRtpOneByteHeaderLength + |
(...skipping 12 matching lines...) Expand all Loading... |
345 rtp_sender_->RtpHeaderExtensionLength()); | 358 rtp_sender_->RtpHeaderExtensionLength()); |
346 EXPECT_EQ( | 359 EXPECT_EQ( |
347 0, rtp_sender_->DeregisterRtpHeaderExtension(kRtpExtensionVideoRotation)); | 360 0, rtp_sender_->DeregisterRtpHeaderExtension(kRtpExtensionVideoRotation)); |
348 EXPECT_EQ(0u, rtp_sender_->RtpHeaderExtensionLength()); | 361 EXPECT_EQ(0u, rtp_sender_->RtpHeaderExtensionLength()); |
349 } | 362 } |
350 | 363 |
351 TEST_F(RtpSenderTestWithoutPacer, RegisterRtpVideoRotationHeaderExtension) { | 364 TEST_F(RtpSenderTestWithoutPacer, RegisterRtpVideoRotationHeaderExtension) { |
352 EXPECT_EQ(0u, rtp_sender_->RtpHeaderExtensionLength()); | 365 EXPECT_EQ(0u, rtp_sender_->RtpHeaderExtensionLength()); |
353 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | 366 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( |
354 kRtpExtensionVideoRotation, kVideoRotationExtensionId)); | 367 kRtpExtensionVideoRotation, kVideoRotationExtensionId)); |
355 EXPECT_EQ(0u, rtp_sender_->RtpHeaderExtensionLength()); | |
356 | |
357 EXPECT_TRUE(rtp_sender_->ActivateCVORtpHeaderExtension()); | |
358 EXPECT_EQ( | 368 EXPECT_EQ( |
359 RtpUtility::Word32Align(kRtpOneByteHeaderLength + kVideoRotationLength), | 369 RtpUtility::Word32Align(kRtpOneByteHeaderLength + kVideoRotationLength), |
360 rtp_sender_->RtpHeaderExtensionLength()); | 370 rtp_sender_->RtpHeaderExtensionLength()); |
361 EXPECT_EQ( | 371 EXPECT_EQ( |
362 0, rtp_sender_->DeregisterRtpHeaderExtension(kRtpExtensionVideoRotation)); | 372 0, rtp_sender_->DeregisterRtpHeaderExtension(kRtpExtensionVideoRotation)); |
363 EXPECT_EQ(0u, rtp_sender_->RtpHeaderExtensionLength()); | 373 EXPECT_EQ(0u, rtp_sender_->RtpHeaderExtensionLength()); |
364 } | 374 } |
365 | 375 |
366 TEST_F(RtpSenderTestWithoutPacer, BuildRTPPacket) { | 376 TEST_F(RtpSenderTestWithoutPacer, BuildRTPPacket) { |
367 size_t length = static_cast<size_t>(rtp_sender_->BuildRtpHeader( | 377 packet_ = rtp_sender_->AllocatePacket(false); |
368 packet_, kPayload, kMarkerBit, kTimestamp, 0)); | 378 packet_->SetMarker(kMarkerBit); |
369 ASSERT_EQ(kRtpHeaderSize, length); | 379 packet_->SetPayloadType(kPayload); |
| 380 packet_->SetTimestamp(kTimestamp); |
| 381 rtp_sender_->PrepareToSend(packet_.get()); |
| 382 ASSERT_EQ(kRtpHeaderSize, packet_->size()); |
370 | 383 |
371 // Verify | 384 // Verify |
372 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length); | 385 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_->data(), |
| 386 packet_->size()); |
373 webrtc::RTPHeader rtp_header; | 387 webrtc::RTPHeader rtp_header; |
374 | 388 |
375 const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, nullptr); | 389 const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, nullptr); |
376 | 390 |
377 ASSERT_TRUE(valid_rtp_header); | 391 ASSERT_TRUE(valid_rtp_header); |
378 ASSERT_FALSE(rtp_parser.RTCP()); | 392 ASSERT_FALSE(rtp_parser.RTCP()); |
379 VerifyRTPHeaderCommon(rtp_header); | 393 VerifyRTPHeaderCommon(rtp_header); |
380 EXPECT_EQ(length, rtp_header.headerLength); | 394 EXPECT_EQ(packet_->size(), rtp_header.headerLength); |
381 EXPECT_FALSE(rtp_header.extension.hasTransmissionTimeOffset); | 395 EXPECT_FALSE(rtp_header.extension.hasTransmissionTimeOffset); |
382 EXPECT_FALSE(rtp_header.extension.hasAbsoluteSendTime); | 396 EXPECT_FALSE(rtp_header.extension.hasAbsoluteSendTime); |
383 EXPECT_FALSE(rtp_header.extension.hasAudioLevel); | 397 EXPECT_FALSE(rtp_header.extension.hasAudioLevel); |
384 EXPECT_EQ(0, rtp_header.extension.transmissionTimeOffset); | 398 EXPECT_EQ(0, rtp_header.extension.transmissionTimeOffset); |
385 EXPECT_EQ(0u, rtp_header.extension.absoluteSendTime); | 399 EXPECT_EQ(0u, rtp_header.extension.absoluteSendTime); |
386 EXPECT_FALSE(rtp_header.extension.voiceActivity); | 400 EXPECT_FALSE(rtp_header.extension.voiceActivity); |
387 EXPECT_EQ(0u, rtp_header.extension.audioLevel); | 401 EXPECT_EQ(0u, rtp_header.extension.audioLevel); |
388 EXPECT_EQ(0u, rtp_header.extension.videoRotation); | 402 EXPECT_EQ(0u, rtp_header.extension.videoRotation); |
389 } | 403 } |
390 | 404 |
391 TEST_F(RtpSenderTestWithoutPacer, | 405 TEST_F(RtpSenderTestWithoutPacer, |
392 BuildRTPPacketWithTransmissionOffsetExtension) { | 406 BuildRTPPacketWithTransmissionOffsetExtension) { |
393 EXPECT_EQ(0, rtp_sender_->SetTransmissionTimeOffset(kTimeOffset)); | |
394 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | 407 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( |
395 kRtpExtensionTransmissionTimeOffset, | 408 kRtpExtensionTransmissionTimeOffset, |
396 kTransmissionTimeOffsetExtensionId)); | 409 kTransmissionTimeOffsetExtensionId)); |
397 | 410 |
398 size_t length = static_cast<size_t>(rtp_sender_->BuildRtpHeader( | 411 packet_ = rtp_sender_->AllocatePacket(false); |
399 packet_, kPayload, kMarkerBit, kTimestamp, 0)); | 412 packet_->SetPayloadType(kPayload); |
400 ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionLength(), length); | 413 packet_->SetMarker(kMarkerBit); |
| 414 packet_->SetTimestamp(kTimestamp); |
| 415 rtp_sender_->PrepareToSend(packet_.get()); |
| 416 ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionLength(), |
| 417 packet_->size()); |
| 418 EXPECT_TRUE(packet_->SetExtension<TransmissionOffset>(kTimeOffset)); |
401 | 419 |
402 // Verify | 420 // Verify |
403 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length); | 421 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_->data(), |
| 422 packet_->size()); |
404 webrtc::RTPHeader rtp_header; | 423 webrtc::RTPHeader rtp_header; |
405 | 424 |
406 RtpHeaderExtensionMap map; | 425 RtpHeaderExtensionMap map; |
407 map.Register(kRtpExtensionTransmissionTimeOffset, | 426 map.Register(kRtpExtensionTransmissionTimeOffset, |
408 kTransmissionTimeOffsetExtensionId); | 427 kTransmissionTimeOffsetExtensionId); |
409 const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map); | 428 const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map); |
410 | 429 |
411 ASSERT_TRUE(valid_rtp_header); | 430 ASSERT_TRUE(valid_rtp_header); |
412 ASSERT_FALSE(rtp_parser.RTCP()); | 431 ASSERT_FALSE(rtp_parser.RTCP()); |
413 VerifyRTPHeaderCommon(rtp_header); | 432 VerifyRTPHeaderCommon(rtp_header); |
414 EXPECT_EQ(length, rtp_header.headerLength); | 433 EXPECT_EQ(packet_->size(), rtp_header.headerLength); |
415 EXPECT_TRUE(rtp_header.extension.hasTransmissionTimeOffset); | 434 EXPECT_TRUE(rtp_header.extension.hasTransmissionTimeOffset); |
416 EXPECT_EQ(kTimeOffset, rtp_header.extension.transmissionTimeOffset); | 435 EXPECT_EQ(kTimeOffset, rtp_header.extension.transmissionTimeOffset); |
417 | 436 |
418 // Parse without map extension | 437 // Parse without map extension |
419 webrtc::RTPHeader rtp_header2; | 438 webrtc::RTPHeader rtp_header2; |
420 const bool valid_rtp_header2 = rtp_parser.Parse(&rtp_header2, nullptr); | 439 const bool valid_rtp_header2 = rtp_parser.Parse(&rtp_header2, nullptr); |
421 | 440 |
422 ASSERT_TRUE(valid_rtp_header2); | 441 ASSERT_TRUE(valid_rtp_header2); |
423 VerifyRTPHeaderCommon(rtp_header2); | 442 VerifyRTPHeaderCommon(rtp_header2); |
424 EXPECT_EQ(length, rtp_header2.headerLength); | 443 EXPECT_EQ(packet_->size(), rtp_header2.headerLength); |
425 EXPECT_FALSE(rtp_header2.extension.hasTransmissionTimeOffset); | 444 EXPECT_FALSE(rtp_header2.extension.hasTransmissionTimeOffset); |
426 EXPECT_EQ(0, rtp_header2.extension.transmissionTimeOffset); | 445 EXPECT_EQ(0, rtp_header2.extension.transmissionTimeOffset); |
427 } | 446 } |
428 | 447 |
429 TEST_F(RtpSenderTestWithoutPacer, | 448 TEST_F(RtpSenderTestWithoutPacer, |
430 BuildRTPPacketWithNegativeTransmissionOffsetExtension) { | 449 BuildRTPPacketWithNegativeTransmissionOffsetExtension) { |
431 const int kNegTimeOffset = -500; | 450 const int kNegTimeOffset = -500; |
432 EXPECT_EQ(0, rtp_sender_->SetTransmissionTimeOffset(kNegTimeOffset)); | |
433 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | 451 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( |
434 kRtpExtensionTransmissionTimeOffset, | 452 kRtpExtensionTransmissionTimeOffset, |
435 kTransmissionTimeOffsetExtensionId)); | 453 kTransmissionTimeOffsetExtensionId)); |
436 | 454 |
437 size_t length = static_cast<size_t>(rtp_sender_->BuildRtpHeader( | 455 BuildRtpPacket(kPayload, kMarkerBit, kTimestamp, 0); |
438 packet_, kPayload, kMarkerBit, kTimestamp, 0)); | 456 ASSERT_TRUE(packet_->SetExtension<TransmissionOffset>(kNegTimeOffset)); |
439 ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionLength(), length); | 457 ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionLength(), |
| 458 packet_->size()); |
440 | 459 |
441 // Verify | 460 // Verify |
442 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length); | 461 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_->data(), |
| 462 packet_->size()); |
443 webrtc::RTPHeader rtp_header; | 463 webrtc::RTPHeader rtp_header; |
444 | 464 |
445 RtpHeaderExtensionMap map; | 465 RtpHeaderExtensionMap map; |
446 map.Register(kRtpExtensionTransmissionTimeOffset, | 466 map.Register(kRtpExtensionTransmissionTimeOffset, |
447 kTransmissionTimeOffsetExtensionId); | 467 kTransmissionTimeOffsetExtensionId); |
448 const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map); | 468 const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map); |
449 | 469 |
450 ASSERT_TRUE(valid_rtp_header); | 470 ASSERT_TRUE(valid_rtp_header); |
451 ASSERT_FALSE(rtp_parser.RTCP()); | 471 ASSERT_FALSE(rtp_parser.RTCP()); |
452 VerifyRTPHeaderCommon(rtp_header); | 472 VerifyRTPHeaderCommon(rtp_header); |
453 EXPECT_EQ(length, rtp_header.headerLength); | 473 EXPECT_EQ(packet_->size(), rtp_header.headerLength); |
454 EXPECT_TRUE(rtp_header.extension.hasTransmissionTimeOffset); | 474 EXPECT_TRUE(rtp_header.extension.hasTransmissionTimeOffset); |
455 EXPECT_EQ(kNegTimeOffset, rtp_header.extension.transmissionTimeOffset); | 475 EXPECT_EQ(kNegTimeOffset, rtp_header.extension.transmissionTimeOffset); |
456 } | 476 } |
457 | 477 |
458 TEST_F(RtpSenderTestWithoutPacer, BuildRTPPacketWithAbsoluteSendTimeExtension) { | 478 TEST_F(RtpSenderTestWithoutPacer, BuildRTPPacketWithAbsoluteSendTimeExtension) { |
459 EXPECT_EQ(0, rtp_sender_->SetAbsoluteSendTime(kAbsoluteSendTime)); | |
460 EXPECT_EQ( | 479 EXPECT_EQ( |
461 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, | 480 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, |
462 kAbsoluteSendTimeExtensionId)); | 481 kAbsoluteSendTimeExtensionId)); |
463 | 482 |
464 size_t length = static_cast<size_t>(rtp_sender_->BuildRtpHeader( | 483 BuildRtpPacket(kPayload, kMarkerBit, kTimestamp, 0); |
465 packet_, kPayload, kMarkerBit, kTimestamp, 0)); | 484 ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionLength(), |
466 ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionLength(), length); | 485 packet_->size()); |
| 486 ASSERT_TRUE(packet_->SetExtension<AbsoluteSendTime>(kAbsoluteSendTimeMs)); |
467 | 487 |
468 // Verify | 488 // Verify |
469 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length); | 489 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_->data(), |
| 490 packet_->size()); |
470 webrtc::RTPHeader rtp_header; | 491 webrtc::RTPHeader rtp_header; |
471 | 492 |
472 RtpHeaderExtensionMap map; | 493 RtpHeaderExtensionMap map; |
473 map.Register(kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId); | 494 map.Register(kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId); |
474 const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map); | 495 const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map); |
475 | 496 |
476 ASSERT_TRUE(valid_rtp_header); | 497 ASSERT_TRUE(valid_rtp_header); |
477 ASSERT_FALSE(rtp_parser.RTCP()); | 498 ASSERT_FALSE(rtp_parser.RTCP()); |
478 VerifyRTPHeaderCommon(rtp_header); | 499 VerifyRTPHeaderCommon(rtp_header); |
479 EXPECT_EQ(length, rtp_header.headerLength); | 500 EXPECT_EQ(packet_->size(), rtp_header.headerLength); |
480 EXPECT_TRUE(rtp_header.extension.hasAbsoluteSendTime); | 501 EXPECT_TRUE(rtp_header.extension.hasAbsoluteSendTime); |
481 EXPECT_EQ(kAbsoluteSendTime, rtp_header.extension.absoluteSendTime); | 502 EXPECT_EQ(kAbsoluteSendTime, rtp_header.extension.absoluteSendTime); |
482 | 503 |
483 // Parse without map extension | 504 // Parse without map extension |
484 webrtc::RTPHeader rtp_header2; | 505 webrtc::RTPHeader rtp_header2; |
485 const bool valid_rtp_header2 = rtp_parser.Parse(&rtp_header2, nullptr); | 506 const bool valid_rtp_header2 = rtp_parser.Parse(&rtp_header2, nullptr); |
486 | 507 |
487 ASSERT_TRUE(valid_rtp_header2); | 508 ASSERT_TRUE(valid_rtp_header2); |
488 VerifyRTPHeaderCommon(rtp_header2); | 509 VerifyRTPHeaderCommon(rtp_header2); |
489 EXPECT_EQ(length, rtp_header2.headerLength); | 510 EXPECT_EQ(packet_->size(), rtp_header2.headerLength); |
490 EXPECT_FALSE(rtp_header2.extension.hasAbsoluteSendTime); | 511 EXPECT_FALSE(rtp_header2.extension.hasAbsoluteSendTime); |
491 EXPECT_EQ(0u, rtp_header2.extension.absoluteSendTime); | 512 EXPECT_EQ(0u, rtp_header2.extension.absoluteSendTime); |
492 } | 513 } |
493 | 514 |
494 TEST_F(RtpSenderTestWithoutPacer, SendsPacketsWithTransportSequenceNumber) { | 515 TEST_F(RtpSenderTestWithoutPacer, SendsPacketsWithTransportSequenceNumber) { |
495 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | 516 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( |
496 kRtpExtensionTransportSequenceNumber, | 517 kRtpExtensionTransportSequenceNumber, |
497 kTransportSequenceNumberExtensionId)); | 518 kTransportSequenceNumberExtensionId)); |
498 | 519 |
499 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber()) | 520 EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber()) |
(...skipping 30 matching lines...) Expand all Loading... |
530 .WillOnce(testing::Return(kTransportSequenceNumber)); | 551 .WillOnce(testing::Return(kTransportSequenceNumber)); |
531 EXPECT_CALL(send_packet_observer_, | 552 EXPECT_CALL(send_packet_observer_, |
532 OnSendPacket(kTransportSequenceNumber, _, _)) | 553 OnSendPacket(kTransportSequenceNumber, _, _)) |
533 .Times(1); | 554 .Times(1); |
534 | 555 |
535 SendGenericPayload(); | 556 SendGenericPayload(); |
536 } | 557 } |
537 | 558 |
538 // Test CVO header extension is only set when marker bit is true. | 559 // Test CVO header extension is only set when marker bit is true. |
539 TEST_F(RtpSenderTestWithoutPacer, BuildRTPPacketWithVideoRotation_MarkerBit) { | 560 TEST_F(RtpSenderTestWithoutPacer, BuildRTPPacketWithVideoRotation_MarkerBit) { |
540 rtp_sender_->SetVideoRotation(kRotation); | |
541 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | 561 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( |
542 kRtpExtensionVideoRotation, kVideoRotationExtensionId)); | 562 kRtpExtensionVideoRotation, kVideoRotationExtensionId)); |
543 EXPECT_TRUE(rtp_sender_->ActivateCVORtpHeaderExtension()); | |
544 | 563 |
545 RtpHeaderExtensionMap map; | 564 RtpHeaderExtensionMap map; |
546 map.Register(kRtpExtensionVideoRotation, kVideoRotationExtensionId); | 565 map.Register(kRtpExtensionVideoRotation, kVideoRotationExtensionId); |
547 | 566 |
548 size_t length = static_cast<size_t>( | 567 BuildRtpPacket(kPayload, true, kTimestamp, 0); |
549 rtp_sender_->BuildRtpHeader(packet_, kPayload, true, kTimestamp, 0)); | 568 ASSERT_TRUE(packet_->SetExtension<VideoOrientation>(kRotation)); |
550 ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionLength(), length); | 569 ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionLength(), |
| 570 packet_->size()); |
551 | 571 |
552 // Verify | 572 // Verify |
553 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length); | 573 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_->data(), |
| 574 packet_->size()); |
554 webrtc::RTPHeader rtp_header; | 575 webrtc::RTPHeader rtp_header; |
555 | 576 |
556 ASSERT_TRUE(rtp_parser.Parse(&rtp_header, &map)); | 577 ASSERT_TRUE(rtp_parser.Parse(&rtp_header, &map)); |
557 ASSERT_FALSE(rtp_parser.RTCP()); | 578 ASSERT_FALSE(rtp_parser.RTCP()); |
558 VerifyRTPHeaderCommon(rtp_header); | 579 VerifyRTPHeaderCommon(rtp_header); |
559 EXPECT_EQ(length, rtp_header.headerLength); | 580 EXPECT_EQ(packet_->size(), rtp_header.headerLength); |
560 EXPECT_TRUE(rtp_header.extension.hasVideoRotation); | 581 EXPECT_TRUE(rtp_header.extension.hasVideoRotation); |
561 EXPECT_EQ(ConvertVideoRotationToCVOByte(kRotation), | 582 EXPECT_EQ(ConvertVideoRotationToCVOByte(kRotation), |
562 rtp_header.extension.videoRotation); | 583 rtp_header.extension.videoRotation); |
563 } | 584 } |
564 | 585 |
565 // Test CVO header extension is not set when marker bit is false. | 586 // Test CVO header extension is not set when marker bit is false. |
566 TEST_F(RtpSenderTestWithoutPacer, | 587 TEST_F(RtpSenderTestWithoutPacer, |
567 DISABLED_BuildRTPPacketWithVideoRotation_NoMarkerBit) { | 588 DISABLED_BuildRTPPacketWithVideoRotation_NoMarkerBit) { |
568 rtp_sender_->SetVideoRotation(kRotation); | |
569 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | 589 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( |
570 kRtpExtensionVideoRotation, kVideoRotationExtensionId)); | 590 kRtpExtensionVideoRotation, kVideoRotationExtensionId)); |
571 EXPECT_TRUE(rtp_sender_->ActivateCVORtpHeaderExtension()); | |
572 | 591 |
573 RtpHeaderExtensionMap map; | 592 RtpHeaderExtensionMap map; |
574 map.Register(kRtpExtensionVideoRotation, kVideoRotationExtensionId); | 593 map.Register(kRtpExtensionVideoRotation, kVideoRotationExtensionId); |
575 | 594 |
576 size_t length = static_cast<size_t>( | 595 BuildRtpPacket(kPayload, false, kTimestamp, 0); |
577 rtp_sender_->BuildRtpHeader(packet_, kPayload, false, kTimestamp, 0)); | 596 ASSERT_EQ(kRtpHeaderSize, packet_->size()); |
578 ASSERT_EQ(kRtpHeaderSize, length); | 597 ASSERT_TRUE(packet_->SetExtension<VideoOrientation>(kRotation)); |
579 | 598 |
580 // Verify | 599 // Verify |
581 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length); | 600 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_->data(), |
| 601 packet_->size()); |
582 webrtc::RTPHeader rtp_header; | 602 webrtc::RTPHeader rtp_header; |
583 | 603 |
584 ASSERT_TRUE(rtp_parser.Parse(&rtp_header, &map)); | 604 ASSERT_TRUE(rtp_parser.Parse(&rtp_header, &map)); |
585 ASSERT_FALSE(rtp_parser.RTCP()); | 605 ASSERT_FALSE(rtp_parser.RTCP()); |
586 VerifyRTPHeaderCommon(rtp_header, false); | 606 VerifyRTPHeaderCommon(rtp_header, false); |
587 EXPECT_EQ(length, rtp_header.headerLength); | 607 EXPECT_EQ(packet_->size(), rtp_header.headerLength); |
588 EXPECT_FALSE(rtp_header.extension.hasVideoRotation); | 608 EXPECT_FALSE(rtp_header.extension.hasVideoRotation); |
589 } | 609 } |
590 | 610 |
591 TEST_F(RtpSenderTestWithoutPacer, BuildRTPPacketWithAudioLevelExtension) { | 611 TEST_F(RtpSenderTestWithoutPacer, BuildRTPPacketWithAudioLevelExtension) { |
592 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAudioLevel, | 612 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAudioLevel, |
593 kAudioLevelExtensionId)); | 613 kAudioLevelExtensionId)); |
594 | 614 |
595 size_t length = static_cast<size_t>(rtp_sender_->BuildRtpHeader( | 615 BuildRtpPacket(kPayload, kMarkerBit, kTimestamp, 0); |
596 packet_, kPayload, kMarkerBit, kTimestamp, 0)); | 616 packet_->SetExtension<AudioLevel>(true, kAudioLevel); |
597 ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionLength(), length); | 617 ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionLength(), |
| 618 packet_->size()); |
598 | 619 |
599 // Verify | 620 // Verify |
600 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length); | 621 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_->data(), |
| 622 packet_->size()); |
601 webrtc::RTPHeader rtp_header; | 623 webrtc::RTPHeader rtp_header; |
602 | 624 |
603 // Updating audio level is done in RTPSenderAudio, so simulate it here. | 625 // Updating audio level is done in RTPSenderAudio, so simulate it here. |
604 rtp_parser.Parse(&rtp_header); | 626 rtp_parser.Parse(&rtp_header); |
605 rtp_sender_->UpdateAudioLevel(packet_, length, rtp_header, true, kAudioLevel); | |
606 | 627 |
607 RtpHeaderExtensionMap map; | 628 RtpHeaderExtensionMap map; |
608 map.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId); | 629 map.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId); |
609 const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map); | 630 const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map); |
610 | 631 |
611 ASSERT_TRUE(valid_rtp_header); | 632 ASSERT_TRUE(valid_rtp_header); |
612 ASSERT_FALSE(rtp_parser.RTCP()); | 633 ASSERT_FALSE(rtp_parser.RTCP()); |
613 VerifyRTPHeaderCommon(rtp_header); | 634 VerifyRTPHeaderCommon(rtp_header); |
614 EXPECT_EQ(length, rtp_header.headerLength); | 635 EXPECT_EQ(packet_->size(), rtp_header.headerLength); |
615 EXPECT_TRUE(rtp_header.extension.hasAudioLevel); | 636 EXPECT_TRUE(rtp_header.extension.hasAudioLevel); |
616 EXPECT_TRUE(rtp_header.extension.voiceActivity); | 637 EXPECT_TRUE(rtp_header.extension.voiceActivity); |
617 EXPECT_EQ(kAudioLevel, rtp_header.extension.audioLevel); | 638 EXPECT_EQ(kAudioLevel, rtp_header.extension.audioLevel); |
618 | 639 |
619 // Parse without map extension | 640 // Parse without map extension |
620 webrtc::RTPHeader rtp_header2; | 641 webrtc::RTPHeader rtp_header2; |
621 const bool valid_rtp_header2 = rtp_parser.Parse(&rtp_header2, nullptr); | 642 const bool valid_rtp_header2 = rtp_parser.Parse(&rtp_header2, nullptr); |
622 | 643 |
623 ASSERT_TRUE(valid_rtp_header2); | 644 ASSERT_TRUE(valid_rtp_header2); |
624 VerifyRTPHeaderCommon(rtp_header2); | 645 VerifyRTPHeaderCommon(rtp_header2); |
625 EXPECT_EQ(length, rtp_header2.headerLength); | 646 EXPECT_EQ(packet_->size(), rtp_header2.headerLength); |
626 EXPECT_FALSE(rtp_header2.extension.hasAudioLevel); | 647 EXPECT_FALSE(rtp_header2.extension.hasAudioLevel); |
627 EXPECT_FALSE(rtp_header2.extension.voiceActivity); | 648 EXPECT_FALSE(rtp_header2.extension.voiceActivity); |
628 EXPECT_EQ(0u, rtp_header2.extension.audioLevel); | 649 EXPECT_EQ(0u, rtp_header2.extension.audioLevel); |
629 } | 650 } |
630 | 651 |
631 TEST_F(RtpSenderTestWithoutPacer, | 652 TEST_F(RtpSenderTestWithoutPacer, |
632 BuildRTPPacketWithCSRCAndAudioLevelExtension) { | 653 BuildRTPPacketWithCSRCAndAudioLevelExtension) { |
633 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAudioLevel, | 654 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAudioLevel, |
634 kAudioLevelExtensionId)); | 655 kAudioLevelExtensionId)); |
635 std::vector<uint32_t> csrcs; | 656 std::vector<uint32_t> csrcs; |
636 csrcs.push_back(0x23456789); | 657 csrcs.push_back(0x23456789); |
637 rtp_sender_->SetCsrcs(csrcs); | 658 rtp_sender_->SetCsrcs(csrcs); |
638 size_t length = static_cast<size_t>(rtp_sender_->BuildRtpHeader( | 659 BuildRtpPacket(kPayload, kMarkerBit, kTimestamp, 0); |
639 packet_, kPayload, kMarkerBit, kTimestamp, 0)); | 660 EXPECT_TRUE(packet_->SetExtension<AudioLevel>(true, kAudioLevel)); |
640 | 661 |
641 // Verify | 662 // Verify |
642 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length); | 663 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_->data(), |
| 664 packet_->size()); |
643 webrtc::RTPHeader rtp_header; | 665 webrtc::RTPHeader rtp_header; |
644 | 666 |
645 // Updating audio level is done in RTPSenderAudio, so simulate it here. | 667 // Updating audio level is done in RTPSenderAudio, so simulate it here. |
646 rtp_parser.Parse(&rtp_header); | 668 rtp_parser.Parse(&rtp_header); |
647 EXPECT_TRUE(rtp_sender_->UpdateAudioLevel(packet_, length, rtp_header, true, | |
648 kAudioLevel)); | |
649 | 669 |
650 RtpHeaderExtensionMap map; | 670 RtpHeaderExtensionMap map; |
651 map.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId); | 671 map.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId); |
652 const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map); | 672 const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map); |
653 | 673 |
654 ASSERT_TRUE(valid_rtp_header); | 674 ASSERT_TRUE(valid_rtp_header); |
655 ASSERT_FALSE(rtp_parser.RTCP()); | 675 ASSERT_FALSE(rtp_parser.RTCP()); |
656 VerifyRTPHeaderCommon(rtp_header, kMarkerBit, csrcs.size()); | 676 VerifyRTPHeaderCommon(rtp_header, kMarkerBit, csrcs.size()); |
657 EXPECT_EQ(length, rtp_header.headerLength); | 677 EXPECT_EQ(packet_->size(), rtp_header.headerLength); |
658 EXPECT_TRUE(rtp_header.extension.hasAudioLevel); | 678 EXPECT_TRUE(rtp_header.extension.hasAudioLevel); |
659 EXPECT_TRUE(rtp_header.extension.voiceActivity); | 679 EXPECT_TRUE(rtp_header.extension.voiceActivity); |
660 EXPECT_EQ(kAudioLevel, rtp_header.extension.audioLevel); | 680 EXPECT_EQ(kAudioLevel, rtp_header.extension.audioLevel); |
661 EXPECT_EQ(1u, rtp_header.numCSRCs); | 681 EXPECT_EQ(1u, rtp_header.numCSRCs); |
662 EXPECT_EQ(csrcs[0], rtp_header.arrOfCSRCs[0]); | 682 EXPECT_EQ(csrcs[0], rtp_header.arrOfCSRCs[0]); |
663 } | 683 } |
664 | 684 |
665 TEST_F(RtpSenderTestWithoutPacer, BuildRTPPacketWithHeaderExtensions) { | 685 TEST_F(RtpSenderTestWithoutPacer, BuildRTPPacketWithHeaderExtensions) { |
666 EXPECT_EQ(0, rtp_sender_->SetTransmissionTimeOffset(kTimeOffset)); | |
667 EXPECT_EQ(0, rtp_sender_->SetAbsoluteSendTime(kAbsoluteSendTime)); | |
668 EXPECT_EQ(0, | |
669 rtp_sender_->SetTransportSequenceNumber(kTransportSequenceNumber)); | |
670 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | 686 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( |
671 kRtpExtensionTransmissionTimeOffset, | 687 kRtpExtensionTransmissionTimeOffset, |
672 kTransmissionTimeOffsetExtensionId)); | 688 kTransmissionTimeOffsetExtensionId)); |
673 EXPECT_EQ( | 689 EXPECT_EQ( |
674 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, | 690 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, |
675 kAbsoluteSendTimeExtensionId)); | 691 kAbsoluteSendTimeExtensionId)); |
676 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAudioLevel, | 692 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAudioLevel, |
677 kAudioLevelExtensionId)); | 693 kAudioLevelExtensionId)); |
678 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | 694 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( |
679 kRtpExtensionTransportSequenceNumber, | 695 kRtpExtensionTransportSequenceNumber, |
680 kTransportSequenceNumberExtensionId)); | 696 kTransportSequenceNumberExtensionId)); |
681 | 697 |
682 size_t length = static_cast<size_t>(rtp_sender_->BuildRtpHeader( | 698 BuildRtpPacket(kPayload, kMarkerBit, kTimestamp, 0); |
683 packet_, kPayload, kMarkerBit, kTimestamp, 0)); | 699 packet_->SetExtension<AudioLevel>(true, kAudioLevel); |
684 ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionLength(), length); | 700 packet_->SetExtension<TransmissionOffset>(kTimeOffset); |
| 701 packet_->SetExtension<AbsoluteSendTime>(kAbsoluteSendTimeMs); |
| 702 packet_->SetExtension<TransportSequenceNumber>(kTransportSequenceNumber); |
| 703 ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionLength(), |
| 704 packet_->size()); |
685 | 705 |
686 // Verify | 706 // Verify |
687 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length); | 707 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_->data(), |
| 708 packet_->size()); |
688 webrtc::RTPHeader rtp_header; | 709 webrtc::RTPHeader rtp_header; |
689 | 710 |
690 // Updating audio level is done in RTPSenderAudio, so simulate it here. | 711 // Updating audio level is done in RTPSenderAudio, so simulate it here. |
691 rtp_parser.Parse(&rtp_header); | 712 rtp_parser.Parse(&rtp_header); |
692 rtp_sender_->UpdateAudioLevel(packet_, length, rtp_header, true, kAudioLevel); | |
693 | 713 |
694 RtpHeaderExtensionMap map; | 714 RtpHeaderExtensionMap map; |
695 map.Register(kRtpExtensionTransmissionTimeOffset, | 715 map.Register(kRtpExtensionTransmissionTimeOffset, |
696 kTransmissionTimeOffsetExtensionId); | 716 kTransmissionTimeOffsetExtensionId); |
697 map.Register(kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId); | 717 map.Register(kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId); |
698 map.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId); | 718 map.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId); |
699 map.Register(kRtpExtensionTransportSequenceNumber, | 719 map.Register(kRtpExtensionTransportSequenceNumber, |
700 kTransportSequenceNumberExtensionId); | 720 kTransportSequenceNumberExtensionId); |
701 const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map); | 721 const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map); |
702 | 722 |
703 ASSERT_TRUE(valid_rtp_header); | 723 ASSERT_TRUE(valid_rtp_header); |
704 ASSERT_FALSE(rtp_parser.RTCP()); | 724 ASSERT_FALSE(rtp_parser.RTCP()); |
705 VerifyRTPHeaderCommon(rtp_header); | 725 VerifyRTPHeaderCommon(rtp_header); |
706 EXPECT_EQ(length, rtp_header.headerLength); | 726 EXPECT_EQ(packet_->size(), rtp_header.headerLength); |
707 EXPECT_TRUE(rtp_header.extension.hasTransmissionTimeOffset); | 727 EXPECT_TRUE(rtp_header.extension.hasTransmissionTimeOffset); |
708 EXPECT_TRUE(rtp_header.extension.hasAbsoluteSendTime); | 728 EXPECT_TRUE(rtp_header.extension.hasAbsoluteSendTime); |
709 EXPECT_TRUE(rtp_header.extension.hasAudioLevel); | 729 EXPECT_TRUE(rtp_header.extension.hasAudioLevel); |
710 EXPECT_TRUE(rtp_header.extension.hasTransportSequenceNumber); | 730 EXPECT_TRUE(rtp_header.extension.hasTransportSequenceNumber); |
711 EXPECT_EQ(kTimeOffset, rtp_header.extension.transmissionTimeOffset); | 731 EXPECT_EQ(kTimeOffset, rtp_header.extension.transmissionTimeOffset); |
712 EXPECT_EQ(kAbsoluteSendTime, rtp_header.extension.absoluteSendTime); | 732 EXPECT_EQ(kAbsoluteSendTime, rtp_header.extension.absoluteSendTime); |
713 EXPECT_TRUE(rtp_header.extension.voiceActivity); | 733 EXPECT_TRUE(rtp_header.extension.voiceActivity); |
714 EXPECT_EQ(kAudioLevel, rtp_header.extension.audioLevel); | 734 EXPECT_EQ(kAudioLevel, rtp_header.extension.audioLevel); |
715 EXPECT_EQ(kTransportSequenceNumber, | 735 EXPECT_EQ(kTransportSequenceNumber, |
716 rtp_header.extension.transportSequenceNumber); | 736 rtp_header.extension.transportSequenceNumber); |
717 | 737 |
718 // Parse without map extension | 738 // Parse without map extension |
719 webrtc::RTPHeader rtp_header2; | 739 webrtc::RTPHeader rtp_header2; |
720 const bool valid_rtp_header2 = rtp_parser.Parse(&rtp_header2, nullptr); | 740 const bool valid_rtp_header2 = rtp_parser.Parse(&rtp_header2, nullptr); |
721 | 741 |
722 ASSERT_TRUE(valid_rtp_header2); | 742 ASSERT_TRUE(valid_rtp_header2); |
723 VerifyRTPHeaderCommon(rtp_header2); | 743 VerifyRTPHeaderCommon(rtp_header2); |
724 EXPECT_EQ(length, rtp_header2.headerLength); | 744 EXPECT_EQ(packet_->size(), rtp_header2.headerLength); |
725 EXPECT_FALSE(rtp_header2.extension.hasTransmissionTimeOffset); | 745 EXPECT_FALSE(rtp_header2.extension.hasTransmissionTimeOffset); |
726 EXPECT_FALSE(rtp_header2.extension.hasAbsoluteSendTime); | 746 EXPECT_FALSE(rtp_header2.extension.hasAbsoluteSendTime); |
727 EXPECT_FALSE(rtp_header2.extension.hasAudioLevel); | 747 EXPECT_FALSE(rtp_header2.extension.hasAudioLevel); |
728 EXPECT_FALSE(rtp_header2.extension.hasTransportSequenceNumber); | 748 EXPECT_FALSE(rtp_header2.extension.hasTransportSequenceNumber); |
729 | 749 |
730 EXPECT_EQ(0, rtp_header2.extension.transmissionTimeOffset); | 750 EXPECT_EQ(0, rtp_header2.extension.transmissionTimeOffset); |
731 EXPECT_EQ(0u, rtp_header2.extension.absoluteSendTime); | 751 EXPECT_EQ(0u, rtp_header2.extension.absoluteSendTime); |
732 EXPECT_FALSE(rtp_header2.extension.voiceActivity); | 752 EXPECT_FALSE(rtp_header2.extension.voiceActivity); |
733 EXPECT_EQ(0u, rtp_header2.extension.audioLevel); | 753 EXPECT_EQ(0u, rtp_header2.extension.audioLevel); |
734 EXPECT_EQ(0u, rtp_header2.extension.transportSequenceNumber); | 754 EXPECT_EQ(0u, rtp_header2.extension.transportSequenceNumber); |
735 } | 755 } |
736 | 756 |
737 TEST_F(RtpSenderTest, TrafficSmoothingWithExtensions) { | 757 TEST_F(RtpSenderTest, TrafficSmoothingWithExtensions) { |
738 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority, | 758 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority, |
739 _, kSeqNum, _, _, _)); | 759 _, kSeqNum, _, _, _)); |
740 EXPECT_CALL(mock_rtc_event_log_, | 760 EXPECT_CALL(mock_rtc_event_log_, |
741 LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _)); | 761 LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _)); |
742 | 762 |
743 rtp_sender_->SetStorePacketsStatus(true, 10); | 763 rtp_sender_->SetStorePacketsStatus(true, 10); |
744 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | 764 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( |
745 kRtpExtensionTransmissionTimeOffset, | 765 kRtpExtensionTransmissionTimeOffset, |
746 kTransmissionTimeOffsetExtensionId)); | 766 kTransmissionTimeOffsetExtensionId)); |
747 EXPECT_EQ( | 767 EXPECT_EQ( |
748 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, | 768 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, |
749 kAbsoluteSendTimeExtensionId)); | 769 kAbsoluteSendTimeExtensionId)); |
750 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds(); | 770 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds(); |
751 int rtp_length_int = rtp_sender_->BuildRtpHeader( | 771 BuildRtpPacket(kPayload, kMarkerBit, kTimestamp, capture_time_ms); |
752 packet_, kPayload, kMarkerBit, kTimestamp, capture_time_ms); | 772 size_t packet_size = packet_->size(); |
753 ASSERT_NE(-1, rtp_length_int); | |
754 size_t rtp_length = static_cast<size_t>(rtp_length_int); | |
755 | 773 |
756 // Packet should be stored in a send bucket. | 774 // Packet should be stored in a send bucket. |
757 EXPECT_TRUE(rtp_sender_->SendToNetwork(packet_, 0, rtp_length, | 775 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet_), |
758 capture_time_ms, kAllowRetransmission, | 776 kAllowRetransmission, |
759 RtpPacketSender::kNormalPriority)); | 777 RtpPacketSender::kNormalPriority)); |
760 | 778 |
761 EXPECT_EQ(0, transport_.packets_sent_); | 779 EXPECT_EQ(0, transport_.packets_sent_); |
762 | 780 |
763 const int kStoredTimeInMs = 100; | 781 const int kStoredTimeInMs = 100; |
764 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs); | 782 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs); |
765 | 783 |
766 rtp_sender_->TimeToSendPacket(kSeqNum, capture_time_ms, false, | 784 rtp_sender_->TimeToSendPacket(kSeqNum, capture_time_ms, false, |
767 PacketInfo::kNotAProbe); | 785 PacketInfo::kNotAProbe); |
768 | 786 |
769 // Process send bucket. Packet should now be sent. | 787 // Process send bucket. Packet should now be sent. |
770 EXPECT_EQ(1, transport_.packets_sent_); | 788 EXPECT_EQ(1, transport_.packets_sent_); |
771 EXPECT_EQ(rtp_length, transport_.last_sent_packet_len_); | 789 EXPECT_EQ(packet_size, transport_.last_sent_packet_len_); |
772 // Parse sent packet. | 790 // Parse sent packet. |
773 webrtc::RtpUtility::RtpHeaderParser rtp_parser(transport_.last_sent_packet_, | 791 webrtc::RtpUtility::RtpHeaderParser rtp_parser(transport_.last_sent_packet_, |
774 rtp_length); | 792 packet_size); |
775 webrtc::RTPHeader rtp_header; | 793 webrtc::RTPHeader rtp_header; |
776 RtpHeaderExtensionMap map; | 794 RtpHeaderExtensionMap map; |
777 map.Register(kRtpExtensionTransmissionTimeOffset, | 795 map.Register(kRtpExtensionTransmissionTimeOffset, |
778 kTransmissionTimeOffsetExtensionId); | 796 kTransmissionTimeOffsetExtensionId); |
779 map.Register(kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId); | 797 map.Register(kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId); |
780 const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map); | 798 const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map); |
781 ASSERT_TRUE(valid_rtp_header); | 799 ASSERT_TRUE(valid_rtp_header); |
782 | 800 |
783 // Verify transmission time offset. | 801 // Verify transmission time offset. |
784 EXPECT_EQ(kStoredTimeInMs * 90, rtp_header.extension.transmissionTimeOffset); | 802 EXPECT_EQ(kStoredTimeInMs * 90, rtp_header.extension.transmissionTimeOffset); |
785 uint64_t expected_send_time = | 803 uint64_t expected_send_time = |
786 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds()); | 804 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds()); |
787 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime); | 805 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime); |
788 } | 806 } |
789 | 807 |
790 TEST_F(RtpSenderTest, TrafficSmoothingRetransmits) { | 808 TEST_F(RtpSenderTest, TrafficSmoothingRetransmits) { |
791 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority, | 809 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority, |
792 _, kSeqNum, _, _, _)); | 810 _, kSeqNum, _, _, _)); |
793 EXPECT_CALL(mock_rtc_event_log_, | 811 EXPECT_CALL(mock_rtc_event_log_, |
794 LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _)); | 812 LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _)); |
795 | 813 |
796 rtp_sender_->SetStorePacketsStatus(true, 10); | 814 rtp_sender_->SetStorePacketsStatus(true, 10); |
797 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | 815 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( |
798 kRtpExtensionTransmissionTimeOffset, | 816 kRtpExtensionTransmissionTimeOffset, |
799 kTransmissionTimeOffsetExtensionId)); | 817 kTransmissionTimeOffsetExtensionId)); |
800 EXPECT_EQ( | 818 EXPECT_EQ( |
801 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, | 819 0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, |
802 kAbsoluteSendTimeExtensionId)); | 820 kAbsoluteSendTimeExtensionId)); |
803 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds(); | 821 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds(); |
804 int rtp_length_int = rtp_sender_->BuildRtpHeader( | 822 BuildRtpPacket(kPayload, kMarkerBit, kTimestamp, capture_time_ms); |
805 packet_, kPayload, kMarkerBit, kTimestamp, capture_time_ms); | 823 size_t packet_size = packet_->size(); |
806 ASSERT_NE(-1, rtp_length_int); | |
807 size_t rtp_length = static_cast<size_t>(rtp_length_int); | |
808 | 824 |
809 // Packet should be stored in a send bucket. | 825 // Packet should be stored in a send bucket. |
810 EXPECT_TRUE(rtp_sender_->SendToNetwork(packet_, 0, rtp_length, | 826 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet_), |
811 capture_time_ms, kAllowRetransmission, | 827 kAllowRetransmission, |
812 RtpPacketSender::kNormalPriority)); | 828 RtpPacketSender::kNormalPriority)); |
813 | 829 |
814 EXPECT_EQ(0, transport_.packets_sent_); | 830 EXPECT_EQ(0, transport_.packets_sent_); |
815 | 831 |
816 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority, | 832 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority, |
817 _, kSeqNum, _, _, _)); | 833 _, kSeqNum, _, _, _)); |
818 | 834 |
819 const int kStoredTimeInMs = 100; | 835 const int kStoredTimeInMs = 100; |
820 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs); | 836 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs); |
821 | 837 |
822 EXPECT_EQ(rtp_length_int, rtp_sender_->ReSendPacket(kSeqNum)); | 838 EXPECT_EQ(static_cast<int32_t>(packet_size), |
| 839 rtp_sender_->ReSendPacket(kSeqNum)); |
823 EXPECT_EQ(0, transport_.packets_sent_); | 840 EXPECT_EQ(0, transport_.packets_sent_); |
824 | 841 |
825 rtp_sender_->TimeToSendPacket(kSeqNum, capture_time_ms, false, | 842 rtp_sender_->TimeToSendPacket(kSeqNum, capture_time_ms, false, |
826 PacketInfo::kNotAProbe); | 843 PacketInfo::kNotAProbe); |
827 | 844 |
828 // Process send bucket. Packet should now be sent. | 845 // Process send bucket. Packet should now be sent. |
829 EXPECT_EQ(1, transport_.packets_sent_); | 846 EXPECT_EQ(1, transport_.packets_sent_); |
830 EXPECT_EQ(rtp_length, transport_.last_sent_packet_len_); | 847 EXPECT_EQ(packet_size, transport_.last_sent_packet_len_); |
831 | 848 |
832 // Parse sent packet. | 849 // Parse sent packet. |
833 webrtc::RtpUtility::RtpHeaderParser rtp_parser(transport_.last_sent_packet_, | 850 webrtc::RtpUtility::RtpHeaderParser rtp_parser(transport_.last_sent_packet_, |
834 rtp_length); | 851 packet_size); |
835 webrtc::RTPHeader rtp_header; | 852 webrtc::RTPHeader rtp_header; |
836 RtpHeaderExtensionMap map; | 853 RtpHeaderExtensionMap map; |
837 map.Register(kRtpExtensionTransmissionTimeOffset, | 854 map.Register(kRtpExtensionTransmissionTimeOffset, |
838 kTransmissionTimeOffsetExtensionId); | 855 kTransmissionTimeOffsetExtensionId); |
839 map.Register(kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId); | 856 map.Register(kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId); |
840 const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map); | 857 const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map); |
841 ASSERT_TRUE(valid_rtp_header); | 858 ASSERT_TRUE(valid_rtp_header); |
842 | 859 |
843 // Verify transmission time offset. | 860 // Verify transmission time offset. |
844 EXPECT_EQ(kStoredTimeInMs * 90, rtp_header.extension.transmissionTimeOffset); | 861 EXPECT_EQ(kStoredTimeInMs * 90, rtp_header.extension.transmissionTimeOffset); |
(...skipping 30 matching lines...) Expand all Loading... |
875 std::unique_ptr<webrtc::RtpHeaderParser> rtp_parser( | 892 std::unique_ptr<webrtc::RtpHeaderParser> rtp_parser( |
876 webrtc::RtpHeaderParser::Create()); | 893 webrtc::RtpHeaderParser::Create()); |
877 ASSERT_TRUE(rtp_parser.get() != nullptr); | 894 ASSERT_TRUE(rtp_parser.get() != nullptr); |
878 rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset, | 895 rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset, |
879 kTransmissionTimeOffsetExtensionId); | 896 kTransmissionTimeOffsetExtensionId); |
880 rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, | 897 rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, |
881 kAbsoluteSendTimeExtensionId); | 898 kAbsoluteSendTimeExtensionId); |
882 webrtc::RTPHeader rtp_header; | 899 webrtc::RTPHeader rtp_header; |
883 | 900 |
884 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds(); | 901 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds(); |
885 int rtp_length_int = rtp_sender_->BuildRtpHeader( | 902 BuildRtpPacket(kPayload, kMarkerBit, timestamp, capture_time_ms); |
886 packet_, kPayload, kMarkerBit, timestamp, capture_time_ms); | |
887 const uint32_t media_packet_timestamp = timestamp; | 903 const uint32_t media_packet_timestamp = timestamp; |
888 ASSERT_NE(-1, rtp_length_int); | |
889 size_t rtp_length = static_cast<size_t>(rtp_length_int); | |
890 | 904 |
891 // Packet should be stored in a send bucket. | 905 // Packet should be stored in a send bucket. |
892 EXPECT_TRUE(rtp_sender_->SendToNetwork(packet_, 0, rtp_length, | 906 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet_), |
893 capture_time_ms, kAllowRetransmission, | 907 kAllowRetransmission, |
894 RtpPacketSender::kNormalPriority)); | 908 RtpPacketSender::kNormalPriority)); |
895 | 909 |
896 int total_packets_sent = 0; | 910 int total_packets_sent = 0; |
897 EXPECT_EQ(total_packets_sent, transport_.packets_sent_); | 911 EXPECT_EQ(total_packets_sent, transport_.packets_sent_); |
898 | 912 |
899 const int kStoredTimeInMs = 100; | 913 const int kStoredTimeInMs = 100; |
900 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs); | 914 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs); |
901 rtp_sender_->TimeToSendPacket(seq_num++, capture_time_ms, false, | 915 rtp_sender_->TimeToSendPacket(seq_num++, capture_time_ms, false, |
902 PacketInfo::kNotAProbe); | 916 PacketInfo::kNotAProbe); |
903 // Packet should now be sent. This test doesn't verify the regular video | 917 // Packet should now be sent. This test doesn't verify the regular video |
(...skipping 29 matching lines...) Expand all Loading... |
933 EXPECT_EQ(offset, rtp_header.extension.transmissionTimeOffset); | 947 EXPECT_EQ(offset, rtp_header.extension.transmissionTimeOffset); |
934 uint64_t expected_send_time = | 948 uint64_t expected_send_time = |
935 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds()); | 949 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds()); |
936 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime); | 950 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime); |
937 fake_clock_.AdvanceTimeMilliseconds(kPaddingPeriodMs); | 951 fake_clock_.AdvanceTimeMilliseconds(kPaddingPeriodMs); |
938 timestamp += 90 * kPaddingPeriodMs; | 952 timestamp += 90 * kPaddingPeriodMs; |
939 } | 953 } |
940 | 954 |
941 // Send a regular video packet again. | 955 // Send a regular video packet again. |
942 capture_time_ms = fake_clock_.TimeInMilliseconds(); | 956 capture_time_ms = fake_clock_.TimeInMilliseconds(); |
943 rtp_length_int = rtp_sender_->BuildRtpHeader(packet_, kPayload, kMarkerBit, | 957 BuildRtpPacket(kPayload, kMarkerBit, timestamp, capture_time_ms); |
944 timestamp, capture_time_ms); | 958 size_t packet_size = packet_->size(); |
945 ASSERT_NE(-1, rtp_length_int); | |
946 rtp_length = static_cast<size_t>(rtp_length_int); | |
947 | 959 |
948 EXPECT_CALL(mock_paced_sender_, | 960 EXPECT_CALL(mock_paced_sender_, |
949 InsertPacket(RtpPacketSender::kNormalPriority, _, _, _, _, _)); | 961 InsertPacket(RtpPacketSender::kNormalPriority, _, _, _, _, _)); |
950 | 962 |
951 // Packet should be stored in a send bucket. | 963 // Packet should be stored in a send bucket. |
952 EXPECT_TRUE(rtp_sender_->SendToNetwork(packet_, 0, rtp_length, | 964 EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet_), |
953 capture_time_ms, kAllowRetransmission, | 965 kAllowRetransmission, |
954 RtpPacketSender::kNormalPriority)); | 966 RtpPacketSender::kNormalPriority)); |
955 | 967 |
956 rtp_sender_->TimeToSendPacket(seq_num, capture_time_ms, false, | 968 rtp_sender_->TimeToSendPacket(seq_num, capture_time_ms, false, |
957 PacketInfo::kNotAProbe); | 969 PacketInfo::kNotAProbe); |
958 // Process send bucket. | 970 // Process send bucket. |
959 EXPECT_EQ(++total_packets_sent, transport_.packets_sent_); | 971 EXPECT_EQ(++total_packets_sent, transport_.packets_sent_); |
960 EXPECT_EQ(rtp_length, transport_.last_sent_packet_len_); | 972 EXPECT_EQ(packet_size, transport_.last_sent_packet_len_); |
961 // Parse sent packet. | 973 // Parse sent packet. |
962 ASSERT_TRUE( | 974 ASSERT_TRUE(rtp_parser->Parse(transport_.last_sent_packet_, packet_size, |
963 rtp_parser->Parse(transport_.last_sent_packet_, rtp_length, &rtp_header)); | 975 &rtp_header)); |
964 | 976 |
965 // Verify sequence number and timestamp. | 977 // Verify sequence number and timestamp. |
966 EXPECT_EQ(seq_num, rtp_header.sequenceNumber); | 978 EXPECT_EQ(seq_num, rtp_header.sequenceNumber); |
967 EXPECT_EQ(timestamp, rtp_header.timestamp); | 979 EXPECT_EQ(timestamp, rtp_header.timestamp); |
968 // Verify transmission time offset. This packet is sent without delay. | 980 // Verify transmission time offset. This packet is sent without delay. |
969 EXPECT_EQ(0, rtp_header.extension.transmissionTimeOffset); | 981 EXPECT_EQ(0, rtp_header.extension.transmissionTimeOffset); |
970 uint64_t expected_send_time = | 982 uint64_t expected_send_time = |
971 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds()); | 983 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds()); |
972 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime); | 984 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime); |
973 } | 985 } |
(...skipping 623 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1597 EXPECT_EQ(kNumPackets * 2, transport_.packets_sent_); | 1609 EXPECT_EQ(kNumPackets * 2, transport_.packets_sent_); |
1598 } | 1610 } |
1599 | 1611 |
1600 // Verify that all packets of a frame have CVO byte set. | 1612 // Verify that all packets of a frame have CVO byte set. |
1601 TEST_F(RtpSenderVideoTest, SendVideoWithCVO) { | 1613 TEST_F(RtpSenderVideoTest, SendVideoWithCVO) { |
1602 RTPVideoHeader hdr = {0}; | 1614 RTPVideoHeader hdr = {0}; |
1603 hdr.rotation = kVideoRotation_90; | 1615 hdr.rotation = kVideoRotation_90; |
1604 | 1616 |
1605 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( | 1617 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( |
1606 kRtpExtensionVideoRotation, kVideoRotationExtensionId)); | 1618 kRtpExtensionVideoRotation, kVideoRotationExtensionId)); |
1607 EXPECT_TRUE(rtp_sender_->ActivateCVORtpHeaderExtension()); | |
1608 | 1619 |
1609 EXPECT_EQ( | 1620 const uint8_t kPayloadData[1500] = {0}; |
1610 RtpUtility::Word32Align(kRtpOneByteHeaderLength + kVideoRotationLength), | |
1611 rtp_sender_->RtpHeaderExtensionLength()); | |
1612 | |
1613 rtp_sender_video_->SendVideo(kRtpVideoGeneric, kVideoFrameKey, kPayload, | 1621 rtp_sender_video_->SendVideo(kRtpVideoGeneric, kVideoFrameKey, kPayload, |
1614 kTimestamp, 0, packet_, sizeof(packet_), nullptr, | 1622 kTimestamp, 0, kPayloadData, |
1615 &hdr); | 1623 sizeof(kPayloadData), nullptr, &hdr); |
1616 | 1624 |
1617 RtpHeaderExtensionMap map; | 1625 RtpHeaderExtensionMap map; |
1618 map.Register(kRtpExtensionVideoRotation, kVideoRotationExtensionId); | 1626 map.Register(kRtpExtensionVideoRotation, kVideoRotationExtensionId); |
1619 | 1627 |
1620 // Verify that this packet does have CVO byte. | 1628 // Verify that this packet does have CVO byte. |
1621 VerifyCVOPacket( | 1629 VerifyCVOPacket( |
1622 reinterpret_cast<uint8_t*>(transport_.sent_packets_[0]->data()), | 1630 reinterpret_cast<uint8_t*>(transport_.sent_packets_[0]->data()), |
1623 transport_.sent_packets_[0]->size(), true, &map, kSeqNum, hdr.rotation); | 1631 transport_.sent_packets_[0]->size(), true, &map, kSeqNum, hdr.rotation); |
1624 | 1632 |
1625 // Verify that this packet does have CVO byte. | 1633 // Verify that this packet does have CVO byte. |
1626 VerifyCVOPacket( | 1634 VerifyCVOPacket( |
1627 reinterpret_cast<uint8_t*>(transport_.sent_packets_[1]->data()), | 1635 reinterpret_cast<uint8_t*>(transport_.sent_packets_[1]->data()), |
1628 transport_.sent_packets_[1]->size(), true, &map, kSeqNum + 1, | 1636 transport_.sent_packets_[1]->size(), true, &map, kSeqNum + 1, |
1629 hdr.rotation); | 1637 hdr.rotation); |
1630 } | 1638 } |
1631 } // namespace webrtc | 1639 } // namespace webrtc |
OLD | NEW |