android_media_MediaExtractor.cpp revision 7be24522ce2e1821ad45e7ada7c3f91e6814889a
188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber/* 288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * Copyright 2012, The Android Open Source Project 388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * 488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * you may not use this file except in compliance with the License. 688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * You may obtain a copy of the License at 788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * 888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * 1088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * Unless required by applicable law or agreed to in writing, software 1188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 1288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * See the License for the specific language governing permissions and 1488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber * limitations under the License. 1588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber */ 1688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 1788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber//#define LOG_NDEBUG 0 1888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#define LOG_TAG "MediaExtractor-JNI" 1988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#include <utils/Log.h> 2088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 2188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#include "android_media_MediaExtractor.h" 2288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 2388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#include "android_media_Utils.h" 2488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#include "android_runtime/AndroidRuntime.h" 2587eac99a21772ae56018cb81db6966557b459554Ruben Brunk#include "android_runtime/Log.h" 2688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#include "jni.h" 2788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#include "JNIHelp.h" 2888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 29d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber#include <media/IMediaHTTPService.h> 30ab57d03bdb3010d4957fb88c8acb30575ca02ec9Andreas Huber#include <media/hardware/CryptoAPI.h> 3188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#include <media/stagefright/foundation/ABuffer.h> 3288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#include <media/stagefright/foundation/ADebug.h> 3388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#include <media/stagefright/foundation/AMessage.h> 3488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#include <media/stagefright/DataSource.h> 3588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#include <media/stagefright/MediaErrors.h> 3691befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber#include <media/stagefright/MetaData.h> 3788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#include <media/stagefright/NuMediaExtractor.h> 3888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 397be24522ce2e1821ad45e7ada7c3f91e6814889aLajos Molnar#include <nativehelper/ScopedLocalRef.h> 407be24522ce2e1821ad45e7ada7c3f91e6814889aLajos Molnar 41d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber#include "android_util_Binder.h" 42d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 4388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Hubernamespace android { 4488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 4588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstruct fields_t { 4688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jfieldID context; 4791befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber 4891befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber jmethodID cryptoInfoSetID; 4988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}; 5088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 5188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic fields_t gFields; 5288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 53c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissenclass JavaDataSourceBridge : public DataSource { 54c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen jmethodID mReadMethod; 55c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen jmethodID mGetSizeMethod; 56c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen jmethodID mCloseMethod; 57c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen jobject mDataSource; 58c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen public: 59c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen JavaDataSourceBridge(JNIEnv *env, jobject source) { 60c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen mDataSource = env->NewGlobalRef(source); 61c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen 62c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen jclass datasourceclass = env->GetObjectClass(mDataSource); 63c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen CHECK(datasourceclass != NULL); 64c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen 65c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen mReadMethod = env->GetMethodID(datasourceclass, "readAt", "(J[BI)I"); 66c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen CHECK(mReadMethod != NULL); 67c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen 68c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen mGetSizeMethod = env->GetMethodID(datasourceclass, "getSize", "()J"); 69c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen CHECK(mGetSizeMethod != NULL); 70c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen 71c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen mCloseMethod = env->GetMethodID(datasourceclass, "close", "()V"); 72c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen CHECK(mCloseMethod != NULL); 73c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen } 74c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen 75c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen ~JavaDataSourceBridge() { 76c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen JNIEnv *env = AndroidRuntime::getJNIEnv(); 77c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen env->CallVoidMethod(mDataSource, mCloseMethod); 78c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen env->DeleteGlobalRef(mDataSource); 79c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen } 80c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen 81c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen virtual status_t initCheck() const { 82c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen return OK; 83c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen } 84c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen 85c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen virtual ssize_t readAt(off64_t offset, void* buffer, size_t size) { 86c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen JNIEnv *env = AndroidRuntime::getJNIEnv(); 87c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen 88c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen // XXX could optimize this by reusing the same array 89c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen jbyteArray byteArrayObj = env->NewByteArray(size); 90c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen env->DeleteLocalRef(env->GetObjectClass(mDataSource)); 91c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen env->DeleteLocalRef(env->GetObjectClass(byteArrayObj)); 92136c08a7d3678e9fcf22667e75b0904a94add6bbAshok Bhat ssize_t numread = env->CallIntMethod(mDataSource, mReadMethod, offset, byteArrayObj, (jint)size); 93c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen env->GetByteArrayRegion(byteArrayObj, 0, size, (jbyte*) buffer); 94c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen env->DeleteLocalRef(byteArrayObj); 95c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen if (env->ExceptionCheck()) { 96075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat ALOGW("Exception occurred while reading %zu at %lld", size, offset); 97c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen LOGW_EX(env); 98c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen env->ExceptionClear(); 99c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen return -1; 100c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen } 101c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen return numread; 102c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen } 103c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen 104c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen virtual status_t getSize(off64_t *size) { 105c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen JNIEnv *env = AndroidRuntime::getJNIEnv(); 106c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen 107c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen CHECK(size != NULL); 108c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen 109c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen int64_t len = env->CallLongMethod(mDataSource, mGetSizeMethod); 110c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen if (len < 0) { 111c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen *size = ERROR_UNSUPPORTED; 112c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen } else { 113c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen *size = len; 114c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen } 115c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen return OK; 116c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen } 117c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen}; 118c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen 11988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber//////////////////////////////////////////////////////////////////////////////// 12088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 12188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas HuberJMediaExtractor::JMediaExtractor(JNIEnv *env, jobject thiz) 12288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber : mClass(NULL), 12388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber mObject(NULL) { 12488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jclass clazz = env->GetObjectClass(thiz); 12588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber CHECK(clazz != NULL); 12688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 12788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber mClass = (jclass)env->NewGlobalRef(clazz); 12888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber mObject = env->NewWeakGlobalRef(thiz); 12988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 13088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber mImpl = new NuMediaExtractor; 13188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 13288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 13388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas HuberJMediaExtractor::~JMediaExtractor() { 13488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber JNIEnv *env = AndroidRuntime::getJNIEnv(); 13588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 13688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber env->DeleteWeakGlobalRef(mObject); 13788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber mObject = NULL; 13888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber env->DeleteGlobalRef(mClass); 13988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber mClass = NULL; 14088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 14188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 14207ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huberstatus_t JMediaExtractor::setDataSource( 143d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber const sp<IMediaHTTPService> &httpService, 144d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber const char *path, 145d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber const KeyedVector<String8, String8> *headers) { 146d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber return mImpl->setDataSource(httpService, path, headers); 14707ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber} 14807ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber 14907ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huberstatus_t JMediaExtractor::setDataSource(int fd, off64_t offset, off64_t size) { 15007ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber return mImpl->setDataSource(fd, offset, size); 15188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 15288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 153c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissenstatus_t JMediaExtractor::setDataSource(const sp<DataSource> &datasource) { 154c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen return mImpl->setDataSource(datasource); 155c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen} 156c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen 15788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Hubersize_t JMediaExtractor::countTracks() const { 15888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return mImpl->countTracks(); 15988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 16088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 16188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatus_t JMediaExtractor::getTrackFormat(size_t index, jobject *format) const { 16288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber sp<AMessage> msg; 16388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber status_t err; 16488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if ((err = mImpl->getTrackFormat(index, &msg)) != OK) { 16588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return err; 16688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 16788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 16888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber JNIEnv *env = AndroidRuntime::getJNIEnv(); 16988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 17088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return ConvertMessageToMap(env, msg, format); 17188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 17288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 173e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissenstatus_t JMediaExtractor::getFileFormat(jobject *format) const { 174e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissen sp<AMessage> msg; 175e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissen status_t err; 176e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissen if ((err = mImpl->getFileFormat(&msg)) != OK) { 177e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissen return err; 178e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissen } 179e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissen 180e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissen JNIEnv *env = AndroidRuntime::getJNIEnv(); 181e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissen 182e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissen return ConvertMessageToMap(env, msg, format); 183e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissen} 184e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissen 18588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatus_t JMediaExtractor::selectTrack(size_t index) { 18688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return mImpl->selectTrack(index); 18788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 18888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 189f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huberstatus_t JMediaExtractor::unselectTrack(size_t index) { 190f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber return mImpl->unselectTrack(index); 191f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber} 192f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber 193f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huberstatus_t JMediaExtractor::seekTo( 194f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber int64_t timeUs, MediaSource::ReadOptions::SeekMode mode) { 195f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber return mImpl->seekTo(timeUs, mode); 19688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 19788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 19888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatus_t JMediaExtractor::advance() { 19988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return mImpl->advance(); 20088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 20188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 20288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatus_t JMediaExtractor::readSampleData( 20388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jobject byteBuf, size_t offset, size_t *sampleSize) { 20488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber JNIEnv *env = AndroidRuntime::getJNIEnv(); 20588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 20688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber void *dst = env->GetDirectBufferAddress(byteBuf); 20788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 208075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat size_t dstSize; 209c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber jbyteArray byteArray = NULL; 210c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber 2117be24522ce2e1821ad45e7ada7c3f91e6814889aLajos Molnar ScopedLocalRef<jclass> byteBufClass(env, env->FindClass("java/nio/ByteBuffer")); 2127be24522ce2e1821ad45e7ada7c3f91e6814889aLajos Molnar CHECK(byteBufClass.get() != NULL); 213c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber 2147be24522ce2e1821ad45e7ada7c3f91e6814889aLajos Molnar if (dst == NULL) { 215c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber jmethodID arrayID = 2167be24522ce2e1821ad45e7ada7c3f91e6814889aLajos Molnar env->GetMethodID(byteBufClass.get(), "array", "()[B"); 217c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber CHECK(arrayID != NULL); 218c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber 219c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber byteArray = 220c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber (jbyteArray)env->CallObjectMethod(byteBuf, arrayID); 221c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber 222c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber if (byteArray == NULL) { 223c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber return INVALID_OPERATION; 224c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber } 22588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 226c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber jboolean isCopy; 227c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber dst = env->GetByteArrayElements(byteArray, &isCopy); 228c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber 229075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat dstSize = (size_t) env->GetArrayLength(byteArray); 230c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber } else { 231075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat dstSize = (size_t) env->GetDirectBufferCapacity(byteBuf); 232c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber } 23388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 23488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (dstSize < offset) { 235c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber if (byteArray != NULL) { 236c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber env->ReleaseByteArrayElements(byteArray, (jbyte *)dst, 0); 237c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber } 238c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber 23988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return -ERANGE; 24088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 24188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 24288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber sp<ABuffer> buffer = new ABuffer((char *)dst + offset, dstSize - offset); 24388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 24488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber status_t err = mImpl->readSampleData(buffer); 24588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 246c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber if (byteArray != NULL) { 247c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber env->ReleaseByteArrayElements(byteArray, (jbyte *)dst, 0); 248c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber } 249c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber 25088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (err != OK) { 25188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return err; 25288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 25388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 25488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber *sampleSize = buffer->size(); 25588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 2567be24522ce2e1821ad45e7ada7c3f91e6814889aLajos Molnar jmethodID positionID = env->GetMethodID( 2577be24522ce2e1821ad45e7ada7c3f91e6814889aLajos Molnar byteBufClass.get(), "position", "(I)Ljava/nio/Buffer;"); 2587be24522ce2e1821ad45e7ada7c3f91e6814889aLajos Molnar 2597be24522ce2e1821ad45e7ada7c3f91e6814889aLajos Molnar CHECK(positionID != NULL); 2607be24522ce2e1821ad45e7ada7c3f91e6814889aLajos Molnar 2617be24522ce2e1821ad45e7ada7c3f91e6814889aLajos Molnar jmethodID limitID = env->GetMethodID( 2627be24522ce2e1821ad45e7ada7c3f91e6814889aLajos Molnar byteBufClass.get(), "limit", "(I)Ljava/nio/Buffer;"); 2637be24522ce2e1821ad45e7ada7c3f91e6814889aLajos Molnar 2647be24522ce2e1821ad45e7ada7c3f91e6814889aLajos Molnar CHECK(limitID != NULL); 2657be24522ce2e1821ad45e7ada7c3f91e6814889aLajos Molnar 2667be24522ce2e1821ad45e7ada7c3f91e6814889aLajos Molnar jobject me = env->CallObjectMethod( 2677be24522ce2e1821ad45e7ada7c3f91e6814889aLajos Molnar byteBuf, limitID, offset + *sampleSize); 2687be24522ce2e1821ad45e7ada7c3f91e6814889aLajos Molnar env->DeleteLocalRef(me); 2697be24522ce2e1821ad45e7ada7c3f91e6814889aLajos Molnar me = env->CallObjectMethod( 2707be24522ce2e1821ad45e7ada7c3f91e6814889aLajos Molnar byteBuf, positionID, offset); 2717be24522ce2e1821ad45e7ada7c3f91e6814889aLajos Molnar env->DeleteLocalRef(me); 2727be24522ce2e1821ad45e7ada7c3f91e6814889aLajos Molnar me = NULL; 2737be24522ce2e1821ad45e7ada7c3f91e6814889aLajos Molnar 27488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return OK; 27588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 27688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 27788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatus_t JMediaExtractor::getSampleTrackIndex(size_t *trackIndex) { 27888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return mImpl->getSampleTrackIndex(trackIndex); 27988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 28088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 28188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatus_t JMediaExtractor::getSampleTime(int64_t *sampleTimeUs) { 28288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return mImpl->getSampleTime(sampleTimeUs); 28388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 28488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 2859b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huberstatus_t JMediaExtractor::getSampleFlags(uint32_t *sampleFlags) { 28691befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber *sampleFlags = 0; 28791befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber 28891befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber sp<MetaData> meta; 28991befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber status_t err = mImpl->getSampleMeta(&meta); 29091befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber 29191befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber if (err != OK) { 29291befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber return err; 29391befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber } 29491befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber 29591befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber int32_t val; 29691befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber if (meta->findInt32(kKeyIsSyncFrame, &val) && val != 0) { 29791befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber (*sampleFlags) |= NuMediaExtractor::SAMPLE_FLAG_SYNC; 29891befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber } 29991befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber 30091befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber uint32_t type; 30191befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber const void *data; 30291befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber size_t size; 30391befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber if (meta->findData(kKeyEncryptedSizes, &type, &data, &size)) { 30491befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber (*sampleFlags) |= NuMediaExtractor::SAMPLE_FLAG_ENCRYPTED; 30591befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber } 30691befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber 30791befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber return OK; 30891befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber} 30991befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber 31091befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huberstatus_t JMediaExtractor::getSampleMeta(sp<MetaData> *sampleMeta) { 31191befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber return mImpl->getSampleMeta(sampleMeta); 3129b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber} 3139b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber 31474a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huberbool JMediaExtractor::getCachedDuration(int64_t *durationUs, bool *eos) const { 31574a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber return mImpl->getCachedDuration(durationUs, eos); 31674a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber} 31774a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber 31888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} // namespace android 31988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 32088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber//////////////////////////////////////////////////////////////////////////////// 32188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 32288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberusing namespace android; 32388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 32488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic sp<JMediaExtractor> setMediaExtractor( 32588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber JNIEnv *env, jobject thiz, const sp<JMediaExtractor> &extractor) { 32688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber sp<JMediaExtractor> old = 327075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat (JMediaExtractor *)env->GetLongField(thiz, gFields.context); 32888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 32988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (extractor != NULL) { 33088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber extractor->incStrong(thiz); 33188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 33288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (old != NULL) { 33388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber old->decStrong(thiz); 33488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 335075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat env->SetLongField(thiz, gFields.context, (jlong)extractor.get()); 33688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 33788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return old; 33888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 33988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 34088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic sp<JMediaExtractor> getMediaExtractor(JNIEnv *env, jobject thiz) { 341075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (JMediaExtractor *)env->GetLongField(thiz, gFields.context); 34288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 34388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 34488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic void android_media_MediaExtractor_release(JNIEnv *env, jobject thiz) { 34588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber setMediaExtractor(env, thiz, NULL); 34688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 34788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 34860d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huberstatic jint android_media_MediaExtractor_getTrackCount( 34988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber JNIEnv *env, jobject thiz) { 35088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz); 35188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 35288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (extractor == NULL) { 35388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jniThrowException(env, "java/lang/IllegalStateException", NULL); 35407ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber return -1; 35588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 35688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 357075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) extractor->countTracks(); 35888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 35988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 36060d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huberstatic jobject android_media_MediaExtractor_getTrackFormatNative( 36188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber JNIEnv *env, jobject thiz, jint index) { 36288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz); 36388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 36488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (extractor == NULL) { 36588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jniThrowException(env, "java/lang/IllegalStateException", NULL); 36688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return NULL; 36788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 36888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 36988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jobject format; 37088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber status_t err = extractor->getTrackFormat(index, &format); 37188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 37288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (err != OK) { 37388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 37488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return NULL; 37588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 37688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 37788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return format; 37888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 37988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 380e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissenstatic jobject android_media_MediaExtractor_getFileFormatNative( 381e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissen JNIEnv *env, jobject thiz) { 382e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissen sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz); 383e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissen 384e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissen if (extractor == NULL) { 385e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissen jniThrowException(env, "java/lang/IllegalStateException", NULL); 386e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissen return NULL; 387e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissen } 388e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissen 389e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissen jobject format; 390e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissen status_t err = extractor->getFileFormat(&format); 391e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissen 392e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissen if (err != OK) { 393e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissen jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 394e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissen return NULL; 395e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissen } 396e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissen 397e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissen return format; 398e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissen} 399e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissen 40088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic void android_media_MediaExtractor_selectTrack( 40188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber JNIEnv *env, jobject thiz, jint index) { 40288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz); 40388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 40488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (extractor == NULL) { 40588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jniThrowException(env, "java/lang/IllegalStateException", NULL); 40688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return; 40788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 40888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 40988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber status_t err = extractor->selectTrack(index); 41088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 41188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (err != OK) { 41288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 41388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return; 41488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 41588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 41688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 417f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huberstatic void android_media_MediaExtractor_unselectTrack( 418f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber JNIEnv *env, jobject thiz, jint index) { 419f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz); 420f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber 421f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber if (extractor == NULL) { 422f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber jniThrowException(env, "java/lang/IllegalStateException", NULL); 423f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber return; 424f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber } 425f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber 426f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber status_t err = extractor->unselectTrack(index); 427f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber 428f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber if (err != OK) { 429f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 430f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber return; 431f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber } 432f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber} 433f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber 43488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic void android_media_MediaExtractor_seekTo( 435f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber JNIEnv *env, jobject thiz, jlong timeUs, jint mode) { 43688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz); 43788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 43888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (extractor == NULL) { 43988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jniThrowException(env, "java/lang/IllegalStateException", NULL); 44088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return; 44188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 44288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 443f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber if (mode < MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC 444f86374adec8bd77af7b012f788ea59575296facbAndreas Huber || mode >= MediaSource::ReadOptions::SEEK_CLOSEST) { 445f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 446f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber return; 447f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber } 448f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber 449f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber extractor->seekTo(timeUs, (MediaSource::ReadOptions::SeekMode)mode); 45088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 45188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 45288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic jboolean android_media_MediaExtractor_advance( 45388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber JNIEnv *env, jobject thiz) { 45488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz); 45588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 45688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (extractor == NULL) { 45788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jniThrowException(env, "java/lang/IllegalStateException", NULL); 458075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_FALSE; 45988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 46088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 46188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber status_t err = extractor->advance(); 46288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 46388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (err == ERROR_END_OF_STREAM) { 464075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_FALSE; 46588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } else if (err != OK) { 46688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 467075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_FALSE; 46888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 46988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 470075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_TRUE; 47188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 47288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 47388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic jint android_media_MediaExtractor_readSampleData( 47488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber JNIEnv *env, jobject thiz, jobject byteBuf, jint offset) { 47588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz); 47688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 47788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (extractor == NULL) { 47888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jniThrowException(env, "java/lang/IllegalStateException", NULL); 47988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return -1; 48088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 48188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 48288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber size_t sampleSize; 48388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber status_t err = extractor->readSampleData(byteBuf, offset, &sampleSize); 48488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 48588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (err == ERROR_END_OF_STREAM) { 48688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return -1; 48788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } else if (err != OK) { 48888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 489075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return -1; 49088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 49188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 492075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) sampleSize; 49388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 49488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 49588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic jint android_media_MediaExtractor_getSampleTrackIndex( 49688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber JNIEnv *env, jobject thiz) { 49788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz); 49888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 49988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (extractor == NULL) { 50088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jniThrowException(env, "java/lang/IllegalStateException", NULL); 50188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return -1; 50288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 50388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 50488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber size_t trackIndex; 50588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber status_t err = extractor->getSampleTrackIndex(&trackIndex); 50688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 50788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (err == ERROR_END_OF_STREAM) { 50888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return -1; 50988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } else if (err != OK) { 51088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 511075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return -1; 51288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 51388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 514075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) trackIndex; 51588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 51688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 51788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic jlong android_media_MediaExtractor_getSampleTime( 51888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber JNIEnv *env, jobject thiz) { 51988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz); 52088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 52188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (extractor == NULL) { 52288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jniThrowException(env, "java/lang/IllegalStateException", NULL); 52388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return -1ll; 52488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 52588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 52688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber int64_t sampleTimeUs; 52788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber status_t err = extractor->getSampleTime(&sampleTimeUs); 52888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 52988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (err == ERROR_END_OF_STREAM) { 53088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return -1ll; 53188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } else if (err != OK) { 53288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 533075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return -1ll; 53488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 53588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 536075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jlong) sampleTimeUs; 53788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 53888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 5399b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huberstatic jint android_media_MediaExtractor_getSampleFlags( 5409b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber JNIEnv *env, jobject thiz) { 5419b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz); 5429b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber 5439b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber if (extractor == NULL) { 5449b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber jniThrowException(env, "java/lang/IllegalStateException", NULL); 545075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return -1; 5469b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber } 5479b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber 5489b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber uint32_t sampleFlags; 5499b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber status_t err = extractor->getSampleFlags(&sampleFlags); 5509b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber 5519b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber if (err == ERROR_END_OF_STREAM) { 552075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return -1; 5539b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber } else if (err != OK) { 5549b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 555075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return -1; 5569b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber } 5579b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber 558075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jint) sampleFlags; 5599b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber} 5609b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber 56191befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huberstatic jboolean android_media_MediaExtractor_getSampleCryptoInfo( 56291befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber JNIEnv *env, jobject thiz, jobject cryptoInfoObj) { 56391befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz); 56491befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber 56591befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber if (extractor == NULL) { 56691befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber jniThrowException(env, "java/lang/IllegalStateException", NULL); 567075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_FALSE; 56891befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber } 56991befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber 57091befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber sp<MetaData> meta; 57191befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber status_t err = extractor->getSampleMeta(&meta); 57291befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber 57391befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber if (err != OK) { 574075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_FALSE; 57591befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber } 57691befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber 57791befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber uint32_t type; 57891befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber const void *data; 57991befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber size_t size; 58091befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber if (!meta->findData(kKeyEncryptedSizes, &type, &data, &size)) { 581075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_FALSE; 58291befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber } 58391befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber 584e92416dfeb115939231819c5edb593b8bb81cc6dAshok Bhat size_t numSubSamples = size / sizeof(int32_t); 58591befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber 58691befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber if (numSubSamples == 0) { 587075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_FALSE; 58891befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber } 58991befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber 59091befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber jintArray numBytesOfEncryptedDataObj = env->NewIntArray(numSubSamples); 59191befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber jboolean isCopy; 59291befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber jint *dst = env->GetIntArrayElements(numBytesOfEncryptedDataObj, &isCopy); 59391befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber for (size_t i = 0; i < numSubSamples; ++i) { 594e92416dfeb115939231819c5edb593b8bb81cc6dAshok Bhat dst[i] = ((const int32_t *)data)[i]; 59591befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber } 59691befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber env->ReleaseIntArrayElements(numBytesOfEncryptedDataObj, dst, 0); 59791befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber dst = NULL; 59891befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber 59991befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber size_t encSize = size; 60091befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber jintArray numBytesOfPlainDataObj = NULL; 601ab57d03bdb3010d4957fb88c8acb30575ca02ec9Andreas Huber if (meta->findData(kKeyPlainSizes, &type, &data, &size)) { 60291befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber if (size != encSize) { 60391befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber // The two must be of the same length. 604075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_FALSE; 60591befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber } 60691befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber 60791befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber numBytesOfPlainDataObj = env->NewIntArray(numSubSamples); 60891befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber jboolean isCopy; 60991befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber jint *dst = env->GetIntArrayElements(numBytesOfPlainDataObj, &isCopy); 61091befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber for (size_t i = 0; i < numSubSamples; ++i) { 611e92416dfeb115939231819c5edb593b8bb81cc6dAshok Bhat dst[i] = ((const int32_t *)data)[i]; 61291befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber } 61391befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber env->ReleaseIntArrayElements(numBytesOfPlainDataObj, dst, 0); 61491befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber dst = NULL; 61591befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber } 61691befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber 61791befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber jbyteArray keyObj = NULL; 61891befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber if (meta->findData(kKeyCryptoKey, &type, &data, &size)) { 61991befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber if (size != 16) { 62091befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber // Keys must be 16 bytes in length. 621075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_FALSE; 62291befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber } 62391befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber 62491befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber keyObj = env->NewByteArray(size); 62591befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber jboolean isCopy; 62691befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber jbyte *dst = env->GetByteArrayElements(keyObj, &isCopy); 62791befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber memcpy(dst, data, size); 62891befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber env->ReleaseByteArrayElements(keyObj, dst, 0); 62991befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber dst = NULL; 63091befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber } 63191befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber 63291befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber jbyteArray ivObj = NULL; 63391befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber if (meta->findData(kKeyCryptoIV, &type, &data, &size)) { 63491befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber if (size != 16) { 63591befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber // IVs must be 16 bytes in length. 636075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_FALSE; 63791befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber } 63891befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber 63991befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber ivObj = env->NewByteArray(size); 64091befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber jboolean isCopy; 64191befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber jbyte *dst = env->GetByteArrayElements(ivObj, &isCopy); 64291befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber memcpy(dst, data, size); 64391befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber env->ReleaseByteArrayElements(ivObj, dst, 0); 64491befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber dst = NULL; 64591befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber } 64691befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber 64791befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber int32_t mode; 64891befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber if (!meta->findInt32(kKeyCryptoMode, &mode)) { 649ab57d03bdb3010d4957fb88c8acb30575ca02ec9Andreas Huber mode = CryptoPlugin::kMode_AES_CTR; 65091befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber } 65191befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber 65291befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber env->CallVoidMethod( 65391befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber cryptoInfoObj, 65491befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber gFields.cryptoInfoSetID, 655136c08a7d3678e9fcf22667e75b0904a94add6bbAshok Bhat (jint)numSubSamples, 65691befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber numBytesOfPlainDataObj, 65791befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber numBytesOfEncryptedDataObj, 65891befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber keyObj, 65991befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber ivObj, 66091befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber mode); 66191befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber 662075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_TRUE; 66391befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber} 66491befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber 66588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic void android_media_MediaExtractor_native_init(JNIEnv *env) { 66688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jclass clazz = env->FindClass("android/media/MediaExtractor"); 66788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber CHECK(clazz != NULL); 66888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 669075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat gFields.context = env->GetFieldID(clazz, "mNativeContext", "J"); 67088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber CHECK(gFields.context != NULL); 67188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 67291befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber clazz = env->FindClass("android/media/MediaCodec$CryptoInfo"); 67391befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber CHECK(clazz != NULL); 67491befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber 67591befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber gFields.cryptoInfoSetID = 67691befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber env->GetMethodID(clazz, "set", "(I[I[I[B[BI)V"); 67791befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber 67888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber DataSource::RegisterDefaultSniffers(); 67988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 68088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 68188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic void android_media_MediaExtractor_native_setup( 68207ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber JNIEnv *env, jobject thiz) { 68388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber sp<JMediaExtractor> extractor = new JMediaExtractor(env, thiz); 68407ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber setMediaExtractor(env,thiz, extractor); 68507ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber} 68688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 68707ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huberstatic void android_media_MediaExtractor_setDataSource( 68807ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber JNIEnv *env, jobject thiz, 689d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber jobject httpServiceBinderObj, 690d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber jstring pathObj, 691d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber jobjectArray keysArray, 692d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber jobjectArray valuesArray) { 69307ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz); 69407ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber 69507ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber if (extractor == NULL) { 69607ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber jniThrowException(env, "java/lang/IllegalStateException", NULL); 69707ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber return; 69807ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber } 69907ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber 70007ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber if (pathObj == NULL) { 70188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 70288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return; 70388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 70488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 70507ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber KeyedVector<String8, String8> headers; 70607ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber if (!ConvertKeyValueArraysToKeyedVector( 70707ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber env, keysArray, valuesArray, &headers)) { 70807ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber return; 70907ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber } 71088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 71107ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber const char *path = env->GetStringUTFChars(pathObj, NULL); 71207ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber 71307ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber if (path == NULL) { 71488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return; 71588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 71688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 717d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber sp<IMediaHTTPService> httpService; 718d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber if (httpServiceBinderObj != NULL) { 719d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber sp<IBinder> binder = ibinderForJavaObject(env, httpServiceBinderObj); 720d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber httpService = interface_cast<IMediaHTTPService>(binder); 721d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber } 722d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber 723d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber status_t err = extractor->setDataSource(httpService, path, &headers); 72488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 72507ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber env->ReleaseStringUTFChars(pathObj, path); 72607ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber path = NULL; 72788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 72888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (err != OK) { 72988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jniThrowException( 73088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber env, 73188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber "java/io/IOException", 73288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber "Failed to instantiate extractor."); 73388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return; 73488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 73507ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber} 73688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 73707ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huberstatic void android_media_MediaExtractor_setDataSourceFd( 73807ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber JNIEnv *env, jobject thiz, 73907ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber jobject fileDescObj, jlong offset, jlong length) { 74007ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz); 74107ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber 74207ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber if (extractor == NULL) { 74307ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber jniThrowException(env, "java/lang/IllegalStateException", NULL); 74407ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber return; 74507ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber } 74607ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber 74707ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber if (fileDescObj == NULL) { 74807ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 74907ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber return; 75007ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber } 75107ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber 75207ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber int fd = jniGetFDFromFileDescriptor(env, fileDescObj); 75307ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber 75407ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber status_t err = extractor->setDataSource(fd, offset, length); 75507ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber 75607ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber if (err != OK) { 75707ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber jniThrowException( 75807ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber env, 75907ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber "java/io/IOException", 76007ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber "Failed to instantiate extractor."); 76107ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber return; 76207ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber } 76388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 76488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 765c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissenstatic void android_media_MediaExtractor_setDataSourceCallback( 766c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen JNIEnv *env, jobject thiz, 767c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen jobject callbackObj) { 768c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz); 769c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen 770c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen if (extractor == NULL) { 771c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen jniThrowException(env, "java/lang/IllegalStateException", NULL); 772c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen return; 773c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen } 774c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen 775c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen if (callbackObj == NULL) { 776c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 777c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen return; 778c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen } 779c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen 780c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen sp<JavaDataSourceBridge> bridge = new JavaDataSourceBridge(env, callbackObj); 781c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen status_t err = extractor->setDataSource(bridge); 782c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen 783c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen if (err != OK) { 784c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen jniThrowException( 785c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen env, 786c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen "java/io/IOException", 787c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen "Failed to instantiate extractor."); 788c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen return; 789c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen } 790c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen} 791c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen 79274a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huberstatic jlong android_media_MediaExtractor_getCachedDurationUs( 79374a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber JNIEnv *env, jobject thiz) { 79474a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz); 79574a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber 79674a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber if (extractor == NULL) { 79774a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber jniThrowException(env, "java/lang/IllegalStateException", NULL); 79874a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber return -1ll; 79974a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber } 80074a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber 80174a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber int64_t cachedDurationUs; 80274a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber bool eos; 80374a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber if (!extractor->getCachedDuration(&cachedDurationUs, &eos)) { 80474a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber return -1ll; 80574a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber } 80674a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber 807075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return (jlong) cachedDurationUs; 80874a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber} 80974a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber 81074a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huberstatic jboolean android_media_MediaExtractor_hasCacheReachedEOS( 81174a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber JNIEnv *env, jobject thiz) { 81274a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz); 81374a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber 81474a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber if (extractor == NULL) { 81574a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber jniThrowException(env, "java/lang/IllegalStateException", NULL); 816075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_TRUE; 81774a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber } 81874a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber 81974a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber int64_t cachedDurationUs; 82074a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber bool eos; 82174a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber if (!extractor->getCachedDuration(&cachedDurationUs, &eos)) { 822075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return JNI_TRUE; 82374a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber } 82474a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber 825075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat return eos ? JNI_TRUE : JNI_FALSE; 82674a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber} 82774a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber 82888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic void android_media_MediaExtractor_native_finalize( 82988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber JNIEnv *env, jobject thiz) { 83088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber android_media_MediaExtractor_release(env, thiz); 83188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 83288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 83388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic JNINativeMethod gMethods[] = { 83488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber { "release", "()V", (void *)android_media_MediaExtractor_release }, 83588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 83660d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber { "getTrackCount", "()I", (void *)android_media_MediaExtractor_getTrackCount }, 83788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 838e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissen { "getFileFormatNative", "()Ljava/util/Map;", 839e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissen (void *)android_media_MediaExtractor_getFileFormatNative }, 840e20a6d5c479909f37af748a81a6e5a5deb7b6e2cMarco Nelissen 84160d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber { "getTrackFormatNative", "(I)Ljava/util/Map;", 84260d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber (void *)android_media_MediaExtractor_getTrackFormatNative }, 84388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 84488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber { "selectTrack", "(I)V", (void *)android_media_MediaExtractor_selectTrack }, 84588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 846f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber { "unselectTrack", "(I)V", 847f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber (void *)android_media_MediaExtractor_unselectTrack }, 848f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber 849f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber { "seekTo", "(JI)V", (void *)android_media_MediaExtractor_seekTo }, 85088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 85188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber { "advance", "()Z", (void *)android_media_MediaExtractor_advance }, 85288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 85388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber { "readSampleData", "(Ljava/nio/ByteBuffer;I)I", 85488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber (void *)android_media_MediaExtractor_readSampleData }, 85588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 85688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber { "getSampleTrackIndex", "()I", 85788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber (void *)android_media_MediaExtractor_getSampleTrackIndex }, 85888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 85988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber { "getSampleTime", "()J", 86088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber (void *)android_media_MediaExtractor_getSampleTime }, 86188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 8629b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber { "getSampleFlags", "()I", 8639b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber (void *)android_media_MediaExtractor_getSampleFlags }, 8649b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber 86591befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber { "getSampleCryptoInfo", "(Landroid/media/MediaCodec$CryptoInfo;)Z", 86691befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber (void *)android_media_MediaExtractor_getSampleCryptoInfo }, 86791befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber 86888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber { "native_init", "()V", (void *)android_media_MediaExtractor_native_init }, 86988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 87007ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber { "native_setup", "()V", 87188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber (void *)android_media_MediaExtractor_native_setup }, 87288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 87388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber { "native_finalize", "()V", 87488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber (void *)android_media_MediaExtractor_native_finalize }, 87507ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber 876d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber { "nativeSetDataSource", 877d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber "(Landroid/os/IBinder;Ljava/lang/String;[Ljava/lang/String;" 878d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber "[Ljava/lang/String;)V", 87907ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber (void *)android_media_MediaExtractor_setDataSource }, 88007ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber 88107ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber { "setDataSource", "(Ljava/io/FileDescriptor;JJ)V", 88207ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber (void *)android_media_MediaExtractor_setDataSourceFd }, 88374a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber 884c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen { "setDataSource", "(Landroid/media/DataSource;)V", 885c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen (void *)android_media_MediaExtractor_setDataSourceCallback }, 886c209a06cfdcf633f12a299245312e3ac32bff27cMarco Nelissen 88774a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber { "getCachedDuration", "()J", 88874a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber (void *)android_media_MediaExtractor_getCachedDurationUs }, 88974a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber 89074a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber { "hasCacheReachedEndOfStream", "()Z", 89174a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber (void *)android_media_MediaExtractor_hasCacheReachedEOS }, 89288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}; 89388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 89488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberint register_android_media_MediaExtractor(JNIEnv *env) { 89588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return AndroidRuntime::registerNativeMethods(env, 89688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber "android/media/MediaExtractor", gMethods, NELEM(gMethods)); 89788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 898