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