22 #include <unordered_map>
24 #include <condition_variable>
37 static const int HEADER_PRINT_INTERVAL = 10;
45 std::unordered_map<unsigned int, std::chrono::steady_clock::time_point>
47 std::unordered_map<unsigned int, uint64_t>
buf_count;
50 std::condition_variable
cv_;
56 scheduler_ = std::thread([&](){
58 std::unique_lock<std::mutex> lock(this->count_mutex);
59 this->measure_and_print_unlocked();
60 this->cv_.wait_for(lock, std::chrono::seconds(5));
61 }
while (!this->pause_measurment);
63 last_pad_idx_count = 0;
64 last_header_print_interval = 0;
65 num_surfaces_per_frame = 1;
66 pause_measurment =
false;
71 std::unique_lock<std::mutex> lock(this->count_mutex);
72 pause_measurment =
true;
79 time_point current = std::chrono::steady_clock::now();
80 auto current_buf_count = std::move(buf_count);
83 if (this->last_header_print_interval == 0 ||
84 this->last_pad_idx_count != this->pad_idxs.size()) {
86 this->last_header_print_interval = 0;
88 this->last_header_print_interval =
89 (this->last_header_print_interval + 1) % HEADER_PRINT_INTERVAL;
90 std::ostringstream ostr;
91 ostr <<
"**FPS: " << std::fixed << std::setprecision(2);
92 for (
auto pad_idx : this->pad_idxs) {
93 uint64_t current_buf_count_source = 0;
95 accumulated_time.insert({pad_idx, std::chrono::microseconds(0)});
98 bool source_is_eos =
false;
99 if (this->first_frame_time.find(pad_idx) != this->first_frame_time.end())
100 first_frame_time = this->first_frame_time[pad_idx];
101 auto last_frame_time = this->last_frame_time.find(pad_idx);
102 if (last_frame_time != this->last_frame_time.end()) {
105 end_time = last_frame_time->second;
106 source_is_eos =
true;
108 if (current_buf_count.find(pad_idx) != current_buf_count.end()) {
109 current_buf_count_source = current_buf_count[pad_idx];
110 this->buf_count_lifetime[pad_idx] += current_buf_count_source;
115 if (source_is_eos && end_time < this->last_measurement_time)
122 std::max(first_frame_time, this->last_measurement_time);
123 double interval = std::chrono::duration_cast<std::chrono::microseconds>(
126 ostr << (1000000 * current_buf_count_source / interval);
128 double lifetime = std::chrono::duration_cast<std::chrono::microseconds>(
129 end_time - first_frame_time)
131 accumulated_time[pad_idx].count();
132 ostr <<
" (" << (1000000 * this->buf_count_lifetime[pad_idx] / lifetime)
138 if (ostr.str() !=
"**FPS: \n")
139 std::cout << ostr.str() << std::flush;
140 this->last_measurement_time = current;
141 this->last_pad_idx_count = this->pad_idxs.size();
145 time_point current = std::chrono::steady_clock::now();
146 std::lock_guard<std::mutex> lock(count_mutex);
147 if (pause_measurment)
return probeReturn::Probe_Ok;
151 if (cnt++ % num_surfaces_per_frame == 0) {
152 auto pad_idx = frame_meta.
padIndex();
153 pad_idxs.insert(pad_idx);
155 first_frame_time.insert({pad_idx, current});
156 buf_count[pad_idx]++;
159 return probeReturn::Probe_Ok;