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