114b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org/* 214b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. 314b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org * 414b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org * Use of this source code is governed by a BSD-style license 514b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org * that can be found in the LICENSE file in the root of the source 614b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org * tree. An additional intellectual property rights grant can be found 714b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org * in the file PATENTS. All contributing project authors may 814b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org * be found in the AUTHORS file in the root of the source tree. 914b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org */ 1014b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org 1114b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org#ifndef WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_PACKET_H_ 1214b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_PACKET_H_ 1314b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org 1414b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org#include <list> 1514b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org#include <map> 1614b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org#include <vector> 1714b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org 1814b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org#include "webrtc/common_types.h" 19ff761fba8274d93bd73e76c8b8a1f2d0776dd840Henrik Kjellander#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" 2014b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h" 2114b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org 2214b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.orgnamespace webrtc { 2314b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.orgnamespace testing { 2414b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.orgnamespace bwe { 2514b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org 2614b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.orgclass Packet { 2714b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org public: 2814b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org enum Type { kMedia, kFeedback }; 2914b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org 3014b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org Packet(); 3114b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org Packet(int flow_id, int64_t send_time_us, size_t payload_size); 3214b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org virtual ~Packet(); 3314b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org 3414b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org virtual bool operator<(const Packet& rhs) const; 3514b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org 3614b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org virtual int flow_id() const { return flow_id_; } 3714b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org virtual void set_send_time_us(int64_t send_time_us); 3814b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org virtual int64_t send_time_us() const { return send_time_us_; } 39bf40b42af585128a5b22299bdfaff706659774bdCesar Magalhaes virtual int64_t sender_timestamp_us() const { return sender_timestamp_us_; } 4014b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org virtual size_t payload_size() const { return payload_size_; } 4114b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org virtual Packet::Type GetPacketType() const = 0; 429c261f2d13793fbb5a0d07b26bec4154bc38342bCesar Magalhaes virtual void set_sender_timestamp_us(int64_t sender_timestamp_us) { 43c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes sender_timestamp_us_ = sender_timestamp_us; 44c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes } 45318673cf5a1b230d445a50fdc4869f4b8f99c85dsprang virtual void set_paced(bool paced) { paced_ = paced; } 46318673cf5a1b230d445a50fdc4869f4b8f99c85dsprang virtual bool paced() const { return paced_; } 479c261f2d13793fbb5a0d07b26bec4154bc38342bCesar Magalhaes virtual int64_t creation_time_ms() const { 489c261f2d13793fbb5a0d07b26bec4154bc38342bCesar Magalhaes return (creation_time_us_ + 500) / 1000; 499c261f2d13793fbb5a0d07b26bec4154bc38342bCesar Magalhaes } 509c261f2d13793fbb5a0d07b26bec4154bc38342bCesar Magalhaes virtual int64_t sender_timestamp_ms() const { 519c261f2d13793fbb5a0d07b26bec4154bc38342bCesar Magalhaes return (sender_timestamp_us_ + 500) / 1000; 529c261f2d13793fbb5a0d07b26bec4154bc38342bCesar Magalhaes } 539c261f2d13793fbb5a0d07b26bec4154bc38342bCesar Magalhaes virtual int64_t send_time_ms() const { return (send_time_us_ + 500) / 1000; } 5414b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org 55c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes protected: 5614b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org int flow_id_; 5714b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org int64_t creation_time_us_; // Time when the packet was created. 5814b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org int64_t send_time_us_; // Time the packet left last processor touching it. 59c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes int64_t sender_timestamp_us_; // Time the packet left the Sender. 60c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes size_t payload_size_; // Size of the (non-existent, simulated) payload. 61318673cf5a1b230d445a50fdc4869f4b8f99c85dsprang bool paced_; // True if sent through paced sender. 6214b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org}; 6314b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org 6414b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.orgclass MediaPacket : public Packet { 6514b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org public: 6614b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org MediaPacket(); 6714b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org MediaPacket(int flow_id, 6814b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org int64_t send_time_us, 6914b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org size_t payload_size, 70379593792082a86f389df9b1b790cc0fe9eb9975Stefan Holmer uint16_t sequence_number); 71379593792082a86f389df9b1b790cc0fe9eb9975Stefan Holmer MediaPacket(int flow_id, 72379593792082a86f389df9b1b790cc0fe9eb9975Stefan Holmer int64_t send_time_us, 73379593792082a86f389df9b1b790cc0fe9eb9975Stefan Holmer size_t payload_size, 7414b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org const RTPHeader& header); 75fb19f49c149018c02bd929cbb962aad4b3118000Cesar Magalhaes MediaPacket(int64_t send_time_us, uint16_t sequence_number); 769c261f2d13793fbb5a0d07b26bec4154bc38342bCesar Magalhaes 7714b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org virtual ~MediaPacket() {} 7814b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org 794346d92578e5acbf3c40c89967c548e8f72e7543stefan@webrtc.org int64_t GetAbsSendTimeInMs() const { 804346d92578e5acbf3c40c89967c548e8f72e7543stefan@webrtc.org int64_t timestamp = header_.extension.absoluteSendTime 814346d92578e5acbf3c40c89967c548e8f72e7543stefan@webrtc.org << kAbsSendTimeInterArrivalUpshift; 824346d92578e5acbf3c40c89967c548e8f72e7543stefan@webrtc.org return 1000.0 * timestamp / static_cast<double>(1 << kInterArrivalShift); 834346d92578e5acbf3c40c89967c548e8f72e7543stefan@webrtc.org } 8414b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org void SetAbsSendTimeMs(int64_t abs_send_time_ms); 8514b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org const RTPHeader& header() const { return header_; } 8614b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org virtual Packet::Type GetPacketType() const { return kMedia; } 87c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes uint16_t sequence_number() const { return header_.sequenceNumber; } 8814b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org 8914b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org private: 904346d92578e5acbf3c40c89967c548e8f72e7543stefan@webrtc.org static const int kAbsSendTimeFraction = 18; 914346d92578e5acbf3c40c89967c548e8f72e7543stefan@webrtc.org static const int kAbsSendTimeInterArrivalUpshift = 8; 924346d92578e5acbf3c40c89967c548e8f72e7543stefan@webrtc.org static const int kInterArrivalShift = 934346d92578e5acbf3c40c89967c548e8f72e7543stefan@webrtc.org kAbsSendTimeFraction + kAbsSendTimeInterArrivalUpshift; 944346d92578e5acbf3c40c89967c548e8f72e7543stefan@webrtc.org 9514b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org RTPHeader header_; 9614b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org}; 9714b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org 9814b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.orgclass FeedbackPacket : public Packet { 9914b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org public: 100c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes FeedbackPacket(int flow_id, 101c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes int64_t this_send_time_us, 102c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes int64_t latest_send_time_ms) 103c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes : Packet(flow_id, this_send_time_us, 0), 104c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes latest_send_time_ms_(latest_send_time_ms) {} 10514b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org virtual ~FeedbackPacket() {} 10614b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org 10714b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org virtual Packet::Type GetPacketType() const { return kFeedback; } 108c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes int64_t latest_send_time_ms() const { return latest_send_time_ms_; } 109c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes 110c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes private: 1119c261f2d13793fbb5a0d07b26bec4154bc38342bCesar Magalhaes int64_t latest_send_time_ms_; // Time stamp for the latest sent FbPacket. 11214b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org}; 11314b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org 11414b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.orgclass RembFeedback : public FeedbackPacket { 11514b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org public: 11614b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org RembFeedback(int flow_id, 11714b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org int64_t send_time_us, 118c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes int64_t latest_send_time_ms, 11914b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org uint32_t estimated_bps, 12014b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org RTCPReportBlock report_block); 12114b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org virtual ~RembFeedback() {} 12214b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org 12314b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org uint32_t estimated_bps() const { return estimated_bps_; } 12414b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org RTCPReportBlock report_block() const { return report_block_; } 12514b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org 12614b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org private: 12714b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org const uint32_t estimated_bps_; 12814b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org const RTCPReportBlock report_block_; 12914b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org}; 13014b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org 13114b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.orgclass SendSideBweFeedback : public FeedbackPacket { 13214b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org public: 13314b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org typedef std::map<uint16_t, int64_t> ArrivalTimesMap; 13414b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org SendSideBweFeedback(int flow_id, 13514b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org int64_t send_time_us, 136c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes int64_t latest_send_time_ms, 13714b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org const std::vector<PacketInfo>& packet_feedback_vector); 13814b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org virtual ~SendSideBweFeedback() {} 13914b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org 14014b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org const std::vector<PacketInfo>& packet_feedback_vector() const { 14114b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org return packet_feedback_vector_; 14214b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org } 14314b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org 14414b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org private: 14514b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org const std::vector<PacketInfo> packet_feedback_vector_; 14614b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org}; 14714b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org 148766368425890f267f99bbf03fb298a9575a755c4stefan@webrtc.orgclass NadaFeedback : public FeedbackPacket { 149766368425890f267f99bbf03fb298a9575a755c4stefan@webrtc.org public: 150766368425890f267f99bbf03fb298a9575a755c4stefan@webrtc.org NadaFeedback(int flow_id, 151c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes int64_t this_send_time_us, 152c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes int64_t exp_smoothed_delay_ms, 153c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes int64_t est_queuing_delay_signal_ms, 154766368425890f267f99bbf03fb298a9575a755c4stefan@webrtc.org int64_t congestion_signal, 155c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes float derivative, 156c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes float receiving_rate, 157c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes int64_t latest_send_time_ms) 158c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes : FeedbackPacket(flow_id, this_send_time_us, latest_send_time_ms), 159c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes exp_smoothed_delay_ms_(exp_smoothed_delay_ms), 160c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes est_queuing_delay_signal_ms_(est_queuing_delay_signal_ms), 161766368425890f267f99bbf03fb298a9575a755c4stefan@webrtc.org congestion_signal_(congestion_signal), 162c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes derivative_(derivative), 163c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes receiving_rate_(receiving_rate) {} 164766368425890f267f99bbf03fb298a9575a755c4stefan@webrtc.org virtual ~NadaFeedback() {} 165766368425890f267f99bbf03fb298a9575a755c4stefan@webrtc.org 166c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes int64_t exp_smoothed_delay_ms() const { return exp_smoothed_delay_ms_; } 167c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes int64_t est_queuing_delay_signal_ms() const { 168c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes return est_queuing_delay_signal_ms_; 169c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes } 170766368425890f267f99bbf03fb298a9575a755c4stefan@webrtc.org int64_t congestion_signal() const { return congestion_signal_; } 171766368425890f267f99bbf03fb298a9575a755c4stefan@webrtc.org float derivative() const { return derivative_; } 172c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes float receiving_rate() const { return receiving_rate_; } 173766368425890f267f99bbf03fb298a9575a755c4stefan@webrtc.org 174766368425890f267f99bbf03fb298a9575a755c4stefan@webrtc.org private: 175c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes int64_t exp_smoothed_delay_ms_; // Referred as d_hat_n. 176c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes int64_t est_queuing_delay_signal_ms_; // Referred as d_tilde_n. 177c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes int64_t congestion_signal_; // Referred as x_n. 178c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes float derivative_; // Referred as x'_n. 179c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes float receiving_rate_; // Referred as R_r. 180766368425890f267f99bbf03fb298a9575a755c4stefan@webrtc.org}; 181766368425890f267f99bbf03fb298a9575a755c4stefan@webrtc.org 182379593792082a86f389df9b1b790cc0fe9eb9975Stefan Holmerclass TcpFeedback : public FeedbackPacket { 183379593792082a86f389df9b1b790cc0fe9eb9975Stefan Holmer public: 184379593792082a86f389df9b1b790cc0fe9eb9975Stefan Holmer TcpFeedback(int flow_id, 185379593792082a86f389df9b1b790cc0fe9eb9975Stefan Holmer int64_t send_time_us, 186c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes int64_t latest_send_time_ms, 187379593792082a86f389df9b1b790cc0fe9eb9975Stefan Holmer const std::vector<uint16_t>& acked_packets) 188c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes : FeedbackPacket(flow_id, send_time_us, latest_send_time_ms), 189c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes acked_packets_(acked_packets) {} 190379593792082a86f389df9b1b790cc0fe9eb9975Stefan Holmer virtual ~TcpFeedback() {} 191379593792082a86f389df9b1b790cc0fe9eb9975Stefan Holmer 192379593792082a86f389df9b1b790cc0fe9eb9975Stefan Holmer const std::vector<uint16_t>& acked_packets() const { return acked_packets_; } 193379593792082a86f389df9b1b790cc0fe9eb9975Stefan Holmer 194379593792082a86f389df9b1b790cc0fe9eb9975Stefan Holmer private: 195379593792082a86f389df9b1b790cc0fe9eb9975Stefan Holmer const std::vector<uint16_t> acked_packets_; 196379593792082a86f389df9b1b790cc0fe9eb9975Stefan Holmer}; 197379593792082a86f389df9b1b790cc0fe9eb9975Stefan Holmer 19814b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.orgtypedef std::list<Packet*> Packets; 19914b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.orgtypedef std::list<Packet*>::iterator PacketsIt; 20014b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.orgtypedef std::list<Packet*>::const_iterator PacketsConstIt; 201c81591d63f5e441bd26025a5e986bb2ebfd9fdfdCesar Magalhaes 20214b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org} // namespace bwe 20314b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org} // namespace testing 20414b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org} // namespace webrtc 20514b0279416c4916534c1e76939b0b8927a208a04stefan@webrtc.org#endif // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_PACKET_H_ 206