rtp_sender_unittest.cc revision 71f055fb41336316324942f828e022e2f7d93ec7
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;
41}  // namespace
42
43using testing::_;
44
45const uint8_t* GetPayloadData(const RTPHeader& rtp_header,
46                              const uint8_t* packet) {
47  return packet + rtp_header.headerLength;
48}
49
50uint16_t GetPayloadDataLength(const RTPHeader& rtp_header,
51                              const uint16_t packet_length) {
52  uint16_t length = packet_length - rtp_header.headerLength -
53      rtp_header.paddingLength;
54  return static_cast<uint16_t>(length);
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),
65      last_sent_packet_len_(0) {
66  }
67  virtual int SendPacket(int channel, const void *data, int len) {
68    packets_sent_++;
69    memcpy(last_sent_packet_, data, len);
70    last_sent_packet_len_ = len;
71    return len;
72  }
73  virtual int SendRTCPPacket(int channel, const void *data, int len) {
74    return -1;
75  }
76  int packets_sent_;
77  int last_sent_packet_len_;
78  uint8_t last_sent_packet_[kMaxPacketLength];
79};
80
81class RtpSenderTest : public ::testing::Test {
82 protected:
83  RtpSenderTest()
84    : fake_clock_(123456789),
85      mock_paced_sender_(),
86      rtp_sender_(),
87      payload_(kPayload),
88      transport_(),
89      kMarkerBit(true) {
90    EXPECT_CALL(mock_paced_sender_,
91        SendPacket(_, _, _, _, _, _)).WillRepeatedly(testing::Return(true));
92  }
93
94  virtual void SetUp() {
95    rtp_sender_.reset(new RTPSender(0, false, &fake_clock_, &transport_, NULL,
96                                    &mock_paced_sender_));
97    rtp_sender_->SetSequenceNumber(kSeqNum);
98  }
99
100  SimulatedClock fake_clock_;
101  MockPacedSender mock_paced_sender_;
102  scoped_ptr<RTPSender> rtp_sender_;
103  int payload_;
104  LoopbackTransportTest transport_;
105  const bool kMarkerBit;
106  uint8_t packet_[kMaxPacketLength];
107
108  void VerifyRTPHeaderCommon(const RTPHeader& rtp_header) {
109    EXPECT_EQ(kMarkerBit, rtp_header.markerBit);
110    EXPECT_EQ(payload_, rtp_header.payloadType);
111    EXPECT_EQ(kSeqNum, rtp_header.sequenceNumber);
112    EXPECT_EQ(kTimestamp, rtp_header.timestamp);
113    EXPECT_EQ(rtp_sender_->SSRC(), rtp_header.ssrc);
114    EXPECT_EQ(0, rtp_header.numCSRCs);
115    EXPECT_EQ(0, rtp_header.paddingLength);
116  }
117
118  void SendPacket(int64_t capture_time_ms, int payload_length) {
119    uint32_t timestamp = capture_time_ms * 90;
120    int32_t rtp_length = rtp_sender_->BuildRTPheader(packet_,
121                                                     kPayload,
122                                                     kMarkerBit,
123                                                     timestamp,
124                                                     capture_time_ms);
125
126    // Packet should be stored in a send bucket.
127    EXPECT_EQ(0, rtp_sender_->SendToNetwork(packet_,
128                                            payload_length,
129                                            rtp_length,
130                                            capture_time_ms,
131                                            kAllowRetransmission,
132                                            PacedSender::kNormalPriority));
133  }
134};
135
136TEST_F(RtpSenderTest, RegisterRtpTransmissionTimeOffsetHeaderExtension) {
137  EXPECT_EQ(0, rtp_sender_->RtpHeaderExtensionTotalLength());
138  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
139      kRtpExtensionTransmissionTimeOffset, kTransmissionTimeOffsetExtensionId));
140  EXPECT_EQ(kRtpOneByteHeaderLength + kTransmissionTimeOffsetLength,
141            rtp_sender_->RtpHeaderExtensionTotalLength());
142  EXPECT_EQ(0, rtp_sender_->DeregisterRtpHeaderExtension(
143      kRtpExtensionTransmissionTimeOffset));
144  EXPECT_EQ(0, rtp_sender_->RtpHeaderExtensionTotalLength());
145}
146
147TEST_F(RtpSenderTest, RegisterRtpAbsoluteSendTimeHeaderExtension) {
148  EXPECT_EQ(0, rtp_sender_->RtpHeaderExtensionTotalLength());
149  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
150      kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId));
151  EXPECT_EQ(kRtpOneByteHeaderLength + kAbsoluteSendTimeLength,
152            rtp_sender_->RtpHeaderExtensionTotalLength());
153  EXPECT_EQ(0, rtp_sender_->DeregisterRtpHeaderExtension(
154      kRtpExtensionAbsoluteSendTime));
155  EXPECT_EQ(0, rtp_sender_->RtpHeaderExtensionTotalLength());
156}
157
158TEST_F(RtpSenderTest, RegisterRtpAudioLevelHeaderExtension) {
159  EXPECT_EQ(0, rtp_sender_->RtpHeaderExtensionTotalLength());
160  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
161      kRtpExtensionAudioLevel, kAudioLevelExtensionId));
162  // Accounted size for audio level is zero because it is currently specially
163  // treated by RTPSenderAudio.
164  EXPECT_EQ(0, rtp_sender_->RtpHeaderExtensionTotalLength());
165  // EXPECT_EQ(kRtpOneByteHeaderLength + kAudioLevelLength,
166  //           rtp_sender_->RtpHeaderExtensionTotalLength());
167  EXPECT_EQ(0, rtp_sender_->DeregisterRtpHeaderExtension(
168      kRtpExtensionAudioLevel));
169  EXPECT_EQ(0, rtp_sender_->RtpHeaderExtensionTotalLength());
170}
171
172TEST_F(RtpSenderTest, RegisterRtpHeaderExtensions) {
173  EXPECT_EQ(0, 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, rtp_sender_->RtpHeaderExtensionTotalLength());
186  EXPECT_EQ(0, rtp_sender_->DeregisterRtpHeaderExtension(
187      kRtpExtensionTransmissionTimeOffset));
188  EXPECT_EQ(kRtpOneByteHeaderLength + kAbsoluteSendTimeLength,
189      rtp_sender_->RtpHeaderExtensionTotalLength());
190  EXPECT_EQ(0, rtp_sender_->DeregisterRtpHeaderExtension(
191      kRtpExtensionAbsoluteSendTime));
192  EXPECT_EQ(0, rtp_sender_->RtpHeaderExtensionTotalLength());
193  EXPECT_EQ(0, rtp_sender_->DeregisterRtpHeaderExtension(
194      kRtpExtensionAudioLevel));
195  EXPECT_EQ(0, rtp_sender_->RtpHeaderExtensionTotalLength());
196}
197
198TEST_F(RtpSenderTest, BuildRTPPacket) {
199  int32_t length = rtp_sender_->BuildRTPheader(packet_,
200                                               kPayload,
201                                               kMarkerBit,
202                                               kTimestamp,
203                                               0);
204  EXPECT_EQ(12, length);
205
206  // Verify
207  webrtc::ModuleRTPUtility::RTPHeaderParser rtp_parser(packet_, length);
208  webrtc::RTPHeader rtp_header;
209
210  RtpHeaderExtensionMap map;
211  map.Register(kRtpExtensionTransmissionTimeOffset,
212               kTransmissionTimeOffsetExtensionId);
213  const bool valid_rtp_header = rtp_parser.Parse(rtp_header, &map);
214
215  ASSERT_TRUE(valid_rtp_header);
216  ASSERT_FALSE(rtp_parser.RTCP());
217  VerifyRTPHeaderCommon(rtp_header);
218  EXPECT_EQ(length, rtp_header.headerLength);
219  EXPECT_EQ(0, rtp_header.extension.transmissionTimeOffset);
220  EXPECT_EQ(0u, rtp_header.extension.absoluteSendTime);
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  int32_t length = rtp_sender_->BuildRTPheader(packet_,
229                                               kPayload,
230                                               kMarkerBit,
231                                               kTimestamp,
232                                               0);
233  EXPECT_EQ(12 + rtp_sender_->RtpHeaderExtensionTotalLength(), length);
234
235  // Verify
236  webrtc::ModuleRTPUtility::RTPHeaderParser rtp_parser(packet_, length);
237  webrtc::RTPHeader rtp_header;
238
239  RtpHeaderExtensionMap map;
240  map.Register(kRtpExtensionTransmissionTimeOffset,
241               kTransmissionTimeOffsetExtensionId);
242  const bool valid_rtp_header = rtp_parser.Parse(rtp_header, &map);
243
244  ASSERT_TRUE(valid_rtp_header);
245  ASSERT_FALSE(rtp_parser.RTCP());
246  VerifyRTPHeaderCommon(rtp_header);
247  EXPECT_EQ(length, rtp_header.headerLength);
248  EXPECT_EQ(kTimeOffset, rtp_header.extension.transmissionTimeOffset);
249
250  // Parse without map extension
251  webrtc::RTPHeader rtp_header2;
252  const bool valid_rtp_header2 = rtp_parser.Parse(rtp_header2, NULL);
253
254  ASSERT_TRUE(valid_rtp_header2);
255  VerifyRTPHeaderCommon(rtp_header2);
256  EXPECT_EQ(length, rtp_header2.headerLength);
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  int32_t length = rtp_sender_->BuildRTPheader(packet_,
267                                               kPayload,
268                                               kMarkerBit,
269                                               kTimestamp,
270                                               0);
271  EXPECT_EQ(12 + rtp_sender_->RtpHeaderExtensionTotalLength(), length);
272
273  // Verify
274  webrtc::ModuleRTPUtility::RTPHeaderParser rtp_parser(packet_, length);
275  webrtc::RTPHeader rtp_header;
276
277  RtpHeaderExtensionMap map;
278  map.Register(kRtpExtensionTransmissionTimeOffset,
279               kTransmissionTimeOffsetExtensionId);
280  const bool valid_rtp_header = rtp_parser.Parse(rtp_header, &map);
281
282  ASSERT_TRUE(valid_rtp_header);
283  ASSERT_FALSE(rtp_parser.RTCP());
284  VerifyRTPHeaderCommon(rtp_header);
285  EXPECT_EQ(length, rtp_header.headerLength);
286  EXPECT_EQ(kNegTimeOffset, rtp_header.extension.transmissionTimeOffset);
287}
288
289TEST_F(RtpSenderTest, BuildRTPPacketWithAbsoluteSendTimeExtension) {
290  EXPECT_EQ(0, rtp_sender_->SetAbsoluteSendTime(kAbsoluteSendTime));
291  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
292      kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId));
293
294  int32_t length = rtp_sender_->BuildRTPheader(packet_,
295                                               kPayload,
296                                               kMarkerBit,
297                                               kTimestamp,
298                                               0);
299  EXPECT_EQ(12 + rtp_sender_->RtpHeaderExtensionTotalLength(), length);
300
301  // Verify
302  webrtc::ModuleRTPUtility::RTPHeaderParser rtp_parser(packet_, length);
303  webrtc::RTPHeader rtp_header;
304
305  RtpHeaderExtensionMap map;
306  map.Register(kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId);
307  const bool valid_rtp_header = rtp_parser.Parse(rtp_header, &map);
308
309  ASSERT_TRUE(valid_rtp_header);
310  ASSERT_FALSE(rtp_parser.RTCP());
311  VerifyRTPHeaderCommon(rtp_header);
312  EXPECT_EQ(length, rtp_header.headerLength);
313  EXPECT_EQ(kAbsoluteSendTime, rtp_header.extension.absoluteSendTime);
314
315  // Parse without map extension
316  webrtc::RTPHeader rtp_header2;
317  const bool valid_rtp_header2 = rtp_parser.Parse(rtp_header2, NULL);
318
319  ASSERT_TRUE(valid_rtp_header2);
320  VerifyRTPHeaderCommon(rtp_header2);
321  EXPECT_EQ(length, rtp_header2.headerLength);
322  EXPECT_EQ(0u, rtp_header2.extension.absoluteSendTime);
323}
324
325TEST_F(RtpSenderTest, BuildRTPPacketWithHeaderExtensions) {
326  EXPECT_EQ(0, rtp_sender_->SetTransmissionTimeOffset(kTimeOffset));
327  EXPECT_EQ(0, rtp_sender_->SetAbsoluteSendTime(kAbsoluteSendTime));
328  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
329      kRtpExtensionTransmissionTimeOffset, kTransmissionTimeOffsetExtensionId));
330  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
331      kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId));
332
333  int32_t length = rtp_sender_->BuildRTPheader(packet_,
334                                               kPayload,
335                                               kMarkerBit,
336                                               kTimestamp,
337                                               0);
338  EXPECT_EQ(12 + rtp_sender_->RtpHeaderExtensionTotalLength(), length);
339
340  // Verify
341  webrtc::ModuleRTPUtility::RTPHeaderParser rtp_parser(packet_, length);
342  webrtc::RTPHeader rtp_header;
343
344  RtpHeaderExtensionMap map;
345  map.Register(kRtpExtensionTransmissionTimeOffset,
346               kTransmissionTimeOffsetExtensionId);
347  map.Register(kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId);
348  const bool valid_rtp_header = rtp_parser.Parse(rtp_header, &map);
349
350  ASSERT_TRUE(valid_rtp_header);
351  ASSERT_FALSE(rtp_parser.RTCP());
352  VerifyRTPHeaderCommon(rtp_header);
353  EXPECT_EQ(length, rtp_header.headerLength);
354  EXPECT_EQ(kTimeOffset, rtp_header.extension.transmissionTimeOffset);
355  EXPECT_EQ(kAbsoluteSendTime, rtp_header.extension.absoluteSendTime);
356
357  // Parse without map extension
358  webrtc::RTPHeader rtp_header2;
359  const bool valid_rtp_header2 = rtp_parser.Parse(rtp_header2, NULL);
360
361  ASSERT_TRUE(valid_rtp_header2);
362  VerifyRTPHeaderCommon(rtp_header2);
363  EXPECT_EQ(length, rtp_header2.headerLength);
364  EXPECT_EQ(0, rtp_header2.extension.transmissionTimeOffset);
365  EXPECT_EQ(0u, rtp_header2.extension.absoluteSendTime);
366}
367
368TEST_F(RtpSenderTest, TrafficSmoothingWithExtensions) {
369  EXPECT_CALL(mock_paced_sender_,
370              SendPacket(PacedSender::kNormalPriority, _, kSeqNum, _, _, _)).
371                  WillOnce(testing::Return(false));
372
373  rtp_sender_->SetStorePacketsStatus(true, 10);
374  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
375      kRtpExtensionTransmissionTimeOffset, kTransmissionTimeOffsetExtensionId));
376  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
377      kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId));
378  rtp_sender_->SetTargetSendBitrate(300000);
379  int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
380  int32_t rtp_length = rtp_sender_->BuildRTPheader(packet_,
381                                                   kPayload,
382                                                   kMarkerBit,
383                                                   kTimestamp,
384                                                   capture_time_ms);
385
386  // Packet should be stored in a send bucket.
387  EXPECT_EQ(0, rtp_sender_->SendToNetwork(packet_,
388                                          0,
389                                          rtp_length,
390                                          capture_time_ms,
391                                          kAllowRetransmission,
392                                          PacedSender::kNormalPriority));
393
394  EXPECT_EQ(0, transport_.packets_sent_);
395
396  const int kStoredTimeInMs = 100;
397  fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
398
399  rtp_sender_->TimeToSendPacket(kSeqNum, capture_time_ms, false);
400
401  // Process send bucket. Packet should now be sent.
402  EXPECT_EQ(1, transport_.packets_sent_);
403  EXPECT_EQ(rtp_length, transport_.last_sent_packet_len_);
404  // Parse sent packet.
405  webrtc::ModuleRTPUtility::RTPHeaderParser rtp_parser(
406      transport_.last_sent_packet_, rtp_length);
407  webrtc::RTPHeader rtp_header;
408  RtpHeaderExtensionMap map;
409  map.Register(kRtpExtensionTransmissionTimeOffset,
410               kTransmissionTimeOffsetExtensionId);
411  map.Register(kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId);
412  const bool valid_rtp_header = rtp_parser.Parse(rtp_header, &map);
413  ASSERT_TRUE(valid_rtp_header);
414
415  // Verify transmission time offset.
416  EXPECT_EQ(kStoredTimeInMs * 90, rtp_header.extension.transmissionTimeOffset);
417  uint64_t expected_send_time =
418      ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds());
419  EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime);
420}
421
422TEST_F(RtpSenderTest, TrafficSmoothingRetransmits) {
423  EXPECT_CALL(mock_paced_sender_,
424              SendPacket(PacedSender::kNormalPriority, _, kSeqNum, _, _, _)).
425                  WillOnce(testing::Return(false));
426
427  rtp_sender_->SetStorePacketsStatus(true, 10);
428  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
429      kRtpExtensionTransmissionTimeOffset, kTransmissionTimeOffsetExtensionId));
430  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
431      kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId));
432  rtp_sender_->SetTargetSendBitrate(300000);
433  int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
434  int32_t rtp_length = rtp_sender_->BuildRTPheader(packet_,
435                                                   kPayload,
436                                                   kMarkerBit,
437                                                   kTimestamp,
438                                                   capture_time_ms);
439
440  // Packet should be stored in a send bucket.
441  EXPECT_EQ(0, rtp_sender_->SendToNetwork(packet_,
442                                          0,
443                                          rtp_length,
444                                          capture_time_ms,
445                                          kAllowRetransmission,
446                                          PacedSender::kNormalPriority));
447
448  EXPECT_EQ(0, transport_.packets_sent_);
449
450  EXPECT_CALL(mock_paced_sender_,
451              SendPacket(PacedSender::kHighPriority, _, kSeqNum, _, _, _)).
452                  WillOnce(testing::Return(false));
453
454  const int kStoredTimeInMs = 100;
455  fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
456
457  EXPECT_EQ(rtp_length, rtp_sender_->ReSendPacket(kSeqNum));
458  EXPECT_EQ(0, transport_.packets_sent_);
459
460  rtp_sender_->TimeToSendPacket(kSeqNum, capture_time_ms, false);
461
462  // Process send bucket. Packet should now be sent.
463  EXPECT_EQ(1, transport_.packets_sent_);
464  EXPECT_EQ(rtp_length, transport_.last_sent_packet_len_);
465
466  // Parse sent packet.
467  webrtc::ModuleRTPUtility::RTPHeaderParser rtp_parser(
468      transport_.last_sent_packet_, rtp_length);
469  webrtc::RTPHeader rtp_header;
470  RtpHeaderExtensionMap map;
471  map.Register(kRtpExtensionTransmissionTimeOffset,
472               kTransmissionTimeOffsetExtensionId);
473  map.Register(kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId);
474  const bool valid_rtp_header = rtp_parser.Parse(rtp_header, &map);
475  ASSERT_TRUE(valid_rtp_header);
476
477  // Verify transmission time offset.
478  EXPECT_EQ(kStoredTimeInMs * 90, rtp_header.extension.transmissionTimeOffset);
479  uint64_t expected_send_time =
480      ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds());
481  EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime);
482}
483
484// This test sends 1 regular video packet, then 4 padding packets, and then
485// 1 more regular packet.
486TEST_F(RtpSenderTest, SendPadding) {
487  // Make all (non-padding) packets go to send queue.
488  EXPECT_CALL(mock_paced_sender_,
489              SendPacket(PacedSender::kNormalPriority, _, _, _, _, _)).
490                  WillRepeatedly(testing::Return(false));
491
492  uint16_t seq_num = kSeqNum;
493  uint32_t timestamp = kTimestamp;
494  rtp_sender_->SetStorePacketsStatus(true, 10);
495  int rtp_header_len = 12;
496  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
497      kRtpExtensionTransmissionTimeOffset, kTransmissionTimeOffsetExtensionId));
498  rtp_header_len += 4;  // 4 bytes extension.
499  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
500      kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId));
501  rtp_header_len += 4;  // 4 bytes extension.
502  rtp_header_len += 4;  // 4 extra bytes common to all extension headers.
503
504  // Create and set up parser.
505  scoped_ptr<webrtc::RtpHeaderParser> rtp_parser(
506      webrtc::RtpHeaderParser::Create());
507  ASSERT_TRUE(rtp_parser.get() != NULL);
508  rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset,
509                                         kTransmissionTimeOffsetExtensionId);
510  rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
511                                         kAbsoluteSendTimeExtensionId);
512  webrtc::RTPHeader rtp_header;
513
514  rtp_sender_->SetTargetSendBitrate(300000);
515  int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
516  int32_t rtp_length = rtp_sender_->BuildRTPheader(packet_,
517                                                   kPayload,
518                                                   kMarkerBit,
519                                                   timestamp,
520                                                   capture_time_ms);
521
522  // Packet should be stored in a send bucket.
523  EXPECT_EQ(0, rtp_sender_->SendToNetwork(packet_,
524                                          0,
525                                          rtp_length,
526                                          capture_time_ms,
527                                          kAllowRetransmission,
528                                          PacedSender::kNormalPriority));
529
530  int total_packets_sent = 0;
531  EXPECT_EQ(total_packets_sent, transport_.packets_sent_);
532
533  const int kStoredTimeInMs = 100;
534  fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
535  rtp_sender_->TimeToSendPacket(seq_num++, capture_time_ms, false);
536  // Packet should now be sent. This test doesn't verify the regular video
537  // packet, since it is tested in another test.
538  EXPECT_EQ(++total_packets_sent, transport_.packets_sent_);
539  timestamp += 90 * kStoredTimeInMs;
540
541  // Send padding 4 times, waiting 50 ms between each.
542  for (int i = 0; i < 4; ++i) {
543    const int kPaddingPeriodMs = 50;
544    const int kPaddingBytes = 100;
545    const int kMaxPaddingLength = 224;  // Value taken from rtp_sender.cc.
546    // Padding will be forced to full packets.
547    EXPECT_EQ(kMaxPaddingLength, rtp_sender_->TimeToSendPadding(kPaddingBytes));
548
549    // Process send bucket. Padding should now be sent.
550    EXPECT_EQ(++total_packets_sent, transport_.packets_sent_);
551    EXPECT_EQ(kMaxPaddingLength + rtp_header_len,
552              transport_.last_sent_packet_len_);
553    // Parse sent packet.
554    ASSERT_TRUE(rtp_parser->Parse(transport_.last_sent_packet_, kPaddingBytes,
555                                  &rtp_header));
556
557    // Verify sequence number and timestamp.
558    EXPECT_EQ(seq_num++, rtp_header.sequenceNumber);
559    EXPECT_EQ(timestamp, rtp_header.timestamp);
560    // Verify transmission time offset.
561    EXPECT_EQ(0, rtp_header.extension.transmissionTimeOffset);
562    uint64_t expected_send_time =
563        ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds());
564    EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime);
565    fake_clock_.AdvanceTimeMilliseconds(kPaddingPeriodMs);
566    timestamp += 90 * kPaddingPeriodMs;
567  }
568
569  // Send a regular video packet again.
570  capture_time_ms = fake_clock_.TimeInMilliseconds();
571  rtp_length = rtp_sender_->BuildRTPheader(packet_,
572                                           kPayload,
573                                           kMarkerBit,
574                                           timestamp,
575                                           capture_time_ms);
576
577  // Packet should be stored in a send bucket.
578  EXPECT_EQ(0, rtp_sender_->SendToNetwork(packet_,
579                                          0,
580                                          rtp_length,
581                                          capture_time_ms,
582                                          kAllowRetransmission,
583                                          PacedSender::kNormalPriority));
584
585  rtp_sender_->TimeToSendPacket(seq_num, capture_time_ms, false);
586  // Process send bucket.
587  EXPECT_EQ(++total_packets_sent, transport_.packets_sent_);
588  EXPECT_EQ(rtp_length, transport_.last_sent_packet_len_);
589  // Parse sent packet.
590  ASSERT_TRUE(rtp_parser->Parse(transport_.last_sent_packet_, rtp_length,
591                                &rtp_header));
592
593  // Verify sequence number and timestamp.
594  EXPECT_EQ(seq_num, rtp_header.sequenceNumber);
595  EXPECT_EQ(timestamp, rtp_header.timestamp);
596  // Verify transmission time offset. This packet is sent without delay.
597  EXPECT_EQ(0, rtp_header.extension.transmissionTimeOffset);
598  uint64_t expected_send_time =
599      ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds());
600  EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime);
601}
602
603TEST_F(RtpSenderTest, SendRedundantPayloads) {
604  MockTransport transport;
605  rtp_sender_.reset(new RTPSender(0, false, &fake_clock_, &transport, NULL,
606                                  &mock_paced_sender_));
607  rtp_sender_->SetSequenceNumber(kSeqNum);
608  // Make all packets go through the pacer.
609  EXPECT_CALL(mock_paced_sender_,
610              SendPacket(PacedSender::kNormalPriority, _, _, _, _, _)).
611                  WillRepeatedly(testing::Return(false));
612
613  uint16_t seq_num = kSeqNum;
614  rtp_sender_->SetStorePacketsStatus(true, 10);
615  int rtp_header_len = 12;
616  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
617      kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId));
618  rtp_header_len += 4;  // 4 bytes extension.
619  rtp_header_len += 4;  // 4 extra bytes common to all extension headers.
620
621  rtp_sender_->SetRTXStatus(kRtxRetransmitted | kRtxRedundantPayloads, true,
622                            1234);
623
624  // Create and set up parser.
625  scoped_ptr<webrtc::RtpHeaderParser> rtp_parser(
626      webrtc::RtpHeaderParser::Create());
627  ASSERT_TRUE(rtp_parser.get() != NULL);
628  rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset,
629                                         kTransmissionTimeOffsetExtensionId);
630  rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
631                                         kAbsoluteSendTimeExtensionId);
632  rtp_sender_->SetTargetSendBitrate(300000);
633  const size_t kNumPayloadSizes = 10;
634  const int kPayloadSizes[kNumPayloadSizes] = {500, 550, 600, 650, 700, 750,
635      800, 850, 900, 950};
636  // Send 10 packets of increasing size.
637  for (size_t i = 0; i < kNumPayloadSizes; ++i) {
638    int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
639    EXPECT_CALL(transport, SendPacket(_, _, _))
640        .WillOnce(testing::ReturnArg<2>());
641    SendPacket(capture_time_ms, kPayloadSizes[i]);
642    rtp_sender_->TimeToSendPacket(seq_num++, capture_time_ms, false);
643    fake_clock_.AdvanceTimeMilliseconds(33);
644  }
645  const int kPaddingPayloadSize = 224;
646  // The amount of padding to send it too small to send a payload packet.
647  EXPECT_CALL(transport, SendPacket(_, _, kPaddingPayloadSize + rtp_header_len))
648      .WillOnce(testing::ReturnArg<2>());
649  EXPECT_EQ(kPaddingPayloadSize, rtp_sender_->TimeToSendPadding(49));
650
651  const int kRtxHeaderSize = 2;
652  EXPECT_CALL(transport, SendPacket(_, _, kPayloadSizes[0] +
653                                    rtp_header_len + kRtxHeaderSize))
654      .WillOnce(testing::ReturnArg<2>());
655  EXPECT_EQ(kPayloadSizes[0], rtp_sender_->TimeToSendPadding(500));
656
657  EXPECT_CALL(transport, SendPacket(_, _, kPayloadSizes[kNumPayloadSizes - 1] +
658                                    rtp_header_len + kRtxHeaderSize))
659      .WillOnce(testing::ReturnArg<2>());
660  EXPECT_CALL(transport, SendPacket(_, _, kPaddingPayloadSize + rtp_header_len))
661      .WillOnce(testing::ReturnArg<2>());
662  EXPECT_EQ(kPayloadSizes[kNumPayloadSizes - 1] + kPaddingPayloadSize,
663            rtp_sender_->TimeToSendPadding(999));
664}
665
666TEST_F(RtpSenderTest, SendGenericVideo) {
667  char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC";
668  const uint8_t payload_type = 127;
669  ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000,
670                                            0, 1500));
671  uint8_t payload[] = {47, 11, 32, 93, 89};
672
673  // Send keyframe
674  ASSERT_EQ(0, rtp_sender_->SendOutgoingData(kVideoFrameKey, payload_type, 1234,
675                                             4321, payload, sizeof(payload),
676                                             NULL));
677
678  ModuleRTPUtility::RTPHeaderParser rtp_parser(transport_.last_sent_packet_,
679      transport_.last_sent_packet_len_);
680  webrtc::RTPHeader rtp_header;
681  ASSERT_TRUE(rtp_parser.Parse(rtp_header));
682
683  const uint8_t* payload_data = GetPayloadData(rtp_header,
684      transport_.last_sent_packet_);
685  uint8_t generic_header = *payload_data++;
686
687  ASSERT_EQ(sizeof(payload) + sizeof(generic_header),
688            GetPayloadDataLength(rtp_header, transport_.last_sent_packet_len_));
689
690  EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kKeyFrameBit);
691  EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kFirstPacketBit);
692
693  EXPECT_EQ(0, memcmp(payload, payload_data, sizeof(payload)));
694
695  // Send delta frame
696  payload[0] = 13;
697  payload[1] = 42;
698  payload[4] = 13;
699
700  ASSERT_EQ(0, rtp_sender_->SendOutgoingData(kVideoFrameDelta, payload_type,
701                                             1234, 4321, payload,
702                                             sizeof(payload), NULL));
703
704  ModuleRTPUtility::RTPHeaderParser rtp_parser2(transport_.last_sent_packet_,
705      transport_.last_sent_packet_len_);
706  ASSERT_TRUE(rtp_parser.Parse(rtp_header));
707
708  payload_data = GetPayloadData(rtp_header, transport_.last_sent_packet_);
709  generic_header = *payload_data++;
710
711  EXPECT_FALSE(generic_header & RtpFormatVideoGeneric::kKeyFrameBit);
712  EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kFirstPacketBit);
713
714  ASSERT_EQ(sizeof(payload) + sizeof(generic_header),
715            GetPayloadDataLength(rtp_header, transport_.last_sent_packet_len_));
716
717  EXPECT_EQ(0, memcmp(payload, payload_data, sizeof(payload)));
718}
719
720TEST_F(RtpSenderTest, FrameCountCallbacks) {
721  class TestCallback : public FrameCountObserver {
722   public:
723    TestCallback()
724      : FrameCountObserver(), num_calls_(0), ssrc_(0),
725        key_frames_(0), delta_frames_(0) {}
726    virtual ~TestCallback() {}
727
728    virtual void FrameCountUpdated(FrameType frame_type,
729                                   uint32_t frame_count,
730                                   const unsigned int ssrc) {
731      ++num_calls_;
732      ssrc_ = ssrc;
733      switch (frame_type) {
734        case kVideoFrameDelta:
735          delta_frames_ = frame_count;
736          break;
737        case kVideoFrameKey:
738          key_frames_ = frame_count;
739          break;
740        default:
741          break;
742      }
743    }
744
745    uint32_t num_calls_;
746    uint32_t ssrc_;
747    uint32_t key_frames_;
748    uint32_t delta_frames_;
749  } callback;
750
751  char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC";
752  const uint8_t payload_type = 127;
753  ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000,
754                                            0, 1500));
755  uint8_t payload[] = {47, 11, 32, 93, 89};
756  rtp_sender_->SetStorePacketsStatus(true, 1);
757  uint32_t ssrc = rtp_sender_->SSRC();
758
759  rtp_sender_->RegisterFrameCountObserver(&callback);
760
761  ASSERT_EQ(0, rtp_sender_->SendOutgoingData(kVideoFrameKey, payload_type, 1234,
762                                             4321, payload, sizeof(payload),
763                                             NULL));
764
765  EXPECT_EQ(1U, callback.num_calls_);
766  EXPECT_EQ(ssrc, callback.ssrc_);
767  EXPECT_EQ(1U, callback.key_frames_);
768  EXPECT_EQ(0U, callback.delta_frames_);
769
770  ASSERT_EQ(0, rtp_sender_->SendOutgoingData(kVideoFrameDelta,
771                                             payload_type, 1234, 4321, payload,
772                                             sizeof(payload), NULL));
773
774  EXPECT_EQ(2U, callback.num_calls_);
775  EXPECT_EQ(ssrc, callback.ssrc_);
776  EXPECT_EQ(1U, callback.key_frames_);
777  EXPECT_EQ(1U, callback.delta_frames_);
778
779  rtp_sender_->RegisterFrameCountObserver(NULL);
780}
781
782class RtpSenderAudioTest : public RtpSenderTest {
783 protected:
784  RtpSenderAudioTest() {}
785
786  virtual void SetUp() {
787    payload_ = kAudioPayload;
788    rtp_sender_.reset(new RTPSender(0, true, &fake_clock_, &transport_, NULL,
789                                    &mock_paced_sender_));
790    rtp_sender_->SetSequenceNumber(kSeqNum);
791  }
792};
793
794TEST_F(RtpSenderAudioTest, BuildRTPPacketWithAudioLevelExtension) {
795  EXPECT_EQ(0, rtp_sender_->SetAudioLevelIndicationStatus(true,
796      kAudioLevelExtensionId));
797  EXPECT_EQ(0, rtp_sender_->SetAudioLevel(kAudioLevel));
798  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
799      kRtpExtensionAudioLevel, kAudioLevelExtensionId));
800
801  int32_t length = rtp_sender_->BuildRTPheader(packet_,
802                                               kAudioPayload,
803                                               kMarkerBit,
804                                               kTimestamp,
805                                               0);
806  EXPECT_EQ(12 + rtp_sender_->RtpHeaderExtensionTotalLength(), length);
807
808  // Currently, no space is added by for header extension by BuildRTPHeader().
809  EXPECT_EQ(0, rtp_sender_->RtpHeaderExtensionTotalLength());
810
811  // Verify
812  webrtc::ModuleRTPUtility::RTPHeaderParser rtp_parser(packet_, length);
813  webrtc::RTPHeader rtp_header;
814
815  RtpHeaderExtensionMap map;
816  map.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
817  const bool valid_rtp_header = rtp_parser.Parse(rtp_header, &map);
818
819  ASSERT_TRUE(valid_rtp_header);
820  ASSERT_FALSE(rtp_parser.RTCP());
821  VerifyRTPHeaderCommon(rtp_header);
822  EXPECT_EQ(length, rtp_header.headerLength);
823  // TODO(solenberg): Should verify that we got audio level in header extension.
824
825  // Parse without map extension
826  webrtc::RTPHeader rtp_header2;
827  const bool valid_rtp_header2 = rtp_parser.Parse(rtp_header2, NULL);
828
829  ASSERT_TRUE(valid_rtp_header2);
830  VerifyRTPHeaderCommon(rtp_header2);
831  EXPECT_EQ(length, rtp_header2.headerLength);
832  // TODO(solenberg): Should verify that we didn't get audio level.
833  EXPECT_EQ(0, rtp_sender_->SetAudioLevelIndicationStatus(false, 0));
834}
835
836TEST_F(RtpSenderAudioTest, SendAudio) {
837  char payload_name[RTP_PAYLOAD_NAME_SIZE] = "PAYLOAD_NAME";
838  const uint8_t payload_type = 127;
839  ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 48000,
840                                            0, 1500));
841  uint8_t payload[] = {47, 11, 32, 93, 89};
842
843  ASSERT_EQ(0, rtp_sender_->SendOutgoingData(kAudioFrameCN, payload_type, 1234,
844                                             4321, payload, sizeof(payload),
845                                             NULL));
846
847  ModuleRTPUtility::RTPHeaderParser rtp_parser(transport_.last_sent_packet_,
848      transport_.last_sent_packet_len_);
849  webrtc::RTPHeader rtp_header;
850  ASSERT_TRUE(rtp_parser.Parse(rtp_header));
851
852  const uint8_t* payload_data = GetPayloadData(rtp_header,
853      transport_.last_sent_packet_);
854
855  ASSERT_EQ(sizeof(payload), GetPayloadDataLength(rtp_header,
856            transport_.last_sent_packet_len_));
857
858  EXPECT_EQ(0, memcmp(payload, payload_data, sizeof(payload)));
859}
860
861TEST_F(RtpSenderAudioTest, SendAudioWithAudioLevelExtension) {
862  EXPECT_EQ(0, rtp_sender_->SetAudioLevelIndicationStatus(true,
863      kAudioLevelExtensionId));
864  EXPECT_EQ(0, rtp_sender_->SetAudioLevel(kAudioLevel));
865  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
866      kRtpExtensionAudioLevel, kAudioLevelExtensionId));
867
868  char payload_name[RTP_PAYLOAD_NAME_SIZE] = "PAYLOAD_NAME";
869  const uint8_t payload_type = 127;
870  ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 48000,
871                                            0, 1500));
872  uint8_t payload[] = {47, 11, 32, 93, 89};
873
874  ASSERT_EQ(0, rtp_sender_->SendOutgoingData(kAudioFrameCN, payload_type, 1234,
875                                             4321, payload, sizeof(payload),
876                                             NULL));
877
878  ModuleRTPUtility::RTPHeaderParser rtp_parser(transport_.last_sent_packet_,
879      transport_.last_sent_packet_len_);
880  webrtc::RTPHeader rtp_header;
881  ASSERT_TRUE(rtp_parser.Parse(rtp_header));
882
883  const uint8_t* payload_data = GetPayloadData(rtp_header,
884                                               transport_.last_sent_packet_);
885
886  ASSERT_EQ(sizeof(payload), GetPayloadDataLength(
887      rtp_header, transport_.last_sent_packet_len_));
888
889  EXPECT_EQ(0, memcmp(payload, payload_data, sizeof(payload)));
890
891  uint8_t extension[] = { 0xbe, 0xde, 0x00, 0x01,
892                          (kAudioLevelExtensionId << 4) + 0, // ID + length.
893                          kAudioLevel,                       // Data.
894                          0x00, 0x00                         // Padding.
895                        };
896
897  EXPECT_EQ(0, memcmp(extension, payload_data - sizeof(extension),
898                      sizeof(extension)));
899  EXPECT_EQ(0, rtp_sender_->SetAudioLevelIndicationStatus(false, 0));
900}
901
902}  // namespace webrtc
903