Newer
Older
#include <ftl/rgbd/detail/abr.hpp>
#include <ftl/timer.hpp>
#include <bitset>
using ftl::rgbd::detail::BitrateSetting;
using ftl::rgbd::detail::ABRController;
using ftl::rgbd::detail::bitrate_t;
using ftl::rgbd::detail::kBitrateWorst;
using ftl::rgbd::detail::kBitrateBest;
using ftl::rgbd::detail::bitrate_settings;
using ftl::rgbd::detail::NetFrame;
ABRController::ABRController() {
bitrate_ = 0;
max_ = kBitrateBest;
min_ = kBitrateWorst;
}
ABRController::~ABRController() {
}
void ABRController::setMaximumBitrate(bitrate_t b) {
max_ = (b == -1) ? kBitrateBest : b;
if (bitrate_ < max_) bitrate_ = max_;
}
void ABRController::setMinimumBitrate(bitrate_t b) {
min_ = (b == -1) ? kBitrateWorst : b;
if (bitrate_ > min_) bitrate_ = min_;
}
void ABRController::notifyChanged() {
}
bitrate_t ABRController::selectBitrate(const NetFrame &frame) {
if (!enabled_) return bitrate_;
float actual_mbps = (float(frame.tx_size) * 8.0f * (1000.0f / float(frame.tx_latency))) / 1048576.0f;
float min_mbps = (float(frame.tx_size) * 8.0f * (1000.0f / float(ftl::timer::getInterval()))) / 1048576.0f;
//if (actual_mbps < min_mbps) LOG(WARNING) << "Bitrate = " << actual_mbps << "Mbps, min required = " << min_mbps << "Mbps";
float ratio = actual_mbps / min_mbps;
//LOG(INFO) << "Rate Ratio = " << frame.tx_latency;
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
down_log_ = down_log_ << 1;
up_log_ = up_log_ << 1;
if (ratio < 1.2f) {
down_log_ += 1;
} else if (ratio > 1.5f) {
up_log_ += 1;
}
std::bitset<32> bd(down_log_);
std::bitset<32> bu(up_log_);
if (bitrate_ < min_ && int(bd.count()) - int(bu.count()) > 5) {
enabled_ = false;
down_log_ = 0;
up_log_ = 0;
bitrate_++;
LOG(INFO) << "Bitrate down to: " << bitrate_;
} else if (bitrate_ > max_ && int(bu.count()) - int(bd.count()) > 15) {
enabled_ = false;
up_log_ = 0;
down_log_ = 0;
bitrate_--;
LOG(INFO) << "Bitrate up to: " << bitrate_;
}
return bitrate_;
}
const BitrateSetting &ABRController::getBitrateInfo(bitrate_t b) {
if (b > kBitrateWorst) return bitrate_settings[kBitrateWorst];
if (b < kBitrateBest) return bitrate_settings[kBitrateBest];
return bitrate_settings[b];
};
int ABRController::getColourWidth(bitrate_t b) {
return int(std::ceil(bitrate_settings[b].colour_res * kAspectRatio)) & 0x7FFFFFFFC;
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
}
int ABRController::getDepthWidth(bitrate_t b) {
return std::ceil(bitrate_settings[b].depth_res * kAspectRatio);
}
int ABRController::getColourHeight(bitrate_t b) {
return bitrate_settings[b].colour_res;
}
int ABRController::getDepthHeight(bitrate_t b) {
return bitrate_settings[b].depth_res;
}
int ABRController::getBlockCountX(bitrate_t b) {
return bitrate_settings[b].block_count_x;
}
int ABRController::getBlockCountY(bitrate_t b) {
return bitrate_settings[b].block_count_x;
}
int ABRController::getBlockCount(bitrate_t b) {
const int c = bitrate_settings[b].block_count_x;
return c*c;
}
int ABRController::getColourQuality(bitrate_t b) {
return bitrate_settings[b].colour_qual;
}
int ABRController::getDepthQuality(bitrate_t b) {
return bitrate_settings[b].depth_qual;
}