2011-12-16 14:31:37 +00:00
|
|
|
/*
|
2012-02-07 14:56:45 +00:00
|
|
|
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
|
2011-12-16 14:31:37 +00:00
|
|
|
*
|
|
|
|
|
* Use of this source code is governed by a BSD-style license
|
|
|
|
|
* that can be found in the LICENSE file in the root of the source
|
|
|
|
|
* tree. An additional intellectual property rights grant can be found
|
|
|
|
|
* in the file PATENTS. All contributing project authors may
|
|
|
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
|
|
|
*/
|
|
|
|
|
|
2015-12-10 05:05:27 -08:00
|
|
|
#include <list>
|
2016-04-27 01:19:58 -07:00
|
|
|
#include <memory>
|
2015-12-10 05:05:27 -08:00
|
|
|
#include <vector>
|
|
|
|
|
|
2015-09-21 15:11:14 -07:00
|
|
|
#include "testing/gmock/include/gmock/gmock.h"
|
2013-05-29 14:27:38 +00:00
|
|
|
#include "testing/gtest/include/gtest/gtest.h"
|
2015-03-04 22:55:15 +00:00
|
|
|
#include "webrtc/base/buffer.h"
|
2016-01-21 05:42:04 -08:00
|
|
|
#include "webrtc/call/mock/mock_rtc_event_log.h"
|
2015-11-04 08:31:52 +01:00
|
|
|
#include "webrtc/modules/rtp_rtcp/include/rtp_cvo.h"
|
|
|
|
|
#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
|
|
|
|
|
#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
|
2013-03-18 16:39:03 +00:00
|
|
|
#include "webrtc/modules/rtp_rtcp/source/rtp_format_video_generic.h"
|
2012-11-13 21:12:39 +00:00
|
|
|
#include "webrtc/modules/rtp_rtcp/source/rtp_header_extension.h"
|
|
|
|
|
#include "webrtc/modules/rtp_rtcp/source/rtp_sender.h"
|
2015-03-04 22:55:15 +00:00
|
|
|
#include "webrtc/modules/rtp_rtcp/source/rtp_sender_video.h"
|
2015-03-17 14:33:12 +00:00
|
|
|
#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
|
2015-12-10 05:05:27 -08:00
|
|
|
#include "webrtc/system_wrappers/include/stl_util.h"
|
2013-12-04 10:24:26 +00:00
|
|
|
#include "webrtc/test/mock_transport.h"
|
2012-11-13 21:12:39 +00:00
|
|
|
#include "webrtc/typedefs.h"
|
2011-12-16 14:31:37 +00:00
|
|
|
|
|
|
|
|
namespace webrtc {
|
|
|
|
|
|
2011-12-16 21:24:30 +00:00
|
|
|
namespace {
|
2013-05-16 11:10:31 +00:00
|
|
|
const int kTransmissionTimeOffsetExtensionId = 1;
|
|
|
|
|
const int kAbsoluteSendTimeExtensionId = 14;
|
2015-03-17 14:33:12 +00:00
|
|
|
const int kTransportSequenceNumberExtensionId = 13;
|
2011-12-16 21:24:30 +00:00
|
|
|
const int kPayload = 100;
|
2015-04-21 20:24:50 +08:00
|
|
|
const int kRtxPayload = 98;
|
2011-12-16 21:24:30 +00:00
|
|
|
const uint32_t kTimestamp = 10;
|
|
|
|
|
const uint16_t kSeqNum = 33;
|
|
|
|
|
const int kTimeOffset = 22222;
|
|
|
|
|
const int kMaxPacketLength = 1500;
|
2013-05-16 11:10:31 +00:00
|
|
|
const uint32_t kAbsoluteSendTime = 0x00aabbcc;
|
2013-05-20 20:55:07 +00:00
|
|
|
const uint8_t kAudioLevel = 0x5a;
|
2015-03-17 14:33:12 +00:00
|
|
|
const uint16_t kTransportSequenceNumber = 0xaabbu;
|
2013-05-20 20:55:07 +00:00
|
|
|
const uint8_t kAudioLevelExtensionId = 9;
|
|
|
|
|
const int kAudioPayload = 103;
|
2013-12-13 09:46:59 +00:00
|
|
|
const uint64_t kStartTime = 123456789;
|
2014-07-15 15:25:39 +00:00
|
|
|
const size_t kMaxPaddingSize = 224u;
|
2015-03-04 22:55:15 +00:00
|
|
|
const int kVideoRotationExtensionId = 5;
|
|
|
|
|
const VideoRotation kRotation = kVideoRotation_270;
|
2011-12-16 21:24:30 +00:00
|
|
|
|
2013-04-27 00:41:08 +00:00
|
|
|
using testing::_;
|
|
|
|
|
|
2013-09-06 13:40:11 +00:00
|
|
|
const uint8_t* GetPayloadData(const RTPHeader& rtp_header,
|
|
|
|
|
const uint8_t* packet) {
|
|
|
|
|
return packet + rtp_header.headerLength;
|
|
|
|
|
}
|
|
|
|
|
|
Use size_t more consistently for packet/payload lengths.
See design doc at https://docs.google.com/a/chromium.org/document/d/1I6nmE9D_BmCY-IoV6MDPY2V6WYpEI-dg2apWXTfZyUI/edit?usp=sharing for more information.
This CL was reviewed and approved in pieces in the following CLs:
https://webrtc-codereview.appspot.com/24209004/
https://webrtc-codereview.appspot.com/24229004/
https://webrtc-codereview.appspot.com/24259004/
https://webrtc-codereview.appspot.com/25109004/
https://webrtc-codereview.appspot.com/26099004/
https://webrtc-codereview.appspot.com/27069004/
https://webrtc-codereview.appspot.com/27969004/
https://webrtc-codereview.appspot.com/27989004/
https://webrtc-codereview.appspot.com/29009004/
https://webrtc-codereview.appspot.com/30929004/
https://webrtc-codereview.appspot.com/30939004/
https://webrtc-codereview.appspot.com/31999004/
Committing as TBR to the original reviewers.
BUG=chromium:81439
TEST=none
TBR=pthatcher,henrik.lundin,tina.legrand,stefan,tkchin,glaznev,kjellander,perkj,mflodman,henrika,asapersson,niklas.enbom
Review URL: https://webrtc-codereview.appspot.com/23129004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7726 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-11-20 22:28:14 +00:00
|
|
|
size_t GetPayloadDataLength(const RTPHeader& rtp_header,
|
|
|
|
|
const size_t packet_length) {
|
|
|
|
|
return packet_length - rtp_header.headerLength - rtp_header.paddingLength;
|
2013-09-06 13:40:11 +00:00
|
|
|
}
|
|
|
|
|
|
2013-11-15 08:59:19 +00:00
|
|
|
uint64_t ConvertMsToAbsSendTime(int64_t time_ms) {
|
2015-10-21 13:41:48 +02:00
|
|
|
return (((time_ms << 18) + 500) / 1000) & 0x00ffffff;
|
2013-11-15 08:59:19 +00:00
|
|
|
}
|
|
|
|
|
|
2012-01-16 11:06:31 +00:00
|
|
|
class LoopbackTransportTest : public webrtc::Transport {
|
|
|
|
|
public:
|
|
|
|
|
LoopbackTransportTest()
|
2015-03-04 22:55:15 +00:00
|
|
|
: packets_sent_(0),
|
|
|
|
|
last_sent_packet_len_(0),
|
|
|
|
|
total_bytes_sent_(0),
|
2016-01-27 12:58:51 +01:00
|
|
|
last_sent_packet_(nullptr),
|
|
|
|
|
last_packet_id_(-1) {}
|
2015-03-04 22:55:15 +00:00
|
|
|
|
|
|
|
|
~LoopbackTransportTest() {
|
|
|
|
|
STLDeleteContainerPointers(sent_packets_.begin(), sent_packets_.end());
|
|
|
|
|
}
|
2015-10-02 03:39:33 -07:00
|
|
|
bool SendRtp(const uint8_t* data,
|
|
|
|
|
size_t len,
|
|
|
|
|
const PacketOptions& options) override {
|
2012-01-16 11:06:31 +00:00
|
|
|
packets_sent_++;
|
rtc::Buffer improvements
1. Constructors, SetData(), and AppendData() now accept uint8_t*,
int8_t*, and char*. Previously, they accepted void*, meaning that
any kind of pointer was accepted. I think requiring an explicit
cast in cases where the input array isn't already of a byte-sized
type is a better compromise between convenience and safety.
2. data() can now return a uint8_t* instead of a char*, which seems
more appropriate for a byte array, and is harder to mix up with
zero-terminated C strings. data<int8_t>() is also available so
that callers that want that type instead won't have to cast, as
is data<char>() (which remains the default until all existing
callers have been fixed).
3. Constructors, SetData(), and AppendData() now accept arrays
natively, not just decayed to pointers. The advantage of this is
that callers don't have to pass the size separately.
4. There are new constructors that allow setting size and capacity
without initializing the array. Previously, this had to be done
separately after construction.
5. Instead of TransferTo(), Buffer now supports swap(), and move
construction and assignment, and has a Pass() method that works
just like std::move(). (The Pass method is modeled after
scoped_ptr::Pass().)
R=jmarusic@webrtc.org, tommi@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/42989004
Cr-Commit-Position: refs/heads/master@{#9033}
2015-04-20 14:03:07 +02:00
|
|
|
rtc::Buffer* buffer =
|
|
|
|
|
new rtc::Buffer(reinterpret_cast<const uint8_t*>(data), len);
|
2015-05-04 14:54:55 +02:00
|
|
|
last_sent_packet_ = buffer->data();
|
2012-01-16 11:06:31 +00:00
|
|
|
last_sent_packet_len_ = len;
|
2016-01-27 12:58:51 +01:00
|
|
|
last_packet_id_ = options.packet_id;
|
Use size_t more consistently for packet/payload lengths.
See design doc at https://docs.google.com/a/chromium.org/document/d/1I6nmE9D_BmCY-IoV6MDPY2V6WYpEI-dg2apWXTfZyUI/edit?usp=sharing for more information.
This CL was reviewed and approved in pieces in the following CLs:
https://webrtc-codereview.appspot.com/24209004/
https://webrtc-codereview.appspot.com/24229004/
https://webrtc-codereview.appspot.com/24259004/
https://webrtc-codereview.appspot.com/25109004/
https://webrtc-codereview.appspot.com/26099004/
https://webrtc-codereview.appspot.com/27069004/
https://webrtc-codereview.appspot.com/27969004/
https://webrtc-codereview.appspot.com/27989004/
https://webrtc-codereview.appspot.com/29009004/
https://webrtc-codereview.appspot.com/30929004/
https://webrtc-codereview.appspot.com/30939004/
https://webrtc-codereview.appspot.com/31999004/
Committing as TBR to the original reviewers.
BUG=chromium:81439
TEST=none
TBR=pthatcher,henrik.lundin,tina.legrand,stefan,tkchin,glaznev,kjellander,perkj,mflodman,henrika,asapersson,niklas.enbom
Review URL: https://webrtc-codereview.appspot.com/23129004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7726 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-11-20 22:28:14 +00:00
|
|
|
total_bytes_sent_ += len;
|
2015-03-04 22:55:15 +00:00
|
|
|
sent_packets_.push_back(buffer);
|
2015-09-28 09:59:31 -07:00
|
|
|
return true;
|
2012-01-16 11:06:31 +00:00
|
|
|
}
|
2015-12-10 02:39:40 -08:00
|
|
|
bool SendRtcp(const uint8_t* data, size_t len) override { return false; }
|
2012-01-16 11:06:31 +00:00
|
|
|
int packets_sent_;
|
Use size_t more consistently for packet/payload lengths.
See design doc at https://docs.google.com/a/chromium.org/document/d/1I6nmE9D_BmCY-IoV6MDPY2V6WYpEI-dg2apWXTfZyUI/edit?usp=sharing for more information.
This CL was reviewed and approved in pieces in the following CLs:
https://webrtc-codereview.appspot.com/24209004/
https://webrtc-codereview.appspot.com/24229004/
https://webrtc-codereview.appspot.com/24259004/
https://webrtc-codereview.appspot.com/25109004/
https://webrtc-codereview.appspot.com/26099004/
https://webrtc-codereview.appspot.com/27069004/
https://webrtc-codereview.appspot.com/27969004/
https://webrtc-codereview.appspot.com/27989004/
https://webrtc-codereview.appspot.com/29009004/
https://webrtc-codereview.appspot.com/30929004/
https://webrtc-codereview.appspot.com/30939004/
https://webrtc-codereview.appspot.com/31999004/
Committing as TBR to the original reviewers.
BUG=chromium:81439
TEST=none
TBR=pthatcher,henrik.lundin,tina.legrand,stefan,tkchin,glaznev,kjellander,perkj,mflodman,henrika,asapersson,niklas.enbom
Review URL: https://webrtc-codereview.appspot.com/23129004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7726 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-11-20 22:28:14 +00:00
|
|
|
size_t last_sent_packet_len_;
|
2014-07-10 16:24:54 +00:00
|
|
|
size_t total_bytes_sent_;
|
2015-03-04 22:55:15 +00:00
|
|
|
uint8_t* last_sent_packet_;
|
2016-01-27 12:58:51 +01:00
|
|
|
int last_packet_id_;
|
2015-03-04 22:55:15 +00:00
|
|
|
std::vector<rtc::Buffer*> sent_packets_;
|
2012-01-16 11:06:31 +00:00
|
|
|
};
|
|
|
|
|
|
2015-03-04 22:55:15 +00:00
|
|
|
} // namespace
|
|
|
|
|
|
2015-09-21 15:11:14 -07:00
|
|
|
class MockRtpPacketSender : public RtpPacketSender {
|
|
|
|
|
public:
|
|
|
|
|
MockRtpPacketSender() {}
|
|
|
|
|
virtual ~MockRtpPacketSender() {}
|
|
|
|
|
|
2015-10-08 11:44:14 +02:00
|
|
|
MOCK_METHOD6(InsertPacket,
|
|
|
|
|
void(Priority priority,
|
2015-09-21 15:11:14 -07:00
|
|
|
uint32_t ssrc,
|
|
|
|
|
uint16_t sequence_number,
|
|
|
|
|
int64_t capture_time_ms,
|
|
|
|
|
size_t bytes,
|
|
|
|
|
bool retransmission));
|
|
|
|
|
};
|
|
|
|
|
|
2016-01-27 12:58:51 +01:00
|
|
|
class MockTransportSequenceNumberAllocator
|
|
|
|
|
: public TransportSequenceNumberAllocator {
|
|
|
|
|
public:
|
|
|
|
|
MOCK_METHOD0(AllocateSequenceNumber, uint16_t());
|
|
|
|
|
};
|
|
|
|
|
|
2016-05-02 23:44:01 -07:00
|
|
|
class MockSendPacketObserver : public SendPacketObserver {
|
|
|
|
|
public:
|
|
|
|
|
MOCK_METHOD3(OnSendPacket, void(uint16_t, int64_t, uint32_t));
|
|
|
|
|
};
|
|
|
|
|
|
2011-12-16 14:31:37 +00:00
|
|
|
class RtpSenderTest : public ::testing::Test {
|
|
|
|
|
protected:
|
|
|
|
|
RtpSenderTest()
|
2013-12-13 09:46:59 +00:00
|
|
|
: fake_clock_(kStartTime),
|
2016-01-21 05:42:04 -08:00
|
|
|
mock_rtc_event_log_(),
|
2013-12-13 09:46:59 +00:00
|
|
|
mock_paced_sender_(),
|
|
|
|
|
rtp_sender_(),
|
|
|
|
|
payload_(kPayload),
|
|
|
|
|
transport_(),
|
|
|
|
|
kMarkerBit(true) {
|
2011-12-16 14:31:37 +00:00
|
|
|
}
|
2013-05-20 20:55:07 +00:00
|
|
|
|
2015-10-08 11:44:14 +02:00
|
|
|
void SetUp() override { SetUpRtpSender(true); }
|
|
|
|
|
|
|
|
|
|
void SetUpRtpSender(bool pacer) {
|
2016-05-02 23:44:01 -07:00
|
|
|
rtp_sender_.reset(new RTPSender(
|
|
|
|
|
false, &fake_clock_, &transport_, pacer ? &mock_paced_sender_ : nullptr,
|
|
|
|
|
&seq_num_allocator_, nullptr, nullptr, nullptr, nullptr,
|
|
|
|
|
&mock_rtc_event_log_, &send_packet_observer_));
|
2013-05-20 20:55:07 +00:00
|
|
|
rtp_sender_->SetSequenceNumber(kSeqNum);
|
|
|
|
|
}
|
|
|
|
|
|
2013-01-21 07:42:11 +00:00
|
|
|
SimulatedClock fake_clock_;
|
2016-01-21 05:42:04 -08:00
|
|
|
MockRtcEventLog mock_rtc_event_log_;
|
2015-09-21 15:11:14 -07:00
|
|
|
MockRtpPacketSender mock_paced_sender_;
|
2016-01-27 12:58:51 +01:00
|
|
|
MockTransportSequenceNumberAllocator seq_num_allocator_;
|
2016-05-02 23:44:01 -07:00
|
|
|
MockSendPacketObserver send_packet_observer_;
|
2016-04-27 01:19:58 -07:00
|
|
|
std::unique_ptr<RTPSender> rtp_sender_;
|
2013-05-20 20:55:07 +00:00
|
|
|
int payload_;
|
2012-01-16 11:06:31 +00:00
|
|
|
LoopbackTransportTest transport_;
|
2011-12-16 14:31:37 +00:00
|
|
|
const bool kMarkerBit;
|
|
|
|
|
uint8_t packet_[kMaxPacketLength];
|
|
|
|
|
|
2013-05-29 12:12:51 +00:00
|
|
|
void VerifyRTPHeaderCommon(const RTPHeader& rtp_header) {
|
2016-01-14 14:55:19 -08:00
|
|
|
VerifyRTPHeaderCommon(rtp_header, kMarkerBit, 0);
|
2015-03-04 22:55:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void VerifyRTPHeaderCommon(const RTPHeader& rtp_header, bool marker_bit) {
|
2016-01-14 14:55:19 -08:00
|
|
|
VerifyRTPHeaderCommon(rtp_header, marker_bit, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void VerifyRTPHeaderCommon(const RTPHeader& rtp_header,
|
|
|
|
|
bool marker_bit,
|
|
|
|
|
uint8_t number_of_csrcs) {
|
2015-03-04 22:55:15 +00:00
|
|
|
EXPECT_EQ(marker_bit, rtp_header.markerBit);
|
2013-05-29 12:12:51 +00:00
|
|
|
EXPECT_EQ(payload_, rtp_header.payloadType);
|
|
|
|
|
EXPECT_EQ(kSeqNum, rtp_header.sequenceNumber);
|
|
|
|
|
EXPECT_EQ(kTimestamp, rtp_header.timestamp);
|
|
|
|
|
EXPECT_EQ(rtp_sender_->SSRC(), rtp_header.ssrc);
|
2016-01-14 14:55:19 -08:00
|
|
|
EXPECT_EQ(number_of_csrcs, rtp_header.numCSRCs);
|
Use size_t more consistently for packet/payload lengths.
See design doc at https://docs.google.com/a/chromium.org/document/d/1I6nmE9D_BmCY-IoV6MDPY2V6WYpEI-dg2apWXTfZyUI/edit?usp=sharing for more information.
This CL was reviewed and approved in pieces in the following CLs:
https://webrtc-codereview.appspot.com/24209004/
https://webrtc-codereview.appspot.com/24229004/
https://webrtc-codereview.appspot.com/24259004/
https://webrtc-codereview.appspot.com/25109004/
https://webrtc-codereview.appspot.com/26099004/
https://webrtc-codereview.appspot.com/27069004/
https://webrtc-codereview.appspot.com/27969004/
https://webrtc-codereview.appspot.com/27989004/
https://webrtc-codereview.appspot.com/29009004/
https://webrtc-codereview.appspot.com/30929004/
https://webrtc-codereview.appspot.com/30939004/
https://webrtc-codereview.appspot.com/31999004/
Committing as TBR to the original reviewers.
BUG=chromium:81439
TEST=none
TBR=pthatcher,henrik.lundin,tina.legrand,stefan,tkchin,glaznev,kjellander,perkj,mflodman,henrika,asapersson,niklas.enbom
Review URL: https://webrtc-codereview.appspot.com/23129004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7726 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-11-20 22:28:14 +00:00
|
|
|
EXPECT_EQ(0U, rtp_header.paddingLength);
|
2011-12-16 14:31:37 +00:00
|
|
|
}
|
2013-12-04 10:24:26 +00:00
|
|
|
|
|
|
|
|
void SendPacket(int64_t capture_time_ms, int payload_length) {
|
|
|
|
|
uint32_t timestamp = capture_time_ms * 90;
|
2015-12-10 02:39:40 -08:00
|
|
|
int32_t rtp_length = rtp_sender_->BuildRTPheader(
|
|
|
|
|
packet_, kPayload, kMarkerBit, timestamp, capture_time_ms);
|
Use size_t more consistently for packet/payload lengths.
See design doc at https://docs.google.com/a/chromium.org/document/d/1I6nmE9D_BmCY-IoV6MDPY2V6WYpEI-dg2apWXTfZyUI/edit?usp=sharing for more information.
This CL was reviewed and approved in pieces in the following CLs:
https://webrtc-codereview.appspot.com/24209004/
https://webrtc-codereview.appspot.com/24229004/
https://webrtc-codereview.appspot.com/24259004/
https://webrtc-codereview.appspot.com/25109004/
https://webrtc-codereview.appspot.com/26099004/
https://webrtc-codereview.appspot.com/27069004/
https://webrtc-codereview.appspot.com/27969004/
https://webrtc-codereview.appspot.com/27989004/
https://webrtc-codereview.appspot.com/29009004/
https://webrtc-codereview.appspot.com/30929004/
https://webrtc-codereview.appspot.com/30939004/
https://webrtc-codereview.appspot.com/31999004/
Committing as TBR to the original reviewers.
BUG=chromium:81439
TEST=none
TBR=pthatcher,henrik.lundin,tina.legrand,stefan,tkchin,glaznev,kjellander,perkj,mflodman,henrika,asapersson,niklas.enbom
Review URL: https://webrtc-codereview.appspot.com/23129004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7726 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-11-20 22:28:14 +00:00
|
|
|
ASSERT_GE(rtp_length, 0);
|
2013-12-04 10:24:26 +00:00
|
|
|
|
|
|
|
|
// Packet should be stored in a send bucket.
|
2015-09-21 15:11:14 -07:00
|
|
|
EXPECT_EQ(0, rtp_sender_->SendToNetwork(
|
|
|
|
|
packet_, payload_length, rtp_length, capture_time_ms,
|
|
|
|
|
kAllowRetransmission, RtpPacketSender::kNormalPriority));
|
2013-12-04 10:24:26 +00:00
|
|
|
}
|
2016-05-02 23:44:01 -07:00
|
|
|
|
|
|
|
|
void SendGenericPayload() {
|
|
|
|
|
const uint8_t kPayload[] = {47, 11, 32, 93, 89};
|
|
|
|
|
const uint32_t kTimestamp = 1234;
|
|
|
|
|
const uint8_t kPayloadType = 127;
|
|
|
|
|
const int64_t kCaptureTimeMs = fake_clock_.TimeInMilliseconds();
|
|
|
|
|
char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC";
|
|
|
|
|
EXPECT_EQ(0, rtp_sender_->RegisterPayload(payload_name, kPayloadType, 90000,
|
|
|
|
|
0, 1500));
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(0, rtp_sender_->SendOutgoingData(
|
|
|
|
|
kVideoFrameKey, kPayloadType, kTimestamp, kCaptureTimeMs,
|
|
|
|
|
kPayload, sizeof(kPayload), nullptr));
|
|
|
|
|
}
|
2011-12-16 14:31:37 +00:00
|
|
|
};
|
|
|
|
|
|
2015-10-08 11:44:14 +02:00
|
|
|
// TODO(pbos): Move tests over from WithoutPacer to RtpSenderTest as this is our
|
|
|
|
|
// default code path.
|
|
|
|
|
class RtpSenderTestWithoutPacer : public RtpSenderTest {
|
|
|
|
|
public:
|
|
|
|
|
void SetUp() override { SetUpRtpSender(false); }
|
|
|
|
|
};
|
|
|
|
|
|
2015-03-04 22:55:15 +00:00
|
|
|
class RtpSenderVideoTest : public RtpSenderTest {
|
|
|
|
|
protected:
|
2015-12-10 02:39:40 -08:00
|
|
|
void SetUp() override {
|
2015-10-08 11:44:14 +02:00
|
|
|
// TODO(pbos): Set up to use pacer.
|
|
|
|
|
SetUpRtpSender(false);
|
2015-03-04 22:55:15 +00:00
|
|
|
rtp_sender_video_.reset(
|
|
|
|
|
new RTPSenderVideo(&fake_clock_, rtp_sender_.get()));
|
|
|
|
|
}
|
2016-04-27 01:19:58 -07:00
|
|
|
std::unique_ptr<RTPSenderVideo> rtp_sender_video_;
|
2015-03-04 22:55:15 +00:00
|
|
|
|
|
|
|
|
void VerifyCVOPacket(uint8_t* data,
|
|
|
|
|
size_t len,
|
|
|
|
|
bool expect_cvo,
|
|
|
|
|
RtpHeaderExtensionMap* map,
|
|
|
|
|
uint16_t seq_num,
|
|
|
|
|
VideoRotation rotation) {
|
|
|
|
|
webrtc::RtpUtility::RtpHeaderParser rtp_parser(data, len);
|
|
|
|
|
|
|
|
|
|
webrtc::RTPHeader rtp_header;
|
|
|
|
|
size_t length = static_cast<size_t>(rtp_sender_->BuildRTPheader(
|
|
|
|
|
packet_, kPayload, expect_cvo /* marker_bit */, kTimestamp, 0));
|
|
|
|
|
if (expect_cvo) {
|
|
|
|
|
ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionTotalLength(),
|
|
|
|
|
length);
|
|
|
|
|
} else {
|
|
|
|
|
ASSERT_EQ(kRtpHeaderSize, length);
|
|
|
|
|
}
|
2015-12-28 10:18:46 -08:00
|
|
|
ASSERT_TRUE(rtp_parser.Parse(&rtp_header, map));
|
2015-03-04 22:55:15 +00:00
|
|
|
ASSERT_FALSE(rtp_parser.RTCP());
|
|
|
|
|
EXPECT_EQ(payload_, rtp_header.payloadType);
|
|
|
|
|
EXPECT_EQ(seq_num, rtp_header.sequenceNumber);
|
|
|
|
|
EXPECT_EQ(kTimestamp, rtp_header.timestamp);
|
|
|
|
|
EXPECT_EQ(rtp_sender_->SSRC(), rtp_header.ssrc);
|
|
|
|
|
EXPECT_EQ(0, rtp_header.numCSRCs);
|
|
|
|
|
EXPECT_EQ(0U, rtp_header.paddingLength);
|
2015-03-12 20:50:57 +00:00
|
|
|
EXPECT_EQ(ConvertVideoRotationToCVOByte(rotation),
|
2015-03-04 22:55:15 +00:00
|
|
|
rtp_header.extension.videoRotation);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
2015-10-08 11:44:14 +02:00
|
|
|
TEST_F(RtpSenderTestWithoutPacer,
|
|
|
|
|
RegisterRtpTransmissionTimeOffsetHeaderExtension) {
|
Use size_t more consistently for packet/payload lengths.
See design doc at https://docs.google.com/a/chromium.org/document/d/1I6nmE9D_BmCY-IoV6MDPY2V6WYpEI-dg2apWXTfZyUI/edit?usp=sharing for more information.
This CL was reviewed and approved in pieces in the following CLs:
https://webrtc-codereview.appspot.com/24209004/
https://webrtc-codereview.appspot.com/24229004/
https://webrtc-codereview.appspot.com/24259004/
https://webrtc-codereview.appspot.com/25109004/
https://webrtc-codereview.appspot.com/26099004/
https://webrtc-codereview.appspot.com/27069004/
https://webrtc-codereview.appspot.com/27969004/
https://webrtc-codereview.appspot.com/27989004/
https://webrtc-codereview.appspot.com/29009004/
https://webrtc-codereview.appspot.com/30929004/
https://webrtc-codereview.appspot.com/30939004/
https://webrtc-codereview.appspot.com/31999004/
Committing as TBR to the original reviewers.
BUG=chromium:81439
TEST=none
TBR=pthatcher,henrik.lundin,tina.legrand,stefan,tkchin,glaznev,kjellander,perkj,mflodman,henrika,asapersson,niklas.enbom
Review URL: https://webrtc-codereview.appspot.com/23129004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7726 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-11-20 22:28:14 +00:00
|
|
|
EXPECT_EQ(0u, rtp_sender_->RtpHeaderExtensionTotalLength());
|
2013-05-16 11:10:31 +00:00
|
|
|
EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
|
2015-12-10 02:39:40 -08:00
|
|
|
kRtpExtensionTransmissionTimeOffset,
|
|
|
|
|
kTransmissionTimeOffsetExtensionId));
|
2013-05-16 11:10:31 +00:00
|
|
|
EXPECT_EQ(kRtpOneByteHeaderLength + kTransmissionTimeOffsetLength,
|
2011-12-16 14:31:37 +00:00
|
|
|
rtp_sender_->RtpHeaderExtensionTotalLength());
|
2013-05-16 11:10:31 +00:00
|
|
|
EXPECT_EQ(0, rtp_sender_->DeregisterRtpHeaderExtension(
|
2015-12-10 02:39:40 -08:00
|
|
|
kRtpExtensionTransmissionTimeOffset));
|
Use size_t more consistently for packet/payload lengths.
See design doc at https://docs.google.com/a/chromium.org/document/d/1I6nmE9D_BmCY-IoV6MDPY2V6WYpEI-dg2apWXTfZyUI/edit?usp=sharing for more information.
This CL was reviewed and approved in pieces in the following CLs:
https://webrtc-codereview.appspot.com/24209004/
https://webrtc-codereview.appspot.com/24229004/
https://webrtc-codereview.appspot.com/24259004/
https://webrtc-codereview.appspot.com/25109004/
https://webrtc-codereview.appspot.com/26099004/
https://webrtc-codereview.appspot.com/27069004/
https://webrtc-codereview.appspot.com/27969004/
https://webrtc-codereview.appspot.com/27989004/
https://webrtc-codereview.appspot.com/29009004/
https://webrtc-codereview.appspot.com/30929004/
https://webrtc-codereview.appspot.com/30939004/
https://webrtc-codereview.appspot.com/31999004/
Committing as TBR to the original reviewers.
BUG=chromium:81439
TEST=none
TBR=pthatcher,henrik.lundin,tina.legrand,stefan,tkchin,glaznev,kjellander,perkj,mflodman,henrika,asapersson,niklas.enbom
Review URL: https://webrtc-codereview.appspot.com/23129004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7726 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-11-20 22:28:14 +00:00
|
|
|
EXPECT_EQ(0u, rtp_sender_->RtpHeaderExtensionTotalLength());
|
2013-05-16 11:10:31 +00:00
|
|
|
}
|
|
|
|
|
|
2015-10-08 11:44:14 +02:00
|
|
|
TEST_F(RtpSenderTestWithoutPacer, RegisterRtpAbsoluteSendTimeHeaderExtension) {
|
Use size_t more consistently for packet/payload lengths.
See design doc at https://docs.google.com/a/chromium.org/document/d/1I6nmE9D_BmCY-IoV6MDPY2V6WYpEI-dg2apWXTfZyUI/edit?usp=sharing for more information.
This CL was reviewed and approved in pieces in the following CLs:
https://webrtc-codereview.appspot.com/24209004/
https://webrtc-codereview.appspot.com/24229004/
https://webrtc-codereview.appspot.com/24259004/
https://webrtc-codereview.appspot.com/25109004/
https://webrtc-codereview.appspot.com/26099004/
https://webrtc-codereview.appspot.com/27069004/
https://webrtc-codereview.appspot.com/27969004/
https://webrtc-codereview.appspot.com/27989004/
https://webrtc-codereview.appspot.com/29009004/
https://webrtc-codereview.appspot.com/30929004/
https://webrtc-codereview.appspot.com/30939004/
https://webrtc-codereview.appspot.com/31999004/
Committing as TBR to the original reviewers.
BUG=chromium:81439
TEST=none
TBR=pthatcher,henrik.lundin,tina.legrand,stefan,tkchin,glaznev,kjellander,perkj,mflodman,henrika,asapersson,niklas.enbom
Review URL: https://webrtc-codereview.appspot.com/23129004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7726 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-11-20 22:28:14 +00:00
|
|
|
EXPECT_EQ(0u, rtp_sender_->RtpHeaderExtensionTotalLength());
|
2015-12-10 02:39:40 -08:00
|
|
|
EXPECT_EQ(
|
|
|
|
|
0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
|
|
|
|
|
kAbsoluteSendTimeExtensionId));
|
2015-03-17 14:33:12 +00:00
|
|
|
EXPECT_EQ(RtpUtility::Word32Align(kRtpOneByteHeaderLength +
|
|
|
|
|
kAbsoluteSendTimeLength),
|
2013-05-16 11:10:31 +00:00
|
|
|
rtp_sender_->RtpHeaderExtensionTotalLength());
|
|
|
|
|
EXPECT_EQ(0, rtp_sender_->DeregisterRtpHeaderExtension(
|
2015-12-10 02:39:40 -08:00
|
|
|
kRtpExtensionAbsoluteSendTime));
|
Use size_t more consistently for packet/payload lengths.
See design doc at https://docs.google.com/a/chromium.org/document/d/1I6nmE9D_BmCY-IoV6MDPY2V6WYpEI-dg2apWXTfZyUI/edit?usp=sharing for more information.
This CL was reviewed and approved in pieces in the following CLs:
https://webrtc-codereview.appspot.com/24209004/
https://webrtc-codereview.appspot.com/24229004/
https://webrtc-codereview.appspot.com/24259004/
https://webrtc-codereview.appspot.com/25109004/
https://webrtc-codereview.appspot.com/26099004/
https://webrtc-codereview.appspot.com/27069004/
https://webrtc-codereview.appspot.com/27969004/
https://webrtc-codereview.appspot.com/27989004/
https://webrtc-codereview.appspot.com/29009004/
https://webrtc-codereview.appspot.com/30929004/
https://webrtc-codereview.appspot.com/30939004/
https://webrtc-codereview.appspot.com/31999004/
Committing as TBR to the original reviewers.
BUG=chromium:81439
TEST=none
TBR=pthatcher,henrik.lundin,tina.legrand,stefan,tkchin,glaznev,kjellander,perkj,mflodman,henrika,asapersson,niklas.enbom
Review URL: https://webrtc-codereview.appspot.com/23129004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7726 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-11-20 22:28:14 +00:00
|
|
|
EXPECT_EQ(0u, rtp_sender_->RtpHeaderExtensionTotalLength());
|
2013-05-16 11:10:31 +00:00
|
|
|
}
|
|
|
|
|
|
2015-10-08 11:44:14 +02:00
|
|
|
TEST_F(RtpSenderTestWithoutPacer, RegisterRtpAudioLevelHeaderExtension) {
|
Use size_t more consistently for packet/payload lengths.
See design doc at https://docs.google.com/a/chromium.org/document/d/1I6nmE9D_BmCY-IoV6MDPY2V6WYpEI-dg2apWXTfZyUI/edit?usp=sharing for more information.
This CL was reviewed and approved in pieces in the following CLs:
https://webrtc-codereview.appspot.com/24209004/
https://webrtc-codereview.appspot.com/24229004/
https://webrtc-codereview.appspot.com/24259004/
https://webrtc-codereview.appspot.com/25109004/
https://webrtc-codereview.appspot.com/26099004/
https://webrtc-codereview.appspot.com/27069004/
https://webrtc-codereview.appspot.com/27969004/
https://webrtc-codereview.appspot.com/27989004/
https://webrtc-codereview.appspot.com/29009004/
https://webrtc-codereview.appspot.com/30929004/
https://webrtc-codereview.appspot.com/30939004/
https://webrtc-codereview.appspot.com/31999004/
Committing as TBR to the original reviewers.
BUG=chromium:81439
TEST=none
TBR=pthatcher,henrik.lundin,tina.legrand,stefan,tkchin,glaznev,kjellander,perkj,mflodman,henrika,asapersson,niklas.enbom
Review URL: https://webrtc-codereview.appspot.com/23129004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7726 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-11-20 22:28:14 +00:00
|
|
|
EXPECT_EQ(0u, rtp_sender_->RtpHeaderExtensionTotalLength());
|
2015-12-10 02:39:40 -08:00
|
|
|
EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAudioLevel,
|
|
|
|
|
kAudioLevelExtensionId));
|
2015-03-17 14:33:12 +00:00
|
|
|
EXPECT_EQ(
|
|
|
|
|
RtpUtility::Word32Align(kRtpOneByteHeaderLength + kAudioLevelLength),
|
|
|
|
|
rtp_sender_->RtpHeaderExtensionTotalLength());
|
2015-12-10 02:39:40 -08:00
|
|
|
EXPECT_EQ(0,
|
|
|
|
|
rtp_sender_->DeregisterRtpHeaderExtension(kRtpExtensionAudioLevel));
|
Use size_t more consistently for packet/payload lengths.
See design doc at https://docs.google.com/a/chromium.org/document/d/1I6nmE9D_BmCY-IoV6MDPY2V6WYpEI-dg2apWXTfZyUI/edit?usp=sharing for more information.
This CL was reviewed and approved in pieces in the following CLs:
https://webrtc-codereview.appspot.com/24209004/
https://webrtc-codereview.appspot.com/24229004/
https://webrtc-codereview.appspot.com/24259004/
https://webrtc-codereview.appspot.com/25109004/
https://webrtc-codereview.appspot.com/26099004/
https://webrtc-codereview.appspot.com/27069004/
https://webrtc-codereview.appspot.com/27969004/
https://webrtc-codereview.appspot.com/27989004/
https://webrtc-codereview.appspot.com/29009004/
https://webrtc-codereview.appspot.com/30929004/
https://webrtc-codereview.appspot.com/30939004/
https://webrtc-codereview.appspot.com/31999004/
Committing as TBR to the original reviewers.
BUG=chromium:81439
TEST=none
TBR=pthatcher,henrik.lundin,tina.legrand,stefan,tkchin,glaznev,kjellander,perkj,mflodman,henrika,asapersson,niklas.enbom
Review URL: https://webrtc-codereview.appspot.com/23129004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7726 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-11-20 22:28:14 +00:00
|
|
|
EXPECT_EQ(0u, rtp_sender_->RtpHeaderExtensionTotalLength());
|
2013-05-20 20:55:07 +00:00
|
|
|
}
|
|
|
|
|
|
2015-10-08 11:44:14 +02:00
|
|
|
TEST_F(RtpSenderTestWithoutPacer, RegisterRtpHeaderExtensions) {
|
Use size_t more consistently for packet/payload lengths.
See design doc at https://docs.google.com/a/chromium.org/document/d/1I6nmE9D_BmCY-IoV6MDPY2V6WYpEI-dg2apWXTfZyUI/edit?usp=sharing for more information.
This CL was reviewed and approved in pieces in the following CLs:
https://webrtc-codereview.appspot.com/24209004/
https://webrtc-codereview.appspot.com/24229004/
https://webrtc-codereview.appspot.com/24259004/
https://webrtc-codereview.appspot.com/25109004/
https://webrtc-codereview.appspot.com/26099004/
https://webrtc-codereview.appspot.com/27069004/
https://webrtc-codereview.appspot.com/27969004/
https://webrtc-codereview.appspot.com/27989004/
https://webrtc-codereview.appspot.com/29009004/
https://webrtc-codereview.appspot.com/30929004/
https://webrtc-codereview.appspot.com/30939004/
https://webrtc-codereview.appspot.com/31999004/
Committing as TBR to the original reviewers.
BUG=chromium:81439
TEST=none
TBR=pthatcher,henrik.lundin,tina.legrand,stefan,tkchin,glaznev,kjellander,perkj,mflodman,henrika,asapersson,niklas.enbom
Review URL: https://webrtc-codereview.appspot.com/23129004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7726 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-11-20 22:28:14 +00:00
|
|
|
EXPECT_EQ(0u, rtp_sender_->RtpHeaderExtensionTotalLength());
|
2013-05-16 11:10:31 +00:00
|
|
|
EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
|
2015-12-10 02:39:40 -08:00
|
|
|
kRtpExtensionTransmissionTimeOffset,
|
|
|
|
|
kTransmissionTimeOffsetExtensionId));
|
2015-03-17 14:33:12 +00:00
|
|
|
EXPECT_EQ(RtpUtility::Word32Align(kRtpOneByteHeaderLength +
|
|
|
|
|
kTransmissionTimeOffsetLength),
|
2013-05-16 11:10:31 +00:00
|
|
|
rtp_sender_->RtpHeaderExtensionTotalLength());
|
2015-12-10 02:39:40 -08:00
|
|
|
EXPECT_EQ(
|
|
|
|
|
0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
|
|
|
|
|
kAbsoluteSendTimeExtensionId));
|
2015-03-17 14:33:12 +00:00
|
|
|
EXPECT_EQ(RtpUtility::Word32Align(kRtpOneByteHeaderLength +
|
|
|
|
|
kTransmissionTimeOffsetLength +
|
|
|
|
|
kAbsoluteSendTimeLength),
|
|
|
|
|
rtp_sender_->RtpHeaderExtensionTotalLength());
|
2015-12-10 02:39:40 -08:00
|
|
|
EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAudioLevel,
|
|
|
|
|
kAudioLevelExtensionId));
|
2015-03-17 14:33:12 +00:00
|
|
|
EXPECT_EQ(RtpUtility::Word32Align(
|
|
|
|
|
kRtpOneByteHeaderLength + kTransmissionTimeOffsetLength +
|
|
|
|
|
kAbsoluteSendTimeLength + kAudioLevelLength),
|
|
|
|
|
rtp_sender_->RtpHeaderExtensionTotalLength());
|
2015-03-04 22:55:15 +00:00
|
|
|
EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
|
|
|
|
|
kRtpExtensionVideoRotation, kVideoRotationExtensionId));
|
2015-04-01 15:33:06 -07:00
|
|
|
EXPECT_TRUE(rtp_sender_->ActivateCVORtpHeaderExtension());
|
2015-03-17 14:33:12 +00:00
|
|
|
EXPECT_EQ(RtpUtility::Word32Align(kRtpOneByteHeaderLength +
|
|
|
|
|
kTransmissionTimeOffsetLength +
|
|
|
|
|
kAbsoluteSendTimeLength +
|
|
|
|
|
kAudioLevelLength + kVideoRotationLength),
|
2015-03-04 22:55:15 +00:00
|
|
|
rtp_sender_->RtpHeaderExtensionTotalLength());
|
|
|
|
|
|
|
|
|
|
// Deregister starts.
|
2013-05-16 11:10:31 +00:00
|
|
|
EXPECT_EQ(0, rtp_sender_->DeregisterRtpHeaderExtension(
|
2015-12-10 02:39:40 -08:00
|
|
|
kRtpExtensionTransmissionTimeOffset));
|
2015-03-17 14:33:12 +00:00
|
|
|
EXPECT_EQ(RtpUtility::Word32Align(kRtpOneByteHeaderLength +
|
|
|
|
|
kAbsoluteSendTimeLength +
|
|
|
|
|
kAudioLevelLength + kVideoRotationLength),
|
2015-03-04 22:55:15 +00:00
|
|
|
rtp_sender_->RtpHeaderExtensionTotalLength());
|
2013-05-16 11:10:31 +00:00
|
|
|
EXPECT_EQ(0, rtp_sender_->DeregisterRtpHeaderExtension(
|
2015-12-10 02:39:40 -08:00
|
|
|
kRtpExtensionAbsoluteSendTime));
|
2015-03-17 14:33:12 +00:00
|
|
|
EXPECT_EQ(RtpUtility::Word32Align(kRtpOneByteHeaderLength +
|
|
|
|
|
kAudioLevelLength + kVideoRotationLength),
|
2015-03-04 22:55:15 +00:00
|
|
|
rtp_sender_->RtpHeaderExtensionTotalLength());
|
2015-12-10 02:39:40 -08:00
|
|
|
EXPECT_EQ(0,
|
|
|
|
|
rtp_sender_->DeregisterRtpHeaderExtension(kRtpExtensionAudioLevel));
|
2015-03-17 14:33:12 +00:00
|
|
|
EXPECT_EQ(
|
|
|
|
|
RtpUtility::Word32Align(kRtpOneByteHeaderLength + kVideoRotationLength),
|
|
|
|
|
rtp_sender_->RtpHeaderExtensionTotalLength());
|
2015-03-04 22:55:15 +00:00
|
|
|
EXPECT_EQ(
|
|
|
|
|
0, rtp_sender_->DeregisterRtpHeaderExtension(kRtpExtensionVideoRotation));
|
|
|
|
|
EXPECT_EQ(0u, rtp_sender_->RtpHeaderExtensionTotalLength());
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-08 11:44:14 +02:00
|
|
|
TEST_F(RtpSenderTestWithoutPacer, RegisterRtpVideoRotationHeaderExtension) {
|
2015-03-04 22:55:15 +00:00
|
|
|
EXPECT_EQ(0u, rtp_sender_->RtpHeaderExtensionTotalLength());
|
|
|
|
|
EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
|
|
|
|
|
kRtpExtensionVideoRotation, kVideoRotationExtensionId));
|
2015-04-01 15:33:06 -07:00
|
|
|
EXPECT_EQ(0u, rtp_sender_->RtpHeaderExtensionTotalLength());
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(rtp_sender_->ActivateCVORtpHeaderExtension());
|
2015-03-17 14:33:12 +00:00
|
|
|
EXPECT_EQ(
|
|
|
|
|
RtpUtility::Word32Align(kRtpOneByteHeaderLength + kVideoRotationLength),
|
|
|
|
|
rtp_sender_->RtpHeaderExtensionTotalLength());
|
2015-03-04 22:55:15 +00:00
|
|
|
EXPECT_EQ(
|
|
|
|
|
0, rtp_sender_->DeregisterRtpHeaderExtension(kRtpExtensionVideoRotation));
|
Use size_t more consistently for packet/payload lengths.
See design doc at https://docs.google.com/a/chromium.org/document/d/1I6nmE9D_BmCY-IoV6MDPY2V6WYpEI-dg2apWXTfZyUI/edit?usp=sharing for more information.
This CL was reviewed and approved in pieces in the following CLs:
https://webrtc-codereview.appspot.com/24209004/
https://webrtc-codereview.appspot.com/24229004/
https://webrtc-codereview.appspot.com/24259004/
https://webrtc-codereview.appspot.com/25109004/
https://webrtc-codereview.appspot.com/26099004/
https://webrtc-codereview.appspot.com/27069004/
https://webrtc-codereview.appspot.com/27969004/
https://webrtc-codereview.appspot.com/27989004/
https://webrtc-codereview.appspot.com/29009004/
https://webrtc-codereview.appspot.com/30929004/
https://webrtc-codereview.appspot.com/30939004/
https://webrtc-codereview.appspot.com/31999004/
Committing as TBR to the original reviewers.
BUG=chromium:81439
TEST=none
TBR=pthatcher,henrik.lundin,tina.legrand,stefan,tkchin,glaznev,kjellander,perkj,mflodman,henrika,asapersson,niklas.enbom
Review URL: https://webrtc-codereview.appspot.com/23129004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7726 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-11-20 22:28:14 +00:00
|
|
|
EXPECT_EQ(0u, rtp_sender_->RtpHeaderExtensionTotalLength());
|
2011-12-16 14:31:37 +00:00
|
|
|
}
|
|
|
|
|
|
2015-10-08 11:44:14 +02:00
|
|
|
TEST_F(RtpSenderTestWithoutPacer, BuildRTPPacket) {
|
Use size_t more consistently for packet/payload lengths.
See design doc at https://docs.google.com/a/chromium.org/document/d/1I6nmE9D_BmCY-IoV6MDPY2V6WYpEI-dg2apWXTfZyUI/edit?usp=sharing for more information.
This CL was reviewed and approved in pieces in the following CLs:
https://webrtc-codereview.appspot.com/24209004/
https://webrtc-codereview.appspot.com/24229004/
https://webrtc-codereview.appspot.com/24259004/
https://webrtc-codereview.appspot.com/25109004/
https://webrtc-codereview.appspot.com/26099004/
https://webrtc-codereview.appspot.com/27069004/
https://webrtc-codereview.appspot.com/27969004/
https://webrtc-codereview.appspot.com/27989004/
https://webrtc-codereview.appspot.com/29009004/
https://webrtc-codereview.appspot.com/30929004/
https://webrtc-codereview.appspot.com/30939004/
https://webrtc-codereview.appspot.com/31999004/
Committing as TBR to the original reviewers.
BUG=chromium:81439
TEST=none
TBR=pthatcher,henrik.lundin,tina.legrand,stefan,tkchin,glaznev,kjellander,perkj,mflodman,henrika,asapersson,niklas.enbom
Review URL: https://webrtc-codereview.appspot.com/23129004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7726 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-11-20 22:28:14 +00:00
|
|
|
size_t length = static_cast<size_t>(rtp_sender_->BuildRTPheader(
|
|
|
|
|
packet_, kPayload, kMarkerBit, kTimestamp, 0));
|
|
|
|
|
ASSERT_EQ(kRtpHeaderSize, length);
|
2011-12-16 14:31:37 +00:00
|
|
|
|
|
|
|
|
// Verify
|
2014-07-08 12:10:51 +00:00
|
|
|
webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length);
|
2013-05-29 12:12:51 +00:00
|
|
|
webrtc::RTPHeader rtp_header;
|
2011-12-16 14:31:37 +00:00
|
|
|
|
2015-12-28 10:18:46 -08:00
|
|
|
const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, nullptr);
|
2011-12-16 14:31:37 +00:00
|
|
|
|
|
|
|
|
ASSERT_TRUE(valid_rtp_header);
|
2012-06-28 07:53:15 +00:00
|
|
|
ASSERT_FALSE(rtp_parser.RTCP());
|
2011-12-16 14:31:37 +00:00
|
|
|
VerifyRTPHeaderCommon(rtp_header);
|
2013-05-29 12:12:51 +00:00
|
|
|
EXPECT_EQ(length, rtp_header.headerLength);
|
2014-03-06 23:49:08 +00:00
|
|
|
EXPECT_FALSE(rtp_header.extension.hasTransmissionTimeOffset);
|
|
|
|
|
EXPECT_FALSE(rtp_header.extension.hasAbsoluteSendTime);
|
|
|
|
|
EXPECT_FALSE(rtp_header.extension.hasAudioLevel);
|
2011-12-16 14:31:37 +00:00
|
|
|
EXPECT_EQ(0, rtp_header.extension.transmissionTimeOffset);
|
2013-05-16 11:10:31 +00:00
|
|
|
EXPECT_EQ(0u, rtp_header.extension.absoluteSendTime);
|
2015-08-10 15:08:36 +02:00
|
|
|
EXPECT_FALSE(rtp_header.extension.voiceActivity);
|
2014-03-06 23:49:08 +00:00
|
|
|
EXPECT_EQ(0u, rtp_header.extension.audioLevel);
|
2015-03-04 22:55:15 +00:00
|
|
|
EXPECT_EQ(0u, rtp_header.extension.videoRotation);
|
2011-12-16 14:31:37 +00:00
|
|
|
}
|
|
|
|
|
|
2015-10-08 11:44:14 +02:00
|
|
|
TEST_F(RtpSenderTestWithoutPacer,
|
|
|
|
|
BuildRTPPacketWithTransmissionOffsetExtension) {
|
2011-12-16 14:31:37 +00:00
|
|
|
EXPECT_EQ(0, rtp_sender_->SetTransmissionTimeOffset(kTimeOffset));
|
2013-05-16 11:10:31 +00:00
|
|
|
EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
|
2015-12-10 02:39:40 -08:00
|
|
|
kRtpExtensionTransmissionTimeOffset,
|
|
|
|
|
kTransmissionTimeOffsetExtensionId));
|
2011-12-16 14:31:37 +00:00
|
|
|
|
Use size_t more consistently for packet/payload lengths.
See design doc at https://docs.google.com/a/chromium.org/document/d/1I6nmE9D_BmCY-IoV6MDPY2V6WYpEI-dg2apWXTfZyUI/edit?usp=sharing for more information.
This CL was reviewed and approved in pieces in the following CLs:
https://webrtc-codereview.appspot.com/24209004/
https://webrtc-codereview.appspot.com/24229004/
https://webrtc-codereview.appspot.com/24259004/
https://webrtc-codereview.appspot.com/25109004/
https://webrtc-codereview.appspot.com/26099004/
https://webrtc-codereview.appspot.com/27069004/
https://webrtc-codereview.appspot.com/27969004/
https://webrtc-codereview.appspot.com/27989004/
https://webrtc-codereview.appspot.com/29009004/
https://webrtc-codereview.appspot.com/30929004/
https://webrtc-codereview.appspot.com/30939004/
https://webrtc-codereview.appspot.com/31999004/
Committing as TBR to the original reviewers.
BUG=chromium:81439
TEST=none
TBR=pthatcher,henrik.lundin,tina.legrand,stefan,tkchin,glaznev,kjellander,perkj,mflodman,henrika,asapersson,niklas.enbom
Review URL: https://webrtc-codereview.appspot.com/23129004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7726 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-11-20 22:28:14 +00:00
|
|
|
size_t length = static_cast<size_t>(rtp_sender_->BuildRTPheader(
|
|
|
|
|
packet_, kPayload, kMarkerBit, kTimestamp, 0));
|
|
|
|
|
ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionTotalLength(),
|
|
|
|
|
length);
|
2011-12-16 14:31:37 +00:00
|
|
|
|
|
|
|
|
// Verify
|
2014-07-08 12:10:51 +00:00
|
|
|
webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length);
|
2013-05-29 12:12:51 +00:00
|
|
|
webrtc::RTPHeader rtp_header;
|
2011-12-16 14:31:37 +00:00
|
|
|
|
|
|
|
|
RtpHeaderExtensionMap map;
|
2013-05-16 11:10:31 +00:00
|
|
|
map.Register(kRtpExtensionTransmissionTimeOffset,
|
|
|
|
|
kTransmissionTimeOffsetExtensionId);
|
2015-12-28 10:18:46 -08:00
|
|
|
const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map);
|
2011-12-16 14:31:37 +00:00
|
|
|
|
|
|
|
|
ASSERT_TRUE(valid_rtp_header);
|
2012-06-28 07:53:15 +00:00
|
|
|
ASSERT_FALSE(rtp_parser.RTCP());
|
2011-12-16 14:31:37 +00:00
|
|
|
VerifyRTPHeaderCommon(rtp_header);
|
2013-05-29 12:12:51 +00:00
|
|
|
EXPECT_EQ(length, rtp_header.headerLength);
|
2014-03-06 23:49:08 +00:00
|
|
|
EXPECT_TRUE(rtp_header.extension.hasTransmissionTimeOffset);
|
2011-12-16 14:31:37 +00:00
|
|
|
EXPECT_EQ(kTimeOffset, rtp_header.extension.transmissionTimeOffset);
|
|
|
|
|
|
|
|
|
|
// Parse without map extension
|
2013-05-29 12:12:51 +00:00
|
|
|
webrtc::RTPHeader rtp_header2;
|
2015-12-28 10:18:46 -08:00
|
|
|
const bool valid_rtp_header2 = rtp_parser.Parse(&rtp_header2, nullptr);
|
2011-12-16 14:31:37 +00:00
|
|
|
|
|
|
|
|
ASSERT_TRUE(valid_rtp_header2);
|
|
|
|
|
VerifyRTPHeaderCommon(rtp_header2);
|
2013-05-29 12:12:51 +00:00
|
|
|
EXPECT_EQ(length, rtp_header2.headerLength);
|
2014-03-06 23:49:08 +00:00
|
|
|
EXPECT_FALSE(rtp_header2.extension.hasTransmissionTimeOffset);
|
2011-12-16 14:31:37 +00:00
|
|
|
EXPECT_EQ(0, rtp_header2.extension.transmissionTimeOffset);
|
|
|
|
|
}
|
2012-01-16 11:06:31 +00:00
|
|
|
|
2015-10-08 11:44:14 +02:00
|
|
|
TEST_F(RtpSenderTestWithoutPacer,
|
|
|
|
|
BuildRTPPacketWithNegativeTransmissionOffsetExtension) {
|
2012-06-28 07:53:15 +00:00
|
|
|
const int kNegTimeOffset = -500;
|
|
|
|
|
EXPECT_EQ(0, rtp_sender_->SetTransmissionTimeOffset(kNegTimeOffset));
|
2013-05-16 11:10:31 +00:00
|
|
|
EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
|
2015-12-10 02:39:40 -08:00
|
|
|
kRtpExtensionTransmissionTimeOffset,
|
|
|
|
|
kTransmissionTimeOffsetExtensionId));
|
2012-06-28 07:53:15 +00:00
|
|
|
|
Use size_t more consistently for packet/payload lengths.
See design doc at https://docs.google.com/a/chromium.org/document/d/1I6nmE9D_BmCY-IoV6MDPY2V6WYpEI-dg2apWXTfZyUI/edit?usp=sharing for more information.
This CL was reviewed and approved in pieces in the following CLs:
https://webrtc-codereview.appspot.com/24209004/
https://webrtc-codereview.appspot.com/24229004/
https://webrtc-codereview.appspot.com/24259004/
https://webrtc-codereview.appspot.com/25109004/
https://webrtc-codereview.appspot.com/26099004/
https://webrtc-codereview.appspot.com/27069004/
https://webrtc-codereview.appspot.com/27969004/
https://webrtc-codereview.appspot.com/27989004/
https://webrtc-codereview.appspot.com/29009004/
https://webrtc-codereview.appspot.com/30929004/
https://webrtc-codereview.appspot.com/30939004/
https://webrtc-codereview.appspot.com/31999004/
Committing as TBR to the original reviewers.
BUG=chromium:81439
TEST=none
TBR=pthatcher,henrik.lundin,tina.legrand,stefan,tkchin,glaznev,kjellander,perkj,mflodman,henrika,asapersson,niklas.enbom
Review URL: https://webrtc-codereview.appspot.com/23129004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7726 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-11-20 22:28:14 +00:00
|
|
|
size_t length = static_cast<size_t>(rtp_sender_->BuildRTPheader(
|
|
|
|
|
packet_, kPayload, kMarkerBit, kTimestamp, 0));
|
|
|
|
|
ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionTotalLength(),
|
|
|
|
|
length);
|
2012-06-28 07:53:15 +00:00
|
|
|
|
|
|
|
|
// Verify
|
2014-07-08 12:10:51 +00:00
|
|
|
webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length);
|
2013-05-29 12:12:51 +00:00
|
|
|
webrtc::RTPHeader rtp_header;
|
2012-06-28 07:53:15 +00:00
|
|
|
|
|
|
|
|
RtpHeaderExtensionMap map;
|
2013-05-16 11:10:31 +00:00
|
|
|
map.Register(kRtpExtensionTransmissionTimeOffset,
|
|
|
|
|
kTransmissionTimeOffsetExtensionId);
|
2015-12-28 10:18:46 -08:00
|
|
|
const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map);
|
2012-06-28 07:53:15 +00:00
|
|
|
|
|
|
|
|
ASSERT_TRUE(valid_rtp_header);
|
|
|
|
|
ASSERT_FALSE(rtp_parser.RTCP());
|
|
|
|
|
VerifyRTPHeaderCommon(rtp_header);
|
2013-05-29 12:12:51 +00:00
|
|
|
EXPECT_EQ(length, rtp_header.headerLength);
|
2014-03-06 23:49:08 +00:00
|
|
|
EXPECT_TRUE(rtp_header.extension.hasTransmissionTimeOffset);
|
2012-06-28 07:53:15 +00:00
|
|
|
EXPECT_EQ(kNegTimeOffset, rtp_header.extension.transmissionTimeOffset);
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-08 11:44:14 +02:00
|
|
|
TEST_F(RtpSenderTestWithoutPacer, BuildRTPPacketWithAbsoluteSendTimeExtension) {
|
2013-05-16 11:10:31 +00:00
|
|
|
EXPECT_EQ(0, rtp_sender_->SetAbsoluteSendTime(kAbsoluteSendTime));
|
2015-12-10 02:39:40 -08:00
|
|
|
EXPECT_EQ(
|
|
|
|
|
0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
|
|
|
|
|
kAbsoluteSendTimeExtensionId));
|
2013-05-16 11:10:31 +00:00
|
|
|
|
Use size_t more consistently for packet/payload lengths.
See design doc at https://docs.google.com/a/chromium.org/document/d/1I6nmE9D_BmCY-IoV6MDPY2V6WYpEI-dg2apWXTfZyUI/edit?usp=sharing for more information.
This CL was reviewed and approved in pieces in the following CLs:
https://webrtc-codereview.appspot.com/24209004/
https://webrtc-codereview.appspot.com/24229004/
https://webrtc-codereview.appspot.com/24259004/
https://webrtc-codereview.appspot.com/25109004/
https://webrtc-codereview.appspot.com/26099004/
https://webrtc-codereview.appspot.com/27069004/
https://webrtc-codereview.appspot.com/27969004/
https://webrtc-codereview.appspot.com/27989004/
https://webrtc-codereview.appspot.com/29009004/
https://webrtc-codereview.appspot.com/30929004/
https://webrtc-codereview.appspot.com/30939004/
https://webrtc-codereview.appspot.com/31999004/
Committing as TBR to the original reviewers.
BUG=chromium:81439
TEST=none
TBR=pthatcher,henrik.lundin,tina.legrand,stefan,tkchin,glaznev,kjellander,perkj,mflodman,henrika,asapersson,niklas.enbom
Review URL: https://webrtc-codereview.appspot.com/23129004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7726 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-11-20 22:28:14 +00:00
|
|
|
size_t length = static_cast<size_t>(rtp_sender_->BuildRTPheader(
|
|
|
|
|
packet_, kPayload, kMarkerBit, kTimestamp, 0));
|
|
|
|
|
ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionTotalLength(),
|
|
|
|
|
length);
|
2013-05-16 11:10:31 +00:00
|
|
|
|
|
|
|
|
// Verify
|
2014-07-08 12:10:51 +00:00
|
|
|
webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length);
|
2013-05-29 12:12:51 +00:00
|
|
|
webrtc::RTPHeader rtp_header;
|
2013-05-16 11:10:31 +00:00
|
|
|
|
|
|
|
|
RtpHeaderExtensionMap map;
|
|
|
|
|
map.Register(kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId);
|
2015-12-28 10:18:46 -08:00
|
|
|
const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map);
|
2013-05-16 11:10:31 +00:00
|
|
|
|
|
|
|
|
ASSERT_TRUE(valid_rtp_header);
|
|
|
|
|
ASSERT_FALSE(rtp_parser.RTCP());
|
|
|
|
|
VerifyRTPHeaderCommon(rtp_header);
|
2013-05-29 12:12:51 +00:00
|
|
|
EXPECT_EQ(length, rtp_header.headerLength);
|
2014-03-06 23:49:08 +00:00
|
|
|
EXPECT_TRUE(rtp_header.extension.hasAbsoluteSendTime);
|
2013-05-16 11:10:31 +00:00
|
|
|
EXPECT_EQ(kAbsoluteSendTime, rtp_header.extension.absoluteSendTime);
|
|
|
|
|
|
|
|
|
|
// Parse without map extension
|
2013-05-29 12:12:51 +00:00
|
|
|
webrtc::RTPHeader rtp_header2;
|
2015-12-28 10:18:46 -08:00
|
|
|
const bool valid_rtp_header2 = rtp_parser.Parse(&rtp_header2, nullptr);
|
2013-05-16 11:10:31 +00:00
|
|
|
|
|
|
|
|
ASSERT_TRUE(valid_rtp_header2);
|
|
|
|
|
VerifyRTPHeaderCommon(rtp_header2);
|
2013-05-29 12:12:51 +00:00
|
|
|
EXPECT_EQ(length, rtp_header2.headerLength);
|
2014-03-06 23:49:08 +00:00
|
|
|
EXPECT_FALSE(rtp_header2.extension.hasAbsoluteSendTime);
|
2013-05-16 11:10:31 +00:00
|
|
|
EXPECT_EQ(0u, rtp_header2.extension.absoluteSendTime);
|
|
|
|
|
}
|
|
|
|
|
|
2016-01-27 12:58:51 +01:00
|
|
|
TEST_F(RtpSenderTestWithoutPacer, SendsPacketsWithTransportSequenceNumber) {
|
|
|
|
|
// Ignore rtc event calls.
|
|
|
|
|
EXPECT_CALL(mock_rtc_event_log_,
|
|
|
|
|
LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _));
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
|
|
|
|
|
kRtpExtensionTransportSequenceNumber,
|
|
|
|
|
kTransportSequenceNumberExtensionId));
|
|
|
|
|
|
|
|
|
|
EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
|
|
|
|
|
.WillOnce(testing::Return(kTransportSequenceNumber));
|
2016-05-02 23:44:01 -07:00
|
|
|
EXPECT_CALL(send_packet_observer_,
|
|
|
|
|
OnSendPacket(kTransportSequenceNumber, _, _))
|
|
|
|
|
.Times(1);
|
|
|
|
|
|
|
|
|
|
SendGenericPayload();
|
2016-01-27 12:58:51 +01:00
|
|
|
|
|
|
|
|
RtpUtility::RtpHeaderParser rtp_parser(transport_.last_sent_packet_,
|
|
|
|
|
transport_.last_sent_packet_len_);
|
|
|
|
|
webrtc::RTPHeader rtp_header;
|
|
|
|
|
RtpHeaderExtensionMap map;
|
|
|
|
|
map.Register(kRtpExtensionTransportSequenceNumber,
|
|
|
|
|
kTransportSequenceNumberExtensionId);
|
|
|
|
|
EXPECT_TRUE(rtp_parser.Parse(&rtp_header, &map));
|
|
|
|
|
EXPECT_TRUE(rtp_header.extension.hasTransportSequenceNumber);
|
|
|
|
|
EXPECT_EQ(kTransportSequenceNumber,
|
|
|
|
|
rtp_header.extension.transportSequenceNumber);
|
|
|
|
|
EXPECT_EQ(transport_.last_packet_id_,
|
|
|
|
|
rtp_header.extension.transportSequenceNumber);
|
|
|
|
|
}
|
|
|
|
|
|
2016-05-02 23:44:01 -07:00
|
|
|
TEST_F(RtpSenderTestWithoutPacer, OnSendPacketUpdated) {
|
|
|
|
|
EXPECT_CALL(mock_rtc_event_log_, // Ignore rtc event calls.
|
|
|
|
|
LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _));
|
|
|
|
|
|
|
|
|
|
EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
|
|
|
|
|
.WillOnce(testing::Return(kTransportSequenceNumber));
|
|
|
|
|
EXPECT_CALL(send_packet_observer_,
|
|
|
|
|
OnSendPacket(kTransportSequenceNumber, _, _))
|
|
|
|
|
.Times(1);
|
|
|
|
|
|
|
|
|
|
SendGenericPayload();
|
|
|
|
|
}
|
|
|
|
|
|
2015-03-04 22:55:15 +00:00
|
|
|
// Test CVO header extension is only set when marker bit is true.
|
2015-10-08 11:44:14 +02:00
|
|
|
TEST_F(RtpSenderTestWithoutPacer, BuildRTPPacketWithVideoRotation_MarkerBit) {
|
2015-03-04 22:55:15 +00:00
|
|
|
rtp_sender_->SetVideoRotation(kRotation);
|
|
|
|
|
EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
|
|
|
|
|
kRtpExtensionVideoRotation, kVideoRotationExtensionId));
|
2015-04-01 15:33:06 -07:00
|
|
|
EXPECT_TRUE(rtp_sender_->ActivateCVORtpHeaderExtension());
|
2015-03-04 22:55:15 +00:00
|
|
|
|
|
|
|
|
RtpHeaderExtensionMap map;
|
|
|
|
|
map.Register(kRtpExtensionVideoRotation, kVideoRotationExtensionId);
|
|
|
|
|
|
|
|
|
|
size_t length = static_cast<size_t>(
|
|
|
|
|
rtp_sender_->BuildRTPheader(packet_, kPayload, true, kTimestamp, 0));
|
|
|
|
|
ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionTotalLength(),
|
|
|
|
|
length);
|
|
|
|
|
|
|
|
|
|
// Verify
|
|
|
|
|
webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length);
|
|
|
|
|
webrtc::RTPHeader rtp_header;
|
|
|
|
|
|
2015-12-28 10:18:46 -08:00
|
|
|
ASSERT_TRUE(rtp_parser.Parse(&rtp_header, &map));
|
2015-03-04 22:55:15 +00:00
|
|
|
ASSERT_FALSE(rtp_parser.RTCP());
|
|
|
|
|
VerifyRTPHeaderCommon(rtp_header);
|
|
|
|
|
EXPECT_EQ(length, rtp_header.headerLength);
|
|
|
|
|
EXPECT_TRUE(rtp_header.extension.hasVideoRotation);
|
2015-03-12 20:50:57 +00:00
|
|
|
EXPECT_EQ(ConvertVideoRotationToCVOByte(kRotation),
|
2015-03-04 22:55:15 +00:00
|
|
|
rtp_header.extension.videoRotation);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Test CVO header extension is not set when marker bit is false.
|
2015-10-08 11:44:14 +02:00
|
|
|
TEST_F(RtpSenderTestWithoutPacer,
|
|
|
|
|
DISABLED_BuildRTPPacketWithVideoRotation_NoMarkerBit) {
|
2015-03-04 22:55:15 +00:00
|
|
|
rtp_sender_->SetVideoRotation(kRotation);
|
|
|
|
|
EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
|
|
|
|
|
kRtpExtensionVideoRotation, kVideoRotationExtensionId));
|
2015-04-01 15:33:06 -07:00
|
|
|
EXPECT_TRUE(rtp_sender_->ActivateCVORtpHeaderExtension());
|
2015-03-04 22:55:15 +00:00
|
|
|
|
|
|
|
|
RtpHeaderExtensionMap map;
|
|
|
|
|
map.Register(kRtpExtensionVideoRotation, kVideoRotationExtensionId);
|
|
|
|
|
|
|
|
|
|
size_t length = static_cast<size_t>(
|
|
|
|
|
rtp_sender_->BuildRTPheader(packet_, kPayload, false, kTimestamp, 0));
|
|
|
|
|
ASSERT_EQ(kRtpHeaderSize, length);
|
|
|
|
|
|
|
|
|
|
// Verify
|
|
|
|
|
webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length);
|
|
|
|
|
webrtc::RTPHeader rtp_header;
|
|
|
|
|
|
2015-12-28 10:18:46 -08:00
|
|
|
ASSERT_TRUE(rtp_parser.Parse(&rtp_header, &map));
|
2015-03-04 22:55:15 +00:00
|
|
|
ASSERT_FALSE(rtp_parser.RTCP());
|
|
|
|
|
VerifyRTPHeaderCommon(rtp_header, false);
|
|
|
|
|
EXPECT_EQ(length, rtp_header.headerLength);
|
|
|
|
|
EXPECT_FALSE(rtp_header.extension.hasVideoRotation);
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-08 11:44:14 +02:00
|
|
|
TEST_F(RtpSenderTestWithoutPacer, BuildRTPPacketWithAudioLevelExtension) {
|
2015-12-10 02:39:40 -08:00
|
|
|
EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAudioLevel,
|
|
|
|
|
kAudioLevelExtensionId));
|
2014-03-06 23:49:08 +00:00
|
|
|
|
Use size_t more consistently for packet/payload lengths.
See design doc at https://docs.google.com/a/chromium.org/document/d/1I6nmE9D_BmCY-IoV6MDPY2V6WYpEI-dg2apWXTfZyUI/edit?usp=sharing for more information.
This CL was reviewed and approved in pieces in the following CLs:
https://webrtc-codereview.appspot.com/24209004/
https://webrtc-codereview.appspot.com/24229004/
https://webrtc-codereview.appspot.com/24259004/
https://webrtc-codereview.appspot.com/25109004/
https://webrtc-codereview.appspot.com/26099004/
https://webrtc-codereview.appspot.com/27069004/
https://webrtc-codereview.appspot.com/27969004/
https://webrtc-codereview.appspot.com/27989004/
https://webrtc-codereview.appspot.com/29009004/
https://webrtc-codereview.appspot.com/30929004/
https://webrtc-codereview.appspot.com/30939004/
https://webrtc-codereview.appspot.com/31999004/
Committing as TBR to the original reviewers.
BUG=chromium:81439
TEST=none
TBR=pthatcher,henrik.lundin,tina.legrand,stefan,tkchin,glaznev,kjellander,perkj,mflodman,henrika,asapersson,niklas.enbom
Review URL: https://webrtc-codereview.appspot.com/23129004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7726 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-11-20 22:28:14 +00:00
|
|
|
size_t length = static_cast<size_t>(rtp_sender_->BuildRTPheader(
|
|
|
|
|
packet_, kPayload, kMarkerBit, kTimestamp, 0));
|
|
|
|
|
ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionTotalLength(),
|
|
|
|
|
length);
|
2014-03-06 23:49:08 +00:00
|
|
|
|
|
|
|
|
// Verify
|
2014-07-08 12:10:51 +00:00
|
|
|
webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length);
|
2014-03-06 23:49:08 +00:00
|
|
|
webrtc::RTPHeader rtp_header;
|
|
|
|
|
|
|
|
|
|
// Updating audio level is done in RTPSenderAudio, so simulate it here.
|
2015-12-28 10:18:46 -08:00
|
|
|
rtp_parser.Parse(&rtp_header);
|
2014-03-06 23:49:08 +00:00
|
|
|
rtp_sender_->UpdateAudioLevel(packet_, length, rtp_header, true, kAudioLevel);
|
|
|
|
|
|
|
|
|
|
RtpHeaderExtensionMap map;
|
|
|
|
|
map.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
|
2015-12-28 10:18:46 -08:00
|
|
|
const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map);
|
2014-03-06 23:49:08 +00:00
|
|
|
|
|
|
|
|
ASSERT_TRUE(valid_rtp_header);
|
|
|
|
|
ASSERT_FALSE(rtp_parser.RTCP());
|
|
|
|
|
VerifyRTPHeaderCommon(rtp_header);
|
|
|
|
|
EXPECT_EQ(length, rtp_header.headerLength);
|
|
|
|
|
EXPECT_TRUE(rtp_header.extension.hasAudioLevel);
|
2015-08-10 15:08:36 +02:00
|
|
|
EXPECT_TRUE(rtp_header.extension.voiceActivity);
|
|
|
|
|
EXPECT_EQ(kAudioLevel, rtp_header.extension.audioLevel);
|
2014-03-06 23:49:08 +00:00
|
|
|
|
|
|
|
|
// Parse without map extension
|
|
|
|
|
webrtc::RTPHeader rtp_header2;
|
2015-12-28 10:18:46 -08:00
|
|
|
const bool valid_rtp_header2 = rtp_parser.Parse(&rtp_header2, nullptr);
|
2014-03-06 23:49:08 +00:00
|
|
|
|
|
|
|
|
ASSERT_TRUE(valid_rtp_header2);
|
|
|
|
|
VerifyRTPHeaderCommon(rtp_header2);
|
|
|
|
|
EXPECT_EQ(length, rtp_header2.headerLength);
|
|
|
|
|
EXPECT_FALSE(rtp_header2.extension.hasAudioLevel);
|
2015-08-10 15:08:36 +02:00
|
|
|
EXPECT_FALSE(rtp_header2.extension.voiceActivity);
|
2014-03-06 23:49:08 +00:00
|
|
|
EXPECT_EQ(0u, rtp_header2.extension.audioLevel);
|
|
|
|
|
}
|
|
|
|
|
|
2016-01-14 14:55:19 -08:00
|
|
|
TEST_F(RtpSenderTestWithoutPacer,
|
|
|
|
|
BuildRTPPacketWithCSRCAndAudioLevelExtension) {
|
|
|
|
|
EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAudioLevel,
|
|
|
|
|
kAudioLevelExtensionId));
|
|
|
|
|
std::vector<uint32_t> csrcs;
|
|
|
|
|
csrcs.push_back(0x23456789);
|
|
|
|
|
rtp_sender_->SetCsrcs(csrcs);
|
|
|
|
|
size_t length = static_cast<size_t>(rtp_sender_->BuildRTPheader(
|
|
|
|
|
packet_, kPayload, kMarkerBit, kTimestamp, 0));
|
|
|
|
|
|
|
|
|
|
// Verify
|
|
|
|
|
webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length);
|
|
|
|
|
webrtc::RTPHeader rtp_header;
|
|
|
|
|
|
|
|
|
|
// Updating audio level is done in RTPSenderAudio, so simulate it here.
|
|
|
|
|
rtp_parser.Parse(&rtp_header);
|
|
|
|
|
EXPECT_TRUE(rtp_sender_->UpdateAudioLevel(packet_, length, rtp_header, true,
|
|
|
|
|
kAudioLevel));
|
|
|
|
|
|
|
|
|
|
RtpHeaderExtensionMap map;
|
|
|
|
|
map.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
|
|
|
|
|
const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map);
|
|
|
|
|
|
|
|
|
|
ASSERT_TRUE(valid_rtp_header);
|
|
|
|
|
ASSERT_FALSE(rtp_parser.RTCP());
|
|
|
|
|
VerifyRTPHeaderCommon(rtp_header, kMarkerBit, csrcs.size());
|
|
|
|
|
EXPECT_EQ(length, rtp_header.headerLength);
|
|
|
|
|
EXPECT_TRUE(rtp_header.extension.hasAudioLevel);
|
|
|
|
|
EXPECT_TRUE(rtp_header.extension.voiceActivity);
|
|
|
|
|
EXPECT_EQ(kAudioLevel, rtp_header.extension.audioLevel);
|
|
|
|
|
EXPECT_EQ(1u, rtp_header.numCSRCs);
|
|
|
|
|
EXPECT_EQ(csrcs[0], rtp_header.arrOfCSRCs[0]);
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-08 11:44:14 +02:00
|
|
|
TEST_F(RtpSenderTestWithoutPacer, BuildRTPPacketWithHeaderExtensions) {
|
2013-05-16 11:10:31 +00:00
|
|
|
EXPECT_EQ(0, rtp_sender_->SetTransmissionTimeOffset(kTimeOffset));
|
|
|
|
|
EXPECT_EQ(0, rtp_sender_->SetAbsoluteSendTime(kAbsoluteSendTime));
|
2015-03-17 14:33:12 +00:00
|
|
|
EXPECT_EQ(0,
|
|
|
|
|
rtp_sender_->SetTransportSequenceNumber(kTransportSequenceNumber));
|
2013-05-16 11:10:31 +00:00
|
|
|
EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
|
2015-12-10 02:39:40 -08:00
|
|
|
kRtpExtensionTransmissionTimeOffset,
|
|
|
|
|
kTransmissionTimeOffsetExtensionId));
|
|
|
|
|
EXPECT_EQ(
|
|
|
|
|
0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
|
|
|
|
|
kAbsoluteSendTimeExtensionId));
|
|
|
|
|
EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAudioLevel,
|
|
|
|
|
kAudioLevelExtensionId));
|
2015-03-17 14:33:12 +00:00
|
|
|
EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
|
|
|
|
|
kRtpExtensionTransportSequenceNumber,
|
|
|
|
|
kTransportSequenceNumberExtensionId));
|
2013-05-16 11:10:31 +00:00
|
|
|
|
Use size_t more consistently for packet/payload lengths.
See design doc at https://docs.google.com/a/chromium.org/document/d/1I6nmE9D_BmCY-IoV6MDPY2V6WYpEI-dg2apWXTfZyUI/edit?usp=sharing for more information.
This CL was reviewed and approved in pieces in the following CLs:
https://webrtc-codereview.appspot.com/24209004/
https://webrtc-codereview.appspot.com/24229004/
https://webrtc-codereview.appspot.com/24259004/
https://webrtc-codereview.appspot.com/25109004/
https://webrtc-codereview.appspot.com/26099004/
https://webrtc-codereview.appspot.com/27069004/
https://webrtc-codereview.appspot.com/27969004/
https://webrtc-codereview.appspot.com/27989004/
https://webrtc-codereview.appspot.com/29009004/
https://webrtc-codereview.appspot.com/30929004/
https://webrtc-codereview.appspot.com/30939004/
https://webrtc-codereview.appspot.com/31999004/
Committing as TBR to the original reviewers.
BUG=chromium:81439
TEST=none
TBR=pthatcher,henrik.lundin,tina.legrand,stefan,tkchin,glaznev,kjellander,perkj,mflodman,henrika,asapersson,niklas.enbom
Review URL: https://webrtc-codereview.appspot.com/23129004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7726 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-11-20 22:28:14 +00:00
|
|
|
size_t length = static_cast<size_t>(rtp_sender_->BuildRTPheader(
|
|
|
|
|
packet_, kPayload, kMarkerBit, kTimestamp, 0));
|
|
|
|
|
ASSERT_EQ(kRtpHeaderSize + rtp_sender_->RtpHeaderExtensionTotalLength(),
|
|
|
|
|
length);
|
2013-05-16 11:10:31 +00:00
|
|
|
|
|
|
|
|
// Verify
|
2014-07-08 12:10:51 +00:00
|
|
|
webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet_, length);
|
2013-05-29 12:12:51 +00:00
|
|
|
webrtc::RTPHeader rtp_header;
|
2013-05-16 11:10:31 +00:00
|
|
|
|
2014-03-06 23:49:08 +00:00
|
|
|
// Updating audio level is done in RTPSenderAudio, so simulate it here.
|
2015-12-28 10:18:46 -08:00
|
|
|
rtp_parser.Parse(&rtp_header);
|
2014-03-06 23:49:08 +00:00
|
|
|
rtp_sender_->UpdateAudioLevel(packet_, length, rtp_header, true, kAudioLevel);
|
|
|
|
|
|
2013-05-16 11:10:31 +00:00
|
|
|
RtpHeaderExtensionMap map;
|
|
|
|
|
map.Register(kRtpExtensionTransmissionTimeOffset,
|
|
|
|
|
kTransmissionTimeOffsetExtensionId);
|
|
|
|
|
map.Register(kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId);
|
2014-03-06 23:49:08 +00:00
|
|
|
map.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
|
2015-03-17 14:33:12 +00:00
|
|
|
map.Register(kRtpExtensionTransportSequenceNumber,
|
|
|
|
|
kTransportSequenceNumberExtensionId);
|
2015-12-28 10:18:46 -08:00
|
|
|
const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map);
|
2013-05-16 11:10:31 +00:00
|
|
|
|
|
|
|
|
ASSERT_TRUE(valid_rtp_header);
|
|
|
|
|
ASSERT_FALSE(rtp_parser.RTCP());
|
|
|
|
|
VerifyRTPHeaderCommon(rtp_header);
|
2013-05-29 12:12:51 +00:00
|
|
|
EXPECT_EQ(length, rtp_header.headerLength);
|
2014-03-06 23:49:08 +00:00
|
|
|
EXPECT_TRUE(rtp_header.extension.hasTransmissionTimeOffset);
|
|
|
|
|
EXPECT_TRUE(rtp_header.extension.hasAbsoluteSendTime);
|
|
|
|
|
EXPECT_TRUE(rtp_header.extension.hasAudioLevel);
|
2015-03-17 14:33:12 +00:00
|
|
|
EXPECT_TRUE(rtp_header.extension.hasTransportSequenceNumber);
|
2013-05-16 11:10:31 +00:00
|
|
|
EXPECT_EQ(kTimeOffset, rtp_header.extension.transmissionTimeOffset);
|
|
|
|
|
EXPECT_EQ(kAbsoluteSendTime, rtp_header.extension.absoluteSendTime);
|
2015-08-10 15:08:36 +02:00
|
|
|
EXPECT_TRUE(rtp_header.extension.voiceActivity);
|
|
|
|
|
EXPECT_EQ(kAudioLevel, rtp_header.extension.audioLevel);
|
2015-03-17 14:33:12 +00:00
|
|
|
EXPECT_EQ(kTransportSequenceNumber,
|
|
|
|
|
rtp_header.extension.transportSequenceNumber);
|
2013-05-16 11:10:31 +00:00
|
|
|
|
|
|
|
|
// Parse without map extension
|
2013-05-29 12:12:51 +00:00
|
|
|
webrtc::RTPHeader rtp_header2;
|
2015-12-28 10:18:46 -08:00
|
|
|
const bool valid_rtp_header2 = rtp_parser.Parse(&rtp_header2, nullptr);
|
2013-05-16 11:10:31 +00:00
|
|
|
|
|
|
|
|
ASSERT_TRUE(valid_rtp_header2);
|
|
|
|
|
VerifyRTPHeaderCommon(rtp_header2);
|
2013-05-29 12:12:51 +00:00
|
|
|
EXPECT_EQ(length, rtp_header2.headerLength);
|
2014-03-06 23:49:08 +00:00
|
|
|
EXPECT_FALSE(rtp_header2.extension.hasTransmissionTimeOffset);
|
|
|
|
|
EXPECT_FALSE(rtp_header2.extension.hasAbsoluteSendTime);
|
|
|
|
|
EXPECT_FALSE(rtp_header2.extension.hasAudioLevel);
|
2015-03-17 14:33:12 +00:00
|
|
|
EXPECT_FALSE(rtp_header2.extension.hasTransportSequenceNumber);
|
|
|
|
|
|
2013-05-16 11:10:31 +00:00
|
|
|
EXPECT_EQ(0, rtp_header2.extension.transmissionTimeOffset);
|
|
|
|
|
EXPECT_EQ(0u, rtp_header2.extension.absoluteSendTime);
|
2015-08-10 15:08:36 +02:00
|
|
|
EXPECT_FALSE(rtp_header2.extension.voiceActivity);
|
2014-03-06 23:49:08 +00:00
|
|
|
EXPECT_EQ(0u, rtp_header2.extension.audioLevel);
|
2015-03-17 14:33:12 +00:00
|
|
|
EXPECT_EQ(0u, rtp_header2.extension.transportSequenceNumber);
|
2013-05-16 11:10:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(RtpSenderTest, TrafficSmoothingWithExtensions) {
|
2015-10-08 11:44:14 +02:00
|
|
|
EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority,
|
2016-01-14 14:37:39 -08:00
|
|
|
_, kSeqNum, _, _, _));
|
2016-01-21 05:42:04 -08:00
|
|
|
EXPECT_CALL(mock_rtc_event_log_,
|
|
|
|
|
LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _));
|
2013-04-27 00:41:08 +00:00
|
|
|
|
|
|
|
|
rtp_sender_->SetStorePacketsStatus(true, 10);
|
2013-05-16 11:10:31 +00:00
|
|
|
EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
|
2015-12-10 02:39:40 -08:00
|
|
|
kRtpExtensionTransmissionTimeOffset,
|
|
|
|
|
kTransmissionTimeOffsetExtensionId));
|
|
|
|
|
EXPECT_EQ(
|
|
|
|
|
0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
|
|
|
|
|
kAbsoluteSendTimeExtensionId));
|
2014-06-17 17:32:05 +00:00
|
|
|
rtp_sender_->SetTargetBitrate(300000);
|
2013-06-19 14:13:42 +00:00
|
|
|
int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
|
Use size_t more consistently for packet/payload lengths.
See design doc at https://docs.google.com/a/chromium.org/document/d/1I6nmE9D_BmCY-IoV6MDPY2V6WYpEI-dg2apWXTfZyUI/edit?usp=sharing for more information.
This CL was reviewed and approved in pieces in the following CLs:
https://webrtc-codereview.appspot.com/24209004/
https://webrtc-codereview.appspot.com/24229004/
https://webrtc-codereview.appspot.com/24259004/
https://webrtc-codereview.appspot.com/25109004/
https://webrtc-codereview.appspot.com/26099004/
https://webrtc-codereview.appspot.com/27069004/
https://webrtc-codereview.appspot.com/27969004/
https://webrtc-codereview.appspot.com/27989004/
https://webrtc-codereview.appspot.com/29009004/
https://webrtc-codereview.appspot.com/30929004/
https://webrtc-codereview.appspot.com/30939004/
https://webrtc-codereview.appspot.com/31999004/
Committing as TBR to the original reviewers.
BUG=chromium:81439
TEST=none
TBR=pthatcher,henrik.lundin,tina.legrand,stefan,tkchin,glaznev,kjellander,perkj,mflodman,henrika,asapersson,niklas.enbom
Review URL: https://webrtc-codereview.appspot.com/23129004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7726 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-11-20 22:28:14 +00:00
|
|
|
int rtp_length_int = rtp_sender_->BuildRTPheader(
|
|
|
|
|
packet_, kPayload, kMarkerBit, kTimestamp, capture_time_ms);
|
|
|
|
|
ASSERT_NE(-1, rtp_length_int);
|
|
|
|
|
size_t rtp_length = static_cast<size_t>(rtp_length_int);
|
2013-04-27 00:41:08 +00:00
|
|
|
|
|
|
|
|
// Packet should be stored in a send bucket.
|
2015-09-21 15:11:14 -07:00
|
|
|
EXPECT_EQ(0, rtp_sender_->SendToNetwork(packet_, 0, rtp_length,
|
|
|
|
|
capture_time_ms, kAllowRetransmission,
|
|
|
|
|
RtpPacketSender::kNormalPriority));
|
2013-04-27 00:41:08 +00:00
|
|
|
|
|
|
|
|
EXPECT_EQ(0, transport_.packets_sent_);
|
|
|
|
|
|
|
|
|
|
const int kStoredTimeInMs = 100;
|
|
|
|
|
fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
|
|
|
|
|
|
2013-11-13 15:29:21 +00:00
|
|
|
rtp_sender_->TimeToSendPacket(kSeqNum, capture_time_ms, false);
|
2013-04-27 00:41:08 +00:00
|
|
|
|
|
|
|
|
// Process send bucket. Packet should now be sent.
|
2012-01-16 11:06:31 +00:00
|
|
|
EXPECT_EQ(1, transport_.packets_sent_);
|
|
|
|
|
EXPECT_EQ(rtp_length, transport_.last_sent_packet_len_);
|
2013-04-27 00:41:08 +00:00
|
|
|
// Parse sent packet.
|
2014-07-08 12:10:51 +00:00
|
|
|
webrtc::RtpUtility::RtpHeaderParser rtp_parser(transport_.last_sent_packet_,
|
|
|
|
|
rtp_length);
|
2013-05-29 12:12:51 +00:00
|
|
|
webrtc::RTPHeader rtp_header;
|
2013-04-27 00:41:08 +00:00
|
|
|
RtpHeaderExtensionMap map;
|
2013-05-16 11:10:31 +00:00
|
|
|
map.Register(kRtpExtensionTransmissionTimeOffset,
|
|
|
|
|
kTransmissionTimeOffsetExtensionId);
|
|
|
|
|
map.Register(kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId);
|
2015-12-28 10:18:46 -08:00
|
|
|
const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map);
|
2013-04-27 00:41:08 +00:00
|
|
|
ASSERT_TRUE(valid_rtp_header);
|
|
|
|
|
|
|
|
|
|
// Verify transmission time offset.
|
|
|
|
|
EXPECT_EQ(kStoredTimeInMs * 90, rtp_header.extension.transmissionTimeOffset);
|
2013-05-16 11:10:31 +00:00
|
|
|
uint64_t expected_send_time =
|
2013-11-15 08:59:19 +00:00
|
|
|
ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds());
|
2013-05-16 11:10:31 +00:00
|
|
|
EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime);
|
2012-01-16 11:06:31 +00:00
|
|
|
}
|
|
|
|
|
|
2013-04-27 00:41:08 +00:00
|
|
|
TEST_F(RtpSenderTest, TrafficSmoothingRetransmits) {
|
2015-10-08 11:44:14 +02:00
|
|
|
EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority,
|
2016-01-14 14:37:39 -08:00
|
|
|
_, kSeqNum, _, _, _));
|
2016-01-21 05:42:04 -08:00
|
|
|
EXPECT_CALL(mock_rtc_event_log_,
|
|
|
|
|
LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _));
|
2013-04-27 00:41:08 +00:00
|
|
|
|
2012-11-07 17:01:04 +00:00
|
|
|
rtp_sender_->SetStorePacketsStatus(true, 10);
|
2013-05-16 11:10:31 +00:00
|
|
|
EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
|
2015-12-10 02:39:40 -08:00
|
|
|
kRtpExtensionTransmissionTimeOffset,
|
|
|
|
|
kTransmissionTimeOffsetExtensionId));
|
|
|
|
|
EXPECT_EQ(
|
|
|
|
|
0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
|
|
|
|
|
kAbsoluteSendTimeExtensionId));
|
2014-06-17 17:32:05 +00:00
|
|
|
rtp_sender_->SetTargetBitrate(300000);
|
2013-06-19 14:13:42 +00:00
|
|
|
int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
|
Use size_t more consistently for packet/payload lengths.
See design doc at https://docs.google.com/a/chromium.org/document/d/1I6nmE9D_BmCY-IoV6MDPY2V6WYpEI-dg2apWXTfZyUI/edit?usp=sharing for more information.
This CL was reviewed and approved in pieces in the following CLs:
https://webrtc-codereview.appspot.com/24209004/
https://webrtc-codereview.appspot.com/24229004/
https://webrtc-codereview.appspot.com/24259004/
https://webrtc-codereview.appspot.com/25109004/
https://webrtc-codereview.appspot.com/26099004/
https://webrtc-codereview.appspot.com/27069004/
https://webrtc-codereview.appspot.com/27969004/
https://webrtc-codereview.appspot.com/27989004/
https://webrtc-codereview.appspot.com/29009004/
https://webrtc-codereview.appspot.com/30929004/
https://webrtc-codereview.appspot.com/30939004/
https://webrtc-codereview.appspot.com/31999004/
Committing as TBR to the original reviewers.
BUG=chromium:81439
TEST=none
TBR=pthatcher,henrik.lundin,tina.legrand,stefan,tkchin,glaznev,kjellander,perkj,mflodman,henrika,asapersson,niklas.enbom
Review URL: https://webrtc-codereview.appspot.com/23129004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7726 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-11-20 22:28:14 +00:00
|
|
|
int rtp_length_int = rtp_sender_->BuildRTPheader(
|
|
|
|
|
packet_, kPayload, kMarkerBit, kTimestamp, capture_time_ms);
|
|
|
|
|
ASSERT_NE(-1, rtp_length_int);
|
|
|
|
|
size_t rtp_length = static_cast<size_t>(rtp_length_int);
|
2013-04-27 00:41:08 +00:00
|
|
|
|
2012-01-16 11:06:31 +00:00
|
|
|
// Packet should be stored in a send bucket.
|
2015-09-21 15:11:14 -07:00
|
|
|
EXPECT_EQ(0, rtp_sender_->SendToNetwork(packet_, 0, rtp_length,
|
|
|
|
|
capture_time_ms, kAllowRetransmission,
|
|
|
|
|
RtpPacketSender::kNormalPriority));
|
2013-04-27 00:41:08 +00:00
|
|
|
|
2012-01-16 11:06:31 +00:00
|
|
|
EXPECT_EQ(0, transport_.packets_sent_);
|
2013-04-27 00:41:08 +00:00
|
|
|
|
2016-01-14 14:37:39 -08:00
|
|
|
EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority,
|
|
|
|
|
_, kSeqNum, _, _, _));
|
2013-04-27 00:41:08 +00:00
|
|
|
|
2012-01-16 11:06:31 +00:00
|
|
|
const int kStoredTimeInMs = 100;
|
2013-01-21 07:42:11 +00:00
|
|
|
fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
|
2013-04-27 00:41:08 +00:00
|
|
|
|
Use size_t more consistently for packet/payload lengths.
See design doc at https://docs.google.com/a/chromium.org/document/d/1I6nmE9D_BmCY-IoV6MDPY2V6WYpEI-dg2apWXTfZyUI/edit?usp=sharing for more information.
This CL was reviewed and approved in pieces in the following CLs:
https://webrtc-codereview.appspot.com/24209004/
https://webrtc-codereview.appspot.com/24229004/
https://webrtc-codereview.appspot.com/24259004/
https://webrtc-codereview.appspot.com/25109004/
https://webrtc-codereview.appspot.com/26099004/
https://webrtc-codereview.appspot.com/27069004/
https://webrtc-codereview.appspot.com/27969004/
https://webrtc-codereview.appspot.com/27989004/
https://webrtc-codereview.appspot.com/29009004/
https://webrtc-codereview.appspot.com/30929004/
https://webrtc-codereview.appspot.com/30939004/
https://webrtc-codereview.appspot.com/31999004/
Committing as TBR to the original reviewers.
BUG=chromium:81439
TEST=none
TBR=pthatcher,henrik.lundin,tina.legrand,stefan,tkchin,glaznev,kjellander,perkj,mflodman,henrika,asapersson,niklas.enbom
Review URL: https://webrtc-codereview.appspot.com/23129004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7726 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-11-20 22:28:14 +00:00
|
|
|
EXPECT_EQ(rtp_length_int, rtp_sender_->ReSendPacket(kSeqNum));
|
2013-04-27 00:41:08 +00:00
|
|
|
EXPECT_EQ(0, transport_.packets_sent_);
|
|
|
|
|
|
2013-11-13 15:29:21 +00:00
|
|
|
rtp_sender_->TimeToSendPacket(kSeqNum, capture_time_ms, false);
|
2013-04-27 00:41:08 +00:00
|
|
|
|
2012-01-16 11:06:31 +00:00
|
|
|
// Process send bucket. Packet should now be sent.
|
|
|
|
|
EXPECT_EQ(1, transport_.packets_sent_);
|
|
|
|
|
EXPECT_EQ(rtp_length, transport_.last_sent_packet_len_);
|
2013-04-27 00:41:08 +00:00
|
|
|
|
2012-01-16 11:06:31 +00:00
|
|
|
// Parse sent packet.
|
2014-07-08 12:10:51 +00:00
|
|
|
webrtc::RtpUtility::RtpHeaderParser rtp_parser(transport_.last_sent_packet_,
|
|
|
|
|
rtp_length);
|
2013-05-29 12:12:51 +00:00
|
|
|
webrtc::RTPHeader rtp_header;
|
2012-01-16 11:06:31 +00:00
|
|
|
RtpHeaderExtensionMap map;
|
2013-05-16 11:10:31 +00:00
|
|
|
map.Register(kRtpExtensionTransmissionTimeOffset,
|
|
|
|
|
kTransmissionTimeOffsetExtensionId);
|
|
|
|
|
map.Register(kRtpExtensionAbsoluteSendTime, kAbsoluteSendTimeExtensionId);
|
2015-12-28 10:18:46 -08:00
|
|
|
const bool valid_rtp_header = rtp_parser.Parse(&rtp_header, &map);
|
2012-01-16 11:06:31 +00:00
|
|
|
ASSERT_TRUE(valid_rtp_header);
|
2013-04-27 00:41:08 +00:00
|
|
|
|
2012-01-16 11:06:31 +00:00
|
|
|
// Verify transmission time offset.
|
|
|
|
|
EXPECT_EQ(kStoredTimeInMs * 90, rtp_header.extension.transmissionTimeOffset);
|
2013-05-16 11:10:31 +00:00
|
|
|
uint64_t expected_send_time =
|
2013-11-15 08:59:19 +00:00
|
|
|
ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds());
|
|
|
|
|
EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// This test sends 1 regular video packet, then 4 padding packets, and then
|
|
|
|
|
// 1 more regular packet.
|
|
|
|
|
TEST_F(RtpSenderTest, SendPadding) {
|
|
|
|
|
// Make all (non-padding) packets go to send queue.
|
2016-01-14 14:37:39 -08:00
|
|
|
EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority,
|
|
|
|
|
_, kSeqNum, _, _, _));
|
2016-01-21 05:42:04 -08:00
|
|
|
EXPECT_CALL(mock_rtc_event_log_,
|
|
|
|
|
LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _))
|
|
|
|
|
.Times(1 + 4 + 1);
|
2013-11-15 08:59:19 +00:00
|
|
|
|
|
|
|
|
uint16_t seq_num = kSeqNum;
|
|
|
|
|
uint32_t timestamp = kTimestamp;
|
|
|
|
|
rtp_sender_->SetStorePacketsStatus(true, 10);
|
Use size_t more consistently for packet/payload lengths.
See design doc at https://docs.google.com/a/chromium.org/document/d/1I6nmE9D_BmCY-IoV6MDPY2V6WYpEI-dg2apWXTfZyUI/edit?usp=sharing for more information.
This CL was reviewed and approved in pieces in the following CLs:
https://webrtc-codereview.appspot.com/24209004/
https://webrtc-codereview.appspot.com/24229004/
https://webrtc-codereview.appspot.com/24259004/
https://webrtc-codereview.appspot.com/25109004/
https://webrtc-codereview.appspot.com/26099004/
https://webrtc-codereview.appspot.com/27069004/
https://webrtc-codereview.appspot.com/27969004/
https://webrtc-codereview.appspot.com/27989004/
https://webrtc-codereview.appspot.com/29009004/
https://webrtc-codereview.appspot.com/30929004/
https://webrtc-codereview.appspot.com/30939004/
https://webrtc-codereview.appspot.com/31999004/
Committing as TBR to the original reviewers.
BUG=chromium:81439
TEST=none
TBR=pthatcher,henrik.lundin,tina.legrand,stefan,tkchin,glaznev,kjellander,perkj,mflodman,henrika,asapersson,niklas.enbom
Review URL: https://webrtc-codereview.appspot.com/23129004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7726 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-11-20 22:28:14 +00:00
|
|
|
size_t rtp_header_len = kRtpHeaderSize;
|
2013-11-15 08:59:19 +00:00
|
|
|
EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
|
2015-12-10 02:39:40 -08:00
|
|
|
kRtpExtensionTransmissionTimeOffset,
|
|
|
|
|
kTransmissionTimeOffsetExtensionId));
|
2013-11-15 08:59:19 +00:00
|
|
|
rtp_header_len += 4; // 4 bytes extension.
|
2015-12-10 02:39:40 -08:00
|
|
|
EXPECT_EQ(
|
|
|
|
|
0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
|
|
|
|
|
kAbsoluteSendTimeExtensionId));
|
2013-11-15 08:59:19 +00:00
|
|
|
rtp_header_len += 4; // 4 bytes extension.
|
|
|
|
|
rtp_header_len += 4; // 4 extra bytes common to all extension headers.
|
|
|
|
|
|
|
|
|
|
// Create and set up parser.
|
2016-04-27 01:19:58 -07:00
|
|
|
std::unique_ptr<webrtc::RtpHeaderParser> rtp_parser(
|
2013-11-15 08:59:19 +00:00
|
|
|
webrtc::RtpHeaderParser::Create());
|
2015-08-03 04:38:41 -07:00
|
|
|
ASSERT_TRUE(rtp_parser.get() != nullptr);
|
2013-11-15 08:59:19 +00:00
|
|
|
rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset,
|
|
|
|
|
kTransmissionTimeOffsetExtensionId);
|
|
|
|
|
rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
|
|
|
|
|
kAbsoluteSendTimeExtensionId);
|
|
|
|
|
webrtc::RTPHeader rtp_header;
|
|
|
|
|
|
2014-06-17 17:32:05 +00:00
|
|
|
rtp_sender_->SetTargetBitrate(300000);
|
2013-11-15 08:59:19 +00:00
|
|
|
int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
|
Use size_t more consistently for packet/payload lengths.
See design doc at https://docs.google.com/a/chromium.org/document/d/1I6nmE9D_BmCY-IoV6MDPY2V6WYpEI-dg2apWXTfZyUI/edit?usp=sharing for more information.
This CL was reviewed and approved in pieces in the following CLs:
https://webrtc-codereview.appspot.com/24209004/
https://webrtc-codereview.appspot.com/24229004/
https://webrtc-codereview.appspot.com/24259004/
https://webrtc-codereview.appspot.com/25109004/
https://webrtc-codereview.appspot.com/26099004/
https://webrtc-codereview.appspot.com/27069004/
https://webrtc-codereview.appspot.com/27969004/
https://webrtc-codereview.appspot.com/27989004/
https://webrtc-codereview.appspot.com/29009004/
https://webrtc-codereview.appspot.com/30929004/
https://webrtc-codereview.appspot.com/30939004/
https://webrtc-codereview.appspot.com/31999004/
Committing as TBR to the original reviewers.
BUG=chromium:81439
TEST=none
TBR=pthatcher,henrik.lundin,tina.legrand,stefan,tkchin,glaznev,kjellander,perkj,mflodman,henrika,asapersson,niklas.enbom
Review URL: https://webrtc-codereview.appspot.com/23129004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7726 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-11-20 22:28:14 +00:00
|
|
|
int rtp_length_int = rtp_sender_->BuildRTPheader(
|
|
|
|
|
packet_, kPayload, kMarkerBit, timestamp, capture_time_ms);
|
2015-09-18 11:14:31 +02:00
|
|
|
const uint32_t media_packet_timestamp = timestamp;
|
Use size_t more consistently for packet/payload lengths.
See design doc at https://docs.google.com/a/chromium.org/document/d/1I6nmE9D_BmCY-IoV6MDPY2V6WYpEI-dg2apWXTfZyUI/edit?usp=sharing for more information.
This CL was reviewed and approved in pieces in the following CLs:
https://webrtc-codereview.appspot.com/24209004/
https://webrtc-codereview.appspot.com/24229004/
https://webrtc-codereview.appspot.com/24259004/
https://webrtc-codereview.appspot.com/25109004/
https://webrtc-codereview.appspot.com/26099004/
https://webrtc-codereview.appspot.com/27069004/
https://webrtc-codereview.appspot.com/27969004/
https://webrtc-codereview.appspot.com/27989004/
https://webrtc-codereview.appspot.com/29009004/
https://webrtc-codereview.appspot.com/30929004/
https://webrtc-codereview.appspot.com/30939004/
https://webrtc-codereview.appspot.com/31999004/
Committing as TBR to the original reviewers.
BUG=chromium:81439
TEST=none
TBR=pthatcher,henrik.lundin,tina.legrand,stefan,tkchin,glaznev,kjellander,perkj,mflodman,henrika,asapersson,niklas.enbom
Review URL: https://webrtc-codereview.appspot.com/23129004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7726 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-11-20 22:28:14 +00:00
|
|
|
ASSERT_NE(-1, rtp_length_int);
|
|
|
|
|
size_t rtp_length = static_cast<size_t>(rtp_length_int);
|
2013-11-15 08:59:19 +00:00
|
|
|
|
|
|
|
|
// Packet should be stored in a send bucket.
|
2015-09-21 15:11:14 -07:00
|
|
|
EXPECT_EQ(0, rtp_sender_->SendToNetwork(packet_, 0, rtp_length,
|
|
|
|
|
capture_time_ms, kAllowRetransmission,
|
|
|
|
|
RtpPacketSender::kNormalPriority));
|
2013-11-15 08:59:19 +00:00
|
|
|
|
|
|
|
|
int total_packets_sent = 0;
|
|
|
|
|
EXPECT_EQ(total_packets_sent, transport_.packets_sent_);
|
|
|
|
|
|
|
|
|
|
const int kStoredTimeInMs = 100;
|
|
|
|
|
fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
|
|
|
|
|
rtp_sender_->TimeToSendPacket(seq_num++, capture_time_ms, false);
|
|
|
|
|
// Packet should now be sent. This test doesn't verify the regular video
|
|
|
|
|
// packet, since it is tested in another test.
|
|
|
|
|
EXPECT_EQ(++total_packets_sent, transport_.packets_sent_);
|
|
|
|
|
timestamp += 90 * kStoredTimeInMs;
|
|
|
|
|
|
|
|
|
|
// Send padding 4 times, waiting 50 ms between each.
|
|
|
|
|
for (int i = 0; i < 4; ++i) {
|
|
|
|
|
const int kPaddingPeriodMs = 50;
|
Use size_t more consistently for packet/payload lengths.
See design doc at https://docs.google.com/a/chromium.org/document/d/1I6nmE9D_BmCY-IoV6MDPY2V6WYpEI-dg2apWXTfZyUI/edit?usp=sharing for more information.
This CL was reviewed and approved in pieces in the following CLs:
https://webrtc-codereview.appspot.com/24209004/
https://webrtc-codereview.appspot.com/24229004/
https://webrtc-codereview.appspot.com/24259004/
https://webrtc-codereview.appspot.com/25109004/
https://webrtc-codereview.appspot.com/26099004/
https://webrtc-codereview.appspot.com/27069004/
https://webrtc-codereview.appspot.com/27969004/
https://webrtc-codereview.appspot.com/27989004/
https://webrtc-codereview.appspot.com/29009004/
https://webrtc-codereview.appspot.com/30929004/
https://webrtc-codereview.appspot.com/30939004/
https://webrtc-codereview.appspot.com/31999004/
Committing as TBR to the original reviewers.
BUG=chromium:81439
TEST=none
TBR=pthatcher,henrik.lundin,tina.legrand,stefan,tkchin,glaznev,kjellander,perkj,mflodman,henrika,asapersson,niklas.enbom
Review URL: https://webrtc-codereview.appspot.com/23129004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7726 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-11-20 22:28:14 +00:00
|
|
|
const size_t kPaddingBytes = 100;
|
|
|
|
|
const size_t kMaxPaddingLength = 224; // Value taken from rtp_sender.cc.
|
2013-11-15 08:59:19 +00:00
|
|
|
// Padding will be forced to full packets.
|
|
|
|
|
EXPECT_EQ(kMaxPaddingLength, rtp_sender_->TimeToSendPadding(kPaddingBytes));
|
|
|
|
|
|
|
|
|
|
// Process send bucket. Padding should now be sent.
|
|
|
|
|
EXPECT_EQ(++total_packets_sent, transport_.packets_sent_);
|
|
|
|
|
EXPECT_EQ(kMaxPaddingLength + rtp_header_len,
|
|
|
|
|
transport_.last_sent_packet_len_);
|
|
|
|
|
// Parse sent packet.
|
2015-07-01 05:35:53 -07:00
|
|
|
ASSERT_TRUE(rtp_parser->Parse(transport_.last_sent_packet_,
|
|
|
|
|
transport_.last_sent_packet_len_,
|
2013-11-15 08:59:19 +00:00
|
|
|
&rtp_header));
|
2015-07-01 05:35:53 -07:00
|
|
|
EXPECT_EQ(kMaxPaddingLength, rtp_header.paddingLength);
|
2013-11-15 08:59:19 +00:00
|
|
|
|
2015-09-18 11:14:31 +02:00
|
|
|
// Verify sequence number and timestamp. The timestamp should be the same
|
|
|
|
|
// as the last media packet.
|
2013-11-15 08:59:19 +00:00
|
|
|
EXPECT_EQ(seq_num++, rtp_header.sequenceNumber);
|
2015-09-18 11:14:31 +02:00
|
|
|
EXPECT_EQ(media_packet_timestamp, rtp_header.timestamp);
|
2013-11-15 08:59:19 +00:00
|
|
|
// Verify transmission time offset.
|
2015-09-18 11:14:31 +02:00
|
|
|
int offset = timestamp - media_packet_timestamp;
|
|
|
|
|
EXPECT_EQ(offset, rtp_header.extension.transmissionTimeOffset);
|
2013-11-15 08:59:19 +00:00
|
|
|
uint64_t expected_send_time =
|
|
|
|
|
ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds());
|
|
|
|
|
EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime);
|
|
|
|
|
fake_clock_.AdvanceTimeMilliseconds(kPaddingPeriodMs);
|
|
|
|
|
timestamp += 90 * kPaddingPeriodMs;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Send a regular video packet again.
|
|
|
|
|
capture_time_ms = fake_clock_.TimeInMilliseconds();
|
2015-12-10 02:39:40 -08:00
|
|
|
rtp_length_int = rtp_sender_->BuildRTPheader(packet_, kPayload, kMarkerBit,
|
|
|
|
|
timestamp, capture_time_ms);
|
Use size_t more consistently for packet/payload lengths.
See design doc at https://docs.google.com/a/chromium.org/document/d/1I6nmE9D_BmCY-IoV6MDPY2V6WYpEI-dg2apWXTfZyUI/edit?usp=sharing for more information.
This CL was reviewed and approved in pieces in the following CLs:
https://webrtc-codereview.appspot.com/24209004/
https://webrtc-codereview.appspot.com/24229004/
https://webrtc-codereview.appspot.com/24259004/
https://webrtc-codereview.appspot.com/25109004/
https://webrtc-codereview.appspot.com/26099004/
https://webrtc-codereview.appspot.com/27069004/
https://webrtc-codereview.appspot.com/27969004/
https://webrtc-codereview.appspot.com/27989004/
https://webrtc-codereview.appspot.com/29009004/
https://webrtc-codereview.appspot.com/30929004/
https://webrtc-codereview.appspot.com/30939004/
https://webrtc-codereview.appspot.com/31999004/
Committing as TBR to the original reviewers.
BUG=chromium:81439
TEST=none
TBR=pthatcher,henrik.lundin,tina.legrand,stefan,tkchin,glaznev,kjellander,perkj,mflodman,henrika,asapersson,niklas.enbom
Review URL: https://webrtc-codereview.appspot.com/23129004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7726 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-11-20 22:28:14 +00:00
|
|
|
ASSERT_NE(-1, rtp_length_int);
|
|
|
|
|
rtp_length = static_cast<size_t>(rtp_length_int);
|
2013-11-15 08:59:19 +00:00
|
|
|
|
2016-01-14 14:37:39 -08:00
|
|
|
EXPECT_CALL(mock_paced_sender_,
|
|
|
|
|
InsertPacket(RtpPacketSender::kNormalPriority, _, _, _, _, _));
|
|
|
|
|
|
2013-11-15 08:59:19 +00:00
|
|
|
// Packet should be stored in a send bucket.
|
2015-09-21 15:11:14 -07:00
|
|
|
EXPECT_EQ(0, rtp_sender_->SendToNetwork(packet_, 0, rtp_length,
|
|
|
|
|
capture_time_ms, kAllowRetransmission,
|
|
|
|
|
RtpPacketSender::kNormalPriority));
|
2013-11-15 08:59:19 +00:00
|
|
|
|
|
|
|
|
rtp_sender_->TimeToSendPacket(seq_num, capture_time_ms, false);
|
|
|
|
|
// Process send bucket.
|
|
|
|
|
EXPECT_EQ(++total_packets_sent, transport_.packets_sent_);
|
|
|
|
|
EXPECT_EQ(rtp_length, transport_.last_sent_packet_len_);
|
|
|
|
|
// Parse sent packet.
|
2015-12-10 02:39:40 -08:00
|
|
|
ASSERT_TRUE(
|
|
|
|
|
rtp_parser->Parse(transport_.last_sent_packet_, rtp_length, &rtp_header));
|
2013-11-15 08:59:19 +00:00
|
|
|
|
|
|
|
|
// Verify sequence number and timestamp.
|
|
|
|
|
EXPECT_EQ(seq_num, rtp_header.sequenceNumber);
|
|
|
|
|
EXPECT_EQ(timestamp, rtp_header.timestamp);
|
|
|
|
|
// Verify transmission time offset. This packet is sent without delay.
|
|
|
|
|
EXPECT_EQ(0, rtp_header.extension.transmissionTimeOffset);
|
|
|
|
|
uint64_t expected_send_time =
|
|
|
|
|
ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds());
|
2013-05-16 11:10:31 +00:00
|
|
|
EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime);
|
2012-01-16 11:06:31 +00:00
|
|
|
}
|
2013-03-18 16:39:03 +00:00
|
|
|
|
2016-05-02 23:44:01 -07:00
|
|
|
TEST_F(RtpSenderTest, OnSendPacketUpdated) {
|
|
|
|
|
EXPECT_CALL(mock_rtc_event_log_, // Ignore rtc event calls.
|
|
|
|
|
LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _));
|
|
|
|
|
rtp_sender_->SetStorePacketsStatus(true, 10);
|
|
|
|
|
|
|
|
|
|
EXPECT_CALL(send_packet_observer_,
|
|
|
|
|
OnSendPacket(kTransportSequenceNumber, _, _))
|
|
|
|
|
.Times(1);
|
|
|
|
|
EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
|
|
|
|
|
.WillOnce(testing::Return(kTransportSequenceNumber));
|
|
|
|
|
EXPECT_CALL(mock_paced_sender_, InsertPacket(_, _, _, _, _, _)).Times(1);
|
|
|
|
|
|
|
|
|
|
SendGenericPayload(); // Packet passed to pacer.
|
|
|
|
|
const bool kIsRetransmit = false;
|
|
|
|
|
rtp_sender_->TimeToSendPacket(kSeqNum, fake_clock_.TimeInMilliseconds(),
|
|
|
|
|
kIsRetransmit);
|
|
|
|
|
EXPECT_EQ(1, transport_.packets_sent_);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(RtpSenderTest, OnSendPacketNotUpdatedForRetransmits) {
|
|
|
|
|
EXPECT_CALL(mock_rtc_event_log_, // Ignore rtc event calls.
|
|
|
|
|
LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _));
|
|
|
|
|
rtp_sender_->SetStorePacketsStatus(true, 10);
|
|
|
|
|
|
|
|
|
|
EXPECT_CALL(send_packet_observer_, OnSendPacket(_, _, _)).Times(0);
|
|
|
|
|
EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
|
|
|
|
|
.WillOnce(testing::Return(kTransportSequenceNumber));
|
|
|
|
|
EXPECT_CALL(mock_paced_sender_, InsertPacket(_, _, _, _, _, _)).Times(1);
|
|
|
|
|
|
|
|
|
|
SendGenericPayload(); // Packet passed to pacer.
|
|
|
|
|
const bool kIsRetransmit = true;
|
|
|
|
|
rtp_sender_->TimeToSendPacket(kSeqNum, fake_clock_.TimeInMilliseconds(),
|
|
|
|
|
kIsRetransmit);
|
|
|
|
|
EXPECT_EQ(1, transport_.packets_sent_);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(RtpSenderTest, OnSendPacketNotUpdatedWithoutSeqNumAllocator) {
|
|
|
|
|
rtp_sender_.reset(new RTPSender(
|
|
|
|
|
false, &fake_clock_, &transport_, &mock_paced_sender_,
|
|
|
|
|
nullptr /* TransportSequenceNumberAllocator */, nullptr, nullptr, nullptr,
|
|
|
|
|
nullptr, nullptr, &send_packet_observer_));
|
|
|
|
|
rtp_sender_->SetSequenceNumber(kSeqNum);
|
|
|
|
|
rtp_sender_->SetStorePacketsStatus(true, 10);
|
|
|
|
|
|
|
|
|
|
EXPECT_CALL(send_packet_observer_, OnSendPacket(_, _, _)).Times(0);
|
|
|
|
|
EXPECT_CALL(mock_paced_sender_, InsertPacket(_, _, _, _, _, _)).Times(1);
|
|
|
|
|
|
|
|
|
|
SendGenericPayload(); // Packet passed to pacer.
|
|
|
|
|
const bool kIsRetransmit = false;
|
|
|
|
|
rtp_sender_->TimeToSendPacket(kSeqNum, fake_clock_.TimeInMilliseconds(),
|
|
|
|
|
kIsRetransmit);
|
|
|
|
|
EXPECT_EQ(1, transport_.packets_sent_);
|
|
|
|
|
}
|
|
|
|
|
|
2013-12-04 10:24:26 +00:00
|
|
|
TEST_F(RtpSenderTest, SendRedundantPayloads) {
|
|
|
|
|
MockTransport transport;
|
2016-01-21 05:42:04 -08:00
|
|
|
rtp_sender_.reset(new RTPSender(
|
2016-05-02 23:44:01 -07:00
|
|
|
false, &fake_clock_, &transport, &mock_paced_sender_, nullptr, nullptr,
|
|
|
|
|
nullptr, nullptr, nullptr, &mock_rtc_event_log_, nullptr));
|
|
|
|
|
|
2013-12-04 10:24:26 +00:00
|
|
|
rtp_sender_->SetSequenceNumber(kSeqNum);
|
2015-04-21 20:24:50 +08:00
|
|
|
rtp_sender_->SetRtxPayloadType(kRtxPayload, kPayload);
|
2013-12-04 10:24:26 +00:00
|
|
|
|
|
|
|
|
uint16_t seq_num = kSeqNum;
|
|
|
|
|
rtp_sender_->SetStorePacketsStatus(true, 10);
|
2014-03-06 23:49:08 +00:00
|
|
|
int32_t rtp_header_len = kRtpHeaderSize;
|
2015-12-10 02:39:40 -08:00
|
|
|
EXPECT_EQ(
|
|
|
|
|
0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
|
|
|
|
|
kAbsoluteSendTimeExtensionId));
|
2013-12-04 10:24:26 +00:00
|
|
|
rtp_header_len += 4; // 4 bytes extension.
|
|
|
|
|
rtp_header_len += 4; // 4 extra bytes common to all extension headers.
|
|
|
|
|
|
2015-01-13 14:15:15 +00:00
|
|
|
rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
|
2014-06-05 08:25:29 +00:00
|
|
|
rtp_sender_->SetRtxSsrc(1234);
|
2013-12-04 10:24:26 +00:00
|
|
|
|
|
|
|
|
// Create and set up parser.
|
2016-04-27 01:19:58 -07:00
|
|
|
std::unique_ptr<webrtc::RtpHeaderParser> rtp_parser(
|
2013-12-04 10:24:26 +00:00
|
|
|
webrtc::RtpHeaderParser::Create());
|
2015-08-03 04:38:41 -07:00
|
|
|
ASSERT_TRUE(rtp_parser.get() != nullptr);
|
2013-12-04 10:24:26 +00:00
|
|
|
rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset,
|
|
|
|
|
kTransmissionTimeOffsetExtensionId);
|
|
|
|
|
rtp_parser->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
|
|
|
|
|
kAbsoluteSendTimeExtensionId);
|
2014-06-17 17:32:05 +00:00
|
|
|
rtp_sender_->SetTargetBitrate(300000);
|
2013-12-04 10:24:26 +00:00
|
|
|
const size_t kNumPayloadSizes = 10;
|
2015-12-10 02:39:40 -08:00
|
|
|
const size_t kPayloadSizes[kNumPayloadSizes] = {500, 550, 600, 650, 700,
|
|
|
|
|
750, 800, 850, 900, 950};
|
2016-01-14 14:37:39 -08:00
|
|
|
// Expect all packets go through the pacer.
|
|
|
|
|
EXPECT_CALL(mock_paced_sender_,
|
|
|
|
|
InsertPacket(RtpPacketSender::kNormalPriority, _, _, _, _, _))
|
|
|
|
|
.Times(kNumPayloadSizes);
|
2016-01-21 05:42:04 -08:00
|
|
|
EXPECT_CALL(mock_rtc_event_log_,
|
|
|
|
|
LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _))
|
|
|
|
|
.Times(kNumPayloadSizes);
|
|
|
|
|
|
2013-12-04 10:24:26 +00:00
|
|
|
// Send 10 packets of increasing size.
|
|
|
|
|
for (size_t i = 0; i < kNumPayloadSizes; ++i) {
|
|
|
|
|
int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
|
2015-10-02 03:39:33 -07:00
|
|
|
EXPECT_CALL(transport, SendRtp(_, _, _)).WillOnce(testing::Return(true));
|
2013-12-04 10:24:26 +00:00
|
|
|
SendPacket(capture_time_ms, kPayloadSizes[i]);
|
|
|
|
|
rtp_sender_->TimeToSendPacket(seq_num++, capture_time_ms, false);
|
|
|
|
|
fake_clock_.AdvanceTimeMilliseconds(33);
|
|
|
|
|
}
|
2016-01-21 05:42:04 -08:00
|
|
|
|
|
|
|
|
EXPECT_CALL(mock_rtc_event_log_,
|
|
|
|
|
LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _))
|
|
|
|
|
.Times(::testing::AtLeast(4));
|
|
|
|
|
|
2013-12-04 10:24:26 +00:00
|
|
|
// The amount of padding to send it too small to send a payload packet.
|
2015-10-02 03:39:33 -07:00
|
|
|
EXPECT_CALL(transport, SendRtp(_, kMaxPaddingSize + rtp_header_len, _))
|
2015-09-28 09:59:31 -07:00
|
|
|
.WillOnce(testing::Return(true));
|
Use size_t more consistently for packet/payload lengths.
See design doc at https://docs.google.com/a/chromium.org/document/d/1I6nmE9D_BmCY-IoV6MDPY2V6WYpEI-dg2apWXTfZyUI/edit?usp=sharing for more information.
This CL was reviewed and approved in pieces in the following CLs:
https://webrtc-codereview.appspot.com/24209004/
https://webrtc-codereview.appspot.com/24229004/
https://webrtc-codereview.appspot.com/24259004/
https://webrtc-codereview.appspot.com/25109004/
https://webrtc-codereview.appspot.com/26099004/
https://webrtc-codereview.appspot.com/27069004/
https://webrtc-codereview.appspot.com/27969004/
https://webrtc-codereview.appspot.com/27989004/
https://webrtc-codereview.appspot.com/29009004/
https://webrtc-codereview.appspot.com/30929004/
https://webrtc-codereview.appspot.com/30939004/
https://webrtc-codereview.appspot.com/31999004/
Committing as TBR to the original reviewers.
BUG=chromium:81439
TEST=none
TBR=pthatcher,henrik.lundin,tina.legrand,stefan,tkchin,glaznev,kjellander,perkj,mflodman,henrika,asapersson,niklas.enbom
Review URL: https://webrtc-codereview.appspot.com/23129004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7726 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-11-20 22:28:14 +00:00
|
|
|
EXPECT_EQ(kMaxPaddingSize, rtp_sender_->TimeToSendPadding(49));
|
2013-12-04 10:24:26 +00:00
|
|
|
|
2015-09-17 23:03:57 +02:00
|
|
|
EXPECT_CALL(transport,
|
2015-10-02 03:39:33 -07:00
|
|
|
SendRtp(_, kPayloadSizes[0] + rtp_header_len + kRtxHeaderSize, _))
|
2015-09-28 09:59:31 -07:00
|
|
|
.WillOnce(testing::Return(true));
|
Use size_t more consistently for packet/payload lengths.
See design doc at https://docs.google.com/a/chromium.org/document/d/1I6nmE9D_BmCY-IoV6MDPY2V6WYpEI-dg2apWXTfZyUI/edit?usp=sharing for more information.
This CL was reviewed and approved in pieces in the following CLs:
https://webrtc-codereview.appspot.com/24209004/
https://webrtc-codereview.appspot.com/24229004/
https://webrtc-codereview.appspot.com/24259004/
https://webrtc-codereview.appspot.com/25109004/
https://webrtc-codereview.appspot.com/26099004/
https://webrtc-codereview.appspot.com/27069004/
https://webrtc-codereview.appspot.com/27969004/
https://webrtc-codereview.appspot.com/27989004/
https://webrtc-codereview.appspot.com/29009004/
https://webrtc-codereview.appspot.com/30929004/
https://webrtc-codereview.appspot.com/30939004/
https://webrtc-codereview.appspot.com/31999004/
Committing as TBR to the original reviewers.
BUG=chromium:81439
TEST=none
TBR=pthatcher,henrik.lundin,tina.legrand,stefan,tkchin,glaznev,kjellander,perkj,mflodman,henrika,asapersson,niklas.enbom
Review URL: https://webrtc-codereview.appspot.com/23129004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7726 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-11-20 22:28:14 +00:00
|
|
|
EXPECT_EQ(kPayloadSizes[0], rtp_sender_->TimeToSendPadding(500));
|
2013-12-04 10:24:26 +00:00
|
|
|
|
2015-09-28 09:59:31 -07:00
|
|
|
EXPECT_CALL(transport, SendRtp(_, kPayloadSizes[kNumPayloadSizes - 1] +
|
2015-10-02 03:39:33 -07:00
|
|
|
rtp_header_len + kRtxHeaderSize,
|
|
|
|
|
_))
|
2015-09-28 09:59:31 -07:00
|
|
|
.WillOnce(testing::Return(true));
|
2015-10-02 03:39:33 -07:00
|
|
|
EXPECT_CALL(transport, SendRtp(_, kMaxPaddingSize + rtp_header_len, _))
|
2015-09-28 09:59:31 -07:00
|
|
|
.WillOnce(testing::Return(true));
|
2014-07-15 15:25:39 +00:00
|
|
|
EXPECT_EQ(kPayloadSizes[kNumPayloadSizes - 1] + kMaxPaddingSize,
|
Use size_t more consistently for packet/payload lengths.
See design doc at https://docs.google.com/a/chromium.org/document/d/1I6nmE9D_BmCY-IoV6MDPY2V6WYpEI-dg2apWXTfZyUI/edit?usp=sharing for more information.
This CL was reviewed and approved in pieces in the following CLs:
https://webrtc-codereview.appspot.com/24209004/
https://webrtc-codereview.appspot.com/24229004/
https://webrtc-codereview.appspot.com/24259004/
https://webrtc-codereview.appspot.com/25109004/
https://webrtc-codereview.appspot.com/26099004/
https://webrtc-codereview.appspot.com/27069004/
https://webrtc-codereview.appspot.com/27969004/
https://webrtc-codereview.appspot.com/27989004/
https://webrtc-codereview.appspot.com/29009004/
https://webrtc-codereview.appspot.com/30929004/
https://webrtc-codereview.appspot.com/30939004/
https://webrtc-codereview.appspot.com/31999004/
Committing as TBR to the original reviewers.
BUG=chromium:81439
TEST=none
TBR=pthatcher,henrik.lundin,tina.legrand,stefan,tkchin,glaznev,kjellander,perkj,mflodman,henrika,asapersson,niklas.enbom
Review URL: https://webrtc-codereview.appspot.com/23129004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7726 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-11-20 22:28:14 +00:00
|
|
|
rtp_sender_->TimeToSendPadding(999));
|
2013-12-04 10:24:26 +00:00
|
|
|
}
|
|
|
|
|
|
2015-10-08 11:44:14 +02:00
|
|
|
TEST_F(RtpSenderTestWithoutPacer, SendGenericVideo) {
|
2013-03-18 16:39:03 +00:00
|
|
|
char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC";
|
|
|
|
|
const uint8_t payload_type = 127;
|
|
|
|
|
ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000,
|
|
|
|
|
0, 1500));
|
|
|
|
|
uint8_t payload[] = {47, 11, 32, 93, 89};
|
|
|
|
|
|
|
|
|
|
// Send keyframe
|
2015-08-03 04:38:41 -07:00
|
|
|
ASSERT_EQ(
|
|
|
|
|
0, rtp_sender_->SendOutgoingData(kVideoFrameKey, payload_type, 1234, 4321,
|
|
|
|
|
payload, sizeof(payload), nullptr));
|
2013-03-18 16:39:03 +00:00
|
|
|
|
2014-07-08 12:10:51 +00:00
|
|
|
RtpUtility::RtpHeaderParser rtp_parser(transport_.last_sent_packet_,
|
|
|
|
|
transport_.last_sent_packet_len_);
|
2013-05-29 12:12:51 +00:00
|
|
|
webrtc::RTPHeader rtp_header;
|
2015-12-28 10:18:46 -08:00
|
|
|
ASSERT_TRUE(rtp_parser.Parse(&rtp_header));
|
2013-03-18 16:39:03 +00:00
|
|
|
|
2015-12-10 02:39:40 -08:00
|
|
|
const uint8_t* payload_data =
|
|
|
|
|
GetPayloadData(rtp_header, transport_.last_sent_packet_);
|
2013-03-18 16:39:03 +00:00
|
|
|
uint8_t generic_header = *payload_data++;
|
|
|
|
|
|
|
|
|
|
ASSERT_EQ(sizeof(payload) + sizeof(generic_header),
|
2013-09-06 13:40:11 +00:00
|
|
|
GetPayloadDataLength(rtp_header, transport_.last_sent_packet_len_));
|
2013-03-18 16:39:03 +00:00
|
|
|
|
|
|
|
|
EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kKeyFrameBit);
|
|
|
|
|
EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kFirstPacketBit);
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(0, memcmp(payload, payload_data, sizeof(payload)));
|
|
|
|
|
|
|
|
|
|
// Send delta frame
|
|
|
|
|
payload[0] = 13;
|
|
|
|
|
payload[1] = 42;
|
|
|
|
|
payload[4] = 13;
|
|
|
|
|
|
|
|
|
|
ASSERT_EQ(0, rtp_sender_->SendOutgoingData(kVideoFrameDelta, payload_type,
|
|
|
|
|
1234, 4321, payload,
|
2015-08-03 04:38:41 -07:00
|
|
|
sizeof(payload), nullptr));
|
2013-03-18 16:39:03 +00:00
|
|
|
|
2014-07-08 12:10:51 +00:00
|
|
|
RtpUtility::RtpHeaderParser rtp_parser2(transport_.last_sent_packet_,
|
|
|
|
|
transport_.last_sent_packet_len_);
|
2015-12-28 10:18:46 -08:00
|
|
|
ASSERT_TRUE(rtp_parser.Parse(&rtp_header));
|
2013-03-18 16:39:03 +00:00
|
|
|
|
2013-09-06 13:40:11 +00:00
|
|
|
payload_data = GetPayloadData(rtp_header, transport_.last_sent_packet_);
|
2013-03-18 16:39:03 +00:00
|
|
|
generic_header = *payload_data++;
|
|
|
|
|
|
|
|
|
|
EXPECT_FALSE(generic_header & RtpFormatVideoGeneric::kKeyFrameBit);
|
|
|
|
|
EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kFirstPacketBit);
|
|
|
|
|
|
|
|
|
|
ASSERT_EQ(sizeof(payload) + sizeof(generic_header),
|
2013-09-06 13:40:11 +00:00
|
|
|
GetPayloadDataLength(rtp_header, transport_.last_sent_packet_len_));
|
2013-03-18 16:39:03 +00:00
|
|
|
|
|
|
|
|
EXPECT_EQ(0, memcmp(payload, payload_data, sizeof(payload)));
|
|
|
|
|
}
|
|
|
|
|
|
2013-12-04 15:09:27 +00:00
|
|
|
TEST_F(RtpSenderTest, FrameCountCallbacks) {
|
|
|
|
|
class TestCallback : public FrameCountObserver {
|
|
|
|
|
public:
|
2014-12-18 13:50:16 +00:00
|
|
|
TestCallback() : FrameCountObserver(), num_calls_(0), ssrc_(0) {}
|
2013-12-04 15:09:27 +00:00
|
|
|
virtual ~TestCallback() {}
|
|
|
|
|
|
2015-03-04 12:58:35 +00:00
|
|
|
void FrameCountUpdated(const FrameCounts& frame_counts,
|
|
|
|
|
uint32_t ssrc) override {
|
2013-12-04 15:09:27 +00:00
|
|
|
++num_calls_;
|
|
|
|
|
ssrc_ = ssrc;
|
2014-12-18 13:50:16 +00:00
|
|
|
frame_counts_ = frame_counts;
|
2013-12-04 15:09:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint32_t num_calls_;
|
|
|
|
|
uint32_t ssrc_;
|
2014-12-18 13:50:16 +00:00
|
|
|
FrameCounts frame_counts_;
|
2013-12-04 15:09:27 +00:00
|
|
|
} callback;
|
|
|
|
|
|
2016-05-02 23:44:01 -07:00
|
|
|
rtp_sender_.reset(new RTPSender(
|
|
|
|
|
false, &fake_clock_, &transport_, &mock_paced_sender_, nullptr, nullptr,
|
|
|
|
|
nullptr, &callback, nullptr, nullptr, nullptr));
|
2014-07-10 09:39:23 +00:00
|
|
|
|
2013-12-04 15:09:27 +00:00
|
|
|
char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC";
|
|
|
|
|
const uint8_t payload_type = 127;
|
|
|
|
|
ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000,
|
|
|
|
|
0, 1500));
|
|
|
|
|
uint8_t payload[] = {47, 11, 32, 93, 89};
|
|
|
|
|
rtp_sender_->SetStorePacketsStatus(true, 1);
|
|
|
|
|
uint32_t ssrc = rtp_sender_->SSRC();
|
|
|
|
|
|
2016-01-14 14:37:39 -08:00
|
|
|
EXPECT_CALL(mock_paced_sender_, InsertPacket(_, _, _, _, _, _))
|
|
|
|
|
.Times(::testing::AtLeast(2));
|
|
|
|
|
|
2015-08-03 04:38:41 -07:00
|
|
|
ASSERT_EQ(
|
|
|
|
|
0, rtp_sender_->SendOutgoingData(kVideoFrameKey, payload_type, 1234, 4321,
|
|
|
|
|
payload, sizeof(payload), nullptr));
|
2013-12-04 15:09:27 +00:00
|
|
|
|
|
|
|
|
EXPECT_EQ(1U, callback.num_calls_);
|
|
|
|
|
EXPECT_EQ(ssrc, callback.ssrc_);
|
2014-12-18 13:50:16 +00:00
|
|
|
EXPECT_EQ(1, callback.frame_counts_.key_frames);
|
|
|
|
|
EXPECT_EQ(0, callback.frame_counts_.delta_frames);
|
2013-12-04 15:09:27 +00:00
|
|
|
|
2015-08-03 04:38:41 -07:00
|
|
|
ASSERT_EQ(0, rtp_sender_->SendOutgoingData(kVideoFrameDelta, payload_type,
|
|
|
|
|
1234, 4321, payload,
|
|
|
|
|
sizeof(payload), nullptr));
|
2013-12-04 15:09:27 +00:00
|
|
|
|
|
|
|
|
EXPECT_EQ(2U, callback.num_calls_);
|
|
|
|
|
EXPECT_EQ(ssrc, callback.ssrc_);
|
2014-12-18 13:50:16 +00:00
|
|
|
EXPECT_EQ(1, callback.frame_counts_.key_frames);
|
|
|
|
|
EXPECT_EQ(1, callback.frame_counts_.delta_frames);
|
2013-12-04 15:09:27 +00:00
|
|
|
|
2014-07-10 09:39:23 +00:00
|
|
|
rtp_sender_.reset();
|
2013-12-04 15:09:27 +00:00
|
|
|
}
|
|
|
|
|
|
2013-12-13 09:46:59 +00:00
|
|
|
TEST_F(RtpSenderTest, BitrateCallbacks) {
|
|
|
|
|
class TestCallback : public BitrateStatisticsObserver {
|
|
|
|
|
public:
|
2014-11-05 14:05:29 +00:00
|
|
|
TestCallback() : BitrateStatisticsObserver(), num_calls_(0), ssrc_(0) {}
|
2013-12-13 09:46:59 +00:00
|
|
|
virtual ~TestCallback() {}
|
|
|
|
|
|
2015-03-04 12:58:35 +00:00
|
|
|
void Notify(const BitrateStatistics& total_stats,
|
|
|
|
|
const BitrateStatistics& retransmit_stats,
|
|
|
|
|
uint32_t ssrc) override {
|
2013-12-13 09:46:59 +00:00
|
|
|
++num_calls_;
|
|
|
|
|
ssrc_ = ssrc;
|
2014-11-05 14:05:29 +00:00
|
|
|
total_stats_ = total_stats;
|
|
|
|
|
retransmit_stats_ = retransmit_stats;
|
2013-12-13 09:46:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint32_t num_calls_;
|
|
|
|
|
uint32_t ssrc_;
|
2014-11-05 14:05:29 +00:00
|
|
|
BitrateStatistics total_stats_;
|
|
|
|
|
BitrateStatistics retransmit_stats_;
|
2013-12-13 09:46:59 +00:00
|
|
|
} callback;
|
2016-05-02 23:44:01 -07:00
|
|
|
rtp_sender_.reset(new RTPSender(false, &fake_clock_, &transport_, nullptr,
|
|
|
|
|
nullptr, nullptr, &callback, nullptr, nullptr,
|
2016-01-21 05:42:04 -08:00
|
|
|
nullptr, nullptr));
|
2013-12-13 09:46:59 +00:00
|
|
|
|
|
|
|
|
// Simulate kNumPackets sent with kPacketInterval ms intervals.
|
|
|
|
|
const uint32_t kNumPackets = 15;
|
|
|
|
|
const uint32_t kPacketInterval = 20;
|
|
|
|
|
// Overhead = 12 bytes RTP header + 1 byte generic header.
|
|
|
|
|
const uint32_t kPacketOverhead = 13;
|
|
|
|
|
|
|
|
|
|
char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC";
|
|
|
|
|
const uint8_t payload_type = 127;
|
2015-12-10 02:39:40 -08:00
|
|
|
ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000,
|
|
|
|
|
0, 1500));
|
2013-12-13 09:46:59 +00:00
|
|
|
uint8_t payload[] = {47, 11, 32, 93, 89};
|
|
|
|
|
rtp_sender_->SetStorePacketsStatus(true, 1);
|
|
|
|
|
uint32_t ssrc = rtp_sender_->SSRC();
|
|
|
|
|
|
|
|
|
|
// Initial process call so we get a new time window.
|
|
|
|
|
rtp_sender_->ProcessBitrate();
|
|
|
|
|
uint64_t start_time = fake_clock_.CurrentNtpInMilliseconds();
|
|
|
|
|
|
|
|
|
|
// Send a few frames.
|
|
|
|
|
for (uint32_t i = 0; i < kNumPackets; ++i) {
|
|
|
|
|
ASSERT_EQ(0,
|
2015-12-10 02:39:40 -08:00
|
|
|
rtp_sender_->SendOutgoingData(kVideoFrameKey, payload_type, 1234,
|
|
|
|
|
4321, payload, sizeof(payload), 0));
|
2013-12-13 09:46:59 +00:00
|
|
|
fake_clock_.AdvanceTimeMilliseconds(kPacketInterval);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
rtp_sender_->ProcessBitrate();
|
|
|
|
|
|
|
|
|
|
const uint32_t expected_packet_rate = 1000 / kPacketInterval;
|
|
|
|
|
|
2014-11-05 14:05:29 +00:00
|
|
|
// We get one call for every stats updated, thus two calls since both the
|
|
|
|
|
// stream stats and the retransmit stats are updated once.
|
|
|
|
|
EXPECT_EQ(2u, callback.num_calls_);
|
2013-12-13 09:46:59 +00:00
|
|
|
EXPECT_EQ(ssrc, callback.ssrc_);
|
|
|
|
|
EXPECT_EQ(start_time + (kNumPackets * kPacketInterval),
|
2014-11-05 14:05:29 +00:00
|
|
|
callback.total_stats_.timestamp_ms);
|
|
|
|
|
EXPECT_EQ(expected_packet_rate, callback.total_stats_.packet_rate);
|
2013-12-13 09:46:59 +00:00
|
|
|
EXPECT_EQ((kPacketOverhead + sizeof(payload)) * 8 * expected_packet_rate,
|
2014-11-05 14:05:29 +00:00
|
|
|
callback.total_stats_.bitrate_bps);
|
2013-12-13 09:46:59 +00:00
|
|
|
|
2014-07-08 14:32:58 +00:00
|
|
|
rtp_sender_.reset();
|
2013-12-13 09:46:59 +00:00
|
|
|
}
|
|
|
|
|
|
2013-05-20 20:55:07 +00:00
|
|
|
class RtpSenderAudioTest : public RtpSenderTest {
|
|
|
|
|
protected:
|
|
|
|
|
RtpSenderAudioTest() {}
|
|
|
|
|
|
2015-03-04 12:58:35 +00:00
|
|
|
void SetUp() override {
|
2013-05-20 20:55:07 +00:00
|
|
|
payload_ = kAudioPayload;
|
2016-05-02 23:44:01 -07:00
|
|
|
rtp_sender_.reset(new RTPSender(true, &fake_clock_, &transport_, nullptr,
|
2015-10-08 11:44:14 +02:00
|
|
|
nullptr, nullptr, nullptr, nullptr, nullptr,
|
2016-01-21 05:42:04 -08:00
|
|
|
nullptr, nullptr));
|
2013-05-20 20:55:07 +00:00
|
|
|
rtp_sender_->SetSequenceNumber(kSeqNum);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
2015-10-08 11:44:14 +02:00
|
|
|
TEST_F(RtpSenderTestWithoutPacer, StreamDataCountersCallbacks) {
|
2013-12-05 14:29:02 +00:00
|
|
|
class TestCallback : public StreamDataCountersCallback {
|
|
|
|
|
public:
|
2015-12-10 02:39:40 -08:00
|
|
|
TestCallback() : StreamDataCountersCallback(), ssrc_(0), counters_() {}
|
2013-12-05 14:29:02 +00:00
|
|
|
virtual ~TestCallback() {}
|
|
|
|
|
|
2015-03-04 12:58:35 +00:00
|
|
|
void DataCountersUpdated(const StreamDataCounters& counters,
|
|
|
|
|
uint32_t ssrc) override {
|
2013-12-05 14:29:02 +00:00
|
|
|
ssrc_ = ssrc;
|
|
|
|
|
counters_ = counters;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint32_t ssrc_;
|
|
|
|
|
StreamDataCounters counters_;
|
2015-02-04 08:34:47 +00:00
|
|
|
|
|
|
|
|
void MatchPacketCounter(const RtpPacketCounter& expected,
|
|
|
|
|
const RtpPacketCounter& actual) {
|
|
|
|
|
EXPECT_EQ(expected.payload_bytes, actual.payload_bytes);
|
|
|
|
|
EXPECT_EQ(expected.header_bytes, actual.header_bytes);
|
|
|
|
|
EXPECT_EQ(expected.padding_bytes, actual.padding_bytes);
|
|
|
|
|
EXPECT_EQ(expected.packets, actual.packets);
|
|
|
|
|
}
|
|
|
|
|
|
2014-12-09 09:47:53 +00:00
|
|
|
void Matches(uint32_t ssrc, const StreamDataCounters& counters) {
|
|
|
|
|
EXPECT_EQ(ssrc, ssrc_);
|
2015-02-04 08:34:47 +00:00
|
|
|
MatchPacketCounter(counters.transmitted, counters_.transmitted);
|
|
|
|
|
MatchPacketCounter(counters.retransmitted, counters_.retransmitted);
|
2015-01-22 09:39:59 +00:00
|
|
|
EXPECT_EQ(counters.fec.packets, counters_.fec.packets);
|
2013-12-05 14:29:02 +00:00
|
|
|
}
|
|
|
|
|
} callback;
|
|
|
|
|
|
|
|
|
|
const uint8_t kRedPayloadType = 96;
|
|
|
|
|
const uint8_t kUlpfecPayloadType = 97;
|
|
|
|
|
char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC";
|
|
|
|
|
const uint8_t payload_type = 127;
|
|
|
|
|
ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000,
|
|
|
|
|
0, 1500));
|
|
|
|
|
uint8_t payload[] = {47, 11, 32, 93, 89};
|
|
|
|
|
rtp_sender_->SetStorePacketsStatus(true, 1);
|
|
|
|
|
uint32_t ssrc = rtp_sender_->SSRC();
|
|
|
|
|
|
|
|
|
|
rtp_sender_->RegisterRtpStatisticsCallback(&callback);
|
|
|
|
|
|
|
|
|
|
// Send a frame.
|
2015-08-03 04:38:41 -07:00
|
|
|
ASSERT_EQ(
|
|
|
|
|
0, rtp_sender_->SendOutgoingData(kVideoFrameKey, payload_type, 1234, 4321,
|
|
|
|
|
payload, sizeof(payload), nullptr));
|
2014-12-09 09:47:53 +00:00
|
|
|
StreamDataCounters expected;
|
2015-01-22 09:39:59 +00:00
|
|
|
expected.transmitted.payload_bytes = 6;
|
|
|
|
|
expected.transmitted.header_bytes = 12;
|
|
|
|
|
expected.transmitted.padding_bytes = 0;
|
|
|
|
|
expected.transmitted.packets = 1;
|
|
|
|
|
expected.retransmitted.payload_bytes = 0;
|
|
|
|
|
expected.retransmitted.header_bytes = 0;
|
|
|
|
|
expected.retransmitted.padding_bytes = 0;
|
|
|
|
|
expected.retransmitted.packets = 0;
|
|
|
|
|
expected.fec.packets = 0;
|
2014-12-09 09:47:53 +00:00
|
|
|
callback.Matches(ssrc, expected);
|
2013-12-05 14:29:02 +00:00
|
|
|
|
|
|
|
|
// Retransmit a frame.
|
|
|
|
|
uint16_t seqno = rtp_sender_->SequenceNumber() - 1;
|
|
|
|
|
rtp_sender_->ReSendPacket(seqno, 0);
|
2015-01-22 09:39:59 +00:00
|
|
|
expected.transmitted.payload_bytes = 12;
|
|
|
|
|
expected.transmitted.header_bytes = 24;
|
|
|
|
|
expected.transmitted.packets = 2;
|
|
|
|
|
expected.retransmitted.payload_bytes = 6;
|
|
|
|
|
expected.retransmitted.header_bytes = 12;
|
|
|
|
|
expected.retransmitted.padding_bytes = 0;
|
|
|
|
|
expected.retransmitted.packets = 1;
|
2014-12-09 09:47:53 +00:00
|
|
|
callback.Matches(ssrc, expected);
|
2013-12-05 14:29:02 +00:00
|
|
|
|
|
|
|
|
// Send padding.
|
|
|
|
|
rtp_sender_->TimeToSendPadding(kMaxPaddingSize);
|
2015-01-22 09:39:59 +00:00
|
|
|
expected.transmitted.payload_bytes = 12;
|
|
|
|
|
expected.transmitted.header_bytes = 36;
|
|
|
|
|
expected.transmitted.padding_bytes = kMaxPaddingSize;
|
|
|
|
|
expected.transmitted.packets = 3;
|
2014-12-09 09:47:53 +00:00
|
|
|
callback.Matches(ssrc, expected);
|
2013-12-05 14:29:02 +00:00
|
|
|
|
|
|
|
|
// Send FEC.
|
|
|
|
|
rtp_sender_->SetGenericFECStatus(true, kRedPayloadType, kUlpfecPayloadType);
|
|
|
|
|
FecProtectionParams fec_params;
|
|
|
|
|
fec_params.fec_mask_type = kFecMaskRandom;
|
|
|
|
|
fec_params.fec_rate = 1;
|
|
|
|
|
fec_params.max_fec_frames = 1;
|
|
|
|
|
rtp_sender_->SetFecParameters(&fec_params, &fec_params);
|
|
|
|
|
ASSERT_EQ(0, rtp_sender_->SendOutgoingData(kVideoFrameDelta, payload_type,
|
|
|
|
|
1234, 4321, payload,
|
2015-08-03 04:38:41 -07:00
|
|
|
sizeof(payload), nullptr));
|
2015-01-22 09:39:59 +00:00
|
|
|
expected.transmitted.payload_bytes = 40;
|
|
|
|
|
expected.transmitted.header_bytes = 60;
|
|
|
|
|
expected.transmitted.packets = 5;
|
|
|
|
|
expected.fec.packets = 1;
|
2014-12-09 09:47:53 +00:00
|
|
|
callback.Matches(ssrc, expected);
|
2013-12-05 14:29:02 +00:00
|
|
|
|
2015-08-03 04:38:41 -07:00
|
|
|
rtp_sender_->RegisterRtpStatisticsCallback(nullptr);
|
2013-12-05 14:29:02 +00:00
|
|
|
}
|
|
|
|
|
|
2013-05-20 20:55:07 +00:00
|
|
|
TEST_F(RtpSenderAudioTest, SendAudio) {
|
|
|
|
|
char payload_name[RTP_PAYLOAD_NAME_SIZE] = "PAYLOAD_NAME";
|
|
|
|
|
const uint8_t payload_type = 127;
|
|
|
|
|
ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 48000,
|
|
|
|
|
0, 1500));
|
|
|
|
|
uint8_t payload[] = {47, 11, 32, 93, 89};
|
|
|
|
|
|
2015-08-03 04:38:41 -07:00
|
|
|
ASSERT_EQ(
|
|
|
|
|
0, rtp_sender_->SendOutgoingData(kAudioFrameCN, payload_type, 1234, 4321,
|
|
|
|
|
payload, sizeof(payload), nullptr));
|
2013-05-20 20:55:07 +00:00
|
|
|
|
2014-07-08 12:10:51 +00:00
|
|
|
RtpUtility::RtpHeaderParser rtp_parser(transport_.last_sent_packet_,
|
|
|
|
|
transport_.last_sent_packet_len_);
|
2013-05-29 12:12:51 +00:00
|
|
|
webrtc::RTPHeader rtp_header;
|
2015-12-28 10:18:46 -08:00
|
|
|
ASSERT_TRUE(rtp_parser.Parse(&rtp_header));
|
2013-05-20 20:55:07 +00:00
|
|
|
|
2015-12-10 02:39:40 -08:00
|
|
|
const uint8_t* payload_data =
|
|
|
|
|
GetPayloadData(rtp_header, transport_.last_sent_packet_);
|
2013-05-20 20:55:07 +00:00
|
|
|
|
Use size_t more consistently for packet/payload lengths.
See design doc at https://docs.google.com/a/chromium.org/document/d/1I6nmE9D_BmCY-IoV6MDPY2V6WYpEI-dg2apWXTfZyUI/edit?usp=sharing for more information.
This CL was reviewed and approved in pieces in the following CLs:
https://webrtc-codereview.appspot.com/24209004/
https://webrtc-codereview.appspot.com/24229004/
https://webrtc-codereview.appspot.com/24259004/
https://webrtc-codereview.appspot.com/25109004/
https://webrtc-codereview.appspot.com/26099004/
https://webrtc-codereview.appspot.com/27069004/
https://webrtc-codereview.appspot.com/27969004/
https://webrtc-codereview.appspot.com/27989004/
https://webrtc-codereview.appspot.com/29009004/
https://webrtc-codereview.appspot.com/30929004/
https://webrtc-codereview.appspot.com/30939004/
https://webrtc-codereview.appspot.com/31999004/
Committing as TBR to the original reviewers.
BUG=chromium:81439
TEST=none
TBR=pthatcher,henrik.lundin,tina.legrand,stefan,tkchin,glaznev,kjellander,perkj,mflodman,henrika,asapersson,niklas.enbom
Review URL: https://webrtc-codereview.appspot.com/23129004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7726 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-11-20 22:28:14 +00:00
|
|
|
ASSERT_EQ(sizeof(payload),
|
|
|
|
|
GetPayloadDataLength(rtp_header, transport_.last_sent_packet_len_));
|
2013-05-20 20:55:07 +00:00
|
|
|
|
|
|
|
|
EXPECT_EQ(0, memcmp(payload, payload_data, sizeof(payload)));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(RtpSenderAudioTest, SendAudioWithAudioLevelExtension) {
|
|
|
|
|
EXPECT_EQ(0, rtp_sender_->SetAudioLevel(kAudioLevel));
|
2015-12-10 02:39:40 -08:00
|
|
|
EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAudioLevel,
|
|
|
|
|
kAudioLevelExtensionId));
|
2013-05-20 20:55:07 +00:00
|
|
|
|
|
|
|
|
char payload_name[RTP_PAYLOAD_NAME_SIZE] = "PAYLOAD_NAME";
|
|
|
|
|
const uint8_t payload_type = 127;
|
|
|
|
|
ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 48000,
|
|
|
|
|
0, 1500));
|
|
|
|
|
uint8_t payload[] = {47, 11, 32, 93, 89};
|
|
|
|
|
|
2015-08-03 04:38:41 -07:00
|
|
|
ASSERT_EQ(
|
|
|
|
|
0, rtp_sender_->SendOutgoingData(kAudioFrameCN, payload_type, 1234, 4321,
|
|
|
|
|
payload, sizeof(payload), nullptr));
|
2013-05-20 20:55:07 +00:00
|
|
|
|
2014-07-08 12:10:51 +00:00
|
|
|
RtpUtility::RtpHeaderParser rtp_parser(transport_.last_sent_packet_,
|
|
|
|
|
transport_.last_sent_packet_len_);
|
2013-05-29 12:12:51 +00:00
|
|
|
webrtc::RTPHeader rtp_header;
|
2015-12-28 10:18:46 -08:00
|
|
|
ASSERT_TRUE(rtp_parser.Parse(&rtp_header));
|
2013-05-20 20:55:07 +00:00
|
|
|
|
2015-12-10 02:39:40 -08:00
|
|
|
const uint8_t* payload_data =
|
|
|
|
|
GetPayloadData(rtp_header, transport_.last_sent_packet_);
|
2013-05-20 20:55:07 +00:00
|
|
|
|
Use size_t more consistently for packet/payload lengths.
See design doc at https://docs.google.com/a/chromium.org/document/d/1I6nmE9D_BmCY-IoV6MDPY2V6WYpEI-dg2apWXTfZyUI/edit?usp=sharing for more information.
This CL was reviewed and approved in pieces in the following CLs:
https://webrtc-codereview.appspot.com/24209004/
https://webrtc-codereview.appspot.com/24229004/
https://webrtc-codereview.appspot.com/24259004/
https://webrtc-codereview.appspot.com/25109004/
https://webrtc-codereview.appspot.com/26099004/
https://webrtc-codereview.appspot.com/27069004/
https://webrtc-codereview.appspot.com/27969004/
https://webrtc-codereview.appspot.com/27989004/
https://webrtc-codereview.appspot.com/29009004/
https://webrtc-codereview.appspot.com/30929004/
https://webrtc-codereview.appspot.com/30939004/
https://webrtc-codereview.appspot.com/31999004/
Committing as TBR to the original reviewers.
BUG=chromium:81439
TEST=none
TBR=pthatcher,henrik.lundin,tina.legrand,stefan,tkchin,glaznev,kjellander,perkj,mflodman,henrika,asapersson,niklas.enbom
Review URL: https://webrtc-codereview.appspot.com/23129004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@7726 4adac7df-926f-26a2-2b94-8c16560cd09d
2014-11-20 22:28:14 +00:00
|
|
|
ASSERT_EQ(sizeof(payload),
|
|
|
|
|
GetPayloadDataLength(rtp_header, transport_.last_sent_packet_len_));
|
2013-05-20 20:55:07 +00:00
|
|
|
|
|
|
|
|
EXPECT_EQ(0, memcmp(payload, payload_data, sizeof(payload)));
|
|
|
|
|
|
2015-12-10 02:39:40 -08:00
|
|
|
uint8_t extension[] = {
|
|
|
|
|
0xbe, 0xde, 0x00, 0x01,
|
|
|
|
|
(kAudioLevelExtensionId << 4) + 0, // ID + length.
|
|
|
|
|
kAudioLevel, // Data.
|
|
|
|
|
0x00, 0x00 // Padding.
|
|
|
|
|
};
|
2013-05-20 20:55:07 +00:00
|
|
|
|
|
|
|
|
EXPECT_EQ(0, memcmp(extension, payload_data - sizeof(extension),
|
|
|
|
|
sizeof(extension)));
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-03 11:46:54 +00:00
|
|
|
// As RFC4733, named telephone events are carried as part of the audio stream
|
|
|
|
|
// and must use the same sequence number and timestamp base as the regular
|
|
|
|
|
// audio channel.
|
|
|
|
|
// This test checks the marker bit for the first packet and the consequent
|
|
|
|
|
// packets of the same telephone event. Since it is specifically for DTMF
|
2015-10-19 02:39:06 -07:00
|
|
|
// events, ignoring audio packets and sending kEmptyFrame instead of those.
|
2014-09-03 11:46:54 +00:00
|
|
|
TEST_F(RtpSenderAudioTest, CheckMarkerBitForTelephoneEvents) {
|
|
|
|
|
char payload_name[RTP_PAYLOAD_NAME_SIZE] = "telephone-event";
|
|
|
|
|
uint8_t payload_type = 126;
|
2015-12-10 02:39:40 -08:00
|
|
|
ASSERT_EQ(0,
|
|
|
|
|
rtp_sender_->RegisterPayload(payload_name, payload_type, 0, 0, 0));
|
2014-09-03 11:46:54 +00:00
|
|
|
// For Telephone events, payload is not added to the registered payload list,
|
|
|
|
|
// it will register only the payload used for audio stream.
|
|
|
|
|
// Registering the payload again for audio stream with different payload name.
|
2015-12-15 02:54:47 -08:00
|
|
|
const char kPayloadName[] = "payload_name";
|
2015-12-10 02:39:40 -08:00
|
|
|
ASSERT_EQ(
|
2015-12-15 02:54:47 -08:00
|
|
|
0, rtp_sender_->RegisterPayload(kPayloadName, payload_type, 8000, 1, 0));
|
2014-09-03 11:46:54 +00:00
|
|
|
int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
|
|
|
|
|
// DTMF event key=9, duration=500 and attenuationdB=10
|
|
|
|
|
rtp_sender_->SendTelephoneEvent(9, 500, 10);
|
|
|
|
|
// During start, it takes the starting timestamp as last sent timestamp.
|
|
|
|
|
// The duration is calculated as the difference of current and last sent
|
|
|
|
|
// timestamp. So for first call it will skip since the duration is zero.
|
2015-10-19 02:39:06 -07:00
|
|
|
ASSERT_EQ(0, rtp_sender_->SendOutgoingData(kEmptyFrame, payload_type,
|
2015-08-03 04:38:41 -07:00
|
|
|
capture_time_ms, 0, nullptr, 0,
|
|
|
|
|
nullptr));
|
2014-09-03 11:46:54 +00:00
|
|
|
// DTMF Sample Length is (Frequency/1000) * Duration.
|
|
|
|
|
// So in this case, it is (8000/1000) * 500 = 4000.
|
|
|
|
|
// Sending it as two packets.
|
2015-10-19 02:39:06 -07:00
|
|
|
ASSERT_EQ(0, rtp_sender_->SendOutgoingData(kEmptyFrame, payload_type,
|
2015-08-03 04:38:41 -07:00
|
|
|
capture_time_ms + 2000, 0, nullptr,
|
|
|
|
|
0, nullptr));
|
2016-04-27 01:19:58 -07:00
|
|
|
std::unique_ptr<webrtc::RtpHeaderParser> rtp_parser(
|
2014-09-03 11:46:54 +00:00
|
|
|
webrtc::RtpHeaderParser::Create());
|
2015-08-03 04:38:41 -07:00
|
|
|
ASSERT_TRUE(rtp_parser.get() != nullptr);
|
2014-09-03 11:46:54 +00:00
|
|
|
webrtc::RTPHeader rtp_header;
|
|
|
|
|
ASSERT_TRUE(rtp_parser->Parse(transport_.last_sent_packet_,
|
2015-12-10 02:39:40 -08:00
|
|
|
transport_.last_sent_packet_len_, &rtp_header));
|
2014-09-03 11:46:54 +00:00
|
|
|
// Marker Bit should be set to 1 for first packet.
|
|
|
|
|
EXPECT_TRUE(rtp_header.markerBit);
|
|
|
|
|
|
2015-10-19 02:39:06 -07:00
|
|
|
ASSERT_EQ(0, rtp_sender_->SendOutgoingData(kEmptyFrame, payload_type,
|
2015-08-03 04:38:41 -07:00
|
|
|
capture_time_ms + 4000, 0, nullptr,
|
|
|
|
|
0, nullptr));
|
2014-09-03 11:46:54 +00:00
|
|
|
ASSERT_TRUE(rtp_parser->Parse(transport_.last_sent_packet_,
|
2015-12-10 02:39:40 -08:00
|
|
|
transport_.last_sent_packet_len_, &rtp_header));
|
2014-09-03 11:46:54 +00:00
|
|
|
// Marker Bit should be set to 0 for rest of the packets.
|
|
|
|
|
EXPECT_FALSE(rtp_header.markerBit);
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-08 11:44:14 +02:00
|
|
|
TEST_F(RtpSenderTestWithoutPacer, BytesReportedCorrectly) {
|
2014-07-10 16:24:54 +00:00
|
|
|
const char* kPayloadName = "GENERIC";
|
|
|
|
|
const uint8_t kPayloadType = 127;
|
|
|
|
|
rtp_sender_->SetSSRC(1234);
|
|
|
|
|
rtp_sender_->SetRtxSsrc(4321);
|
2015-04-21 20:24:50 +08:00
|
|
|
rtp_sender_->SetRtxPayloadType(kPayloadType - 1, kPayloadType);
|
2015-01-13 14:15:15 +00:00
|
|
|
rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
|
2014-07-10 16:24:54 +00:00
|
|
|
|
2015-12-10 02:39:40 -08:00
|
|
|
ASSERT_EQ(0, rtp_sender_->RegisterPayload(kPayloadName, kPayloadType, 90000,
|
|
|
|
|
0, 1500));
|
2014-07-10 16:24:54 +00:00
|
|
|
uint8_t payload[] = {47, 11, 32, 93, 89};
|
|
|
|
|
|
2015-12-10 02:39:40 -08:00
|
|
|
ASSERT_EQ(
|
|
|
|
|
0, rtp_sender_->SendOutgoingData(kVideoFrameKey, kPayloadType, 1234, 4321,
|
|
|
|
|
payload, sizeof(payload), 0));
|
2014-07-10 16:24:54 +00:00
|
|
|
|
2014-07-15 15:25:39 +00:00
|
|
|
// Will send 2 full-size padding packets.
|
|
|
|
|
rtp_sender_->TimeToSendPadding(1);
|
|
|
|
|
rtp_sender_->TimeToSendPadding(1);
|
|
|
|
|
|
|
|
|
|
StreamDataCounters rtp_stats;
|
|
|
|
|
StreamDataCounters rtx_stats;
|
|
|
|
|
rtp_sender_->GetDataCounters(&rtp_stats, &rtx_stats);
|
|
|
|
|
|
|
|
|
|
// Payload + 1-byte generic header.
|
2014-12-16 12:03:11 +00:00
|
|
|
EXPECT_GT(rtp_stats.first_packet_time_ms, -1);
|
2015-01-22 09:39:59 +00:00
|
|
|
EXPECT_EQ(rtp_stats.transmitted.payload_bytes, sizeof(payload) + 1);
|
|
|
|
|
EXPECT_EQ(rtp_stats.transmitted.header_bytes, 12u);
|
|
|
|
|
EXPECT_EQ(rtp_stats.transmitted.padding_bytes, 0u);
|
|
|
|
|
EXPECT_EQ(rtx_stats.transmitted.payload_bytes, 0u);
|
|
|
|
|
EXPECT_EQ(rtx_stats.transmitted.header_bytes, 24u);
|
|
|
|
|
EXPECT_EQ(rtx_stats.transmitted.padding_bytes, 2 * kMaxPaddingSize);
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(rtp_stats.transmitted.TotalBytes(),
|
2015-12-10 02:39:40 -08:00
|
|
|
rtp_stats.transmitted.payload_bytes +
|
|
|
|
|
rtp_stats.transmitted.header_bytes +
|
|
|
|
|
rtp_stats.transmitted.padding_bytes);
|
2015-01-22 09:39:59 +00:00
|
|
|
EXPECT_EQ(rtx_stats.transmitted.TotalBytes(),
|
2015-12-10 02:39:40 -08:00
|
|
|
rtx_stats.transmitted.payload_bytes +
|
|
|
|
|
rtx_stats.transmitted.header_bytes +
|
|
|
|
|
rtx_stats.transmitted.padding_bytes);
|
2014-12-09 09:47:53 +00:00
|
|
|
|
2015-12-10 02:39:40 -08:00
|
|
|
EXPECT_EQ(
|
|
|
|
|
transport_.total_bytes_sent_,
|
|
|
|
|
rtp_stats.transmitted.TotalBytes() + rtx_stats.transmitted.TotalBytes());
|
2014-07-10 16:24:54 +00:00
|
|
|
}
|
2015-03-04 22:55:15 +00:00
|
|
|
|
2015-10-08 11:44:14 +02:00
|
|
|
TEST_F(RtpSenderTestWithoutPacer, RespectsNackBitrateLimit) {
|
2015-09-29 09:48:22 -07:00
|
|
|
const int32_t kPacketSize = 1400;
|
|
|
|
|
const int32_t kNumPackets = 30;
|
|
|
|
|
|
|
|
|
|
rtp_sender_->SetStorePacketsStatus(true, kNumPackets);
|
|
|
|
|
// Set bitrate (in kbps) to fit kNumPackets á kPacketSize bytes in one second.
|
|
|
|
|
rtp_sender_->SetTargetBitrate(kNumPackets * kPacketSize * 8);
|
|
|
|
|
const uint16_t kStartSequenceNumber = rtp_sender_->SequenceNumber();
|
|
|
|
|
std::list<uint16_t> sequence_numbers;
|
|
|
|
|
for (int32_t i = 0; i < kNumPackets; ++i) {
|
|
|
|
|
sequence_numbers.push_back(kStartSequenceNumber + i);
|
|
|
|
|
fake_clock_.AdvanceTimeMilliseconds(1);
|
|
|
|
|
SendPacket(fake_clock_.TimeInMilliseconds(), kPacketSize);
|
|
|
|
|
}
|
|
|
|
|
EXPECT_EQ(kNumPackets, transport_.packets_sent_);
|
|
|
|
|
|
|
|
|
|
fake_clock_.AdvanceTimeMilliseconds(1000 - kNumPackets);
|
|
|
|
|
|
|
|
|
|
// Resending should work - brings the bandwidth up to the limit.
|
|
|
|
|
// NACK bitrate is capped to the same bitrate as the encoder, since the max
|
|
|
|
|
// protection overhead is 50% (see MediaOptimization::SetTargetRates).
|
|
|
|
|
rtp_sender_->OnReceivedNACK(sequence_numbers, 0);
|
|
|
|
|
EXPECT_EQ(kNumPackets * 2, transport_.packets_sent_);
|
|
|
|
|
|
|
|
|
|
// Resending should not work, bandwidth exceeded.
|
|
|
|
|
rtp_sender_->OnReceivedNACK(sequence_numbers, 0);
|
|
|
|
|
EXPECT_EQ(kNumPackets * 2, transport_.packets_sent_);
|
|
|
|
|
}
|
|
|
|
|
|
2015-04-01 15:33:06 -07:00
|
|
|
// Verify that all packets of a frame have CVO byte set.
|
2015-03-04 22:55:15 +00:00
|
|
|
TEST_F(RtpSenderVideoTest, SendVideoWithCVO) {
|
|
|
|
|
RTPVideoHeader hdr = {0};
|
|
|
|
|
hdr.rotation = kVideoRotation_90;
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
|
|
|
|
|
kRtpExtensionVideoRotation, kVideoRotationExtensionId));
|
2015-04-01 15:33:06 -07:00
|
|
|
EXPECT_TRUE(rtp_sender_->ActivateCVORtpHeaderExtension());
|
|
|
|
|
|
2015-03-17 14:33:12 +00:00
|
|
|
EXPECT_EQ(
|
|
|
|
|
RtpUtility::Word32Align(kRtpOneByteHeaderLength + kVideoRotationLength),
|
|
|
|
|
rtp_sender_->RtpHeaderExtensionTotalLength());
|
2015-03-04 22:55:15 +00:00
|
|
|
|
|
|
|
|
rtp_sender_video_->SendVideo(kRtpVideoGeneric, kVideoFrameKey, kPayload,
|
2015-08-03 04:38:41 -07:00
|
|
|
kTimestamp, 0, packet_, sizeof(packet_), nullptr,
|
2015-04-14 21:28:08 +02:00
|
|
|
&hdr);
|
2015-03-04 22:55:15 +00:00
|
|
|
|
|
|
|
|
RtpHeaderExtensionMap map;
|
|
|
|
|
map.Register(kRtpExtensionVideoRotation, kVideoRotationExtensionId);
|
|
|
|
|
|
2015-04-01 15:33:06 -07:00
|
|
|
// Verify that this packet does have CVO byte.
|
2015-03-04 22:55:15 +00:00
|
|
|
VerifyCVOPacket(
|
|
|
|
|
reinterpret_cast<uint8_t*>(transport_.sent_packets_[0]->data()),
|
2015-04-16 21:49:00 +02:00
|
|
|
transport_.sent_packets_[0]->size(), true, &map, kSeqNum, hdr.rotation);
|
2015-03-04 22:55:15 +00:00
|
|
|
|
2015-04-01 15:33:06 -07:00
|
|
|
// Verify that this packet does have CVO byte.
|
2015-03-04 22:55:15 +00:00
|
|
|
VerifyCVOPacket(
|
|
|
|
|
reinterpret_cast<uint8_t*>(transport_.sent_packets_[1]->data()),
|
2015-03-24 09:19:06 +00:00
|
|
|
transport_.sent_packets_[1]->size(), true, &map, kSeqNum + 1,
|
2015-03-04 22:55:15 +00:00
|
|
|
hdr.rotation);
|
|
|
|
|
}
|
2013-05-20 20:55:07 +00:00
|
|
|
} // namespace webrtc
|