1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file.
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <time.h>
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <limits>
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "nacl_app/flock.h"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid FrameCounter::BeginFrame() {
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  struct timeval start_time;
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gettimeofday(&start_time, NULL);
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  frame_start_ = start_time.tv_sec * kMicroSecondsPerSecond +
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 start_time.tv_usec;
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid FrameCounter::EndFrame() {
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  struct timeval end_time;
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gettimeofday(&end_time, NULL);
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  double frame_end = end_time.tv_sec * kMicroSecondsPerSecond +
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                     end_time.tv_usec;
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  double dt = frame_end - frame_start_;
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (dt < 0)
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return;
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  frame_duration_accumulator_ += dt;
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  frame_count_++;
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (frame_count_ > kFrameRateRefreshCount ||
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      frame_duration_accumulator_ >= kMicroSecondsPerSecond) {
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    double elapsed_time = frame_duration_accumulator_ /
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                          kMicroSecondsPerSecond;
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    if (fabs(elapsed_time) > std::numeric_limits<double>::epsilon()) {
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      frames_per_second_ = frame_count_ / elapsed_time;
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    frame_duration_accumulator_ = 0;
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    frame_count_ = 0;
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid FrameCounter::Reset() {
40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  frames_per_second_ = 0;
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  frame_duration_accumulator_ = 0;
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  frame_count_ = 0;
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
44