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