/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef __STATS_H__ #define __STATS_H__ #include #include #ifndef ALOG #define ALOG(priority, tag, ...) ((void)__android_log_print(ANDROID_##priority, tag, __VA_ARGS__)) #define ALOGI(...) ALOG(LOG_INFO, LOG_TAG, __VA_ARGS__) #define ALOGE(...) ALOG(LOG_ERROR, LOG_TAG, __VA_ARGS__) #define ALOGD(...) ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__) #define ALOGW(...) ALOG(LOG_WARN, LOG_TAG, __VA_ARGS__) #ifndef LOG_NDEBUG #define LOG_NDEBUG 1 #endif #if LOG_NDEBUG #define ALOGV(cond, ...) ((void)0) #else #define ALOGV(...) ALOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__) #endif #endif // ALOG #include #include #include #include // Include local copy of Timers taken from system/core/libutils #include "utils/Timers.h" using namespace std; class Stats { public: Stats() { mInitTimeNs = 0; mDeInitTimeNs = 0; } ~Stats() { reset(); } private: nsecs_t mInitTimeNs; nsecs_t mDeInitTimeNs; nsecs_t mStartTimeNs; std::vector mFrameSizes; std::vector mInputTimer; std::vector mOutputTimer; public: nsecs_t getCurTime() { return systemTime(CLOCK_MONOTONIC); } void setInitTime(nsecs_t initTime) { mInitTimeNs = initTime; } void setDeInitTime(nsecs_t deInitTime) { mDeInitTimeNs = deInitTime; } void setStartTime() { mStartTimeNs = systemTime(CLOCK_MONOTONIC); } void addFrameSize(int32_t size) { mFrameSizes.push_back(size); } void addInputTime() { mInputTimer.push_back(systemTime(CLOCK_MONOTONIC)); } void addOutputTime() { mOutputTimer.push_back(systemTime(CLOCK_MONOTONIC)); } void reset() { if (!mFrameSizes.empty()) mFrameSizes.clear(); if (!mInputTimer.empty()) mInputTimer.clear(); if (!mOutputTimer.empty()) mOutputTimer.clear(); } std::vector getOutputTimer() { return mOutputTimer; } nsecs_t getInitTime() { return mInitTimeNs; } nsecs_t getDeInitTime() { return mDeInitTimeNs; } nsecs_t getTimeDiff(nsecs_t sTime, nsecs_t eTime) { return (eTime - sTime); } nsecs_t getTotalTime() { if (mOutputTimer.empty()) return -1; return (*(mOutputTimer.end() - 1) - mStartTimeNs); } void dumpStatistics(const string& operation, const string& inputReference, int64_t duarationUs, const string& componentName = "", const string& mode = "", const string& statsFile = ""); void uploadMetrics(const string& operation, const string& inputReference, const int64_t& durationUs, const string& componentName = "", const string& mode = ""); }; #endif // __STATS_H__