android_media_MediaExtractor.cpp revision 9b8e496f4d143280deff137c5f30ca8907bc28db
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" 2588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#include "jni.h" 2688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#include "JNIHelp.h" 2788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 2888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#include <media/stagefright/foundation/ABuffer.h> 2988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#include <media/stagefright/foundation/ADebug.h> 3088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#include <media/stagefright/foundation/AMessage.h> 3188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#include <media/stagefright/DataSource.h> 3288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#include <media/stagefright/MediaErrors.h> 3388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#include <media/stagefright/NuMediaExtractor.h> 3488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 3588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Hubernamespace android { 3688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 3788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstruct fields_t { 3888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jfieldID context; 3988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}; 4088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 4188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic fields_t gFields; 4288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 4388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber//////////////////////////////////////////////////////////////////////////////// 4488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 4588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas HuberJMediaExtractor::JMediaExtractor(JNIEnv *env, jobject thiz) 4688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber : mClass(NULL), 4788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber mObject(NULL) { 4888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jclass clazz = env->GetObjectClass(thiz); 4988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber CHECK(clazz != NULL); 5088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 5188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber mClass = (jclass)env->NewGlobalRef(clazz); 5288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber mObject = env->NewWeakGlobalRef(thiz); 5388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 5488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber mImpl = new NuMediaExtractor; 5588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 5688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 5788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas HuberJMediaExtractor::~JMediaExtractor() { 5888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber JNIEnv *env = AndroidRuntime::getJNIEnv(); 5988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 6088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber env->DeleteWeakGlobalRef(mObject); 6188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber mObject = NULL; 6288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber env->DeleteGlobalRef(mClass); 6388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber mClass = NULL; 6488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 6588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 6688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatus_t JMediaExtractor::setDataSource(const char *path) { 6788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return mImpl->setDataSource(path); 6888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 6988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 7088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Hubersize_t JMediaExtractor::countTracks() const { 7188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return mImpl->countTracks(); 7288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 7388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 7488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatus_t JMediaExtractor::getTrackFormat(size_t index, jobject *format) const { 7588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber sp<AMessage> msg; 7688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber status_t err; 7788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if ((err = mImpl->getTrackFormat(index, &msg)) != OK) { 7888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return err; 7988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 8088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 8188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber JNIEnv *env = AndroidRuntime::getJNIEnv(); 8288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 8388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return ConvertMessageToMap(env, msg, format); 8488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 8588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 8688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatus_t JMediaExtractor::selectTrack(size_t index) { 8788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return mImpl->selectTrack(index); 8888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 8988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 9088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatus_t JMediaExtractor::seekTo(int64_t timeUs) { 9188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return mImpl->seekTo(timeUs); 9288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 9388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 9488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatus_t JMediaExtractor::advance() { 9588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return mImpl->advance(); 9688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 9788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 9888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatus_t JMediaExtractor::readSampleData( 9988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jobject byteBuf, size_t offset, size_t *sampleSize) { 10088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber JNIEnv *env = AndroidRuntime::getJNIEnv(); 10188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 10288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber void *dst = env->GetDirectBufferAddress(byteBuf); 10388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 104c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber jlong dstSize; 105c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber jbyteArray byteArray = NULL; 106c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber 10788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (dst == NULL) { 108c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber jclass byteBufClass = env->FindClass("java/nio/ByteBuffer"); 109c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber CHECK(byteBufClass != NULL); 110c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber 111c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber jmethodID arrayID = 112c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber env->GetMethodID(byteBufClass, "array", "()[B"); 113c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber CHECK(arrayID != NULL); 114c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber 115c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber byteArray = 116c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber (jbyteArray)env->CallObjectMethod(byteBuf, arrayID); 117c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber 118c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber if (byteArray == NULL) { 119c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber return INVALID_OPERATION; 120c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber } 12188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 122c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber jboolean isCopy; 123c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber dst = env->GetByteArrayElements(byteArray, &isCopy); 124c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber 125c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber dstSize = env->GetArrayLength(byteArray); 126c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber } else { 127c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber dstSize = env->GetDirectBufferCapacity(byteBuf); 128c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber } 12988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 13088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (dstSize < offset) { 131c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber if (byteArray != NULL) { 132c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber env->ReleaseByteArrayElements(byteArray, (jbyte *)dst, 0); 133c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber } 134c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber 13588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return -ERANGE; 13688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 13788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 13888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber sp<ABuffer> buffer = new ABuffer((char *)dst + offset, dstSize - offset); 13988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 14088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber status_t err = mImpl->readSampleData(buffer); 14188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 142c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber if (byteArray != NULL) { 143c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber env->ReleaseByteArrayElements(byteArray, (jbyte *)dst, 0); 144c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber } 145c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber 14688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (err != OK) { 14788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return err; 14888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 14988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 15088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber *sampleSize = buffer->size(); 15188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 15288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return OK; 15388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 15488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 15588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatus_t JMediaExtractor::getSampleTrackIndex(size_t *trackIndex) { 15688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return mImpl->getSampleTrackIndex(trackIndex); 15788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 15888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 15988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatus_t JMediaExtractor::getSampleTime(int64_t *sampleTimeUs) { 16088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return mImpl->getSampleTime(sampleTimeUs); 16188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 16288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 1639b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huberstatus_t JMediaExtractor::getSampleFlags(uint32_t *sampleFlags) { 1649b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber return mImpl->getSampleFlags(sampleFlags); 1659b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber} 1669b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber 16788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} // namespace android 16888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 16988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber//////////////////////////////////////////////////////////////////////////////// 17088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 17188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberusing namespace android; 17288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 17388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic sp<JMediaExtractor> setMediaExtractor( 17488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber JNIEnv *env, jobject thiz, const sp<JMediaExtractor> &extractor) { 17588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber sp<JMediaExtractor> old = 17688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber (JMediaExtractor *)env->GetIntField(thiz, gFields.context); 17788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 17888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (extractor != NULL) { 17988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber extractor->incStrong(thiz); 18088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 18188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (old != NULL) { 18288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber old->decStrong(thiz); 18388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 18488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber env->SetIntField(thiz, gFields.context, (int)extractor.get()); 18588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 18688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return old; 18788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 18888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 18988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic sp<JMediaExtractor> getMediaExtractor(JNIEnv *env, jobject thiz) { 19088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return (JMediaExtractor *)env->GetIntField(thiz, gFields.context); 19188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 19288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 19388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic void android_media_MediaExtractor_release(JNIEnv *env, jobject thiz) { 19488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber setMediaExtractor(env, thiz, NULL); 19588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 19688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 19788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic jint android_media_MediaExtractor_countTracks( 19888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber JNIEnv *env, jobject thiz) { 19988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz); 20088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 20188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (extractor == NULL) { 20288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jniThrowException(env, "java/lang/IllegalStateException", NULL); 20388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return NULL; 20488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 20588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 20688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return extractor->countTracks(); 20788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 20888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 20988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic jobject android_media_MediaExtractor_getTrackFormat( 21088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber JNIEnv *env, jobject thiz, jint index) { 21188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz); 21288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 21388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (extractor == NULL) { 21488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jniThrowException(env, "java/lang/IllegalStateException", NULL); 21588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return NULL; 21688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 21788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 21888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jobject format; 21988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber status_t err = extractor->getTrackFormat(index, &format); 22088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 22188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (err != OK) { 22288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 22388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return NULL; 22488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 22588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 22688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return format; 22788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 22888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 22988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic void android_media_MediaExtractor_selectTrack( 23088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber JNIEnv *env, jobject thiz, jint index) { 23188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz); 23288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 23388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (extractor == NULL) { 23488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jniThrowException(env, "java/lang/IllegalStateException", NULL); 23588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return; 23688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 23788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 23888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber status_t err = extractor->selectTrack(index); 23988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 24088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (err != OK) { 24188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 24288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return; 24388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 24488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 24588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 24688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic void android_media_MediaExtractor_seekTo( 24788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber JNIEnv *env, jobject thiz, jlong timeUs) { 24888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz); 24988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 25088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (extractor == NULL) { 25188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jniThrowException(env, "java/lang/IllegalStateException", NULL); 25288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return; 25388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 25488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 25588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber status_t err = extractor->seekTo(timeUs); 25688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 25788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (err != OK) { 25888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 25988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return; 26088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 26188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 26288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 26388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic jboolean android_media_MediaExtractor_advance( 26488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber JNIEnv *env, jobject thiz) { 26588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz); 26688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 26788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (extractor == NULL) { 26888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jniThrowException(env, "java/lang/IllegalStateException", NULL); 26988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return false; 27088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 27188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 27288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber status_t err = extractor->advance(); 27388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 27488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (err == ERROR_END_OF_STREAM) { 27588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return false; 27688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } else if (err != OK) { 27788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 27888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return false; 27988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 28088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 28188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return true; 28288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 28388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 28488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic jint android_media_MediaExtractor_readSampleData( 28588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber JNIEnv *env, jobject thiz, jobject byteBuf, jint offset) { 28688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz); 28788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 28888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (extractor == NULL) { 28988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jniThrowException(env, "java/lang/IllegalStateException", NULL); 29088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return -1; 29188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 29288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 29388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber size_t sampleSize; 29488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber status_t err = extractor->readSampleData(byteBuf, offset, &sampleSize); 29588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 29688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (err == ERROR_END_OF_STREAM) { 29788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return -1; 29888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } else if (err != OK) { 29988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 30088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return false; 30188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 30288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 30388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return sampleSize; 30488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 30588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 30688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic jint android_media_MediaExtractor_getSampleTrackIndex( 30788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber JNIEnv *env, jobject thiz) { 30888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz); 30988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 31088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (extractor == NULL) { 31188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jniThrowException(env, "java/lang/IllegalStateException", NULL); 31288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return -1; 31388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 31488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 31588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber size_t trackIndex; 31688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber status_t err = extractor->getSampleTrackIndex(&trackIndex); 31788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 31888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (err == ERROR_END_OF_STREAM) { 31988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return -1; 32088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } else if (err != OK) { 32188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 32288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return false; 32388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 32488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 32588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return trackIndex; 32688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 32788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 32888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic jlong android_media_MediaExtractor_getSampleTime( 32988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber JNIEnv *env, jobject thiz) { 33088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz); 33188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 33288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (extractor == NULL) { 33388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jniThrowException(env, "java/lang/IllegalStateException", NULL); 33488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return -1ll; 33588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 33688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 33788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber int64_t sampleTimeUs; 33888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber status_t err = extractor->getSampleTime(&sampleTimeUs); 33988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 34088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (err == ERROR_END_OF_STREAM) { 34188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return -1ll; 34288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } else if (err != OK) { 34388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 34488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return false; 34588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 34688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 34788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return sampleTimeUs; 34888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 34988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 3509b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huberstatic jint android_media_MediaExtractor_getSampleFlags( 3519b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber JNIEnv *env, jobject thiz) { 3529b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz); 3539b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber 3549b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber if (extractor == NULL) { 3559b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber jniThrowException(env, "java/lang/IllegalStateException", NULL); 3569b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber return -1ll; 3579b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber } 3589b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber 3599b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber uint32_t sampleFlags; 3609b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber status_t err = extractor->getSampleFlags(&sampleFlags); 3619b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber 3629b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber if (err == ERROR_END_OF_STREAM) { 3639b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber return -1ll; 3649b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber } else if (err != OK) { 3659b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 3669b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber return false; 3679b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber } 3689b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber 3699b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber return sampleFlags; 3709b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber} 3719b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber 37288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic void android_media_MediaExtractor_native_init(JNIEnv *env) { 37388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jclass clazz = env->FindClass("android/media/MediaExtractor"); 37488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber CHECK(clazz != NULL); 37588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 37688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber gFields.context = env->GetFieldID(clazz, "mNativeContext", "I"); 37788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber CHECK(gFields.context != NULL); 37888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 37988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber DataSource::RegisterDefaultSniffers(); 38088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 38188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 38288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic void android_media_MediaExtractor_native_setup( 38388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber JNIEnv *env, jobject thiz, jstring path) { 38488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber sp<JMediaExtractor> extractor = new JMediaExtractor(env, thiz); 38588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 38688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (path == NULL) { 38788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 38888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return; 38988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 39088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 39188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber const char *tmp = env->GetStringUTFChars(path, NULL); 39288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 39388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (tmp == NULL) { 39488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return; 39588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 39688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 39788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber status_t err = extractor->setDataSource(tmp); 39888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 39988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber env->ReleaseStringUTFChars(path, tmp); 40088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber tmp = NULL; 40188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 40288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber if (err != OK) { 40388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber jniThrowException( 40488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber env, 40588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber "java/io/IOException", 40688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber "Failed to instantiate extractor."); 40788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return; 40888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber } 40988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 41088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber setMediaExtractor(env,thiz, extractor); 41188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 41288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 41388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic void android_media_MediaExtractor_native_finalize( 41488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber JNIEnv *env, jobject thiz) { 41588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber android_media_MediaExtractor_release(env, thiz); 41688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 41788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 41888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic JNINativeMethod gMethods[] = { 41988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber { "release", "()V", (void *)android_media_MediaExtractor_release }, 42088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 42188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber { "countTracks", "()I", (void *)android_media_MediaExtractor_countTracks }, 42288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 42388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber { "getTrackFormat", "(I)Ljava/util/Map;", 42488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber (void *)android_media_MediaExtractor_getTrackFormat }, 42588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 42688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber { "selectTrack", "(I)V", (void *)android_media_MediaExtractor_selectTrack }, 42788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 42888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber { "seekTo", "(J)V", (void *)android_media_MediaExtractor_seekTo }, 42988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 43088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber { "advance", "()Z", (void *)android_media_MediaExtractor_advance }, 43188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 43288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber { "readSampleData", "(Ljava/nio/ByteBuffer;I)I", 43388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber (void *)android_media_MediaExtractor_readSampleData }, 43488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 43588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber { "getSampleTrackIndex", "()I", 43688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber (void *)android_media_MediaExtractor_getSampleTrackIndex }, 43788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 43888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber { "getSampleTime", "()J", 43988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber (void *)android_media_MediaExtractor_getSampleTime }, 44088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 4419b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber { "getSampleFlags", "()I", 4429b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber (void *)android_media_MediaExtractor_getSampleFlags }, 4439b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber 44488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber { "native_init", "()V", (void *)android_media_MediaExtractor_native_init }, 44588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 44688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber { "native_setup", "(Ljava/lang/String;)V", 44788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber (void *)android_media_MediaExtractor_native_setup }, 44888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 44988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber { "native_finalize", "()V", 45088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber (void *)android_media_MediaExtractor_native_finalize }, 45188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}; 45288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber 45388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberint register_android_media_MediaExtractor(JNIEnv *env) { 45488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber return AndroidRuntime::registerNativeMethods(env, 45588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber "android/media/MediaExtractor", gMethods, NELEM(gMethods)); 45688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber} 457