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