blob: 4d4b4077ceb128587943e86aec8243d786e5d227 [file] [log] [blame]
sprang5e023eb2015-09-14 06:42:43 -07001/*
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
Stefan Holmer280de9e2016-09-30 10:06:51 +020011#ifndef WEBRTC_MODULES_CONGESTION_CONTROLLER_TRANSPORT_FEEDBACK_ADAPTER_H_
12#define WEBRTC_MODULES_CONGESTION_CONTROLLER_TRANSPORT_FEEDBACK_ADAPTER_H_
sprang5e023eb2015-09-14 06:42:43 -070013
stefan9e117c5e12017-08-16 08:16:25 -070014#include <deque>
sprang5e023eb2015-09-14 06:42:43 -070015#include <vector>
16
sprang5e023eb2015-09-14 06:42:43 -070017#include "webrtc/modules/remote_bitrate_estimator/include/send_time_history.h"
Edward Lemurc20978e2017-07-06 19:44:34 +020018#include "webrtc/rtc_base/criticalsection.h"
19#include "webrtc/rtc_base/thread_annotations.h"
20#include "webrtc/rtc_base/thread_checker.h"
elad.alon5bbf43f2017-03-09 06:40:08 -080021#include "webrtc/system_wrappers/include/clock.h"
sprang5e023eb2015-09-14 06:42:43 -070022
23namespace webrtc {
24
elad.alond12a8e12017-03-23 11:04:48 -070025class PacketFeedbackObserver;
26
elad.alon5bbf43f2017-03-09 06:40:08 -080027namespace rtcp {
28class TransportFeedback;
29} // namespace rtcp
sprang5e023eb2015-09-14 06:42:43 -070030
elad.alon5bbf43f2017-03-09 06:40:08 -080031class TransportFeedbackAdapter {
sprang5e023eb2015-09-14 06:42:43 -070032 public:
elad.alon61ce37e2017-03-09 07:09:31 -080033 explicit TransportFeedbackAdapter(const Clock* clock);
sprang5e023eb2015-09-14 06:42:43 -070034 virtual ~TransportFeedbackAdapter();
35
elad.alond12a8e12017-03-23 11:04:48 -070036 void RegisterPacketFeedbackObserver(PacketFeedbackObserver* observer);
37 void DeRegisterPacketFeedbackObserver(PacketFeedbackObserver* observer);
38
39 void AddPacket(uint32_t ssrc,
40 uint16_t sequence_number,
Stefan Holmer789ba922016-02-17 15:52:17 +010041 size_t length,
elad.alon5bbf43f2017-03-09 06:40:08 -080042 const PacedPacketInfo& pacing_info);
Stefan Holmer789ba922016-02-17 15:52:17 +010043 void OnSentPacket(uint16_t sequence_number, int64_t send_time_ms);
stefanc3de0332016-08-02 07:22:17 -070044
Stefan Holmer280de9e2016-09-30 10:06:51 +020045 // 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.
elad.alon5bbf43f2017-03-09 06:40:08 -080048 void OnTransportFeedback(const rtcp::TransportFeedback& feedback);
49 std::vector<PacketFeedback> GetTransportFeedbackVector() const;
stefan9e117c5e12017-08-16 08:16:25 -070050 rtc::Optional<int64_t> GetMinFeedbackLoopRtt() const;
Stefan Holmer789ba922016-02-17 15:52:17 +010051
nisse284542b2017-01-10 08:58:32 -080052 void SetTransportOverhead(int transport_overhead_bytes_per_packet);
Stefan Holmer280de9e2016-09-30 10:06:51 +020053
Stefan Holmer9ea46b52017-03-15 12:40:25 +010054 void SetNetworkIds(uint16_t local_id, uint16_t remote_id);
philipelcb9ba302017-03-07 06:30:59 -080055
stefan9e117c5e12017-08-16 08:16:25 -070056 size_t GetOutstandingBytes() const;
57
sprang5e023eb2015-09-14 06:42:43 -070058 private:
elad.alonf9490002017-03-06 05:32:21 -080059 std::vector<PacketFeedback> GetPacketFeedbackVector(
Stefan Holmer60e43462016-09-07 09:58:20 +020060 const rtcp::TransportFeedback& feedback);
61
elad.alon0fe12162017-01-31 05:48:37 -080062 const bool send_side_bwe_with_overhead_;
sprang5e023eb2015-09-14 06:42:43 -070063 rtc::CriticalSection lock_;
danilchap56359be2017-09-07 07:53:45 -070064 int transport_overhead_bytes_per_packet_ RTC_GUARDED_BY(&lock_);
65 SendTimeHistory send_time_history_ RTC_GUARDED_BY(&lock_);
elad.alon5bbf43f2017-03-09 06:40:08 -080066 const Clock* const clock_;
sprang5e023eb2015-09-14 06:42:43 -070067 int64_t current_offset_ms_;
68 int64_t last_timestamp_us_;
elad.alonf9490002017-03-06 05:32:21 -080069 std::vector<PacketFeedback> last_packet_feedback_vector_;
danilchap56359be2017-09-07 07:53:45 -070070 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_);
elad.alond12a8e12017-03-23 11:04:48 -070074
75 rtc::CriticalSection observers_lock_;
danilchap56359be2017-09-07 07:53:45 -070076 std::vector<PacketFeedbackObserver*> observers_
77 RTC_GUARDED_BY(&observers_lock_);
sprang5e023eb2015-09-14 06:42:43 -070078};
79
80} // namespace webrtc
81
Stefan Holmer280de9e2016-09-30 10:06:51 +020082#endif // WEBRTC_MODULES_CONGESTION_CONTROLLER_TRANSPORT_FEEDBACK_ADAPTER_H_