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