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