BWE Simulation Framework: Standard plot logging
-- Made plot logging from MetricRecorder and from RateCounterFilter/PacketReceiver standard to fit python and shell plotting scripts likewise. -- RateCounterFilter is initialized with algorithm name. -- Removed spare commas and duplicated flow ids from RateCounterFilter name. -- Added optional plot_delay and plot_loss in MetricRecorder. -- PacketReceiver can plot directly plot delay if there is no metric_recorder_. -- Added comments to plot scripts. R=stefan@webrtc.org Review URL: https://codereview.webrtc.org/1253473004 . Cr-Commit-Position: refs/heads/master@{#9636}
This commit is contained in:
@ -51,9 +51,10 @@ INSTANTIATE_TEST_CASE_P(VideoSendersTest,
|
||||
TEST_P(BweSimulation, SprintUplinkTest) {
|
||||
AdaptiveVideoSource source(0, 30, 300, 0, 0);
|
||||
VideoSender sender(&uplink_, &source, GetParam());
|
||||
RateCounterFilter counter1(&uplink_, 0, "sender_output");
|
||||
RateCounterFilter counter1(&uplink_, 0, "sender_output",
|
||||
bwe_names[GetParam()]);
|
||||
TraceBasedDeliveryFilter filter(&uplink_, 0, "link_capacity");
|
||||
RateCounterFilter counter2(&uplink_, 0, "receiver_input");
|
||||
RateCounterFilter counter2(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
|
||||
PacketReceiver receiver(&uplink_, 0, GetParam(), true, true);
|
||||
ASSERT_TRUE(filter.Init(test::ResourcePath("sprint-uplink", "rx")));
|
||||
RunFor(60 * 1000);
|
||||
@ -62,9 +63,11 @@ TEST_P(BweSimulation, SprintUplinkTest) {
|
||||
TEST_P(BweSimulation, Verizon4gDownlinkTest) {
|
||||
AdaptiveVideoSource source(0, 30, 300, 0, 0);
|
||||
VideoSender sender(&downlink_, &source, GetParam());
|
||||
RateCounterFilter counter1(&downlink_, 0, "sender_output");
|
||||
RateCounterFilter counter1(&downlink_, 0, "sender_output",
|
||||
bwe_names[GetParam()] + "_up");
|
||||
TraceBasedDeliveryFilter filter(&downlink_, 0, "link_capacity");
|
||||
RateCounterFilter counter2(&downlink_, 0, "receiver_input");
|
||||
RateCounterFilter counter2(&downlink_, 0, "Receiver",
|
||||
bwe_names[GetParam()] + "_down");
|
||||
PacketReceiver receiver(&downlink_, 0, GetParam(), true, true);
|
||||
ASSERT_TRUE(filter.Init(test::ResourcePath("verizon4g-downlink", "rx")));
|
||||
RunFor(22 * 60 * 1000);
|
||||
@ -78,14 +81,16 @@ TEST_P(BweSimulation, Choke1000kbps500kbps1000kbpsBiDirectional) {
|
||||
AdaptiveVideoSource source(kFlowIds[0], 30, 300, 0, 0);
|
||||
VideoSender sender(&uplink_, &source, GetParam());
|
||||
ChokeFilter choke(&uplink_, kFlowIds[0]);
|
||||
RateCounterFilter counter(&uplink_, kFlowIds[0], "receiver_input_0");
|
||||
RateCounterFilter counter(&uplink_, kFlowIds[0], "Receiver_0",
|
||||
bwe_names[GetParam()]);
|
||||
PacketReceiver receiver(&uplink_, kFlowIds[0], GetParam(), true, false);
|
||||
|
||||
AdaptiveVideoSource source2(kFlowIds[1], 30, 300, 0, 0);
|
||||
VideoSender sender2(&downlink_, &source2, GetParam());
|
||||
ChokeFilter choke2(&downlink_, kFlowIds[1]);
|
||||
DelayFilter delay(&downlink_, CreateFlowIds(kFlowIds, kNumFlows));
|
||||
RateCounterFilter counter2(&downlink_, kFlowIds[1], "receiver_input_1");
|
||||
RateCounterFilter counter2(&downlink_, kFlowIds[1], "Receiver_1",
|
||||
bwe_names[GetParam()]);
|
||||
PacketReceiver receiver2(&downlink_, kFlowIds[1], GetParam(), true, false);
|
||||
|
||||
choke2.set_capacity_kbps(500);
|
||||
@ -105,7 +110,7 @@ TEST_P(BweSimulation, Choke1000kbps500kbps1000kbps) {
|
||||
AdaptiveVideoSource source(0, 30, 300, 0, 0);
|
||||
VideoSender sender(&uplink_, &source, GetParam());
|
||||
ChokeFilter choke(&uplink_, 0);
|
||||
RateCounterFilter counter(&uplink_, 0, "receiver_input");
|
||||
RateCounterFilter counter(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
|
||||
PacketReceiver receiver(&uplink_, 0, GetParam(), true, false);
|
||||
|
||||
choke.set_capacity_kbps(1000);
|
||||
@ -121,7 +126,7 @@ TEST_P(BweSimulation, PacerChoke1000kbps500kbps1000kbps) {
|
||||
AdaptiveVideoSource source(0, 30, 300, 0, 0);
|
||||
PacedVideoSender sender(&uplink_, &source, GetParam());
|
||||
ChokeFilter filter(&uplink_, 0);
|
||||
RateCounterFilter counter(&uplink_, 0, "receiver_input");
|
||||
RateCounterFilter counter(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
|
||||
PacketReceiver receiver(&uplink_, 0, GetParam(), true, true);
|
||||
filter.set_capacity_kbps(1000);
|
||||
filter.set_max_delay_ms(500);
|
||||
@ -136,7 +141,7 @@ TEST_P(BweSimulation, PacerChoke10000kbps) {
|
||||
PeriodicKeyFrameSource source(0, 30, 300, 0, 0, 1000);
|
||||
PacedVideoSender sender(&uplink_, &source, GetParam());
|
||||
ChokeFilter filter(&uplink_, 0);
|
||||
RateCounterFilter counter(&uplink_, 0, "receiver_input");
|
||||
RateCounterFilter counter(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
|
||||
PacketReceiver receiver(&uplink_, 0, GetParam(), true, true);
|
||||
filter.set_capacity_kbps(10000);
|
||||
filter.set_max_delay_ms(500);
|
||||
@ -147,7 +152,7 @@ TEST_P(BweSimulation, PacerChoke200kbps30kbps200kbps) {
|
||||
AdaptiveVideoSource source(0, 30, 300, 0, 0);
|
||||
PacedVideoSender sender(&uplink_, &source, GetParam());
|
||||
ChokeFilter filter(&uplink_, 0);
|
||||
RateCounterFilter counter(&uplink_, 0, "receiver_input");
|
||||
RateCounterFilter counter(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
|
||||
PacketReceiver receiver(&uplink_, 0, GetParam(), true, true);
|
||||
filter.set_capacity_kbps(200);
|
||||
filter.set_max_delay_ms(500);
|
||||
@ -162,7 +167,7 @@ TEST_P(BweSimulation, Choke200kbps30kbps200kbps) {
|
||||
AdaptiveVideoSource source(0, 30, 300, 0, 0);
|
||||
VideoSender sender(&uplink_, &source, GetParam());
|
||||
ChokeFilter filter(&uplink_, 0);
|
||||
RateCounterFilter counter(&uplink_, 0, "receiver_input");
|
||||
RateCounterFilter counter(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
|
||||
PacketReceiver receiver(&uplink_, 0, GetParam(), true, true);
|
||||
filter.set_capacity_kbps(200);
|
||||
filter.set_max_delay_ms(500);
|
||||
@ -176,10 +181,11 @@ TEST_P(BweSimulation, Choke200kbps30kbps200kbps) {
|
||||
TEST_P(BweSimulation, GoogleWifiTrace3Mbps) {
|
||||
AdaptiveVideoSource source(0, 30, 300, 0, 0);
|
||||
VideoSender sender(&uplink_, &source, GetParam());
|
||||
RateCounterFilter counter1(&uplink_, 0, "sender_output");
|
||||
RateCounterFilter counter1(&uplink_, 0, "sender_output",
|
||||
bwe_names[GetParam()]);
|
||||
TraceBasedDeliveryFilter filter(&uplink_, 0, "link_capacity");
|
||||
filter.set_max_delay_ms(500);
|
||||
RateCounterFilter counter2(&uplink_, 0, "receiver_input");
|
||||
RateCounterFilter counter2(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
|
||||
PacketReceiver receiver(&uplink_, 0, GetParam(), true, true);
|
||||
ASSERT_TRUE(filter.Init(test::ResourcePath("google-wifi-3mbps", "rx")));
|
||||
RunFor(300 * 1000);
|
||||
@ -189,7 +195,7 @@ TEST_P(BweSimulation, LinearIncreasingCapacity) {
|
||||
PeriodicKeyFrameSource source(0, 30, 300, 0, 0, 1000000);
|
||||
PacedVideoSender sender(&uplink_, &source, GetParam());
|
||||
ChokeFilter filter(&uplink_, 0);
|
||||
RateCounterFilter counter(&uplink_, 0, "receiver_input");
|
||||
RateCounterFilter counter(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
|
||||
PacketReceiver receiver(&uplink_, 0, GetParam(), true, true);
|
||||
filter.set_max_delay_ms(500);
|
||||
const int kStartingCapacityKbps = 150;
|
||||
@ -208,7 +214,7 @@ TEST_P(BweSimulation, LinearDecreasingCapacity) {
|
||||
PeriodicKeyFrameSource source(0, 30, 300, 0, 0, 1000000);
|
||||
PacedVideoSender sender(&uplink_, &source, GetParam());
|
||||
ChokeFilter filter(&uplink_, 0);
|
||||
RateCounterFilter counter(&uplink_, 0, "receiver_input");
|
||||
RateCounterFilter counter(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
|
||||
PacketReceiver receiver(&uplink_, 0, GetParam(), true, true);
|
||||
filter.set_max_delay_ms(500);
|
||||
const int kStartingCapacityKbps = 1500;
|
||||
@ -226,10 +232,11 @@ TEST_P(BweSimulation, LinearDecreasingCapacity) {
|
||||
TEST_P(BweSimulation, PacerGoogleWifiTrace3Mbps) {
|
||||
PeriodicKeyFrameSource source(0, 30, 300, 0, 0, 1000);
|
||||
PacedVideoSender sender(&uplink_, &source, GetParam());
|
||||
RateCounterFilter counter1(&uplink_, 0, "sender_output");
|
||||
RateCounterFilter counter1(&uplink_, 0, "sender_output",
|
||||
bwe_names[GetParam()]);
|
||||
TraceBasedDeliveryFilter filter(&uplink_, 0, "link_capacity");
|
||||
filter.set_max_delay_ms(500);
|
||||
RateCounterFilter counter2(&uplink_, 0, "receiver_input");
|
||||
RateCounterFilter counter2(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
|
||||
PacketReceiver receiver(&uplink_, 0, GetParam(), true, true);
|
||||
ASSERT_TRUE(filter.Init(test::ResourcePath("google-wifi-3mbps", "rx")));
|
||||
RunFor(300 * 1000);
|
||||
@ -254,12 +261,14 @@ TEST_P(BweSimulation, SelfFairnessTest) {
|
||||
|
||||
rtc::scoped_ptr<RateCounterFilter> rate_counters[kNumFlows];
|
||||
for (size_t i = 0; i < kNumFlows; ++i) {
|
||||
rate_counters[i].reset(new RateCounterFilter(
|
||||
&uplink_, CreateFlowIds(&kAllFlowIds[i], 1), "receiver_input"));
|
||||
rate_counters[i].reset(
|
||||
new RateCounterFilter(&uplink_, CreateFlowIds(&kAllFlowIds[i], 1),
|
||||
"Receiver", bwe_names[GetParam()]));
|
||||
}
|
||||
|
||||
RateCounterFilter total_utilization(
|
||||
&uplink_, CreateFlowIds(kAllFlowIds, kNumFlows), "total_utilization");
|
||||
&uplink_, CreateFlowIds(kAllFlowIds, kNumFlows), "total_utilization",
|
||||
"Total_link_utilization");
|
||||
|
||||
rtc::scoped_ptr<PacketReceiver> receivers[kNumFlows];
|
||||
for (size_t i = 0; i < kNumFlows; ++i) {
|
||||
|
@ -91,7 +91,7 @@ TEST_P(DefaultBweTest, IncreasingDelay2) {
|
||||
VideoSource source(0, 30, 300, 0, 0);
|
||||
VideoSender sender(&uplink_, &source, GetParam());
|
||||
DelayFilter delay(&uplink_, 0);
|
||||
RateCounterFilter counter(&uplink_, 0, "");
|
||||
RateCounterFilter counter(&uplink_, 0, "", "");
|
||||
PacketReceiver receiver(&uplink_, 0, GetParam(), false, false);
|
||||
RunFor(1 * 60 * 1000);
|
||||
for (int i = 1; i < 51; ++i) {
|
||||
@ -122,7 +122,7 @@ TEST_P(DefaultBweTest, SteadyJitter) {
|
||||
VideoSource source(0, 30, 300, 0, 0);
|
||||
VideoSender sender(&uplink_, &source, GetParam());
|
||||
JitterFilter jitter(&uplink_, 0);
|
||||
RateCounterFilter counter(&uplink_, 0, "");
|
||||
RateCounterFilter counter(&uplink_, 0, "", "");
|
||||
PacketReceiver receiver(&uplink_, 0, GetParam(), false, false);
|
||||
jitter.SetMaxJitter(20);
|
||||
RunFor(2 * 60 * 1000);
|
||||
@ -211,7 +211,7 @@ TEST_P(DefaultBweTest, Multi1) {
|
||||
VideoSender sender(&uplink_, &source, GetParam());
|
||||
DelayFilter delay(&uplink_, 0);
|
||||
ChokeFilter choke(&uplink_, 0);
|
||||
RateCounterFilter counter(&uplink_, 0, "");
|
||||
RateCounterFilter counter(&uplink_, 0, "", "");
|
||||
PacketReceiver receiver(&uplink_, 0, GetParam(), false, false);
|
||||
choke.set_capacity_kbps(1000);
|
||||
RunFor(1 * 60 * 1000);
|
||||
@ -229,7 +229,7 @@ TEST_P(DefaultBweTest, Multi2) {
|
||||
VideoSender sender(&uplink_, &source, GetParam());
|
||||
ChokeFilter choke(&uplink_, 0);
|
||||
JitterFilter jitter(&uplink_, 0);
|
||||
RateCounterFilter counter(&uplink_, 0, "");
|
||||
RateCounterFilter counter(&uplink_, 0, "", "");
|
||||
PacketReceiver receiver(&uplink_, 0, GetParam(), false, false);
|
||||
choke.set_capacity_kbps(2000);
|
||||
jitter.SetMaxJitter(120);
|
||||
@ -268,7 +268,7 @@ TEST_P(BweFeedbackTest, ConstantCapacity) {
|
||||
AdaptiveVideoSource source(0, 30, 300, 0, 0);
|
||||
PacedVideoSender sender(&uplink_, &source, GetParam());
|
||||
ChokeFilter filter(&uplink_, 0);
|
||||
RateCounterFilter counter(&uplink_, 0, "receiver_input");
|
||||
RateCounterFilter counter(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
|
||||
PacketReceiver receiver(&uplink_, 0, GetParam(), false, false);
|
||||
const int kCapacityKbps = 1000;
|
||||
filter.set_capacity_kbps(kCapacityKbps);
|
||||
@ -282,7 +282,7 @@ TEST_P(BweFeedbackTest, Choke1000kbps500kbps1000kbps) {
|
||||
AdaptiveVideoSource source(0, 30, 300, 0, 0);
|
||||
PacedVideoSender sender(&uplink_, &source, GetParam());
|
||||
ChokeFilter filter(&uplink_, 0);
|
||||
RateCounterFilter counter(&uplink_, 0, "receiver_input");
|
||||
RateCounterFilter counter(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
|
||||
PacketReceiver receiver(&uplink_, 0, GetParam(), false, false);
|
||||
const int kHighCapacityKbps = 1000;
|
||||
const int kLowCapacityKbps = 500;
|
||||
@ -302,7 +302,7 @@ TEST_P(BweFeedbackTest, Choke200kbps30kbps200kbps) {
|
||||
AdaptiveVideoSource source(0, 30, 300, 0, 0);
|
||||
PacedVideoSender sender(&uplink_, &source, GetParam());
|
||||
ChokeFilter filter(&uplink_, 0);
|
||||
RateCounterFilter counter(&uplink_, 0, "receiver_input");
|
||||
RateCounterFilter counter(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
|
||||
PacketReceiver receiver(&uplink_, 0, GetParam(), false, false);
|
||||
const int kHighCapacityKbps = 200;
|
||||
const int kLowCapacityKbps = 30;
|
||||
@ -322,9 +322,10 @@ TEST_P(BweFeedbackTest, Choke200kbps30kbps200kbps) {
|
||||
TEST_P(BweFeedbackTest, Verizon4gDownlinkTest) {
|
||||
AdaptiveVideoSource source(0, 30, 300, 0, 0);
|
||||
VideoSender sender(&uplink_, &source, GetParam());
|
||||
RateCounterFilter counter1(&uplink_, 0, "sender_output");
|
||||
RateCounterFilter counter1(&uplink_, 0, "sender_output",
|
||||
bwe_names[GetParam()]);
|
||||
TraceBasedDeliveryFilter filter(&uplink_, 0, "link_capacity");
|
||||
RateCounterFilter counter2(&uplink_, 0, "receiver_input");
|
||||
RateCounterFilter counter2(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
|
||||
PacketReceiver receiver(&uplink_, 0, GetParam(), false, false);
|
||||
ASSERT_TRUE(filter.Init(test::ResourcePath("verizon4g-downlink", "rx")));
|
||||
RunFor(22 * 60 * 1000);
|
||||
@ -336,10 +337,11 @@ TEST_P(BweFeedbackTest, Verizon4gDownlinkTest) {
|
||||
TEST_P(BweFeedbackTest, GoogleWifiTrace3Mbps) {
|
||||
AdaptiveVideoSource source(0, 30, 300, 0, 0);
|
||||
VideoSender sender(&uplink_, &source, GetParam());
|
||||
RateCounterFilter counter1(&uplink_, 0, "sender_output");
|
||||
RateCounterFilter counter1(&uplink_, 0, "sender_output",
|
||||
bwe_names[GetParam()]);
|
||||
TraceBasedDeliveryFilter filter(&uplink_, 0, "link_capacity");
|
||||
filter.set_max_delay_ms(500);
|
||||
RateCounterFilter counter2(&uplink_, 0, "receiver_input");
|
||||
RateCounterFilter counter2(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
|
||||
PacketReceiver receiver(&uplink_, 0, GetParam(), false, false);
|
||||
ASSERT_TRUE(filter.Init(test::ResourcePath("google-wifi-3mbps", "rx")));
|
||||
RunFor(300 * 1000);
|
||||
|
@ -311,13 +311,17 @@ void BweTest::RunFairnessTest(BandwidthEstimatorType bwe_type,
|
||||
jitter.SetMaxJitter(max_jitter_ms);
|
||||
|
||||
std::vector<RateCounterFilter*> rate_counters;
|
||||
for (int flow : all_flow_ids) {
|
||||
for (int flow : media_flow_ids) {
|
||||
rate_counters.push_back(
|
||||
new RateCounterFilter(&uplink_, flow, "receiver_input"));
|
||||
new RateCounterFilter(&uplink_, flow, "Receiver", bwe_names[bwe_type]));
|
||||
}
|
||||
for (int flow : tcp_flow_ids) {
|
||||
rate_counters.push_back(new RateCounterFilter(&uplink_, flow, "Receiver",
|
||||
bwe_names[kTcpEstimator]));
|
||||
}
|
||||
|
||||
RateCounterFilter total_utilization(&uplink_, all_flow_ids,
|
||||
"total_utilization");
|
||||
RateCounterFilter total_utilization(
|
||||
&uplink_, all_flow_ids, "total_utilization", "Total_link_utilization");
|
||||
|
||||
std::vector<PacketReceiver*> receivers;
|
||||
// Delays is being plotted only for the first flow.
|
||||
@ -491,7 +495,8 @@ void BweTest::RunVariableCapacity2MultipleFlows(BandwidthEstimatorType bwe_type,
|
||||
DefaultEvaluationFilter up_filter(&uplink_, flow_ids);
|
||||
LinkShare link_share(&(up_filter.choke));
|
||||
|
||||
RateCounterFilter total_utilization(&uplink_, flow_ids, "Total_utilization");
|
||||
RateCounterFilter total_utilization(&uplink_, flow_ids, "Total_utilization",
|
||||
"Total_link_utilization");
|
||||
|
||||
// Delays is being plotted only for the first flow.
|
||||
// To plot all of them, replace "i == 0" with "true" on new PacketReceiver().
|
||||
@ -682,7 +687,8 @@ void BweTest::RunRoundTripTimeFairness(BandwidthEstimatorType bwe_type) {
|
||||
}
|
||||
|
||||
RateCounterFilter total_utilization(
|
||||
&uplink_, CreateFlowIds(kAllFlowIds, kNumFlows), "Total_utilization");
|
||||
&uplink_, CreateFlowIds(kAllFlowIds, kNumFlows), "Total_utilization",
|
||||
"Total_link_utilization");
|
||||
|
||||
// Delays is being plotted only for the first flow.
|
||||
// To plot all of them, replace "i == 0" with "true" on new PacketReceiver().
|
||||
@ -797,7 +803,8 @@ void BweTest::RunMultipleShortTcpFairness(
|
||||
|
||||
LinkShare link_share(&(up_filter.choke));
|
||||
|
||||
RateCounterFilter total_utilization(&uplink_, flow_ids, "Total_utilization");
|
||||
RateCounterFilter total_utilization(&uplink_, flow_ids, "Total_utilization",
|
||||
"Total_link_utilization");
|
||||
|
||||
// Delays is being plotted only for the first flow.
|
||||
// To plot all of them, replace "i == 0" with "true" on new PacketReceiver().
|
||||
@ -884,7 +891,8 @@ void BweTest::RunPauseResumeFlows(BandwidthEstimatorType bwe_type) {
|
||||
LinkShare link_share(&(filter.choke));
|
||||
|
||||
RateCounterFilter total_utilization(
|
||||
&uplink_, CreateFlowIds(kAllFlowIds, kNumFlows), "Total_utilization");
|
||||
&uplink_, CreateFlowIds(kAllFlowIds, kNumFlows), "Total_utilization",
|
||||
"Total_link_utilization");
|
||||
|
||||
// Delays is being plotted only for the first flow.
|
||||
// To plot all of them, replace "i == 0" with "true" on new PacketReceiver().
|
||||
|
@ -251,12 +251,13 @@ uint32_t PacketProcessor::bits_per_second() const {
|
||||
|
||||
RateCounterFilter::RateCounterFilter(PacketProcessorListener* listener,
|
||||
int flow_id,
|
||||
const char* name)
|
||||
const char* name,
|
||||
const std::string& plot_name)
|
||||
: PacketProcessor(listener, flow_id, kRegular),
|
||||
packets_per_second_stats_(),
|
||||
kbps_stats_(),
|
||||
name_(),
|
||||
start_plotting_time_ms_(0) {
|
||||
start_plotting_time_ms_(0),
|
||||
plot_name_(plot_name) {
|
||||
std::stringstream ss;
|
||||
ss << name << "_" << flow_id;
|
||||
name_ = ss.str();
|
||||
@ -264,16 +265,19 @@ RateCounterFilter::RateCounterFilter(PacketProcessorListener* listener,
|
||||
|
||||
RateCounterFilter::RateCounterFilter(PacketProcessorListener* listener,
|
||||
const FlowIds& flow_ids,
|
||||
const char* name)
|
||||
const char* name,
|
||||
const std::string& plot_name)
|
||||
: PacketProcessor(listener, flow_ids, kRegular),
|
||||
packets_per_second_stats_(),
|
||||
kbps_stats_(),
|
||||
name_(),
|
||||
start_plotting_time_ms_(0) {
|
||||
start_plotting_time_ms_(0),
|
||||
plot_name_(plot_name) {
|
||||
std::stringstream ss;
|
||||
ss << name << "_";
|
||||
ss << name;
|
||||
char delimiter = '_';
|
||||
for (int flow_id : flow_ids) {
|
||||
ss << flow_id << ",";
|
||||
ss << delimiter << flow_id;
|
||||
delimiter = ',';
|
||||
}
|
||||
name_ = ss.str();
|
||||
}
|
||||
@ -281,8 +285,9 @@ RateCounterFilter::RateCounterFilter(PacketProcessorListener* listener,
|
||||
RateCounterFilter::RateCounterFilter(PacketProcessorListener* listener,
|
||||
const FlowIds& flow_ids,
|
||||
const char* name,
|
||||
int64_t start_plotting_time_ms)
|
||||
: RateCounterFilter(listener, flow_ids, name) {
|
||||
int64_t start_plotting_time_ms,
|
||||
const std::string& plot_name)
|
||||
: RateCounterFilter(listener, flow_ids, name, plot_name) {
|
||||
start_plotting_time_ms_ = start_plotting_time_ms;
|
||||
}
|
||||
|
||||
@ -307,7 +312,13 @@ void RateCounterFilter::Plot(int64_t timestamp_ms) {
|
||||
plot_kbps = rate_counter_.bits_per_second() / 1000.0;
|
||||
}
|
||||
BWE_TEST_LOGGING_CONTEXT(name_.c_str());
|
||||
BWE_TEST_LOGGING_PLOT(0, "Throughput_#1", timestamp_ms, plot_kbps);
|
||||
if (plot_name_.empty()) {
|
||||
BWE_TEST_LOGGING_PLOT(0, "Throughput_kbps#1", timestamp_ms, plot_kbps);
|
||||
} else {
|
||||
BWE_TEST_LOGGING_PLOT_WITH_NAME(0, "Throughput_kbps#1", timestamp_ms,
|
||||
plot_kbps, plot_name_);
|
||||
}
|
||||
|
||||
RTC_UNUSED(plot_kbps);
|
||||
}
|
||||
|
||||
|
@ -252,14 +252,17 @@ class RateCounterFilter : public PacketProcessor {
|
||||
public:
|
||||
RateCounterFilter(PacketProcessorListener* listener,
|
||||
int flow_id,
|
||||
const char* name);
|
||||
RateCounterFilter(PacketProcessorListener* listener,
|
||||
const FlowIds& flow_ids,
|
||||
const char* name);
|
||||
const char* name,
|
||||
const std::string& plot_name);
|
||||
RateCounterFilter(PacketProcessorListener* listener,
|
||||
const FlowIds& flow_ids,
|
||||
const char* name,
|
||||
int64_t start_plotting_time_ms);
|
||||
const std::string& plot_name);
|
||||
RateCounterFilter(PacketProcessorListener* listener,
|
||||
const FlowIds& flow_ids,
|
||||
const char* name,
|
||||
int64_t start_plotting_time_ms,
|
||||
const std::string& plot_name);
|
||||
virtual ~RateCounterFilter();
|
||||
|
||||
void LogStats();
|
||||
@ -272,6 +275,8 @@ class RateCounterFilter : public PacketProcessor {
|
||||
Stats<double> kbps_stats_;
|
||||
std::string name_;
|
||||
int64_t start_plotting_time_ms_;
|
||||
// Algorithm name if single flow, Total link utilization if all flows.
|
||||
std::string plot_name_;
|
||||
|
||||
DISALLOW_IMPLICIT_CONSTRUCTORS(RateCounterFilter);
|
||||
};
|
||||
|
@ -181,7 +181,8 @@ TEST(BweTestFramework_StatsTest, MinMax) {
|
||||
|
||||
class BweTestFramework_RateCounterFilterTest : public ::testing::Test {
|
||||
public:
|
||||
BweTestFramework_RateCounterFilterTest() : filter_(NULL, 0, ""), now_ms_(0) {}
|
||||
BweTestFramework_RateCounterFilterTest()
|
||||
: filter_(NULL, 0, "", ""), now_ms_(0) {}
|
||||
virtual ~BweTestFramework_RateCounterFilterTest() {}
|
||||
|
||||
protected:
|
||||
|
@ -91,7 +91,7 @@ void Logging::Log(const char format[], ...) {
|
||||
}
|
||||
|
||||
void Logging::Plot(int figure, double value) {
|
||||
Plot(figure, value, "");
|
||||
Plot(figure, value, "-");
|
||||
}
|
||||
|
||||
void Logging::Plot(int figure, double value, const std::string& alg_name) {
|
||||
|
@ -130,7 +130,9 @@ MetricRecorder::MetricRecorder(const std::string algorithm_name,
|
||||
}
|
||||
|
||||
void MetricRecorder::SetPlotInformation(
|
||||
const std::vector<std::string>& prefixes) {
|
||||
const std::vector<std::string>& prefixes,
|
||||
bool plot_delay,
|
||||
bool plot_loss) {
|
||||
assert(prefixes.size() == kNumMetrics);
|
||||
for (size_t i = 0; i < kNumMetrics; ++i) {
|
||||
plot_information_[i].prefix = prefixes[i];
|
||||
@ -144,10 +146,19 @@ void MetricRecorder::SetPlotInformation(
|
||||
|
||||
for (int i = kThroughput; i < kNumMetrics; ++i) {
|
||||
plot_information_[i].last_plot_ms = 0;
|
||||
if (i == kObjective || i == kAvailablePerFlow) {
|
||||
plot_information_[i].plot = false;
|
||||
} else {
|
||||
plot_information_[i].plot = true;
|
||||
switch (i) {
|
||||
case kAvailablePerFlow:
|
||||
case kObjective:
|
||||
plot_information_[i].plot = false;
|
||||
break;
|
||||
case kLoss:
|
||||
plot_information_[i].plot = plot_loss;
|
||||
break;
|
||||
case kDelay:
|
||||
plot_information_[i].plot = plot_delay;
|
||||
break;
|
||||
default:
|
||||
plot_information_[i].plot = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -65,7 +65,9 @@ class MetricRecorder {
|
||||
PacketSender* packet_sender,
|
||||
LinkShare* link_share);
|
||||
|
||||
void SetPlotInformation(const std::vector<std::string>& prefixes);
|
||||
void SetPlotInformation(const std::vector<std::string>& prefixes,
|
||||
bool plot_delay,
|
||||
bool plot_loss);
|
||||
|
||||
template <typename T>
|
||||
void PlotLine(int windows_id,
|
||||
|
@ -32,34 +32,29 @@ PacketReceiver::PacketReceiver(PacketProcessorListener* listener,
|
||||
MetricRecorder* metric_recorder)
|
||||
: PacketProcessor(listener, flow_id, kReceiver),
|
||||
bwe_receiver_(CreateBweReceiver(bwe_type, flow_id, plot_bwe)),
|
||||
metric_recorder_(metric_recorder) {
|
||||
metric_recorder_(metric_recorder),
|
||||
plot_delay_(plot_delay),
|
||||
last_delay_plot_ms_(0),
|
||||
// #2 aligns the plot with the right axis.
|
||||
delay_prefix_("Delay_ms#2"),
|
||||
bwe_type_(bwe_type) {
|
||||
if (metric_recorder_ != nullptr) {
|
||||
// Setup the prefix ststd::rings used when logging.
|
||||
// Setup the prefix std::strings used when logging.
|
||||
std::vector<std::string> prefixes;
|
||||
|
||||
std::stringstream ss1;
|
||||
ss1 << "Throughput_kbps_" << flow_id << "#2";
|
||||
prefixes.push_back(ss1.str()); // Throughput.
|
||||
|
||||
std::stringstream ss2;
|
||||
ss2 << "Delay_ms_" << flow_id << "#2";
|
||||
prefixes.push_back(ss2.str()); // Delay.
|
||||
|
||||
std::stringstream ss3;
|
||||
ss3 << "Packet_Loss_" << flow_id << "#2";
|
||||
prefixes.push_back(ss3.str()); // Loss.
|
||||
|
||||
std::stringstream ss4;
|
||||
ss4 << "Objective_function_" << flow_id << "#2";
|
||||
prefixes.push_back(ss4.str()); // Objective.
|
||||
// Metric recorder plots them in separated figures,
|
||||
// alignment will take place with the #1 left axis.
|
||||
prefixes.push_back("Throughput_kbps#1"); // Throughput.
|
||||
prefixes.push_back("Delay_ms_#1"); // Delay.
|
||||
prefixes.push_back("Packet_Loss_#1"); // Loss.
|
||||
prefixes.push_back("Objective_function_#1"); // Objective.
|
||||
|
||||
// Plot Total/PerFlow Available capacity together with throughputs.
|
||||
std::stringstream ss5;
|
||||
ss5 << "Throughput_kbps" << flow_id << "#1";
|
||||
prefixes.push_back(ss5.str()); // Total Available.
|
||||
prefixes.push_back(ss5.str()); // Available per flow.
|
||||
prefixes.push_back("Throughput_kbps#1"); // Total Available.
|
||||
prefixes.push_back("Throughput_kbps#1"); // Available per flow.
|
||||
|
||||
metric_recorder_->SetPlotInformation(prefixes);
|
||||
bool plot_loss = plot_delay; // Plot loss if delay is plotted.
|
||||
metric_recorder_->SetPlotInformation(prefixes, plot_delay, plot_loss);
|
||||
}
|
||||
}
|
||||
|
||||
@ -102,6 +97,8 @@ void PacketReceiver::RunFor(int64_t time_ms, Packets* in_out) {
|
||||
UpdateMetrics(arrival_time_ms, send_time_ms,
|
||||
media_packet->payload_size());
|
||||
metric_recorder_->PlotAllDynamics();
|
||||
} else if (plot_delay_) {
|
||||
PlotDelay(arrival_time_ms, send_time_ms);
|
||||
}
|
||||
|
||||
bwe_receiver_->ReceivePacket(arrival_time_ms, *media_packet);
|
||||
@ -127,6 +124,16 @@ void PacketReceiver::UpdateMetrics(int64_t arrival_time_ms,
|
||||
metric_recorder_->UpdateObjective();
|
||||
}
|
||||
|
||||
void PacketReceiver::PlotDelay(int64_t arrival_time_ms, int64_t send_time_ms) {
|
||||
const int64_t kDelayPlotIntervalMs = 100;
|
||||
if (arrival_time_ms >= last_delay_plot_ms_ + kDelayPlotIntervalMs) {
|
||||
BWE_TEST_LOGGING_PLOT_WITH_NAME(0, delay_prefix_, arrival_time_ms,
|
||||
arrival_time_ms - send_time_ms,
|
||||
bwe_names[bwe_type_]);
|
||||
last_delay_plot_ms_ = arrival_time_ms;
|
||||
}
|
||||
}
|
||||
|
||||
float PacketReceiver::GlobalPacketLoss() {
|
||||
return bwe_receiver_->GlobalReceiverPacketLossRatio();
|
||||
}
|
||||
|
@ -56,7 +56,12 @@ class PacketReceiver : public PacketProcessor {
|
||||
rtc::scoped_ptr<BweReceiver> bwe_receiver_;
|
||||
|
||||
private:
|
||||
void PlotDelay(int64_t arrival_time_ms, int64_t send_time_ms);
|
||||
MetricRecorder* metric_recorder_;
|
||||
bool plot_delay_; // Used in case there isn't a metric recorder.
|
||||
int64_t last_delay_plot_ms_;
|
||||
std::string delay_prefix_;
|
||||
BandwidthEstimatorType bwe_type_;
|
||||
|
||||
DISALLOW_IMPLICIT_CONSTRUCTORS(PacketReceiver);
|
||||
};
|
||||
|
124
webrtc/modules/remote_bitrate_estimator/test/plot_bars.sh
Normal file → Executable file
124
webrtc/modules/remote_bitrate_estimator/test/plot_bars.sh
Normal file → Executable file
@ -34,7 +34,7 @@ function gen_gnuplot_bar_input {
|
||||
labels=$(echo "$log" | grep "^LABEL")
|
||||
figures=($(echo "$bars" | cut -f 2 | sort | uniq))
|
||||
|
||||
echo "reset"
|
||||
echo "reset" # Clears previous settings.
|
||||
|
||||
echo "set title font 'Verdana,22'"
|
||||
echo "set xtics font 'Verdana,24'"
|
||||
@ -45,12 +45,13 @@ function gen_gnuplot_bar_input {
|
||||
echo "set style fill solid 0.5"
|
||||
echo "set style fill solid border -1"
|
||||
|
||||
ydist=11 # Used to correctly offset the y label.
|
||||
declare -a ydist=(11.5 10.5 10.5) # Used to correctly offset the y label.
|
||||
i=0
|
||||
for figure in "${figures[@]}" ; do
|
||||
|
||||
echo "set terminal wxt $figure size 440,440 dashed"
|
||||
echo "set ylabel offset $ydist, -3"
|
||||
((ydist--))
|
||||
echo "set ylabel offset ${ydist[$i]}, -3"
|
||||
(( i++ ))
|
||||
|
||||
title=$(echo "$labels" | grep "^LABEL.$figure" | cut -f 3 | \
|
||||
head -n 1 | sed 's/_/ /g')
|
||||
@ -107,48 +108,52 @@ function gen_gnuplot_bar_input {
|
||||
|
||||
y_max=0 # Used to scale the plot properly.
|
||||
|
||||
# Since only the optimal bitrate for the first flow is being ploted,
|
||||
# consider only this one for scalling purposes.
|
||||
data_sets=$(echo "$bars" | grep "LIMITERRORBAR.$figure" | cut -f 3 | \
|
||||
sed 's/_/\t/g' | cut -f 1 | sort | uniq)
|
||||
|
||||
if (( ${#data_sets} > "0" )); then
|
||||
for set in $data_sets ; do
|
||||
y=$(echo "$bars" | grep "LIMITERRORBAR.$figure.$set" | cut -f 8 | \
|
||||
head -n 1)
|
||||
if (( $(bc <<< "$y > $y_max") == 1 )); then
|
||||
y_max=$y
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
data_sets=$(echo "$bars" | grep "ERRORBAR.$figure" | cut -f 3 | sort | uniq)
|
||||
if (( ${#data_sets} > "0" )); then
|
||||
for set in $data_sets ; do
|
||||
y=$(echo "$bars" | grep "ERRORBAR.$figure.$set" | cut -f 6 | head -n 1)
|
||||
if (( $(bc <<< "$y > $y_max") == 1 )) ; then
|
||||
y_max=$y
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
data_sets=$(echo "$bars" | grep "BAR.$figure" | cut -f 3 | sort | uniq)
|
||||
|
||||
for set in $data_sets ; do
|
||||
y=$(echo "$bars" | grep "BAR.$figure.$set" | cut -f 4 | head -n 1)
|
||||
if (( $(bc <<< "$y > $y_max") == 1 )) ; then
|
||||
y_max=$y
|
||||
fi
|
||||
done
|
||||
|
||||
y_max=$(echo $y_max*1.1 | bc)
|
||||
|
||||
# Scale all latency plots with the same vertical scale.
|
||||
delay_figure=5
|
||||
if (( $figure==$delay_figure )) ; then
|
||||
y_max=250
|
||||
else # Take y_max = 1.1 * highest plot value.
|
||||
|
||||
# Since only the optimal bitrate for the first flow is being ploted,
|
||||
# consider only this one for scalling purposes.
|
||||
data_sets=$(echo "$bars" | grep "LIMITERRORBAR.$figure" | cut -f 3 | \
|
||||
sed 's/_/\t/g' | cut -f 1 | sort | uniq)
|
||||
|
||||
if (( ${#data_sets[@]} > "0" )); then
|
||||
for set in $data_sets ; do
|
||||
y=$(echo "$bars" | grep "LIMITERRORBAR.$figure.$set" | cut -f 8 | \
|
||||
head -n 1)
|
||||
if (( $(bc <<< "$y > $y_max") == 1 )); then
|
||||
y_max=$y
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
data_sets=$(echo "$bars" | grep "ERRORBAR.$figure" | cut -f 3 | \
|
||||
sort | uniq)
|
||||
if (( ${#data_sets[@]} > "0" )); then
|
||||
for set in $data_sets ; do
|
||||
y=$(echo "$bars" | grep "ERRORBAR.$figure.$set" | cut -f 6 | \
|
||||
head -n 1)
|
||||
if (( $(bc <<< "$y > $y_max") == 1 )) ; then
|
||||
y_max=$y
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
data_sets=$(echo "$bars" | grep "BAR.$figure" | cut -f 3 | sort | uniq)
|
||||
|
||||
for set in $data_sets ; do
|
||||
y=$(echo "$bars" | grep "BAR.$figure.$set" | cut -f 4 | head -n 1)
|
||||
if (( $(bc <<< "$y > $y_max") == 1 )) ; then
|
||||
y_max=$y
|
||||
fi
|
||||
done
|
||||
|
||||
y_max=$(echo $y_max*1.1 | bc)
|
||||
fi
|
||||
|
||||
|
||||
echo "set ylabel \"$y_label\""
|
||||
echo "set yrange[0:$y_max]"
|
||||
|
||||
@ -193,29 +198,31 @@ function gen_gnuplot_bar_input {
|
||||
# Plot Baseline bars, e.g. one-way path delay on latency plots.
|
||||
data_sets=$(echo "$log" | grep "BASELINE.$figure" | cut -f 3 | sort | uniq)
|
||||
|
||||
echo "set xtics $x_labels"
|
||||
echo "plot '-' using 1:4:2 with boxes lc variable notitle"
|
||||
if (( ${#data_sets} > "0" )); then
|
||||
echo "set xtics $x_labels"
|
||||
echo "plot '-' using 1:4:2 with boxes lc variable notitle"
|
||||
|
||||
echo
|
||||
echo
|
||||
|
||||
color=18 # Gray.
|
||||
x_bar=$(echo $x_start + 0.5 + 0.5*$box_width | bc)
|
||||
for set in $data_sets ; do
|
||||
echo -n "$x_bar $color "
|
||||
echo "$log" | grep "BASELINE.$figure.$set" | cut -f 3,4
|
||||
color=18 # Gray.
|
||||
x_bar=$(echo $x_start + 0.5 + 0.5*$box_width | bc)
|
||||
for set in $data_sets ; do
|
||||
echo -n "$x_bar $color "
|
||||
echo "$log" | grep "BASELINE.$figure.$set" | cut -f 3,4
|
||||
|
||||
# Add extra space if TCP flows are being plotted.
|
||||
if $tcp_flow && \
|
||||
(( $(bc <<< "$x_bar < $x_start + 1.5 - 0.5*$tcp_space") == 1 )) && \
|
||||
(( $(bc <<< "$x_bar + $box_width > $x_start + 1.5 + 0.5*$tcp_space") \
|
||||
== 1 )); then
|
||||
x_bar=$(echo $x_bar + $tcp_space | bc)
|
||||
fi
|
||||
# Add extra space if TCP flows are being plotted.
|
||||
if $tcp_flow && \
|
||||
(( $(bc <<< "$x_bar < $x_start + 1.5 - 0.5*$tcp_space") == 1 )) && \
|
||||
(( $(bc <<< "$x_bar + $box_width > $x_start + 1.5 \
|
||||
+ 0.5*$tcp_space") == 1 )); then
|
||||
x_bar=$(echo $x_bar + $tcp_space | bc)
|
||||
fi
|
||||
|
||||
x_bar=$(echo $x_bar + $box_width | bc)
|
||||
x_bar=$(echo $x_bar + $box_width | bc)
|
||||
|
||||
done
|
||||
echo "e"
|
||||
done
|
||||
echo "e"
|
||||
fi
|
||||
|
||||
# Plot vertical error lines, e.g. y +- sigma.
|
||||
data_sets=$(echo "$bars" | grep "ERRORBAR.$figure" | cut -f 3 | sort | uniq)
|
||||
@ -275,4 +282,5 @@ function gen_gnuplot_bar_input {
|
||||
echo "unset multiplot"
|
||||
done
|
||||
}
|
||||
|
||||
gen_gnuplot_bar_input | gnuplot -persist
|
||||
|
@ -48,9 +48,13 @@ class Variable:
|
||||
|
||||
|
||||
def addSample(self, line):
|
||||
groups = re.search(r'/\d_(\w+)#\d@(\w*)', line)
|
||||
groups = re.search(r'_(((\d)+((,(\d)+)*))_(\D+))#\d@(\S+)', line)
|
||||
|
||||
# Each variable will be plotted in a separated box.
|
||||
var_name = groups.group(1)
|
||||
alg_name = groups.group(2)
|
||||
alg_name = groups.group(8)
|
||||
|
||||
alg_name = alg_name.replace('_', ' ')
|
||||
|
||||
if alg_name not in self._samples.keys():
|
||||
self._samples[alg_name] = {}
|
||||
@ -59,6 +63,7 @@ class Variable:
|
||||
self._samples[alg_name][var_name] = []
|
||||
|
||||
sample = re.search(r'(\d+\.\d+)\t([-]?\d+\.\d+)', line)
|
||||
|
||||
s = (sample.group(1),sample.group(2))
|
||||
self._samples[alg_name][var_name].append(s)
|
||||
|
||||
@ -86,19 +91,16 @@ def plotVar(v, ax, show_legend, show_x_label):
|
||||
'NADA2':'#A0A0FF',
|
||||
'NADA3':'#0000FF',
|
||||
'NADA4':'#C0A0FF',
|
||||
'NADA5':'#9060B0',
|
||||
'TCP1':'#AAAAAA',
|
||||
'TCP2':'#AAAAAA',
|
||||
'TCP3':'#AAAAAA',
|
||||
'TCP4':'#AAAAAA',
|
||||
'TCP5':'#AAAAAA',
|
||||
'TCP6':'#AAAAAA',
|
||||
'TCP7':'#AAAAAA',
|
||||
'TCP8':'#AAAAAA',
|
||||
'TCP9':'#AAAAAA',
|
||||
'TCP10':'#AAAAAA',}
|
||||
'NADA5':'#9060B0',}
|
||||
|
||||
key = alg + str(i)
|
||||
if key in colormap:
|
||||
plt.setp(line, color=colormap[key])
|
||||
elif alg == 'TCP':
|
||||
plt.setp(line, color='#AAAAAA')
|
||||
else:
|
||||
plt.setp(line, color='#654321')
|
||||
|
||||
plt.setp(line, color=colormap[alg + str(i)])
|
||||
if alg.startswith('Available'):
|
||||
plt.setp(line, linestyle='--')
|
||||
plt.grid(True)
|
||||
@ -110,8 +112,8 @@ def plotVar(v, ax, show_legend, show_x_label):
|
||||
i += 1
|
||||
|
||||
if show_legend:
|
||||
legend = plt.legend(loc='upper right', shadow=True,
|
||||
fontsize='large', ncol=len(v._samples))
|
||||
legend = plt.legend(loc='upper center', bbox_to_anchor=(0.5, 1.40),
|
||||
shadow=True, fontsize='medium', ncol=len(v._samples))
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
|
32
webrtc/modules/remote_bitrate_estimator/test/plot_dynamics.sh
Normal file → Executable file
32
webrtc/modules/remote_bitrate_estimator/test/plot_dynamics.sh
Normal file → Executable file
@ -29,35 +29,49 @@ log=$(</dev/stdin)
|
||||
function gen_gnuplot_input {
|
||||
colors=(a7001f 0a60c2 b2582b 21a66c d6604d 4393c3 f4a582 92c5de edcbb7 b1c5d0)
|
||||
plots=$(echo "$log" | grep "^PLOT")
|
||||
# Each figure corresponds to a separate plot window.
|
||||
figures=($(echo "$plots" | cut -f 2 | sort | uniq))
|
||||
|
||||
for figure in "${figures[@]}" ; do
|
||||
# Each data set corresponds to a plot line.
|
||||
data_sets=$(echo "$plots" | grep "^PLOT.$figure" | cut -f 3 | sort | uniq)
|
||||
# Lines can be scaled on the left (1) or right (2) axis.
|
||||
linetypes=($(echo "$data_sets" | grep "#" | cut -d '#' -f 2 | \
|
||||
cut -d ' ' -f 1))
|
||||
cut -d '@' -f 1 | uniq))
|
||||
|
||||
# Set plot configurations.
|
||||
echo "reset; "
|
||||
echo "set terminal wxt $figure size 1440,900 font \"Arial,9\"; "
|
||||
echo "set xlabel \"Seconds\"; "
|
||||
if (( "${#linetypes[@]}" > "0" )); then
|
||||
echo "set ylabel 'bitrate (kbps)';"
|
||||
if (( "${#linetypes[@]}" > "1" )); then
|
||||
echo "set ylabel 'Bitrate (kbps)';" # Left side.
|
||||
echo "set ytics nomirror;"
|
||||
echo "set y2label 'time delta (ms)';"
|
||||
echo "set y2label 'Time delta (ms)';" # Right side.
|
||||
echo "set y2tics nomirror;"
|
||||
else
|
||||
# Single axis (left side), set its label according to data.
|
||||
y_label=$(echo "$data_sets" | grep "#" | cut -d '#' -f 1 | \
|
||||
cut -d ' ' -f 1 | cut -d '/' -f 3 | sed 's/[0-9]/#/g' | \
|
||||
cut -d '#' -f 3 | head -n 1 | sed 's/_/ /g')
|
||||
echo "set ylabel \"$y_label\";"
|
||||
fi
|
||||
echo -n "plot "
|
||||
|
||||
i=0
|
||||
echo -n "plot "
|
||||
for set in $data_sets ; do
|
||||
(( i++ )) && echo -n ","
|
||||
echo -n "'-' with "
|
||||
echo -n "linespoints "
|
||||
echo -n "ps 0.5 "
|
||||
echo -n "lc rgbcolor \"#${colors[$(($i % 10))]}\" "
|
||||
if (( "${#linetypes[@]}" > "0" )); then
|
||||
if (( "$i" <= "${#linetypes[@]}" )); then
|
||||
echo -n "axes x1y${linetypes[$i - 1]} "
|
||||
if (( "${#linetypes[@]}" > "1" )); then
|
||||
# Multiple sets can have a same line plot.
|
||||
linetype=$(echo "$set" | grep "#" | cut -d '#' -f 2 | cut -d '@' -f 1)
|
||||
if (( "${#linetype}" > "0")); then
|
||||
echo -n "axes x1y$linetype "
|
||||
else
|
||||
# If no line type is specified, but line types are used, we will
|
||||
# default to the bitrate axis.
|
||||
# default to scale on the left axis.
|
||||
echo -n "axes x1y1 "
|
||||
fi
|
||||
fi
|
||||
|
Reference in New Issue
Block a user