Merge "Benchmark Timer : add support for frameSizes" am: 09df62407d am: eedc9bbae6
am: f1a300c6df

Change-Id: I602a9943431b1051086f97f4d1105985cb2fb7ac
diff --git a/media/tests/benchmark/src/native/common/Android.bp b/media/tests/benchmark/src/native/common/Android.bp
index 64ea1ee..527f588 100644
--- a/media/tests/benchmark/src/native/common/Android.bp
+++ b/media/tests/benchmark/src/native/common/Android.bp
@@ -23,7 +23,7 @@
 
     srcs: [
         "BenchmarkCommon.cpp",
-        "Timer.cpp",
+        "Stats.cpp",
     ],
 
     export_include_dirs: ["."],
diff --git a/media/tests/benchmark/src/native/common/BenchmarkCommon.cpp b/media/tests/benchmark/src/native/common/BenchmarkCommon.cpp
index bbc8790..5bdb48a 100644
--- a/media/tests/benchmark/src/native/common/BenchmarkCommon.cpp
+++ b/media/tests/benchmark/src/native/common/BenchmarkCommon.cpp
@@ -31,7 +31,7 @@
 void OnInputAvailableCB(AMediaCodec *codec, void *userdata, int32_t index) {
     ALOGV("OnInputAvailableCB: index(%d)", index);
     CallBackHandle *self = (CallBackHandle *)userdata;
-    self->getTimer()->addInputTime();
+    self->getStats()->addInputTime();
     self->mIOQueue.push([self, codec, index]() { self->onInputAvailable(codec, index); });
 }
 
@@ -40,7 +40,7 @@
     ALOGV("OnOutputAvailableCB: index(%d), (%d, %d, %lld, 0x%x)", index, bufferInfo->offset,
           bufferInfo->size, (long long)bufferInfo->presentationTimeUs, bufferInfo->flags);
     CallBackHandle *self = (CallBackHandle *)userdata;
-    self->getTimer()->addOutputTime();
+    self->getStats()->addOutputTime();
     AMediaCodecBufferInfo bufferInfoCopy = *bufferInfo;
     self->mIOQueue.push([self, codec, index, bufferInfoCopy]() {
         AMediaCodecBufferInfo bc = bufferInfoCopy;
diff --git a/media/tests/benchmark/src/native/common/BenchmarkCommon.h b/media/tests/benchmark/src/native/common/BenchmarkCommon.h
index 7b87c04..df16baf 100644
--- a/media/tests/benchmark/src/native/common/BenchmarkCommon.h
+++ b/media/tests/benchmark/src/native/common/BenchmarkCommon.h
@@ -27,7 +27,7 @@
 #include <media/NdkMediaCodec.h>
 #include <media/NdkMediaError.h>
 
-#include "Timer.h"
+#include "Stats.h"
 
 using namespace std;
 
@@ -69,11 +69,13 @@
 
 class CallBackHandle {
   public:
-    CallBackHandle() : mSawError(false), mIsDone(false), mTimer(nullptr) {}
+    CallBackHandle() : mSawError(false), mIsDone(false), mStats(nullptr) {
+        mStats = new Stats();
+    }
 
     virtual ~CallBackHandle() {
         if (mIOThread.joinable()) mIOThread.join();
-        if (mTimer) delete mTimer;
+        if (mStats) delete mStats;
     }
 
     void ioThread();
@@ -94,7 +96,7 @@
         (void)bufferInfo;
     }
 
-    virtual Timer *getTimer() { return mTimer; }
+    Stats *getStats() { return mStats; }
 
     // Keep a queue of all function callbacks.
     typedef function<void()> IOTask;
@@ -103,8 +105,8 @@
     bool mSawError;
     bool mIsDone;
 
-  private:
-    Timer *mTimer;
+  protected:
+    Stats *mStats;
 };
 
 // Async API's callback
diff --git a/media/tests/benchmark/src/native/common/Timer.cpp b/media/tests/benchmark/src/native/common/Stats.cpp
similarity index 90%
rename from media/tests/benchmark/src/native/common/Timer.cpp
rename to media/tests/benchmark/src/native/common/Stats.cpp
index 0487123..6bcd3ce 100644
--- a/media/tests/benchmark/src/native/common/Timer.cpp
+++ b/media/tests/benchmark/src/native/common/Stats.cpp
@@ -15,13 +15,13 @@
  */
 
 //#define LOG_NDEBUG 0
-#define LOG_TAG "Timer"
+#define LOG_TAG "Stats"
 
 #include <iostream>
 #include <stdint.h>
 #include <utils/Log.h>
 
-#include "Timer.h"
+#include "Stats.h"
 
 /**
  * Dumps the stats of the operation for a given input media.
@@ -31,7 +31,7 @@
  * \param inputReference input media
  * \param duarationUs    is a duration of the input media in microseconds.
  */
-void Timer::dumpStatistics(std::string operation, std::string inputReference, int64_t duarationUs) {
+void Stats::dumpStatistics(std::string operation, std::string inputReference, int64_t duarationUs) {
     ALOGV("In %s", __func__);
     if (!mOutputTimer.size()) {
         ALOGE("No output produced");
@@ -40,6 +40,7 @@
     nsecs_t totalTimeTakenNs = getTotalTime();
     nsecs_t timeTakenPerSec = (totalTimeTakenNs * 1000000) / duarationUs;
     nsecs_t timeToFirstFrameNs = *mOutputTimer.begin() - mStartTimeNs;
+    int32_t size = std::accumulate(mFrameSizes.begin(), mFrameSizes.end(), 0);
     // get min and max output intervals.
     nsecs_t intervalNs;
     nsecs_t minTimeTakenNs = INT64_MAX;
@@ -59,6 +60,7 @@
     std::cout << "Time to first frame in nano sec : " << timeToFirstFrameNs << endl;
     std::cout << "Time taken (in nano sec) to " << operation
               << " 1 sec of content : " << timeTakenPerSec << endl;
+    std::cout << "Total bytes " << operation << "ed : " << size << endl;
     std::cout << "Minimum Time in nano sec : " << minTimeTakenNs << endl;
     std::cout << "Maximum Time in nano sec : " << maxTimeTakenNs << endl;
     std::cout << "Destroy Time in nano sec : " << mDeInitTimeNs << endl;
diff --git a/media/tests/benchmark/src/native/common/Timer.h b/media/tests/benchmark/src/native/common/Stats.h
similarity index 86%
rename from media/tests/benchmark/src/native/common/Timer.h
rename to media/tests/benchmark/src/native/common/Stats.h
index 92af86f..024319a 100644
--- a/media/tests/benchmark/src/native/common/Timer.h
+++ b/media/tests/benchmark/src/native/common/Stats.h
@@ -14,8 +14,8 @@
  * limitations under the License.
  */
 
-#ifndef __TIMER_H__
-#define __TIMER_H__
+#ifndef __STATS_H__
+#define __STATS_H__
 
 #include <sys/time.h>
 #include <algorithm>
@@ -25,22 +25,22 @@
 
 using namespace std;
 
-class Timer {
+class Stats {
   public:
-    Timer() {
+    Stats() {
         mInitTimeNs = 0;
         mDeInitTimeNs = 0;
     }
 
-    ~Timer() {
-        if (!mInputTimer.empty()) mInputTimer.clear();
-        if (!mOutputTimer.empty()) mOutputTimer.clear();
+    ~Stats() {
+        reset();
     }
 
   private:
     nsecs_t mInitTimeNs;
     nsecs_t mDeInitTimeNs;
     nsecs_t mStartTimeNs;
+    std::vector<int32_t> mFrameSizes;
     std::vector<nsecs_t> mInputTimer;
     std::vector<nsecs_t> mOutputTimer;
 
@@ -53,11 +53,14 @@
 
     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 resetTimers() {
+    void reset() {
+        if (!mFrameSizes.empty()) mFrameSizes.clear();
         if (!mInputTimer.empty()) mInputTimer.clear();
         if (!mOutputTimer.empty()) mOutputTimer.clear();
     }
@@ -78,4 +81,4 @@
     void dumpStatistics(std::string operation, std::string inputReference, int64_t duarationUs);
 };
 
-#endif  // __TIMER_H__
+#endif  // __STATS_H__
diff --git a/media/tests/benchmark/src/native/decoder/Decoder.cpp b/media/tests/benchmark/src/native/decoder/Decoder.cpp
index eeea60f..ef84537 100644
--- a/media/tests/benchmark/src/native/decoder/Decoder.cpp
+++ b/media/tests/benchmark/src/native/decoder/Decoder.cpp
@@ -81,6 +81,7 @@
             mDecoderDoneCondition.notify_one();
             return;
         }
+        mStats->addFrameSize(bytesRead);
         mNumInputFrame++;
     }
 }
@@ -128,7 +129,6 @@
 
 void Decoder::setupDecoder() {
     if (!mFormat) mFormat = mExtractor->getFormat();
-    if (!mTimer) mTimer = new Timer();
 }
 
 int32_t Decoder::decode(uint8_t *inputBuffer, vector<AMediaCodecBufferInfo> &frameInfo,
@@ -143,7 +143,7 @@
     AMediaFormat_getString(mFormat, AMEDIAFORMAT_KEY_MIME, &mime);
     if (!mime) return AMEDIA_ERROR_INVALID_OBJECT;
 
-    int64_t sTime = mTimer->getCurTime();
+    int64_t sTime = mStats->getCurTime();
     mCodec = createMediaCodec(mFormat, mime, codecName, false /*isEncoder*/);
     if (!mCodec) return AMEDIA_ERROR_INVALID_OBJECT;
 
@@ -152,16 +152,15 @@
                                                 OnFormatChangedCB, OnErrorCB};
         AMediaCodec_setAsyncNotifyCallback(mCodec, aCB, this);
 
-        CallBackHandle *callbackHandle = new CallBackHandle();
-        callbackHandle->mIOThread = thread(&CallBackHandle::ioThread, this);
+        mIOThread = thread(&CallBackHandle::ioThread, this);
     }
 
     AMediaCodec_start(mCodec);
-    int64_t eTime = mTimer->getCurTime();
-    int64_t timeTaken = mTimer->getTimeDiff(sTime, eTime);
-    mTimer->setInitTime(timeTaken);
+    int64_t eTime = mStats->getCurTime();
+    int64_t timeTaken = mStats->getTimeDiff(sTime, eTime);
+    mStats->setInitTime(timeTaken);
 
-    mTimer->setStartTime();
+    mStats->setStartTime();
     if (!asyncMode) {
         while (!mSawOutputEOS && !mSignalledError) {
             /* Queue input data */
@@ -171,7 +170,7 @@
                     ALOGE("AMediaCodec_dequeueInputBuffer returned invalid index %zd\n", inIdx);
                     return AMEDIA_ERROR_IO;
                 } else if (inIdx >= 0) {
-                    mTimer->addInputTime();
+                    mStats->addInputTime();
                     onInputAvailable(mCodec, inIdx);
                 }
             }
@@ -184,7 +183,7 @@
                 const char *s = AMediaFormat_toString(mFormat);
                 ALOGI("Output format: %s\n", s);
             } else if (outIdx >= 0) {
-                mTimer->addOutputTime();
+                mStats->addOutputTime();
                 onOutputAvailable(mCodec, outIdx, &info);
             } else if (!(outIdx == AMEDIACODEC_INFO_TRY_AGAIN_LATER ||
                          outIdx == AMEDIACODEC_INFO_OUTPUT_BUFFERS_CHANGED)) {
@@ -207,7 +206,7 @@
 }
 
 void Decoder::deInitCodec() {
-    int64_t sTime = mTimer->getCurTime();
+    int64_t sTime = mStats->getCurTime();
     if (mFormat) {
         AMediaFormat_delete(mFormat);
         mFormat = nullptr;
@@ -215,19 +214,19 @@
     if (!mCodec) return;
     AMediaCodec_stop(mCodec);
     AMediaCodec_delete(mCodec);
-    int64_t eTime = mTimer->getCurTime();
-    int64_t timeTaken = mTimer->getTimeDiff(sTime, eTime);
-    mTimer->setDeInitTime(timeTaken);
+    int64_t eTime = mStats->getCurTime();
+    int64_t timeTaken = mStats->getTimeDiff(sTime, eTime);
+    mStats->setDeInitTime(timeTaken);
 }
 
 void Decoder::dumpStatistics(string inputReference) {
     int64_t durationUs = mExtractor->getClipDuration();
     string operation = "decode";
-    mTimer->dumpStatistics(operation, inputReference, durationUs);
+    mStats->dumpStatistics(operation, inputReference, durationUs);
 }
 
 void Decoder::resetDecoder() {
-    if (mTimer) mTimer->resetTimers();
+    if (mStats) mStats->reset();
     if (mInputBuffer) mInputBuffer = nullptr;
     if (!mFrameMetaData.empty()) mFrameMetaData.clear();
 }
diff --git a/media/tests/benchmark/src/native/decoder/Decoder.h b/media/tests/benchmark/src/native/decoder/Decoder.h
index 7f64de3..7630e7b 100644
--- a/media/tests/benchmark/src/native/decoder/Decoder.h
+++ b/media/tests/benchmark/src/native/decoder/Decoder.h
@@ -25,7 +25,7 @@
 
 #include "BenchmarkCommon.h"
 #include "Extractor.h"
-#include "Timer.h"
+#include "Stats.h"
 
 class Decoder : public CallBackHandle {
   public:
@@ -33,7 +33,6 @@
         : mCodec(nullptr),
           mFormat(nullptr),
           mExtractor(nullptr),
-          mTimer(nullptr),
           mNumInputFrame(0),
           mNumOutputFrame(0),
           mSawInputEOS(false),
@@ -45,12 +44,9 @@
     }
 
     virtual ~Decoder() {
-        if (mTimer) delete mTimer;
         if (mExtractor) delete mExtractor;
     }
 
-    Timer *getTimer() override { return mTimer; }
-
     Extractor *getExtractor() { return mExtractor; }
 
     // Decoder related utilities
@@ -80,8 +76,6 @@
 
     Extractor *mExtractor;
 
-    Timer *mTimer;
-
     int32_t mNumInputFrame;
     int32_t mNumOutputFrame;
 
diff --git a/media/tests/benchmark/src/native/encoder/Encoder.cpp b/media/tests/benchmark/src/native/encoder/Encoder.cpp
index 73a559a..5fdf9e3 100644
--- a/media/tests/benchmark/src/native/encoder/Encoder.cpp
+++ b/media/tests/benchmark/src/native/encoder/Encoder.cpp
@@ -112,6 +112,7 @@
             return;
         }
 
+        mStats->addFrameSize(bufferInfo->size);
         AMediaCodec_releaseOutputBuffer(mCodec, bufIdx, false);
         mSawOutputEOS = (0 != (bufferInfo->flags & AMEDIACODEC_BUFFER_FLAG_END_OF_STREAM));
         mNumOutputFrame++;
@@ -134,24 +135,23 @@
 
 void Encoder::setupEncoder() {
     if (!mFormat) mFormat = AMediaFormat_new();
-    if (!mTimer) mTimer = new Timer();
 }
 
 void Encoder::deInitCodec() {
-    int64_t sTime = mTimer->getCurTime();
+    int64_t sTime = mStats->getCurTime();
     if (mFormat) {
         AMediaFormat_delete(mFormat);
         mFormat = nullptr;
     }
     AMediaCodec_stop(mCodec);
     AMediaCodec_delete(mCodec);
-    int64_t eTime = mTimer->getCurTime();
-    int64_t timeTaken = mTimer->getTimeDiff(sTime, eTime);
-    mTimer->setDeInitTime(timeTaken);
+    int64_t eTime = mStats->getCurTime();
+    int64_t timeTaken = mStats->getTimeDiff(sTime, eTime);
+    mStats->setDeInitTime(timeTaken);
 }
 
 void Encoder::resetEncoder() {
-    if (mTimer) mTimer->resetTimers();
+    if (mStats) mStats->reset();
     if (mEleStream) mEleStream = nullptr;
     if (mMime) mMime = nullptr;
     mInputBufferSize = 0;
@@ -160,7 +160,7 @@
 
 void Encoder::dumpStatistics(string inputReference, int64_t durationUs) {
     string operation = "encode";
-    mTimer->dumpStatistics(operation, inputReference, durationUs);
+    mStats->dumpStatistics(operation, inputReference, durationUs);
 }
 
 int32_t Encoder::encode(string &codecName, ifstream &eleStream, size_t eleSize,
@@ -192,11 +192,11 @@
     const char *s = AMediaFormat_toString(mFormat);
     ALOGV("Input format: %s\n", s);
 
-    int64_t sTime = mTimer->getCurTime();
+    int64_t sTime = mStats->getCurTime();
     mCodec = createMediaCodec(mFormat, mMime, codecName, true /*isEncoder*/);
     if (!mCodec) return AMEDIA_ERROR_INVALID_OBJECT;
-    int64_t eTime = mTimer->getCurTime();
-    int64_t timeTaken = mTimer->getTimeDiff(sTime, eTime);
+    int64_t eTime = mStats->getCurTime();
+    int64_t timeTaken = mStats->getTimeDiff(sTime, eTime);
 
     if (!strncmp(mMime, "video/", 6)) {
         mParams.frameSize = mParams.width * mParams.height * 3 / 2;
@@ -215,20 +215,19 @@
     }
     mParams.numFrames = (mInputBufferSize + mParams.frameSize - 1) / mParams.frameSize;
 
-    sTime = mTimer->getCurTime();
+    sTime = mStats->getCurTime();
     if (asyncMode) {
         AMediaCodecOnAsyncNotifyCallback aCB = {OnInputAvailableCB, OnOutputAvailableCB,
                                                 OnFormatChangedCB, OnErrorCB};
         AMediaCodec_setAsyncNotifyCallback(mCodec, aCB, this);
-        CallBackHandle *callbackHandle = new CallBackHandle();
-        callbackHandle->mIOThread = thread(&CallBackHandle::ioThread, this);
+        mIOThread = thread(&CallBackHandle::ioThread, this);
     }
     AMediaCodec_start(mCodec);
-    eTime = mTimer->getCurTime();
-    timeTaken += mTimer->getTimeDiff(sTime, eTime);
-    mTimer->setInitTime(timeTaken);
+    eTime = mStats->getCurTime();
+    timeTaken += mStats->getTimeDiff(sTime, eTime);
+    mStats->setInitTime(timeTaken);
 
-    mTimer->setStartTime();
+    mStats->setStartTime();
     if (!asyncMode) {
         while (!mSawOutputEOS && !mSignalledError) {
             // Queue input data
@@ -238,7 +237,7 @@
                     ALOGE("AMediaCodec_dequeueInputBuffer returned invalid index %zd\n", inIdx);
                     return AMEDIA_ERROR_IO;
                 } else if (inIdx >= 0) {
-                    mTimer->addInputTime();
+                    mStats->addInputTime();
                     onInputAvailable(mCodec, inIdx);
                 }
             }
@@ -251,7 +250,7 @@
                 const char *s = AMediaFormat_toString(mFormat);
                 ALOGI("Output format: %s\n", s);
             } else if (outIdx >= 0) {
-                mTimer->addOutputTime();
+                mStats->addOutputTime();
                 onOutputAvailable(mCodec, outIdx, &info);
             } else if (!(outIdx == AMEDIACODEC_INFO_TRY_AGAIN_LATER ||
                          outIdx == AMEDIACODEC_INFO_OUTPUT_BUFFERS_CHANGED)) {
diff --git a/media/tests/benchmark/src/native/encoder/Encoder.h b/media/tests/benchmark/src/native/encoder/Encoder.h
index 903d52b..75d9941 100644
--- a/media/tests/benchmark/src/native/encoder/Encoder.h
+++ b/media/tests/benchmark/src/native/encoder/Encoder.h
@@ -24,7 +24,7 @@
 #include <thread>
 
 #include "BenchmarkCommon.h"
-#include "Timer.h"
+#include "Stats.h"
 
 struct encParameter {
     int32_t bitrate = -1;
@@ -45,18 +45,13 @@
     Encoder()
         : mCodec(nullptr),
           mFormat(nullptr),
-          mTimer(nullptr),
           mNumInputFrame(0),
           mNumOutputFrame(0),
           mSawInputEOS(false),
           mSawOutputEOS(false),
           mSignalledError(false) {}
 
-    virtual ~Encoder() {
-        if (mTimer) delete mTimer;
-    }
-
-    Timer *getTimer() override { return mTimer; }
+    virtual ~Encoder() {}
 
     // Encoder related utilities
     void setupEncoder();
@@ -83,8 +78,6 @@
     AMediaCodec *mCodec;
     AMediaFormat *mFormat;
 
-    Timer *mTimer;
-
     int32_t mNumInputFrame;
     int32_t mNumOutputFrame;
     bool mSawInputEOS;
diff --git a/media/tests/benchmark/src/native/extractor/Extractor.cpp b/media/tests/benchmark/src/native/extractor/Extractor.cpp
index 0726ae3..b4cad0b 100644
--- a/media/tests/benchmark/src/native/extractor/Extractor.cpp
+++ b/media/tests/benchmark/src/native/extractor/Extractor.cpp
@@ -22,21 +22,21 @@
 #include "Extractor.h"
 
 int32_t Extractor::initExtractor(int32_t fd, size_t fileSize) {
-    mTimer = new Timer();
+    mStats = new Stats();
 
     mFrameBuf = (uint8_t *)calloc(kMaxBufferSize, sizeof(uint8_t));
     if (!mFrameBuf) return -1;
 
-    int64_t sTime = mTimer->getCurTime();
+    int64_t sTime = mStats->getCurTime();
 
     mExtractor = AMediaExtractor_new();
     if (!mExtractor) return AMEDIACODEC_ERROR_INSUFFICIENT_RESOURCE;
     media_status_t status = AMediaExtractor_setDataSourceFd(mExtractor, fd, 0, fileSize);
     if (status != AMEDIA_OK) return status;
 
-    int64_t eTime = mTimer->getCurTime();
-    int64_t timeTaken = mTimer->getTimeDiff(sTime, eTime);
-    mTimer->setInitTime(timeTaken);
+    int64_t eTime = mStats->getCurTime();
+    int64_t timeTaken = mStats->getTimeDiff(sTime, eTime);
+    mStats->setInitTime(timeTaken);
 
     return AMediaExtractor_getTrackCount(mExtractor);
 }
@@ -52,6 +52,7 @@
     bool csdFound = AMediaFormat_getBuffer(mFormat, csdName, &csdBuffer, &size);
     if (!csdFound) return nullptr;
     frameInfo.size = (int32_t)size;
+    mStats->addFrameSize(frameInfo.size);
 
     return csdBuffer;
 }
@@ -62,6 +63,7 @@
 
     frameInfo.flags = AMediaExtractor_getSampleFlags(mExtractor);
     frameInfo.size = size;
+    mStats->addFrameSize(frameInfo.size);
     frameInfo.presentationTimeUs = AMediaExtractor_getSampleTime(mExtractor);
     AMediaExtractor_advance(mExtractor);
 
@@ -92,11 +94,11 @@
         idx++;
     }
 
-    mTimer->setStartTime();
+    mStats->setStartTime();
     while (1) {
         int32_t status = getFrameSample(frameInfo);
         if (status || !frameInfo.size) break;
-        mTimer->addOutputTime();
+        mStats->addOutputTime();
     }
 
     if (mFormat) {
@@ -111,7 +113,7 @@
 
 void Extractor::dumpStatistics(string inputReference) {
     string operation = "extract";
-    mTimer->dumpStatistics(operation, inputReference, mDurationUs);
+    mStats->dumpStatistics(operation, inputReference, mDurationUs);
 }
 
 void Extractor::deInitExtractor() {
@@ -120,14 +122,14 @@
         mFrameBuf = nullptr;
     }
 
-    int64_t sTime = mTimer->getCurTime();
+    int64_t sTime = mStats->getCurTime();
     if (mExtractor) {
         // TODO: (b/140128505) Multiple calls result in DoS.
         // Uncomment call to AMediaExtractor_delete() once this is resolved
         // AMediaExtractor_delete(mExtractor);
         mExtractor = nullptr;
     }
-    int64_t eTime = mTimer->getCurTime();
-    int64_t deInitTime = mTimer->getTimeDiff(sTime, eTime);
-    mTimer->setDeInitTime(deInitTime);
+    int64_t eTime = mStats->getCurTime();
+    int64_t deInitTime = mStats->getTimeDiff(sTime, eTime);
+    mStats->setDeInitTime(deInitTime);
 }
diff --git a/media/tests/benchmark/src/native/extractor/Extractor.h b/media/tests/benchmark/src/native/extractor/Extractor.h
index 361bcd7..4c39a72 100644
--- a/media/tests/benchmark/src/native/extractor/Extractor.h
+++ b/media/tests/benchmark/src/native/extractor/Extractor.h
@@ -20,19 +20,19 @@
 #include <media/NdkMediaExtractor.h>
 
 #include "BenchmarkCommon.h"
-#include "Timer.h"
+#include "Stats.h"
 
 class Extractor {
   public:
     Extractor()
         : mFormat(nullptr),
           mExtractor(nullptr),
-          mTimer(nullptr),
+          mStats(nullptr),
           mFrameBuf{nullptr},
           mDurationUs{0} {}
 
     ~Extractor() {
-        if (mTimer) delete mTimer;
+        if (mStats) delete mStats;
     }
 
     int32_t initExtractor(int32_t fd, size_t fileSize);
@@ -58,7 +58,7 @@
   private:
     AMediaFormat *mFormat;
     AMediaExtractor *mExtractor;
-    Timer *mTimer;
+    Stats *mStats;
     uint8_t *mFrameBuf;
     int64_t mDurationUs;
 };
diff --git a/media/tests/benchmark/src/native/muxer/Muxer.cpp b/media/tests/benchmark/src/native/muxer/Muxer.cpp
index 877f7ad..b297a66 100644
--- a/media/tests/benchmark/src/native/muxer/Muxer.cpp
+++ b/media/tests/benchmark/src/native/muxer/Muxer.cpp
@@ -24,9 +24,9 @@
 
 int32_t Muxer::initMuxer(int32_t fd, MUXER_OUTPUT_T outputFormat) {
     if (!mFormat) mFormat = mExtractor->getFormat();
-    if (!mTimer) mTimer = new Timer();
+    if (!mStats) mStats = new Stats();
 
-    int64_t sTime = mTimer->getCurTime();
+    int64_t sTime = mStats->getCurTime();
     mMuxer = AMediaMuxer_new(fd, (OutputFormat)outputFormat);
     if (!mMuxer) {
         cout << "[   WARN   ] Test Skipped. Unable to create muxer \n";
@@ -42,14 +42,14 @@
         return index;
     }
     AMediaMuxer_start(mMuxer);
-    int64_t eTime = mTimer->getCurTime();
-    int64_t timeTaken = mTimer->getTimeDiff(sTime, eTime);
-    mTimer->setInitTime(timeTaken);
+    int64_t eTime = mStats->getCurTime();
+    int64_t timeTaken = mStats->getTimeDiff(sTime, eTime);
+    mStats->setInitTime(timeTaken);
     return AMEDIA_OK;
 }
 
 void Muxer::deInitMuxer() {
-    int64_t sTime = mTimer->getCurTime();
+    int64_t sTime = mStats->getCurTime();
     if (mFormat) {
         AMediaFormat_delete(mFormat);
         mFormat = nullptr;
@@ -57,24 +57,24 @@
     if (!mMuxer) return;
     AMediaMuxer_stop(mMuxer);
     AMediaMuxer_delete(mMuxer);
-    int64_t eTime = mTimer->getCurTime();
-    int64_t timeTaken = mTimer->getTimeDiff(sTime, eTime);
-    mTimer->setDeInitTime(timeTaken);
+    int64_t eTime = mStats->getCurTime();
+    int64_t timeTaken = mStats->getTimeDiff(sTime, eTime);
+    mStats->setDeInitTime(timeTaken);
 }
 
 void Muxer::resetMuxer() {
-    if (mTimer) mTimer->resetTimers();
+    if (mStats) mStats->reset();
 }
 
 void Muxer::dumpStatistics(string inputReference) {
     string operation = "mux";
-    mTimer->dumpStatistics(operation, inputReference, mExtractor->getClipDuration());
+    mStats->dumpStatistics(operation, inputReference, mExtractor->getClipDuration());
 }
 
 int32_t Muxer::mux(uint8_t *inputBuffer, vector<AMediaCodecBufferInfo> &frameInfos) {
     // Mux frame data
     size_t frameIdx = 0;
-    mTimer->setStartTime();
+    mStats->setStartTime();
     while (frameIdx < frameInfos.size()) {
         AMediaCodecBufferInfo info = frameInfos.at(frameIdx);
         media_status_t status = AMediaMuxer_writeSampleData(mMuxer, 0, inputBuffer, &info);
@@ -82,7 +82,8 @@
             ALOGE("Error in AMediaMuxer_writeSampleData");
             return status;
         }
-        mTimer->addOutputTime();
+        mStats->addOutputTime();
+        mStats->addFrameSize(info.size);
         frameIdx++;
     }
     return AMEDIA_OK;
diff --git a/media/tests/benchmark/src/native/muxer/Muxer.h b/media/tests/benchmark/src/native/muxer/Muxer.h
index 154fd20..eee3146 100644
--- a/media/tests/benchmark/src/native/muxer/Muxer.h
+++ b/media/tests/benchmark/src/native/muxer/Muxer.h
@@ -20,7 +20,7 @@
 #include <media/NdkMediaMuxer.h>
 
 #include "BenchmarkCommon.h"
-#include "Timer.h"
+#include "Stats.h"
 #include "Extractor.h"
 
 typedef enum {
@@ -33,14 +33,14 @@
 
 class Muxer {
   public:
-    Muxer() : mFormat(nullptr), mMuxer(nullptr), mTimer(nullptr) { mExtractor = new Extractor(); }
+    Muxer() : mFormat(nullptr), mMuxer(nullptr), mStats(nullptr) { mExtractor = new Extractor(); }
 
     virtual ~Muxer() {
-        if (mTimer) delete mTimer;
+        if (mStats) delete mStats;
         if (mExtractor) delete mExtractor;
     }
 
-    Timer *getTimer() { return mTimer; }
+    Stats *getStats() { return mStats; }
     Extractor *getExtractor() { return mExtractor; }
 
     /* Muxer related utilities */
@@ -57,7 +57,7 @@
     AMediaFormat *mFormat;
     AMediaMuxer *mMuxer;
     Extractor *mExtractor;
-    Timer *mTimer;
+    Stats *mStats;
 };
 
 #endif  // __MUXER_H__