blob: 05e12674368691c3b338670dbcd5481a28cfb236 [file] [log] [blame]
stefan@webrtc.org14b02792015-02-16 12:02:20 +00001/*
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 WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_PACKET_H_
12#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_PACKET_H_
13
14#include <list>
15#include <map>
gnish6dcdf102017-06-05 06:01:26 -070016#include <utility>
stefan@webrtc.org14b02792015-02-16 12:02:20 +000017#include <vector>
18
19#include "webrtc/common_types.h"
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010020#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
stefan@webrtc.org14b02792015-02-16 12:02:20 +000021#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
22
23namespace webrtc {
24namespace testing {
25namespace bwe {
26
27class Packet {
28 public:
29 enum Type { kMedia, kFeedback };
30
31 Packet();
32 Packet(int flow_id, int64_t send_time_us, size_t payload_size);
33 virtual ~Packet();
34
35 virtual bool operator<(const Packet& rhs) const;
36
37 virtual int flow_id() const { return flow_id_; }
stefan@webrtc.org14b02792015-02-16 12:02:20 +000038 virtual void set_send_time_us(int64_t send_time_us);
39 virtual int64_t send_time_us() const { return send_time_us_; }
Cesar Magalhaesbf40b422015-07-15 19:47:10 +020040 virtual int64_t sender_timestamp_us() const { return sender_timestamp_us_; }
stefan@webrtc.org14b02792015-02-16 12:02:20 +000041 virtual size_t payload_size() const { return payload_size_; }
42 virtual Packet::Type GetPacketType() const = 0;
Cesar Magalhaes9c261f22015-07-15 16:31:18 +020043 virtual void set_sender_timestamp_us(int64_t sender_timestamp_us) {
Cesar Magalhaesc81591d2015-05-06 22:29:01 +020044 sender_timestamp_us_ = sender_timestamp_us;
45 }
Cesar Magalhaes9c261f22015-07-15 16:31:18 +020046 virtual int64_t creation_time_ms() const {
47 return (creation_time_us_ + 500) / 1000;
48 }
49 virtual int64_t sender_timestamp_ms() const {
50 return (sender_timestamp_us_ + 500) / 1000;
51 }
52 virtual int64_t send_time_ms() const { return (send_time_us_ + 500) / 1000; }
stefan@webrtc.org14b02792015-02-16 12:02:20 +000053
Cesar Magalhaesc81591d2015-05-06 22:29:01 +020054 protected:
stefan@webrtc.org14b02792015-02-16 12:02:20 +000055 int flow_id_;
56 int64_t creation_time_us_; // Time when the packet was created.
57 int64_t send_time_us_; // Time the packet left last processor touching it.
Cesar Magalhaesc81591d2015-05-06 22:29:01 +020058 int64_t sender_timestamp_us_; // Time the packet left the Sender.
59 size_t payload_size_; // Size of the (non-existent, simulated) payload.
stefan@webrtc.org14b02792015-02-16 12:02:20 +000060};
61
62class MediaPacket : public Packet {
63 public:
64 MediaPacket();
65 MediaPacket(int flow_id,
66 int64_t send_time_us,
67 size_t payload_size,
Stefan Holmer37959372015-04-16 19:55:45 +020068 uint16_t sequence_number);
69 MediaPacket(int flow_id,
70 int64_t send_time_us,
71 size_t payload_size,
stefan@webrtc.org14b02792015-02-16 12:02:20 +000072 const RTPHeader& header);
Cesar Magalhaesfb19f492015-07-15 19:52:08 +020073 MediaPacket(int64_t send_time_us, uint16_t sequence_number);
Cesar Magalhaes9c261f22015-07-15 16:31:18 +020074
stefan@webrtc.org14b02792015-02-16 12:02:20 +000075 virtual ~MediaPacket() {}
76
stefan@webrtc.org4346d922015-03-18 13:40:54 +000077 int64_t GetAbsSendTimeInMs() const {
78 int64_t timestamp = header_.extension.absoluteSendTime
79 << kAbsSendTimeInterArrivalUpshift;
80 return 1000.0 * timestamp / static_cast<double>(1 << kInterArrivalShift);
81 }
stefan@webrtc.org14b02792015-02-16 12:02:20 +000082 void SetAbsSendTimeMs(int64_t abs_send_time_ms);
83 const RTPHeader& header() const { return header_; }
84 virtual Packet::Type GetPacketType() const { return kMedia; }
Cesar Magalhaesc81591d2015-05-06 22:29:01 +020085 uint16_t sequence_number() const { return header_.sequenceNumber; }
stefan@webrtc.org14b02792015-02-16 12:02:20 +000086
87 private:
stefan@webrtc.org4346d922015-03-18 13:40:54 +000088 static const int kAbsSendTimeFraction = 18;
89 static const int kAbsSendTimeInterArrivalUpshift = 8;
90 static const int kInterArrivalShift =
91 kAbsSendTimeFraction + kAbsSendTimeInterArrivalUpshift;
92
stefan@webrtc.org14b02792015-02-16 12:02:20 +000093 RTPHeader header_;
94};
95
96class FeedbackPacket : public Packet {
97 public:
Cesar Magalhaesc81591d2015-05-06 22:29:01 +020098 FeedbackPacket(int flow_id,
99 int64_t this_send_time_us,
100 int64_t latest_send_time_ms)
101 : Packet(flow_id, this_send_time_us, 0),
102 latest_send_time_ms_(latest_send_time_ms) {}
stefan@webrtc.org14b02792015-02-16 12:02:20 +0000103 virtual ~FeedbackPacket() {}
104
105 virtual Packet::Type GetPacketType() const { return kFeedback; }
Cesar Magalhaesc81591d2015-05-06 22:29:01 +0200106 int64_t latest_send_time_ms() const { return latest_send_time_ms_; }
107
108 private:
Cesar Magalhaes9c261f22015-07-15 16:31:18 +0200109 int64_t latest_send_time_ms_; // Time stamp for the latest sent FbPacket.
stefan@webrtc.org14b02792015-02-16 12:02:20 +0000110};
111
gnish6dcdf102017-06-05 06:01:26 -0700112class BbrBweFeedback : public FeedbackPacket {
113 public:
gnish191113a2017-07-05 05:00:46 -0700114 BbrBweFeedback(int flow_id,
115 int64_t send_time_us,
116 int64_t latest_send_time_ms,
gnisha36165c2017-08-20 09:19:58 -0700117 const std::vector<uint16_t>& packet_feedback_vector);
gnish6dcdf102017-06-05 06:01:26 -0700118 virtual ~BbrBweFeedback() {}
119
gnisha36165c2017-08-20 09:19:58 -0700120 const std::vector<uint16_t>& packet_feedback_vector() const {
gnish6dcdf102017-06-05 06:01:26 -0700121 return packet_feedback_vector_;
122 }
123
124 private:
gnisha36165c2017-08-20 09:19:58 -0700125 const std::vector<uint16_t> packet_feedback_vector_;
gnish6dcdf102017-06-05 06:01:26 -0700126};
127
stefan@webrtc.org14b02792015-02-16 12:02:20 +0000128class RembFeedback : public FeedbackPacket {
129 public:
130 RembFeedback(int flow_id,
131 int64_t send_time_us,
Cesar Magalhaesc81591d2015-05-06 22:29:01 +0200132 int64_t latest_send_time_ms,
stefan@webrtc.org14b02792015-02-16 12:02:20 +0000133 uint32_t estimated_bps,
134 RTCPReportBlock report_block);
135 virtual ~RembFeedback() {}
136
137 uint32_t estimated_bps() const { return estimated_bps_; }
138 RTCPReportBlock report_block() const { return report_block_; }
139
140 private:
141 const uint32_t estimated_bps_;
142 const RTCPReportBlock report_block_;
143};
144
145class SendSideBweFeedback : public FeedbackPacket {
146 public:
147 typedef std::map<uint16_t, int64_t> ArrivalTimesMap;
elad.alonf9490002017-03-06 05:32:21 -0800148 SendSideBweFeedback(
149 int flow_id,
150 int64_t send_time_us,
151 int64_t latest_send_time_ms,
152 const std::vector<PacketFeedback>& packet_feedback_vector);
stefan@webrtc.org14b02792015-02-16 12:02:20 +0000153 virtual ~SendSideBweFeedback() {}
154
elad.alonf9490002017-03-06 05:32:21 -0800155 const std::vector<PacketFeedback>& packet_feedback_vector() const {
stefan@webrtc.org14b02792015-02-16 12:02:20 +0000156 return packet_feedback_vector_;
157 }
158
159 private:
elad.alonf9490002017-03-06 05:32:21 -0800160 const std::vector<PacketFeedback> packet_feedback_vector_;
stefan@webrtc.org14b02792015-02-16 12:02:20 +0000161};
162
stefan@webrtc.org76636842015-02-17 16:03:45 +0000163class NadaFeedback : public FeedbackPacket {
164 public:
165 NadaFeedback(int flow_id,
Cesar Magalhaesc81591d2015-05-06 22:29:01 +0200166 int64_t this_send_time_us,
167 int64_t exp_smoothed_delay_ms,
168 int64_t est_queuing_delay_signal_ms,
stefan@webrtc.org76636842015-02-17 16:03:45 +0000169 int64_t congestion_signal,
Cesar Magalhaesc81591d2015-05-06 22:29:01 +0200170 float derivative,
171 float receiving_rate,
172 int64_t latest_send_time_ms)
173 : FeedbackPacket(flow_id, this_send_time_us, latest_send_time_ms),
174 exp_smoothed_delay_ms_(exp_smoothed_delay_ms),
175 est_queuing_delay_signal_ms_(est_queuing_delay_signal_ms),
stefan@webrtc.org76636842015-02-17 16:03:45 +0000176 congestion_signal_(congestion_signal),
Cesar Magalhaesc81591d2015-05-06 22:29:01 +0200177 derivative_(derivative),
178 receiving_rate_(receiving_rate) {}
stefan@webrtc.org76636842015-02-17 16:03:45 +0000179 virtual ~NadaFeedback() {}
180
Cesar Magalhaesc81591d2015-05-06 22:29:01 +0200181 int64_t exp_smoothed_delay_ms() const { return exp_smoothed_delay_ms_; }
182 int64_t est_queuing_delay_signal_ms() const {
183 return est_queuing_delay_signal_ms_;
184 }
stefan@webrtc.org76636842015-02-17 16:03:45 +0000185 int64_t congestion_signal() const { return congestion_signal_; }
186 float derivative() const { return derivative_; }
Cesar Magalhaesc81591d2015-05-06 22:29:01 +0200187 float receiving_rate() const { return receiving_rate_; }
stefan@webrtc.org76636842015-02-17 16:03:45 +0000188
189 private:
Cesar Magalhaesc81591d2015-05-06 22:29:01 +0200190 int64_t exp_smoothed_delay_ms_; // Referred as d_hat_n.
191 int64_t est_queuing_delay_signal_ms_; // Referred as d_tilde_n.
192 int64_t congestion_signal_; // Referred as x_n.
193 float derivative_; // Referred as x'_n.
194 float receiving_rate_; // Referred as R_r.
stefan@webrtc.org76636842015-02-17 16:03:45 +0000195};
196
Stefan Holmer37959372015-04-16 19:55:45 +0200197class TcpFeedback : public FeedbackPacket {
198 public:
199 TcpFeedback(int flow_id,
200 int64_t send_time_us,
Cesar Magalhaesc81591d2015-05-06 22:29:01 +0200201 int64_t latest_send_time_ms,
Stefan Holmer37959372015-04-16 19:55:45 +0200202 const std::vector<uint16_t>& acked_packets)
Cesar Magalhaesc81591d2015-05-06 22:29:01 +0200203 : FeedbackPacket(flow_id, send_time_us, latest_send_time_ms),
204 acked_packets_(acked_packets) {}
Stefan Holmer37959372015-04-16 19:55:45 +0200205 virtual ~TcpFeedback() {}
206
207 const std::vector<uint16_t>& acked_packets() const { return acked_packets_; }
208
209 private:
210 const std::vector<uint16_t> acked_packets_;
211};
212
stefan@webrtc.org14b02792015-02-16 12:02:20 +0000213typedef std::list<Packet*> Packets;
214typedef std::list<Packet*>::iterator PacketsIt;
215typedef std::list<Packet*>::const_iterator PacketsConstIt;
Cesar Magalhaesc81591d2015-05-06 22:29:01 +0200216
stefan@webrtc.org14b02792015-02-16 12:02:20 +0000217} // namespace bwe
218} // namespace testing
219} // namespace webrtc
220#endif // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_PACKET_H_