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