| /* |
| * Copyright (C) 2019 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| //#define LOG_NDEBUG 0 |
| #define LOG_TAG "NativeExtractorUnitTest" |
| #include <log/log.h> |
| |
| #include <NdkMediaExtractor.h> |
| #include <jni.h> |
| #include <sys/stat.h> |
| |
| #include <cstdlib> |
| #include <cstring> |
| |
| static media_status_t setExtractorDataSource(AMediaExtractor* extractor, FILE* fp) { |
| media_status_t status = AMEDIA_ERROR_BASE; |
| struct stat buf {}; |
| if (fp && !fstat(fileno(fp), &buf)) |
| status = AMediaExtractor_setDataSourceFd(extractor, fileno(fp), 0, buf.st_size); |
| if (status != AMEDIA_OK) ALOGE("error: AMediaExtractor_setDataSourceFd failed %d", status); |
| return status; |
| } |
| |
| static jboolean nativeTestGetTrackCountBeforeSetDataSource(JNIEnv*, jobject) { |
| AMediaExtractor* extractor = AMediaExtractor_new(); |
| bool isPass = (0 == AMediaExtractor_getTrackCount(extractor)); |
| if (!isPass) ALOGE("error: received valid trackCount before setDataSource"); |
| AMediaExtractor_delete(extractor); |
| return static_cast<jboolean>(isPass); |
| } |
| |
| static jboolean nativeTestSelectTrackBeforeSetDataSource(JNIEnv*, jobject) { |
| AMediaExtractor* extractor = AMediaExtractor_new(); |
| bool isPass = (AMEDIA_OK != AMediaExtractor_selectTrack(extractor, 0)); |
| if (!isPass) ALOGE("error: selectTrack succeeds before setDataSource"); |
| AMediaExtractor_delete(extractor); |
| return static_cast<jboolean>(isPass); |
| } |
| |
| static jboolean nativeTestSelectTrackForInvalidIndex(JNIEnv* env, jobject, jstring jsrcPath) { |
| bool isPass = false; |
| const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr); |
| AMediaExtractor* extractor = AMediaExtractor_new(); |
| FILE* srcFp = fopen(csrcPath, "rbe"); |
| if (AMEDIA_OK == setExtractorDataSource(extractor, srcFp)) { |
| if (AMEDIA_OK != |
| AMediaExtractor_selectTrack(extractor, AMediaExtractor_getTrackCount(extractor))) { |
| isPass = true; |
| } else { |
| ALOGE("error: selectTrack succeeds for out of bounds track index: %zu", |
| AMediaExtractor_getTrackCount(extractor)); |
| } |
| } |
| AMediaExtractor_delete(extractor); |
| if (srcFp) fclose(srcFp); |
| env->ReleaseStringUTFChars(jsrcPath, csrcPath); |
| return static_cast<jboolean>(isPass); |
| } |
| |
| static jboolean nativeTestIdempotentSelectTrack(JNIEnv* env, jobject, jstring jsrcPath) { |
| bool isPass = false; |
| const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr); |
| AMediaExtractor* extractor = AMediaExtractor_new(); |
| FILE* srcFp = fopen(csrcPath, "rbe"); |
| if (AMEDIA_OK == setExtractorDataSource(extractor, srcFp)) { |
| isPass = AMediaExtractor_selectTrack(extractor, 0) == AMEDIA_OK; |
| isPass &= AMediaExtractor_selectTrack(extractor, 0) == AMEDIA_OK; |
| if (!isPass) ALOGE("error: multiple selection of same track has failed"); |
| } |
| AMediaExtractor_delete(extractor); |
| if (srcFp) fclose(srcFp); |
| env->ReleaseStringUTFChars(jsrcPath, csrcPath); |
| return static_cast<jboolean>(isPass); |
| } |
| |
| static jboolean nativeTestUnselectTrackBeforeSetDataSource(JNIEnv*, jobject) { |
| AMediaExtractor* extractor = AMediaExtractor_new(); |
| bool isPass = (AMEDIA_OK != AMediaExtractor_unselectTrack(extractor, 0)); |
| if (!isPass) ALOGE("error: unselectTrack succeeds before setDataSource"); |
| AMediaExtractor_delete(extractor); |
| return static_cast<jboolean>(isPass); |
| } |
| |
| static jboolean nativeTestUnselectTrackForInvalidIndex(JNIEnv* env, jobject, jstring jsrcPath) { |
| bool isPass = false; |
| const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr); |
| AMediaExtractor* extractor = AMediaExtractor_new(); |
| FILE* srcFp = fopen(csrcPath, "rbe"); |
| if (AMEDIA_OK == setExtractorDataSource(extractor, srcFp)) { |
| if (AMEDIA_OK != |
| AMediaExtractor_unselectTrack(extractor, AMediaExtractor_getTrackCount(extractor))) { |
| isPass = true; |
| } else { |
| ALOGE("error: unselectTrack succeeds for out of bounds track index: %zu", |
| AMediaExtractor_getTrackCount(extractor)); |
| } |
| } |
| AMediaExtractor_delete(extractor); |
| if (srcFp) fclose(srcFp); |
| env->ReleaseStringUTFChars(jsrcPath, csrcPath); |
| return static_cast<jboolean>(isPass); |
| } |
| |
| static jboolean nativeTestUnselectTrackForUnSelectedTrackIndex(JNIEnv* env, jobject, |
| jstring jsrcPath) { |
| bool isPass = false; |
| const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr); |
| AMediaExtractor* extractor = AMediaExtractor_new(); |
| FILE* srcFp = fopen(csrcPath, "rbe"); |
| if (AMEDIA_OK == setExtractorDataSource(extractor, srcFp)) { |
| isPass = (AMediaExtractor_unselectTrack(extractor, 0) == AMEDIA_OK); |
| if (!isPass) ALOGE("error: un-selection of non-selected track has failed"); |
| } |
| AMediaExtractor_delete(extractor); |
| if (srcFp) fclose(srcFp); |
| env->ReleaseStringUTFChars(jsrcPath, csrcPath); |
| return static_cast<jboolean>(isPass); |
| } |
| |
| static jboolean nativeTestIdempotentUnselectTrack(JNIEnv* env, jobject, jstring jsrcPath) { |
| bool isPass = false; |
| const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr); |
| AMediaExtractor* extractor = AMediaExtractor_new(); |
| FILE* srcFp = fopen(csrcPath, "rbe"); |
| if (AMEDIA_OK == setExtractorDataSource(extractor, srcFp)) { |
| isPass = AMediaExtractor_selectTrack(extractor, 0) == AMEDIA_OK; |
| if (isPass) { |
| isPass = AMediaExtractor_unselectTrack(extractor, 0) == AMEDIA_OK; |
| isPass &= AMediaExtractor_unselectTrack(extractor, 0) == AMEDIA_OK; |
| if (!isPass) ALOGE("error: multiple unselection of selected track has failed"); |
| } else { |
| ALOGE("error: selection of track 0 has failed for file %s", csrcPath); |
| } |
| } |
| AMediaExtractor_delete(extractor); |
| if (srcFp) fclose(srcFp); |
| env->ReleaseStringUTFChars(jsrcPath, csrcPath); |
| return static_cast<jboolean>(isPass); |
| } |
| |
| static jboolean nativeTestSeekToBeforeSetDataSource(JNIEnv*, jobject) { |
| AMediaExtractor* extractor = AMediaExtractor_new(); |
| bool isPass = AMediaExtractor_seekTo(extractor, 0, AMEDIAEXTRACTOR_SEEK_NEXT_SYNC) != AMEDIA_OK; |
| if (!isPass) ALOGE("error: seekTo() succeeds before setting data source"); |
| AMediaExtractor_delete(extractor); |
| return static_cast<jboolean>(isPass); |
| } |
| |
| static jboolean nativeTestSeekToBeforeSelectTrack(JNIEnv* env, jobject, jstring jsrcPath) { |
| bool isPass = false; |
| const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr); |
| AMediaExtractor* extractor = AMediaExtractor_new(); |
| FILE* srcFp = fopen(csrcPath, "rbe"); |
| if (AMEDIA_OK == setExtractorDataSource(extractor, srcFp)) { |
| isPass = AMediaExtractor_seekTo(extractor, 0, AMEDIAEXTRACTOR_SEEK_NEXT_SYNC) != AMEDIA_OK; |
| if (!isPass) ALOGE("error: seekTo() succeeds before selecting track"); |
| } |
| AMediaExtractor_delete(extractor); |
| if (srcFp) fclose(srcFp); |
| env->ReleaseStringUTFChars(jsrcPath, csrcPath); |
| return static_cast<jboolean>(isPass); |
| } |
| |
| static jboolean nativeTestGetCachedDurationBeforeSetDataSource(JNIEnv*, jobject) { |
| AMediaExtractor* extractor = AMediaExtractor_new(); |
| bool isPass = AMediaExtractor_getCachedDuration(extractor) == -1; |
| if (!isPass) ALOGE("error: getCachedDuration returns unexpected value before setDataSource"); |
| AMediaExtractor_delete(extractor); |
| return static_cast<jboolean>(isPass); |
| } |
| |
| static jboolean nativeTestIfGetFileFormatSucceedsBeforeSetDataSource(JNIEnv*, jobject) { |
| AMediaExtractor* extractor = AMediaExtractor_new(); |
| AMediaFormat* empty = AMediaFormat_new(); |
| AMediaFormat* format = AMediaExtractor_getFileFormat(extractor); |
| bool isPass = true; |
| if (format == nullptr || |
| strcmp(AMediaFormat_toString(empty), AMediaFormat_toString(format)) != 0) { |
| isPass = false; |
| ALOGE("error: getFileFormat before set data source yields unexpected result"); |
| } |
| if (format) AMediaFormat_delete(format); |
| AMediaFormat_delete(empty); |
| AMediaExtractor_delete(extractor); |
| return static_cast<jboolean>(isPass); |
| } |
| |
| static jboolean nativeTestAdvanceBeforeSetDataSource(JNIEnv*, jobject) { |
| AMediaExtractor* extractor = AMediaExtractor_new(); |
| bool isPass = !AMediaExtractor_advance(extractor); |
| if (!isPass) ALOGE("error: advance succeeds before setDataSource"); |
| AMediaExtractor_delete(extractor); |
| return static_cast<jboolean>(isPass); |
| } |
| |
| static jboolean nativeTestAdvanceBeforeSelectTrack(JNIEnv* env, jobject, jstring jsrcPath) { |
| bool isPass = false; |
| const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr); |
| AMediaExtractor* extractor = AMediaExtractor_new(); |
| FILE* srcFp = fopen(csrcPath, "rbe"); |
| if (AMEDIA_OK == setExtractorDataSource(extractor, srcFp)) { |
| isPass = !AMediaExtractor_advance(extractor); |
| if (!isPass) ALOGE("error: advance succeeds without any active tracks"); |
| } |
| AMediaExtractor_delete(extractor); |
| if (srcFp) fclose(srcFp); |
| env->ReleaseStringUTFChars(jsrcPath, csrcPath); |
| return static_cast<jboolean>(isPass); |
| } |
| |
| static jboolean nativeTestGetSampleFlagsBeforeSetDataSource(JNIEnv*, jobject) { |
| AMediaExtractor* extractor = AMediaExtractor_new(); |
| bool isPass = AMediaExtractor_getSampleFlags(extractor) == -1; |
| if (!isPass) ALOGE("error: received valid sample flag before setDataSource"); |
| AMediaExtractor_delete(extractor); |
| return static_cast<jboolean>(isPass); |
| } |
| |
| static jboolean nativeTestGetSampleFlagsBeforeSelectTrack(JNIEnv* env, jobject, jstring jsrcPath) { |
| bool isPass = false; |
| const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr); |
| AMediaExtractor* extractor = AMediaExtractor_new(); |
| FILE* srcFp = fopen(csrcPath, "rbe"); |
| if (AMEDIA_OK == setExtractorDataSource(extractor, srcFp)) { |
| isPass = AMediaExtractor_getSampleFlags(extractor) == -1; |
| if (!isPass) ALOGE("error: received valid sample flag without any active tracks"); |
| } |
| AMediaExtractor_delete(extractor); |
| if (srcFp) fclose(srcFp); |
| env->ReleaseStringUTFChars(jsrcPath, csrcPath); |
| return static_cast<jboolean>(isPass); |
| } |
| |
| static jboolean nativeTestGetSampleTimeBeforeSetDataSource(JNIEnv*, jobject) { |
| AMediaExtractor* extractor = AMediaExtractor_new(); |
| bool isPass = AMediaExtractor_getSampleTime(extractor) == -1; |
| if (!isPass) ALOGE("error: received valid pts before setDataSource"); |
| AMediaExtractor_delete(extractor); |
| return static_cast<jboolean>(isPass); |
| } |
| |
| static jboolean nativeTestGetSampleTimeBeforeSelectTrack(JNIEnv* env, jobject, jstring jsrcPath) { |
| bool isPass = false; |
| AMediaExtractor* extractor = AMediaExtractor_new(); |
| const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr); |
| FILE* srcFp = fopen(csrcPath, "rbe"); |
| if (AMEDIA_OK == setExtractorDataSource(extractor, srcFp)) { |
| isPass = AMediaExtractor_getSampleTime(extractor) == -1; |
| if (!isPass) ALOGE("error: received valid pts without any active tracks"); |
| } |
| AMediaExtractor_delete(extractor); |
| if (srcFp) fclose(srcFp); |
| env->ReleaseStringUTFChars(jsrcPath, csrcPath); |
| return static_cast<jboolean>(isPass); |
| } |
| |
| static jboolean nativeTestGetSampleSizeBeforeSetDataSource(JNIEnv*, jobject) { |
| AMediaExtractor* extractor = AMediaExtractor_new(); |
| bool isPass = AMediaExtractor_getSampleSize(extractor) == -1; |
| if (!isPass) ALOGE("error: received valid sample size before setDataSource"); |
| AMediaExtractor_delete(extractor); |
| return static_cast<jboolean>(isPass); |
| } |
| |
| static jboolean nativeTestGetSampleSizeBeforeSelectTrack(JNIEnv* env, jobject, jstring jsrcPath) { |
| bool isPass = false; |
| const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr); |
| AMediaExtractor* extractor = AMediaExtractor_new(); |
| FILE* srcFp = fopen(csrcPath, "rbe"); |
| if (AMEDIA_OK == setExtractorDataSource(extractor, srcFp)) { |
| isPass = AMediaExtractor_getSampleSize(extractor) == -1; |
| if (!isPass) ALOGE("error: received valid sample size without any active tracks"); |
| } |
| AMediaExtractor_delete(extractor); |
| if (srcFp) fclose(srcFp); |
| env->ReleaseStringUTFChars(jsrcPath, csrcPath); |
| return static_cast<jboolean>(isPass); |
| } |
| |
| static jboolean nativeTestIfGetSampleFormatBeforeSetDataSource(JNIEnv*, jobject) { |
| AMediaExtractor* extractor = AMediaExtractor_new(); |
| AMediaFormat* format = AMediaFormat_new(); |
| bool isPass = AMediaExtractor_getSampleFormat(extractor, format) != AMEDIA_OK; |
| if (!isPass) ALOGE("error: getSampleFormat succeeds before setDataSource"); |
| AMediaFormat_delete(format); |
| AMediaExtractor_delete(extractor); |
| return static_cast<jboolean>(isPass); |
| } |
| |
| static jboolean nativeTestIfGetSampleFormatBeforeSelectTrack(JNIEnv* env, jobject, |
| jstring jsrcPath) { |
| bool isPass = false; |
| const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr); |
| AMediaExtractor* extractor = AMediaExtractor_new(); |
| AMediaFormat* format = AMediaFormat_new(); |
| FILE* srcFp = fopen(csrcPath, "rbe"); |
| if (AMEDIA_OK == setExtractorDataSource(extractor, srcFp)) { |
| isPass = AMediaExtractor_getSampleFormat(extractor, format) != AMEDIA_OK; |
| if (!isPass) ALOGE("error: getSampleFormat succeeds without any active tracks"); |
| } |
| AMediaFormat_delete(format); |
| AMediaExtractor_delete(extractor); |
| if (srcFp) fclose(srcFp); |
| env->ReleaseStringUTFChars(jsrcPath, csrcPath); |
| return static_cast<jboolean>(isPass); |
| } |
| |
| static jboolean nativeTestVideoSampleFileOffsetByGetSampleFormat(JNIEnv* env, jobject, |
| jstring jsrcPath) { |
| int64_t video_sample_offsets[] = {6522, 95521, 118719, 126219, 137578}; |
| bool isPass = true; |
| const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr); |
| AMediaExtractor* extractor = AMediaExtractor_new(); |
| AMediaFormat* format = AMediaFormat_new(); |
| FILE* srcFp = fopen(csrcPath, "rbe"); |
| if (AMEDIA_OK == setExtractorDataSource(extractor, srcFp)) { |
| if (AMEDIA_OK == AMediaExtractor_selectTrack(extractor, 0 /* video */)) { |
| for(int i = 0; i < sizeof(video_sample_offsets)/sizeof(int64_t); ++i) { |
| if (AMEDIA_OK == AMediaExtractor_getSampleFormat(extractor, format)) { |
| ALOGV("AMediaFormat_toString:%s", AMediaFormat_toString(format)); |
| int64_t offset = 0; |
| if (AMediaFormat_getInt64(format, "sample-file-offset", &offset)) { |
| if (offset != video_sample_offsets[i]) { |
| ALOGD("offset:%lld, video_sample_offsets[%d]:%lld", |
| (long long)offset, i, (long long)video_sample_offsets[i]); |
| isPass = false; |
| break; |
| } |
| } else { |
| ALOGD("error: sample-file-offset not found"); |
| isPass = false; |
| break; |
| } |
| } |
| AMediaExtractor_advance(extractor); |
| } |
| } |
| } |
| AMediaExtractor_delete(extractor); |
| AMediaFormat_delete(format); |
| if (srcFp) fclose(srcFp); |
| env->ReleaseStringUTFChars(jsrcPath, csrcPath); |
| return static_cast<jboolean>(isPass); |
| } |
| |
| static jboolean nativeTestAudioSampleFileOffsetByGetSampleFormat(JNIEnv* env, jobject, |
| jstring jsrcPath) { |
| int64_t audio_sample_offsets[] = {186125, 186682, 187286, 187944, 188551}; |
| bool isPass = true; |
| const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr); |
| AMediaExtractor* extractor = AMediaExtractor_new(); |
| AMediaFormat* format = AMediaFormat_new(); |
| FILE* srcFp = fopen(csrcPath, "rbe"); |
| if (AMEDIA_OK == setExtractorDataSource(extractor, srcFp)) { |
| if (AMEDIA_OK == AMediaExtractor_selectTrack(extractor, 1 /* audio */)) { |
| for(int i = 0; i < sizeof(audio_sample_offsets)/sizeof(int64_t); ++i) { |
| if (AMEDIA_OK == AMediaExtractor_getSampleFormat(extractor, format)) { |
| ALOGV("AMediaFormat_toString:%s", AMediaFormat_toString(format)); |
| int64_t offset = 0; |
| if (AMediaFormat_getInt64(format, "sample-file-offset", &offset)) { |
| if (offset != audio_sample_offsets[i]) { |
| ALOGD("offset:%lld, audio_sample_offsets[%d]:%lld", |
| (long long)offset, i, (long long)audio_sample_offsets[i]); |
| isPass = false; |
| break; |
| } |
| } else { |
| ALOGE("error: sample-file-offset not found"); |
| isPass = false; |
| break; |
| } |
| } |
| AMediaExtractor_advance(extractor); |
| } |
| } |
| } |
| AMediaExtractor_delete(extractor); |
| AMediaFormat_delete(format); |
| if (srcFp) fclose(srcFp); |
| env->ReleaseStringUTFChars(jsrcPath, csrcPath); |
| return static_cast<jboolean>(isPass); |
| } |
| |
| static jboolean nativeTestGetSampleTrackIndexBeforeSetDataSource(JNIEnv*, jobject) { |
| AMediaExtractor* extractor = AMediaExtractor_new(); |
| bool isPass = AMediaExtractor_getSampleTrackIndex(extractor) == -1; |
| if (!isPass) ALOGE("error: received valid track index before setDataSource"); |
| AMediaExtractor_delete(extractor); |
| return static_cast<jboolean>(isPass); |
| } |
| |
| static jboolean nativeTestGetSampleTrackIndexBeforeSelectTrack(JNIEnv* env, jobject, |
| jstring jsrcPath) { |
| bool isPass = false; |
| AMediaExtractor* extractor = AMediaExtractor_new(); |
| const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr); |
| FILE* srcFp = fopen(csrcPath, "rbe"); |
| if (AMEDIA_OK == setExtractorDataSource(extractor, srcFp)) { |
| isPass = AMediaExtractor_getSampleTrackIndex(extractor) == -1; |
| if (!isPass) ALOGE("error: received valid track index without any active tracks"); |
| } |
| AMediaExtractor_delete(extractor); |
| if (srcFp) fclose(srcFp); |
| env->ReleaseStringUTFChars(jsrcPath, csrcPath); |
| return static_cast<jboolean>(isPass); |
| } |
| |
| static jboolean nativeTestGetTrackFormatBeforeSetDataSource(JNIEnv*, jobject) { |
| bool isPass = true; |
| AMediaExtractor* extractor = AMediaExtractor_new(); |
| AMediaFormat* empty = AMediaFormat_new(); |
| AMediaFormat* format = AMediaExtractor_getTrackFormat(extractor, 0); |
| if (format == nullptr || |
| strcmp(AMediaFormat_toString(empty), AMediaFormat_toString(format)) != 0) { |
| isPass = false; |
| ALOGE("error: getTrackFormat before setDataSource yields unexpected result"); |
| } |
| if (format) AMediaFormat_delete(format); |
| AMediaFormat_delete(empty); |
| AMediaExtractor_delete(extractor); |
| return static_cast<jboolean>(isPass); |
| } |
| |
| static jboolean nativeTestGetTrackFormatForInvalidIndex(JNIEnv* env, jobject, jstring jsrcPath) { |
| bool isPass = true; |
| const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr); |
| AMediaExtractor* extractor = AMediaExtractor_new(); |
| FILE* srcFp = fopen(csrcPath, "rbe"); |
| if (AMEDIA_OK == setExtractorDataSource(extractor, srcFp)) { |
| AMediaFormat* format = |
| AMediaExtractor_getTrackFormat(extractor, AMediaExtractor_getTrackCount(extractor)); |
| AMediaFormat* empty = AMediaFormat_new(); |
| if (format == nullptr || |
| strcmp(AMediaFormat_toString(empty), AMediaFormat_toString(format)) != 0) { |
| isPass = false; |
| ALOGE("error: getTrackFormat for out of bound track index %zu yields unexpected result", |
| AMediaExtractor_getTrackCount(extractor)); |
| } |
| if (format) AMediaFormat_delete(format); |
| AMediaFormat_delete(empty); |
| } else { |
| isPass = false; |
| } |
| AMediaExtractor_delete(extractor); |
| if (srcFp) fclose(srcFp); |
| env->ReleaseStringUTFChars(jsrcPath, csrcPath); |
| return static_cast<jboolean>(isPass); |
| } |
| |
| static jboolean nativeTestReadSampleDataBeforeSetDataSource(JNIEnv*, jobject) { |
| AMediaExtractor* extractor = AMediaExtractor_new(); |
| const int maxSampleSize = 512 * 1024; |
| auto buffer = new uint8_t[maxSampleSize]; |
| bool isPass = AMediaExtractor_readSampleData(extractor, buffer, maxSampleSize) < 0; |
| if (!isPass) ALOGE("error: readSampleData return non-negative readBytes before setDataSource"); |
| delete[] buffer; |
| AMediaExtractor_delete(extractor); |
| return static_cast<jboolean>(isPass); |
| } |
| |
| static jboolean nativeTestReadSampleDataBeforeSelectTrack(JNIEnv* env, jobject, jstring jsrcPath) { |
| bool isPass = false; |
| const char* csrcPath = env->GetStringUTFChars(jsrcPath, nullptr); |
| AMediaExtractor* extractor = AMediaExtractor_new(); |
| const int maxSampleSize = (512 * 1024); |
| auto buffer = new uint8_t[maxSampleSize]; |
| FILE* srcFp = fopen(csrcPath, "rbe"); |
| if (AMEDIA_OK == setExtractorDataSource(extractor, srcFp)) { |
| isPass = AMediaExtractor_readSampleData(extractor, buffer, maxSampleSize) < 0; |
| if (!isPass) { |
| ALOGE("error: readSampleData returns non-negative readBytes with out active tracks"); |
| } |
| } |
| delete[] buffer; |
| AMediaExtractor_delete(extractor); |
| if (srcFp) fclose(srcFp); |
| env->ReleaseStringUTFChars(jsrcPath, csrcPath); |
| return static_cast<jboolean>(isPass); |
| } |
| |
| static jboolean nativeTestIfNullLocationIsRejectedBySetDataSource(JNIEnv*, jobject) { |
| AMediaExtractor* extractor = AMediaExtractor_new(); |
| bool isPass = AMediaExtractor_setDataSource(extractor, nullptr) != AMEDIA_OK; |
| if (!isPass) ALOGE("error: setDataSource succeeds with null location"); |
| AMediaExtractor_delete(extractor); |
| return static_cast<jboolean>(isPass); |
| } |
| |
| int registerAndroidMediaV2CtsExtractorUnitTestApi(JNIEnv* env) { |
| const JNINativeMethod methodTable[] = { |
| {"nativeTestGetTrackCountBeforeSetDataSource", "()Z", |
| (void*)nativeTestGetTrackCountBeforeSetDataSource}, |
| {"nativeTestSelectTrackBeforeSetDataSource", "()Z", |
| (void*)nativeTestSelectTrackBeforeSetDataSource}, |
| {"nativeTestSelectTrackForInvalidIndex", "(Ljava/lang/String;)Z", |
| (void*)nativeTestSelectTrackForInvalidIndex}, |
| {"nativeTestIdempotentSelectTrack", "(Ljava/lang/String;)Z", |
| (void*)nativeTestIdempotentSelectTrack}, |
| {"nativeTestUnselectTrackBeforeSetDataSource", "()Z", |
| (void*)nativeTestUnselectTrackBeforeSetDataSource}, |
| {"nativeTestUnselectTrackForInvalidIndex", "(Ljava/lang/String;)Z", |
| (void*)nativeTestUnselectTrackForInvalidIndex}, |
| {"nativeTestUnselectTrackForUnSelectedTrackIndex", "(Ljava/lang/String;)Z", |
| (void*)nativeTestUnselectTrackForUnSelectedTrackIndex}, |
| {"nativeTestIdempotentUnselectTrack", "(Ljava/lang/String;)Z", |
| (void*)nativeTestIdempotentUnselectTrack}, |
| {"nativeTestSeekToBeforeSetDataSource", "()Z", |
| (void*)nativeTestSeekToBeforeSetDataSource}, |
| {"nativeTestSeekToBeforeSelectTrack", "(Ljava/lang/String;)Z", |
| (void*)nativeTestSeekToBeforeSelectTrack}, |
| {"nativeTestGetCachedDurationBeforeSetDataSource", "()Z", |
| (void*)nativeTestGetCachedDurationBeforeSetDataSource}, |
| {"nativeTestIfGetFileFormatSucceedsBeforeSetDataSource", "()Z", |
| (void*)nativeTestIfGetFileFormatSucceedsBeforeSetDataSource}, |
| {"nativeTestAdvanceBeforeSetDataSource", "()Z", |
| (void*)nativeTestAdvanceBeforeSetDataSource}, |
| {"nativeTestAdvanceBeforeSelectTrack", "(Ljava/lang/String;)Z", |
| (void*)nativeTestAdvanceBeforeSelectTrack}, |
| {"nativeTestGetSampleFlagsBeforeSetDataSource", "()Z", |
| (void*)nativeTestGetSampleFlagsBeforeSetDataSource}, |
| {"nativeTestGetSampleFlagsBeforeSelectTrack", "(Ljava/lang/String;)Z", |
| (void*)nativeTestGetSampleFlagsBeforeSelectTrack}, |
| {"nativeTestGetSampleTimeBeforeSetDataSource", "()Z", |
| (void*)nativeTestGetSampleTimeBeforeSetDataSource}, |
| {"nativeTestGetSampleTimeBeforeSelectTrack", "(Ljava/lang/String;)Z", |
| (void*)nativeTestGetSampleTimeBeforeSelectTrack}, |
| {"nativeTestGetSampleSizeBeforeSetDataSource", "()Z", |
| (void*)nativeTestGetSampleSizeBeforeSetDataSource}, |
| {"nativeTestGetSampleSizeBeforeSelectTrack", "(Ljava/lang/String;)Z", |
| (void*)nativeTestGetSampleSizeBeforeSelectTrack}, |
| {"nativeTestIfGetSampleFormatBeforeSetDataSource", "()Z", |
| (void*)nativeTestIfGetSampleFormatBeforeSetDataSource}, |
| {"nativeTestIfGetSampleFormatBeforeSelectTrack", "(Ljava/lang/String;)Z", |
| (void*)nativeTestIfGetSampleFormatBeforeSelectTrack}, |
| {"nativeTestGetSampleTrackIndexBeforeSetDataSource", "()Z", |
| (void*)nativeTestGetSampleTrackIndexBeforeSetDataSource}, |
| {"nativeTestGetSampleTrackIndexBeforeSelectTrack", "(Ljava/lang/String;)Z", |
| (void*)nativeTestGetSampleTrackIndexBeforeSelectTrack}, |
| {"nativeTestGetTrackFormatBeforeSetDataSource", "()Z", |
| (void*)nativeTestGetTrackFormatBeforeSetDataSource}, |
| {"nativeTestGetTrackFormatForInvalidIndex", "(Ljava/lang/String;)Z", |
| (void*)nativeTestGetTrackFormatForInvalidIndex}, |
| {"nativeTestReadSampleDataBeforeSetDataSource", "()Z", |
| (void*)nativeTestReadSampleDataBeforeSetDataSource}, |
| {"nativeTestReadSampleDataBeforeSelectTrack", "(Ljava/lang/String;)Z", |
| (void*)nativeTestReadSampleDataBeforeSelectTrack}, |
| {"nativeTestIfNullLocationIsRejectedBySetDataSource", "()Z", |
| (void*)nativeTestIfNullLocationIsRejectedBySetDataSource}, |
| {"nativeTestVideoSampleFileOffsetByGetSampleFormat", "(Ljava/lang/String;)Z", |
| (void*)nativeTestVideoSampleFileOffsetByGetSampleFormat}, |
| {"nativeTestAudioSampleFileOffsetByGetSampleFormat", "(Ljava/lang/String;)Z", |
| (void*)nativeTestAudioSampleFileOffsetByGetSampleFormat}, |
| }; |
| jclass c = env->FindClass("android/mediav2/cts/ExtractorUnitTest$TestApiNative"); |
| return env->RegisterNatives(c, methodTable, sizeof(methodTable) / sizeof(JNINativeMethod)); |
| } |