blob: 242178f020ca61c603e41498448abf78e2ffd0ef [file] [log] [blame]
Manisha Jajoo90f569a2019-09-06 17:24:22 +05301/*
2 * Copyright (C) 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17//#define LOG_NDEBUG 0
18#define LOG_TAG "decoderTest"
19
20#include <fstream>
21#include <iostream>
22#include <limits>
23
24#include "Decoder.h"
25#include "BenchmarkTestEnvironment.h"
26
27static BenchmarkTestEnvironment *gEnv = nullptr;
28
29class DecoderTest : public ::testing::TestWithParam<tuple<string, string, bool>> {};
30
31TEST_P(DecoderTest, Decode) {
32 ALOGV("Decode the samples given by extractor");
33 tuple<string /* InputFile */, string /* CodecName */, bool /* asyncMode */> params = GetParam();
34
35 string inputFile = gEnv->getRes() + get<0>(params);
36 FILE *inputFp = fopen(inputFile.c_str(), "rb");
37 if (!inputFp) {
38 cout << "[ WARN ] Test Skipped. Unable to open input file for reading \n";
39 return;
40 }
41
42 Decoder *decoder = new Decoder();
43 Extractor *extractor = decoder->getExtractor();
44 if (!extractor) {
45 cout << "[ WARN ] Test Skipped. Extractor creation failed \n";
46 return;
47 }
48
49 // Read file properties
50 fseek(inputFp, 0, SEEK_END);
51 size_t fileSize = ftell(inputFp);
52 fseek(inputFp, 0, SEEK_SET);
53 int32_t fd = fileno(inputFp);
54
55 int32_t trackCount = extractor->initExtractor(fd, fileSize);
56 if (trackCount <= 0) {
57 cout << "[ WARN ] Test Skipped. initExtractor failed\n";
58 return;
59 }
60 for (int curTrack = 0; curTrack < trackCount; curTrack++) {
61 int32_t status = extractor->setupTrackFormat(curTrack);
62 if (status != 0) {
63 cout << "[ WARN ] Test Skipped. Track Format invalid \n";
64 return;
65 }
66
67 uint8_t *inputBuffer = (uint8_t *)malloc(kMaxBufferSize);
68 if (!inputBuffer) {
69 cout << "[ WARN ] Test Skipped. Insufficient memory \n";
70 return;
71 }
72 vector<AMediaCodecBufferInfo> frameInfo;
73 AMediaCodecBufferInfo info;
74 uint32_t inputBufferOffset = 0;
Manisha Jajoo90f569a2019-09-06 17:24:22 +053075
Manisha Jajoo90f569a2019-09-06 17:24:22 +053076 // Get frame data
77 while (1) {
78 status = extractor->getFrameSample(info);
79 if (status || !info.size) break;
80 // copy the meta data and buffer to be passed to decoder
81 if (inputBufferOffset + info.size > kMaxBufferSize) {
82 cout << "[ WARN ] Test Skipped. Memory allocated not sufficient\n";
83 free(inputBuffer);
84 return;
85 }
86 memcpy(inputBuffer + inputBufferOffset, extractor->getFrameBuf(), info.size);
87 frameInfo.push_back(info);
88 inputBufferOffset += info.size;
89 }
90
91 string codecName = get<1>(params);
92 bool asyncMode = get<2>(params);
93 decoder->setupDecoder();
94 status = decoder->decode(inputBuffer, frameInfo, codecName, asyncMode);
95 if (status != AMEDIA_OK) {
96 cout << "[ WARN ] Test Skipped. Decode returned error \n";
97 free(inputBuffer);
98 return;
99 }
100 decoder->deInitCodec();
101 cout << "codec : " << codecName << endl;
102 string inputReference = get<0>(params);
103 decoder->dumpStatistics(inputReference);
104 free(inputBuffer);
105 decoder->resetDecoder();
106 }
107 fclose(inputFp);
108 extractor->deInitExtractor();
109 delete decoder;
110}
111
112// TODO: (b/140549596)
113// Add wav files
114INSTANTIATE_TEST_SUITE_P(
115 AudioDecoderSyncTest, DecoderTest,
116 ::testing::Values(make_tuple("bbb_44100hz_2ch_128kbps_aac_30sec.mp4", "", false),
117 make_tuple("bbb_44100hz_2ch_128kbps_mp3_30sec.mp3", "", false),
118 make_tuple("bbb_8000hz_1ch_8kbps_amrnb_30sec.3gp", "", false),
119 make_tuple("bbb_16000hz_1ch_9kbps_amrwb_30sec.3gp", "", false),
120 make_tuple("bbb_44100hz_2ch_80kbps_vorbis_30sec.mp4", "", false),
Manisha Jajooca8de042019-09-16 18:58:42 +0530121 make_tuple("bbb_44100hz_2ch_600kbps_flac_30sec.mp4", "", false),
Manisha Jajoo90f569a2019-09-06 17:24:22 +0530122 make_tuple("bbb_48000hz_2ch_100kbps_opus_30sec.webm", "", false)));
123
124INSTANTIATE_TEST_SUITE_P(
125 AudioDecoderAsyncTest, DecoderTest,
126 ::testing::Values(make_tuple("bbb_44100hz_2ch_128kbps_aac_30sec.mp4", "", true),
127 make_tuple("bbb_44100hz_2ch_128kbps_mp3_30sec.mp3", "", true),
128 make_tuple("bbb_8000hz_1ch_8kbps_amrnb_30sec.3gp", "", true),
129 make_tuple("bbb_16000hz_1ch_9kbps_amrwb_30sec.3gp", "", true),
130 make_tuple("bbb_44100hz_2ch_80kbps_vorbis_30sec.mp4", "", true),
Manisha Jajooca8de042019-09-16 18:58:42 +0530131 make_tuple("bbb_44100hz_2ch_600kbps_flac_30sec.mp4", "", true),
Manisha Jajoo90f569a2019-09-06 17:24:22 +0530132 make_tuple("bbb_48000hz_2ch_100kbps_opus_30sec.webm", "", true)));
133
134INSTANTIATE_TEST_SUITE_P(VideDecoderSyncTest, DecoderTest,
135 ::testing::Values(
136 // Hardware codecs
137 make_tuple("crowd_1920x1080_25fps_4000kbps_vp9.webm", "", false),
138 make_tuple("crowd_1920x1080_25fps_4000kbps_vp8.webm", "", false),
139 make_tuple("crowd_1920x1080_25fps_4000kbps_av1.webm", "", false),
140 make_tuple("crowd_1920x1080_25fps_7300kbps_mpeg2.mp4", "", false),
141 make_tuple("crowd_1920x1080_25fps_6000kbps_mpeg4.mp4", "", false),
142 make_tuple("crowd_352x288_25fps_6000kbps_h263.3gp", "", false),
143 make_tuple("crowd_1920x1080_25fps_6700kbps_h264.ts", "", false),
144 make_tuple("crowd_1920x1080_25fps_4000kbps_h265.mkv", "", false),
145 // Software codecs
146 make_tuple("crowd_1920x1080_25fps_4000kbps_vp9.webm",
147 "c2.android.vp9.decoder", false),
148 make_tuple("crowd_1920x1080_25fps_4000kbps_vp8.webm",
149 "c2.android.vp8.decoder", false),
150 make_tuple("crowd_1920x1080_25fps_4000kbps_av1.webm",
151 "c2.android.av1.decoder", false),
152 make_tuple("crowd_1920x1080_25fps_7300kbps_mpeg2.mp4",
153 "c2.android.mpeg2.decoder", false),
154 make_tuple("crowd_1920x1080_25fps_6000kbps_mpeg4.mp4",
155 "c2.android.mpeg4.decoder", false),
156 make_tuple("crowd_352x288_25fps_6000kbps_h263.3gp",
157 "c2.android.h263.decoder", false),
158 make_tuple("crowd_1920x1080_25fps_6700kbps_h264.ts",
159 "c2.android.avc.decoder", false),
160 make_tuple("crowd_1920x1080_25fps_4000kbps_h265.mkv",
161 "c2.android.hevc.decoder", false)));
162
163INSTANTIATE_TEST_SUITE_P(VideoDecoderAsyncTest, DecoderTest,
164 ::testing::Values(
165 // Hardware codecs
166 make_tuple("crowd_1920x1080_25fps_4000kbps_vp9.webm", "", true),
167 make_tuple("crowd_1920x1080_25fps_4000kbps_vp8.webm", "", true),
168 make_tuple("crowd_1920x1080_25fps_4000kbps_av1.webm", "", true),
169 make_tuple("crowd_1920x1080_25fps_7300kbps_mpeg2.mp4", "", true),
170 make_tuple("crowd_1920x1080_25fps_6000kbps_mpeg4.mp4", "", true),
171 make_tuple("crowd_352x288_25fps_6000kbps_h263.3gp", "", true),
172 make_tuple("crowd_1920x1080_25fps_6700kbps_h264.ts", "", true),
173 make_tuple("crowd_1920x1080_25fps_4000kbps_h265.mkv", "", true),
174 // Software codecs
175 make_tuple("crowd_1920x1080_25fps_4000kbps_vp9.webm",
176 "c2.android.vp9.decoder", true),
177 make_tuple("crowd_1920x1080_25fps_4000kbps_vp8.webm",
178 "c2.android.vp8.decoder", true),
179 make_tuple("crowd_1920x1080_25fps_4000kbps_av1.webm",
180 "c2.android.av1.decoder", true),
181 make_tuple("crowd_1920x1080_25fps_7300kbps_mpeg2.mp4",
182 "c2.android.mpeg2.decoder", true),
183 make_tuple("crowd_1920x1080_25fps_6000kbps_mpeg4.mp4",
184 "c2.android.mpeg4.decoder", true),
185 make_tuple("crowd_352x288_25fps_6000kbps_h263.3gp",
186 "c2.android.h263.decoder", true),
187 make_tuple("crowd_1920x1080_25fps_6700kbps_h264.ts",
188 "c2.android.avc.decoder", true),
189 make_tuple("crowd_1920x1080_25fps_4000kbps_h265.mkv",
190 "c2.android.hevc.decoder", true)));
191
192int main(int argc, char **argv) {
193 gEnv = new BenchmarkTestEnvironment();
194 ::testing::AddGlobalTestEnvironment(gEnv);
195 ::testing::InitGoogleTest(&argc, argv);
196 int status = gEnv->initFromOptions(argc, argv);
197 if (status == 0) {
198 status = RUN_ALL_TESTS();
199 ALOGD("Decoder Test result = %d\n", status);
200 }
201 return status;
202}