xref: /aosp_15_r20/external/aac/tests/AacDecBenchmark/AacDecBenchmark.cpp (revision e54365361535b070c2db7374cec45c159c7d0e7a)
1*e5436536SAndroid Build Coastguard Worker /******************************************************************************
2*e5436536SAndroid Build Coastguard Worker  *
3*e5436536SAndroid Build Coastguard Worker  * Copyright (C) 2024 The Android Open Source Project
4*e5436536SAndroid Build Coastguard Worker  *
5*e5436536SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*e5436536SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*e5436536SAndroid Build Coastguard Worker  * You may obtain a copy of the License at:
8*e5436536SAndroid Build Coastguard Worker  *
9*e5436536SAndroid Build Coastguard Worker  * http://www.apache.org/licenses/LICENSE-2.0
10*e5436536SAndroid Build Coastguard Worker  *
11*e5436536SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*e5436536SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*e5436536SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*e5436536SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*e5436536SAndroid Build Coastguard Worker  * limitations under the License.
16*e5436536SAndroid Build Coastguard Worker  *
17*e5436536SAndroid Build Coastguard Worker  *****************************************************************************
18*e5436536SAndroid Build Coastguard Worker  */
19*e5436536SAndroid Build Coastguard Worker 
20*e5436536SAndroid Build Coastguard Worker #include <benchmark/benchmark.h>
21*e5436536SAndroid Build Coastguard Worker #include <log/log.h>
22*e5436536SAndroid Build Coastguard Worker 
23*e5436536SAndroid Build Coastguard Worker #include <cstdio>
24*e5436536SAndroid Build Coastguard Worker #include <iostream>
25*e5436536SAndroid Build Coastguard Worker #include <memory>
26*e5436536SAndroid Build Coastguard Worker #include <string>
27*e5436536SAndroid Build Coastguard Worker #include <vector>
28*e5436536SAndroid Build Coastguard Worker 
29*e5436536SAndroid Build Coastguard Worker #include "aacdecoder_lib.h"
30*e5436536SAndroid Build Coastguard Worker 
31*e5436536SAndroid Build Coastguard Worker class AACDecoder {
32*e5436536SAndroid Build Coastguard Worker    private:
33*e5436536SAndroid Build Coastguard Worker     HANDLE_AACDECODER mAACDecoder;
34*e5436536SAndroid Build Coastguard Worker     CStreamInfo* mStreamInfo;
35*e5436536SAndroid Build Coastguard Worker 
36*e5436536SAndroid Build Coastguard Worker    public:
AACDecoder()37*e5436536SAndroid Build Coastguard Worker     AACDecoder() : mAACDecoder(nullptr), mStreamInfo(nullptr) {}
38*e5436536SAndroid Build Coastguard Worker 
initialize()39*e5436536SAndroid Build Coastguard Worker     bool initialize() {
40*e5436536SAndroid Build Coastguard Worker         mAACDecoder = aacDecoder_Open(TT_MP4_RAW, 1);
41*e5436536SAndroid Build Coastguard Worker         if (!mAACDecoder) {
42*e5436536SAndroid Build Coastguard Worker             ALOGE("Failed to initialize AAC decoder");
43*e5436536SAndroid Build Coastguard Worker             return false;
44*e5436536SAndroid Build Coastguard Worker         }
45*e5436536SAndroid Build Coastguard Worker 
46*e5436536SAndroid Build Coastguard Worker         mStreamInfo = aacDecoder_GetStreamInfo(mAACDecoder);
47*e5436536SAndroid Build Coastguard Worker         if (!mStreamInfo) {
48*e5436536SAndroid Build Coastguard Worker             ALOGE("Failed to get stream info after initialization");
49*e5436536SAndroid Build Coastguard Worker             return false;
50*e5436536SAndroid Build Coastguard Worker         }
51*e5436536SAndroid Build Coastguard Worker         return true;
52*e5436536SAndroid Build Coastguard Worker     }
53*e5436536SAndroid Build Coastguard Worker 
~AACDecoder()54*e5436536SAndroid Build Coastguard Worker     ~AACDecoder() {
55*e5436536SAndroid Build Coastguard Worker         if (mAACDecoder) {
56*e5436536SAndroid Build Coastguard Worker             aacDecoder_Close(mAACDecoder);
57*e5436536SAndroid Build Coastguard Worker         }
58*e5436536SAndroid Build Coastguard Worker     }
59*e5436536SAndroid Build Coastguard Worker 
getChannels() const60*e5436536SAndroid Build Coastguard Worker     int getChannels() const { return mStreamInfo ? mStreamInfo->numChannels : 0; }
getFrameSize() const61*e5436536SAndroid Build Coastguard Worker     int getFrameSize() const { return mStreamInfo ? mStreamInfo->frameSize : 0; }
getSampleRate() const62*e5436536SAndroid Build Coastguard Worker     int getSampleRate() const { return mStreamInfo ? mStreamInfo->sampleRate : 0; }
63*e5436536SAndroid Build Coastguard Worker 
decode(const std::vector<std::pair<std::vector<uint8_t>,int>> & inputBuffers)64*e5436536SAndroid Build Coastguard Worker     bool decode(const std::vector<std::pair<std::vector<uint8_t>, int>>& inputBuffers) {
65*e5436536SAndroid Build Coastguard Worker         for (const auto& [buffer, flag] : inputBuffers) {
66*e5436536SAndroid Build Coastguard Worker             std::vector<INT_PCM> frameOutput;
67*e5436536SAndroid Build Coastguard Worker             if (flag == 2) {
68*e5436536SAndroid Build Coastguard Worker                 if (!configureDecoder(buffer)) {
69*e5436536SAndroid Build Coastguard Worker                     return false;
70*e5436536SAndroid Build Coastguard Worker                 }
71*e5436536SAndroid Build Coastguard Worker             } else {
72*e5436536SAndroid Build Coastguard Worker                 if (!decodeFrame(buffer, frameOutput)) {
73*e5436536SAndroid Build Coastguard Worker                     return false;
74*e5436536SAndroid Build Coastguard Worker                 }
75*e5436536SAndroid Build Coastguard Worker             }
76*e5436536SAndroid Build Coastguard Worker         }
77*e5436536SAndroid Build Coastguard Worker         return true;
78*e5436536SAndroid Build Coastguard Worker     }
79*e5436536SAndroid Build Coastguard Worker 
80*e5436536SAndroid Build Coastguard Worker    private:
configureDecoder(const std::vector<uint8_t> & configBuffer)81*e5436536SAndroid Build Coastguard Worker     bool configureDecoder(const std::vector<uint8_t>& configBuffer) {
82*e5436536SAndroid Build Coastguard Worker         UINT bytesRead = configBuffer.size();
83*e5436536SAndroid Build Coastguard Worker         UCHAR* configData = const_cast<UCHAR*>(configBuffer.data());
84*e5436536SAndroid Build Coastguard Worker         UCHAR* configArray[1] = {configData};
85*e5436536SAndroid Build Coastguard Worker 
86*e5436536SAndroid Build Coastguard Worker         AAC_DECODER_ERROR err = aacDecoder_ConfigRaw(mAACDecoder, configArray, &bytesRead);
87*e5436536SAndroid Build Coastguard Worker         if (err != AAC_DEC_OK) {
88*e5436536SAndroid Build Coastguard Worker             ALOGE("Failed to configure decoder: error %d", err);
89*e5436536SAndroid Build Coastguard Worker             return false;
90*e5436536SAndroid Build Coastguard Worker         }
91*e5436536SAndroid Build Coastguard Worker         return true;
92*e5436536SAndroid Build Coastguard Worker     }
93*e5436536SAndroid Build Coastguard Worker 
decodeFrame(const std::vector<uint8_t> & inputBuffer,std::vector<INT_PCM> & outputBuffer)94*e5436536SAndroid Build Coastguard Worker     bool decodeFrame(const std::vector<uint8_t>& inputBuffer, std::vector<INT_PCM>& outputBuffer) {
95*e5436536SAndroid Build Coastguard Worker         constexpr size_t kOutputBufferSize = 10240;
96*e5436536SAndroid Build Coastguard Worker         UINT bytesRead = inputBuffer.size();
97*e5436536SAndroid Build Coastguard Worker         UINT validBytes = bytesRead;
98*e5436536SAndroid Build Coastguard Worker         UCHAR* inputPtr = const_cast<UCHAR*>(inputBuffer.data());
99*e5436536SAndroid Build Coastguard Worker         UCHAR* bufferArray[1] = {inputPtr};
100*e5436536SAndroid Build Coastguard Worker 
101*e5436536SAndroid Build Coastguard Worker         AAC_DECODER_ERROR err = aacDecoder_Fill(mAACDecoder, bufferArray, &bytesRead, &validBytes);
102*e5436536SAndroid Build Coastguard Worker         if (err != AAC_DEC_OK) {
103*e5436536SAndroid Build Coastguard Worker             ALOGE("Failed to fill decoder buffer: error %d", err);
104*e5436536SAndroid Build Coastguard Worker             return false;
105*e5436536SAndroid Build Coastguard Worker         }
106*e5436536SAndroid Build Coastguard Worker 
107*e5436536SAndroid Build Coastguard Worker         outputBuffer.resize(kOutputBufferSize);  // Ensure buffer is large enough
108*e5436536SAndroid Build Coastguard Worker         err = aacDecoder_DecodeFrame(mAACDecoder, outputBuffer.data(), outputBuffer.size(), 0);
109*e5436536SAndroid Build Coastguard Worker         if (err != AAC_DEC_OK) {
110*e5436536SAndroid Build Coastguard Worker             ALOGE("Failed to decode frame: error %d", err);
111*e5436536SAndroid Build Coastguard Worker             return false;
112*e5436536SAndroid Build Coastguard Worker         }
113*e5436536SAndroid Build Coastguard Worker 
114*e5436536SAndroid Build Coastguard Worker         outputBuffer.resize(mStreamInfo->numChannels * mStreamInfo->frameSize);
115*e5436536SAndroid Build Coastguard Worker         return true;
116*e5436536SAndroid Build Coastguard Worker     }
117*e5436536SAndroid Build Coastguard Worker };
118*e5436536SAndroid Build Coastguard Worker 
readInputFiles(const std::string & folderPath,const std::string & bitstreamFile,const std::string & infoFile)119*e5436536SAndroid Build Coastguard Worker std::vector<std::pair<std::vector<uint8_t>, int>> readInputFiles(const std::string& folderPath,
120*e5436536SAndroid Build Coastguard Worker                                                                  const std::string& bitstreamFile,
121*e5436536SAndroid Build Coastguard Worker                                                                  const std::string& infoFile) {
122*e5436536SAndroid Build Coastguard Worker     std::string fullBitstreamPath = folderPath + "/" + bitstreamFile;
123*e5436536SAndroid Build Coastguard Worker     std::string fullInfoPath = folderPath + "/" + infoFile;
124*e5436536SAndroid Build Coastguard Worker     std::vector<std::pair<std::vector<uint8_t>, int>> inputBuffers;
125*e5436536SAndroid Build Coastguard Worker 
126*e5436536SAndroid Build Coastguard Worker     FILE* bitStreamFilePtr = fopen(fullBitstreamPath.c_str(), "rb");
127*e5436536SAndroid Build Coastguard Worker     if (!bitStreamFilePtr) {
128*e5436536SAndroid Build Coastguard Worker         ALOGE("Failed to open bitstream file %s", fullBitstreamPath.c_str());
129*e5436536SAndroid Build Coastguard Worker         return inputBuffers;
130*e5436536SAndroid Build Coastguard Worker     }
131*e5436536SAndroid Build Coastguard Worker 
132*e5436536SAndroid Build Coastguard Worker     FILE* infoFilePtr = fopen(fullInfoPath.c_str(), "r");
133*e5436536SAndroid Build Coastguard Worker     if (!infoFilePtr) {
134*e5436536SAndroid Build Coastguard Worker         ALOGE("Failed to open info file %s", fullInfoPath.c_str());
135*e5436536SAndroid Build Coastguard Worker         return inputBuffers;
136*e5436536SAndroid Build Coastguard Worker     }
137*e5436536SAndroid Build Coastguard Worker 
138*e5436536SAndroid Build Coastguard Worker     int bufferSize, flag;
139*e5436536SAndroid Build Coastguard Worker     long pts;
140*e5436536SAndroid Build Coastguard Worker 
141*e5436536SAndroid Build Coastguard Worker     while (fscanf(infoFilePtr, "%d %d %ld", &bufferSize, &flag, &pts) == 3) {
142*e5436536SAndroid Build Coastguard Worker         std::vector<uint8_t> buffer(bufferSize);
143*e5436536SAndroid Build Coastguard Worker         size_t bytesRead = fread(buffer.data(), 1, bufferSize, bitStreamFilePtr);
144*e5436536SAndroid Build Coastguard Worker         if (bytesRead != bufferSize) {
145*e5436536SAndroid Build Coastguard Worker             ALOGE("Failed to read input data");
146*e5436536SAndroid Build Coastguard Worker             return std::vector<std::pair<std::vector<uint8_t>, int>>();
147*e5436536SAndroid Build Coastguard Worker         }
148*e5436536SAndroid Build Coastguard Worker         inputBuffers.emplace_back(std::move(buffer), flag);
149*e5436536SAndroid Build Coastguard Worker     }
150*e5436536SAndroid Build Coastguard Worker 
151*e5436536SAndroid Build Coastguard Worker     fclose(bitStreamFilePtr);
152*e5436536SAndroid Build Coastguard Worker     fclose(infoFilePtr);
153*e5436536SAndroid Build Coastguard Worker     return inputBuffers;
154*e5436536SAndroid Build Coastguard Worker }
155*e5436536SAndroid Build Coastguard Worker 
BM_DecodeAAC(benchmark::State & state,const std::string & inpFolderPath,const std::string & bitstreamFile,const std::string & infoFile)156*e5436536SAndroid Build Coastguard Worker static void BM_DecodeAAC(benchmark::State& state, const std::string& inpFolderPath,
157*e5436536SAndroid Build Coastguard Worker                          const std::string& bitstreamFile, const std::string& infoFile) {
158*e5436536SAndroid Build Coastguard Worker     auto inputBuffers = readInputFiles(inpFolderPath, bitstreamFile, infoFile);
159*e5436536SAndroid Build Coastguard Worker     if(inputBuffers.empty()) {
160*e5436536SAndroid Build Coastguard Worker         state.SkipWithError("Failed to read input data completely");
161*e5436536SAndroid Build Coastguard Worker     }
162*e5436536SAndroid Build Coastguard Worker     AACDecoder decoder;
163*e5436536SAndroid Build Coastguard Worker 
164*e5436536SAndroid Build Coastguard Worker     if (!decoder.initialize()) {
165*e5436536SAndroid Build Coastguard Worker         state.SkipWithError("Unable to initialize decoder");
166*e5436536SAndroid Build Coastguard Worker     }
167*e5436536SAndroid Build Coastguard Worker 
168*e5436536SAndroid Build Coastguard Worker     for (auto _ : state) {
169*e5436536SAndroid Build Coastguard Worker         if(!decoder.decode(inputBuffers)) {
170*e5436536SAndroid Build Coastguard Worker             state.SkipWithError("Unable to decode the Stream");
171*e5436536SAndroid Build Coastguard Worker         }
172*e5436536SAndroid Build Coastguard Worker     }
173*e5436536SAndroid Build Coastguard Worker 
174*e5436536SAndroid Build Coastguard Worker     state.SetLabel(bitstreamFile + ", " + std::to_string(decoder.getChannels()) + ", "
175*e5436536SAndroid Build Coastguard Worker                    + std::to_string(decoder.getSampleRate()) + ", "
176*e5436536SAndroid Build Coastguard Worker                    + std::to_string(decoder.getFrameSize()));
177*e5436536SAndroid Build Coastguard Worker }
178*e5436536SAndroid Build Coastguard Worker 
179*e5436536SAndroid Build Coastguard Worker // Function to register benchmarks
RegisterBenchmarks(const std::string & folderPath)180*e5436536SAndroid Build Coastguard Worker void RegisterBenchmarks(const std::string& folderPath) {
181*e5436536SAndroid Build Coastguard Worker     benchmark::RegisterBenchmark("BM_DecodeAAC/bbb_1ch_8kHz_64kbps_lc", BM_DecodeAAC,
182*e5436536SAndroid Build Coastguard Worker                                  folderPath, "bbb_1ch_8kHz_64kbps_lc.bin",
183*e5436536SAndroid Build Coastguard Worker                                  "bbb_1ch_8kHz_64kbps_lc.info");
184*e5436536SAndroid Build Coastguard Worker     benchmark::RegisterBenchmark("BM_DecodeAAC/bbb_1ch_48kHz_128kbps_lc", BM_DecodeAAC,
185*e5436536SAndroid Build Coastguard Worker                                  folderPath, "bbb_1ch_48kHz_128kbps_lc.bin",
186*e5436536SAndroid Build Coastguard Worker                                  "bbb_1ch_48kHz_128kbps_lc.info");
187*e5436536SAndroid Build Coastguard Worker     benchmark::RegisterBenchmark("BM_DecodeAAC/bbb_2ch_8kHz_64kbps_lc", BM_DecodeAAC,
188*e5436536SAndroid Build Coastguard Worker                                  folderPath, "bbb_2ch_8kHz_64kbps_lc.bin",
189*e5436536SAndroid Build Coastguard Worker                                  "bbb_2ch_8kHz_64kbps_lc.info");
190*e5436536SAndroid Build Coastguard Worker     benchmark::RegisterBenchmark("BM_DecodeAAC/bbb_2ch_48kHz_128kbps_lc", BM_DecodeAAC,
191*e5436536SAndroid Build Coastguard Worker                                  folderPath, "bbb_2ch_48kHz_128kbps_lc.bin",
192*e5436536SAndroid Build Coastguard Worker                                  "bbb_2ch_48kHz_128kbps_lc.info");
193*e5436536SAndroid Build Coastguard Worker     benchmark::RegisterBenchmark("BM_DecodeAAC/bbb_6ch_8kHz_64kbps_lc", BM_DecodeAAC,
194*e5436536SAndroid Build Coastguard Worker                                  folderPath, "bbb_6ch_8kHz_64kbps_lc.bin",
195*e5436536SAndroid Build Coastguard Worker                                  "bbb_6ch_8kHz_64kbps_lc.info");
196*e5436536SAndroid Build Coastguard Worker     benchmark::RegisterBenchmark("BM_DecodeAAC/bbb_6ch_48kHz_128kbps_lc", BM_DecodeAAC,
197*e5436536SAndroid Build Coastguard Worker                                  folderPath, "bbb_6ch_48kHz_128kbps_lc.bin",
198*e5436536SAndroid Build Coastguard Worker                                  "bbb_6ch_48kHz_128kbps_lc.info");
199*e5436536SAndroid Build Coastguard Worker     benchmark::RegisterBenchmark("BM_DecodeAAC/bbb_1ch_16kHz_64kbps_he", BM_DecodeAAC,
200*e5436536SAndroid Build Coastguard Worker                                  folderPath, "bbb_1ch_16kHz_64kbps_he.bin",
201*e5436536SAndroid Build Coastguard Worker                                  "bbb_1ch_16kHz_64kbps_he.info");
202*e5436536SAndroid Build Coastguard Worker     benchmark::RegisterBenchmark("BM_DecodeAAC/bbb_1ch_48kHz_128kbps_he", BM_DecodeAAC,
203*e5436536SAndroid Build Coastguard Worker                                  folderPath, "bbb_1ch_48kHz_128kbps_he.bin",
204*e5436536SAndroid Build Coastguard Worker                                  "bbb_1ch_48kHz_128kbps_he.info");
205*e5436536SAndroid Build Coastguard Worker     benchmark::RegisterBenchmark("BM_DecodeAAC/bbb_2ch_16kHz_64kbps_he", BM_DecodeAAC,
206*e5436536SAndroid Build Coastguard Worker                                  folderPath, "bbb_2ch_16kHz_64kbps_he.bin",
207*e5436536SAndroid Build Coastguard Worker                                  "bbb_2ch_16kHz_64kbps_he.info");
208*e5436536SAndroid Build Coastguard Worker     benchmark::RegisterBenchmark("BM_DecodeAAC/bbb_2ch_48kHz_128kbps_he", BM_DecodeAAC,
209*e5436536SAndroid Build Coastguard Worker                                  folderPath, "bbb_2ch_48kHz_128kbps_he.bin",
210*e5436536SAndroid Build Coastguard Worker                                  "bbb_2ch_48kHz_128kbps_he.info");
211*e5436536SAndroid Build Coastguard Worker     benchmark::RegisterBenchmark("BM_DecodeAAC/bbb_2ch_16kHz_64kbps_hev2", BM_DecodeAAC,
212*e5436536SAndroid Build Coastguard Worker                                  folderPath, "bbb_2ch_16kHz_64kbps_hev2.bin",
213*e5436536SAndroid Build Coastguard Worker                                  "bbb_2ch_16kHz_64kbps_hev2.info");
214*e5436536SAndroid Build Coastguard Worker     benchmark::RegisterBenchmark("BM_DecodeAAC/bbb_2ch_48kHz_128kbps_hev2", BM_DecodeAAC,
215*e5436536SAndroid Build Coastguard Worker                                  folderPath, "bbb_2ch_48kHz_128kbps_hev2.bin",
216*e5436536SAndroid Build Coastguard Worker                                  "bbb_2ch_48kHz_128kbps_hev2.info");
217*e5436536SAndroid Build Coastguard Worker     benchmark::RegisterBenchmark("BM_DecodeAAC/bbb_1ch_48kHz_128kbps_ld", BM_DecodeAAC,
218*e5436536SAndroid Build Coastguard Worker                                  folderPath, "bbb_1ch_48kHz_128kbps_ld.bin",
219*e5436536SAndroid Build Coastguard Worker                                  "bbb_1ch_48kHz_128kbps_ld.info");
220*e5436536SAndroid Build Coastguard Worker     benchmark::RegisterBenchmark("BM_DecodeAAC/bbb_2ch_48kHz_128kbps_ld", BM_DecodeAAC,
221*e5436536SAndroid Build Coastguard Worker                                  folderPath, "bbb_2ch_48kHz_128kbps_ld.bin",
222*e5436536SAndroid Build Coastguard Worker                                  "bbb_2ch_48kHz_128kbps_ld.info");
223*e5436536SAndroid Build Coastguard Worker     benchmark::RegisterBenchmark("BM_DecodeAAC/bbb_6ch_48kHz_128kbps_ld", BM_DecodeAAC,
224*e5436536SAndroid Build Coastguard Worker                                  folderPath, "bbb_6ch_48kHz_128kbps_ld.bin",
225*e5436536SAndroid Build Coastguard Worker                                  "bbb_6ch_48kHz_128kbps_ld.info");
226*e5436536SAndroid Build Coastguard Worker     benchmark::RegisterBenchmark("BM_DecodeAAC/bbb_1ch_16kHz_64kbps_eld", BM_DecodeAAC,
227*e5436536SAndroid Build Coastguard Worker                                  folderPath, "bbb_1ch_16kHz_64kbps_eld.bin",
228*e5436536SAndroid Build Coastguard Worker                                  "bbb_1ch_16kHz_64kbps_eld.info");
229*e5436536SAndroid Build Coastguard Worker     benchmark::RegisterBenchmark("BM_DecodeAAC/bbb_1ch_48kHz_128kbps_eld", BM_DecodeAAC,
230*e5436536SAndroid Build Coastguard Worker                                  folderPath, "bbb_1ch_48kHz_128kbps_eld.bin",
231*e5436536SAndroid Build Coastguard Worker                                  "bbb_1ch_48kHz_128kbps_eld.info");
232*e5436536SAndroid Build Coastguard Worker     benchmark::RegisterBenchmark("BM_DecodeAAC/bbb_2ch_16kHz_64kbps_eld", BM_DecodeAAC,
233*e5436536SAndroid Build Coastguard Worker                                  folderPath, "bbb_2ch_16kHz_64kbps_eld.bin",
234*e5436536SAndroid Build Coastguard Worker                                  "bbb_2ch_16kHz_64kbps_eld.info");
235*e5436536SAndroid Build Coastguard Worker     benchmark::RegisterBenchmark("BM_DecodeAAC/bbb_2ch_48kHz_128kbps_eld", BM_DecodeAAC,
236*e5436536SAndroid Build Coastguard Worker                                  folderPath, "bbb_2ch_48kHz_128kbps_eld.bin",
237*e5436536SAndroid Build Coastguard Worker                                  "bbb_2ch_48kHz_128kbps_eld.info");
238*e5436536SAndroid Build Coastguard Worker     benchmark::RegisterBenchmark("BM_DecodeAAC/bbb_6ch_16kHz_64kbps_eld", BM_DecodeAAC,
239*e5436536SAndroid Build Coastguard Worker                                  folderPath, "bbb_6ch_16kHz_64kbps_eld.bin",
240*e5436536SAndroid Build Coastguard Worker                                  "bbb_6ch_16kHz_64kbps_eld.info");
241*e5436536SAndroid Build Coastguard Worker     benchmark::RegisterBenchmark("BM_DecodeAAC/bbb_6ch_48kHz_128kbps_eld", BM_DecodeAAC,
242*e5436536SAndroid Build Coastguard Worker                                  folderPath, "bbb_6ch_48kHz_128kbps_eld.bin",
243*e5436536SAndroid Build Coastguard Worker                                  "bbb_6ch_48kHz_128kbps_eld.info");
244*e5436536SAndroid Build Coastguard Worker }
245*e5436536SAndroid Build Coastguard Worker 
246*e5436536SAndroid Build Coastguard Worker class CustomCsvReporter : public benchmark::BenchmarkReporter {
247*e5436536SAndroid Build Coastguard Worker    public:
CustomCsvReporter()248*e5436536SAndroid Build Coastguard Worker     CustomCsvReporter() : mPrintedHeader(false) {}
249*e5436536SAndroid Build Coastguard Worker     virtual bool ReportContext(const Context& context);
250*e5436536SAndroid Build Coastguard Worker     virtual void ReportRuns(const std::vector<Run>& reports);
251*e5436536SAndroid Build Coastguard Worker 
252*e5436536SAndroid Build Coastguard Worker    private:
253*e5436536SAndroid Build Coastguard Worker     void PrintRunData(const Run& report);
254*e5436536SAndroid Build Coastguard Worker     bool mPrintedHeader;
255*e5436536SAndroid Build Coastguard Worker     std::vector<std::string> mHeaders = {"File",      "Channels",      "SampleRate",
256*e5436536SAndroid Build Coastguard Worker                                          "FrameSize", "real_time(ns)", "cpu_time(ns)"};
257*e5436536SAndroid Build Coastguard Worker };
258*e5436536SAndroid Build Coastguard Worker 
ReportContext(const Context & context)259*e5436536SAndroid Build Coastguard Worker bool CustomCsvReporter::ReportContext(const Context& context /* __unused */) { return true; }
260*e5436536SAndroid Build Coastguard Worker 
ReportRuns(const std::vector<Run> & reports)261*e5436536SAndroid Build Coastguard Worker void CustomCsvReporter::ReportRuns(const std::vector<Run>& reports) {
262*e5436536SAndroid Build Coastguard Worker     std::ostream& Out = GetOutputStream();
263*e5436536SAndroid Build Coastguard Worker 
264*e5436536SAndroid Build Coastguard Worker     if (!mPrintedHeader) {
265*e5436536SAndroid Build Coastguard Worker         // print the header
266*e5436536SAndroid Build Coastguard Worker         for (auto header = mHeaders.begin(); header != mHeaders.end();) {
267*e5436536SAndroid Build Coastguard Worker             Out << *header++;
268*e5436536SAndroid Build Coastguard Worker             if (header != mHeaders.end()) Out << ",";
269*e5436536SAndroid Build Coastguard Worker         }
270*e5436536SAndroid Build Coastguard Worker         Out << "\n";
271*e5436536SAndroid Build Coastguard Worker         mPrintedHeader = true;
272*e5436536SAndroid Build Coastguard Worker     }
273*e5436536SAndroid Build Coastguard Worker 
274*e5436536SAndroid Build Coastguard Worker     // print results for each run
275*e5436536SAndroid Build Coastguard Worker     for (const auto& run : reports) {
276*e5436536SAndroid Build Coastguard Worker         PrintRunData(run);
277*e5436536SAndroid Build Coastguard Worker     }
278*e5436536SAndroid Build Coastguard Worker }
279*e5436536SAndroid Build Coastguard Worker 
PrintRunData(const Run & run)280*e5436536SAndroid Build Coastguard Worker void CustomCsvReporter::PrintRunData(const Run& run) {
281*e5436536SAndroid Build Coastguard Worker     if (run.skipped) {
282*e5436536SAndroid Build Coastguard Worker         return;
283*e5436536SAndroid Build Coastguard Worker     }
284*e5436536SAndroid Build Coastguard Worker     std::ostream& Out = GetOutputStream();
285*e5436536SAndroid Build Coastguard Worker     Out << run.report_label << ",";
286*e5436536SAndroid Build Coastguard Worker     Out << run.GetAdjustedRealTime() << ",";
287*e5436536SAndroid Build Coastguard Worker     Out << run.GetAdjustedCPUTime() << ",";
288*e5436536SAndroid Build Coastguard Worker     Out << '\n';
289*e5436536SAndroid Build Coastguard Worker }
290*e5436536SAndroid Build Coastguard Worker 
main(int argc,char ** argv)291*e5436536SAndroid Build Coastguard Worker int main(int argc, char** argv) {
292*e5436536SAndroid Build Coastguard Worker     std::unique_ptr<benchmark::BenchmarkReporter> csvReporter;
293*e5436536SAndroid Build Coastguard Worker     std::string pathArg, inpFolderPath;
294*e5436536SAndroid Build Coastguard Worker 
295*e5436536SAndroid Build Coastguard Worker     for (int i = 1; i < argc; ++i) {
296*e5436536SAndroid Build Coastguard Worker         // pass --path=/path/to/resourcefolder in command line while running without atest
297*e5436536SAndroid Build Coastguard Worker         // to specify where resources are present
298*e5436536SAndroid Build Coastguard Worker         if (std::string(argv[i]).find("--path") != std::string ::npos) {
299*e5436536SAndroid Build Coastguard Worker             pathArg = argv[i];
300*e5436536SAndroid Build Coastguard Worker             auto separator = pathArg.find('=');
301*e5436536SAndroid Build Coastguard Worker             if (separator != std::string::npos) {
302*e5436536SAndroid Build Coastguard Worker                 inpFolderPath = pathArg.substr(separator + 1);
303*e5436536SAndroid Build Coastguard Worker             }
304*e5436536SAndroid Build Coastguard Worker         }
305*e5436536SAndroid Build Coastguard Worker         // pass --benchmark_out=/path/to/.csv in command line to generate csv report
306*e5436536SAndroid Build Coastguard Worker         if (std::string(argv[i]).find("--benchmark_out") != std::string::npos) {
307*e5436536SAndroid Build Coastguard Worker             csvReporter.reset(new CustomCsvReporter);
308*e5436536SAndroid Build Coastguard Worker             break;
309*e5436536SAndroid Build Coastguard Worker         }
310*e5436536SAndroid Build Coastguard Worker     }
311*e5436536SAndroid Build Coastguard Worker 
312*e5436536SAndroid Build Coastguard Worker     if (inpFolderPath.empty()) {
313*e5436536SAndroid Build Coastguard Worker         inpFolderPath = "/sdcard/test/AacDecBenchmark-1.0";
314*e5436536SAndroid Build Coastguard Worker     }
315*e5436536SAndroid Build Coastguard Worker     RegisterBenchmarks(inpFolderPath);
316*e5436536SAndroid Build Coastguard Worker     benchmark::Initialize(&argc, argv);
317*e5436536SAndroid Build Coastguard Worker     benchmark::RunSpecifiedBenchmarks(nullptr, csvReporter.get());
318*e5436536SAndroid Build Coastguard Worker     benchmark::Shutdown();
319*e5436536SAndroid Build Coastguard Worker     return 0;
320*e5436536SAndroid Build Coastguard Worker }
321