Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6)

Side by Side Diff: webrtc/modules/rtp_rtcp/source/rtp_sender_unittest.cc

Issue 2999063002: Add flag enabling more packets to be retransmittable. (Closed)
Patch Set: Addressed comments Created 3 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #include <memory> 11 #include <memory>
12 #include <vector> 12 #include <vector>
13 13
14 #include "webrtc/api/video/video_timing.h" 14 #include "webrtc/api/video/video_timing.h"
15 #include "webrtc/logging/rtc_event_log/mock/mock_rtc_event_log.h" 15 #include "webrtc/logging/rtc_event_log/mock/mock_rtc_event_log.h"
16 #include "webrtc/modules/rtp_rtcp/include/rtp_cvo.h" 16 #include "webrtc/modules/rtp_rtcp/include/rtp_cvo.h"
17 #include "webrtc/modules/rtp_rtcp/include/rtp_header_extension_map.h" 17 #include "webrtc/modules/rtp_rtcp/include/rtp_header_extension_map.h"
18 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" 18 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
19 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" 19 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
20 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" 20 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
21 #include "webrtc/modules/rtp_rtcp/source/rtp_format_video_generic.h" 21 #include "webrtc/modules/rtp_rtcp/source/rtp_format_video_generic.h"
22 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h" 22 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h"
23 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h" 23 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h"
24 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h" 24 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h"
25 #include "webrtc/modules/rtp_rtcp/source/rtp_sender.h" 25 #include "webrtc/modules/rtp_rtcp/source/rtp_sender.h"
26 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_video.h" 26 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_video.h"
27 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" 27 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
28 #include "webrtc/rtc_base/arraysize.h"
28 #include "webrtc/rtc_base/buffer.h" 29 #include "webrtc/rtc_base/buffer.h"
30 #include "webrtc/rtc_base/ptr_util.h"
29 #include "webrtc/rtc_base/rate_limiter.h" 31 #include "webrtc/rtc_base/rate_limiter.h"
30 #include "webrtc/test/field_trial.h" 32 #include "webrtc/test/field_trial.h"
31 #include "webrtc/test/gmock.h" 33 #include "webrtc/test/gmock.h"
32 #include "webrtc/test/gtest.h" 34 #include "webrtc/test/gtest.h"
33 #include "webrtc/test/mock_transport.h" 35 #include "webrtc/test/mock_transport.h"
34 #include "webrtc/typedefs.h" 36 #include "webrtc/typedefs.h"
35 37
36 namespace webrtc { 38 namespace webrtc {
37 39
38 namespace { 40 namespace {
39 const int kTransmissionTimeOffsetExtensionId = 1; 41 const int kTransmissionTimeOffsetExtensionId = 1;
40 const int kAbsoluteSendTimeExtensionId = 14; 42 const int kAbsoluteSendTimeExtensionId = 14;
41 const int kTransportSequenceNumberExtensionId = 13; 43 const int kTransportSequenceNumberExtensionId = 13;
42 const int kVideoTimingExtensionId = 12; 44 const int kVideoTimingExtensionId = 12;
43 const int kPayload = 100; 45 const int kPayload = 100;
44 const int kRtxPayload = 98; 46 const int kRtxPayload = 98;
45 const uint32_t kTimestamp = 10; 47 const uint32_t kTimestamp = 10;
46 const uint16_t kSeqNum = 33; 48 const uint16_t kSeqNum = 33;
47 const uint32_t kSsrc = 725242; 49 const uint32_t kSsrc = 725242;
48 const int kMaxPacketLength = 1500; 50 const int kMaxPacketLength = 1500;
49 const uint8_t kAudioLevel = 0x5a; 51 const uint8_t kAudioLevel = 0x5a;
50 const uint16_t kTransportSequenceNumber = 0xaabbu; 52 const uint16_t kTransportSequenceNumber = 0xaabbu;
51 const uint8_t kAudioLevelExtensionId = 9; 53 const uint8_t kAudioLevelExtensionId = 9;
52 const int kAudioPayload = 103; 54 const int kAudioPayload = 103;
53 const uint64_t kStartTime = 123456789; 55 const uint64_t kStartTime = 123456789;
54 const size_t kMaxPaddingSize = 224u; 56 const size_t kMaxPaddingSize = 224u;
55 const int kVideoRotationExtensionId = 5; 57 const int kVideoRotationExtensionId = 5;
56 const size_t kGenericHeaderLength = 1; 58 const size_t kGenericHeaderLength = 1;
57 const uint8_t kPayloadData[] = {47, 11, 32, 93, 89}; 59 const uint8_t kPayloadData[] = {47, 11, 32, 93, 89};
60 const int64_t kDefaultExpectedRetransmissionTimeMs = 125;
58 61
59 using ::testing::_; 62 using ::testing::_;
60 using ::testing::ElementsAreArray; 63 using ::testing::ElementsAreArray;
61 using ::testing::Invoke; 64 using ::testing::Invoke;
62 65
63 uint64_t ConvertMsToAbsSendTime(int64_t time_ms) { 66 uint64_t ConvertMsToAbsSendTime(int64_t time_ms) {
64 return (((time_ms << 18) + 500) / 1000) & 0x00ffffff; 67 return (((time_ms << 18) + 500) / 1000) & 0x00ffffff;
65 } 68 }
66 69
67 class LoopbackTransportTest : public webrtc::Transport { 70 class LoopbackTransportTest : public webrtc::Transport {
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
231 void SendGenericPayload() { 234 void SendGenericPayload() {
232 const uint32_t kTimestamp = 1234; 235 const uint32_t kTimestamp = 1234;
233 const uint8_t kPayloadType = 127; 236 const uint8_t kPayloadType = 127;
234 const int64_t kCaptureTimeMs = fake_clock_.TimeInMilliseconds(); 237 const int64_t kCaptureTimeMs = fake_clock_.TimeInMilliseconds();
235 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC"; 238 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC";
236 EXPECT_EQ(0, rtp_sender_->RegisterPayload(payload_name, kPayloadType, 90000, 239 EXPECT_EQ(0, rtp_sender_->RegisterPayload(payload_name, kPayloadType, 90000,
237 0, 1500)); 240 0, 1500));
238 241
239 EXPECT_TRUE(rtp_sender_->SendOutgoingData( 242 EXPECT_TRUE(rtp_sender_->SendOutgoingData(
240 kVideoFrameKey, kPayloadType, kTimestamp, kCaptureTimeMs, kPayloadData, 243 kVideoFrameKey, kPayloadType, kTimestamp, kCaptureTimeMs, kPayloadData,
241 sizeof(kPayloadData), nullptr, nullptr, nullptr)); 244 sizeof(kPayloadData), nullptr, nullptr, nullptr,
245 kDefaultExpectedRetransmissionTimeMs));
242 } 246 }
243 }; 247 };
244 248
245 // TODO(pbos): Move tests over from WithoutPacer to RtpSenderTest as this is our 249 // TODO(pbos): Move tests over from WithoutPacer to RtpSenderTest as this is our
246 // default code path. 250 // default code path.
247 class RtpSenderTestWithoutPacer : public RtpSenderTest { 251 class RtpSenderTestWithoutPacer : public RtpSenderTest {
248 public: 252 public:
249 void SetUp() override { SetUpRtpSender(false); } 253 void SetUp() override { SetUpRtpSender(false); }
250 }; 254 };
251 255
256 class TestRtpSenderVideo : public RTPSenderVideo {
257 public:
258 TestRtpSenderVideo(Clock* clock,
259 RTPSender* rtp_sender,
260 FlexfecSender* flexfec_sender)
261 : RTPSenderVideo(clock, rtp_sender, flexfec_sender) {}
262 ~TestRtpSenderVideo() override {}
263
264 StorageType GetStorageType(const RTPVideoHeader& header,
265 int32_t retransmission_settings,
266 int64_t expected_retransmission_time_ms) {
267 return RTPSenderVideo::GetStorageType(GetTemporalId(header),
268 retransmission_settings,
269 expected_retransmission_time_ms);
270 }
271 };
272
252 class RtpSenderVideoTest : public RtpSenderTest { 273 class RtpSenderVideoTest : public RtpSenderTest {
253 protected: 274 protected:
254 void SetUp() override { 275 void SetUp() override {
255 // TODO(pbos): Set up to use pacer. 276 // TODO(pbos): Set up to use pacer.
256 SetUpRtpSender(false); 277 SetUpRtpSender(false);
257 rtp_sender_video_.reset( 278 rtp_sender_video_.reset(
258 new RTPSenderVideo(&fake_clock_, rtp_sender_.get(), nullptr)); 279 new TestRtpSenderVideo(&fake_clock_, rtp_sender_.get(), nullptr));
259 } 280 }
260 std::unique_ptr<RTPSenderVideo> rtp_sender_video_; 281 std::unique_ptr<TestRtpSenderVideo> rtp_sender_video_;
261 }; 282 };
262 283
263 TEST_P(RtpSenderTestWithoutPacer, AllocatePacketSetCsrc) { 284 TEST_P(RtpSenderTestWithoutPacer, AllocatePacketSetCsrc) {
264 // Configure rtp_sender with csrc. 285 // Configure rtp_sender with csrc.
265 std::vector<uint32_t> csrcs; 286 std::vector<uint32_t> csrcs;
266 csrcs.push_back(0x23456789); 287 csrcs.push_back(0x23456789);
267 rtp_sender_->SetCsrcs(csrcs); 288 rtp_sender_->SetCsrcs(csrcs);
268 289
269 auto packet = rtp_sender_->AllocatePacket(); 290 auto packet = rtp_sender_->AllocatePacket();
270 291
(...skipping 583 matching lines...) Expand 10 before | Expand all | Expand 10 after
854 } 875 }
855 876
856 TEST_P(RtpSenderTestWithoutPacer, SendGenericVideo) { 877 TEST_P(RtpSenderTestWithoutPacer, SendGenericVideo) {
857 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC"; 878 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC";
858 const uint8_t payload_type = 127; 879 const uint8_t payload_type = 127;
859 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000, 880 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000,
860 0, 1500)); 881 0, 1500));
861 uint8_t payload[] = {47, 11, 32, 93, 89}; 882 uint8_t payload[] = {47, 11, 32, 93, 89};
862 883
863 // Send keyframe 884 // Send keyframe
864 ASSERT_TRUE(rtp_sender_->SendOutgoingData(kVideoFrameKey, payload_type, 1234, 885 ASSERT_TRUE(rtp_sender_->SendOutgoingData(
865 4321, payload, sizeof(payload), 886 kVideoFrameKey, payload_type, 1234, 4321, payload, sizeof(payload),
866 nullptr, nullptr, nullptr)); 887 nullptr, nullptr, nullptr, kDefaultExpectedRetransmissionTimeMs));
867 888
868 auto sent_payload = transport_.last_sent_packet().payload(); 889 auto sent_payload = transport_.last_sent_packet().payload();
869 uint8_t generic_header = sent_payload[0]; 890 uint8_t generic_header = sent_payload[0];
870 EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kKeyFrameBit); 891 EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kKeyFrameBit);
871 EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kFirstPacketBit); 892 EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kFirstPacketBit);
872 EXPECT_THAT(sent_payload.subview(1), ElementsAreArray(payload)); 893 EXPECT_THAT(sent_payload.subview(1), ElementsAreArray(payload));
873 894
874 // Send delta frame 895 // Send delta frame
875 payload[0] = 13; 896 payload[0] = 13;
876 payload[1] = 42; 897 payload[1] = 42;
877 payload[4] = 13; 898 payload[4] = 13;
878 899
879 ASSERT_TRUE(rtp_sender_->SendOutgoingData( 900 ASSERT_TRUE(rtp_sender_->SendOutgoingData(
880 kVideoFrameDelta, payload_type, 1234, 4321, payload, sizeof(payload), 901 kVideoFrameDelta, payload_type, 1234, 4321, payload, sizeof(payload),
881 nullptr, nullptr, nullptr)); 902 nullptr, nullptr, nullptr, kDefaultExpectedRetransmissionTimeMs));
882 903
883 sent_payload = transport_.last_sent_packet().payload(); 904 sent_payload = transport_.last_sent_packet().payload();
884 generic_header = sent_payload[0]; 905 generic_header = sent_payload[0];
885 EXPECT_FALSE(generic_header & RtpFormatVideoGeneric::kKeyFrameBit); 906 EXPECT_FALSE(generic_header & RtpFormatVideoGeneric::kKeyFrameBit);
886 EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kFirstPacketBit); 907 EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kFirstPacketBit);
887 EXPECT_THAT(sent_payload.subview(1), ElementsAreArray(payload)); 908 EXPECT_THAT(sent_payload.subview(1), ElementsAreArray(payload));
888 } 909 }
889 910
890 TEST_P(RtpSenderTest, SendFlexfecPackets) { 911 TEST_P(RtpSenderTest, SendFlexfecPackets) {
891 constexpr int kMediaPayloadType = 127; 912 constexpr int kMediaPayloadType = 127;
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
991 const uint8_t kPayloadType = 127; 1012 const uint8_t kPayloadType = 127;
992 const int64_t kCaptureTimeMs = fake_clock_.TimeInMilliseconds(); 1013 const int64_t kCaptureTimeMs = fake_clock_.TimeInMilliseconds();
993 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC"; 1014 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC";
994 EXPECT_EQ(0, rtp_sender_->RegisterPayload(payload_name, kPayloadType, 90000, 1015 EXPECT_EQ(0, rtp_sender_->RegisterPayload(payload_name, kPayloadType, 90000,
995 0, 1500)); 1016 0, 1500));
996 RTPVideoHeader video_header; 1017 RTPVideoHeader video_header;
997 memset(&video_header, 0, sizeof(RTPVideoHeader)); 1018 memset(&video_header, 0, sizeof(RTPVideoHeader));
998 video_header.video_timing.flags = TimingFrameFlags::kTriggeredByTimer; 1019 video_header.video_timing.flags = TimingFrameFlags::kTriggeredByTimer;
999 EXPECT_TRUE(rtp_sender_->SendOutgoingData( 1020 EXPECT_TRUE(rtp_sender_->SendOutgoingData(
1000 kVideoFrameKey, kPayloadType, kTimestamp, kCaptureTimeMs, kPayloadData, 1021 kVideoFrameKey, kPayloadType, kTimestamp, kCaptureTimeMs, kPayloadData,
1001 sizeof(kPayloadData), nullptr, &video_header, nullptr)); 1022 sizeof(kPayloadData), nullptr, &video_header, nullptr,
1023 kDefaultExpectedRetransmissionTimeMs));
1002 1024
1003 EXPECT_CALL(mock_rtc_event_log_, 1025 EXPECT_CALL(mock_rtc_event_log_,
1004 LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _)) 1026 LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _))
1005 .Times(1); 1027 .Times(1);
1006 EXPECT_TRUE(rtp_sender_->TimeToSendPacket(kMediaSsrc, kSeqNum, 1028 EXPECT_TRUE(rtp_sender_->TimeToSendPacket(kMediaSsrc, kSeqNum,
1007 fake_clock_.TimeInMilliseconds(), 1029 fake_clock_.TimeInMilliseconds(),
1008 false, PacedPacketInfo())); 1030 false, PacedPacketInfo()));
1009 ASSERT_EQ(1, transport_.packets_sent()); 1031 ASSERT_EQ(1, transport_.packets_sent());
1010 const RtpPacketReceived& media_packet = transport_.sent_packets_[0]; 1032 const RtpPacketReceived& media_packet = transport_.sent_packets_[0];
1011 EXPECT_EQ(kMediaPayloadType, media_packet.PayloadType()); 1033 EXPECT_EQ(kMediaPayloadType, media_packet.PayloadType());
1012 EXPECT_EQ(kSeqNum, media_packet.SequenceNumber()); 1034 EXPECT_EQ(kSeqNum, media_packet.SequenceNumber());
1013 EXPECT_EQ(kMediaSsrc, media_packet.Ssrc()); 1035 EXPECT_EQ(kMediaSsrc, media_packet.Ssrc());
1014 1036
1015 // Now try to send not a timing frame. 1037 // Now try to send not a timing frame.
1016 uint16_t flexfec_seq_num; 1038 uint16_t flexfec_seq_num;
1017 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kLowPriority, 1039 EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kLowPriority,
1018 kFlexfecSsrc, _, _, _, false)) 1040 kFlexfecSsrc, _, _, _, false))
1019 .WillOnce(testing::SaveArg<2>(&flexfec_seq_num)); 1041 .WillOnce(testing::SaveArg<2>(&flexfec_seq_num));
1020 EXPECT_CALL(mock_paced_sender_, 1042 EXPECT_CALL(mock_paced_sender_,
1021 InsertPacket(RtpPacketSender::kLowPriority, kMediaSsrc, 1043 InsertPacket(RtpPacketSender::kLowPriority, kMediaSsrc,
1022 kSeqNum + 1, _, _, false)); 1044 kSeqNum + 1, _, _, false));
1023 video_header.video_timing.flags = TimingFrameFlags::kInvalid; 1045 video_header.video_timing.flags = TimingFrameFlags::kInvalid;
1024 EXPECT_TRUE(rtp_sender_->SendOutgoingData( 1046 EXPECT_TRUE(rtp_sender_->SendOutgoingData(
1025 kVideoFrameKey, kPayloadType, kTimestamp + 1, kCaptureTimeMs + 1, 1047 kVideoFrameKey, kPayloadType, kTimestamp + 1, kCaptureTimeMs + 1,
1026 kPayloadData, sizeof(kPayloadData), nullptr, &video_header, nullptr)); 1048 kPayloadData, sizeof(kPayloadData), nullptr, &video_header, nullptr,
1049 kDefaultExpectedRetransmissionTimeMs));
1027 1050
1028 EXPECT_CALL(mock_rtc_event_log_, 1051 EXPECT_CALL(mock_rtc_event_log_,
1029 LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _)) 1052 LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _))
1030 .Times(2); 1053 .Times(2);
1031 EXPECT_TRUE(rtp_sender_->TimeToSendPacket(kMediaSsrc, kSeqNum + 1, 1054 EXPECT_TRUE(rtp_sender_->TimeToSendPacket(kMediaSsrc, kSeqNum + 1,
1032 fake_clock_.TimeInMilliseconds(), 1055 fake_clock_.TimeInMilliseconds(),
1033 false, PacedPacketInfo())); 1056 false, PacedPacketInfo()));
1034 EXPECT_TRUE(rtp_sender_->TimeToSendPacket(kFlexfecSsrc, flexfec_seq_num, 1057 EXPECT_TRUE(rtp_sender_->TimeToSendPacket(kFlexfecSsrc, flexfec_seq_num,
1035 fake_clock_.TimeInMilliseconds(), 1058 fake_clock_.TimeInMilliseconds(),
1036 false, PacedPacketInfo())); 1059 false, PacedPacketInfo()));
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
1161 const uint8_t payload_type = 127; 1184 const uint8_t payload_type = 127;
1162 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000, 1185 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000,
1163 0, 1500)); 1186 0, 1500));
1164 uint8_t payload[] = {47, 11, 32, 93, 89}; 1187 uint8_t payload[] = {47, 11, 32, 93, 89};
1165 rtp_sender_->SetStorePacketsStatus(true, 1); 1188 rtp_sender_->SetStorePacketsStatus(true, 1);
1166 uint32_t ssrc = rtp_sender_->SSRC(); 1189 uint32_t ssrc = rtp_sender_->SSRC();
1167 1190
1168 EXPECT_CALL(mock_paced_sender_, InsertPacket(_, _, _, _, _, _)) 1191 EXPECT_CALL(mock_paced_sender_, InsertPacket(_, _, _, _, _, _))
1169 .Times(::testing::AtLeast(2)); 1192 .Times(::testing::AtLeast(2));
1170 1193
1171 ASSERT_TRUE(rtp_sender_->SendOutgoingData(kVideoFrameKey, payload_type, 1234, 1194 ASSERT_TRUE(rtp_sender_->SendOutgoingData(
1172 4321, payload, sizeof(payload), 1195 kVideoFrameKey, payload_type, 1234, 4321, payload, sizeof(payload),
1173 nullptr, nullptr, nullptr)); 1196 nullptr, nullptr, nullptr, kDefaultExpectedRetransmissionTimeMs));
1174 1197
1175 EXPECT_EQ(1U, callback.num_calls_); 1198 EXPECT_EQ(1U, callback.num_calls_);
1176 EXPECT_EQ(ssrc, callback.ssrc_); 1199 EXPECT_EQ(ssrc, callback.ssrc_);
1177 EXPECT_EQ(1, callback.frame_counts_.key_frames); 1200 EXPECT_EQ(1, callback.frame_counts_.key_frames);
1178 EXPECT_EQ(0, callback.frame_counts_.delta_frames); 1201 EXPECT_EQ(0, callback.frame_counts_.delta_frames);
1179 1202
1180 ASSERT_TRUE(rtp_sender_->SendOutgoingData( 1203 ASSERT_TRUE(rtp_sender_->SendOutgoingData(
1181 kVideoFrameDelta, payload_type, 1234, 4321, payload, sizeof(payload), 1204 kVideoFrameDelta, payload_type, 1234, 4321, payload, sizeof(payload),
1182 nullptr, nullptr, nullptr)); 1205 nullptr, nullptr, nullptr, kDefaultExpectedRetransmissionTimeMs));
1183 1206
1184 EXPECT_EQ(2U, callback.num_calls_); 1207 EXPECT_EQ(2U, callback.num_calls_);
1185 EXPECT_EQ(ssrc, callback.ssrc_); 1208 EXPECT_EQ(ssrc, callback.ssrc_);
1186 EXPECT_EQ(1, callback.frame_counts_.key_frames); 1209 EXPECT_EQ(1, callback.frame_counts_.key_frames);
1187 EXPECT_EQ(1, callback.frame_counts_.delta_frames); 1210 EXPECT_EQ(1, callback.frame_counts_.delta_frames);
1188 1211
1189 rtp_sender_.reset(); 1212 rtp_sender_.reset();
1190 } 1213 }
1191 1214
1192 TEST_P(RtpSenderTest, BitrateCallbacks) { 1215 TEST_P(RtpSenderTest, BitrateCallbacks) {
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1238 rtp_sender_->SetStorePacketsStatus(true, 1); 1261 rtp_sender_->SetStorePacketsStatus(true, 1);
1239 uint32_t ssrc = rtp_sender_->SSRC(); 1262 uint32_t ssrc = rtp_sender_->SSRC();
1240 1263
1241 // Initial process call so we get a new time window. 1264 // Initial process call so we get a new time window.
1242 rtp_sender_->ProcessBitrate(); 1265 rtp_sender_->ProcessBitrate();
1243 1266
1244 // Send a few frames. 1267 // Send a few frames.
1245 for (uint32_t i = 0; i < kNumPackets; ++i) { 1268 for (uint32_t i = 0; i < kNumPackets; ++i) {
1246 ASSERT_TRUE(rtp_sender_->SendOutgoingData( 1269 ASSERT_TRUE(rtp_sender_->SendOutgoingData(
1247 kVideoFrameKey, payload_type, 1234, 4321, payload, sizeof(payload), 1270 kVideoFrameKey, payload_type, 1234, 4321, payload, sizeof(payload),
1248 nullptr, nullptr, nullptr)); 1271 nullptr, nullptr, nullptr, kDefaultExpectedRetransmissionTimeMs));
1249 fake_clock_.AdvanceTimeMilliseconds(kPacketInterval); 1272 fake_clock_.AdvanceTimeMilliseconds(kPacketInterval);
1250 } 1273 }
1251 1274
1252 rtp_sender_->ProcessBitrate(); 1275 rtp_sender_->ProcessBitrate();
1253 1276
1254 // We get one call for every stats updated, thus two calls since both the 1277 // We get one call for every stats updated, thus two calls since both the
1255 // stream stats and the retransmit stats are updated once. 1278 // stream stats and the retransmit stats are updated once.
1256 EXPECT_EQ(2u, callback.num_calls_); 1279 EXPECT_EQ(2u, callback.num_calls_);
1257 EXPECT_EQ(ssrc, callback.ssrc_); 1280 EXPECT_EQ(ssrc, callback.ssrc_);
1258 const uint32_t kTotalPacketSize = kPacketOverhead + sizeof(payload); 1281 const uint32_t kTotalPacketSize = kPacketOverhead + sizeof(payload);
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1320 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000, 1343 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000,
1321 0, 1500)); 1344 0, 1500));
1322 uint8_t payload[] = {47, 11, 32, 93, 89}; 1345 uint8_t payload[] = {47, 11, 32, 93, 89};
1323 rtp_sender_->SetStorePacketsStatus(true, 1); 1346 rtp_sender_->SetStorePacketsStatus(true, 1);
1324 uint32_t ssrc = rtp_sender_->SSRC(); 1347 uint32_t ssrc = rtp_sender_->SSRC();
1325 1348
1326 rtp_sender_->RegisterRtpStatisticsCallback(&callback); 1349 rtp_sender_->RegisterRtpStatisticsCallback(&callback);
1327 1350
1328 // Send a frame. 1351 // Send a frame.
1329 ASSERT_TRUE(rtp_sender_->SendOutgoingData( 1352 ASSERT_TRUE(rtp_sender_->SendOutgoingData(
1330 kVideoFrameKey, payload_type, 1234, 4321, payload, 1353 kVideoFrameKey, payload_type, 1234, 4321, payload, sizeof(payload),
1331 sizeof(payload), nullptr, nullptr, nullptr)); 1354 nullptr, nullptr, nullptr, kDefaultExpectedRetransmissionTimeMs));
1332 StreamDataCounters expected; 1355 StreamDataCounters expected;
1333 expected.transmitted.payload_bytes = 6; 1356 expected.transmitted.payload_bytes = 6;
1334 expected.transmitted.header_bytes = 12; 1357 expected.transmitted.header_bytes = 12;
1335 expected.transmitted.padding_bytes = 0; 1358 expected.transmitted.padding_bytes = 0;
1336 expected.transmitted.packets = 1; 1359 expected.transmitted.packets = 1;
1337 expected.retransmitted.payload_bytes = 0; 1360 expected.retransmitted.payload_bytes = 0;
1338 expected.retransmitted.header_bytes = 0; 1361 expected.retransmitted.header_bytes = 0;
1339 expected.retransmitted.padding_bytes = 0; 1362 expected.retransmitted.padding_bytes = 0;
1340 expected.retransmitted.packets = 0; 1363 expected.retransmitted.packets = 0;
1341 expected.fec.packets = 0; 1364 expected.fec.packets = 0;
(...skipping 20 matching lines...) Expand all
1362 callback.Matches(ssrc, expected); 1385 callback.Matches(ssrc, expected);
1363 1386
1364 // Send ULPFEC. 1387 // Send ULPFEC.
1365 rtp_sender_->SetUlpfecConfig(kRedPayloadType, kUlpfecPayloadType); 1388 rtp_sender_->SetUlpfecConfig(kRedPayloadType, kUlpfecPayloadType);
1366 FecProtectionParams fec_params; 1389 FecProtectionParams fec_params;
1367 fec_params.fec_mask_type = kFecMaskRandom; 1390 fec_params.fec_mask_type = kFecMaskRandom;
1368 fec_params.fec_rate = 1; 1391 fec_params.fec_rate = 1;
1369 fec_params.max_fec_frames = 1; 1392 fec_params.max_fec_frames = 1;
1370 rtp_sender_->SetFecParameters(fec_params, fec_params); 1393 rtp_sender_->SetFecParameters(fec_params, fec_params);
1371 ASSERT_TRUE(rtp_sender_->SendOutgoingData( 1394 ASSERT_TRUE(rtp_sender_->SendOutgoingData(
1372 kVideoFrameDelta, payload_type, 1234, 4321, payload, 1395 kVideoFrameDelta, payload_type, 1234, 4321, payload, sizeof(payload),
1373 sizeof(payload), nullptr, nullptr, nullptr)); 1396 nullptr, nullptr, nullptr, kDefaultExpectedRetransmissionTimeMs));
1374 expected.transmitted.payload_bytes = 40; 1397 expected.transmitted.payload_bytes = 40;
1375 expected.transmitted.header_bytes = 60; 1398 expected.transmitted.header_bytes = 60;
1376 expected.transmitted.packets = 5; 1399 expected.transmitted.packets = 5;
1377 expected.fec.packets = 1; 1400 expected.fec.packets = 1;
1378 callback.Matches(ssrc, expected); 1401 callback.Matches(ssrc, expected);
1379 1402
1380 rtp_sender_->RegisterRtpStatisticsCallback(nullptr); 1403 rtp_sender_->RegisterRtpStatisticsCallback(nullptr);
1381 } 1404 }
1382 1405
1383 TEST_P(RtpSenderAudioTest, SendAudio) { 1406 TEST_P(RtpSenderAudioTest, SendAudio) {
1384 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "PAYLOAD_NAME"; 1407 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "PAYLOAD_NAME";
1385 const uint8_t payload_type = 127; 1408 const uint8_t payload_type = 127;
1386 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 48000, 1409 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 48000,
1387 0, 1500)); 1410 0, 1500));
1388 uint8_t payload[] = {47, 11, 32, 93, 89}; 1411 uint8_t payload[] = {47, 11, 32, 93, 89};
1389 1412
1390 ASSERT_TRUE(rtp_sender_->SendOutgoingData( 1413 ASSERT_TRUE(rtp_sender_->SendOutgoingData(
1391 kAudioFrameCN, payload_type, 1234, 4321, payload, 1414 kAudioFrameCN, payload_type, 1234, 4321, payload, sizeof(payload),
1392 sizeof(payload), nullptr, nullptr, nullptr)); 1415 nullptr, nullptr, nullptr, kDefaultExpectedRetransmissionTimeMs));
1393 1416
1394 auto sent_payload = transport_.last_sent_packet().payload(); 1417 auto sent_payload = transport_.last_sent_packet().payload();
1395 EXPECT_THAT(sent_payload, ElementsAreArray(payload)); 1418 EXPECT_THAT(sent_payload, ElementsAreArray(payload));
1396 } 1419 }
1397 1420
1398 TEST_P(RtpSenderAudioTest, SendAudioWithAudioLevelExtension) { 1421 TEST_P(RtpSenderAudioTest, SendAudioWithAudioLevelExtension) {
1399 EXPECT_EQ(0, rtp_sender_->SetAudioLevel(kAudioLevel)); 1422 EXPECT_EQ(0, rtp_sender_->SetAudioLevel(kAudioLevel));
1400 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAudioLevel, 1423 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAudioLevel,
1401 kAudioLevelExtensionId)); 1424 kAudioLevelExtensionId));
1402 1425
1403 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "PAYLOAD_NAME"; 1426 char payload_name[RTP_PAYLOAD_NAME_SIZE] = "PAYLOAD_NAME";
1404 const uint8_t payload_type = 127; 1427 const uint8_t payload_type = 127;
1405 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 48000, 1428 ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 48000,
1406 0, 1500)); 1429 0, 1500));
1407 uint8_t payload[] = {47, 11, 32, 93, 89}; 1430 uint8_t payload[] = {47, 11, 32, 93, 89};
1408 1431
1409 ASSERT_TRUE(rtp_sender_->SendOutgoingData( 1432 ASSERT_TRUE(rtp_sender_->SendOutgoingData(
1410 kAudioFrameCN, payload_type, 1234, 4321, payload, 1433 kAudioFrameCN, payload_type, 1234, 4321, payload, sizeof(payload),
1411 sizeof(payload), nullptr, nullptr, nullptr)); 1434 nullptr, nullptr, nullptr, kDefaultExpectedRetransmissionTimeMs));
1412 1435
1413 auto sent_payload = transport_.last_sent_packet().payload(); 1436 auto sent_payload = transport_.last_sent_packet().payload();
1414 EXPECT_THAT(sent_payload, ElementsAreArray(payload)); 1437 EXPECT_THAT(sent_payload, ElementsAreArray(payload));
1415 // Verify AudioLevel extension. 1438 // Verify AudioLevel extension.
1416 bool voice_activity; 1439 bool voice_activity;
1417 uint8_t audio_level; 1440 uint8_t audio_level;
1418 EXPECT_TRUE(transport_.last_sent_packet().GetExtension<AudioLevel>( 1441 EXPECT_TRUE(transport_.last_sent_packet().GetExtension<AudioLevel>(
1419 &voice_activity, &audio_level)); 1442 &voice_activity, &audio_level));
1420 EXPECT_EQ(kAudioLevel, audio_level); 1443 EXPECT_EQ(kAudioLevel, audio_level);
1421 EXPECT_FALSE(voice_activity); 1444 EXPECT_FALSE(voice_activity);
(...skipping 16 matching lines...) Expand all
1438 // Registering the payload again for audio stream with different payload name. 1461 // Registering the payload again for audio stream with different payload name.
1439 const char* kPayloadName = "payload_name"; 1462 const char* kPayloadName = "payload_name";
1440 ASSERT_EQ(0, rtp_sender_->RegisterPayload(kPayloadName, kPayloadType, 1463 ASSERT_EQ(0, rtp_sender_->RegisterPayload(kPayloadName, kPayloadType,
1441 kPayloadFrequency, 1, 0)); 1464 kPayloadFrequency, 1, 0));
1442 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds(); 1465 int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
1443 // DTMF event key=9, duration=500 and attenuationdB=10 1466 // DTMF event key=9, duration=500 and attenuationdB=10
1444 rtp_sender_->SendTelephoneEvent(9, 500, 10); 1467 rtp_sender_->SendTelephoneEvent(9, 500, 10);
1445 // During start, it takes the starting timestamp as last sent timestamp. 1468 // During start, it takes the starting timestamp as last sent timestamp.
1446 // The duration is calculated as the difference of current and last sent 1469 // The duration is calculated as the difference of current and last sent
1447 // timestamp. So for first call it will skip since the duration is zero. 1470 // timestamp. So for first call it will skip since the duration is zero.
1448 ASSERT_TRUE(rtp_sender_->SendOutgoingData(kEmptyFrame, kPayloadType, 1471 ASSERT_TRUE(rtp_sender_->SendOutgoingData(
1449 capture_time_ms, 0, nullptr, 0, 1472 kEmptyFrame, kPayloadType, capture_time_ms, 0, nullptr, 0, nullptr,
1450 nullptr, nullptr, nullptr)); 1473 nullptr, nullptr, kDefaultExpectedRetransmissionTimeMs));
1451 // DTMF Sample Length is (Frequency/1000) * Duration. 1474 // DTMF Sample Length is (Frequency/1000) * Duration.
1452 // So in this case, it is (8000/1000) * 500 = 4000. 1475 // So in this case, it is (8000/1000) * 500 = 4000.
1453 // Sending it as two packets. 1476 // Sending it as two packets.
1454 ASSERT_TRUE(rtp_sender_->SendOutgoingData( 1477 ASSERT_TRUE(rtp_sender_->SendOutgoingData(
1455 kEmptyFrame, kPayloadType, capture_time_ms + 2000, 0, 1478 kEmptyFrame, kPayloadType, capture_time_ms + 2000, 0, nullptr, 0, nullptr,
1456 nullptr, 0, nullptr, nullptr, nullptr)); 1479 nullptr, nullptr, kDefaultExpectedRetransmissionTimeMs));
1457 1480
1458 // Marker Bit should be set to 1 for first packet. 1481 // Marker Bit should be set to 1 for first packet.
1459 EXPECT_TRUE(transport_.last_sent_packet().Marker()); 1482 EXPECT_TRUE(transport_.last_sent_packet().Marker());
1460 1483
1461 ASSERT_TRUE(rtp_sender_->SendOutgoingData( 1484 ASSERT_TRUE(rtp_sender_->SendOutgoingData(
1462 kEmptyFrame, kPayloadType, capture_time_ms + 4000, 0, 1485 kEmptyFrame, kPayloadType, capture_time_ms + 4000, 0, nullptr, 0, nullptr,
1463 nullptr, 0, nullptr, nullptr, nullptr)); 1486 nullptr, nullptr, kDefaultExpectedRetransmissionTimeMs));
1464 // Marker Bit should be set to 0 for rest of the packets. 1487 // Marker Bit should be set to 0 for rest of the packets.
1465 EXPECT_FALSE(transport_.last_sent_packet().Marker()); 1488 EXPECT_FALSE(transport_.last_sent_packet().Marker());
1466 } 1489 }
1467 1490
1468 TEST_P(RtpSenderTestWithoutPacer, BytesReportedCorrectly) { 1491 TEST_P(RtpSenderTestWithoutPacer, BytesReportedCorrectly) {
1469 const char* kPayloadName = "GENERIC"; 1492 const char* kPayloadName = "GENERIC";
1470 const uint8_t kPayloadType = 127; 1493 const uint8_t kPayloadType = 127;
1471 rtp_sender_->SetSSRC(1234); 1494 rtp_sender_->SetSSRC(1234);
1472 rtp_sender_->SetRtxSsrc(4321); 1495 rtp_sender_->SetRtxSsrc(4321);
1473 rtp_sender_->SetRtxPayloadType(kPayloadType - 1, kPayloadType); 1496 rtp_sender_->SetRtxPayloadType(kPayloadType - 1, kPayloadType);
1474 rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads); 1497 rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
1475 1498
1476 ASSERT_EQ(0, rtp_sender_->RegisterPayload(kPayloadName, kPayloadType, 90000, 1499 ASSERT_EQ(0, rtp_sender_->RegisterPayload(kPayloadName, kPayloadType, 90000,
1477 0, 1500)); 1500 0, 1500));
1478 uint8_t payload[] = {47, 11, 32, 93, 89}; 1501 uint8_t payload[] = {47, 11, 32, 93, 89};
1479 1502
1480 ASSERT_TRUE(rtp_sender_->SendOutgoingData( 1503 ASSERT_TRUE(rtp_sender_->SendOutgoingData(
1481 kVideoFrameKey, kPayloadType, 1234, 4321, payload, 1504 kVideoFrameKey, kPayloadType, 1234, 4321, payload, sizeof(payload),
1482 sizeof(payload), nullptr, nullptr, nullptr)); 1505 nullptr, nullptr, nullptr, kDefaultExpectedRetransmissionTimeMs));
1483 1506
1484 // Will send 2 full-size padding packets. 1507 // Will send 2 full-size padding packets.
1485 rtp_sender_->TimeToSendPadding(1, PacedPacketInfo()); 1508 rtp_sender_->TimeToSendPadding(1, PacedPacketInfo());
1486 rtp_sender_->TimeToSendPadding(1, PacedPacketInfo()); 1509 rtp_sender_->TimeToSendPadding(1, PacedPacketInfo());
1487 1510
1488 StreamDataCounters rtp_stats; 1511 StreamDataCounters rtp_stats;
1489 StreamDataCounters rtx_stats; 1512 StreamDataCounters rtx_stats;
1490 rtp_sender_->GetDataCounters(&rtp_stats, &rtx_stats); 1513 rtp_sender_->GetDataCounters(&rtp_stats, &rtx_stats);
1491 1514
1492 // Payload + 1-byte generic header. 1515 // Payload + 1-byte generic header.
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1546 1569
1547 TEST_P(RtpSenderVideoTest, KeyFrameHasCVO) { 1570 TEST_P(RtpSenderVideoTest, KeyFrameHasCVO) {
1548 uint8_t kFrame[kMaxPacketLength]; 1571 uint8_t kFrame[kMaxPacketLength];
1549 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( 1572 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
1550 kRtpExtensionVideoRotation, kVideoRotationExtensionId)); 1573 kRtpExtensionVideoRotation, kVideoRotationExtensionId));
1551 1574
1552 RTPVideoHeader hdr = {0}; 1575 RTPVideoHeader hdr = {0};
1553 hdr.rotation = kVideoRotation_0; 1576 hdr.rotation = kVideoRotation_0;
1554 rtp_sender_video_->SendVideo(kRtpVideoGeneric, kVideoFrameKey, kPayload, 1577 rtp_sender_video_->SendVideo(kRtpVideoGeneric, kVideoFrameKey, kPayload,
1555 kTimestamp, 0, kFrame, sizeof(kFrame), nullptr, 1578 kTimestamp, 0, kFrame, sizeof(kFrame), nullptr,
1556 &hdr); 1579 &hdr, kDefaultExpectedRetransmissionTimeMs);
1557 1580
1558 VideoRotation rotation; 1581 VideoRotation rotation;
1559 EXPECT_TRUE( 1582 EXPECT_TRUE(
1560 transport_.last_sent_packet().GetExtension<VideoOrientation>(&rotation)); 1583 transport_.last_sent_packet().GetExtension<VideoOrientation>(&rotation));
1561 EXPECT_EQ(kVideoRotation_0, rotation); 1584 EXPECT_EQ(kVideoRotation_0, rotation);
1562 } 1585 }
1563 1586
1564 TEST_P(RtpSenderVideoTest, TimingFrameHasPacketizationTimstampSet) { 1587 TEST_P(RtpSenderVideoTest, TimingFrameHasPacketizationTimstampSet) {
1565 uint8_t kFrame[kMaxPacketLength]; 1588 uint8_t kFrame[kMaxPacketLength];
1566 const int64_t kPacketizationTimeMs = 100; 1589 const int64_t kPacketizationTimeMs = 100;
1567 const int64_t kEncodeStartDeltaMs = 10; 1590 const int64_t kEncodeStartDeltaMs = 10;
1568 const int64_t kEncodeFinishDeltaMs = 50; 1591 const int64_t kEncodeFinishDeltaMs = 50;
1569 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( 1592 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
1570 kRtpExtensionVideoTiming, kVideoTimingExtensionId)); 1593 kRtpExtensionVideoTiming, kVideoTimingExtensionId));
1571 1594
1572 const int64_t kCaptureTimestamp = fake_clock_.TimeInMilliseconds(); 1595 const int64_t kCaptureTimestamp = fake_clock_.TimeInMilliseconds();
1573 1596
1574 RTPVideoHeader hdr = {0}; 1597 RTPVideoHeader hdr = {0};
1575 hdr.video_timing.flags = TimingFrameFlags::kTriggeredByTimer; 1598 hdr.video_timing.flags = TimingFrameFlags::kTriggeredByTimer;
1576 hdr.video_timing.encode_start_delta_ms = kEncodeStartDeltaMs; 1599 hdr.video_timing.encode_start_delta_ms = kEncodeStartDeltaMs;
1577 hdr.video_timing.encode_finish_delta_ms = kEncodeFinishDeltaMs; 1600 hdr.video_timing.encode_finish_delta_ms = kEncodeFinishDeltaMs;
1578 1601
1579 fake_clock_.AdvanceTimeMilliseconds(kPacketizationTimeMs); 1602 fake_clock_.AdvanceTimeMilliseconds(kPacketizationTimeMs);
1580 rtp_sender_video_->SendVideo(kRtpVideoGeneric, kVideoFrameKey, kPayload, 1603 rtp_sender_video_->SendVideo(kRtpVideoGeneric, kVideoFrameKey, kPayload,
1581 kTimestamp, kCaptureTimestamp, kFrame, 1604 kTimestamp, kCaptureTimestamp, kFrame,
1582 sizeof(kFrame), nullptr, &hdr); 1605 sizeof(kFrame), nullptr, &hdr,
1606 kDefaultExpectedRetransmissionTimeMs);
1583 VideoSendTiming timing; 1607 VideoSendTiming timing;
1584 EXPECT_TRUE(transport_.last_sent_packet().GetExtension<VideoTimingExtension>( 1608 EXPECT_TRUE(transport_.last_sent_packet().GetExtension<VideoTimingExtension>(
1585 &timing)); 1609 &timing));
1586 EXPECT_EQ(kPacketizationTimeMs, timing.packetization_finish_delta_ms); 1610 EXPECT_EQ(kPacketizationTimeMs, timing.packetization_finish_delta_ms);
1587 EXPECT_EQ(kEncodeStartDeltaMs, timing.encode_start_delta_ms); 1611 EXPECT_EQ(kEncodeStartDeltaMs, timing.encode_start_delta_ms);
1588 EXPECT_EQ(kEncodeFinishDeltaMs, timing.encode_finish_delta_ms); 1612 EXPECT_EQ(kEncodeFinishDeltaMs, timing.encode_finish_delta_ms);
1589 } 1613 }
1590 1614
1591 TEST_P(RtpSenderVideoTest, DeltaFrameHasCVOWhenChanged) { 1615 TEST_P(RtpSenderVideoTest, DeltaFrameHasCVOWhenChanged) {
1592 uint8_t kFrame[kMaxPacketLength]; 1616 uint8_t kFrame[kMaxPacketLength];
1593 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( 1617 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
1594 kRtpExtensionVideoRotation, kVideoRotationExtensionId)); 1618 kRtpExtensionVideoRotation, kVideoRotationExtensionId));
1595 1619
1596 RTPVideoHeader hdr = {0}; 1620 RTPVideoHeader hdr = {0};
1597 hdr.rotation = kVideoRotation_90; 1621 hdr.rotation = kVideoRotation_90;
1598 EXPECT_TRUE(rtp_sender_video_->SendVideo(kRtpVideoGeneric, kVideoFrameKey, 1622 EXPECT_TRUE(rtp_sender_video_->SendVideo(
1599 kPayload, kTimestamp, 0, kFrame, 1623 kRtpVideoGeneric, kVideoFrameKey, kPayload, kTimestamp, 0, kFrame,
1600 sizeof(kFrame), nullptr, &hdr)); 1624 sizeof(kFrame), nullptr, &hdr, kDefaultExpectedRetransmissionTimeMs));
1601 1625
1602 hdr.rotation = kVideoRotation_0; 1626 hdr.rotation = kVideoRotation_0;
1603 EXPECT_TRUE(rtp_sender_video_->SendVideo(kRtpVideoGeneric, kVideoFrameDelta, 1627 EXPECT_TRUE(rtp_sender_video_->SendVideo(
1604 kPayload, kTimestamp + 1, 0, kFrame, 1628 kRtpVideoGeneric, kVideoFrameDelta, kPayload, kTimestamp + 1, 0, kFrame,
1605 sizeof(kFrame), nullptr, &hdr)); 1629 sizeof(kFrame), nullptr, &hdr, kDefaultExpectedRetransmissionTimeMs));
1606 1630
1607 VideoRotation rotation; 1631 VideoRotation rotation;
1608 EXPECT_TRUE( 1632 EXPECT_TRUE(
1609 transport_.last_sent_packet().GetExtension<VideoOrientation>(&rotation)); 1633 transport_.last_sent_packet().GetExtension<VideoOrientation>(&rotation));
1610 EXPECT_EQ(kVideoRotation_0, rotation); 1634 EXPECT_EQ(kVideoRotation_0, rotation);
1611 } 1635 }
1612 1636
1613 TEST_P(RtpSenderVideoTest, DeltaFrameHasCVOWhenNonZero) { 1637 TEST_P(RtpSenderVideoTest, DeltaFrameHasCVOWhenNonZero) {
1614 uint8_t kFrame[kMaxPacketLength]; 1638 uint8_t kFrame[kMaxPacketLength];
1615 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( 1639 EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
1616 kRtpExtensionVideoRotation, kVideoRotationExtensionId)); 1640 kRtpExtensionVideoRotation, kVideoRotationExtensionId));
1617 1641
1618 RTPVideoHeader hdr = {0}; 1642 RTPVideoHeader hdr = {0};
1619 hdr.rotation = kVideoRotation_90; 1643 hdr.rotation = kVideoRotation_90;
1620 EXPECT_TRUE(rtp_sender_video_->SendVideo(kRtpVideoGeneric, kVideoFrameKey, 1644 EXPECT_TRUE(rtp_sender_video_->SendVideo(
1621 kPayload, kTimestamp, 0, kFrame, 1645 kRtpVideoGeneric, kVideoFrameKey, kPayload, kTimestamp, 0, kFrame,
1622 sizeof(kFrame), nullptr, &hdr)); 1646 sizeof(kFrame), nullptr, &hdr, kDefaultExpectedRetransmissionTimeMs));
1623 1647
1624 EXPECT_TRUE(rtp_sender_video_->SendVideo(kRtpVideoGeneric, kVideoFrameDelta, 1648 EXPECT_TRUE(rtp_sender_video_->SendVideo(
1625 kPayload, kTimestamp + 1, 0, kFrame, 1649 kRtpVideoGeneric, kVideoFrameDelta, kPayload, kTimestamp + 1, 0, kFrame,
1626 sizeof(kFrame), nullptr, &hdr)); 1650 sizeof(kFrame), nullptr, &hdr, kDefaultExpectedRetransmissionTimeMs));
1627 1651
1628 VideoRotation rotation; 1652 VideoRotation rotation;
1629 EXPECT_TRUE( 1653 EXPECT_TRUE(
1630 transport_.last_sent_packet().GetExtension<VideoOrientation>(&rotation)); 1654 transport_.last_sent_packet().GetExtension<VideoOrientation>(&rotation));
1631 EXPECT_EQ(kVideoRotation_90, rotation); 1655 EXPECT_EQ(kVideoRotation_90, rotation);
1632 } 1656 }
1633 1657
1634 // Make sure rotation is parsed correctly when the Camera (C) and Flip (F) bits 1658 // Make sure rotation is parsed correctly when the Camera (C) and Flip (F) bits
1635 // are set in the CVO byte. 1659 // are set in the CVO byte.
1636 TEST_P(RtpSenderVideoTest, SendVideoWithCameraAndFlipCVO) { 1660 TEST_P(RtpSenderVideoTest, SendVideoWithCameraAndFlipCVO) {
1637 // Test extracting rotation when Camera (C) and Flip (F) bits are zero. 1661 // Test extracting rotation when Camera (C) and Flip (F) bits are zero.
1638 EXPECT_EQ(kVideoRotation_0, ConvertCVOByteToVideoRotation(0)); 1662 EXPECT_EQ(kVideoRotation_0, ConvertCVOByteToVideoRotation(0));
1639 EXPECT_EQ(kVideoRotation_90, ConvertCVOByteToVideoRotation(1)); 1663 EXPECT_EQ(kVideoRotation_90, ConvertCVOByteToVideoRotation(1));
1640 EXPECT_EQ(kVideoRotation_180, ConvertCVOByteToVideoRotation(2)); 1664 EXPECT_EQ(kVideoRotation_180, ConvertCVOByteToVideoRotation(2));
1641 EXPECT_EQ(kVideoRotation_270, ConvertCVOByteToVideoRotation(3)); 1665 EXPECT_EQ(kVideoRotation_270, ConvertCVOByteToVideoRotation(3));
1642 // Test extracting rotation when Camera (C) and Flip (F) bits are set. 1666 // Test extracting rotation when Camera (C) and Flip (F) bits are set.
1643 const int flip_bit = 1 << 2; 1667 const int flip_bit = 1 << 2;
1644 const int camera_bit = 1 << 3; 1668 const int camera_bit = 1 << 3;
1645 EXPECT_EQ(kVideoRotation_0, 1669 EXPECT_EQ(kVideoRotation_0,
1646 ConvertCVOByteToVideoRotation(flip_bit | camera_bit | 0)); 1670 ConvertCVOByteToVideoRotation(flip_bit | camera_bit | 0));
1647 EXPECT_EQ(kVideoRotation_90, 1671 EXPECT_EQ(kVideoRotation_90,
1648 ConvertCVOByteToVideoRotation(flip_bit | camera_bit | 1)); 1672 ConvertCVOByteToVideoRotation(flip_bit | camera_bit | 1));
1649 EXPECT_EQ(kVideoRotation_180, 1673 EXPECT_EQ(kVideoRotation_180,
1650 ConvertCVOByteToVideoRotation(flip_bit | camera_bit | 2)); 1674 ConvertCVOByteToVideoRotation(flip_bit | camera_bit | 2));
1651 EXPECT_EQ(kVideoRotation_270, 1675 EXPECT_EQ(kVideoRotation_270,
1652 ConvertCVOByteToVideoRotation(flip_bit | camera_bit | 3)); 1676 ConvertCVOByteToVideoRotation(flip_bit | camera_bit | 3));
1653 } 1677 }
1654 1678
1679 TEST_P(RtpSenderVideoTest, RetransmissionTypesGeneric) {
1680 RTPVideoHeader header;
1681 header.codec = kRtpVideoGeneric;
1682
1683 EXPECT_EQ(kDontRetransmit,
1684 rtp_sender_video_->GetStorageType(
1685 header, kRetransmitOff, kDefaultExpectedRetransmissionTimeMs));
1686 EXPECT_EQ(kAllowRetransmission, rtp_sender_video_->GetStorageType(
1687 header, kRetransmitBaseLayer,
1688 kDefaultExpectedRetransmissionTimeMs));
1689 EXPECT_EQ(kAllowRetransmission, rtp_sender_video_->GetStorageType(
1690 header, kRetransmitHigherLayers,
1691 kDefaultExpectedRetransmissionTimeMs));
1692 EXPECT_EQ(kAllowRetransmission,
1693 rtp_sender_video_->GetStorageType(
1694 header, kConditionallyRetransmitHigherLayers,
1695 kDefaultExpectedRetransmissionTimeMs));
1696 EXPECT_EQ(kAllowRetransmission, rtp_sender_video_->GetStorageType(
1697 header, kRetransmitAllPackets,
1698 kDefaultExpectedRetransmissionTimeMs));
1699 }
1700
1701 TEST_P(RtpSenderVideoTest, RetransmissionTypesH264) {
1702 RTPVideoHeader header;
1703 header.codec = kRtpVideoH264;
1704 header.codecHeader.H264.packetization_mode =
1705 H264PacketizationMode::NonInterleaved;
1706
1707 EXPECT_EQ(kDontRetransmit,
1708 rtp_sender_video_->GetStorageType(
1709 header, kRetransmitOff, kDefaultExpectedRetransmissionTimeMs));
1710 EXPECT_EQ(kAllowRetransmission, rtp_sender_video_->GetStorageType(
1711 header, kRetransmitBaseLayer,
1712 kDefaultExpectedRetransmissionTimeMs));
1713 EXPECT_EQ(kAllowRetransmission, rtp_sender_video_->GetStorageType(
1714 header, kRetransmitHigherLayers,
1715 kDefaultExpectedRetransmissionTimeMs));
1716 EXPECT_EQ(kAllowRetransmission,
1717 rtp_sender_video_->GetStorageType(
1718 header, kConditionallyRetransmitHigherLayers,
1719 kDefaultExpectedRetransmissionTimeMs));
1720 EXPECT_EQ(kAllowRetransmission, rtp_sender_video_->GetStorageType(
1721 header, kRetransmitAllPackets,
1722 kDefaultExpectedRetransmissionTimeMs));
1723 }
1724
1725 TEST_P(RtpSenderVideoTest, RetransmissionTypesVP8BaseLayer) {
1726 RTPVideoHeader header;
1727 header.codec = kRtpVideoVp8;
1728 header.codecHeader.VP8.temporalIdx = 0;
1729
1730 EXPECT_EQ(kDontRetransmit,
1731 rtp_sender_video_->GetStorageType(
1732 header, kRetransmitOff, kDefaultExpectedRetransmissionTimeMs));
1733 EXPECT_EQ(kAllowRetransmission, rtp_sender_video_->GetStorageType(
1734 header, kRetransmitBaseLayer,
1735 kDefaultExpectedRetransmissionTimeMs));
1736 EXPECT_EQ(kDontRetransmit, rtp_sender_video_->GetStorageType(
1737 header, kRetransmitHigherLayers,
1738 kDefaultExpectedRetransmissionTimeMs));
1739 EXPECT_EQ(kAllowRetransmission,
1740 rtp_sender_video_->GetStorageType(
1741 header, kRetransmitHigherLayers | kRetransmitBaseLayer,
1742 kDefaultExpectedRetransmissionTimeMs));
1743 EXPECT_EQ(kDontRetransmit, rtp_sender_video_->GetStorageType(
1744 header, kConditionallyRetransmitHigherLayers,
1745 kDefaultExpectedRetransmissionTimeMs));
1746 EXPECT_EQ(
1747 kAllowRetransmission,
1748 rtp_sender_video_->GetStorageType(
1749 header, kRetransmitBaseLayer | kConditionallyRetransmitHigherLayers,
1750 kDefaultExpectedRetransmissionTimeMs));
1751 EXPECT_EQ(kAllowRetransmission, rtp_sender_video_->GetStorageType(
1752 header, kRetransmitAllPackets,
1753 kDefaultExpectedRetransmissionTimeMs));
1754 }
1755
1756 TEST_P(RtpSenderVideoTest, RetransmissionTypesVP8HigherLayers) {
1757 RTPVideoHeader header;
1758 header.codec = kRtpVideoVp8;
1759
1760 for (int tid = 1; tid <= kMaxTemporalStreams; ++tid) {
1761 header.codecHeader.VP8.temporalIdx = tid;
1762
1763 EXPECT_EQ(kDontRetransmit, rtp_sender_video_->GetStorageType(
1764 header, kRetransmitOff,
1765 kDefaultExpectedRetransmissionTimeMs));
1766 EXPECT_EQ(kDontRetransmit, rtp_sender_video_->GetStorageType(
1767 header, kRetransmitBaseLayer,
1768 kDefaultExpectedRetransmissionTimeMs));
1769 EXPECT_EQ(kAllowRetransmission, rtp_sender_video_->GetStorageType(
1770 header, kRetransmitHigherLayers,
1771 kDefaultExpectedRetransmissionTimeMs));
1772 EXPECT_EQ(kAllowRetransmission,
1773 rtp_sender_video_->GetStorageType(
1774 header, kRetransmitHigherLayers | kRetransmitBaseLayer,
1775 kDefaultExpectedRetransmissionTimeMs));
1776 EXPECT_EQ(kAllowRetransmission, rtp_sender_video_->GetStorageType(
1777 header, kRetransmitAllPackets,
1778 kDefaultExpectedRetransmissionTimeMs));
1779 }
1780 }
1781
1782 TEST_P(RtpSenderVideoTest, RetransmissionTypesVP9) {
1783 RTPVideoHeader header;
1784 header.codec = kRtpVideoVp9;
1785
1786 for (int tid = 1; tid <= kMaxTemporalStreams; ++tid) {
1787 header.codecHeader.VP9.temporal_idx = tid;
1788
1789 EXPECT_EQ(kDontRetransmit, rtp_sender_video_->GetStorageType(
1790 header, kRetransmitOff,
1791 kDefaultExpectedRetransmissionTimeMs));
1792 EXPECT_EQ(kDontRetransmit, rtp_sender_video_->GetStorageType(
1793 header, kRetransmitBaseLayer,
1794 kDefaultExpectedRetransmissionTimeMs));
1795 EXPECT_EQ(kAllowRetransmission, rtp_sender_video_->GetStorageType(
1796 header, kRetransmitHigherLayers,
1797 kDefaultExpectedRetransmissionTimeMs));
1798 EXPECT_EQ(kAllowRetransmission,
1799 rtp_sender_video_->GetStorageType(
1800 header, kRetransmitHigherLayers | kRetransmitBaseLayer,
1801 kDefaultExpectedRetransmissionTimeMs));
1802 EXPECT_EQ(kAllowRetransmission, rtp_sender_video_->GetStorageType(
1803 header, kRetransmitAllPackets,
1804 kDefaultExpectedRetransmissionTimeMs));
1805 }
1806 }
1807
1808 TEST_P(RtpSenderVideoTest, ConditionalRetransmit) {
1809 const int64_t kFrameIntervalMs = 33;
1810 const int64_t kRttMs = (kFrameIntervalMs * 3) / 2;
1811 const uint8_t kSettings =
1812 kRetransmitBaseLayer | kConditionallyRetransmitHigherLayers;
1813
1814 // Insert VP8 frames for all temporal layers, but stop before the final index.
1815 RTPVideoHeader header;
1816 header.codec = kRtpVideoVp8;
1817
1818 // Fill averaging window to prevent rounding errors.
1819 constexpr int kNumRepetitions =
1820 (RTPSenderVideo::kTLRateWindowSizeMs + (kFrameIntervalMs / 2)) /
1821 kFrameIntervalMs;
1822 constexpr int kPattern[] = {0, 2, 1, 2};
1823 for (size_t i = 0; i < arraysize(kPattern) * kNumRepetitions; ++i) {
1824 header.codecHeader.VP8.temporalIdx = kPattern[i % arraysize(kPattern)];
1825 rtp_sender_video_->GetStorageType(header, kSettings, kRttMs);
1826 fake_clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
1827 }
1828
1829 // Since we're at the start of the pattern, the next expected frame in TL0 is
1830 // right now. We will wait at most one expected retransmission time before
1831 // acknowledging that it did not arrive, which means this frame and the next
1832 // will not be retransmitted.
1833 header.codecHeader.VP8.temporalIdx = 1;
1834 EXPECT_EQ(StorageType::kDontRetransmit,
1835 rtp_sender_video_->GetStorageType(header, kSettings, kRttMs));
1836 fake_clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
1837 EXPECT_EQ(StorageType::kDontRetransmit,
1838 rtp_sender_video_->GetStorageType(header, kSettings, kRttMs));
1839 fake_clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
1840
1841 // The TL0 frame did not arrive. So allow retransmission.
1842 EXPECT_EQ(StorageType::kAllowRetransmission,
1843 rtp_sender_video_->GetStorageType(header, kSettings, kRttMs));
1844 fake_clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
1845
1846 // Insert a frame for TL2. We just had frame in TL1, so the next one there is
1847 // in three frames away. TL0 is still too far in the past. So, allow
1848 // retransmission.
1849 header.codecHeader.VP8.temporalIdx = 2;
1850 EXPECT_EQ(StorageType::kAllowRetransmission,
1851 rtp_sender_video_->GetStorageType(header, kSettings, kRttMs));
1852 fake_clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
1853
1854 // Another TL2, next in TL1 is two frames away. Allow again.
1855 EXPECT_EQ(StorageType::kAllowRetransmission,
1856 rtp_sender_video_->GetStorageType(header, kSettings, kRttMs));
1857 fake_clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
1858
1859 // Yet another TL2, next in TL1 is now only one frame away, so don't store
1860 // for retransmission.
1861 EXPECT_EQ(StorageType::kDontRetransmit,
1862 rtp_sender_video_->GetStorageType(header, kSettings, kRttMs));
1863 }
1864
1865 TEST_P(RtpSenderVideoTest, ConditionalRetransmitLimit) {
1866 const int64_t kFrameIntervalMs = 200;
1867 const int64_t kRttMs = (kFrameIntervalMs * 3) / 2;
1868 const int32_t kSettings =
1869 kRetransmitBaseLayer | kConditionallyRetransmitHigherLayers;
1870
1871 // Insert VP8 frames for all temporal layers, but stop before the final index.
1872 RTPVideoHeader header;
1873 header.codec = kRtpVideoVp8;
1874
1875 // Fill averaging window to prevent rounding errors.
1876 constexpr int kNumRepetitions =
1877 (RTPSenderVideo::kTLRateWindowSizeMs + (kFrameIntervalMs / 2)) /
1878 kFrameIntervalMs;
1879 constexpr int kPattern[] = {0, 2, 2, 2};
1880 for (size_t i = 0; i < arraysize(kPattern) * kNumRepetitions; ++i) {
1881 header.codecHeader.VP8.temporalIdx = kPattern[i % arraysize(kPattern)];
1882
1883 rtp_sender_video_->GetStorageType(header, kSettings, kRttMs);
1884 fake_clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
1885 }
1886
1887 // Since we're at the start of the pattern, the next expected frame will be
1888 // right now in TL0. Put it in TL1 instead. Regular rules would dictate that
1889 // we don't store for retransmission because we expect a frame in a lower
1890 // layer, but that last frame in TL1 was a long time ago in absolute terms,
1891 // so allow retransmission anyway.
1892 header.codecHeader.VP8.temporalIdx = 1;
1893 EXPECT_EQ(StorageType::kAllowRetransmission,
1894 rtp_sender_video_->GetStorageType(header, kSettings, kRttMs));
1895 }
1896
1655 TEST_P(RtpSenderTest, OnOverheadChanged) { 1897 TEST_P(RtpSenderTest, OnOverheadChanged) {
1656 MockOverheadObserver mock_overhead_observer; 1898 MockOverheadObserver mock_overhead_observer;
1657 rtp_sender_.reset( 1899 rtp_sender_.reset(
1658 new RTPSender(false, &fake_clock_, &transport_, nullptr, nullptr, nullptr, 1900 new RTPSender(false, &fake_clock_, &transport_, nullptr, nullptr, nullptr,
1659 nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, 1901 nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
1660 &retransmission_rate_limiter_, &mock_overhead_observer)); 1902 &retransmission_rate_limiter_, &mock_overhead_observer));
1661 rtp_sender_->SetSSRC(kSsrc); 1903 rtp_sender_->SetSSRC(kSsrc);
1662 1904
1663 // RTP overhead is 12B. 1905 // RTP overhead is 12B.
1664 EXPECT_CALL(mock_overhead_observer, OnOverheadChanged(12)).Times(1); 1906 EXPECT_CALL(mock_overhead_observer, OnOverheadChanged(12)).Times(1);
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
1753 INSTANTIATE_TEST_CASE_P(WithAndWithoutOverhead, 1995 INSTANTIATE_TEST_CASE_P(WithAndWithoutOverhead,
1754 RtpSenderTestWithoutPacer, 1996 RtpSenderTestWithoutPacer,
1755 ::testing::Bool()); 1997 ::testing::Bool());
1756 INSTANTIATE_TEST_CASE_P(WithAndWithoutOverhead, 1998 INSTANTIATE_TEST_CASE_P(WithAndWithoutOverhead,
1757 RtpSenderVideoTest, 1999 RtpSenderVideoTest,
1758 ::testing::Bool()); 2000 ::testing::Bool());
1759 INSTANTIATE_TEST_CASE_P(WithAndWithoutOverhead, 2001 INSTANTIATE_TEST_CASE_P(WithAndWithoutOverhead,
1760 RtpSenderAudioTest, 2002 RtpSenderAudioTest,
1761 ::testing::Bool()); 2003 ::testing::Bool());
1762 } // namespace webrtc 2004 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/rtp_rtcp/source/rtp_sender.cc ('k') | webrtc/modules/rtp_rtcp/source/rtp_sender_video.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698