blob: 2936531cd2780d429db32c7f244452248cb00c64 [file] [log] [blame]
/*
* Copyright (C) 2020 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 ANDROID_SERVICE_UTILS_SESSION_STATS_BUILDER_H
#define ANDROID_SERVICE_UTILS_SESSION_STATS_BUILDER_H
#include <utils/Errors.h>
#include <array>
#include <map>
#include <mutex>
namespace android {
// Helper class to build stream stats
struct StreamStats {
// Fields for buffer drop
int64_t mRequestedFrameCount;
int64_t mDroppedFrameCount;
bool mCounterStopped;
// Fields for stream startup latency
int32_t mStartLatencyMs;
// Fields for capture latency measurement
const static int LATENCY_BIN_COUNT = 10;
// Boundary values separating between adjacent bins, excluding 0 and
// infinity.
const static std::array<int32_t, LATENCY_BIN_COUNT-1> mCaptureLatencyBins;
// Counter values for all histogram bins. One more entry than mCaptureLatencyBins.
std::array<int64_t, LATENCY_BIN_COUNT> mCaptureLatencyHistogram;
StreamStats() : mRequestedFrameCount(0),
mDroppedFrameCount(0),
mCounterStopped(false),
mStartLatencyMs(0),
mCaptureLatencyHistogram{}
{}
void updateLatencyHistogram(int32_t latencyMs);
};
// Helper class to build session stats
class SessionStatsBuilder {
public:
status_t addStream(int streamId);
status_t removeStream(int streamId);
// Return the session statistics and reset the internal states.
void buildAndReset(/*out*/int64_t* requestCount,
/*out*/int64_t* errorResultCount,
/*out*/bool* deviceError,
/*out*/std::map<int, StreamStats> *statsMap);
// Stream specific counter
void startCounter(int streamId);
void stopCounter(int streamId);
void incCounter(int streamId, bool dropped, int32_t captureLatencyMs);
// Session specific counter
void stopCounter();
void incResultCounter(bool dropped);
void onDeviceError();
SessionStatsBuilder() : mRequestCount(0), mErrorResultCount(0),
mCounterStopped(false), mDeviceError(false) {}
private:
std::mutex mLock;
int64_t mRequestCount;
int64_t mErrorResultCount;
bool mCounterStopped;
bool mDeviceError;
std::string mUserTag;
// Map from stream id to stream statistics
std::map<int, StreamStats> mStatsMap;
};
}; // namespace android
#endif // ANDROID_SERVICE_UTILS_SESSION_STATS_BUILDER_H