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