15e023eb337eed9746ecea7fc6fbb0fca386f1961sprang/* 25e023eb337eed9746ecea7fc6fbb0fca386f1961sprang * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. 35e023eb337eed9746ecea7fc6fbb0fca386f1961sprang * 45e023eb337eed9746ecea7fc6fbb0fca386f1961sprang * Use of this source code is governed by a BSD-style license 55e023eb337eed9746ecea7fc6fbb0fca386f1961sprang * that can be found in the LICENSE file in the root of the source 65e023eb337eed9746ecea7fc6fbb0fca386f1961sprang * tree. An additional intellectual property rights grant can be found 75e023eb337eed9746ecea7fc6fbb0fca386f1961sprang * in the file PATENTS. All contributing project authors may 85e023eb337eed9746ecea7fc6fbb0fca386f1961sprang * be found in the AUTHORS file in the root of the source tree. 95e023eb337eed9746ecea7fc6fbb0fca386f1961sprang */ 105e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 115e023eb337eed9746ecea7fc6fbb0fca386f1961sprang#include <limits> 125e023eb337eed9746ecea7fc6fbb0fca386f1961sprang#include <vector> 135e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 145e023eb337eed9746ecea7fc6fbb0fca386f1961sprang#include "testing/gmock/include/gmock/gmock.h" 155e023eb337eed9746ecea7fc6fbb0fca386f1961sprang#include "testing/gtest/include/gtest/gtest.h" 165e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 175e023eb337eed9746ecea7fc6fbb0fca386f1961sprang#include "webrtc/base/checks.h" 185e023eb337eed9746ecea7fc6fbb0fca386f1961sprang#include "webrtc/base/scoped_ptr.h" 195e023eb337eed9746ecea7fc6fbb0fca386f1961sprang#include "webrtc/modules/remote_bitrate_estimator/include/mock/mock_remote_bitrate_estimator.h" 205e023eb337eed9746ecea7fc6fbb0fca386f1961sprang#include "webrtc/modules/remote_bitrate_estimator/transport_feedback_adapter.h" 21ff761fba8274d93bd73e76c8b8a1f2d0776dd840Henrik Kjellander#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" 225e023eb337eed9746ecea7fc6fbb0fca386f1961sprang#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" 23ff761fba8274d93bd73e76c8b8a1f2d0776dd840Henrik Kjellander#include "webrtc/modules/utility/include/mock/mock_process_thread.h" 2498f53510b222f71fdd8b799b2f33737ceeb28c61Henrik Kjellander#include "webrtc/system_wrappers/include/clock.h" 255e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 265e023eb337eed9746ecea7fc6fbb0fca386f1961sprangusing ::testing::_; 275e023eb337eed9746ecea7fc6fbb0fca386f1961sprangusing ::testing::Invoke; 285e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 295e023eb337eed9746ecea7fc6fbb0fca386f1961sprangnamespace webrtc { 305e023eb337eed9746ecea7fc6fbb0fca386f1961sprangnamespace test { 315e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 325e023eb337eed9746ecea7fc6fbb0fca386f1961sprangclass TransportFeedbackAdapterTest : public ::testing::Test { 335e023eb337eed9746ecea7fc6fbb0fca386f1961sprang public: 345e023eb337eed9746ecea7fc6fbb0fca386f1961sprang TransportFeedbackAdapterTest() 355e023eb337eed9746ecea7fc6fbb0fca386f1961sprang : clock_(0), 365e023eb337eed9746ecea7fc6fbb0fca386f1961sprang bitrate_estimator_(nullptr), 375e023eb337eed9746ecea7fc6fbb0fca386f1961sprang receiver_estimated_bitrate_(0) {} 385e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 395e023eb337eed9746ecea7fc6fbb0fca386f1961sprang virtual ~TransportFeedbackAdapterTest() {} 405e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 415e023eb337eed9746ecea7fc6fbb0fca386f1961sprang virtual void SetUp() { 425e023eb337eed9746ecea7fc6fbb0fca386f1961sprang adapter_.reset(new TransportFeedbackAdapter( 435e023eb337eed9746ecea7fc6fbb0fca386f1961sprang new RtcpBandwidthObserverAdapter(this), &clock_, &process_thread_)); 445e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 455e023eb337eed9746ecea7fc6fbb0fca386f1961sprang bitrate_estimator_ = new MockRemoteBitrateEstimator(); 465e023eb337eed9746ecea7fc6fbb0fca386f1961sprang EXPECT_CALL(process_thread_, RegisterModule(bitrate_estimator_)).Times(1); 475e023eb337eed9746ecea7fc6fbb0fca386f1961sprang adapter_->SetBitrateEstimator(bitrate_estimator_); 485e023eb337eed9746ecea7fc6fbb0fca386f1961sprang } 495e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 505e023eb337eed9746ecea7fc6fbb0fca386f1961sprang virtual void TearDown() { 515e023eb337eed9746ecea7fc6fbb0fca386f1961sprang EXPECT_CALL(process_thread_, DeRegisterModule(bitrate_estimator_)).Times(1); 525e023eb337eed9746ecea7fc6fbb0fca386f1961sprang adapter_.reset(); 535e023eb337eed9746ecea7fc6fbb0fca386f1961sprang } 545e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 555e023eb337eed9746ecea7fc6fbb0fca386f1961sprang protected: 565e023eb337eed9746ecea7fc6fbb0fca386f1961sprang // Proxy class used since TransportFeedbackAdapter will own the instance 575e023eb337eed9746ecea7fc6fbb0fca386f1961sprang // passed at construction. 585e023eb337eed9746ecea7fc6fbb0fca386f1961sprang class RtcpBandwidthObserverAdapter : public RtcpBandwidthObserver { 595e023eb337eed9746ecea7fc6fbb0fca386f1961sprang public: 605e023eb337eed9746ecea7fc6fbb0fca386f1961sprang explicit RtcpBandwidthObserverAdapter(TransportFeedbackAdapterTest* owner) 615e023eb337eed9746ecea7fc6fbb0fca386f1961sprang : owner_(owner) {} 625e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 635e023eb337eed9746ecea7fc6fbb0fca386f1961sprang void OnReceivedEstimatedBitrate(uint32_t bitrate) override { 645e023eb337eed9746ecea7fc6fbb0fca386f1961sprang owner_->receiver_estimated_bitrate_ = bitrate; 655e023eb337eed9746ecea7fc6fbb0fca386f1961sprang } 665e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 675e023eb337eed9746ecea7fc6fbb0fca386f1961sprang void OnReceivedRtcpReceiverReport(const ReportBlockList& report_blocks, 685e023eb337eed9746ecea7fc6fbb0fca386f1961sprang int64_t rtt, 695e023eb337eed9746ecea7fc6fbb0fca386f1961sprang int64_t now_ms) override { 705e023eb337eed9746ecea7fc6fbb0fca386f1961sprang RTC_NOTREACHED(); 715e023eb337eed9746ecea7fc6fbb0fca386f1961sprang } 725e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 735e023eb337eed9746ecea7fc6fbb0fca386f1961sprang TransportFeedbackAdapterTest* const owner_; 745e023eb337eed9746ecea7fc6fbb0fca386f1961sprang }; 755e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 765e023eb337eed9746ecea7fc6fbb0fca386f1961sprang void OnReceivedEstimatedBitrate(uint32_t bitrate) {} 775e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 785e023eb337eed9746ecea7fc6fbb0fca386f1961sprang void OnReceivedRtcpReceiverReport(const ReportBlockList& report_blocks, 795e023eb337eed9746ecea7fc6fbb0fca386f1961sprang int64_t rtt, 805e023eb337eed9746ecea7fc6fbb0fca386f1961sprang int64_t now_ms) {} 815e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 825e023eb337eed9746ecea7fc6fbb0fca386f1961sprang void ComparePacketVectors(const std::vector<PacketInfo>& truth, 835e023eb337eed9746ecea7fc6fbb0fca386f1961sprang const std::vector<PacketInfo>& input) { 845e023eb337eed9746ecea7fc6fbb0fca386f1961sprang ASSERT_EQ(truth.size(), input.size()); 855e023eb337eed9746ecea7fc6fbb0fca386f1961sprang size_t len = truth.size(); 865e023eb337eed9746ecea7fc6fbb0fca386f1961sprang // truth contains the input data for the test, and input is what will be 875e023eb337eed9746ecea7fc6fbb0fca386f1961sprang // sent to the bandwidth estimator. truth.arrival_tims_ms is used to 885e023eb337eed9746ecea7fc6fbb0fca386f1961sprang // populate the transport feedback messages. As these times may be changed 895e023eb337eed9746ecea7fc6fbb0fca386f1961sprang // (because of resolution limits in the packets, and because of the time 905e023eb337eed9746ecea7fc6fbb0fca386f1961sprang // base adjustment performed by the TransportFeedbackAdapter at the first 915e023eb337eed9746ecea7fc6fbb0fca386f1961sprang // packet, the truth[x].arrival_time and input[x].arrival_time may not be 925e023eb337eed9746ecea7fc6fbb0fca386f1961sprang // equal. However, the difference must be the same for all x. 935e023eb337eed9746ecea7fc6fbb0fca386f1961sprang int64_t arrival_time_delta = 945e023eb337eed9746ecea7fc6fbb0fca386f1961sprang truth[0].arrival_time_ms - input[0].arrival_time_ms; 955e023eb337eed9746ecea7fc6fbb0fca386f1961sprang for (size_t i = 0; i < len; ++i) { 965e023eb337eed9746ecea7fc6fbb0fca386f1961sprang EXPECT_EQ(truth[i].arrival_time_ms, 975e023eb337eed9746ecea7fc6fbb0fca386f1961sprang input[i].arrival_time_ms + arrival_time_delta); 985e023eb337eed9746ecea7fc6fbb0fca386f1961sprang EXPECT_EQ(truth[i].send_time_ms, input[i].send_time_ms); 995e023eb337eed9746ecea7fc6fbb0fca386f1961sprang EXPECT_EQ(truth[i].sequence_number, input[i].sequence_number); 1005e023eb337eed9746ecea7fc6fbb0fca386f1961sprang EXPECT_EQ(truth[i].payload_size, input[i].payload_size); 1015e023eb337eed9746ecea7fc6fbb0fca386f1961sprang EXPECT_EQ(truth[i].was_paced, input[i].was_paced); 1025e023eb337eed9746ecea7fc6fbb0fca386f1961sprang } 1035e023eb337eed9746ecea7fc6fbb0fca386f1961sprang } 1045e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 1055e023eb337eed9746ecea7fc6fbb0fca386f1961sprang // Utility method, to reset arrival_time_ms before adding send time. 106c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan void OnSentPacket(PacketInfo info) { 1075e023eb337eed9746ecea7fc6fbb0fca386f1961sprang info.arrival_time_ms = 0; 108bbe876f0d30ec806c7c4a12629eb1f19ab45fb86stefan adapter_->AddPacket(info.sequence_number, info.payload_size, 109bbe876f0d30ec806c7c4a12629eb1f19ab45fb86stefan info.was_paced); 110bbe876f0d30ec806c7c4a12629eb1f19ab45fb86stefan adapter_->OnSentPacket(info.sequence_number, info.send_time_ms); 1115e023eb337eed9746ecea7fc6fbb0fca386f1961sprang } 1125e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 1135e023eb337eed9746ecea7fc6fbb0fca386f1961sprang SimulatedClock clock_; 1145e023eb337eed9746ecea7fc6fbb0fca386f1961sprang MockProcessThread process_thread_; 1155e023eb337eed9746ecea7fc6fbb0fca386f1961sprang MockRemoteBitrateEstimator* bitrate_estimator_; 1165e023eb337eed9746ecea7fc6fbb0fca386f1961sprang rtc::scoped_ptr<TransportFeedbackAdapter> adapter_; 1175e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 1185e023eb337eed9746ecea7fc6fbb0fca386f1961sprang uint32_t receiver_estimated_bitrate_; 1195e023eb337eed9746ecea7fc6fbb0fca386f1961sprang}; 1205e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 1215e023eb337eed9746ecea7fc6fbb0fca386f1961sprangTEST_F(TransportFeedbackAdapterTest, AdaptsFeedbackAndPopulatesSendTimes) { 1225e023eb337eed9746ecea7fc6fbb0fca386f1961sprang std::vector<PacketInfo> packets; 1235e023eb337eed9746ecea7fc6fbb0fca386f1961sprang packets.push_back(PacketInfo(100, 200, 0, 1500, true)); 1245e023eb337eed9746ecea7fc6fbb0fca386f1961sprang packets.push_back(PacketInfo(110, 210, 1, 1500, true)); 1255e023eb337eed9746ecea7fc6fbb0fca386f1961sprang packets.push_back(PacketInfo(120, 220, 2, 1500, true)); 1265e023eb337eed9746ecea7fc6fbb0fca386f1961sprang packets.push_back(PacketInfo(130, 230, 3, 1500, true)); 1275e023eb337eed9746ecea7fc6fbb0fca386f1961sprang packets.push_back(PacketInfo(140, 240, 4, 1500, true)); 1285e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 1295e023eb337eed9746ecea7fc6fbb0fca386f1961sprang for (const PacketInfo& packet : packets) 130c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan OnSentPacket(packet); 1315e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 1325e023eb337eed9746ecea7fc6fbb0fca386f1961sprang rtcp::TransportFeedback feedback; 1335e023eb337eed9746ecea7fc6fbb0fca386f1961sprang feedback.WithBase(packets[0].sequence_number, 1345e023eb337eed9746ecea7fc6fbb0fca386f1961sprang packets[0].arrival_time_ms * 1000); 1355e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 1365e023eb337eed9746ecea7fc6fbb0fca386f1961sprang for (const PacketInfo& packet : packets) { 1375e023eb337eed9746ecea7fc6fbb0fca386f1961sprang EXPECT_TRUE(feedback.WithReceivedPacket(packet.sequence_number, 1385e023eb337eed9746ecea7fc6fbb0fca386f1961sprang packet.arrival_time_ms * 1000)); 1395e023eb337eed9746ecea7fc6fbb0fca386f1961sprang } 1405e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 1415e023eb337eed9746ecea7fc6fbb0fca386f1961sprang feedback.Build(); 1425e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 1435e023eb337eed9746ecea7fc6fbb0fca386f1961sprang EXPECT_CALL(*bitrate_estimator_, IncomingPacketFeedbackVector(_)) 1445e023eb337eed9746ecea7fc6fbb0fca386f1961sprang .Times(1) 1455e023eb337eed9746ecea7fc6fbb0fca386f1961sprang .WillOnce(Invoke( 1465e023eb337eed9746ecea7fc6fbb0fca386f1961sprang [packets, this](const std::vector<PacketInfo>& feedback_vector) { 1475e023eb337eed9746ecea7fc6fbb0fca386f1961sprang ComparePacketVectors(packets, feedback_vector); 1485e023eb337eed9746ecea7fc6fbb0fca386f1961sprang })); 1495e023eb337eed9746ecea7fc6fbb0fca386f1961sprang adapter_->OnTransportFeedback(feedback); 1505e023eb337eed9746ecea7fc6fbb0fca386f1961sprang} 1515e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 1525e023eb337eed9746ecea7fc6fbb0fca386f1961sprangTEST_F(TransportFeedbackAdapterTest, HandlesDroppedPackets) { 1535e023eb337eed9746ecea7fc6fbb0fca386f1961sprang std::vector<PacketInfo> packets; 1545e023eb337eed9746ecea7fc6fbb0fca386f1961sprang packets.push_back(PacketInfo(100, 200, 0, 1500, true)); 1555e023eb337eed9746ecea7fc6fbb0fca386f1961sprang packets.push_back(PacketInfo(110, 210, 1, 1500, true)); 1565e023eb337eed9746ecea7fc6fbb0fca386f1961sprang packets.push_back(PacketInfo(120, 220, 2, 1500, true)); 1575e023eb337eed9746ecea7fc6fbb0fca386f1961sprang packets.push_back(PacketInfo(130, 230, 3, 1500, true)); 1585e023eb337eed9746ecea7fc6fbb0fca386f1961sprang packets.push_back(PacketInfo(140, 240, 4, 1500, true)); 1595e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 1605e023eb337eed9746ecea7fc6fbb0fca386f1961sprang const uint16_t kSendSideDropBefore = 1; 1615e023eb337eed9746ecea7fc6fbb0fca386f1961sprang const uint16_t kReceiveSideDropAfter = 3; 1625e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 1635e023eb337eed9746ecea7fc6fbb0fca386f1961sprang for (const PacketInfo& packet : packets) { 1645e023eb337eed9746ecea7fc6fbb0fca386f1961sprang if (packet.sequence_number >= kSendSideDropBefore) 165c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan OnSentPacket(packet); 1665e023eb337eed9746ecea7fc6fbb0fca386f1961sprang } 1675e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 1685e023eb337eed9746ecea7fc6fbb0fca386f1961sprang rtcp::TransportFeedback feedback; 1695e023eb337eed9746ecea7fc6fbb0fca386f1961sprang feedback.WithBase(packets[0].sequence_number, 1705e023eb337eed9746ecea7fc6fbb0fca386f1961sprang packets[0].arrival_time_ms * 1000); 1715e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 1725e023eb337eed9746ecea7fc6fbb0fca386f1961sprang for (const PacketInfo& packet : packets) { 1735e023eb337eed9746ecea7fc6fbb0fca386f1961sprang if (packet.sequence_number <= kReceiveSideDropAfter) { 1745e023eb337eed9746ecea7fc6fbb0fca386f1961sprang EXPECT_TRUE(feedback.WithReceivedPacket(packet.sequence_number, 1755e023eb337eed9746ecea7fc6fbb0fca386f1961sprang packet.arrival_time_ms * 1000)); 1765e023eb337eed9746ecea7fc6fbb0fca386f1961sprang } 1775e023eb337eed9746ecea7fc6fbb0fca386f1961sprang } 1785e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 1795e023eb337eed9746ecea7fc6fbb0fca386f1961sprang feedback.Build(); 1805e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 1815e023eb337eed9746ecea7fc6fbb0fca386f1961sprang std::vector<PacketInfo> expected_packets( 1825e023eb337eed9746ecea7fc6fbb0fca386f1961sprang packets.begin() + kSendSideDropBefore, 1835e023eb337eed9746ecea7fc6fbb0fca386f1961sprang packets.begin() + kReceiveSideDropAfter + 1); 1845e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 1855e023eb337eed9746ecea7fc6fbb0fca386f1961sprang EXPECT_CALL(*bitrate_estimator_, IncomingPacketFeedbackVector(_)) 1865e023eb337eed9746ecea7fc6fbb0fca386f1961sprang .Times(1) 1875e023eb337eed9746ecea7fc6fbb0fca386f1961sprang .WillOnce(Invoke([expected_packets, 1885e023eb337eed9746ecea7fc6fbb0fca386f1961sprang this](const std::vector<PacketInfo>& feedback_vector) { 1895e023eb337eed9746ecea7fc6fbb0fca386f1961sprang ComparePacketVectors(expected_packets, feedback_vector); 1905e023eb337eed9746ecea7fc6fbb0fca386f1961sprang })); 1915e023eb337eed9746ecea7fc6fbb0fca386f1961sprang adapter_->OnTransportFeedback(feedback); 1925e023eb337eed9746ecea7fc6fbb0fca386f1961sprang} 1935e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 1945e023eb337eed9746ecea7fc6fbb0fca386f1961sprangTEST_F(TransportFeedbackAdapterTest, SendTimeWrapsBothWays) { 1955e023eb337eed9746ecea7fc6fbb0fca386f1961sprang int64_t kHighArrivalTimeMs = rtcp::TransportFeedback::kDeltaScaleFactor * 1965e023eb337eed9746ecea7fc6fbb0fca386f1961sprang static_cast<int64_t>(1 << 8) * 1975e023eb337eed9746ecea7fc6fbb0fca386f1961sprang static_cast<int64_t>((1 << 23) - 1) / 1000; 1985e023eb337eed9746ecea7fc6fbb0fca386f1961sprang std::vector<PacketInfo> packets; 1995e023eb337eed9746ecea7fc6fbb0fca386f1961sprang packets.push_back(PacketInfo(kHighArrivalTimeMs - 64, 200, 0, 1500, true)); 2005e023eb337eed9746ecea7fc6fbb0fca386f1961sprang packets.push_back(PacketInfo(kHighArrivalTimeMs + 64, 210, 1, 1500, true)); 2015e023eb337eed9746ecea7fc6fbb0fca386f1961sprang packets.push_back(PacketInfo(kHighArrivalTimeMs, 220, 2, 1500, true)); 2025e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 2035e023eb337eed9746ecea7fc6fbb0fca386f1961sprang for (const PacketInfo& packet : packets) 204c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan OnSentPacket(packet); 2055e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 2065e023eb337eed9746ecea7fc6fbb0fca386f1961sprang for (size_t i = 0; i < packets.size(); ++i) { 2075e023eb337eed9746ecea7fc6fbb0fca386f1961sprang rtc::scoped_ptr<rtcp::TransportFeedback> feedback( 2085e023eb337eed9746ecea7fc6fbb0fca386f1961sprang new rtcp::TransportFeedback()); 2095e023eb337eed9746ecea7fc6fbb0fca386f1961sprang feedback->WithBase(packets[i].sequence_number, 2105e023eb337eed9746ecea7fc6fbb0fca386f1961sprang packets[i].arrival_time_ms * 1000); 2115e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 2125e023eb337eed9746ecea7fc6fbb0fca386f1961sprang EXPECT_TRUE(feedback->WithReceivedPacket( 2135e023eb337eed9746ecea7fc6fbb0fca386f1961sprang packets[i].sequence_number, packets[i].arrival_time_ms * 1000)); 2145e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 2155e023eb337eed9746ecea7fc6fbb0fca386f1961sprang rtc::scoped_ptr<rtcp::RawPacket> raw_packet = feedback->Build(); 2165e023eb337eed9746ecea7fc6fbb0fca386f1961sprang feedback = rtcp::TransportFeedback::ParseFrom(raw_packet->Buffer(), 2175e023eb337eed9746ecea7fc6fbb0fca386f1961sprang raw_packet->Length()); 2185e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 2195e023eb337eed9746ecea7fc6fbb0fca386f1961sprang std::vector<PacketInfo> expected_packets; 2205e023eb337eed9746ecea7fc6fbb0fca386f1961sprang expected_packets.push_back(packets[i]); 2215e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 2225e023eb337eed9746ecea7fc6fbb0fca386f1961sprang EXPECT_CALL(*bitrate_estimator_, IncomingPacketFeedbackVector(_)) 2235e023eb337eed9746ecea7fc6fbb0fca386f1961sprang .Times(1) 2245e023eb337eed9746ecea7fc6fbb0fca386f1961sprang .WillOnce(Invoke([expected_packets, this]( 2255e023eb337eed9746ecea7fc6fbb0fca386f1961sprang const std::vector<PacketInfo>& feedback_vector) { 2265e023eb337eed9746ecea7fc6fbb0fca386f1961sprang ComparePacketVectors(expected_packets, feedback_vector); 2275e023eb337eed9746ecea7fc6fbb0fca386f1961sprang })); 2285e023eb337eed9746ecea7fc6fbb0fca386f1961sprang adapter_->OnTransportFeedback(*feedback.get()); 2295e023eb337eed9746ecea7fc6fbb0fca386f1961sprang } 2305e023eb337eed9746ecea7fc6fbb0fca386f1961sprang} 2315e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 2325e023eb337eed9746ecea7fc6fbb0fca386f1961sprangTEST_F(TransportFeedbackAdapterTest, TimestampDeltas) { 2335e023eb337eed9746ecea7fc6fbb0fca386f1961sprang std::vector<PacketInfo> sent_packets; 2345e023eb337eed9746ecea7fc6fbb0fca386f1961sprang const int64_t kSmallDeltaUs = 2355e023eb337eed9746ecea7fc6fbb0fca386f1961sprang rtcp::TransportFeedback::kDeltaScaleFactor * ((1 << 8) - 1); 2365e023eb337eed9746ecea7fc6fbb0fca386f1961sprang const int64_t kLargePositiveDeltaUs = 2375e023eb337eed9746ecea7fc6fbb0fca386f1961sprang rtcp::TransportFeedback::kDeltaScaleFactor * 2385e023eb337eed9746ecea7fc6fbb0fca386f1961sprang std::numeric_limits<int16_t>::max(); 2395e023eb337eed9746ecea7fc6fbb0fca386f1961sprang const int64_t kLargeNegativeDeltaUs = 2405e023eb337eed9746ecea7fc6fbb0fca386f1961sprang rtcp::TransportFeedback::kDeltaScaleFactor * 2415e023eb337eed9746ecea7fc6fbb0fca386f1961sprang std::numeric_limits<int16_t>::min(); 2425e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 2435e023eb337eed9746ecea7fc6fbb0fca386f1961sprang PacketInfo info(100, 200, 0, 1500, true); 2445e023eb337eed9746ecea7fc6fbb0fca386f1961sprang sent_packets.push_back(info); 2455e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 2465e023eb337eed9746ecea7fc6fbb0fca386f1961sprang info.send_time_ms += kSmallDeltaUs / 1000; 2475e023eb337eed9746ecea7fc6fbb0fca386f1961sprang info.arrival_time_ms += kSmallDeltaUs / 1000; 2485e023eb337eed9746ecea7fc6fbb0fca386f1961sprang ++info.sequence_number; 2495e023eb337eed9746ecea7fc6fbb0fca386f1961sprang sent_packets.push_back(info); 2505e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 2515e023eb337eed9746ecea7fc6fbb0fca386f1961sprang info.send_time_ms += kLargePositiveDeltaUs / 1000; 2525e023eb337eed9746ecea7fc6fbb0fca386f1961sprang info.arrival_time_ms += kLargePositiveDeltaUs / 1000; 2535e023eb337eed9746ecea7fc6fbb0fca386f1961sprang ++info.sequence_number; 2545e023eb337eed9746ecea7fc6fbb0fca386f1961sprang sent_packets.push_back(info); 2555e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 2565e023eb337eed9746ecea7fc6fbb0fca386f1961sprang info.send_time_ms += kLargeNegativeDeltaUs / 1000; 2575e023eb337eed9746ecea7fc6fbb0fca386f1961sprang info.arrival_time_ms += kLargeNegativeDeltaUs / 1000; 2585e023eb337eed9746ecea7fc6fbb0fca386f1961sprang ++info.sequence_number; 2595e023eb337eed9746ecea7fc6fbb0fca386f1961sprang sent_packets.push_back(info); 2605e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 2615e023eb337eed9746ecea7fc6fbb0fca386f1961sprang // Too large, delta - will need two feedback messages. 2625e023eb337eed9746ecea7fc6fbb0fca386f1961sprang info.send_time_ms += (kLargePositiveDeltaUs + 1000) / 1000; 2635e023eb337eed9746ecea7fc6fbb0fca386f1961sprang info.arrival_time_ms += (kLargePositiveDeltaUs + 1000) / 1000; 2645e023eb337eed9746ecea7fc6fbb0fca386f1961sprang ++info.sequence_number; 2655e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 2665e023eb337eed9746ecea7fc6fbb0fca386f1961sprang // Packets will be added to send history. 2675e023eb337eed9746ecea7fc6fbb0fca386f1961sprang for (const PacketInfo& packet : sent_packets) 268c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan OnSentPacket(packet); 269c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan OnSentPacket(info); 2705e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 2715e023eb337eed9746ecea7fc6fbb0fca386f1961sprang // Create expected feedback and send into adapter. 2725e023eb337eed9746ecea7fc6fbb0fca386f1961sprang rtc::scoped_ptr<rtcp::TransportFeedback> feedback( 2735e023eb337eed9746ecea7fc6fbb0fca386f1961sprang new rtcp::TransportFeedback()); 2745e023eb337eed9746ecea7fc6fbb0fca386f1961sprang feedback->WithBase(sent_packets[0].sequence_number, 2755e023eb337eed9746ecea7fc6fbb0fca386f1961sprang sent_packets[0].arrival_time_ms * 1000); 2765e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 2775e023eb337eed9746ecea7fc6fbb0fca386f1961sprang for (const PacketInfo& packet : sent_packets) { 2785e023eb337eed9746ecea7fc6fbb0fca386f1961sprang EXPECT_TRUE(feedback->WithReceivedPacket(packet.sequence_number, 2795e023eb337eed9746ecea7fc6fbb0fca386f1961sprang packet.arrival_time_ms * 1000)); 2805e023eb337eed9746ecea7fc6fbb0fca386f1961sprang } 2815e023eb337eed9746ecea7fc6fbb0fca386f1961sprang EXPECT_FALSE(feedback->WithReceivedPacket(info.sequence_number, 2825e023eb337eed9746ecea7fc6fbb0fca386f1961sprang info.arrival_time_ms * 1000)); 2835e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 2845e023eb337eed9746ecea7fc6fbb0fca386f1961sprang rtc::scoped_ptr<rtcp::RawPacket> raw_packet = feedback->Build(); 2855e023eb337eed9746ecea7fc6fbb0fca386f1961sprang feedback = rtcp::TransportFeedback::ParseFrom(raw_packet->Buffer(), 2865e023eb337eed9746ecea7fc6fbb0fca386f1961sprang raw_packet->Length()); 2875e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 2885e023eb337eed9746ecea7fc6fbb0fca386f1961sprang std::vector<PacketInfo> received_feedback; 2895e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 2905e023eb337eed9746ecea7fc6fbb0fca386f1961sprang EXPECT_TRUE(feedback.get() != nullptr); 2915e023eb337eed9746ecea7fc6fbb0fca386f1961sprang EXPECT_CALL(*bitrate_estimator_, IncomingPacketFeedbackVector(_)) 2925e023eb337eed9746ecea7fc6fbb0fca386f1961sprang .Times(1) 2935e023eb337eed9746ecea7fc6fbb0fca386f1961sprang .WillOnce(Invoke([sent_packets, &received_feedback]( 2945e023eb337eed9746ecea7fc6fbb0fca386f1961sprang const std::vector<PacketInfo>& feedback_vector) { 2955e023eb337eed9746ecea7fc6fbb0fca386f1961sprang EXPECT_EQ(sent_packets.size(), feedback_vector.size()); 2965e023eb337eed9746ecea7fc6fbb0fca386f1961sprang received_feedback = feedback_vector; 2975e023eb337eed9746ecea7fc6fbb0fca386f1961sprang })); 2985e023eb337eed9746ecea7fc6fbb0fca386f1961sprang adapter_->OnTransportFeedback(*feedback.get()); 2995e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 3005e023eb337eed9746ecea7fc6fbb0fca386f1961sprang // Create a new feedback message and add the trailing item. 3015e023eb337eed9746ecea7fc6fbb0fca386f1961sprang feedback.reset(new rtcp::TransportFeedback()); 3025e023eb337eed9746ecea7fc6fbb0fca386f1961sprang feedback->WithBase(info.sequence_number, info.arrival_time_ms * 1000); 3035e023eb337eed9746ecea7fc6fbb0fca386f1961sprang EXPECT_TRUE(feedback->WithReceivedPacket(info.sequence_number, 3045e023eb337eed9746ecea7fc6fbb0fca386f1961sprang info.arrival_time_ms * 1000)); 3055e023eb337eed9746ecea7fc6fbb0fca386f1961sprang raw_packet = feedback->Build(); 3065e023eb337eed9746ecea7fc6fbb0fca386f1961sprang feedback = rtcp::TransportFeedback::ParseFrom(raw_packet->Buffer(), 3075e023eb337eed9746ecea7fc6fbb0fca386f1961sprang raw_packet->Length()); 3085e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 3095e023eb337eed9746ecea7fc6fbb0fca386f1961sprang EXPECT_TRUE(feedback.get() != nullptr); 3105e023eb337eed9746ecea7fc6fbb0fca386f1961sprang EXPECT_CALL(*bitrate_estimator_, IncomingPacketFeedbackVector(_)) 3115e023eb337eed9746ecea7fc6fbb0fca386f1961sprang .Times(1) 3125e023eb337eed9746ecea7fc6fbb0fca386f1961sprang .WillOnce(Invoke( 3135e023eb337eed9746ecea7fc6fbb0fca386f1961sprang [&received_feedback](const std::vector<PacketInfo>& feedback_vector) { 3145e023eb337eed9746ecea7fc6fbb0fca386f1961sprang EXPECT_EQ(1u, feedback_vector.size()); 3155e023eb337eed9746ecea7fc6fbb0fca386f1961sprang received_feedback.push_back(feedback_vector[0]); 3165e023eb337eed9746ecea7fc6fbb0fca386f1961sprang })); 3175e023eb337eed9746ecea7fc6fbb0fca386f1961sprang adapter_->OnTransportFeedback(*feedback.get()); 3185e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 3195e023eb337eed9746ecea7fc6fbb0fca386f1961sprang sent_packets.push_back(info); 3205e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 3215e023eb337eed9746ecea7fc6fbb0fca386f1961sprang ComparePacketVectors(sent_packets, received_feedback); 3225e023eb337eed9746ecea7fc6fbb0fca386f1961sprang} 3235e023eb337eed9746ecea7fc6fbb0fca386f1961sprang 3245e023eb337eed9746ecea7fc6fbb0fca386f1961sprang} // namespace test 3255e023eb337eed9746ecea7fc6fbb0fca386f1961sprang} // namespace webrtc 326