rtp_sender_unittest.cc revision 61c2a6f241ac9db626aeab755e49897030b289e1
1/* 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11/* 12 * This file includes unit tests for the RTPSender. 13 */ 14 15#include "testing/gtest/include/gtest/gtest.h" 16 17#include "webrtc/base/buffer.h" 18#include "webrtc/base/scoped_ptr.h" 19#include "webrtc/modules/pacing/include/mock/mock_paced_sender.h" 20#include "webrtc/modules/rtp_rtcp/interface/rtp_cvo.h" 21#include "webrtc/modules/rtp_rtcp/interface/rtp_header_parser.h" 22#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h" 23#include "webrtc/modules/rtp_rtcp/source/rtp_format_video_generic.h" 24#include "webrtc/modules/rtp_rtcp/source/rtp_header_extension.h" 25#include "webrtc/modules/rtp_rtcp/source/rtp_sender.h" 26#include "webrtc/modules/rtp_rtcp/source/rtp_sender_video.h" 27#include "webrtc/system_wrappers/interface/stl_util.h" 28#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" 29#include "webrtc/test/mock_transport.h" 30#include "webrtc/typedefs.h" 31 32namespace webrtc { 33 34namespace { 35const int kTransmissionTimeOffsetExtensionId = 1; 36const int kAbsoluteSendTimeExtensionId = 14; 37const int kTransportSequenceNumberExtensionId = 13; 38const int kPayload = 100; 39const uint32_t kTimestamp = 10; 40const uint16_t kSeqNum = 33; 41const int kTimeOffset = 22222; 42const int kMaxPacketLength = 1500; 43const uint32_t kAbsoluteSendTime = 0x00aabbcc; 44const uint8_t kAudioLevel = 0x5a; 45const uint16_t kTransportSequenceNumber = 0xaabbu; 46const uint8_t kAudioLevelExtensionId = 9; 47const int kAudioPayload = 103; 48const uint64_t kStartTime = 123456789; 49const size_t kMaxPaddingSize = 224u; 50const int kVideoRotationExtensionId = 5; 51const VideoRotation kRotation = kVideoRotation_270; 52 53using testing::_; 54 55const uint8_t* GetPayloadData(const RTPHeader& rtp_header, 56 const uint8_t* packet) { 57 return packet + rtp_header.headerLength; 58} 59 60size_t GetPayloadDataLength(const RTPHeader& rtp_header, 61 const size_t packet_length) { 62 return packet_length - rtp_header.headerLength - rtp_header.paddingLength; 63} 64 65uint64_t ConvertMsToAbsSendTime(int64_t time_ms) { 66 return 0x00fffffful & ((time_ms << 18) / 1000); 67} 68 69class LoopbackTransportTest : public webrtc::Transport { 70 public: 71 LoopbackTransportTest() 72 : packets_sent_(0), 73 last_sent_packet_len_(0), 74 total_bytes_sent_(0), 75 last_sent_packet_(NULL) {} 76 77 ~LoopbackTransportTest() { 78 STLDeleteContainerPointers(sent_packets_.begin(), sent_packets_.end()); 79 } 80 int SendPacket(int channel, const void *data, size_t len) override { 81 packets_sent_++; 82 rtc::Buffer* buffer = new rtc::Buffer(data, len); 83 last_sent_packet_ = reinterpret_cast<uint8_t*>(buffer->data()); 84 last_sent_packet_len_ = len; 85 total_bytes_sent_ += len; 86 sent_packets_.push_back(buffer); 87 return static_cast<int>(len); 88 } 89 int SendRTCPPacket(int channel, const void* data, size_t len) override { 90 return -1; 91 } 92 int packets_sent_; 93 size_t last_sent_packet_len_; 94 size_t total_bytes_sent_; 95 uint8_t* last_sent_packet_; 96 std::vector<rtc::Buffer*> sent_packets_; 97}; 98 99} // namespace 100 101class RtpSenderTest : public ::testing::Test { 102 protected: 103 RtpSenderTest() 104 : fake_clock_(kStartTime), 105 mock_paced_sender_(), 106 rtp_sender_(), 107 payload_(kPayload), 108 transport_(), 109 kMarkerBit(true) { 110 EXPECT_CALL(mock_paced_sender_, 111 SendPacket(_, _, _, _, _, _)).WillRepeatedly(testing::Return(true)); 112 } 113 114 void SetUp() override { 115 rtp_sender_.reset(new RTPSender(0, false, &fake_clock_, &transport_, NULL, 116 &mock_paced_sender_, NULL, NULL, NULL)); 117 rtp_sender_->SetSequenceNumber(kSeqNum); 118 } 119 120 SimulatedClock fake_clock_; 121 MockPacedSender mock_paced_sender_; 122 rtc::scoped_ptr<RTPSender> rtp_sender_; 123 int payload_; 124 LoopbackTransportTest transport_; 125 const bool kMarkerBit; 126 uint8_t packet_[kMaxPacketLength]; 127 128 void VerifyRTPHeaderCommon(const RTPHeader& rtp_header) { 129 VerifyRTPHeaderCommon(rtp_header, kMarkerBit); 130 } 131 132 void VerifyRTPHeaderCommon(const RTPHeader& rtp_header, bool marker_bit) { 133 EXPECT_EQ(marker_bit, rtp_header.markerBit); 134 EXPECT_EQ(payload_, rtp_header.payloadType); 135 EXPECT_EQ(kSeqNum, rtp_header.sequenceNumber); 136 EXPECT_EQ(kTimestamp, rtp_header.timestamp); 137 EXPECT_EQ(rtp_sender_->SSRC(), rtp_header.ssrc); 138 EXPECT_EQ(0, rtp_header.numCSRCs); 139 EXPECT_EQ(0U, rtp_header.paddingLength); 140 } 141 142 void SendPacket(int64_t capture_time_ms, int payload_length) { 143 uint32_t timestamp = capture_time_ms * 90; 144 int32_t rtp_length = rtp_sender_->BuildRTPheader(packet_, 145 kPayload, 146 kMarkerBit, 147 timestamp, 148 capture_time_ms); 149 ASSERT_GE(rtp_length, 0); 150 151 // Packet should be stored in a send bucket. 152 EXPECT_EQ(0, rtp_sender_->SendToNetwork(packet_, 153 payload_length, 154 rtp_length, 155 capture_time_ms, 156 kAllowRetransmission, 157 PacedSender::kNormalPriority)); 158 } 159}; 160 161class RtpSenderVideoTest : public RtpSenderTest { 162 protected: 163 virtual void SetUp() override { 164 RtpSenderTest::SetUp(); 165 rtp_sender_video_.reset( 166 new RTPSenderVideo(&fake_clock_, rtp_sender_.get())); 167 } 168 rtc::scoped_ptr<RTPSenderVideo> rtp_sender_video_; 169 170 void VerifyCVOPacket(uint8_t* data, 171 size_t len, 172 bool expect_cvo, 173 RtpHeaderExtensionMap* map, 174 uint16_t seq_num, 175 VideoRotation rotation) { 176 webrtc::RtpUtility::RtpHeaderParser rtp_parser(data, len); 177 178 webrtc::RTPHeader rtp_header; 179 size_t length = static_cast<size_t>(rtp_sender_->BuildRTPheader( 180 packet_, kPayload, expect_cvo /* marker_bit */, kTimestamp, 0)); 181 if (expect_cvo) { 182 ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionTotalLength(), 183 length); 184 } else { 185 ASSERT_EQ(kRtpHeaderSize, length); 186 } 187 ASSERT_TRUE(rtp_parser.Parse(rtp_header, map)); 188 ASSERT_FALSE(rtp_parser.RTCP()); 189 EXPECT_EQ(payload_, rtp_header.payloadType); 190 EXPECT_EQ(seq_num, rtp_header.sequenceNumber); 191 EXPECT_EQ(kTimestamp, rtp_header.timestamp); 192 EXPECT_EQ(rtp_sender_->SSRC(), rtp_header.ssrc); 193 EXPECT_EQ(0, rtp_header.numCSRCs); 194 EXPECT_EQ(0U, rtp_header.paddingLength); 195 EXPECT_EQ(ConvertVideoRotationToCVOByte(rotation), 196 rtp_header.extension.videoRotation); 197 } 198}; 199 200TEST_F(RtpSenderTest, RegisterRtpTransmissionTimeOffsetHeaderExtension) { 201 EXPECT_EQ(0u, rtp_sender_->RtpHeaderExtensionTotalLength()); 202 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( 203 kRtpExtensionTransmissionTimeOffset, kTransmissionTimeOffsetExtensionId)); 204 EXPECT_EQ(kRtpOneByteHeaderLength + kTransmissionTimeOffsetLength, 205 rtp_sender_->RtpHeaderExtensionTotalLength()); 206 EXPECT_EQ(0, rtp_sender_->DeregisterRtpHeaderExtension( 207 kRtpExtensionTransmissionTimeOffset)); 208 EXPECT_EQ(0u, rtp_sender_->RtpHeaderExtensionTotalLength()); 209} 210 211TEST_F(RtpSenderTest, RegisterRtpAbsoluteSendTimeHeaderExtension) { 212 EXPECT_EQ(0u, rtp_sender_->RtpHeaderExtensionTotalLength()); 213 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( 214 kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId)); 215 EXPECT_EQ(RtpUtility::Word32Align(kRtpOneByteHeaderLength + 216 kAbsoluteSendTimeLength), 217 rtp_sender_->RtpHeaderExtensionTotalLength()); 218 EXPECT_EQ(0, rtp_sender_->DeregisterRtpHeaderExtension( 219 kRtpExtensionAbsoluteSendTime)); 220 EXPECT_EQ(0u, rtp_sender_->RtpHeaderExtensionTotalLength()); 221} 222 223TEST_F(RtpSenderTest, RegisterRtpAudioLevelHeaderExtension) { 224 EXPECT_EQ(0u, rtp_sender_->RtpHeaderExtensionTotalLength()); 225 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( 226 kRtpExtensionAudioLevel, kAudioLevelExtensionId)); 227 EXPECT_EQ( 228 RtpUtility::Word32Align(kRtpOneByteHeaderLength + kAudioLevelLength), 229 rtp_sender_->RtpHeaderExtensionTotalLength()); 230 EXPECT_EQ(0, rtp_sender_->DeregisterRtpHeaderExtension( 231 kRtpExtensionAudioLevel)); 232 EXPECT_EQ(0u, rtp_sender_->RtpHeaderExtensionTotalLength()); 233} 234 235TEST_F(RtpSenderTest, RegisterRtpHeaderExtensions) { 236 EXPECT_EQ(0u, rtp_sender_->RtpHeaderExtensionTotalLength()); 237 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( 238 kRtpExtensionTransmissionTimeOffset, kTransmissionTimeOffsetExtensionId)); 239 EXPECT_EQ(RtpUtility::Word32Align(kRtpOneByteHeaderLength + 240 kTransmissionTimeOffsetLength), 241 rtp_sender_->RtpHeaderExtensionTotalLength()); 242 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( 243 kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId)); 244 EXPECT_EQ(RtpUtility::Word32Align(kRtpOneByteHeaderLength + 245 kTransmissionTimeOffsetLength + 246 kAbsoluteSendTimeLength), 247 rtp_sender_->RtpHeaderExtensionTotalLength()); 248 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( 249 kRtpExtensionAudioLevel, kAudioLevelExtensionId)); 250 EXPECT_EQ(RtpUtility::Word32Align( 251 kRtpOneByteHeaderLength + kTransmissionTimeOffsetLength + 252 kAbsoluteSendTimeLength + kAudioLevelLength), 253 rtp_sender_->RtpHeaderExtensionTotalLength()); 254 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( 255 kRtpExtensionVideoRotation, kVideoRotationExtensionId)); 256 EXPECT_TRUE(rtp_sender_->ActivateCVORtpHeaderExtension()); 257 EXPECT_EQ(RtpUtility::Word32Align(kRtpOneByteHeaderLength + 258 kTransmissionTimeOffsetLength + 259 kAbsoluteSendTimeLength + 260 kAudioLevelLength + kVideoRotationLength), 261 rtp_sender_->RtpHeaderExtensionTotalLength()); 262 263 // Deregister starts. 264 EXPECT_EQ(0, rtp_sender_->DeregisterRtpHeaderExtension( 265 kRtpExtensionTransmissionTimeOffset)); 266 EXPECT_EQ(RtpUtility::Word32Align(kRtpOneByteHeaderLength + 267 kAbsoluteSendTimeLength + 268 kAudioLevelLength + kVideoRotationLength), 269 rtp_sender_->RtpHeaderExtensionTotalLength()); 270 EXPECT_EQ(0, rtp_sender_->DeregisterRtpHeaderExtension( 271 kRtpExtensionAbsoluteSendTime)); 272 EXPECT_EQ(RtpUtility::Word32Align(kRtpOneByteHeaderLength + 273 kAudioLevelLength + kVideoRotationLength), 274 rtp_sender_->RtpHeaderExtensionTotalLength()); 275 EXPECT_EQ(0, rtp_sender_->DeregisterRtpHeaderExtension( 276 kRtpExtensionAudioLevel)); 277 EXPECT_EQ( 278 RtpUtility::Word32Align(kRtpOneByteHeaderLength + kVideoRotationLength), 279 rtp_sender_->RtpHeaderExtensionTotalLength()); 280 EXPECT_EQ( 281 0, rtp_sender_->DeregisterRtpHeaderExtension(kRtpExtensionVideoRotation)); 282 EXPECT_EQ(0u, rtp_sender_->RtpHeaderExtensionTotalLength()); 283} 284 285TEST_F(RtpSenderTest, RegisterRtpVideoRotationHeaderExtension) { 286 EXPECT_EQ(0u, rtp_sender_->RtpHeaderExtensionTotalLength()); 287 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( 288 kRtpExtensionVideoRotation, kVideoRotationExtensionId)); 289 EXPECT_EQ(0u, rtp_sender_->RtpHeaderExtensionTotalLength()); 290 291 EXPECT_TRUE(rtp_sender_->ActivateCVORtpHeaderExtension()); 292 EXPECT_EQ( 293 RtpUtility::Word32Align(kRtpOneByteHeaderLength + kVideoRotationLength), 294 rtp_sender_->RtpHeaderExtensionTotalLength()); 295 EXPECT_EQ( 296 0, rtp_sender_->DeregisterRtpHeaderExtension(kRtpExtensionVideoRotation)); 297 EXPECT_EQ(0u, rtp_sender_->RtpHeaderExtensionTotalLength()); 298} 299 300TEST_F(RtpSenderTest, BuildRTPPacket) { 301 size_t length = static_cast<size_t>(rtp_sender_->BuildRTPheader( 302 packet_, kPayload, kMarkerBit, kTimestamp, 0)); 303 ASSERT_EQ(kRtpHeaderSize, length); 304 305 // Verify 306 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length); 307 webrtc::RTPHeader rtp_header; 308 309 const bool valid_rtp_header = rtp_parser.Parse(rtp_header, NULL); 310 311 ASSERT_TRUE(valid_rtp_header); 312 ASSERT_FALSE(rtp_parser.RTCP()); 313 VerifyRTPHeaderCommon(rtp_header); 314 EXPECT_EQ(length, rtp_header.headerLength); 315 EXPECT_FALSE(rtp_header.extension.hasTransmissionTimeOffset); 316 EXPECT_FALSE(rtp_header.extension.hasAbsoluteSendTime); 317 EXPECT_FALSE(rtp_header.extension.hasAudioLevel); 318 EXPECT_EQ(0, rtp_header.extension.transmissionTimeOffset); 319 EXPECT_EQ(0u, rtp_header.extension.absoluteSendTime); 320 EXPECT_EQ(0u, rtp_header.extension.audioLevel); 321 EXPECT_EQ(0u, rtp_header.extension.videoRotation); 322} 323 324TEST_F(RtpSenderTest, BuildRTPPacketWithTransmissionOffsetExtension) { 325 EXPECT_EQ(0, rtp_sender_->SetTransmissionTimeOffset(kTimeOffset)); 326 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( 327 kRtpExtensionTransmissionTimeOffset, kTransmissionTimeOffsetExtensionId)); 328 329 size_t length = static_cast<size_t>(rtp_sender_->BuildRTPheader( 330 packet_, kPayload, kMarkerBit, kTimestamp, 0)); 331 ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionTotalLength(), 332 length); 333 334 // Verify 335 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length); 336 webrtc::RTPHeader rtp_header; 337 338 RtpHeaderExtensionMap map; 339 map.Register(kRtpExtensionTransmissionTimeOffset, 340 kTransmissionTimeOffsetExtensionId); 341 const bool valid_rtp_header = rtp_parser.Parse(rtp_header, &map); 342 343 ASSERT_TRUE(valid_rtp_header); 344 ASSERT_FALSE(rtp_parser.RTCP()); 345 VerifyRTPHeaderCommon(rtp_header); 346 EXPECT_EQ(length, rtp_header.headerLength); 347 EXPECT_TRUE(rtp_header.extension.hasTransmissionTimeOffset); 348 EXPECT_EQ(kTimeOffset, rtp_header.extension.transmissionTimeOffset); 349 350 // Parse without map extension 351 webrtc::RTPHeader rtp_header2; 352 const bool valid_rtp_header2 = rtp_parser.Parse(rtp_header2, NULL); 353 354 ASSERT_TRUE(valid_rtp_header2); 355 VerifyRTPHeaderCommon(rtp_header2); 356 EXPECT_EQ(length, rtp_header2.headerLength); 357 EXPECT_FALSE(rtp_header2.extension.hasTransmissionTimeOffset); 358 EXPECT_EQ(0, rtp_header2.extension.transmissionTimeOffset); 359} 360 361TEST_F(RtpSenderTest, BuildRTPPacketWithNegativeTransmissionOffsetExtension) { 362 const int kNegTimeOffset = -500; 363 EXPECT_EQ(0, rtp_sender_->SetTransmissionTimeOffset(kNegTimeOffset)); 364 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( 365 kRtpExtensionTransmissionTimeOffset, kTransmissionTimeOffsetExtensionId)); 366 367 size_t length = static_cast<size_t>(rtp_sender_->BuildRTPheader( 368 packet_, kPayload, kMarkerBit, kTimestamp, 0)); 369 ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionTotalLength(), 370 length); 371 372 // Verify 373 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length); 374 webrtc::RTPHeader rtp_header; 375 376 RtpHeaderExtensionMap map; 377 map.Register(kRtpExtensionTransmissionTimeOffset, 378 kTransmissionTimeOffsetExtensionId); 379 const bool valid_rtp_header = rtp_parser.Parse(rtp_header, &map); 380 381 ASSERT_TRUE(valid_rtp_header); 382 ASSERT_FALSE(rtp_parser.RTCP()); 383 VerifyRTPHeaderCommon(rtp_header); 384 EXPECT_EQ(length, rtp_header.headerLength); 385 EXPECT_TRUE(rtp_header.extension.hasTransmissionTimeOffset); 386 EXPECT_EQ(kNegTimeOffset, rtp_header.extension.transmissionTimeOffset); 387} 388 389TEST_F(RtpSenderTest, BuildRTPPacketWithAbsoluteSendTimeExtension) { 390 EXPECT_EQ(0, rtp_sender_->SetAbsoluteSendTime(kAbsoluteSendTime)); 391 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( 392 kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId)); 393 394 size_t length = static_cast<size_t>(rtp_sender_->BuildRTPheader( 395 packet_, kPayload, kMarkerBit, kTimestamp, 0)); 396 ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionTotalLength(), 397 length); 398 399 // Verify 400 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length); 401 webrtc::RTPHeader rtp_header; 402 403 RtpHeaderExtensionMap map; 404 map.Register(kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId); 405 const bool valid_rtp_header = rtp_parser.Parse(rtp_header, &map); 406 407 ASSERT_TRUE(valid_rtp_header); 408 ASSERT_FALSE(rtp_parser.RTCP()); 409 VerifyRTPHeaderCommon(rtp_header); 410 EXPECT_EQ(length, rtp_header.headerLength); 411 EXPECT_TRUE(rtp_header.extension.hasAbsoluteSendTime); 412 EXPECT_EQ(kAbsoluteSendTime, rtp_header.extension.absoluteSendTime); 413 414 // Parse without map extension 415 webrtc::RTPHeader rtp_header2; 416 const bool valid_rtp_header2 = rtp_parser.Parse(rtp_header2, NULL); 417 418 ASSERT_TRUE(valid_rtp_header2); 419 VerifyRTPHeaderCommon(rtp_header2); 420 EXPECT_EQ(length, rtp_header2.headerLength); 421 EXPECT_FALSE(rtp_header2.extension.hasAbsoluteSendTime); 422 EXPECT_EQ(0u, rtp_header2.extension.absoluteSendTime); 423} 424 425// Test CVO header extension is only set when marker bit is true. 426TEST_F(RtpSenderTest, BuildRTPPacketWithVideoRotation_MarkerBit) { 427 rtp_sender_->SetVideoRotation(kRotation); 428 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( 429 kRtpExtensionVideoRotation, kVideoRotationExtensionId)); 430 EXPECT_TRUE(rtp_sender_->ActivateCVORtpHeaderExtension()); 431 432 RtpHeaderExtensionMap map; 433 map.Register(kRtpExtensionVideoRotation, kVideoRotationExtensionId); 434 435 size_t length = static_cast<size_t>( 436 rtp_sender_->BuildRTPheader(packet_, kPayload, true, kTimestamp, 0)); 437 ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionTotalLength(), 438 length); 439 440 // Verify 441 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length); 442 webrtc::RTPHeader rtp_header; 443 444 ASSERT_TRUE(rtp_parser.Parse(rtp_header, &map)); 445 ASSERT_FALSE(rtp_parser.RTCP()); 446 VerifyRTPHeaderCommon(rtp_header); 447 EXPECT_EQ(length, rtp_header.headerLength); 448 EXPECT_TRUE(rtp_header.extension.hasVideoRotation); 449 EXPECT_EQ(ConvertVideoRotationToCVOByte(kRotation), 450 rtp_header.extension.videoRotation); 451} 452 453// Test CVO header extension is not set when marker bit is false. 454TEST_F(RtpSenderTest, DISABLED_BuildRTPPacketWithVideoRotation_NoMarkerBit) { 455 rtp_sender_->SetVideoRotation(kRotation); 456 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( 457 kRtpExtensionVideoRotation, kVideoRotationExtensionId)); 458 EXPECT_TRUE(rtp_sender_->ActivateCVORtpHeaderExtension()); 459 460 RtpHeaderExtensionMap map; 461 map.Register(kRtpExtensionVideoRotation, kVideoRotationExtensionId); 462 463 size_t length = static_cast<size_t>( 464 rtp_sender_->BuildRTPheader(packet_, kPayload, false, kTimestamp, 0)); 465 ASSERT_EQ(kRtpHeaderSize, length); 466 467 // Verify 468 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length); 469 webrtc::RTPHeader rtp_header; 470 471 ASSERT_TRUE(rtp_parser.Parse(rtp_header, &map)); 472 ASSERT_FALSE(rtp_parser.RTCP()); 473 VerifyRTPHeaderCommon(rtp_header, false); 474 EXPECT_EQ(length, rtp_header.headerLength); 475 EXPECT_FALSE(rtp_header.extension.hasVideoRotation); 476} 477 478TEST_F(RtpSenderTest, BuildRTPPacketWithAudioLevelExtension) { 479 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( 480 kRtpExtensionAudioLevel, kAudioLevelExtensionId)); 481 482 size_t length = static_cast<size_t>(rtp_sender_->BuildRTPheader( 483 packet_, kPayload, kMarkerBit, kTimestamp, 0)); 484 ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionTotalLength(), 485 length); 486 487 // Verify 488 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length); 489 webrtc::RTPHeader rtp_header; 490 491 // Updating audio level is done in RTPSenderAudio, so simulate it here. 492 rtp_parser.Parse(rtp_header); 493 rtp_sender_->UpdateAudioLevel(packet_, length, rtp_header, true, kAudioLevel); 494 495 RtpHeaderExtensionMap map; 496 map.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId); 497 const bool valid_rtp_header = rtp_parser.Parse(rtp_header, &map); 498 499 ASSERT_TRUE(valid_rtp_header); 500 ASSERT_FALSE(rtp_parser.RTCP()); 501 VerifyRTPHeaderCommon(rtp_header); 502 EXPECT_EQ(length, rtp_header.headerLength); 503 EXPECT_TRUE(rtp_header.extension.hasAudioLevel); 504 // Expect kAudioLevel + 0x80 because we set "voiced" to true in the call to 505 // UpdateAudioLevel(), above. 506 EXPECT_EQ(kAudioLevel + 0x80u, rtp_header.extension.audioLevel); 507 508 // Parse without map extension 509 webrtc::RTPHeader rtp_header2; 510 const bool valid_rtp_header2 = rtp_parser.Parse(rtp_header2, NULL); 511 512 ASSERT_TRUE(valid_rtp_header2); 513 VerifyRTPHeaderCommon(rtp_header2); 514 EXPECT_EQ(length, rtp_header2.headerLength); 515 EXPECT_FALSE(rtp_header2.extension.hasAudioLevel); 516 EXPECT_EQ(0u, rtp_header2.extension.audioLevel); 517} 518 519TEST_F(RtpSenderTest, BuildRTPPacketWithHeaderExtensions) { 520 EXPECT_EQ(0, rtp_sender_->SetTransmissionTimeOffset(kTimeOffset)); 521 EXPECT_EQ(0, rtp_sender_->SetAbsoluteSendTime(kAbsoluteSendTime)); 522 EXPECT_EQ(0, 523 rtp_sender_->SetTransportSequenceNumber(kTransportSequenceNumber)); 524 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( 525 kRtpExtensionTransmissionTimeOffset, kTransmissionTimeOffsetExtensionId)); 526 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( 527 kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId)); 528 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( 529 kRtpExtensionAudioLevel, kAudioLevelExtensionId)); 530 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( 531 kRtpExtensionTransportSequenceNumber, 532 kTransportSequenceNumberExtensionId)); 533 534 size_t length = static_cast<size_t>(rtp_sender_->BuildRTPheader( 535 packet_, kPayload, kMarkerBit, kTimestamp, 0)); 536 ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionTotalLength(), 537 length); 538 539 // Verify 540 webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length); 541 webrtc::RTPHeader rtp_header; 542 543 // Updating audio level is done in RTPSenderAudio, so simulate it here. 544 rtp_parser.Parse(rtp_header); 545 rtp_sender_->UpdateAudioLevel(packet_, length, rtp_header, true, kAudioLevel); 546 547 RtpHeaderExtensionMap map; 548 map.Register(kRtpExtensionTransmissionTimeOffset, 549 kTransmissionTimeOffsetExtensionId); 550 map.Register(kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId); 551 map.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId); 552 map.Register(kRtpExtensionTransportSequenceNumber, 553 kTransportSequenceNumberExtensionId); 554 const bool valid_rtp_header = rtp_parser.Parse(rtp_header, &map); 555 556 ASSERT_TRUE(valid_rtp_header); 557 ASSERT_FALSE(rtp_parser.RTCP()); 558 VerifyRTPHeaderCommon(rtp_header); 559 EXPECT_EQ(length, rtp_header.headerLength); 560 EXPECT_TRUE(rtp_header.extension.hasTransmissionTimeOffset); 561 EXPECT_TRUE(rtp_header.extension.hasAbsoluteSendTime); 562 EXPECT_TRUE(rtp_header.extension.hasAudioLevel); 563 EXPECT_TRUE(rtp_header.extension.hasTransportSequenceNumber); 564 EXPECT_EQ(kTimeOffset, rtp_header.extension.transmissionTimeOffset); 565 EXPECT_EQ(kAbsoluteSendTime, rtp_header.extension.absoluteSendTime); 566 EXPECT_EQ(kAudioLevel + 0x80u, rtp_header.extension.audioLevel); 567 EXPECT_EQ(kTransportSequenceNumber, 568 rtp_header.extension.transportSequenceNumber); 569 570 // Parse without map extension 571 webrtc::RTPHeader rtp_header2; 572 const bool valid_rtp_header2 = rtp_parser.Parse(rtp_header2, NULL); 573 574 ASSERT_TRUE(valid_rtp_header2); 575 VerifyRTPHeaderCommon(rtp_header2); 576 EXPECT_EQ(length, rtp_header2.headerLength); 577 EXPECT_FALSE(rtp_header2.extension.hasTransmissionTimeOffset); 578 EXPECT_FALSE(rtp_header2.extension.hasAbsoluteSendTime); 579 EXPECT_FALSE(rtp_header2.extension.hasAudioLevel); 580 EXPECT_FALSE(rtp_header2.extension.hasTransportSequenceNumber); 581 582 EXPECT_EQ(0, rtp_header2.extension.transmissionTimeOffset); 583 EXPECT_EQ(0u, rtp_header2.extension.absoluteSendTime); 584 EXPECT_EQ(0u, rtp_header2.extension.audioLevel); 585 EXPECT_EQ(0u, rtp_header2.extension.transportSequenceNumber); 586} 587 588TEST_F(RtpSenderTest, TrafficSmoothingWithExtensions) { 589 EXPECT_CALL(mock_paced_sender_, 590 SendPacket(PacedSender::kNormalPriority, _, kSeqNum, _, _, _)). 591 WillOnce(testing::Return(false)); 592 593 rtp_sender_->SetStorePacketsStatus(true, 10); 594 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( 595 kRtpExtensionTransmissionTimeOffset, kTransmissionTimeOffsetExtensionId)); 596 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( 597 kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId)); 598 rtp_sender_->SetTargetBitrate(300000); 599 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds(); 600 int rtp_length_int = rtp_sender_->BuildRTPheader( 601 packet_, kPayload, kMarkerBit, kTimestamp, capture_time_ms); 602 ASSERT_NE(-1, rtp_length_int); 603 size_t rtp_length = static_cast<size_t>(rtp_length_int); 604 605 // Packet should be stored in a send bucket. 606 EXPECT_EQ(0, rtp_sender_->SendToNetwork(packet_, 607 0, 608 rtp_length, 609 capture_time_ms, 610 kAllowRetransmission, 611 PacedSender::kNormalPriority)); 612 613 EXPECT_EQ(0, transport_.packets_sent_); 614 615 const int kStoredTimeInMs = 100; 616 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs); 617 618 rtp_sender_->TimeToSendPacket(kSeqNum, capture_time_ms, false); 619 620 // Process send bucket. Packet should now be sent. 621 EXPECT_EQ(1, transport_.packets_sent_); 622 EXPECT_EQ(rtp_length, transport_.last_sent_packet_len_); 623 // Parse sent packet. 624 webrtc::RtpUtility::RtpHeaderParser rtp_parser(transport_.last_sent_packet_, 625 rtp_length); 626 webrtc::RTPHeader rtp_header; 627 RtpHeaderExtensionMap map; 628 map.Register(kRtpExtensionTransmissionTimeOffset, 629 kTransmissionTimeOffsetExtensionId); 630 map.Register(kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId); 631 const bool valid_rtp_header = rtp_parser.Parse(rtp_header, &map); 632 ASSERT_TRUE(valid_rtp_header); 633 634 // Verify transmission time offset. 635 EXPECT_EQ(kStoredTimeInMs * 90, rtp_header.extension.transmissionTimeOffset); 636 uint64_t expected_send_time = 637 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds()); 638 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime); 639} 640 641TEST_F(RtpSenderTest, TrafficSmoothingRetransmits) { 642 EXPECT_CALL(mock_paced_sender_, 643 SendPacket(PacedSender::kNormalPriority, _, kSeqNum, _, _, _)). 644 WillOnce(testing::Return(false)); 645 646 rtp_sender_->SetStorePacketsStatus(true, 10); 647 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( 648 kRtpExtensionTransmissionTimeOffset, kTransmissionTimeOffsetExtensionId)); 649 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( 650 kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId)); 651 rtp_sender_->SetTargetBitrate(300000); 652 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds(); 653 int rtp_length_int = rtp_sender_->BuildRTPheader( 654 packet_, kPayload, kMarkerBit, kTimestamp, capture_time_ms); 655 ASSERT_NE(-1, rtp_length_int); 656 size_t rtp_length = static_cast<size_t>(rtp_length_int); 657 658 // Packet should be stored in a send bucket. 659 EXPECT_EQ(0, rtp_sender_->SendToNetwork(packet_, 660 0, 661 rtp_length, 662 capture_time_ms, 663 kAllowRetransmission, 664 PacedSender::kNormalPriority)); 665 666 EXPECT_EQ(0, transport_.packets_sent_); 667 668 EXPECT_CALL(mock_paced_sender_, 669 SendPacket(PacedSender::kHighPriority, _, kSeqNum, _, _, _)). 670 WillOnce(testing::Return(false)); 671 672 const int kStoredTimeInMs = 100; 673 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs); 674 675 EXPECT_EQ(rtp_length_int, rtp_sender_->ReSendPacket(kSeqNum)); 676 EXPECT_EQ(0, transport_.packets_sent_); 677 678 rtp_sender_->TimeToSendPacket(kSeqNum, capture_time_ms, false); 679 680 // Process send bucket. Packet should now be sent. 681 EXPECT_EQ(1, transport_.packets_sent_); 682 EXPECT_EQ(rtp_length, transport_.last_sent_packet_len_); 683 684 // Parse sent packet. 685 webrtc::RtpUtility::RtpHeaderParser rtp_parser(transport_.last_sent_packet_, 686 rtp_length); 687 webrtc::RTPHeader rtp_header; 688 RtpHeaderExtensionMap map; 689 map.Register(kRtpExtensionTransmissionTimeOffset, 690 kTransmissionTimeOffsetExtensionId); 691 map.Register(kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId); 692 const bool valid_rtp_header = rtp_parser.Parse(rtp_header, &map); 693 ASSERT_TRUE(valid_rtp_header); 694 695 // Verify transmission time offset. 696 EXPECT_EQ(kStoredTimeInMs * 90, rtp_header.extension.transmissionTimeOffset); 697 uint64_t expected_send_time = 698 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds()); 699 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime); 700} 701 702// This test sends 1 regular video packet, then 4 padding packets, and then 703// 1 more regular packet. 704TEST_F(RtpSenderTest, SendPadding) { 705 // Make all (non-padding) packets go to send queue. 706 EXPECT_CALL(mock_paced_sender_, 707 SendPacket(PacedSender::kNormalPriority, _, _, _, _, _)). 708 WillRepeatedly(testing::Return(false)); 709 710 uint16_t seq_num = kSeqNum; 711 uint32_t timestamp = kTimestamp; 712 rtp_sender_->SetStorePacketsStatus(true, 10); 713 size_t rtp_header_len = kRtpHeaderSize; 714 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( 715 kRtpExtensionTransmissionTimeOffset, kTransmissionTimeOffsetExtensionId)); 716 rtp_header_len += 4; // 4 bytes extension. 717 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( 718 kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId)); 719 rtp_header_len += 4; // 4 bytes extension. 720 rtp_header_len += 4; // 4 extra bytes common to all extension headers. 721 722 // Create and set up parser. 723 rtc::scoped_ptr<webrtc::RtpHeaderParser> rtp_parser( 724 webrtc::RtpHeaderParser::Create()); 725 ASSERT_TRUE(rtp_parser.get() != NULL); 726 rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset, 727 kTransmissionTimeOffsetExtensionId); 728 rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, 729 kAbsoluteSendTimeExtensionId); 730 webrtc::RTPHeader rtp_header; 731 732 rtp_sender_->SetTargetBitrate(300000); 733 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds(); 734 int rtp_length_int = rtp_sender_->BuildRTPheader( 735 packet_, kPayload, kMarkerBit, timestamp, capture_time_ms); 736 ASSERT_NE(-1, rtp_length_int); 737 size_t rtp_length = static_cast<size_t>(rtp_length_int); 738 739 // Packet should be stored in a send bucket. 740 EXPECT_EQ(0, rtp_sender_->SendToNetwork(packet_, 741 0, 742 rtp_length, 743 capture_time_ms, 744 kAllowRetransmission, 745 PacedSender::kNormalPriority)); 746 747 int total_packets_sent = 0; 748 EXPECT_EQ(total_packets_sent, transport_.packets_sent_); 749 750 const int kStoredTimeInMs = 100; 751 fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs); 752 rtp_sender_->TimeToSendPacket(seq_num++, capture_time_ms, false); 753 // Packet should now be sent. This test doesn't verify the regular video 754 // packet, since it is tested in another test. 755 EXPECT_EQ(++total_packets_sent, transport_.packets_sent_); 756 timestamp += 90 * kStoredTimeInMs; 757 758 // Send padding 4 times, waiting 50 ms between each. 759 for (int i = 0; i < 4; ++i) { 760 const int kPaddingPeriodMs = 50; 761 const size_t kPaddingBytes = 100; 762 const size_t kMaxPaddingLength = 224; // Value taken from rtp_sender.cc. 763 // Padding will be forced to full packets. 764 EXPECT_EQ(kMaxPaddingLength, rtp_sender_->TimeToSendPadding(kPaddingBytes)); 765 766 // Process send bucket. Padding should now be sent. 767 EXPECT_EQ(++total_packets_sent, transport_.packets_sent_); 768 EXPECT_EQ(kMaxPaddingLength + rtp_header_len, 769 transport_.last_sent_packet_len_); 770 // Parse sent packet. 771 ASSERT_TRUE(rtp_parser->Parse(transport_.last_sent_packet_, kPaddingBytes, 772 &rtp_header)); 773 774 // Verify sequence number and timestamp. 775 EXPECT_EQ(seq_num++, rtp_header.sequenceNumber); 776 EXPECT_EQ(timestamp, rtp_header.timestamp); 777 // Verify transmission time offset. 778 EXPECT_EQ(0, rtp_header.extension.transmissionTimeOffset); 779 uint64_t expected_send_time = 780 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds()); 781 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime); 782 fake_clock_.AdvanceTimeMilliseconds(kPaddingPeriodMs); 783 timestamp += 90 * kPaddingPeriodMs; 784 } 785 786 // Send a regular video packet again. 787 capture_time_ms = fake_clock_.TimeInMilliseconds(); 788 rtp_length_int = rtp_sender_->BuildRTPheader( 789 packet_, kPayload, kMarkerBit, timestamp, capture_time_ms); 790 ASSERT_NE(-1, rtp_length_int); 791 rtp_length = static_cast<size_t>(rtp_length_int); 792 793 // Packet should be stored in a send bucket. 794 EXPECT_EQ(0, rtp_sender_->SendToNetwork(packet_, 795 0, 796 rtp_length, 797 capture_time_ms, 798 kAllowRetransmission, 799 PacedSender::kNormalPriority)); 800 801 rtp_sender_->TimeToSendPacket(seq_num, capture_time_ms, false); 802 // Process send bucket. 803 EXPECT_EQ(++total_packets_sent, transport_.packets_sent_); 804 EXPECT_EQ(rtp_length, transport_.last_sent_packet_len_); 805 // Parse sent packet. 806 ASSERT_TRUE(rtp_parser->Parse(transport_.last_sent_packet_, rtp_length, 807 &rtp_header)); 808 809 // Verify sequence number and timestamp. 810 EXPECT_EQ(seq_num, rtp_header.sequenceNumber); 811 EXPECT_EQ(timestamp, rtp_header.timestamp); 812 // Verify transmission time offset. This packet is sent without delay. 813 EXPECT_EQ(0, rtp_header.extension.transmissionTimeOffset); 814 uint64_t expected_send_time = 815 ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds()); 816 EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime); 817} 818 819TEST_F(RtpSenderTest, SendRedundantPayloads) { 820 MockTransport transport; 821 rtp_sender_.reset(new RTPSender(0, false, &fake_clock_, &transport, NULL, 822 &mock_paced_sender_, NULL, NULL, NULL)); 823 rtp_sender_->SetSequenceNumber(kSeqNum); 824 // Make all packets go through the pacer. 825 EXPECT_CALL(mock_paced_sender_, 826 SendPacket(PacedSender::kNormalPriority, _, _, _, _, _)). 827 WillRepeatedly(testing::Return(false)); 828 829 uint16_t seq_num = kSeqNum; 830 rtp_sender_->SetStorePacketsStatus(true, 10); 831 int32_t rtp_header_len = kRtpHeaderSize; 832 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( 833 kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId)); 834 rtp_header_len += 4; // 4 bytes extension. 835 rtp_header_len += 4; // 4 extra bytes common to all extension headers. 836 837 rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads); 838 rtp_sender_->SetRtxSsrc(1234); 839 840 // Create and set up parser. 841 rtc::scoped_ptr<webrtc::RtpHeaderParser> rtp_parser( 842 webrtc::RtpHeaderParser::Create()); 843 ASSERT_TRUE(rtp_parser.get() != NULL); 844 rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset, 845 kTransmissionTimeOffsetExtensionId); 846 rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime, 847 kAbsoluteSendTimeExtensionId); 848 rtp_sender_->SetTargetBitrate(300000); 849 const size_t kNumPayloadSizes = 10; 850 const size_t kPayloadSizes[kNumPayloadSizes] = {500, 550, 600, 650, 700, 750, 851 800, 850, 900, 950}; 852 // Send 10 packets of increasing size. 853 for (size_t i = 0; i < kNumPayloadSizes; ++i) { 854 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds(); 855 EXPECT_CALL(transport, SendPacket(_, _, _)) 856 .WillOnce(testing::ReturnArg<2>()); 857 SendPacket(capture_time_ms, kPayloadSizes[i]); 858 rtp_sender_->TimeToSendPacket(seq_num++, capture_time_ms, false); 859 fake_clock_.AdvanceTimeMilliseconds(33); 860 } 861 // The amount of padding to send it too small to send a payload packet. 862 EXPECT_CALL(transport, 863 SendPacket(_, _, kMaxPaddingSize + rtp_header_len)) 864 .WillOnce(testing::ReturnArg<2>()); 865 EXPECT_EQ(kMaxPaddingSize, rtp_sender_->TimeToSendPadding(49)); 866 867 EXPECT_CALL(transport, SendPacket(_, _, kPayloadSizes[0] + 868 rtp_header_len + kRtxHeaderSize)) 869 .WillOnce(testing::ReturnArg<2>()); 870 EXPECT_EQ(kPayloadSizes[0], rtp_sender_->TimeToSendPadding(500)); 871 872 EXPECT_CALL(transport, SendPacket(_, _, kPayloadSizes[kNumPayloadSizes - 1] + 873 rtp_header_len + kRtxHeaderSize)) 874 .WillOnce(testing::ReturnArg<2>()); 875 EXPECT_CALL(transport, SendPacket(_, _, kMaxPaddingSize + rtp_header_len)) 876 .WillOnce(testing::ReturnArg<2>()); 877 EXPECT_EQ(kPayloadSizes[kNumPayloadSizes - 1] + kMaxPaddingSize, 878 rtp_sender_->TimeToSendPadding(999)); 879} 880 881TEST_F(RtpSenderTest, SendGenericVideo) { 882 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC"; 883 const uint8_t payload_type = 127; 884 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000, 885 0, 1500)); 886 uint8_t payload[] = {47, 11, 32, 93, 89}; 887 888 // Send keyframe 889 ASSERT_EQ(0, rtp_sender_->SendOutgoingData(kVideoFrameKey, payload_type, 1234, 890 4321, payload, sizeof(payload), 891 NULL)); 892 893 RtpUtility::RtpHeaderParser rtp_parser(transport_.last_sent_packet_, 894 transport_.last_sent_packet_len_); 895 webrtc::RTPHeader rtp_header; 896 ASSERT_TRUE(rtp_parser.Parse(rtp_header)); 897 898 const uint8_t* payload_data = GetPayloadData(rtp_header, 899 transport_.last_sent_packet_); 900 uint8_t generic_header = *payload_data++; 901 902 ASSERT_EQ(sizeof(payload) + sizeof(generic_header), 903 GetPayloadDataLength(rtp_header, transport_.last_sent_packet_len_)); 904 905 EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kKeyFrameBit); 906 EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kFirstPacketBit); 907 908 EXPECT_EQ(0, memcmp(payload, payload_data, sizeof(payload))); 909 910 // Send delta frame 911 payload[0] = 13; 912 payload[1] = 42; 913 payload[4] = 13; 914 915 ASSERT_EQ(0, rtp_sender_->SendOutgoingData(kVideoFrameDelta, payload_type, 916 1234, 4321, payload, 917 sizeof(payload), NULL)); 918 919 RtpUtility::RtpHeaderParser rtp_parser2(transport_.last_sent_packet_, 920 transport_.last_sent_packet_len_); 921 ASSERT_TRUE(rtp_parser.Parse(rtp_header)); 922 923 payload_data = GetPayloadData(rtp_header, transport_.last_sent_packet_); 924 generic_header = *payload_data++; 925 926 EXPECT_FALSE(generic_header & RtpFormatVideoGeneric::kKeyFrameBit); 927 EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kFirstPacketBit); 928 929 ASSERT_EQ(sizeof(payload) + sizeof(generic_header), 930 GetPayloadDataLength(rtp_header, transport_.last_sent_packet_len_)); 931 932 EXPECT_EQ(0, memcmp(payload, payload_data, sizeof(payload))); 933} 934 935TEST_F(RtpSenderTest, FrameCountCallbacks) { 936 class TestCallback : public FrameCountObserver { 937 public: 938 TestCallback() : FrameCountObserver(), num_calls_(0), ssrc_(0) {} 939 virtual ~TestCallback() {} 940 941 void FrameCountUpdated(const FrameCounts& frame_counts, 942 uint32_t ssrc) override { 943 ++num_calls_; 944 ssrc_ = ssrc; 945 frame_counts_ = frame_counts; 946 } 947 948 uint32_t num_calls_; 949 uint32_t ssrc_; 950 FrameCounts frame_counts_; 951 } callback; 952 953 rtp_sender_.reset(new RTPSender(0, false, &fake_clock_, &transport_, NULL, 954 &mock_paced_sender_, NULL, &callback, NULL)); 955 956 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC"; 957 const uint8_t payload_type = 127; 958 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000, 959 0, 1500)); 960 uint8_t payload[] = {47, 11, 32, 93, 89}; 961 rtp_sender_->SetStorePacketsStatus(true, 1); 962 uint32_t ssrc = rtp_sender_->SSRC(); 963 964 ASSERT_EQ(0, rtp_sender_->SendOutgoingData(kVideoFrameKey, payload_type, 1234, 965 4321, payload, sizeof(payload), 966 NULL)); 967 968 EXPECT_EQ(1U, callback.num_calls_); 969 EXPECT_EQ(ssrc, callback.ssrc_); 970 EXPECT_EQ(1, callback.frame_counts_.key_frames); 971 EXPECT_EQ(0, callback.frame_counts_.delta_frames); 972 973 ASSERT_EQ(0, rtp_sender_->SendOutgoingData(kVideoFrameDelta, 974 payload_type, 1234, 4321, payload, 975 sizeof(payload), NULL)); 976 977 EXPECT_EQ(2U, callback.num_calls_); 978 EXPECT_EQ(ssrc, callback.ssrc_); 979 EXPECT_EQ(1, callback.frame_counts_.key_frames); 980 EXPECT_EQ(1, callback.frame_counts_.delta_frames); 981 982 rtp_sender_.reset(); 983} 984 985TEST_F(RtpSenderTest, BitrateCallbacks) { 986 class TestCallback : public BitrateStatisticsObserver { 987 public: 988 TestCallback() : BitrateStatisticsObserver(), num_calls_(0), ssrc_(0) {} 989 virtual ~TestCallback() {} 990 991 void Notify(const BitrateStatistics& total_stats, 992 const BitrateStatistics& retransmit_stats, 993 uint32_t ssrc) override { 994 ++num_calls_; 995 ssrc_ = ssrc; 996 total_stats_ = total_stats; 997 retransmit_stats_ = retransmit_stats; 998 } 999 1000 uint32_t num_calls_; 1001 uint32_t ssrc_; 1002 BitrateStatistics total_stats_; 1003 BitrateStatistics retransmit_stats_; 1004 } callback; 1005 rtp_sender_.reset(new RTPSender(0, false, &fake_clock_, &transport_, NULL, 1006 &mock_paced_sender_, &callback, NULL, NULL)); 1007 1008 // Simulate kNumPackets sent with kPacketInterval ms intervals. 1009 const uint32_t kNumPackets = 15; 1010 const uint32_t kPacketInterval = 20; 1011 // Overhead = 12 bytes RTP header + 1 byte generic header. 1012 const uint32_t kPacketOverhead = 13; 1013 1014 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC"; 1015 const uint8_t payload_type = 127; 1016 ASSERT_EQ( 1017 0, 1018 rtp_sender_->RegisterPayload(payload_name, payload_type, 90000, 0, 1500)); 1019 uint8_t payload[] = {47, 11, 32, 93, 89}; 1020 rtp_sender_->SetStorePacketsStatus(true, 1); 1021 uint32_t ssrc = rtp_sender_->SSRC(); 1022 1023 // Initial process call so we get a new time window. 1024 rtp_sender_->ProcessBitrate(); 1025 uint64_t start_time = fake_clock_.CurrentNtpInMilliseconds(); 1026 1027 // Send a few frames. 1028 for (uint32_t i = 0; i < kNumPackets; ++i) { 1029 ASSERT_EQ(0, 1030 rtp_sender_->SendOutgoingData(kVideoFrameKey, 1031 payload_type, 1032 1234, 1033 4321, 1034 payload, 1035 sizeof(payload), 1036 0)); 1037 fake_clock_.AdvanceTimeMilliseconds(kPacketInterval); 1038 } 1039 1040 rtp_sender_->ProcessBitrate(); 1041 1042 const uint32_t expected_packet_rate = 1000 / kPacketInterval; 1043 1044 // We get one call for every stats updated, thus two calls since both the 1045 // stream stats and the retransmit stats are updated once. 1046 EXPECT_EQ(2u, callback.num_calls_); 1047 EXPECT_EQ(ssrc, callback.ssrc_); 1048 EXPECT_EQ(start_time + (kNumPackets * kPacketInterval), 1049 callback.total_stats_.timestamp_ms); 1050 EXPECT_EQ(expected_packet_rate, callback.total_stats_.packet_rate); 1051 EXPECT_EQ((kPacketOverhead + sizeof(payload)) * 8 * expected_packet_rate, 1052 callback.total_stats_.bitrate_bps); 1053 1054 rtp_sender_.reset(); 1055} 1056 1057class RtpSenderAudioTest : public RtpSenderTest { 1058 protected: 1059 RtpSenderAudioTest() {} 1060 1061 void SetUp() override { 1062 payload_ = kAudioPayload; 1063 rtp_sender_.reset(new RTPSender(0, true, &fake_clock_, &transport_, NULL, 1064 &mock_paced_sender_, NULL, NULL, NULL)); 1065 rtp_sender_->SetSequenceNumber(kSeqNum); 1066 } 1067}; 1068 1069TEST_F(RtpSenderTest, StreamDataCountersCallbacks) { 1070 class TestCallback : public StreamDataCountersCallback { 1071 public: 1072 TestCallback() 1073 : StreamDataCountersCallback(), ssrc_(0), counters_() {} 1074 virtual ~TestCallback() {} 1075 1076 void DataCountersUpdated(const StreamDataCounters& counters, 1077 uint32_t ssrc) override { 1078 ssrc_ = ssrc; 1079 counters_ = counters; 1080 } 1081 1082 uint32_t ssrc_; 1083 StreamDataCounters counters_; 1084 1085 void MatchPacketCounter(const RtpPacketCounter& expected, 1086 const RtpPacketCounter& actual) { 1087 EXPECT_EQ(expected.payload_bytes, actual.payload_bytes); 1088 EXPECT_EQ(expected.header_bytes, actual.header_bytes); 1089 EXPECT_EQ(expected.padding_bytes, actual.padding_bytes); 1090 EXPECT_EQ(expected.packets, actual.packets); 1091 } 1092 1093 void Matches(uint32_t ssrc, const StreamDataCounters& counters) { 1094 EXPECT_EQ(ssrc, ssrc_); 1095 MatchPacketCounter(counters.transmitted, counters_.transmitted); 1096 MatchPacketCounter(counters.retransmitted, counters_.retransmitted); 1097 EXPECT_EQ(counters.fec.packets, counters_.fec.packets); 1098 } 1099 1100 } callback; 1101 1102 const uint8_t kRedPayloadType = 96; 1103 const uint8_t kUlpfecPayloadType = 97; 1104 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC"; 1105 const uint8_t payload_type = 127; 1106 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000, 1107 0, 1500)); 1108 uint8_t payload[] = {47, 11, 32, 93, 89}; 1109 rtp_sender_->SetStorePacketsStatus(true, 1); 1110 uint32_t ssrc = rtp_sender_->SSRC(); 1111 1112 rtp_sender_->RegisterRtpStatisticsCallback(&callback); 1113 1114 // Send a frame. 1115 ASSERT_EQ(0, rtp_sender_->SendOutgoingData(kVideoFrameKey, payload_type, 1234, 1116 4321, payload, sizeof(payload), 1117 NULL)); 1118 StreamDataCounters expected; 1119 expected.transmitted.payload_bytes = 6; 1120 expected.transmitted.header_bytes = 12; 1121 expected.transmitted.padding_bytes = 0; 1122 expected.transmitted.packets = 1; 1123 expected.retransmitted.payload_bytes = 0; 1124 expected.retransmitted.header_bytes = 0; 1125 expected.retransmitted.padding_bytes = 0; 1126 expected.retransmitted.packets = 0; 1127 expected.fec.packets = 0; 1128 callback.Matches(ssrc, expected); 1129 1130 // Retransmit a frame. 1131 uint16_t seqno = rtp_sender_->SequenceNumber() - 1; 1132 rtp_sender_->ReSendPacket(seqno, 0); 1133 expected.transmitted.payload_bytes = 12; 1134 expected.transmitted.header_bytes = 24; 1135 expected.transmitted.packets = 2; 1136 expected.retransmitted.payload_bytes = 6; 1137 expected.retransmitted.header_bytes = 12; 1138 expected.retransmitted.padding_bytes = 0; 1139 expected.retransmitted.packets = 1; 1140 callback.Matches(ssrc, expected); 1141 1142 // Send padding. 1143 rtp_sender_->TimeToSendPadding(kMaxPaddingSize); 1144 expected.transmitted.payload_bytes = 12; 1145 expected.transmitted.header_bytes = 36; 1146 expected.transmitted.padding_bytes = kMaxPaddingSize; 1147 expected.transmitted.packets = 3; 1148 callback.Matches(ssrc, expected); 1149 1150 // Send FEC. 1151 rtp_sender_->SetGenericFECStatus(true, kRedPayloadType, kUlpfecPayloadType); 1152 FecProtectionParams fec_params; 1153 fec_params.fec_mask_type = kFecMaskRandom; 1154 fec_params.fec_rate = 1; 1155 fec_params.max_fec_frames = 1; 1156 fec_params.use_uep_protection = false; 1157 rtp_sender_->SetFecParameters(&fec_params, &fec_params); 1158 ASSERT_EQ(0, rtp_sender_->SendOutgoingData(kVideoFrameDelta, payload_type, 1159 1234, 4321, payload, 1160 sizeof(payload), NULL)); 1161 expected.transmitted.payload_bytes = 40; 1162 expected.transmitted.header_bytes = 60; 1163 expected.transmitted.packets = 5; 1164 expected.fec.packets = 1; 1165 callback.Matches(ssrc, expected); 1166 1167 rtp_sender_->RegisterRtpStatisticsCallback(NULL); 1168} 1169 1170TEST_F(RtpSenderAudioTest, SendAudio) { 1171 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "PAYLOAD_NAME"; 1172 const uint8_t payload_type = 127; 1173 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 48000, 1174 0, 1500)); 1175 uint8_t payload[] = {47, 11, 32, 93, 89}; 1176 1177 ASSERT_EQ(0, rtp_sender_->SendOutgoingData(kAudioFrameCN, payload_type, 1234, 1178 4321, payload, sizeof(payload), 1179 NULL)); 1180 1181 RtpUtility::RtpHeaderParser rtp_parser(transport_.last_sent_packet_, 1182 transport_.last_sent_packet_len_); 1183 webrtc::RTPHeader rtp_header; 1184 ASSERT_TRUE(rtp_parser.Parse(rtp_header)); 1185 1186 const uint8_t* payload_data = GetPayloadData(rtp_header, 1187 transport_.last_sent_packet_); 1188 1189 ASSERT_EQ(sizeof(payload), 1190 GetPayloadDataLength(rtp_header, transport_.last_sent_packet_len_)); 1191 1192 EXPECT_EQ(0, memcmp(payload, payload_data, sizeof(payload))); 1193} 1194 1195TEST_F(RtpSenderAudioTest, SendAudioWithAudioLevelExtension) { 1196 EXPECT_EQ(0, rtp_sender_->SetAudioLevel(kAudioLevel)); 1197 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( 1198 kRtpExtensionAudioLevel, kAudioLevelExtensionId)); 1199 1200 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "PAYLOAD_NAME"; 1201 const uint8_t payload_type = 127; 1202 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 48000, 1203 0, 1500)); 1204 uint8_t payload[] = {47, 11, 32, 93, 89}; 1205 1206 ASSERT_EQ(0, rtp_sender_->SendOutgoingData(kAudioFrameCN, payload_type, 1234, 1207 4321, payload, sizeof(payload), 1208 NULL)); 1209 1210 RtpUtility::RtpHeaderParser rtp_parser(transport_.last_sent_packet_, 1211 transport_.last_sent_packet_len_); 1212 webrtc::RTPHeader rtp_header; 1213 ASSERT_TRUE(rtp_parser.Parse(rtp_header)); 1214 1215 const uint8_t* payload_data = GetPayloadData(rtp_header, 1216 transport_.last_sent_packet_); 1217 1218 ASSERT_EQ(sizeof(payload), 1219 GetPayloadDataLength(rtp_header, transport_.last_sent_packet_len_)); 1220 1221 EXPECT_EQ(0, memcmp(payload, payload_data, sizeof(payload))); 1222 1223 uint8_t extension[] = { 0xbe, 0xde, 0x00, 0x01, 1224 (kAudioLevelExtensionId << 4) + 0, // ID + length. 1225 kAudioLevel, // Data. 1226 0x00, 0x00 // Padding. 1227 }; 1228 1229 EXPECT_EQ(0, memcmp(extension, payload_data - sizeof(extension), 1230 sizeof(extension))); 1231} 1232 1233// As RFC4733, named telephone events are carried as part of the audio stream 1234// and must use the same sequence number and timestamp base as the regular 1235// audio channel. 1236// This test checks the marker bit for the first packet and the consequent 1237// packets of the same telephone event. Since it is specifically for DTMF 1238// events, ignoring audio packets and sending kFrameEmpty instead of those. 1239TEST_F(RtpSenderAudioTest, CheckMarkerBitForTelephoneEvents) { 1240 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "telephone-event"; 1241 uint8_t payload_type = 126; 1242 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 0, 1243 0, 0)); 1244 // For Telephone events, payload is not added to the registered payload list, 1245 // it will register only the payload used for audio stream. 1246 // Registering the payload again for audio stream with different payload name. 1247 strcpy(payload_name, "payload_name"); 1248 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 8000, 1249 1, 0)); 1250 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds(); 1251 // DTMF event key=9, duration=500 and attenuationdB=10 1252 rtp_sender_->SendTelephoneEvent(9, 500, 10); 1253 // During start, it takes the starting timestamp as last sent timestamp. 1254 // The duration is calculated as the difference of current and last sent 1255 // timestamp. So for first call it will skip since the duration is zero. 1256 ASSERT_EQ(0, rtp_sender_->SendOutgoingData(kFrameEmpty, payload_type, 1257 capture_time_ms, 1258 0, NULL, 0, 1259 NULL)); 1260 // DTMF Sample Length is (Frequency/1000) * Duration. 1261 // So in this case, it is (8000/1000) * 500 = 4000. 1262 // Sending it as two packets. 1263 ASSERT_EQ(0, rtp_sender_->SendOutgoingData(kFrameEmpty, payload_type, 1264 capture_time_ms+2000, 1265 0, NULL, 0, 1266 NULL)); 1267 rtc::scoped_ptr<webrtc::RtpHeaderParser> rtp_parser( 1268 webrtc::RtpHeaderParser::Create()); 1269 ASSERT_TRUE(rtp_parser.get() != NULL); 1270 webrtc::RTPHeader rtp_header; 1271 ASSERT_TRUE(rtp_parser->Parse(transport_.last_sent_packet_, 1272 transport_.last_sent_packet_len_, 1273 &rtp_header)); 1274 // Marker Bit should be set to 1 for first packet. 1275 EXPECT_TRUE(rtp_header.markerBit); 1276 1277 ASSERT_EQ(0, rtp_sender_->SendOutgoingData(kFrameEmpty, payload_type, 1278 capture_time_ms+4000, 1279 0, NULL, 0, 1280 NULL)); 1281 ASSERT_TRUE(rtp_parser->Parse(transport_.last_sent_packet_, 1282 transport_.last_sent_packet_len_, 1283 &rtp_header)); 1284 // Marker Bit should be set to 0 for rest of the packets. 1285 EXPECT_FALSE(rtp_header.markerBit); 1286} 1287 1288TEST_F(RtpSenderTest, BytesReportedCorrectly) { 1289 const char* kPayloadName = "GENERIC"; 1290 const uint8_t kPayloadType = 127; 1291 rtp_sender_->SetSSRC(1234); 1292 rtp_sender_->SetRtxSsrc(4321); 1293 rtp_sender_->SetRtxPayloadType(kPayloadType - 1); 1294 rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads); 1295 1296 ASSERT_EQ( 1297 0, 1298 rtp_sender_->RegisterPayload(kPayloadName, kPayloadType, 90000, 0, 1500)); 1299 uint8_t payload[] = {47, 11, 32, 93, 89}; 1300 1301 ASSERT_EQ(0, 1302 rtp_sender_->SendOutgoingData(kVideoFrameKey, 1303 kPayloadType, 1304 1234, 1305 4321, 1306 payload, 1307 sizeof(payload), 1308 0)); 1309 1310 // Will send 2 full-size padding packets. 1311 rtp_sender_->TimeToSendPadding(1); 1312 rtp_sender_->TimeToSendPadding(1); 1313 1314 StreamDataCounters rtp_stats; 1315 StreamDataCounters rtx_stats; 1316 rtp_sender_->GetDataCounters(&rtp_stats, &rtx_stats); 1317 1318 // Payload + 1-byte generic header. 1319 EXPECT_GT(rtp_stats.first_packet_time_ms, -1); 1320 EXPECT_EQ(rtp_stats.transmitted.payload_bytes, sizeof(payload) + 1); 1321 EXPECT_EQ(rtp_stats.transmitted.header_bytes, 12u); 1322 EXPECT_EQ(rtp_stats.transmitted.padding_bytes, 0u); 1323 EXPECT_EQ(rtx_stats.transmitted.payload_bytes, 0u); 1324 EXPECT_EQ(rtx_stats.transmitted.header_bytes, 24u); 1325 EXPECT_EQ(rtx_stats.transmitted.padding_bytes, 2 * kMaxPaddingSize); 1326 1327 EXPECT_EQ(rtp_stats.transmitted.TotalBytes(), 1328 rtp_stats.transmitted.payload_bytes + 1329 rtp_stats.transmitted.header_bytes + 1330 rtp_stats.transmitted.padding_bytes); 1331 EXPECT_EQ(rtx_stats.transmitted.TotalBytes(), 1332 rtx_stats.transmitted.payload_bytes + 1333 rtx_stats.transmitted.header_bytes + 1334 rtx_stats.transmitted.padding_bytes); 1335 1336 EXPECT_EQ(transport_.total_bytes_sent_, 1337 rtp_stats.transmitted.TotalBytes() + 1338 rtx_stats.transmitted.TotalBytes()); 1339} 1340 1341// Verify that all packets of a frame have CVO byte set. 1342TEST_F(RtpSenderVideoTest, SendVideoWithCVO) { 1343 RTPVideoHeader hdr = {0}; 1344 hdr.rotation = kVideoRotation_90; 1345 1346 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( 1347 kRtpExtensionVideoRotation, kVideoRotationExtensionId)); 1348 EXPECT_TRUE(rtp_sender_->ActivateCVORtpHeaderExtension()); 1349 1350 EXPECT_EQ( 1351 RtpUtility::Word32Align(kRtpOneByteHeaderLength + kVideoRotationLength), 1352 rtp_sender_->RtpHeaderExtensionTotalLength()); 1353 1354 rtp_sender_video_->SendVideo(kRtpVideoGeneric, kVideoFrameKey, kPayload, 1355 kTimestamp, 0, packet_, sizeof(packet_), NULL, 1356 &hdr); 1357 1358 RtpHeaderExtensionMap map; 1359 map.Register(kRtpExtensionVideoRotation, kVideoRotationExtensionId); 1360 1361 // Verify that this packet does have CVO byte. 1362 VerifyCVOPacket( 1363 reinterpret_cast<uint8_t*>(transport_.sent_packets_[0]->data()), 1364 transport_.sent_packets_[0]->size(), true, &map, kSeqNum, hdr.rotation); 1365 1366 // Verify that this packet does have CVO byte. 1367 VerifyCVOPacket( 1368 reinterpret_cast<uint8_t*>(transport_.sent_packets_[1]->data()), 1369 transport_.sent_packets_[1]->size(), true, &map, kSeqNum + 1, 1370 hdr.rotation); 1371} 1372} // namespace webrtc 1373