Use SendTimeHistory to keep track of send times in simulations.

Use SendTimeHistory to keep track of send times in simulations.
Keep piggybacking send time in PacketInfo for now but use history in
order to be more in line with what we expect to do.

Landing this for sprang@. Original CL: https://review.webrtc.org/43559004/

TBR=sprang@webrtc.org
BUG=4308

Review URL: https://webrtc-codereview.appspot.com/48569004

Cr-Commit-Position: refs/heads/master@{#8778}
git-svn-id: http://webrtc.googlecode.com/svn/trunk@8778 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
stefan@webrtc.org 2015-03-18 13:40:54 +00:00
parent f18993323d
commit 4346d92578
10 changed files with 51 additions and 7 deletions

View File

@ -321,6 +321,7 @@ class EncodedVideoData {
if (data.payloadSize > 0) {
payloadData = new uint8_t[data.payloadSize];
memcpy(payloadData, data.payloadData, data.payloadSize);
bufferSize = data.payloadSize;
} else {
payloadData = NULL;
}

View File

@ -9,6 +9,7 @@
*/
#include "testing/gtest/include/gtest/gtest.h"
#include "webrtc/base/scoped_ptr.h"
#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
#include "webrtc/modules/remote_bitrate_estimator/test/bwe_test.h"
#include "webrtc/modules/remote_bitrate_estimator/test/packet_receiver.h"

View File

@ -28,6 +28,7 @@ class NullBweSender : public BweSender {
int GetFeedbackIntervalMs() const override { return 1000; }
void GiveFeedback(const FeedbackPacket& feedback) override {}
void OnPacketsSent(const Packets& packets) override {}
int64_t TimeUntilNextProcess() override {
return std::numeric_limits<int64_t>::max();
}

View File

@ -30,6 +30,7 @@ class BweSender : public Module {
virtual int GetFeedbackIntervalMs() const = 0;
virtual void GiveFeedback(const FeedbackPacket& feedback) = 0;
virtual void OnPacketsSent(const Packets& packets) = 0;
private:
DISALLOW_COPY_AND_ASSIGN(BweSender);

View File

@ -45,6 +45,7 @@ class NadaBweSender : public BweSender {
int GetFeedbackIntervalMs() const override;
void GiveFeedback(const FeedbackPacket& feedback) override;
void OnPacketsSent(const Packets& packets) override {}
int64_t TimeUntilNextProcess() override;
int Process() override;

View File

@ -33,6 +33,7 @@ class RembBweSender : public BweSender {
int GetFeedbackIntervalMs() const override;
void GiveFeedback(const FeedbackPacket& feedback) override;
void OnPacketsSent(const Packets& packets) override {}
int64_t TimeUntilNextProcess() override;
int Process() override;

View File

@ -10,6 +10,8 @@
#include "webrtc/modules/remote_bitrate_estimator/test/estimators/send_side.h"
#include "webrtc/base/logging.h"
namespace webrtc {
namespace testing {
namespace bwe {
@ -20,7 +22,8 @@ FullBweSender::FullBweSender(int kbps, BitrateObserver* observer, Clock* clock)
rbe_(AbsoluteSendTimeRemoteBitrateEstimatorFactory()
.Create(this, clock, kAimdControl, 1000 * kMinBitrateKbps)),
feedback_observer_(bitrate_controller_->CreateRtcpBandwidthObserver()),
clock_(clock) {
clock_(clock),
send_time_history_(10000) {
assert(kbps >= kMinBitrateKbps);
assert(kbps <= kMaxBitrateKbps);
bitrate_controller_->SetStartBitrate(1000 * kbps);
@ -40,7 +43,15 @@ void FullBweSender::GiveFeedback(const FeedbackPacket& feedback) {
static_cast<const SendSideBweFeedback&>(feedback);
if (fb.packet_feedback_vector().empty())
return;
rbe_->IncomingPacketFeedbackVector(fb.packet_feedback_vector());
// TODO(sprang): Unconstify PacketInfo so we don't need temp copy?
std::vector<PacketInfo> packet_feedback_vector(fb.packet_feedback_vector());
for (PacketInfo& packet : packet_feedback_vector) {
if (!send_time_history_.GetSendTime(packet.sequence_number,
&packet.send_time_ms, true)) {
LOG(LS_WARNING) << "Ack arrived too late.";
}
}
rbe_->IncomingPacketFeedbackVector(packet_feedback_vector);
// TODO(holmer): Handle losses in between feedback packets.
int expected_packets = fb.packet_feedback_vector().back().sequence_number -
fb.packet_feedback_vector().front().sequence_number +
@ -58,6 +69,17 @@ void FullBweSender::GiveFeedback(const FeedbackPacket& feedback) {
bitrate_controller_->Process();
}
void FullBweSender::OnPacketsSent(const Packets& packets) {
for (Packet* packet : packets) {
if (packet->GetPacketType() == Packet::kMedia) {
MediaPacket* media_packet = static_cast<MediaPacket*>(packet);
send_time_history_.AddAndRemoveOldSendTimes(
media_packet->header().sequenceNumber,
media_packet->GetAbsSendTimeInMs());
}
}
}
void FullBweSender::OnReceiveBitrateChanged(
const std::vector<unsigned int>& ssrcs,
unsigned int bitrate) {

View File

@ -13,6 +13,7 @@
#include <vector>
#include "webrtc/modules/bitrate_controller/send_time_history.h"
#include "webrtc/modules/remote_bitrate_estimator/test/bwe.h"
namespace webrtc {
@ -26,6 +27,7 @@ class FullBweSender : public BweSender, public RemoteBitrateObserver {
int GetFeedbackIntervalMs() const override;
void GiveFeedback(const FeedbackPacket& feedback) override;
void OnPacketsSent(const Packets& packets) override;
void OnReceiveBitrateChanged(const std::vector<unsigned int>& ssrcs,
unsigned int bitrate) override;
int64_t TimeUntilNextProcess() override;
@ -39,6 +41,7 @@ class FullBweSender : public BweSender, public RemoteBitrateObserver {
private:
Clock* const clock_;
RTCPReportBlock report_block_;
SendTimeHistory send_time_history_;
DISALLOW_IMPLICIT_CONSTRUCTORS(FullBweSender);
};

View File

@ -57,12 +57,21 @@ class MediaPacket : public Packet {
MediaPacket(int64_t send_time_us, uint32_t sequence_number);
virtual ~MediaPacket() {}
int64_t GetAbsSendTimeInMs() const;
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; }
private:
static const int kAbsSendTimeFraction = 18;
static const int kAbsSendTimeInterArrivalUpshift = 8;
static const int kInterArrivalShift =
kAbsSendTimeFraction + kAbsSendTimeInterArrivalUpshift;
RTPHeader header_;
};

View File

@ -22,14 +22,14 @@ namespace bwe {
PacketSender::PacketSender(PacketProcessorListener* listener,
VideoSource* source,
BandwidthEstimatorType estimator)
BandwidthEstimatorType estimator_type)
: PacketProcessor(listener, source->flow_id(), kSender),
// For Packet::send_time_us() to be comparable with timestamps from
// clock_, the clock of the PacketSender and the Source must be aligned.
// We assume that both start at time 0.
clock_(0),
source_(source),
bwe_(CreateBweSender(estimator,
bwe_(CreateBweSender(estimator_type,
source_->bits_per_second() / 1000,
this,
&clock_)) {
@ -49,7 +49,7 @@ void PacketSender::RunFor(int64_t time_ms, Packets* in_out) {
void PacketSender::ProcessFeedbackAndGeneratePackets(
int64_t time_ms,
std::list<FeedbackPacket*>* feedbacks,
Packets* generated) {
Packets* packets) {
do {
// Make sure to at least run Process() below every 100 ms.
int64_t time_to_run_ms = std::min<int64_t>(time_ms, 100);
@ -60,7 +60,10 @@ void PacketSender::ProcessFeedbackAndGeneratePackets(
time_to_run_ms =
std::max<int64_t>(std::min(time_ms, time_until_feedback_ms), 0);
}
source_->RunFor(time_to_run_ms, generated);
Packets generated;
source_->RunFor(time_to_run_ms, &generated);
bwe_->OnPacketsSent(generated);
packets->merge(generated, DereferencingComparator<Packet>);
clock_.AdvanceTimeMilliseconds(time_to_run_ms);
if (!feedbacks->empty()) {
bwe_->GiveFeedback(*feedbacks->front());
@ -222,6 +225,7 @@ void PacedVideoSender::QueuePackets(Packets* batch,
}
Packets to_transfer;
to_transfer.splice(to_transfer.begin(), queue_, queue_.begin(), it);
bwe_->OnPacketsSent(to_transfer);
batch->merge(to_transfer, DereferencingComparator<Packet>);
}