pbos 2169d8bc68 Reland of move audio/video distinction for probe packets. (patchset #1 id:1 of https://codereview.webrtc.org/2086633002/ )
Reason for revert:
Fix already landed in google3, this revert actually breaks the import.

Original issue's description:
> Revert of Remove audio/video distinction for probe packets. (patchset #2 id:20001 of https://codereview.webrtc.org/2061193002/ )
>
> Reason for revert:
> Revert this because it broke the google3 import build.
> http://webrtc-buildbot-master.mtv.corp.google.com:21000/builders/WebRTC%20google3%20Importer%20%28Shem%20TOT%29/builds/67/steps/blaze_regular_tests/logs/stdio
>
> Original issue's description:
> > Remove audio/video distinction for probe packets.
> >
> > Allows detecting large-enough audio packets as part of a probe,
> > speculative fix for a rampup-time regression in M50. These packets are
> > accounted on the send side when probing.
> >
> > BUG=webrtc:5985
> > R=mflodman@webrtc.org, philipel@webrtc.org
> >
> > Committed: https://crrev.com/a7d88d38448f6a5677a017562765ab505b89d468
> > Cr-Commit-Position: refs/heads/master@{#13210}
>
> TBR=mflodman@webrtc.org,philipel@webrtc.org,pbos@webrtc.org
> # Skipping CQ checks because original CL landed less than 1 days ago.
> NOPRESUBMIT=true
> NOTREECHECKS=true
> NOTRY=true
> BUG=webrtc:5985
>
> Committed: https://crrev.com/17bde8c96ee8b5a7e496a7dc98828b84f9756925
> Cr-Commit-Position: refs/heads/master@{#13221}

TBR=mflodman@webrtc.org,philipel@webrtc.org,honghaiz@webrtc.org
# Skipping CQ checks because original CL landed less than 1 days ago.
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=webrtc:5985

Review-Url: https://codereview.webrtc.org/2085653002
Cr-Commit-Position: refs/heads/master@{#13223}
2016-06-20 18:53:09 +00:00

203 lines
6.8 KiB
C++

/*
* Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#ifndef WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_PACKET_H_
#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_PACKET_H_
#include <list>
#include <map>
#include <vector>
#include "webrtc/common_types.h"
#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
namespace webrtc {
namespace testing {
namespace bwe {
class Packet {
public:
enum Type { kMedia, kFeedback };
Packet();
Packet(int flow_id, int64_t send_time_us, size_t payload_size);
virtual ~Packet();
virtual bool operator<(const Packet& rhs) const;
virtual int flow_id() const { return flow_id_; }
virtual void set_send_time_us(int64_t send_time_us);
virtual int64_t send_time_us() const { return send_time_us_; }
virtual int64_t sender_timestamp_us() const { return sender_timestamp_us_; }
virtual size_t payload_size() const { return payload_size_; }
virtual Packet::Type GetPacketType() const = 0;
virtual void set_sender_timestamp_us(int64_t sender_timestamp_us) {
sender_timestamp_us_ = sender_timestamp_us;
}
virtual int64_t creation_time_ms() const {
return (creation_time_us_ + 500) / 1000;
}
virtual int64_t sender_timestamp_ms() const {
return (sender_timestamp_us_ + 500) / 1000;
}
virtual int64_t send_time_ms() const { return (send_time_us_ + 500) / 1000; }
protected:
int flow_id_;
int64_t creation_time_us_; // Time when the packet was created.
int64_t send_time_us_; // Time the packet left last processor touching it.
int64_t sender_timestamp_us_; // Time the packet left the Sender.
size_t payload_size_; // Size of the (non-existent, simulated) payload.
};
class MediaPacket : public Packet {
public:
MediaPacket();
MediaPacket(int flow_id,
int64_t send_time_us,
size_t payload_size,
uint16_t sequence_number);
MediaPacket(int flow_id,
int64_t send_time_us,
size_t payload_size,
const RTPHeader& header);
MediaPacket(int64_t send_time_us, uint16_t sequence_number);
virtual ~MediaPacket() {}
int64_t GetAbsSendTimeInMs() const {
int64_t timestamp = header_.extension.absoluteSendTime
<< kAbsSendTimeInterArrivalUpshift;
return 1000.0 * timestamp / static_cast<double>(1 << kInterArrivalShift);
}
void SetAbsSendTimeMs(int64_t abs_send_time_ms);
const RTPHeader& header() const { return header_; }
virtual Packet::Type GetPacketType() const { return kMedia; }
uint16_t sequence_number() const { return header_.sequenceNumber; }
private:
static const int kAbsSendTimeFraction = 18;
static const int kAbsSendTimeInterArrivalUpshift = 8;
static const int kInterArrivalShift =
kAbsSendTimeFraction + kAbsSendTimeInterArrivalUpshift;
RTPHeader header_;
};
class FeedbackPacket : public Packet {
public:
FeedbackPacket(int flow_id,
int64_t this_send_time_us,
int64_t latest_send_time_ms)
: Packet(flow_id, this_send_time_us, 0),
latest_send_time_ms_(latest_send_time_ms) {}
virtual ~FeedbackPacket() {}
virtual Packet::Type GetPacketType() const { return kFeedback; }
int64_t latest_send_time_ms() const { return latest_send_time_ms_; }
private:
int64_t latest_send_time_ms_; // Time stamp for the latest sent FbPacket.
};
class RembFeedback : public FeedbackPacket {
public:
RembFeedback(int flow_id,
int64_t send_time_us,
int64_t latest_send_time_ms,
uint32_t estimated_bps,
RTCPReportBlock report_block);
virtual ~RembFeedback() {}
uint32_t estimated_bps() const { return estimated_bps_; }
RTCPReportBlock report_block() const { return report_block_; }
private:
const uint32_t estimated_bps_;
const RTCPReportBlock report_block_;
};
class SendSideBweFeedback : public FeedbackPacket {
public:
typedef std::map<uint16_t, int64_t> ArrivalTimesMap;
SendSideBweFeedback(int flow_id,
int64_t send_time_us,
int64_t latest_send_time_ms,
const std::vector<PacketInfo>& packet_feedback_vector);
virtual ~SendSideBweFeedback() {}
const std::vector<PacketInfo>& packet_feedback_vector() const {
return packet_feedback_vector_;
}
private:
const std::vector<PacketInfo> packet_feedback_vector_;
};
class NadaFeedback : public FeedbackPacket {
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)
: FeedbackPacket(flow_id, this_send_time_us, latest_send_time_ms),
exp_smoothed_delay_ms_(exp_smoothed_delay_ms),
est_queuing_delay_signal_ms_(est_queuing_delay_signal_ms),
congestion_signal_(congestion_signal),
derivative_(derivative),
receiving_rate_(receiving_rate) {}
virtual ~NadaFeedback() {}
int64_t exp_smoothed_delay_ms() const { return exp_smoothed_delay_ms_; }
int64_t est_queuing_delay_signal_ms() const {
return est_queuing_delay_signal_ms_;
}
int64_t congestion_signal() const { return congestion_signal_; }
float derivative() const { return derivative_; }
float receiving_rate() const { return receiving_rate_; }
private:
int64_t exp_smoothed_delay_ms_; // Referred as d_hat_n.
int64_t est_queuing_delay_signal_ms_; // Referred as d_tilde_n.
int64_t congestion_signal_; // Referred as x_n.
float derivative_; // Referred as x'_n.
float receiving_rate_; // Referred as R_r.
};
class TcpFeedback : public FeedbackPacket {
public:
TcpFeedback(int flow_id,
int64_t send_time_us,
int64_t latest_send_time_ms,
const std::vector<uint16_t>& acked_packets)
: FeedbackPacket(flow_id, send_time_us, latest_send_time_ms),
acked_packets_(acked_packets) {}
virtual ~TcpFeedback() {}
const std::vector<uint16_t>& acked_packets() const { return acked_packets_; }
private:
const std::vector<uint16_t> acked_packets_;
};
typedef std::list<Packet*> Packets;
typedef std::list<Packet*>::iterator PacketsIt;
typedef std::list<Packet*>::const_iterator PacketsConstIt;
} // namespace bwe
} // namespace testing
} // namespace webrtc
#endif // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_PACKET_H_