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>
16 #include <vector>
17 
18 #include "webrtc/common_types.h"
19 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
20 #include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
21 
22 namespace webrtc {
23 namespace testing {
24 namespace bwe {
25 
26 class Packet {
27  public:
28   enum Type { kMedia, kFeedback };
29 
30   Packet();
31   Packet(int flow_id, int64_t send_time_us, size_t payload_size);
32   virtual ~Packet();
33 
34   virtual bool operator<(const Packet& rhs) const;
35 
flow_id()36   virtual int flow_id() const { return flow_id_; }
37   virtual void set_send_time_us(int64_t send_time_us);
send_time_us()38   virtual int64_t send_time_us() const { return send_time_us_; }
sender_timestamp_us()39   virtual int64_t sender_timestamp_us() const { return sender_timestamp_us_; }
payload_size()40   virtual size_t payload_size() const { return payload_size_; }
41   virtual Packet::Type GetPacketType() const = 0;
set_sender_timestamp_us(int64_t sender_timestamp_us)42   virtual void set_sender_timestamp_us(int64_t sender_timestamp_us) {
43     sender_timestamp_us_ = sender_timestamp_us;
44   }
set_paced(bool paced)45   virtual void set_paced(bool paced) { paced_ = paced; }
paced()46   virtual bool paced() const { return paced_; }
creation_time_ms()47   virtual int64_t creation_time_ms() const {
48     return (creation_time_us_ + 500) / 1000;
49   }
sender_timestamp_ms()50   virtual int64_t sender_timestamp_ms() const {
51     return (sender_timestamp_us_ + 500) / 1000;
52   }
send_time_ms()53   virtual int64_t send_time_ms() const { return (send_time_us_ + 500) / 1000; }
54 
55  protected:
56   int flow_id_;
57   int64_t creation_time_us_;  // Time when the packet was created.
58   int64_t send_time_us_;  // Time the packet left last processor touching it.
59   int64_t sender_timestamp_us_;  // Time the packet left the Sender.
60   size_t payload_size_;  // Size of the (non-existent, simulated) payload.
61   bool paced_;           // True if sent through paced sender.
62 };
63 
64 class MediaPacket : public Packet {
65  public:
66   MediaPacket();
67   MediaPacket(int flow_id,
68               int64_t send_time_us,
69               size_t payload_size,
70               uint16_t sequence_number);
71   MediaPacket(int flow_id,
72               int64_t send_time_us,
73               size_t payload_size,
74               const RTPHeader& header);
75   MediaPacket(int64_t send_time_us, uint16_t sequence_number);
76 
~MediaPacket()77   virtual ~MediaPacket() {}
78 
GetAbsSendTimeInMs()79   int64_t GetAbsSendTimeInMs() const {
80     int64_t timestamp = header_.extension.absoluteSendTime
81                         << kAbsSendTimeInterArrivalUpshift;
82     return 1000.0 * timestamp / static_cast<double>(1 << kInterArrivalShift);
83   }
84   void SetAbsSendTimeMs(int64_t abs_send_time_ms);
header()85   const RTPHeader& header() const { return header_; }
GetPacketType()86   virtual Packet::Type GetPacketType() const { return kMedia; }
sequence_number()87   uint16_t sequence_number() const { return header_.sequenceNumber; }
88 
89  private:
90   static const int kAbsSendTimeFraction = 18;
91   static const int kAbsSendTimeInterArrivalUpshift = 8;
92   static const int kInterArrivalShift =
93       kAbsSendTimeFraction + kAbsSendTimeInterArrivalUpshift;
94 
95   RTPHeader header_;
96 };
97 
98 class FeedbackPacket : public Packet {
99  public:
FeedbackPacket(int flow_id,int64_t this_send_time_us,int64_t latest_send_time_ms)100   FeedbackPacket(int flow_id,
101                  int64_t this_send_time_us,
102                  int64_t latest_send_time_ms)
103       : Packet(flow_id, this_send_time_us, 0),
104         latest_send_time_ms_(latest_send_time_ms) {}
~FeedbackPacket()105   virtual ~FeedbackPacket() {}
106 
GetPacketType()107   virtual Packet::Type GetPacketType() const { return kFeedback; }
latest_send_time_ms()108   int64_t latest_send_time_ms() const { return latest_send_time_ms_; }
109 
110  private:
111   int64_t latest_send_time_ms_;  // Time stamp for the latest sent FbPacket.
112 };
113 
114 class RembFeedback : public FeedbackPacket {
115  public:
116   RembFeedback(int flow_id,
117                int64_t send_time_us,
118                int64_t latest_send_time_ms,
119                uint32_t estimated_bps,
120                RTCPReportBlock report_block);
~RembFeedback()121   virtual ~RembFeedback() {}
122 
estimated_bps()123   uint32_t estimated_bps() const { return estimated_bps_; }
report_block()124   RTCPReportBlock report_block() const { return report_block_; }
125 
126  private:
127   const uint32_t estimated_bps_;
128   const RTCPReportBlock report_block_;
129 };
130 
131 class SendSideBweFeedback : public FeedbackPacket {
132  public:
133   typedef std::map<uint16_t, int64_t> ArrivalTimesMap;
134   SendSideBweFeedback(int flow_id,
135                       int64_t send_time_us,
136                       int64_t latest_send_time_ms,
137                       const std::vector<PacketInfo>& packet_feedback_vector);
~SendSideBweFeedback()138   virtual ~SendSideBweFeedback() {}
139 
packet_feedback_vector()140   const std::vector<PacketInfo>& packet_feedback_vector() const {
141     return packet_feedback_vector_;
142   }
143 
144  private:
145   const std::vector<PacketInfo> packet_feedback_vector_;
146 };
147 
148 class NadaFeedback : public FeedbackPacket {
149  public:
NadaFeedback(int flow_id,int64_t this_send_time_us,int64_t exp_smoothed_delay_ms,int64_t est_queuing_delay_signal_ms,int64_t congestion_signal,float derivative,float receiving_rate,int64_t latest_send_time_ms)150   NadaFeedback(int flow_id,
151                int64_t this_send_time_us,
152                int64_t exp_smoothed_delay_ms,
153                int64_t est_queuing_delay_signal_ms,
154                int64_t congestion_signal,
155                float derivative,
156                float receiving_rate,
157                int64_t latest_send_time_ms)
158       : FeedbackPacket(flow_id, this_send_time_us, latest_send_time_ms),
159         exp_smoothed_delay_ms_(exp_smoothed_delay_ms),
160         est_queuing_delay_signal_ms_(est_queuing_delay_signal_ms),
161         congestion_signal_(congestion_signal),
162         derivative_(derivative),
163         receiving_rate_(receiving_rate) {}
~NadaFeedback()164   virtual ~NadaFeedback() {}
165 
exp_smoothed_delay_ms()166   int64_t exp_smoothed_delay_ms() const { return exp_smoothed_delay_ms_; }
est_queuing_delay_signal_ms()167   int64_t est_queuing_delay_signal_ms() const {
168     return est_queuing_delay_signal_ms_;
169   }
congestion_signal()170   int64_t congestion_signal() const { return congestion_signal_; }
derivative()171   float derivative() const { return derivative_; }
receiving_rate()172   float receiving_rate() const { return receiving_rate_; }
173 
174  private:
175   int64_t exp_smoothed_delay_ms_;        // Referred as d_hat_n.
176   int64_t est_queuing_delay_signal_ms_;  // Referred as d_tilde_n.
177   int64_t congestion_signal_;            // Referred as x_n.
178   float derivative_;                     // Referred as x'_n.
179   float receiving_rate_;                 // Referred as R_r.
180 };
181 
182 class TcpFeedback : public FeedbackPacket {
183  public:
TcpFeedback(int flow_id,int64_t send_time_us,int64_t latest_send_time_ms,const std::vector<uint16_t> & acked_packets)184   TcpFeedback(int flow_id,
185               int64_t send_time_us,
186               int64_t latest_send_time_ms,
187               const std::vector<uint16_t>& acked_packets)
188       : FeedbackPacket(flow_id, send_time_us, latest_send_time_ms),
189         acked_packets_(acked_packets) {}
~TcpFeedback()190   virtual ~TcpFeedback() {}
191 
acked_packets()192   const std::vector<uint16_t>& acked_packets() const { return acked_packets_; }
193 
194  private:
195   const std::vector<uint16_t> acked_packets_;
196 };
197 
198 typedef std::list<Packet*> Packets;
199 typedef std::list<Packet*>::iterator PacketsIt;
200 typedef std::list<Packet*>::const_iterator PacketsConstIt;
201 
202 }  // namespace bwe
203 }  // namespace testing
204 }  // namespace webrtc
205 #endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_PACKET_H_
206