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