rtp_sender_unittest.cc revision 9b82f5a6ed2ceb04f72b66c1d3cca67a2bbcec3a
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_rtcp_defines.h"
19#include "webrtc/modules/rtp_rtcp/source/rtp_format_video_generic.h"
20#include "webrtc/modules/rtp_rtcp/source/rtp_header_extension.h"
21#include "webrtc/modules/rtp_rtcp/source/rtp_sender.h"
22#include "webrtc/system_wrappers/interface/scoped_ptr.h"
23#include "webrtc/typedefs.h"
24
25namespace webrtc {
26
27namespace {
28const int kTransmissionTimeOffsetExtensionId = 1;
29const int kAbsoluteSendTimeExtensionId = 14;
30const int kPayload = 100;
31const uint32_t kTimestamp = 10;
32const uint16_t kSeqNum = 33;
33const int kTimeOffset = 22222;
34const int kMaxPacketLength = 1500;
35const uint32_t kAbsoluteSendTime = 0x00aabbcc;
36const uint8_t kAudioLevel = 0x5a;
37const uint8_t kAudioLevelExtensionId = 9;
38const int kAudioPayload = 103;
39}  // namespace
40
41using testing::_;
42
43const uint8_t* GetPayloadData(const RTPHeader& rtp_header,
44                              const uint8_t* packet) {
45  return packet + rtp_header.headerLength;
46}
47
48uint16_t GetPayloadDataLength(const RTPHeader& rtp_header,
49                              const uint16_t packet_length) {
50  uint16_t length = packet_length - rtp_header.headerLength -
51      rtp_header.paddingLength;
52  return static_cast<uint16_t>(length);
53}
54
55class LoopbackTransportTest : public webrtc::Transport {
56 public:
57  LoopbackTransportTest()
58    : packets_sent_(0),
59      last_sent_packet_len_(0) {
60  }
61  virtual int SendPacket(int channel, const void *data, int len) {
62    packets_sent_++;
63    memcpy(last_sent_packet_, data, len);
64    last_sent_packet_len_ = len;
65    return len;
66  }
67  virtual int SendRTCPPacket(int channel, const void *data, int len) {
68    return -1;
69  }
70  int packets_sent_;
71  int last_sent_packet_len_;
72  uint8_t last_sent_packet_[kMaxPacketLength];
73};
74
75class RtpSenderTest : public ::testing::Test {
76 protected:
77  RtpSenderTest()
78    : fake_clock_(123456789),
79      mock_paced_sender_(),
80      rtp_sender_(),
81      payload_(kPayload),
82      transport_(),
83      kMarkerBit(true) {
84    EXPECT_CALL(mock_paced_sender_,
85        SendPacket(_, _, _, _, _, _)).WillRepeatedly(testing::Return(true));
86  }
87
88  virtual void SetUp() {
89    rtp_sender_.reset(new RTPSender(0, false, &fake_clock_, &transport_, NULL,
90                                    &mock_paced_sender_));
91    rtp_sender_->SetSequenceNumber(kSeqNum);
92  }
93
94  SimulatedClock fake_clock_;
95  MockPacedSender mock_paced_sender_;
96  scoped_ptr<RTPSender> rtp_sender_;
97  int payload_;
98  LoopbackTransportTest transport_;
99  const bool kMarkerBit;
100  uint8_t packet_[kMaxPacketLength];
101
102  void VerifyRTPHeaderCommon(const RTPHeader& rtp_header) {
103    EXPECT_EQ(kMarkerBit, rtp_header.markerBit);
104    EXPECT_EQ(payload_, rtp_header.payloadType);
105    EXPECT_EQ(kSeqNum, rtp_header.sequenceNumber);
106    EXPECT_EQ(kTimestamp, rtp_header.timestamp);
107    EXPECT_EQ(rtp_sender_->SSRC(), rtp_header.ssrc);
108    EXPECT_EQ(0, rtp_header.numCSRCs);
109    EXPECT_EQ(0, rtp_header.paddingLength);
110  }
111};
112
113TEST_F(RtpSenderTest, RegisterRtpTransmissionTimeOffsetHeaderExtension) {
114  EXPECT_EQ(0, rtp_sender_->RtpHeaderExtensionTotalLength());
115  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
116      kRtpExtensionTransmissionTimeOffset, kTransmissionTimeOffsetExtensionId));
117  EXPECT_EQ(kRtpOneByteHeaderLength + kTransmissionTimeOffsetLength,
118            rtp_sender_->RtpHeaderExtensionTotalLength());
119  EXPECT_EQ(0, rtp_sender_->DeregisterRtpHeaderExtension(
120      kRtpExtensionTransmissionTimeOffset));
121  EXPECT_EQ(0, rtp_sender_->RtpHeaderExtensionTotalLength());
122}
123
124TEST_F(RtpSenderTest, RegisterRtpAbsoluteSendTimeHeaderExtension) {
125  EXPECT_EQ(0, rtp_sender_->RtpHeaderExtensionTotalLength());
126  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
127      kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId));
128  EXPECT_EQ(kRtpOneByteHeaderLength + kAbsoluteSendTimeLength,
129            rtp_sender_->RtpHeaderExtensionTotalLength());
130  EXPECT_EQ(0, rtp_sender_->DeregisterRtpHeaderExtension(
131      kRtpExtensionAbsoluteSendTime));
132  EXPECT_EQ(0, rtp_sender_->RtpHeaderExtensionTotalLength());
133}
134
135TEST_F(RtpSenderTest, RegisterRtpAudioLevelHeaderExtension) {
136  EXPECT_EQ(0, rtp_sender_->RtpHeaderExtensionTotalLength());
137  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
138      kRtpExtensionAudioLevel, kAudioLevelExtensionId));
139  // Accounted size for audio level is zero because it is currently specially
140  // treated by RTPSenderAudio.
141  EXPECT_EQ(0, rtp_sender_->RtpHeaderExtensionTotalLength());
142  // EXPECT_EQ(kRtpOneByteHeaderLength + kAudioLevelLength,
143  //           rtp_sender_->RtpHeaderExtensionTotalLength());
144  EXPECT_EQ(0, rtp_sender_->DeregisterRtpHeaderExtension(
145      kRtpExtensionAudioLevel));
146  EXPECT_EQ(0, rtp_sender_->RtpHeaderExtensionTotalLength());
147}
148
149TEST_F(RtpSenderTest, RegisterRtpHeaderExtensions) {
150  EXPECT_EQ(0, rtp_sender_->RtpHeaderExtensionTotalLength());
151  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
152      kRtpExtensionTransmissionTimeOffset, kTransmissionTimeOffsetExtensionId));
153  EXPECT_EQ(kRtpOneByteHeaderLength + kTransmissionTimeOffsetLength,
154            rtp_sender_->RtpHeaderExtensionTotalLength());
155  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
156      kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId));
157  EXPECT_EQ(kRtpOneByteHeaderLength + kTransmissionTimeOffsetLength +
158      kAbsoluteSendTimeLength, rtp_sender_->RtpHeaderExtensionTotalLength());
159  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
160      kRtpExtensionAudioLevel, kAudioLevelExtensionId));
161  EXPECT_EQ(kRtpOneByteHeaderLength + kTransmissionTimeOffsetLength +
162      kAbsoluteSendTimeLength, rtp_sender_->RtpHeaderExtensionTotalLength());
163  EXPECT_EQ(0, rtp_sender_->DeregisterRtpHeaderExtension(
164      kRtpExtensionTransmissionTimeOffset));
165  EXPECT_EQ(kRtpOneByteHeaderLength + kAbsoluteSendTimeLength,
166      rtp_sender_->RtpHeaderExtensionTotalLength());
167  EXPECT_EQ(0, rtp_sender_->DeregisterRtpHeaderExtension(
168      kRtpExtensionAbsoluteSendTime));
169  EXPECT_EQ(0, rtp_sender_->RtpHeaderExtensionTotalLength());
170  EXPECT_EQ(0, rtp_sender_->DeregisterRtpHeaderExtension(
171      kRtpExtensionAudioLevel));
172  EXPECT_EQ(0, rtp_sender_->RtpHeaderExtensionTotalLength());
173}
174
175TEST_F(RtpSenderTest, BuildRTPPacket) {
176  int32_t length = rtp_sender_->BuildRTPheader(packet_,
177                                               kPayload,
178                                               kMarkerBit,
179                                               kTimestamp,
180                                               0);
181  EXPECT_EQ(12, length);
182
183  // Verify
184  webrtc::ModuleRTPUtility::RTPHeaderParser rtp_parser(packet_, length);
185  webrtc::RTPHeader rtp_header;
186
187  RtpHeaderExtensionMap map;
188  map.Register(kRtpExtensionTransmissionTimeOffset,
189               kTransmissionTimeOffsetExtensionId);
190  const bool valid_rtp_header = rtp_parser.Parse(rtp_header, &map);
191
192  ASSERT_TRUE(valid_rtp_header);
193  ASSERT_FALSE(rtp_parser.RTCP());
194  VerifyRTPHeaderCommon(rtp_header);
195  EXPECT_EQ(length, rtp_header.headerLength);
196  EXPECT_EQ(0, rtp_header.extension.transmissionTimeOffset);
197  EXPECT_EQ(0u, rtp_header.extension.absoluteSendTime);
198}
199
200TEST_F(RtpSenderTest, BuildRTPPacketWithTransmissionOffsetExtension) {
201  EXPECT_EQ(0, rtp_sender_->SetTransmissionTimeOffset(kTimeOffset));
202  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
203      kRtpExtensionTransmissionTimeOffset, kTransmissionTimeOffsetExtensionId));
204
205  int32_t length = rtp_sender_->BuildRTPheader(packet_,
206                                               kPayload,
207                                               kMarkerBit,
208                                               kTimestamp,
209                                               0);
210  EXPECT_EQ(12 + rtp_sender_->RtpHeaderExtensionTotalLength(), length);
211
212  // Verify
213  webrtc::ModuleRTPUtility::RTPHeaderParser rtp_parser(packet_, length);
214  webrtc::RTPHeader rtp_header;
215
216  RtpHeaderExtensionMap map;
217  map.Register(kRtpExtensionTransmissionTimeOffset,
218               kTransmissionTimeOffsetExtensionId);
219  const bool valid_rtp_header = rtp_parser.Parse(rtp_header, &map);
220
221  ASSERT_TRUE(valid_rtp_header);
222  ASSERT_FALSE(rtp_parser.RTCP());
223  VerifyRTPHeaderCommon(rtp_header);
224  EXPECT_EQ(length, rtp_header.headerLength);
225  EXPECT_EQ(kTimeOffset, rtp_header.extension.transmissionTimeOffset);
226
227  // Parse without map extension
228  webrtc::RTPHeader rtp_header2;
229  const bool valid_rtp_header2 = rtp_parser.Parse(rtp_header2, NULL);
230
231  ASSERT_TRUE(valid_rtp_header2);
232  VerifyRTPHeaderCommon(rtp_header2);
233  EXPECT_EQ(length, rtp_header2.headerLength);
234  EXPECT_EQ(0, rtp_header2.extension.transmissionTimeOffset);
235}
236
237TEST_F(RtpSenderTest, BuildRTPPacketWithNegativeTransmissionOffsetExtension) {
238  const int kNegTimeOffset = -500;
239  EXPECT_EQ(0, rtp_sender_->SetTransmissionTimeOffset(kNegTimeOffset));
240  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
241      kRtpExtensionTransmissionTimeOffset, kTransmissionTimeOffsetExtensionId));
242
243  int32_t length = rtp_sender_->BuildRTPheader(packet_,
244                                               kPayload,
245                                               kMarkerBit,
246                                               kTimestamp,
247                                               0);
248  EXPECT_EQ(12 + rtp_sender_->RtpHeaderExtensionTotalLength(), length);
249
250  // Verify
251  webrtc::ModuleRTPUtility::RTPHeaderParser rtp_parser(packet_, length);
252  webrtc::RTPHeader rtp_header;
253
254  RtpHeaderExtensionMap map;
255  map.Register(kRtpExtensionTransmissionTimeOffset,
256               kTransmissionTimeOffsetExtensionId);
257  const bool valid_rtp_header = rtp_parser.Parse(rtp_header, &map);
258
259  ASSERT_TRUE(valid_rtp_header);
260  ASSERT_FALSE(rtp_parser.RTCP());
261  VerifyRTPHeaderCommon(rtp_header);
262  EXPECT_EQ(length, rtp_header.headerLength);
263  EXPECT_EQ(kNegTimeOffset, rtp_header.extension.transmissionTimeOffset);
264}
265
266TEST_F(RtpSenderTest, BuildRTPPacketWithAbsoluteSendTimeExtension) {
267  EXPECT_EQ(0, rtp_sender_->SetAbsoluteSendTime(kAbsoluteSendTime));
268  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
269      kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId));
270
271  int32_t length = rtp_sender_->BuildRTPheader(packet_,
272                                               kPayload,
273                                               kMarkerBit,
274                                               kTimestamp,
275                                               0);
276  EXPECT_EQ(12 + rtp_sender_->RtpHeaderExtensionTotalLength(), length);
277
278  // Verify
279  webrtc::ModuleRTPUtility::RTPHeaderParser rtp_parser(packet_, length);
280  webrtc::RTPHeader rtp_header;
281
282  RtpHeaderExtensionMap map;
283  map.Register(kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId);
284  const bool valid_rtp_header = rtp_parser.Parse(rtp_header, &map);
285
286  ASSERT_TRUE(valid_rtp_header);
287  ASSERT_FALSE(rtp_parser.RTCP());
288  VerifyRTPHeaderCommon(rtp_header);
289  EXPECT_EQ(length, rtp_header.headerLength);
290  EXPECT_EQ(kAbsoluteSendTime, rtp_header.extension.absoluteSendTime);
291
292  // Parse without map extension
293  webrtc::RTPHeader rtp_header2;
294  const bool valid_rtp_header2 = rtp_parser.Parse(rtp_header2, NULL);
295
296  ASSERT_TRUE(valid_rtp_header2);
297  VerifyRTPHeaderCommon(rtp_header2);
298  EXPECT_EQ(length, rtp_header2.headerLength);
299  EXPECT_EQ(0u, rtp_header2.extension.absoluteSendTime);
300}
301
302TEST_F(RtpSenderTest, BuildRTPPacketWithHeaderExtensions) {
303  EXPECT_EQ(0, rtp_sender_->SetTransmissionTimeOffset(kTimeOffset));
304  EXPECT_EQ(0, rtp_sender_->SetAbsoluteSendTime(kAbsoluteSendTime));
305  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
306      kRtpExtensionTransmissionTimeOffset, kTransmissionTimeOffsetExtensionId));
307  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
308      kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId));
309
310  int32_t length = rtp_sender_->BuildRTPheader(packet_,
311                                               kPayload,
312                                               kMarkerBit,
313                                               kTimestamp,
314                                               0);
315  EXPECT_EQ(12 + rtp_sender_->RtpHeaderExtensionTotalLength(), length);
316
317  // Verify
318  webrtc::ModuleRTPUtility::RTPHeaderParser rtp_parser(packet_, length);
319  webrtc::RTPHeader rtp_header;
320
321  RtpHeaderExtensionMap map;
322  map.Register(kRtpExtensionTransmissionTimeOffset,
323               kTransmissionTimeOffsetExtensionId);
324  map.Register(kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId);
325  const bool valid_rtp_header = rtp_parser.Parse(rtp_header, &map);
326
327  ASSERT_TRUE(valid_rtp_header);
328  ASSERT_FALSE(rtp_parser.RTCP());
329  VerifyRTPHeaderCommon(rtp_header);
330  EXPECT_EQ(length, rtp_header.headerLength);
331  EXPECT_EQ(kTimeOffset, rtp_header.extension.transmissionTimeOffset);
332  EXPECT_EQ(kAbsoluteSendTime, rtp_header.extension.absoluteSendTime);
333
334  // Parse without map extension
335  webrtc::RTPHeader rtp_header2;
336  const bool valid_rtp_header2 = rtp_parser.Parse(rtp_header2, NULL);
337
338  ASSERT_TRUE(valid_rtp_header2);
339  VerifyRTPHeaderCommon(rtp_header2);
340  EXPECT_EQ(length, rtp_header2.headerLength);
341  EXPECT_EQ(0, rtp_header2.extension.transmissionTimeOffset);
342  EXPECT_EQ(0u, rtp_header2.extension.absoluteSendTime);
343}
344
345TEST_F(RtpSenderTest, TrafficSmoothingWithExtensions) {
346  EXPECT_CALL(mock_paced_sender_,
347              SendPacket(PacedSender::kNormalPriority, _, kSeqNum, _, _, _)).
348                  WillOnce(testing::Return(false));
349
350  rtp_sender_->SetStorePacketsStatus(true, 10);
351  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
352      kRtpExtensionTransmissionTimeOffset, kTransmissionTimeOffsetExtensionId));
353  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
354      kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId));
355  rtp_sender_->SetTargetSendBitrate(300000);
356  int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
357  int32_t rtp_length = rtp_sender_->BuildRTPheader(packet_,
358                                                   kPayload,
359                                                   kMarkerBit,
360                                                   kTimestamp,
361                                                   capture_time_ms);
362
363  // Packet should be stored in a send bucket.
364  EXPECT_EQ(0, rtp_sender_->SendToNetwork(packet_,
365                                          0,
366                                          rtp_length,
367                                          capture_time_ms,
368                                          kAllowRetransmission,
369                                          PacedSender::kNormalPriority));
370
371  EXPECT_EQ(0, transport_.packets_sent_);
372
373  const int kStoredTimeInMs = 100;
374  fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
375
376  rtp_sender_->TimeToSendPacket(kSeqNum, capture_time_ms, false);
377
378  // Process send bucket. Packet should now be sent.
379  EXPECT_EQ(1, transport_.packets_sent_);
380  EXPECT_EQ(rtp_length, transport_.last_sent_packet_len_);
381  // Parse sent packet.
382  webrtc::ModuleRTPUtility::RTPHeaderParser rtp_parser(
383      transport_.last_sent_packet_, rtp_length);
384  webrtc::RTPHeader rtp_header;
385  RtpHeaderExtensionMap map;
386  map.Register(kRtpExtensionTransmissionTimeOffset,
387               kTransmissionTimeOffsetExtensionId);
388  map.Register(kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId);
389  const bool valid_rtp_header = rtp_parser.Parse(rtp_header, &map);
390  ASSERT_TRUE(valid_rtp_header);
391
392  // Verify transmission time offset.
393  EXPECT_EQ(kStoredTimeInMs * 90, rtp_header.extension.transmissionTimeOffset);
394  uint64_t expected_send_time =
395      0x00fffffful & ((fake_clock_.TimeInMilliseconds() << 18) / 1000);
396  EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime);
397}
398
399TEST_F(RtpSenderTest, TrafficSmoothingRetransmits) {
400  EXPECT_CALL(mock_paced_sender_,
401              SendPacket(PacedSender::kNormalPriority, _, kSeqNum, _, _, _)).
402                  WillOnce(testing::Return(false));
403
404  rtp_sender_->SetStorePacketsStatus(true, 10);
405  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
406      kRtpExtensionTransmissionTimeOffset, kTransmissionTimeOffsetExtensionId));
407  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
408      kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId));
409  rtp_sender_->SetTargetSendBitrate(300000);
410  int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
411  int32_t rtp_length = rtp_sender_->BuildRTPheader(packet_,
412                                                   kPayload,
413                                                   kMarkerBit,
414                                                   kTimestamp,
415                                                   capture_time_ms);
416
417  // Packet should be stored in a send bucket.
418  EXPECT_EQ(0, rtp_sender_->SendToNetwork(packet_,
419                                          0,
420                                          rtp_length,
421                                          capture_time_ms,
422                                          kAllowRetransmission,
423                                          PacedSender::kNormalPriority));
424
425  EXPECT_EQ(0, transport_.packets_sent_);
426
427  EXPECT_CALL(mock_paced_sender_,
428              SendPacket(PacedSender::kHighPriority, _, kSeqNum, _, _, _)).
429                  WillOnce(testing::Return(false));
430
431  const int kStoredTimeInMs = 100;
432  fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
433
434  EXPECT_EQ(rtp_length, rtp_sender_->ReSendPacket(kSeqNum));
435  EXPECT_EQ(0, transport_.packets_sent_);
436
437  rtp_sender_->TimeToSendPacket(kSeqNum, capture_time_ms, false);
438
439  // Process send bucket. Packet should now be sent.
440  EXPECT_EQ(1, transport_.packets_sent_);
441  EXPECT_EQ(rtp_length, transport_.last_sent_packet_len_);
442
443  // Parse sent packet.
444  webrtc::ModuleRTPUtility::RTPHeaderParser rtp_parser(
445      transport_.last_sent_packet_, rtp_length);
446  webrtc::RTPHeader rtp_header;
447  RtpHeaderExtensionMap map;
448  map.Register(kRtpExtensionTransmissionTimeOffset,
449               kTransmissionTimeOffsetExtensionId);
450  map.Register(kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId);
451  const bool valid_rtp_header = rtp_parser.Parse(rtp_header, &map);
452  ASSERT_TRUE(valid_rtp_header);
453
454  // Verify transmission time offset.
455  EXPECT_EQ(kStoredTimeInMs * 90, rtp_header.extension.transmissionTimeOffset);
456  uint64_t expected_send_time =
457      0x00fffffful & ((fake_clock_.TimeInMilliseconds() << 18) / 1000);
458  EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime);
459}
460
461TEST_F(RtpSenderTest, SendGenericVideo) {
462  char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC";
463  const uint8_t payload_type = 127;
464  ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000,
465                                            0, 1500));
466  uint8_t payload[] = {47, 11, 32, 93, 89};
467
468  // Send keyframe
469  ASSERT_EQ(0, rtp_sender_->SendOutgoingData(kVideoFrameKey, payload_type, 1234,
470                                             4321, payload, sizeof(payload),
471                                             NULL));
472
473  ModuleRTPUtility::RTPHeaderParser rtp_parser(transport_.last_sent_packet_,
474      transport_.last_sent_packet_len_);
475  webrtc::RTPHeader rtp_header;
476  ASSERT_TRUE(rtp_parser.Parse(rtp_header));
477
478  const uint8_t* payload_data = GetPayloadData(rtp_header,
479      transport_.last_sent_packet_);
480  uint8_t generic_header = *payload_data++;
481
482  ASSERT_EQ(sizeof(payload) + sizeof(generic_header),
483            GetPayloadDataLength(rtp_header, transport_.last_sent_packet_len_));
484
485  EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kKeyFrameBit);
486  EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kFirstPacketBit);
487
488  EXPECT_EQ(0, memcmp(payload, payload_data, sizeof(payload)));
489
490  // Send delta frame
491  payload[0] = 13;
492  payload[1] = 42;
493  payload[4] = 13;
494
495  ASSERT_EQ(0, rtp_sender_->SendOutgoingData(kVideoFrameDelta, payload_type,
496                                             1234, 4321, payload,
497                                             sizeof(payload), NULL));
498
499  ModuleRTPUtility::RTPHeaderParser rtp_parser2(transport_.last_sent_packet_,
500      transport_.last_sent_packet_len_);
501  ASSERT_TRUE(rtp_parser.Parse(rtp_header));
502
503  payload_data = GetPayloadData(rtp_header, transport_.last_sent_packet_);
504  generic_header = *payload_data++;
505
506  EXPECT_FALSE(generic_header & RtpFormatVideoGeneric::kKeyFrameBit);
507  EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kFirstPacketBit);
508
509  ASSERT_EQ(sizeof(payload) + sizeof(generic_header),
510            GetPayloadDataLength(rtp_header, transport_.last_sent_packet_len_));
511
512  EXPECT_EQ(0, memcmp(payload, payload_data, sizeof(payload)));
513}
514
515class RtpSenderAudioTest : public RtpSenderTest {
516 protected:
517  RtpSenderAudioTest() {}
518
519  virtual void SetUp() {
520    payload_ = kAudioPayload;
521    rtp_sender_.reset(new RTPSender(0, true, &fake_clock_, &transport_, NULL,
522                                    &mock_paced_sender_));
523    rtp_sender_->SetSequenceNumber(kSeqNum);
524  }
525};
526
527TEST_F(RtpSenderAudioTest, BuildRTPPacketWithAudioLevelExtension) {
528  EXPECT_EQ(0, rtp_sender_->SetAudioLevelIndicationStatus(true,
529      kAudioLevelExtensionId));
530  EXPECT_EQ(0, rtp_sender_->SetAudioLevel(kAudioLevel));
531  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
532      kRtpExtensionAudioLevel, kAudioLevelExtensionId));
533
534  int32_t length = rtp_sender_->BuildRTPheader(packet_,
535                                               kAudioPayload,
536                                               kMarkerBit,
537                                               kTimestamp,
538                                               0);
539  EXPECT_EQ(12 + rtp_sender_->RtpHeaderExtensionTotalLength(), length);
540
541  // Currently, no space is added by for header extension by BuildRTPHeader().
542  EXPECT_EQ(0, rtp_sender_->RtpHeaderExtensionTotalLength());
543
544  // Verify
545  webrtc::ModuleRTPUtility::RTPHeaderParser rtp_parser(packet_, length);
546  webrtc::RTPHeader rtp_header;
547
548  RtpHeaderExtensionMap map;
549  map.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
550  const bool valid_rtp_header = rtp_parser.Parse(rtp_header, &map);
551
552  ASSERT_TRUE(valid_rtp_header);
553  ASSERT_FALSE(rtp_parser.RTCP());
554  VerifyRTPHeaderCommon(rtp_header);
555  EXPECT_EQ(length, rtp_header.headerLength);
556  // TODO(solenberg): Should verify that we got audio level in header extension.
557
558  // Parse without map extension
559  webrtc::RTPHeader rtp_header2;
560  const bool valid_rtp_header2 = rtp_parser.Parse(rtp_header2, NULL);
561
562  ASSERT_TRUE(valid_rtp_header2);
563  VerifyRTPHeaderCommon(rtp_header2);
564  EXPECT_EQ(length, rtp_header2.headerLength);
565  // TODO(solenberg): Should verify that we didn't get audio level.
566  EXPECT_EQ(0, rtp_sender_->SetAudioLevelIndicationStatus(false, 0));
567}
568
569TEST_F(RtpSenderAudioTest, SendAudio) {
570  char payload_name[RTP_PAYLOAD_NAME_SIZE] = "PAYLOAD_NAME";
571  const uint8_t payload_type = 127;
572  ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 48000,
573                                            0, 1500));
574  uint8_t payload[] = {47, 11, 32, 93, 89};
575
576  ASSERT_EQ(0, rtp_sender_->SendOutgoingData(kAudioFrameCN, payload_type, 1234,
577                                             4321, payload, sizeof(payload),
578                                             NULL));
579
580  ModuleRTPUtility::RTPHeaderParser rtp_parser(transport_.last_sent_packet_,
581      transport_.last_sent_packet_len_);
582  webrtc::RTPHeader rtp_header;
583  ASSERT_TRUE(rtp_parser.Parse(rtp_header));
584
585  const uint8_t* payload_data = GetPayloadData(rtp_header,
586      transport_.last_sent_packet_);
587
588  ASSERT_EQ(sizeof(payload), GetPayloadDataLength(rtp_header,
589            transport_.last_sent_packet_len_));
590
591  EXPECT_EQ(0, memcmp(payload, payload_data, sizeof(payload)));
592}
593
594TEST_F(RtpSenderAudioTest, SendAudioWithAudioLevelExtension) {
595  EXPECT_EQ(0, rtp_sender_->SetAudioLevelIndicationStatus(true,
596      kAudioLevelExtensionId));
597  EXPECT_EQ(0, rtp_sender_->SetAudioLevel(kAudioLevel));
598  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
599      kRtpExtensionAudioLevel, kAudioLevelExtensionId));
600
601  char payload_name[RTP_PAYLOAD_NAME_SIZE] = "PAYLOAD_NAME";
602  const uint8_t payload_type = 127;
603  ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 48000,
604                                            0, 1500));
605  uint8_t payload[] = {47, 11, 32, 93, 89};
606
607  ASSERT_EQ(0, rtp_sender_->SendOutgoingData(kAudioFrameCN, payload_type, 1234,
608                                             4321, payload, sizeof(payload),
609                                             NULL));
610
611  ModuleRTPUtility::RTPHeaderParser rtp_parser(transport_.last_sent_packet_,
612      transport_.last_sent_packet_len_);
613  webrtc::RTPHeader rtp_header;
614  ASSERT_TRUE(rtp_parser.Parse(rtp_header));
615
616  const uint8_t* payload_data = GetPayloadData(rtp_header,
617                                               transport_.last_sent_packet_);
618
619  ASSERT_EQ(sizeof(payload), GetPayloadDataLength(
620      rtp_header, transport_.last_sent_packet_len_));
621
622  EXPECT_EQ(0, memcmp(payload, payload_data, sizeof(payload)));
623
624  uint8_t extension[] = { 0xbe, 0xde, 0x00, 0x01,
625                          (kAudioLevelExtensionId << 4) + 0, // ID + length.
626                          kAudioLevel,                       // Data.
627                          0x00, 0x00                         // Padding.
628                        };
629
630  EXPECT_EQ(0, memcmp(extension, payload_data - sizeof(extension),
631                      sizeof(extension)));
632  EXPECT_EQ(0, rtp_sender_->SetAudioLevelIndicationStatus(false, 0));
633}
634
635}  // namespace webrtc
636