1 /*
2  *  Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3  *
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
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #ifndef MODULES_CONGESTION_CONTROLLER_TRANSPORT_FEEDBACK_ADAPTER_H_
12 #define MODULES_CONGESTION_CONTROLLER_TRANSPORT_FEEDBACK_ADAPTER_H_
13 
14 #include <deque>
15 #include <vector>
16 
17 #include "modules/remote_bitrate_estimator/include/send_time_history.h"
18 #include "rtc_base/criticalsection.h"
19 #include "rtc_base/thread_annotations.h"
20 #include "rtc_base/thread_checker.h"
21 #include "system_wrappers/include/clock.h"
22 
23 namespace webrtc {
24 
25 class PacketFeedbackObserver;
26 
27 namespace rtcp {
28 class TransportFeedback;
29 }  // namespace rtcp
30 
31 class TransportFeedbackAdapter {
32  public:
33   explicit TransportFeedbackAdapter(const Clock* clock);
34   virtual ~TransportFeedbackAdapter();
35 
36   void RegisterPacketFeedbackObserver(PacketFeedbackObserver* observer);
37   void DeRegisterPacketFeedbackObserver(PacketFeedbackObserver* observer);
38 
39   void AddPacket(uint32_t ssrc,
40                  uint16_t sequence_number,
41                  size_t length,
42                  const PacedPacketInfo& pacing_info);
43   void OnSentPacket(uint16_t sequence_number, int64_t send_time_ms);
44 
45   // TODO(holmer): This method should return DelayBasedBwe::Result so that we
46   // can get rid of the dependency on BitrateController. Requires changes
47   // to the CongestionController interface.
48   void OnTransportFeedback(const rtcp::TransportFeedback& feedback);
49   std::vector<PacketFeedback> GetTransportFeedbackVector() const;
50   rtc::Optional<int64_t> GetMinFeedbackLoopRtt() const;
51 
52   void SetTransportOverhead(int transport_overhead_bytes_per_packet);
53 
54   void SetNetworkIds(uint16_t local_id, uint16_t remote_id);
55 
56   size_t GetOutstandingBytes() const;
57 
58  private:
59   std::vector<PacketFeedback> GetPacketFeedbackVector(
60       const rtcp::TransportFeedback& feedback);
61 
62   const bool send_side_bwe_with_overhead_;
63   rtc::CriticalSection lock_;
64   int transport_overhead_bytes_per_packet_ RTC_GUARDED_BY(&lock_);
65   SendTimeHistory send_time_history_ RTC_GUARDED_BY(&lock_);
66   const Clock* const clock_;
67   int64_t current_offset_ms_;
68   int64_t last_timestamp_us_;
69   std::vector<PacketFeedback> last_packet_feedback_vector_;
70   uint16_t local_net_id_ RTC_GUARDED_BY(&lock_);
71   uint16_t remote_net_id_ RTC_GUARDED_BY(&lock_);
72   std::deque<int64_t> feedback_rtts_ RTC_GUARDED_BY(&lock_);
73   rtc::Optional<int64_t> min_feedback_rtt_ RTC_GUARDED_BY(&lock_);
74 
75   rtc::CriticalSection observers_lock_;
76   std::vector<PacketFeedbackObserver*> observers_
77       RTC_GUARDED_BY(&observers_lock_);
78 };
79 
80 }  // namespace webrtc
81 
82 #endif  // MODULES_CONGESTION_CONTROLLER_TRANSPORT_FEEDBACK_ADAPTER_H_
83