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;