1*b7c941bbSAndroid Build Coastguard Worker /*
2*b7c941bbSAndroid Build Coastguard Worker * Copyright (C) 2019 The Android Open Source Project
3*b7c941bbSAndroid Build Coastguard Worker *
4*b7c941bbSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*b7c941bbSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*b7c941bbSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*b7c941bbSAndroid Build Coastguard Worker *
8*b7c941bbSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*b7c941bbSAndroid Build Coastguard Worker *
10*b7c941bbSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*b7c941bbSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*b7c941bbSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*b7c941bbSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*b7c941bbSAndroid Build Coastguard Worker * limitations under the License.
15*b7c941bbSAndroid Build Coastguard Worker */
16*b7c941bbSAndroid Build Coastguard Worker
17*b7c941bbSAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
18*b7c941bbSAndroid Build Coastguard Worker #define LOG_TAG "NativeExtractorUnitTest"
19*b7c941bbSAndroid Build Coastguard Worker #include <log/log.h>
20*b7c941bbSAndroid Build Coastguard Worker
21*b7c941bbSAndroid Build Coastguard Worker #include <jni.h>
22*b7c941bbSAndroid Build Coastguard Worker #include <media/NdkMediaExtractor.h>
23*b7c941bbSAndroid Build Coastguard Worker #include <sys/stat.h>
24*b7c941bbSAndroid Build Coastguard Worker
25*b7c941bbSAndroid Build Coastguard Worker #include <cstdlib>
26*b7c941bbSAndroid Build Coastguard Worker #include <cstring>
27*b7c941bbSAndroid Build Coastguard Worker
setExtractorDataSource(AMediaExtractor * extractor,FILE * fp)28*b7c941bbSAndroid Build Coastguard Worker static media_status_t setExtractorDataSource(AMediaExtractor* extractor, FILE* fp) {
29*b7c941bbSAndroid Build Coastguard Worker media_status_t status = AMEDIA_ERROR_BASE;
30*b7c941bbSAndroid Build Coastguard Worker struct stat buf {};
31*b7c941bbSAndroid Build Coastguard Worker if (fp && !fstat(fileno(fp), &buf))
32*b7c941bbSAndroid Build Coastguard Worker status = AMediaExtractor_setDataSourceFd(extractor, fileno(fp), 0, buf.st_size);
33*b7c941bbSAndroid Build Coastguard Worker if (status != AMEDIA_OK) ALOGE("error: AMediaExtractor_setDataSourceFd failed %d", status);
34*b7c941bbSAndroid Build Coastguard Worker return status;
35*b7c941bbSAndroid Build Coastguard Worker }
36*b7c941bbSAndroid Build Coastguard Worker
nativeTestGetTrackCountBeforeSetDataSource(JNIEnv *,jobject)37*b7c941bbSAndroid Build Coastguard Worker static jboolean nativeTestGetTrackCountBeforeSetDataSource(JNIEnv*, jobject) {
38*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor* extractor = AMediaExtractor_new();
39*b7c941bbSAndroid Build Coastguard Worker bool isPass = (0 == AMediaExtractor_getTrackCount(extractor));
40*b7c941bbSAndroid Build Coastguard Worker if (!isPass) ALOGE("error: received valid trackCount before setDataSource");
41*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_delete(extractor);
42*b7c941bbSAndroid Build Coastguard Worker return static_cast<jboolean>(isPass);
43*b7c941bbSAndroid Build Coastguard Worker }
44*b7c941bbSAndroid Build Coastguard Worker
nativeTestSelectTrackBeforeSetDataSource(JNIEnv *,jobject)45*b7c941bbSAndroid Build Coastguard Worker static jboolean nativeTestSelectTrackBeforeSetDataSource(JNIEnv*, jobject) {
46*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor* extractor = AMediaExtractor_new();
47*b7c941bbSAndroid Build Coastguard Worker bool isPass = (AMEDIA_OK != AMediaExtractor_selectTrack(extractor, 0));
48*b7c941bbSAndroid Build Coastguard Worker if (!isPass) ALOGE("error: selectTrack succeeds before setDataSource");
49*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_delete(extractor);
50*b7c941bbSAndroid Build Coastguard Worker return static_cast<jboolean>(isPass);
51*b7c941bbSAndroid Build Coastguard Worker }
52*b7c941bbSAndroid Build Coastguard Worker
nativeTestSelectTrackForInvalidIndex(JNIEnv * env,jobject,jstring jsrcPath)53*b7c941bbSAndroid Build Coastguard Worker static jboolean nativeTestSelectTrackForInvalidIndex(JNIEnv* env, jobject, jstring jsrcPath) {
54*b7c941bbSAndroid Build Coastguard Worker bool isPass = false;
55*b7c941bbSAndroid Build Coastguard Worker const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr);
56*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor* extractor = AMediaExtractor_new();
57*b7c941bbSAndroid Build Coastguard Worker FILE* srcFp = fopen(csrcPath, "rbe");
58*b7c941bbSAndroid Build Coastguard Worker if (AMEDIA_OK == setExtractorDataSource(extractor, srcFp)) {
59*b7c941bbSAndroid Build Coastguard Worker if (AMEDIA_OK !=
60*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_selectTrack(extractor, AMediaExtractor_getTrackCount(extractor))) {
61*b7c941bbSAndroid Build Coastguard Worker isPass = true;
62*b7c941bbSAndroid Build Coastguard Worker } else {
63*b7c941bbSAndroid Build Coastguard Worker ALOGE("error: selectTrack succeeds for out of bounds track index: %zu",
64*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_getTrackCount(extractor));
65*b7c941bbSAndroid Build Coastguard Worker }
66*b7c941bbSAndroid Build Coastguard Worker }
67*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_delete(extractor);
68*b7c941bbSAndroid Build Coastguard Worker if (srcFp) fclose(srcFp);
69*b7c941bbSAndroid Build Coastguard Worker env->ReleaseStringUTFChars(jsrcPath, csrcPath);
70*b7c941bbSAndroid Build Coastguard Worker return static_cast<jboolean>(isPass);
71*b7c941bbSAndroid Build Coastguard Worker }
72*b7c941bbSAndroid Build Coastguard Worker
nativeTestIdempotentSelectTrack(JNIEnv * env,jobject,jstring jsrcPath)73*b7c941bbSAndroid Build Coastguard Worker static jboolean nativeTestIdempotentSelectTrack(JNIEnv* env, jobject, jstring jsrcPath) {
74*b7c941bbSAndroid Build Coastguard Worker bool isPass = false;
75*b7c941bbSAndroid Build Coastguard Worker const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr);
76*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor* extractor = AMediaExtractor_new();
77*b7c941bbSAndroid Build Coastguard Worker FILE* srcFp = fopen(csrcPath, "rbe");
78*b7c941bbSAndroid Build Coastguard Worker if (AMEDIA_OK == setExtractorDataSource(extractor, srcFp)) {
79*b7c941bbSAndroid Build Coastguard Worker isPass = AMediaExtractor_selectTrack(extractor, 0) == AMEDIA_OK;
80*b7c941bbSAndroid Build Coastguard Worker isPass &= AMediaExtractor_selectTrack(extractor, 0) == AMEDIA_OK;
81*b7c941bbSAndroid Build Coastguard Worker if (!isPass) ALOGE("error: multiple selection of same track has failed");
82*b7c941bbSAndroid Build Coastguard Worker }
83*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_delete(extractor);
84*b7c941bbSAndroid Build Coastguard Worker if (srcFp) fclose(srcFp);
85*b7c941bbSAndroid Build Coastguard Worker env->ReleaseStringUTFChars(jsrcPath, csrcPath);
86*b7c941bbSAndroid Build Coastguard Worker return static_cast<jboolean>(isPass);
87*b7c941bbSAndroid Build Coastguard Worker }
88*b7c941bbSAndroid Build Coastguard Worker
nativeTestUnselectTrackBeforeSetDataSource(JNIEnv *,jobject)89*b7c941bbSAndroid Build Coastguard Worker static jboolean nativeTestUnselectTrackBeforeSetDataSource(JNIEnv*, jobject) {
90*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor* extractor = AMediaExtractor_new();
91*b7c941bbSAndroid Build Coastguard Worker bool isPass = (AMEDIA_OK != AMediaExtractor_unselectTrack(extractor, 0));
92*b7c941bbSAndroid Build Coastguard Worker if (!isPass) ALOGE("error: unselectTrack succeeds before setDataSource");
93*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_delete(extractor);
94*b7c941bbSAndroid Build Coastguard Worker return static_cast<jboolean>(isPass);
95*b7c941bbSAndroid Build Coastguard Worker }
96*b7c941bbSAndroid Build Coastguard Worker
nativeTestUnselectTrackForInvalidIndex(JNIEnv * env,jobject,jstring jsrcPath)97*b7c941bbSAndroid Build Coastguard Worker static jboolean nativeTestUnselectTrackForInvalidIndex(JNIEnv* env, jobject, jstring jsrcPath) {
98*b7c941bbSAndroid Build Coastguard Worker bool isPass = false;
99*b7c941bbSAndroid Build Coastguard Worker const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr);
100*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor* extractor = AMediaExtractor_new();
101*b7c941bbSAndroid Build Coastguard Worker FILE* srcFp = fopen(csrcPath, "rbe");
102*b7c941bbSAndroid Build Coastguard Worker if (AMEDIA_OK == setExtractorDataSource(extractor, srcFp)) {
103*b7c941bbSAndroid Build Coastguard Worker if (AMEDIA_OK !=
104*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_unselectTrack(extractor, AMediaExtractor_getTrackCount(extractor))) {
105*b7c941bbSAndroid Build Coastguard Worker isPass = true;
106*b7c941bbSAndroid Build Coastguard Worker } else {
107*b7c941bbSAndroid Build Coastguard Worker ALOGE("error: unselectTrack succeeds for out of bounds track index: %zu",
108*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_getTrackCount(extractor));
109*b7c941bbSAndroid Build Coastguard Worker }
110*b7c941bbSAndroid Build Coastguard Worker }
111*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_delete(extractor);
112*b7c941bbSAndroid Build Coastguard Worker if (srcFp) fclose(srcFp);
113*b7c941bbSAndroid Build Coastguard Worker env->ReleaseStringUTFChars(jsrcPath, csrcPath);
114*b7c941bbSAndroid Build Coastguard Worker return static_cast<jboolean>(isPass);
115*b7c941bbSAndroid Build Coastguard Worker }
116*b7c941bbSAndroid Build Coastguard Worker
nativeTestUnselectTrackForUnSelectedTrackIndex(JNIEnv * env,jobject,jstring jsrcPath)117*b7c941bbSAndroid Build Coastguard Worker static jboolean nativeTestUnselectTrackForUnSelectedTrackIndex(JNIEnv* env, jobject,
118*b7c941bbSAndroid Build Coastguard Worker jstring jsrcPath) {
119*b7c941bbSAndroid Build Coastguard Worker bool isPass = false;
120*b7c941bbSAndroid Build Coastguard Worker const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr);
121*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor* extractor = AMediaExtractor_new();
122*b7c941bbSAndroid Build Coastguard Worker FILE* srcFp = fopen(csrcPath, "rbe");
123*b7c941bbSAndroid Build Coastguard Worker if (AMEDIA_OK == setExtractorDataSource(extractor, srcFp)) {
124*b7c941bbSAndroid Build Coastguard Worker isPass = (AMediaExtractor_unselectTrack(extractor, 0) == AMEDIA_OK);
125*b7c941bbSAndroid Build Coastguard Worker if (!isPass) ALOGE("error: un-selection of non-selected track has failed");
126*b7c941bbSAndroid Build Coastguard Worker }
127*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_delete(extractor);
128*b7c941bbSAndroid Build Coastguard Worker if (srcFp) fclose(srcFp);
129*b7c941bbSAndroid Build Coastguard Worker env->ReleaseStringUTFChars(jsrcPath, csrcPath);
130*b7c941bbSAndroid Build Coastguard Worker return static_cast<jboolean>(isPass);
131*b7c941bbSAndroid Build Coastguard Worker }
132*b7c941bbSAndroid Build Coastguard Worker
nativeTestIdempotentUnselectTrack(JNIEnv * env,jobject,jstring jsrcPath)133*b7c941bbSAndroid Build Coastguard Worker static jboolean nativeTestIdempotentUnselectTrack(JNIEnv* env, jobject, jstring jsrcPath) {
134*b7c941bbSAndroid Build Coastguard Worker bool isPass = false;
135*b7c941bbSAndroid Build Coastguard Worker const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr);
136*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor* extractor = AMediaExtractor_new();
137*b7c941bbSAndroid Build Coastguard Worker FILE* srcFp = fopen(csrcPath, "rbe");
138*b7c941bbSAndroid Build Coastguard Worker if (AMEDIA_OK == setExtractorDataSource(extractor, srcFp)) {
139*b7c941bbSAndroid Build Coastguard Worker isPass = AMediaExtractor_selectTrack(extractor, 0) == AMEDIA_OK;
140*b7c941bbSAndroid Build Coastguard Worker if (isPass) {
141*b7c941bbSAndroid Build Coastguard Worker isPass = AMediaExtractor_unselectTrack(extractor, 0) == AMEDIA_OK;
142*b7c941bbSAndroid Build Coastguard Worker isPass &= AMediaExtractor_unselectTrack(extractor, 0) == AMEDIA_OK;
143*b7c941bbSAndroid Build Coastguard Worker if (!isPass) ALOGE("error: multiple unselection of selected track has failed");
144*b7c941bbSAndroid Build Coastguard Worker } else {
145*b7c941bbSAndroid Build Coastguard Worker ALOGE("error: selection of track 0 has failed for file %s", csrcPath);
146*b7c941bbSAndroid Build Coastguard Worker }
147*b7c941bbSAndroid Build Coastguard Worker }
148*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_delete(extractor);
149*b7c941bbSAndroid Build Coastguard Worker if (srcFp) fclose(srcFp);
150*b7c941bbSAndroid Build Coastguard Worker env->ReleaseStringUTFChars(jsrcPath, csrcPath);
151*b7c941bbSAndroid Build Coastguard Worker return static_cast<jboolean>(isPass);
152*b7c941bbSAndroid Build Coastguard Worker }
153*b7c941bbSAndroid Build Coastguard Worker
nativeTestSeekToBeforeSetDataSource(JNIEnv *,jobject)154*b7c941bbSAndroid Build Coastguard Worker static jboolean nativeTestSeekToBeforeSetDataSource(JNIEnv*, jobject) {
155*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor* extractor = AMediaExtractor_new();
156*b7c941bbSAndroid Build Coastguard Worker bool isPass = AMediaExtractor_seekTo(extractor, 0, AMEDIAEXTRACTOR_SEEK_NEXT_SYNC) != AMEDIA_OK;
157*b7c941bbSAndroid Build Coastguard Worker if (!isPass) ALOGE("error: seekTo() succeeds before setting data source");
158*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_delete(extractor);
159*b7c941bbSAndroid Build Coastguard Worker return static_cast<jboolean>(isPass);
160*b7c941bbSAndroid Build Coastguard Worker }
161*b7c941bbSAndroid Build Coastguard Worker
nativeTestSeekToBeforeSelectTrack(JNIEnv * env,jobject,jstring jsrcPath)162*b7c941bbSAndroid Build Coastguard Worker static jboolean nativeTestSeekToBeforeSelectTrack(JNIEnv* env, jobject, jstring jsrcPath) {
163*b7c941bbSAndroid Build Coastguard Worker bool isPass = false;
164*b7c941bbSAndroid Build Coastguard Worker const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr);
165*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor* extractor = AMediaExtractor_new();
166*b7c941bbSAndroid Build Coastguard Worker FILE* srcFp = fopen(csrcPath, "rbe");
167*b7c941bbSAndroid Build Coastguard Worker if (AMEDIA_OK == setExtractorDataSource(extractor, srcFp)) {
168*b7c941bbSAndroid Build Coastguard Worker isPass = AMediaExtractor_seekTo(extractor, 0, AMEDIAEXTRACTOR_SEEK_NEXT_SYNC) != AMEDIA_OK;
169*b7c941bbSAndroid Build Coastguard Worker if (!isPass) ALOGE("error: seekTo() succeeds before selecting track");
170*b7c941bbSAndroid Build Coastguard Worker }
171*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_delete(extractor);
172*b7c941bbSAndroid Build Coastguard Worker if (srcFp) fclose(srcFp);
173*b7c941bbSAndroid Build Coastguard Worker env->ReleaseStringUTFChars(jsrcPath, csrcPath);
174*b7c941bbSAndroid Build Coastguard Worker return static_cast<jboolean>(isPass);
175*b7c941bbSAndroid Build Coastguard Worker }
176*b7c941bbSAndroid Build Coastguard Worker
nativeTestGetCachedDurationBeforeSetDataSource(JNIEnv *,jobject)177*b7c941bbSAndroid Build Coastguard Worker static jboolean nativeTestGetCachedDurationBeforeSetDataSource(JNIEnv*, jobject) {
178*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor* extractor = AMediaExtractor_new();
179*b7c941bbSAndroid Build Coastguard Worker bool isPass = AMediaExtractor_getCachedDuration(extractor) == -1;
180*b7c941bbSAndroid Build Coastguard Worker if (!isPass) ALOGE("error: getCachedDuration returns unexpected value before setDataSource");
181*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_delete(extractor);
182*b7c941bbSAndroid Build Coastguard Worker return static_cast<jboolean>(isPass);
183*b7c941bbSAndroid Build Coastguard Worker }
184*b7c941bbSAndroid Build Coastguard Worker
nativeTestIfGetFileFormatSucceedsBeforeSetDataSource(JNIEnv *,jobject)185*b7c941bbSAndroid Build Coastguard Worker static jboolean nativeTestIfGetFileFormatSucceedsBeforeSetDataSource(JNIEnv*, jobject) {
186*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor* extractor = AMediaExtractor_new();
187*b7c941bbSAndroid Build Coastguard Worker AMediaFormat* empty = AMediaFormat_new();
188*b7c941bbSAndroid Build Coastguard Worker AMediaFormat* format = AMediaExtractor_getFileFormat(extractor);
189*b7c941bbSAndroid Build Coastguard Worker bool isPass = true;
190*b7c941bbSAndroid Build Coastguard Worker if (format == nullptr ||
191*b7c941bbSAndroid Build Coastguard Worker strcmp(AMediaFormat_toString(empty), AMediaFormat_toString(format)) != 0) {
192*b7c941bbSAndroid Build Coastguard Worker isPass = false;
193*b7c941bbSAndroid Build Coastguard Worker ALOGE("error: getFileFormat before set data source yields unexpected result");
194*b7c941bbSAndroid Build Coastguard Worker }
195*b7c941bbSAndroid Build Coastguard Worker if (format) AMediaFormat_delete(format);
196*b7c941bbSAndroid Build Coastguard Worker AMediaFormat_delete(empty);
197*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_delete(extractor);
198*b7c941bbSAndroid Build Coastguard Worker return static_cast<jboolean>(isPass);
199*b7c941bbSAndroid Build Coastguard Worker }
200*b7c941bbSAndroid Build Coastguard Worker
nativeTestAdvanceBeforeSetDataSource(JNIEnv *,jobject)201*b7c941bbSAndroid Build Coastguard Worker static jboolean nativeTestAdvanceBeforeSetDataSource(JNIEnv*, jobject) {
202*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor* extractor = AMediaExtractor_new();
203*b7c941bbSAndroid Build Coastguard Worker bool isPass = !AMediaExtractor_advance(extractor);
204*b7c941bbSAndroid Build Coastguard Worker if (!isPass) ALOGE("error: advance succeeds before setDataSource");
205*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_delete(extractor);
206*b7c941bbSAndroid Build Coastguard Worker return static_cast<jboolean>(isPass);
207*b7c941bbSAndroid Build Coastguard Worker }
208*b7c941bbSAndroid Build Coastguard Worker
nativeTestAdvanceBeforeSelectTrack(JNIEnv * env,jobject,jstring jsrcPath)209*b7c941bbSAndroid Build Coastguard Worker static jboolean nativeTestAdvanceBeforeSelectTrack(JNIEnv* env, jobject, jstring jsrcPath) {
210*b7c941bbSAndroid Build Coastguard Worker bool isPass = false;
211*b7c941bbSAndroid Build Coastguard Worker const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr);
212*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor* extractor = AMediaExtractor_new();
213*b7c941bbSAndroid Build Coastguard Worker FILE* srcFp = fopen(csrcPath, "rbe");
214*b7c941bbSAndroid Build Coastguard Worker if (AMEDIA_OK == setExtractorDataSource(extractor, srcFp)) {
215*b7c941bbSAndroid Build Coastguard Worker isPass = !AMediaExtractor_advance(extractor);
216*b7c941bbSAndroid Build Coastguard Worker if (!isPass) ALOGE("error: advance succeeds without any active tracks");
217*b7c941bbSAndroid Build Coastguard Worker }
218*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_delete(extractor);
219*b7c941bbSAndroid Build Coastguard Worker if (srcFp) fclose(srcFp);
220*b7c941bbSAndroid Build Coastguard Worker env->ReleaseStringUTFChars(jsrcPath, csrcPath);
221*b7c941bbSAndroid Build Coastguard Worker return static_cast<jboolean>(isPass);
222*b7c941bbSAndroid Build Coastguard Worker }
223*b7c941bbSAndroid Build Coastguard Worker
nativeTestGetSampleFlagsBeforeSetDataSource(JNIEnv *,jobject)224*b7c941bbSAndroid Build Coastguard Worker static jboolean nativeTestGetSampleFlagsBeforeSetDataSource(JNIEnv*, jobject) {
225*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor* extractor = AMediaExtractor_new();
226*b7c941bbSAndroid Build Coastguard Worker bool isPass = AMediaExtractor_getSampleFlags(extractor) == -1;
227*b7c941bbSAndroid Build Coastguard Worker if (!isPass) ALOGE("error: received valid sample flag before setDataSource");
228*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_delete(extractor);
229*b7c941bbSAndroid Build Coastguard Worker return static_cast<jboolean>(isPass);
230*b7c941bbSAndroid Build Coastguard Worker }
231*b7c941bbSAndroid Build Coastguard Worker
nativeTestGetSampleFlagsBeforeSelectTrack(JNIEnv * env,jobject,jstring jsrcPath)232*b7c941bbSAndroid Build Coastguard Worker static jboolean nativeTestGetSampleFlagsBeforeSelectTrack(JNIEnv* env, jobject, jstring jsrcPath) {
233*b7c941bbSAndroid Build Coastguard Worker bool isPass = false;
234*b7c941bbSAndroid Build Coastguard Worker const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr);
235*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor* extractor = AMediaExtractor_new();
236*b7c941bbSAndroid Build Coastguard Worker FILE* srcFp = fopen(csrcPath, "rbe");
237*b7c941bbSAndroid Build Coastguard Worker if (AMEDIA_OK == setExtractorDataSource(extractor, srcFp)) {
238*b7c941bbSAndroid Build Coastguard Worker isPass = AMediaExtractor_getSampleFlags(extractor) == -1;
239*b7c941bbSAndroid Build Coastguard Worker if (!isPass) ALOGE("error: received valid sample flag without any active tracks");
240*b7c941bbSAndroid Build Coastguard Worker }
241*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_delete(extractor);
242*b7c941bbSAndroid Build Coastguard Worker if (srcFp) fclose(srcFp);
243*b7c941bbSAndroid Build Coastguard Worker env->ReleaseStringUTFChars(jsrcPath, csrcPath);
244*b7c941bbSAndroid Build Coastguard Worker return static_cast<jboolean>(isPass);
245*b7c941bbSAndroid Build Coastguard Worker }
246*b7c941bbSAndroid Build Coastguard Worker
nativeTestGetSampleTimeBeforeSetDataSource(JNIEnv *,jobject)247*b7c941bbSAndroid Build Coastguard Worker static jboolean nativeTestGetSampleTimeBeforeSetDataSource(JNIEnv*, jobject) {
248*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor* extractor = AMediaExtractor_new();
249*b7c941bbSAndroid Build Coastguard Worker bool isPass = AMediaExtractor_getSampleTime(extractor) == -1;
250*b7c941bbSAndroid Build Coastguard Worker if (!isPass) ALOGE("error: received valid pts before setDataSource");
251*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_delete(extractor);
252*b7c941bbSAndroid Build Coastguard Worker return static_cast<jboolean>(isPass);
253*b7c941bbSAndroid Build Coastguard Worker }
254*b7c941bbSAndroid Build Coastguard Worker
nativeTestGetSampleTimeBeforeSelectTrack(JNIEnv * env,jobject,jstring jsrcPath)255*b7c941bbSAndroid Build Coastguard Worker static jboolean nativeTestGetSampleTimeBeforeSelectTrack(JNIEnv* env, jobject, jstring jsrcPath) {
256*b7c941bbSAndroid Build Coastguard Worker bool isPass = false;
257*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor* extractor = AMediaExtractor_new();
258*b7c941bbSAndroid Build Coastguard Worker const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr);
259*b7c941bbSAndroid Build Coastguard Worker FILE* srcFp = fopen(csrcPath, "rbe");
260*b7c941bbSAndroid Build Coastguard Worker if (AMEDIA_OK == setExtractorDataSource(extractor, srcFp)) {
261*b7c941bbSAndroid Build Coastguard Worker isPass = AMediaExtractor_getSampleTime(extractor) == -1;
262*b7c941bbSAndroid Build Coastguard Worker if (!isPass) ALOGE("error: received valid pts without any active tracks");
263*b7c941bbSAndroid Build Coastguard Worker }
264*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_delete(extractor);
265*b7c941bbSAndroid Build Coastguard Worker if (srcFp) fclose(srcFp);
266*b7c941bbSAndroid Build Coastguard Worker env->ReleaseStringUTFChars(jsrcPath, csrcPath);
267*b7c941bbSAndroid Build Coastguard Worker return static_cast<jboolean>(isPass);
268*b7c941bbSAndroid Build Coastguard Worker }
269*b7c941bbSAndroid Build Coastguard Worker
nativeTestGetSampleSizeBeforeSetDataSource(JNIEnv *,jobject)270*b7c941bbSAndroid Build Coastguard Worker static jboolean nativeTestGetSampleSizeBeforeSetDataSource(JNIEnv*, jobject) {
271*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor* extractor = AMediaExtractor_new();
272*b7c941bbSAndroid Build Coastguard Worker bool isPass = AMediaExtractor_getSampleSize(extractor) == -1;
273*b7c941bbSAndroid Build Coastguard Worker if (!isPass) ALOGE("error: received valid sample size before setDataSource");
274*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_delete(extractor);
275*b7c941bbSAndroid Build Coastguard Worker return static_cast<jboolean>(isPass);
276*b7c941bbSAndroid Build Coastguard Worker }
277*b7c941bbSAndroid Build Coastguard Worker
nativeTestGetSampleSizeBeforeSelectTrack(JNIEnv * env,jobject,jstring jsrcPath)278*b7c941bbSAndroid Build Coastguard Worker static jboolean nativeTestGetSampleSizeBeforeSelectTrack(JNIEnv* env, jobject, jstring jsrcPath) {
279*b7c941bbSAndroid Build Coastguard Worker bool isPass = false;
280*b7c941bbSAndroid Build Coastguard Worker const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr);
281*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor* extractor = AMediaExtractor_new();
282*b7c941bbSAndroid Build Coastguard Worker FILE* srcFp = fopen(csrcPath, "rbe");
283*b7c941bbSAndroid Build Coastguard Worker if (AMEDIA_OK == setExtractorDataSource(extractor, srcFp)) {
284*b7c941bbSAndroid Build Coastguard Worker isPass = AMediaExtractor_getSampleSize(extractor) == -1;
285*b7c941bbSAndroid Build Coastguard Worker if (!isPass) ALOGE("error: received valid sample size without any active tracks");
286*b7c941bbSAndroid Build Coastguard Worker }
287*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_delete(extractor);
288*b7c941bbSAndroid Build Coastguard Worker if (srcFp) fclose(srcFp);
289*b7c941bbSAndroid Build Coastguard Worker env->ReleaseStringUTFChars(jsrcPath, csrcPath);
290*b7c941bbSAndroid Build Coastguard Worker return static_cast<jboolean>(isPass);
291*b7c941bbSAndroid Build Coastguard Worker }
292*b7c941bbSAndroid Build Coastguard Worker
nativeTestIfGetSampleFormatBeforeSetDataSource(JNIEnv *,jobject)293*b7c941bbSAndroid Build Coastguard Worker static jboolean nativeTestIfGetSampleFormatBeforeSetDataSource(JNIEnv*, jobject) {
294*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor* extractor = AMediaExtractor_new();
295*b7c941bbSAndroid Build Coastguard Worker AMediaFormat* format = AMediaFormat_new();
296*b7c941bbSAndroid Build Coastguard Worker bool isPass = AMediaExtractor_getSampleFormat(extractor, format) != AMEDIA_OK;
297*b7c941bbSAndroid Build Coastguard Worker if (!isPass) ALOGE("error: getSampleFormat succeeds before setDataSource");
298*b7c941bbSAndroid Build Coastguard Worker AMediaFormat_delete(format);
299*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_delete(extractor);
300*b7c941bbSAndroid Build Coastguard Worker return static_cast<jboolean>(isPass);
301*b7c941bbSAndroid Build Coastguard Worker }
302*b7c941bbSAndroid Build Coastguard Worker
nativeTestIfGetSampleFormatBeforeSelectTrack(JNIEnv * env,jobject,jstring jsrcPath)303*b7c941bbSAndroid Build Coastguard Worker static jboolean nativeTestIfGetSampleFormatBeforeSelectTrack(JNIEnv* env, jobject,
304*b7c941bbSAndroid Build Coastguard Worker jstring jsrcPath) {
305*b7c941bbSAndroid Build Coastguard Worker bool isPass = false;
306*b7c941bbSAndroid Build Coastguard Worker const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr);
307*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor* extractor = AMediaExtractor_new();
308*b7c941bbSAndroid Build Coastguard Worker AMediaFormat* format = AMediaFormat_new();
309*b7c941bbSAndroid Build Coastguard Worker FILE* srcFp = fopen(csrcPath, "rbe");
310*b7c941bbSAndroid Build Coastguard Worker if (AMEDIA_OK == setExtractorDataSource(extractor, srcFp)) {
311*b7c941bbSAndroid Build Coastguard Worker isPass = AMediaExtractor_getSampleFormat(extractor, format) != AMEDIA_OK;
312*b7c941bbSAndroid Build Coastguard Worker if (!isPass) ALOGE("error: getSampleFormat succeeds without any active tracks");
313*b7c941bbSAndroid Build Coastguard Worker }
314*b7c941bbSAndroid Build Coastguard Worker AMediaFormat_delete(format);
315*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_delete(extractor);
316*b7c941bbSAndroid Build Coastguard Worker if (srcFp) fclose(srcFp);
317*b7c941bbSAndroid Build Coastguard Worker env->ReleaseStringUTFChars(jsrcPath, csrcPath);
318*b7c941bbSAndroid Build Coastguard Worker return static_cast<jboolean>(isPass);
319*b7c941bbSAndroid Build Coastguard Worker }
320*b7c941bbSAndroid Build Coastguard Worker
nativeTestVideoSampleFileOffsetByGetSampleFormat(JNIEnv * env,jobject,jstring jsrcPath)321*b7c941bbSAndroid Build Coastguard Worker static jboolean nativeTestVideoSampleFileOffsetByGetSampleFormat(JNIEnv* env, jobject,
322*b7c941bbSAndroid Build Coastguard Worker jstring jsrcPath) {
323*b7c941bbSAndroid Build Coastguard Worker int64_t video_sample_offsets[] = {6522, 95521, 118719, 126219, 137578};
324*b7c941bbSAndroid Build Coastguard Worker bool isPass = true;
325*b7c941bbSAndroid Build Coastguard Worker const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr);
326*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor* extractor = AMediaExtractor_new();
327*b7c941bbSAndroid Build Coastguard Worker AMediaFormat* format = AMediaFormat_new();
328*b7c941bbSAndroid Build Coastguard Worker FILE* srcFp = fopen(csrcPath, "rbe");
329*b7c941bbSAndroid Build Coastguard Worker if (AMEDIA_OK == setExtractorDataSource(extractor, srcFp)) {
330*b7c941bbSAndroid Build Coastguard Worker if (AMEDIA_OK == AMediaExtractor_selectTrack(extractor, 0 /* video */)) {
331*b7c941bbSAndroid Build Coastguard Worker for(int i = 0; i < sizeof(video_sample_offsets)/sizeof(int64_t); ++i) {
332*b7c941bbSAndroid Build Coastguard Worker if (AMEDIA_OK == AMediaExtractor_getSampleFormat(extractor, format)) {
333*b7c941bbSAndroid Build Coastguard Worker ALOGV("AMediaFormat_toString:%s", AMediaFormat_toString(format));
334*b7c941bbSAndroid Build Coastguard Worker int64_t offset = 0;
335*b7c941bbSAndroid Build Coastguard Worker if (AMediaFormat_getInt64(format, "sample-file-offset", &offset)) {
336*b7c941bbSAndroid Build Coastguard Worker if (offset != video_sample_offsets[i]) {
337*b7c941bbSAndroid Build Coastguard Worker ALOGD("offset:%lld, video_sample_offsets[%d]:%lld",
338*b7c941bbSAndroid Build Coastguard Worker (long long)offset, i, (long long)video_sample_offsets[i]);
339*b7c941bbSAndroid Build Coastguard Worker isPass = false;
340*b7c941bbSAndroid Build Coastguard Worker break;
341*b7c941bbSAndroid Build Coastguard Worker }
342*b7c941bbSAndroid Build Coastguard Worker } else {
343*b7c941bbSAndroid Build Coastguard Worker ALOGD("error: sample-file-offset not found");
344*b7c941bbSAndroid Build Coastguard Worker isPass = false;
345*b7c941bbSAndroid Build Coastguard Worker break;
346*b7c941bbSAndroid Build Coastguard Worker }
347*b7c941bbSAndroid Build Coastguard Worker }
348*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_advance(extractor);
349*b7c941bbSAndroid Build Coastguard Worker }
350*b7c941bbSAndroid Build Coastguard Worker }
351*b7c941bbSAndroid Build Coastguard Worker }
352*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_delete(extractor);
353*b7c941bbSAndroid Build Coastguard Worker AMediaFormat_delete(format);
354*b7c941bbSAndroid Build Coastguard Worker if (srcFp) fclose(srcFp);
355*b7c941bbSAndroid Build Coastguard Worker env->ReleaseStringUTFChars(jsrcPath, csrcPath);
356*b7c941bbSAndroid Build Coastguard Worker return static_cast<jboolean>(isPass);
357*b7c941bbSAndroid Build Coastguard Worker }
358*b7c941bbSAndroid Build Coastguard Worker
nativeTestAudioSampleFileOffsetByGetSampleFormat(JNIEnv * env,jobject,jstring jsrcPath)359*b7c941bbSAndroid Build Coastguard Worker static jboolean nativeTestAudioSampleFileOffsetByGetSampleFormat(JNIEnv* env, jobject,
360*b7c941bbSAndroid Build Coastguard Worker jstring jsrcPath) {
361*b7c941bbSAndroid Build Coastguard Worker int64_t audio_sample_offsets[] = {186125, 186682, 187286, 187944, 188551};
362*b7c941bbSAndroid Build Coastguard Worker bool isPass = true;
363*b7c941bbSAndroid Build Coastguard Worker const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr);
364*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor* extractor = AMediaExtractor_new();
365*b7c941bbSAndroid Build Coastguard Worker AMediaFormat* format = AMediaFormat_new();
366*b7c941bbSAndroid Build Coastguard Worker FILE* srcFp = fopen(csrcPath, "rbe");
367*b7c941bbSAndroid Build Coastguard Worker if (AMEDIA_OK == setExtractorDataSource(extractor, srcFp)) {
368*b7c941bbSAndroid Build Coastguard Worker if (AMEDIA_OK == AMediaExtractor_selectTrack(extractor, 1 /* audio */)) {
369*b7c941bbSAndroid Build Coastguard Worker for(int i = 0; i < sizeof(audio_sample_offsets)/sizeof(int64_t); ++i) {
370*b7c941bbSAndroid Build Coastguard Worker if (AMEDIA_OK == AMediaExtractor_getSampleFormat(extractor, format)) {
371*b7c941bbSAndroid Build Coastguard Worker ALOGV("AMediaFormat_toString:%s", AMediaFormat_toString(format));
372*b7c941bbSAndroid Build Coastguard Worker int64_t offset = 0;
373*b7c941bbSAndroid Build Coastguard Worker if (AMediaFormat_getInt64(format, "sample-file-offset", &offset)) {
374*b7c941bbSAndroid Build Coastguard Worker if (offset != audio_sample_offsets[i]) {
375*b7c941bbSAndroid Build Coastguard Worker ALOGD("offset:%lld, audio_sample_offsets[%d]:%lld",
376*b7c941bbSAndroid Build Coastguard Worker (long long)offset, i, (long long)audio_sample_offsets[i]);
377*b7c941bbSAndroid Build Coastguard Worker isPass = false;
378*b7c941bbSAndroid Build Coastguard Worker break;
379*b7c941bbSAndroid Build Coastguard Worker }
380*b7c941bbSAndroid Build Coastguard Worker } else {
381*b7c941bbSAndroid Build Coastguard Worker ALOGE("error: sample-file-offset not found");
382*b7c941bbSAndroid Build Coastguard Worker isPass = false;
383*b7c941bbSAndroid Build Coastguard Worker break;
384*b7c941bbSAndroid Build Coastguard Worker }
385*b7c941bbSAndroid Build Coastguard Worker }
386*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_advance(extractor);
387*b7c941bbSAndroid Build Coastguard Worker }
388*b7c941bbSAndroid Build Coastguard Worker }
389*b7c941bbSAndroid Build Coastguard Worker }
390*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_delete(extractor);
391*b7c941bbSAndroid Build Coastguard Worker AMediaFormat_delete(format);
392*b7c941bbSAndroid Build Coastguard Worker if (srcFp) fclose(srcFp);
393*b7c941bbSAndroid Build Coastguard Worker env->ReleaseStringUTFChars(jsrcPath, csrcPath);
394*b7c941bbSAndroid Build Coastguard Worker return static_cast<jboolean>(isPass);
395*b7c941bbSAndroid Build Coastguard Worker }
396*b7c941bbSAndroid Build Coastguard Worker
nativeTestGetSampleTrackIndexBeforeSetDataSource(JNIEnv *,jobject)397*b7c941bbSAndroid Build Coastguard Worker static jboolean nativeTestGetSampleTrackIndexBeforeSetDataSource(JNIEnv*, jobject) {
398*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor* extractor = AMediaExtractor_new();
399*b7c941bbSAndroid Build Coastguard Worker bool isPass = AMediaExtractor_getSampleTrackIndex(extractor) == -1;
400*b7c941bbSAndroid Build Coastguard Worker if (!isPass) ALOGE("error: received valid track index before setDataSource");
401*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_delete(extractor);
402*b7c941bbSAndroid Build Coastguard Worker return static_cast<jboolean>(isPass);
403*b7c941bbSAndroid Build Coastguard Worker }
404*b7c941bbSAndroid Build Coastguard Worker
nativeTestGetSampleTrackIndexBeforeSelectTrack(JNIEnv * env,jobject,jstring jsrcPath)405*b7c941bbSAndroid Build Coastguard Worker static jboolean nativeTestGetSampleTrackIndexBeforeSelectTrack(JNIEnv* env, jobject,
406*b7c941bbSAndroid Build Coastguard Worker jstring jsrcPath) {
407*b7c941bbSAndroid Build Coastguard Worker bool isPass = false;
408*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor* extractor = AMediaExtractor_new();
409*b7c941bbSAndroid Build Coastguard Worker const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr);
410*b7c941bbSAndroid Build Coastguard Worker FILE* srcFp = fopen(csrcPath, "rbe");
411*b7c941bbSAndroid Build Coastguard Worker if (AMEDIA_OK == setExtractorDataSource(extractor, srcFp)) {
412*b7c941bbSAndroid Build Coastguard Worker isPass = AMediaExtractor_getSampleTrackIndex(extractor) == -1;
413*b7c941bbSAndroid Build Coastguard Worker if (!isPass) ALOGE("error: received valid track index without any active tracks");
414*b7c941bbSAndroid Build Coastguard Worker }
415*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_delete(extractor);
416*b7c941bbSAndroid Build Coastguard Worker if (srcFp) fclose(srcFp);
417*b7c941bbSAndroid Build Coastguard Worker env->ReleaseStringUTFChars(jsrcPath, csrcPath);
418*b7c941bbSAndroid Build Coastguard Worker return static_cast<jboolean>(isPass);
419*b7c941bbSAndroid Build Coastguard Worker }
420*b7c941bbSAndroid Build Coastguard Worker
nativeTestGetTrackFormatBeforeSetDataSource(JNIEnv *,jobject)421*b7c941bbSAndroid Build Coastguard Worker static jboolean nativeTestGetTrackFormatBeforeSetDataSource(JNIEnv*, jobject) {
422*b7c941bbSAndroid Build Coastguard Worker bool isPass = true;
423*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor* extractor = AMediaExtractor_new();
424*b7c941bbSAndroid Build Coastguard Worker AMediaFormat* empty = AMediaFormat_new();
425*b7c941bbSAndroid Build Coastguard Worker AMediaFormat* format = AMediaExtractor_getTrackFormat(extractor, 0);
426*b7c941bbSAndroid Build Coastguard Worker if (format == nullptr ||
427*b7c941bbSAndroid Build Coastguard Worker strcmp(AMediaFormat_toString(empty), AMediaFormat_toString(format)) != 0) {
428*b7c941bbSAndroid Build Coastguard Worker isPass = false;
429*b7c941bbSAndroid Build Coastguard Worker ALOGE("error: getTrackFormat before setDataSource yields unexpected result");
430*b7c941bbSAndroid Build Coastguard Worker }
431*b7c941bbSAndroid Build Coastguard Worker if (format) AMediaFormat_delete(format);
432*b7c941bbSAndroid Build Coastguard Worker AMediaFormat_delete(empty);
433*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_delete(extractor);
434*b7c941bbSAndroid Build Coastguard Worker return static_cast<jboolean>(isPass);
435*b7c941bbSAndroid Build Coastguard Worker }
436*b7c941bbSAndroid Build Coastguard Worker
nativeTestGetTrackFormatForInvalidIndex(JNIEnv * env,jobject,jstring jsrcPath)437*b7c941bbSAndroid Build Coastguard Worker static jboolean nativeTestGetTrackFormatForInvalidIndex(JNIEnv* env, jobject, jstring jsrcPath) {
438*b7c941bbSAndroid Build Coastguard Worker bool isPass = true;
439*b7c941bbSAndroid Build Coastguard Worker const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr);
440*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor* extractor = AMediaExtractor_new();
441*b7c941bbSAndroid Build Coastguard Worker FILE* srcFp = fopen(csrcPath, "rbe");
442*b7c941bbSAndroid Build Coastguard Worker if (AMEDIA_OK == setExtractorDataSource(extractor, srcFp)) {
443*b7c941bbSAndroid Build Coastguard Worker AMediaFormat* format =
444*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_getTrackFormat(extractor, AMediaExtractor_getTrackCount(extractor));
445*b7c941bbSAndroid Build Coastguard Worker AMediaFormat* empty = AMediaFormat_new();
446*b7c941bbSAndroid Build Coastguard Worker if (format == nullptr ||
447*b7c941bbSAndroid Build Coastguard Worker strcmp(AMediaFormat_toString(empty), AMediaFormat_toString(format)) != 0) {
448*b7c941bbSAndroid Build Coastguard Worker isPass = false;
449*b7c941bbSAndroid Build Coastguard Worker ALOGE("error: getTrackFormat for out of bound track index %zu yields unexpected result",
450*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_getTrackCount(extractor));
451*b7c941bbSAndroid Build Coastguard Worker }
452*b7c941bbSAndroid Build Coastguard Worker if (format) AMediaFormat_delete(format);
453*b7c941bbSAndroid Build Coastguard Worker AMediaFormat_delete(empty);
454*b7c941bbSAndroid Build Coastguard Worker } else {
455*b7c941bbSAndroid Build Coastguard Worker isPass = false;
456*b7c941bbSAndroid Build Coastguard Worker }
457*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_delete(extractor);
458*b7c941bbSAndroid Build Coastguard Worker if (srcFp) fclose(srcFp);
459*b7c941bbSAndroid Build Coastguard Worker env->ReleaseStringUTFChars(jsrcPath, csrcPath);
460*b7c941bbSAndroid Build Coastguard Worker return static_cast<jboolean>(isPass);
461*b7c941bbSAndroid Build Coastguard Worker }
462*b7c941bbSAndroid Build Coastguard Worker
nativeTestReadSampleDataBeforeSetDataSource(JNIEnv *,jobject)463*b7c941bbSAndroid Build Coastguard Worker static jboolean nativeTestReadSampleDataBeforeSetDataSource(JNIEnv*, jobject) {
464*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor* extractor = AMediaExtractor_new();
465*b7c941bbSAndroid Build Coastguard Worker const int maxSampleSize = 512 * 1024;
466*b7c941bbSAndroid Build Coastguard Worker auto buffer = new uint8_t[maxSampleSize];
467*b7c941bbSAndroid Build Coastguard Worker bool isPass = AMediaExtractor_readSampleData(extractor, buffer, maxSampleSize) < 0;
468*b7c941bbSAndroid Build Coastguard Worker if (!isPass) ALOGE("error: readSampleData return non-negative readBytes before setDataSource");
469*b7c941bbSAndroid Build Coastguard Worker delete[] buffer;
470*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_delete(extractor);
471*b7c941bbSAndroid Build Coastguard Worker return static_cast<jboolean>(isPass);
472*b7c941bbSAndroid Build Coastguard Worker }
473*b7c941bbSAndroid Build Coastguard Worker
nativeTestReadSampleDataBeforeSelectTrack(JNIEnv * env,jobject,jstring jsrcPath)474*b7c941bbSAndroid Build Coastguard Worker static jboolean nativeTestReadSampleDataBeforeSelectTrack(JNIEnv* env, jobject, jstring jsrcPath) {
475*b7c941bbSAndroid Build Coastguard Worker bool isPass = false;
476*b7c941bbSAndroid Build Coastguard Worker const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr);
477*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor* extractor = AMediaExtractor_new();
478*b7c941bbSAndroid Build Coastguard Worker const int maxSampleSize = (512 * 1024);
479*b7c941bbSAndroid Build Coastguard Worker auto buffer = new uint8_t[maxSampleSize];
480*b7c941bbSAndroid Build Coastguard Worker FILE* srcFp = fopen(csrcPath, "rbe");
481*b7c941bbSAndroid Build Coastguard Worker if (AMEDIA_OK == setExtractorDataSource(extractor, srcFp)) {
482*b7c941bbSAndroid Build Coastguard Worker isPass = AMediaExtractor_readSampleData(extractor, buffer, maxSampleSize) < 0;
483*b7c941bbSAndroid Build Coastguard Worker if (!isPass) {
484*b7c941bbSAndroid Build Coastguard Worker ALOGE("error: readSampleData returns non-negative readBytes with out active tracks");
485*b7c941bbSAndroid Build Coastguard Worker }
486*b7c941bbSAndroid Build Coastguard Worker }
487*b7c941bbSAndroid Build Coastguard Worker delete[] buffer;
488*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_delete(extractor);
489*b7c941bbSAndroid Build Coastguard Worker if (srcFp) fclose(srcFp);
490*b7c941bbSAndroid Build Coastguard Worker env->ReleaseStringUTFChars(jsrcPath, csrcPath);
491*b7c941bbSAndroid Build Coastguard Worker return static_cast<jboolean>(isPass);
492*b7c941bbSAndroid Build Coastguard Worker }
493*b7c941bbSAndroid Build Coastguard Worker
nativeTestIfNullLocationIsRejectedBySetDataSource(JNIEnv *,jobject)494*b7c941bbSAndroid Build Coastguard Worker static jboolean nativeTestIfNullLocationIsRejectedBySetDataSource(JNIEnv*, jobject) {
495*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor* extractor = AMediaExtractor_new();
496*b7c941bbSAndroid Build Coastguard Worker bool isPass = AMediaExtractor_setDataSource(extractor, nullptr) != AMEDIA_OK;
497*b7c941bbSAndroid Build Coastguard Worker if (!isPass) ALOGE("error: setDataSource succeeds with null location");
498*b7c941bbSAndroid Build Coastguard Worker AMediaExtractor_delete(extractor);
499*b7c941bbSAndroid Build Coastguard Worker return static_cast<jboolean>(isPass);
500*b7c941bbSAndroid Build Coastguard Worker }
501*b7c941bbSAndroid Build Coastguard Worker
registerAndroidMediaV2CtsExtractorUnitTestApi(JNIEnv * env)502*b7c941bbSAndroid Build Coastguard Worker int registerAndroidMediaV2CtsExtractorUnitTestApi(JNIEnv* env) {
503*b7c941bbSAndroid Build Coastguard Worker const JNINativeMethod methodTable[] = {
504*b7c941bbSAndroid Build Coastguard Worker {"nativeTestGetTrackCountBeforeSetDataSource", "()Z",
505*b7c941bbSAndroid Build Coastguard Worker (void*)nativeTestGetTrackCountBeforeSetDataSource},
506*b7c941bbSAndroid Build Coastguard Worker {"nativeTestSelectTrackBeforeSetDataSource", "()Z",
507*b7c941bbSAndroid Build Coastguard Worker (void*)nativeTestSelectTrackBeforeSetDataSource},
508*b7c941bbSAndroid Build Coastguard Worker {"nativeTestSelectTrackForInvalidIndex", "(Ljava/lang/String;)Z",
509*b7c941bbSAndroid Build Coastguard Worker (void*)nativeTestSelectTrackForInvalidIndex},
510*b7c941bbSAndroid Build Coastguard Worker {"nativeTestIdempotentSelectTrack", "(Ljava/lang/String;)Z",
511*b7c941bbSAndroid Build Coastguard Worker (void*)nativeTestIdempotentSelectTrack},
512*b7c941bbSAndroid Build Coastguard Worker {"nativeTestUnselectTrackBeforeSetDataSource", "()Z",
513*b7c941bbSAndroid Build Coastguard Worker (void*)nativeTestUnselectTrackBeforeSetDataSource},
514*b7c941bbSAndroid Build Coastguard Worker {"nativeTestUnselectTrackForInvalidIndex", "(Ljava/lang/String;)Z",
515*b7c941bbSAndroid Build Coastguard Worker (void*)nativeTestUnselectTrackForInvalidIndex},
516*b7c941bbSAndroid Build Coastguard Worker {"nativeTestUnselectTrackForUnSelectedTrackIndex", "(Ljava/lang/String;)Z",
517*b7c941bbSAndroid Build Coastguard Worker (void*)nativeTestUnselectTrackForUnSelectedTrackIndex},
518*b7c941bbSAndroid Build Coastguard Worker {"nativeTestIdempotentUnselectTrack", "(Ljava/lang/String;)Z",
519*b7c941bbSAndroid Build Coastguard Worker (void*)nativeTestIdempotentUnselectTrack},
520*b7c941bbSAndroid Build Coastguard Worker {"nativeTestSeekToBeforeSetDataSource", "()Z",
521*b7c941bbSAndroid Build Coastguard Worker (void*)nativeTestSeekToBeforeSetDataSource},
522*b7c941bbSAndroid Build Coastguard Worker {"nativeTestSeekToBeforeSelectTrack", "(Ljava/lang/String;)Z",
523*b7c941bbSAndroid Build Coastguard Worker (void*)nativeTestSeekToBeforeSelectTrack},
524*b7c941bbSAndroid Build Coastguard Worker {"nativeTestGetCachedDurationBeforeSetDataSource", "()Z",
525*b7c941bbSAndroid Build Coastguard Worker (void*)nativeTestGetCachedDurationBeforeSetDataSource},
526*b7c941bbSAndroid Build Coastguard Worker {"nativeTestIfGetFileFormatSucceedsBeforeSetDataSource", "()Z",
527*b7c941bbSAndroid Build Coastguard Worker (void*)nativeTestIfGetFileFormatSucceedsBeforeSetDataSource},
528*b7c941bbSAndroid Build Coastguard Worker {"nativeTestAdvanceBeforeSetDataSource", "()Z",
529*b7c941bbSAndroid Build Coastguard Worker (void*)nativeTestAdvanceBeforeSetDataSource},
530*b7c941bbSAndroid Build Coastguard Worker {"nativeTestAdvanceBeforeSelectTrack", "(Ljava/lang/String;)Z",
531*b7c941bbSAndroid Build Coastguard Worker (void*)nativeTestAdvanceBeforeSelectTrack},
532*b7c941bbSAndroid Build Coastguard Worker {"nativeTestGetSampleFlagsBeforeSetDataSource", "()Z",
533*b7c941bbSAndroid Build Coastguard Worker (void*)nativeTestGetSampleFlagsBeforeSetDataSource},
534*b7c941bbSAndroid Build Coastguard Worker {"nativeTestGetSampleFlagsBeforeSelectTrack", "(Ljava/lang/String;)Z",
535*b7c941bbSAndroid Build Coastguard Worker (void*)nativeTestGetSampleFlagsBeforeSelectTrack},
536*b7c941bbSAndroid Build Coastguard Worker {"nativeTestGetSampleTimeBeforeSetDataSource", "()Z",
537*b7c941bbSAndroid Build Coastguard Worker (void*)nativeTestGetSampleTimeBeforeSetDataSource},
538*b7c941bbSAndroid Build Coastguard Worker {"nativeTestGetSampleTimeBeforeSelectTrack", "(Ljava/lang/String;)Z",
539*b7c941bbSAndroid Build Coastguard Worker (void*)nativeTestGetSampleTimeBeforeSelectTrack},
540*b7c941bbSAndroid Build Coastguard Worker {"nativeTestGetSampleSizeBeforeSetDataSource", "()Z",
541*b7c941bbSAndroid Build Coastguard Worker (void*)nativeTestGetSampleSizeBeforeSetDataSource},
542*b7c941bbSAndroid Build Coastguard Worker {"nativeTestGetSampleSizeBeforeSelectTrack", "(Ljava/lang/String;)Z",
543*b7c941bbSAndroid Build Coastguard Worker (void*)nativeTestGetSampleSizeBeforeSelectTrack},
544*b7c941bbSAndroid Build Coastguard Worker {"nativeTestIfGetSampleFormatBeforeSetDataSource", "()Z",
545*b7c941bbSAndroid Build Coastguard Worker (void*)nativeTestIfGetSampleFormatBeforeSetDataSource},
546*b7c941bbSAndroid Build Coastguard Worker {"nativeTestIfGetSampleFormatBeforeSelectTrack", "(Ljava/lang/String;)Z",
547*b7c941bbSAndroid Build Coastguard Worker (void*)nativeTestIfGetSampleFormatBeforeSelectTrack},
548*b7c941bbSAndroid Build Coastguard Worker {"nativeTestGetSampleTrackIndexBeforeSetDataSource", "()Z",
549*b7c941bbSAndroid Build Coastguard Worker (void*)nativeTestGetSampleTrackIndexBeforeSetDataSource},
550*b7c941bbSAndroid Build Coastguard Worker {"nativeTestGetSampleTrackIndexBeforeSelectTrack", "(Ljava/lang/String;)Z",
551*b7c941bbSAndroid Build Coastguard Worker (void*)nativeTestGetSampleTrackIndexBeforeSelectTrack},
552*b7c941bbSAndroid Build Coastguard Worker {"nativeTestGetTrackFormatBeforeSetDataSource", "()Z",
553*b7c941bbSAndroid Build Coastguard Worker (void*)nativeTestGetTrackFormatBeforeSetDataSource},
554*b7c941bbSAndroid Build Coastguard Worker {"nativeTestGetTrackFormatForInvalidIndex", "(Ljava/lang/String;)Z",
555*b7c941bbSAndroid Build Coastguard Worker (void*)nativeTestGetTrackFormatForInvalidIndex},
556*b7c941bbSAndroid Build Coastguard Worker {"nativeTestReadSampleDataBeforeSetDataSource", "()Z",
557*b7c941bbSAndroid Build Coastguard Worker (void*)nativeTestReadSampleDataBeforeSetDataSource},
558*b7c941bbSAndroid Build Coastguard Worker {"nativeTestReadSampleDataBeforeSelectTrack", "(Ljava/lang/String;)Z",
559*b7c941bbSAndroid Build Coastguard Worker (void*)nativeTestReadSampleDataBeforeSelectTrack},
560*b7c941bbSAndroid Build Coastguard Worker {"nativeTestIfNullLocationIsRejectedBySetDataSource", "()Z",
561*b7c941bbSAndroid Build Coastguard Worker (void*)nativeTestIfNullLocationIsRejectedBySetDataSource},
562*b7c941bbSAndroid Build Coastguard Worker {"nativeTestVideoSampleFileOffsetByGetSampleFormat", "(Ljava/lang/String;)Z",
563*b7c941bbSAndroid Build Coastguard Worker (void*)nativeTestVideoSampleFileOffsetByGetSampleFormat},
564*b7c941bbSAndroid Build Coastguard Worker {"nativeTestAudioSampleFileOffsetByGetSampleFormat", "(Ljava/lang/String;)Z",
565*b7c941bbSAndroid Build Coastguard Worker (void*)nativeTestAudioSampleFileOffsetByGetSampleFormat},
566*b7c941bbSAndroid Build Coastguard Worker };
567*b7c941bbSAndroid Build Coastguard Worker jclass c = env->FindClass("android/mediav2/cts/ExtractorUnitTest$TestApiNative");
568*b7c941bbSAndroid Build Coastguard Worker return env->RegisterNatives(c, methodTable, sizeof(methodTable) / sizeof(JNINativeMethod));
569*b7c941bbSAndroid Build Coastguard Worker }
570