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 | 11 |
12 /* | 12 /* |
13 * This file includes unit tests for the RTCPReceiver. | 13 * This file includes unit tests for the RTCPReceiver. |
14 */ | 14 */ |
15 #include "testing/gmock/include/gmock/gmock.h" | 15 #include "testing/gmock/include/gmock/gmock.h" |
16 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
17 | 17 |
18 #include "webrtc/common_types.h" | 18 #include "webrtc/common_types.h" |
19 #include "webrtc/modules/remote_bitrate_estimator/include/mock/mock_remote_bitra
te_observer.h" | 19 #include "webrtc/modules/remote_bitrate_estimator/include/mock/mock_remote_bitra
te_observer.h" |
20 #include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_singl
e_stream.h" | 20 #include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_singl
e_stream.h" |
21 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" | 21 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" |
22 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h" | 22 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h" |
23 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/app.h" | 23 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/app.h" |
24 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/bye.h" | 24 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/bye.h" |
| 25 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/compound_packet.h" |
25 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_jitter_report.h" | 26 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_jitter_report.h" |
26 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_reports.h" | 27 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_reports.h" |
27 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/fir.h" | 28 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/fir.h" |
28 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/pli.h" | 29 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/pli.h" |
29 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h" | 30 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h" |
30 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/remb.h" | 31 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/remb.h" |
31 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sdes.h" | 32 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sdes.h" |
32 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h" | 33 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h" |
33 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sli.h" | 34 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sli.h" |
34 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmbr.h" | 35 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmbr.h" |
(...skipping 961 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
996 std::set<uint32_t> ssrcs; | 997 std::set<uint32_t> ssrcs; |
997 ssrcs.insert(kMediaFlowSsrc); // Matches "media source" above. | 998 ssrcs.insert(kMediaFlowSsrc); // Matches "media source" above. |
998 rtcp_receiver_->SetSsrcs(kMediaFlowSsrc, ssrcs); | 999 rtcp_receiver_->SetSsrcs(kMediaFlowSsrc, ssrcs); |
999 | 1000 |
1000 rtcp::Tmmbr tmmbr; | 1001 rtcp::Tmmbr tmmbr; |
1001 tmmbr.From(kSenderSsrc); | 1002 tmmbr.From(kSenderSsrc); |
1002 tmmbr.WithTmmbr(rtcp::TmmbItem(kMediaFlowSsrc, 30000, 0)); | 1003 tmmbr.WithTmmbr(rtcp::TmmbItem(kMediaFlowSsrc, 30000, 0)); |
1003 | 1004 |
1004 rtcp::SenderReport sr; | 1005 rtcp::SenderReport sr; |
1005 sr.From(kSenderSsrc); | 1006 sr.From(kSenderSsrc); |
1006 sr.Append(&tmmbr); | 1007 rtcp::CompoundPacket compound; |
1007 rtc::Buffer packet = sr.Build(); | 1008 compound.Append(&sr); |
| 1009 compound.Append(&tmmbr); |
| 1010 rtc::Buffer packet = compound.Build(); |
1008 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); | 1011 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); |
1009 | 1012 |
1010 EXPECT_EQ(1, rtcp_receiver_->TMMBRReceived(0, 0, nullptr)); | 1013 EXPECT_EQ(1, rtcp_receiver_->TMMBRReceived(0, 0, nullptr)); |
1011 TMMBRSet candidate_set; | 1014 TMMBRSet candidate_set; |
1012 candidate_set.VerifyAndAllocateSet(1); | 1015 candidate_set.VerifyAndAllocateSet(1); |
1013 EXPECT_EQ(1, rtcp_receiver_->TMMBRReceived(1, 0, &candidate_set)); | 1016 EXPECT_EQ(1, rtcp_receiver_->TMMBRReceived(1, 0, &candidate_set)); |
1014 EXPECT_LT(0U, candidate_set.Tmmbr(0)); | 1017 EXPECT_LT(0U, candidate_set.Tmmbr(0)); |
1015 EXPECT_EQ(kSenderSsrc, candidate_set.Ssrc(0)); | 1018 EXPECT_EQ(kSenderSsrc, candidate_set.Ssrc(0)); |
1016 } | 1019 } |
1017 | 1020 |
1018 TEST_F(RtcpReceiverTest, TmmbrPacketNotForUsIgnored) { | 1021 TEST_F(RtcpReceiverTest, TmmbrPacketNotForUsIgnored) { |
1019 const uint32_t kMediaFlowSsrc = 0x2040608; | 1022 const uint32_t kMediaFlowSsrc = 0x2040608; |
1020 const uint32_t kSenderSsrc = 0x10203; | 1023 const uint32_t kSenderSsrc = 0x10203; |
1021 | 1024 |
1022 rtcp::Tmmbr tmmbr; | 1025 rtcp::Tmmbr tmmbr; |
1023 tmmbr.From(kSenderSsrc); | 1026 tmmbr.From(kSenderSsrc); |
1024 // This SSRC is not what we are sending. | 1027 // This SSRC is not what we are sending. |
1025 tmmbr.WithTmmbr(rtcp::TmmbItem(kMediaFlowSsrc + 1, 30000, 0)); | 1028 tmmbr.WithTmmbr(rtcp::TmmbItem(kMediaFlowSsrc + 1, 30000, 0)); |
1026 | 1029 |
1027 rtcp::SenderReport sr; | 1030 rtcp::SenderReport sr; |
1028 sr.From(kSenderSsrc); | 1031 sr.From(kSenderSsrc); |
1029 sr.Append(&tmmbr); | 1032 rtcp::CompoundPacket compound; |
1030 rtc::Buffer packet = sr.Build(); | 1033 compound.Append(&sr); |
| 1034 compound.Append(&tmmbr); |
| 1035 rtc::Buffer packet = compound.Build(); |
1031 | 1036 |
1032 std::set<uint32_t> ssrcs; | 1037 std::set<uint32_t> ssrcs; |
1033 ssrcs.insert(kMediaFlowSsrc); | 1038 ssrcs.insert(kMediaFlowSsrc); |
1034 rtcp_receiver_->SetSsrcs(kMediaFlowSsrc, ssrcs); | 1039 rtcp_receiver_->SetSsrcs(kMediaFlowSsrc, ssrcs); |
1035 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); | 1040 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); |
1036 EXPECT_EQ(0, rtcp_receiver_->TMMBRReceived(0, 0, nullptr)); | 1041 EXPECT_EQ(0, rtcp_receiver_->TMMBRReceived(0, 0, nullptr)); |
1037 } | 1042 } |
1038 | 1043 |
1039 TEST_F(RtcpReceiverTest, TmmbrPacketZeroRateIgnored) { | 1044 TEST_F(RtcpReceiverTest, TmmbrPacketZeroRateIgnored) { |
1040 const uint32_t kMediaFlowSsrc = 0x2040608; | 1045 const uint32_t kMediaFlowSsrc = 0x2040608; |
1041 const uint32_t kSenderSsrc = 0x10203; | 1046 const uint32_t kSenderSsrc = 0x10203; |
1042 std::set<uint32_t> ssrcs; | 1047 std::set<uint32_t> ssrcs; |
1043 ssrcs.insert(kMediaFlowSsrc); // Matches "media source" above. | 1048 ssrcs.insert(kMediaFlowSsrc); // Matches "media source" above. |
1044 rtcp_receiver_->SetSsrcs(kMediaFlowSsrc, ssrcs); | 1049 rtcp_receiver_->SetSsrcs(kMediaFlowSsrc, ssrcs); |
1045 | 1050 |
1046 rtcp::Tmmbr tmmbr; | 1051 rtcp::Tmmbr tmmbr; |
1047 tmmbr.From(kSenderSsrc); | 1052 tmmbr.From(kSenderSsrc); |
1048 tmmbr.WithTmmbr(rtcp::TmmbItem(kMediaFlowSsrc, 0, 0)); | 1053 tmmbr.WithTmmbr(rtcp::TmmbItem(kMediaFlowSsrc, 0, 0)); |
1049 | 1054 |
1050 rtcp::SenderReport sr; | 1055 rtcp::SenderReport sr; |
1051 sr.From(kSenderSsrc); | 1056 sr.From(kSenderSsrc); |
1052 sr.Append(&tmmbr); | 1057 rtcp::CompoundPacket compound; |
1053 rtc::Buffer packet = sr.Build(); | 1058 compound.Append(&sr); |
| 1059 compound.Append(&tmmbr); |
| 1060 rtc::Buffer packet = compound.Build(); |
1054 | 1061 |
1055 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); | 1062 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); |
1056 EXPECT_EQ(0, rtcp_receiver_->TMMBRReceived(0, 0, nullptr)); | 1063 EXPECT_EQ(0, rtcp_receiver_->TMMBRReceived(0, 0, nullptr)); |
1057 } | 1064 } |
1058 | 1065 |
1059 TEST_F(RtcpReceiverTest, TmmbrThreeConstraintsTimeOut) { | 1066 TEST_F(RtcpReceiverTest, TmmbrThreeConstraintsTimeOut) { |
1060 const uint32_t kMediaFlowSsrc = 0x2040608; | 1067 const uint32_t kMediaFlowSsrc = 0x2040608; |
1061 const uint32_t kSenderSsrc = 0x10203; | 1068 const uint32_t kSenderSsrc = 0x10203; |
1062 std::set<uint32_t> ssrcs; | 1069 std::set<uint32_t> ssrcs; |
1063 ssrcs.insert(kMediaFlowSsrc); // Matches "media source" above. | 1070 ssrcs.insert(kMediaFlowSsrc); // Matches "media source" above. |
1064 rtcp_receiver_->SetSsrcs(kMediaFlowSsrc, ssrcs); | 1071 rtcp_receiver_->SetSsrcs(kMediaFlowSsrc, ssrcs); |
1065 | 1072 |
1066 // Inject 3 packets "from" kSenderSsrc, kSenderSsrc+1, kSenderSsrc+2. | 1073 // Inject 3 packets "from" kSenderSsrc, kSenderSsrc+1, kSenderSsrc+2. |
1067 // The times of arrival are starttime + 0, starttime + 5 and starttime + 10. | 1074 // The times of arrival are starttime + 0, starttime + 5 and starttime + 10. |
1068 for (uint32_t ssrc = kSenderSsrc; ssrc < kSenderSsrc + 3; ++ssrc) { | 1075 for (uint32_t ssrc = kSenderSsrc; ssrc < kSenderSsrc + 3; ++ssrc) { |
1069 rtcp::Tmmbr tmmbr; | 1076 rtcp::Tmmbr tmmbr; |
1070 tmmbr.From(ssrc); | 1077 tmmbr.From(ssrc); |
1071 tmmbr.WithTmmbr(rtcp::TmmbItem(kMediaFlowSsrc, 30000, 0)); | 1078 tmmbr.WithTmmbr(rtcp::TmmbItem(kMediaFlowSsrc, 30000, 0)); |
1072 | 1079 |
1073 rtcp::SenderReport sr; | 1080 rtcp::SenderReport sr; |
1074 sr.From(ssrc); | 1081 sr.From(ssrc); |
1075 sr.Append(&tmmbr); | 1082 rtcp::CompoundPacket compound; |
1076 rtc::Buffer packet = sr.Build(); | 1083 compound.Append(&sr); |
| 1084 compound.Append(&tmmbr); |
| 1085 rtc::Buffer packet = compound.Build(); |
1077 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); | 1086 EXPECT_EQ(0, InjectRtcpPacket(packet.data(), packet.size())); |
1078 // 5 seconds between each packet. | 1087 // 5 seconds between each packet. |
1079 system_clock_.AdvanceTimeMilliseconds(5000); | 1088 system_clock_.AdvanceTimeMilliseconds(5000); |
1080 } | 1089 } |
1081 // It is now starttime + 15. | 1090 // It is now starttime + 15. |
1082 EXPECT_EQ(3, rtcp_receiver_->TMMBRReceived(0, 0, nullptr)); | 1091 EXPECT_EQ(3, rtcp_receiver_->TMMBRReceived(0, 0, nullptr)); |
1083 TMMBRSet candidate_set; | 1092 TMMBRSet candidate_set; |
1084 candidate_set.VerifyAndAllocateSet(3); | 1093 candidate_set.VerifyAndAllocateSet(3); |
1085 EXPECT_EQ(3, rtcp_receiver_->TMMBRReceived(3, 0, &candidate_set)); | 1094 EXPECT_EQ(3, rtcp_receiver_->TMMBRReceived(3, 0, &candidate_set)); |
1086 EXPECT_LT(0U, candidate_set.Tmmbr(0)); | 1095 EXPECT_LT(0U, candidate_set.Tmmbr(0)); |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1202 rtcp::TransportFeedback packet; | 1211 rtcp::TransportFeedback packet; |
1203 packet.WithMediaSourceSsrc(kSourceSsrc); | 1212 packet.WithMediaSourceSsrc(kSourceSsrc); |
1204 packet.WithPacketSenderSsrc(kSenderSsrc); | 1213 packet.WithPacketSenderSsrc(kSenderSsrc); |
1205 packet.WithBase(1, 1000); | 1214 packet.WithBase(1, 1000); |
1206 packet.WithReceivedPacket(1, 1000); | 1215 packet.WithReceivedPacket(1, 1000); |
1207 | 1216 |
1208 static uint32_t kBitrateBps = 50000; | 1217 static uint32_t kBitrateBps = 50000; |
1209 rtcp::Remb remb; | 1218 rtcp::Remb remb; |
1210 remb.From(kSourceSsrc); | 1219 remb.From(kSourceSsrc); |
1211 remb.WithBitrateBps(kBitrateBps); | 1220 remb.WithBitrateBps(kBitrateBps); |
1212 packet.Append(&remb); | 1221 rtcp::CompoundPacket compound; |
1213 | 1222 compound.Append(&packet); |
1214 rtc::Buffer built_packet = packet.Build(); | 1223 compound.Append(&remb); |
| 1224 rtc::Buffer built_packet = compound.Build(); |
1215 | 1225 |
1216 // Modify the TransportFeedback packet so that it is invalid. | 1226 // Modify the TransportFeedback packet so that it is invalid. |
1217 const size_t kStatusCountOffset = 14; | 1227 const size_t kStatusCountOffset = 14; |
1218 ByteWriter<uint16_t>::WriteBigEndian( | 1228 ByteWriter<uint16_t>::WriteBigEndian( |
1219 &built_packet.data()[kStatusCountOffset], 42); | 1229 &built_packet.data()[kStatusCountOffset], 42); |
1220 | 1230 |
1221 EXPECT_EQ(0, InjectRtcpPacket(built_packet.data(), built_packet.size())); | 1231 EXPECT_EQ(0, InjectRtcpPacket(built_packet.data(), built_packet.size())); |
1222 | 1232 |
1223 // Transport feedback should be ignored, but next packet should work. | 1233 // Transport feedback should be ignored, but next packet should work. |
1224 EXPECT_EQ(0u, rtcp_packet_info_.rtcpPacketTypeFlags & kRtcpTransportFeedback); | 1234 EXPECT_EQ(0u, rtcp_packet_info_.rtcpPacketTypeFlags & kRtcpTransportFeedback); |
1225 EXPECT_NE(0u, rtcp_packet_info_.rtcpPacketTypeFlags & kRtcpRemb); | 1235 EXPECT_NE(0u, rtcp_packet_info_.rtcpPacketTypeFlags & kRtcpRemb); |
1226 EXPECT_EQ(kBitrateBps, rtcp_packet_info_.receiverEstimatedMaxBitrate); | 1236 EXPECT_EQ(kBitrateBps, rtcp_packet_info_.receiverEstimatedMaxBitrate); |
1227 } | 1237 } |
1228 | 1238 |
1229 } // Anonymous namespace | 1239 } // Anonymous namespace |
1230 | 1240 |
1231 } // namespace webrtc | 1241 } // namespace webrtc |
OLD | NEW |