blob: 18ab5be458aa7d0836a6644a2f30f13c65b66a54 [file] [log] [blame]
/*
* 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.
*/
package com.android.media.benchmark.library;
import android.util.Log;
import java.util.ArrayList;
/**
* Measures Performance.
*/
public class Stats {
private static final String TAG = "Stats";
private long mInitTimeNs;
private long mDeInitTimeNs;
private long mStartTimeNs;
private ArrayList<Integer> mFrameSizes;
private ArrayList<Long> mInputTimer;
private ArrayList<Long> mOutputTimer;
public Stats() {
mFrameSizes = new ArrayList<>();
mInputTimer = new ArrayList<>();
mOutputTimer = new ArrayList<>();
mInitTimeNs = 0;
mDeInitTimeNs = 0;
}
public long getCurTime() { return System.nanoTime(); }
public void setInitTime(long initTime) { mInitTimeNs = initTime; }
public void setDeInitTime(long deInitTime) { mDeInitTimeNs = deInitTime; }
public void setStartTime() { mStartTimeNs = System.nanoTime(); }
public void addFrameSize(int size) { mFrameSizes.add(size); }
public void addInputTime() { mInputTimer.add(System.nanoTime()); }
public void addOutputTime() { mOutputTimer.add(System.nanoTime()); }
public void reset() {
if (mFrameSizes.size() != 0) {
mFrameSizes.clear();
}
if (mInputTimer.size() != 0) {
mInputTimer.clear();
}
if (mOutputTimer.size() != 0) {
mOutputTimer.clear();
}
}
public long getInitTime() { return mInitTimeNs; }
public long getDeInitTime() { return mDeInitTimeNs; }
public long getTimeDiff(long sTime, long eTime) { return (eTime - sTime); }
private long getTotalTime() {
if (mOutputTimer.size() == 0) {
return -1;
}
long lastTime = mOutputTimer.get(mOutputTimer.size() - 1);
return lastTime - mStartTimeNs;
}
private long getTotalSize() {
long totalSize = 0;
for (long size : mFrameSizes) {
totalSize += size;
}
return totalSize;
}
/**
* Dumps the stats of the operation for a given input media.
* <p>
* \param operation describes the operation performed on the input media
* (i.e. extract/mux/decode/encode)
* \param inputReference input media
* \param durationUs is a duration of the input media in microseconds.
*/
public void dumpStatistics(String operation, String inputReference, long durationUs) {
if (mOutputTimer.size() == 0) {
Log.e(TAG, "No output produced");
return;
}
long totalTimeTakenNs = getTotalTime();
long timeTakenPerSec = (totalTimeTakenNs * 1000000) / durationUs;
long timeToFirstFrameNs = mOutputTimer.get(0) - mStartTimeNs;
long size = getTotalSize();
// get min and max output intervals.
long intervalNs;
long minTimeTakenNs = Long.MAX_VALUE;
long maxTimeTakenNs = 0;
long prevIntervalNs = mStartTimeNs;
for (int idx = 0; idx < mOutputTimer.size() - 1; idx++) {
intervalNs = mOutputTimer.get(idx) - prevIntervalNs;
prevIntervalNs = mOutputTimer.get(idx);
if (minTimeTakenNs > intervalNs) {
minTimeTakenNs = intervalNs;
} else if (maxTimeTakenNs < intervalNs) {
maxTimeTakenNs = intervalNs;
}
}
// Print the Stats
Log.i(TAG, "Input Reference : " + inputReference);
Log.i(TAG, "Setup Time in nano sec : " + mInitTimeNs);
Log.i(TAG, "Average Time in nano sec : " + totalTimeTakenNs / mOutputTimer.size());
Log.i(TAG, "Time to first frame in nano sec : " + timeToFirstFrameNs);
Log.i(TAG, "Time taken (in nano sec) to " + operation + " 1 sec of content : " +
timeTakenPerSec);
Log.i(TAG, "Total bytes " + operation + "ed : " + size);
Log.i(TAG, "Number of bytes " + operation + "ed per second : " +
(size * 1000000000) / totalTimeTakenNs);
Log.i(TAG, "Minimum Time in nano sec : " + minTimeTakenNs);
Log.i(TAG, "Maximum Time in nano sec : " + maxTimeTakenNs);
Log.i(TAG, "Destroy Time in nano sec : " + mDeInitTimeNs);
}
}