stefan@webrtc.org | 14b0279 | 2015-02-16 12:02:20 +0000 | [diff] [blame] | 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 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> |
gnish | 6dcdf10 | 2017-06-05 06:01:26 -0700 | [diff] [blame] | 16 | #include <utility> |
stefan@webrtc.org | 14b0279 | 2015-02-16 12:02:20 +0000 | [diff] [blame] | 17 | #include <vector> |
| 18 | |
| 19 | #include "webrtc/common_types.h" |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 20 | #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" |
stefan@webrtc.org | 14b0279 | 2015-02-16 12:02:20 +0000 | [diff] [blame] | 21 | #include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h" |
| 22 | |
| 23 | namespace webrtc { |
| 24 | namespace testing { |
| 25 | namespace bwe { |
| 26 | |
| 27 | class 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.org | 14b0279 | 2015-02-16 12:02:20 +0000 | [diff] [blame] | 38 | virtual void set_send_time_us(int64_t send_time_us); |
| 39 | virtual int64_t send_time_us() const { return send_time_us_; } |
Cesar Magalhaes | bf40b42 | 2015-07-15 19:47:10 +0200 | [diff] [blame] | 40 | virtual int64_t sender_timestamp_us() const { return sender_timestamp_us_; } |
stefan@webrtc.org | 14b0279 | 2015-02-16 12:02:20 +0000 | [diff] [blame] | 41 | virtual size_t payload_size() const { return payload_size_; } |
| 42 | virtual Packet::Type GetPacketType() const = 0; |
Cesar Magalhaes | 9c261f2 | 2015-07-15 16:31:18 +0200 | [diff] [blame] | 43 | virtual void set_sender_timestamp_us(int64_t sender_timestamp_us) { |
Cesar Magalhaes | c81591d | 2015-05-06 22:29:01 +0200 | [diff] [blame] | 44 | sender_timestamp_us_ = sender_timestamp_us; |
| 45 | } |
Cesar Magalhaes | 9c261f2 | 2015-07-15 16:31:18 +0200 | [diff] [blame] | 46 | 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.org | 14b0279 | 2015-02-16 12:02:20 +0000 | [diff] [blame] | 53 | |
Cesar Magalhaes | c81591d | 2015-05-06 22:29:01 +0200 | [diff] [blame] | 54 | protected: |
stefan@webrtc.org | 14b0279 | 2015-02-16 12:02:20 +0000 | [diff] [blame] | 55 | 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 Magalhaes | c81591d | 2015-05-06 22:29:01 +0200 | [diff] [blame] | 58 | 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.org | 14b0279 | 2015-02-16 12:02:20 +0000 | [diff] [blame] | 60 | }; |
| 61 | |
| 62 | class MediaPacket : public Packet { |
| 63 | public: |
| 64 | MediaPacket(); |
| 65 | MediaPacket(int flow_id, |
| 66 | int64_t send_time_us, |
| 67 | size_t payload_size, |
Stefan Holmer | 3795937 | 2015-04-16 19:55:45 +0200 | [diff] [blame] | 68 | uint16_t sequence_number); |
| 69 | MediaPacket(int flow_id, |
| 70 | int64_t send_time_us, |
| 71 | size_t payload_size, |
stefan@webrtc.org | 14b0279 | 2015-02-16 12:02:20 +0000 | [diff] [blame] | 72 | const RTPHeader& header); |
Cesar Magalhaes | fb19f49 | 2015-07-15 19:52:08 +0200 | [diff] [blame] | 73 | MediaPacket(int64_t send_time_us, uint16_t sequence_number); |
Cesar Magalhaes | 9c261f2 | 2015-07-15 16:31:18 +0200 | [diff] [blame] | 74 | |
stefan@webrtc.org | 14b0279 | 2015-02-16 12:02:20 +0000 | [diff] [blame] | 75 | virtual ~MediaPacket() {} |
| 76 | |
stefan@webrtc.org | 4346d92 | 2015-03-18 13:40:54 +0000 | [diff] [blame] | 77 | 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.org | 14b0279 | 2015-02-16 12:02:20 +0000 | [diff] [blame] | 82 | void SetAbsSendTimeMs(int64_t abs_send_time_ms); |
| 83 | const RTPHeader& header() const { return header_; } |
| 84 | virtual Packet::Type GetPacketType() const { return kMedia; } |
Cesar Magalhaes | c81591d | 2015-05-06 22:29:01 +0200 | [diff] [blame] | 85 | uint16_t sequence_number() const { return header_.sequenceNumber; } |
stefan@webrtc.org | 14b0279 | 2015-02-16 12:02:20 +0000 | [diff] [blame] | 86 | |
| 87 | private: |
stefan@webrtc.org | 4346d92 | 2015-03-18 13:40:54 +0000 | [diff] [blame] | 88 | static const int kAbsSendTimeFraction = 18; |
| 89 | static const int kAbsSendTimeInterArrivalUpshift = 8; |
| 90 | static const int kInterArrivalShift = |
| 91 | kAbsSendTimeFraction + kAbsSendTimeInterArrivalUpshift; |
| 92 | |
stefan@webrtc.org | 14b0279 | 2015-02-16 12:02:20 +0000 | [diff] [blame] | 93 | RTPHeader header_; |
| 94 | }; |
| 95 | |
| 96 | class FeedbackPacket : public Packet { |
| 97 | public: |
Cesar Magalhaes | c81591d | 2015-05-06 22:29:01 +0200 | [diff] [blame] | 98 | 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.org | 14b0279 | 2015-02-16 12:02:20 +0000 | [diff] [blame] | 103 | virtual ~FeedbackPacket() {} |
| 104 | |
| 105 | virtual Packet::Type GetPacketType() const { return kFeedback; } |
Cesar Magalhaes | c81591d | 2015-05-06 22:29:01 +0200 | [diff] [blame] | 106 | int64_t latest_send_time_ms() const { return latest_send_time_ms_; } |
| 107 | |
| 108 | private: |
Cesar Magalhaes | 9c261f2 | 2015-07-15 16:31:18 +0200 | [diff] [blame] | 109 | int64_t latest_send_time_ms_; // Time stamp for the latest sent FbPacket. |
stefan@webrtc.org | 14b0279 | 2015-02-16 12:02:20 +0000 | [diff] [blame] | 110 | }; |
| 111 | |
gnish | 6dcdf10 | 2017-06-05 06:01:26 -0700 | [diff] [blame] | 112 | class BbrBweFeedback : public FeedbackPacket { |
| 113 | public: |
gnish | 191113a | 2017-07-05 05:00:46 -0700 | [diff] [blame] | 114 | BbrBweFeedback(int flow_id, |
| 115 | int64_t send_time_us, |
| 116 | int64_t latest_send_time_ms, |
gnish | a36165c | 2017-08-20 09:19:58 -0700 | [diff] [blame] | 117 | const std::vector<uint16_t>& packet_feedback_vector); |
gnish | 6dcdf10 | 2017-06-05 06:01:26 -0700 | [diff] [blame] | 118 | virtual ~BbrBweFeedback() {} |
| 119 | |
gnish | a36165c | 2017-08-20 09:19:58 -0700 | [diff] [blame] | 120 | const std::vector<uint16_t>& packet_feedback_vector() const { |
gnish | 6dcdf10 | 2017-06-05 06:01:26 -0700 | [diff] [blame] | 121 | return packet_feedback_vector_; |
| 122 | } |
| 123 | |
| 124 | private: |
gnish | a36165c | 2017-08-20 09:19:58 -0700 | [diff] [blame] | 125 | const std::vector<uint16_t> packet_feedback_vector_; |
gnish | 6dcdf10 | 2017-06-05 06:01:26 -0700 | [diff] [blame] | 126 | }; |
| 127 | |
stefan@webrtc.org | 14b0279 | 2015-02-16 12:02:20 +0000 | [diff] [blame] | 128 | class RembFeedback : public FeedbackPacket { |
| 129 | public: |
| 130 | RembFeedback(int flow_id, |
| 131 | int64_t send_time_us, |
Cesar Magalhaes | c81591d | 2015-05-06 22:29:01 +0200 | [diff] [blame] | 132 | int64_t latest_send_time_ms, |
stefan@webrtc.org | 14b0279 | 2015-02-16 12:02:20 +0000 | [diff] [blame] | 133 | 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 | |
| 145 | class SendSideBweFeedback : public FeedbackPacket { |
| 146 | public: |
| 147 | typedef std::map<uint16_t, int64_t> ArrivalTimesMap; |
elad.alon | f949000 | 2017-03-06 05:32:21 -0800 | [diff] [blame] | 148 | 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.org | 14b0279 | 2015-02-16 12:02:20 +0000 | [diff] [blame] | 153 | virtual ~SendSideBweFeedback() {} |
| 154 | |
elad.alon | f949000 | 2017-03-06 05:32:21 -0800 | [diff] [blame] | 155 | const std::vector<PacketFeedback>& packet_feedback_vector() const { |
stefan@webrtc.org | 14b0279 | 2015-02-16 12:02:20 +0000 | [diff] [blame] | 156 | return packet_feedback_vector_; |
| 157 | } |
| 158 | |
| 159 | private: |
elad.alon | f949000 | 2017-03-06 05:32:21 -0800 | [diff] [blame] | 160 | const std::vector<PacketFeedback> packet_feedback_vector_; |
stefan@webrtc.org | 14b0279 | 2015-02-16 12:02:20 +0000 | [diff] [blame] | 161 | }; |
| 162 | |
stefan@webrtc.org | 7663684 | 2015-02-17 16:03:45 +0000 | [diff] [blame] | 163 | class NadaFeedback : public FeedbackPacket { |
| 164 | public: |
| 165 | NadaFeedback(int flow_id, |
Cesar Magalhaes | c81591d | 2015-05-06 22:29:01 +0200 | [diff] [blame] | 166 | int64_t this_send_time_us, |
| 167 | int64_t exp_smoothed_delay_ms, |
| 168 | int64_t est_queuing_delay_signal_ms, |
stefan@webrtc.org | 7663684 | 2015-02-17 16:03:45 +0000 | [diff] [blame] | 169 | int64_t congestion_signal, |
Cesar Magalhaes | c81591d | 2015-05-06 22:29:01 +0200 | [diff] [blame] | 170 | 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.org | 7663684 | 2015-02-17 16:03:45 +0000 | [diff] [blame] | 176 | congestion_signal_(congestion_signal), |
Cesar Magalhaes | c81591d | 2015-05-06 22:29:01 +0200 | [diff] [blame] | 177 | derivative_(derivative), |
| 178 | receiving_rate_(receiving_rate) {} |
stefan@webrtc.org | 7663684 | 2015-02-17 16:03:45 +0000 | [diff] [blame] | 179 | virtual ~NadaFeedback() {} |
| 180 | |
Cesar Magalhaes | c81591d | 2015-05-06 22:29:01 +0200 | [diff] [blame] | 181 | 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.org | 7663684 | 2015-02-17 16:03:45 +0000 | [diff] [blame] | 185 | int64_t congestion_signal() const { return congestion_signal_; } |
| 186 | float derivative() const { return derivative_; } |
Cesar Magalhaes | c81591d | 2015-05-06 22:29:01 +0200 | [diff] [blame] | 187 | float receiving_rate() const { return receiving_rate_; } |
stefan@webrtc.org | 7663684 | 2015-02-17 16:03:45 +0000 | [diff] [blame] | 188 | |
| 189 | private: |
Cesar Magalhaes | c81591d | 2015-05-06 22:29:01 +0200 | [diff] [blame] | 190 | 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.org | 7663684 | 2015-02-17 16:03:45 +0000 | [diff] [blame] | 195 | }; |
| 196 | |
Stefan Holmer | 3795937 | 2015-04-16 19:55:45 +0200 | [diff] [blame] | 197 | class TcpFeedback : public FeedbackPacket { |
| 198 | public: |
| 199 | TcpFeedback(int flow_id, |
| 200 | int64_t send_time_us, |
Cesar Magalhaes | c81591d | 2015-05-06 22:29:01 +0200 | [diff] [blame] | 201 | int64_t latest_send_time_ms, |
Stefan Holmer | 3795937 | 2015-04-16 19:55:45 +0200 | [diff] [blame] | 202 | const std::vector<uint16_t>& acked_packets) |
Cesar Magalhaes | c81591d | 2015-05-06 22:29:01 +0200 | [diff] [blame] | 203 | : FeedbackPacket(flow_id, send_time_us, latest_send_time_ms), |
| 204 | acked_packets_(acked_packets) {} |
Stefan Holmer | 3795937 | 2015-04-16 19:55:45 +0200 | [diff] [blame] | 205 | 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.org | 14b0279 | 2015-02-16 12:02:20 +0000 | [diff] [blame] | 213 | typedef std::list<Packet*> Packets; |
| 214 | typedef std::list<Packet*>::iterator PacketsIt; |
| 215 | typedef std::list<Packet*>::const_iterator PacketsConstIt; |
Cesar Magalhaes | c81591d | 2015-05-06 22:29:01 +0200 | [diff] [blame] | 216 | |
stefan@webrtc.org | 14b0279 | 2015-02-16 12:02:20 +0000 | [diff] [blame] | 217 | } // namespace bwe |
| 218 | } // namespace testing |
| 219 | } // namespace webrtc |
| 220 | #endif // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_PACKET_H_ |