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