android_media_MediaExtractor.cpp revision 60d610bf103379277a4b29a7ead4f013f6128e4e
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
28ab57d03bdb3010d4957fb88c8acb30575ca02ec9Andreas Huber#include <media/hardware/CryptoAPI.h>
2988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#include <media/stagefright/foundation/ABuffer.h>
3088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#include <media/stagefright/foundation/ADebug.h>
3188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#include <media/stagefright/foundation/AMessage.h>
3288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#include <media/stagefright/DataSource.h>
3388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#include <media/stagefright/MediaErrors.h>
3491befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber#include <media/stagefright/MetaData.h>
3588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber#include <media/stagefright/NuMediaExtractor.h>
3688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
3788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Hubernamespace android {
3888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
3988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstruct fields_t {
4088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    jfieldID context;
4191befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber
4291befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    jmethodID cryptoInfoSetID;
4388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber};
4488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
4588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic fields_t gFields;
4688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
4788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber////////////////////////////////////////////////////////////////////////////////
4888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
4988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas HuberJMediaExtractor::JMediaExtractor(JNIEnv *env, jobject thiz)
5088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    : mClass(NULL),
5188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber      mObject(NULL) {
5288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    jclass clazz = env->GetObjectClass(thiz);
5388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    CHECK(clazz != NULL);
5488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
5588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    mClass = (jclass)env->NewGlobalRef(clazz);
5688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    mObject = env->NewWeakGlobalRef(thiz);
5788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
5888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    mImpl = new NuMediaExtractor;
5988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}
6088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
6188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas HuberJMediaExtractor::~JMediaExtractor() {
6288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    JNIEnv *env = AndroidRuntime::getJNIEnv();
6388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
6488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    env->DeleteWeakGlobalRef(mObject);
6588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    mObject = NULL;
6688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    env->DeleteGlobalRef(mClass);
6788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    mClass = NULL;
6888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}
6988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
7007ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huberstatus_t JMediaExtractor::setDataSource(
7107ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber        const char *path, const KeyedVector<String8, String8> *headers) {
7207ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber    return mImpl->setDataSource(path, headers);
7307ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber}
7407ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber
7507ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huberstatus_t JMediaExtractor::setDataSource(int fd, off64_t offset, off64_t size) {
7607ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber    return mImpl->setDataSource(fd, offset, size);
7788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}
7888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
7988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Hubersize_t JMediaExtractor::countTracks() const {
8088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    return mImpl->countTracks();
8188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}
8288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
8388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatus_t JMediaExtractor::getTrackFormat(size_t index, jobject *format) const {
8488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    sp<AMessage> msg;
8588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    status_t err;
8688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    if ((err = mImpl->getTrackFormat(index, &msg)) != OK) {
8788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        return err;
8888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    }
8988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
9088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    JNIEnv *env = AndroidRuntime::getJNIEnv();
9188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
9288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    return ConvertMessageToMap(env, msg, format);
9388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}
9488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
9588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatus_t JMediaExtractor::selectTrack(size_t index) {
9688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    return mImpl->selectTrack(index);
9788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}
9888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
99f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huberstatus_t JMediaExtractor::unselectTrack(size_t index) {
100f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber    return mImpl->unselectTrack(index);
101f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber}
102f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber
103f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huberstatus_t JMediaExtractor::seekTo(
104f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber        int64_t timeUs, MediaSource::ReadOptions::SeekMode mode) {
105f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber    return mImpl->seekTo(timeUs, mode);
10688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}
10788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
10888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatus_t JMediaExtractor::advance() {
10988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    return mImpl->advance();
11088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}
11188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
11288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatus_t JMediaExtractor::readSampleData(
11388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        jobject byteBuf, size_t offset, size_t *sampleSize) {
11488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    JNIEnv *env = AndroidRuntime::getJNIEnv();
11588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
11688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    void *dst = env->GetDirectBufferAddress(byteBuf);
11788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
118c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber    jlong dstSize;
119c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber    jbyteArray byteArray = NULL;
120c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber
12188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    if (dst == NULL) {
122c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber        jclass byteBufClass = env->FindClass("java/nio/ByteBuffer");
123c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber        CHECK(byteBufClass != NULL);
124c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber
125c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber        jmethodID arrayID =
126c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber            env->GetMethodID(byteBufClass, "array", "()[B");
127c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber        CHECK(arrayID != NULL);
128c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber
129c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber        byteArray =
130c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber            (jbyteArray)env->CallObjectMethod(byteBuf, arrayID);
131c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber
132c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber        if (byteArray == NULL) {
133c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber            return INVALID_OPERATION;
134c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber        }
13588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
136c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber        jboolean isCopy;
137c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber        dst = env->GetByteArrayElements(byteArray, &isCopy);
138c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber
139c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber        dstSize = env->GetArrayLength(byteArray);
140c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber    } else {
141c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber        dstSize = env->GetDirectBufferCapacity(byteBuf);
142c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber    }
14388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
14488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    if (dstSize < offset) {
145c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber        if (byteArray != NULL) {
146c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber            env->ReleaseByteArrayElements(byteArray, (jbyte *)dst, 0);
147c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber        }
148c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber
14988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        return -ERANGE;
15088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    }
15188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
15288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    sp<ABuffer> buffer = new ABuffer((char *)dst + offset, dstSize - offset);
15388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
15488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    status_t err = mImpl->readSampleData(buffer);
15588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
156c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber    if (byteArray != NULL) {
157c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber        env->ReleaseByteArrayElements(byteArray, (jbyte *)dst, 0);
158c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber    }
159c52b980277f08aee7981b1fdbca7a89464cf66d9Andreas Huber
16088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    if (err != OK) {
16188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        return err;
16288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    }
16388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
16488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    *sampleSize = buffer->size();
16588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
16688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    return OK;
16788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}
16888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
16988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatus_t JMediaExtractor::getSampleTrackIndex(size_t *trackIndex) {
17088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    return mImpl->getSampleTrackIndex(trackIndex);
17188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}
17288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
17388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatus_t JMediaExtractor::getSampleTime(int64_t *sampleTimeUs) {
17488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    return mImpl->getSampleTime(sampleTimeUs);
17588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}
17688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
1779b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huberstatus_t JMediaExtractor::getSampleFlags(uint32_t *sampleFlags) {
17891befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    *sampleFlags = 0;
17991befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber
18091befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    sp<MetaData> meta;
18191befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    status_t err = mImpl->getSampleMeta(&meta);
18291befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber
18391befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    if (err != OK) {
18491befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        return err;
18591befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    }
18691befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber
18791befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    int32_t val;
18891befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    if (meta->findInt32(kKeyIsSyncFrame, &val) && val != 0) {
18991befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        (*sampleFlags) |= NuMediaExtractor::SAMPLE_FLAG_SYNC;
19091befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    }
19191befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber
19291befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    uint32_t type;
19391befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    const void *data;
19491befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    size_t size;
19591befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    if (meta->findData(kKeyEncryptedSizes, &type, &data, &size)) {
19691befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        (*sampleFlags) |= NuMediaExtractor::SAMPLE_FLAG_ENCRYPTED;
19791befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    }
19891befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber
19991befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    return OK;
20091befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber}
20191befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber
20291befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huberstatus_t JMediaExtractor::getSampleMeta(sp<MetaData> *sampleMeta) {
20391befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    return mImpl->getSampleMeta(sampleMeta);
2049b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber}
2059b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber
20674a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huberbool JMediaExtractor::getCachedDuration(int64_t *durationUs, bool *eos) const {
20774a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber    return mImpl->getCachedDuration(durationUs, eos);
20874a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber}
20974a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber
21088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}  // namespace android
21188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
21288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber////////////////////////////////////////////////////////////////////////////////
21388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
21488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberusing namespace android;
21588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
21688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic sp<JMediaExtractor> setMediaExtractor(
21788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        JNIEnv *env, jobject thiz, const sp<JMediaExtractor> &extractor) {
21888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    sp<JMediaExtractor> old =
21988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        (JMediaExtractor *)env->GetIntField(thiz, gFields.context);
22088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
22188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    if (extractor != NULL) {
22288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        extractor->incStrong(thiz);
22388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    }
22488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    if (old != NULL) {
22588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        old->decStrong(thiz);
22688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    }
22788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    env->SetIntField(thiz, gFields.context, (int)extractor.get());
22888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
22988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    return old;
23088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}
23188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
23288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic sp<JMediaExtractor> getMediaExtractor(JNIEnv *env, jobject thiz) {
23388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    return (JMediaExtractor *)env->GetIntField(thiz, gFields.context);
23488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}
23588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
23688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic void android_media_MediaExtractor_release(JNIEnv *env, jobject thiz) {
23788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    setMediaExtractor(env, thiz, NULL);
23888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}
23988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
24060d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huberstatic jint android_media_MediaExtractor_getTrackCount(
24188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        JNIEnv *env, jobject thiz) {
24288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz);
24388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
24488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    if (extractor == NULL) {
24588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        jniThrowException(env, "java/lang/IllegalStateException", NULL);
24607ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber        return -1;
24788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    }
24888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
24988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    return extractor->countTracks();
25088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}
25188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
25260d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huberstatic jobject android_media_MediaExtractor_getTrackFormatNative(
25388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        JNIEnv *env, jobject thiz, jint index) {
25488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz);
25588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
25688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    if (extractor == NULL) {
25788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        jniThrowException(env, "java/lang/IllegalStateException", NULL);
25888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        return NULL;
25988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    }
26088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
26188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    jobject format;
26288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    status_t err = extractor->getTrackFormat(index, &format);
26388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
26488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    if (err != OK) {
26588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
26688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        return NULL;
26788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    }
26888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
26988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    return format;
27088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}
27188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
27288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic void android_media_MediaExtractor_selectTrack(
27388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        JNIEnv *env, jobject thiz, jint index) {
27488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz);
27588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
27688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    if (extractor == NULL) {
27788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        jniThrowException(env, "java/lang/IllegalStateException", NULL);
27888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        return;
27988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    }
28088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
28188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    status_t err = extractor->selectTrack(index);
28288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
28388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    if (err != OK) {
28488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
28588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        return;
28688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    }
28788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}
28888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
289f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huberstatic void android_media_MediaExtractor_unselectTrack(
290f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber        JNIEnv *env, jobject thiz, jint index) {
291f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber    sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz);
292f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber
293f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber    if (extractor == NULL) {
294f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber        jniThrowException(env, "java/lang/IllegalStateException", NULL);
295f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber        return;
296f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber    }
297f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber
298f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber    status_t err = extractor->unselectTrack(index);
299f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber
300f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber    if (err != OK) {
301f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber        jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
302f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber        return;
303f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber    }
304f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber}
305f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber
30688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic void android_media_MediaExtractor_seekTo(
307f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber        JNIEnv *env, jobject thiz, jlong timeUs, jint mode) {
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;
31388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    }
31488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
315f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber    if (mode < MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC
316f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber            || mode > MediaSource::ReadOptions::SEEK_CLOSEST) {
317f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber        jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
318f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber        return;
319f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber    }
320f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber
321f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber    extractor->seekTo(timeUs, (MediaSource::ReadOptions::SeekMode)mode);
32288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}
32388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
32488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic jboolean android_media_MediaExtractor_advance(
32588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        JNIEnv *env, jobject thiz) {
32688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz);
32788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
32888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    if (extractor == NULL) {
32988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        jniThrowException(env, "java/lang/IllegalStateException", NULL);
33088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        return false;
33188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    }
33288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
33388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    status_t err = extractor->advance();
33488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
33588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    if (err == ERROR_END_OF_STREAM) {
33688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        return false;
33788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    } else if (err != OK) {
33888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
33988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        return false;
34088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    }
34188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
34288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    return true;
34388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}
34488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
34588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic jint android_media_MediaExtractor_readSampleData(
34688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        JNIEnv *env, jobject thiz, jobject byteBuf, jint offset) {
34788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz);
34888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
34988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    if (extractor == NULL) {
35088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        jniThrowException(env, "java/lang/IllegalStateException", NULL);
35188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        return -1;
35288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    }
35388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
35488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    size_t sampleSize;
35588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    status_t err = extractor->readSampleData(byteBuf, offset, &sampleSize);
35688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
35788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    if (err == ERROR_END_OF_STREAM) {
35888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        return -1;
35988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    } else if (err != OK) {
36088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
36188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        return false;
36288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    }
36388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
36488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    return sampleSize;
36588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}
36688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
36788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic jint android_media_MediaExtractor_getSampleTrackIndex(
36888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        JNIEnv *env, jobject thiz) {
36988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz);
37088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
37188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    if (extractor == NULL) {
37288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        jniThrowException(env, "java/lang/IllegalStateException", NULL);
37388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        return -1;
37488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    }
37588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
37688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    size_t trackIndex;
37788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    status_t err = extractor->getSampleTrackIndex(&trackIndex);
37888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
37988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    if (err == ERROR_END_OF_STREAM) {
38088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        return -1;
38188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    } else if (err != OK) {
38288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
38388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        return false;
38488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    }
38588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
38688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    return trackIndex;
38788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}
38888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
38988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic jlong android_media_MediaExtractor_getSampleTime(
39088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        JNIEnv *env, jobject thiz) {
39188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz);
39288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
39388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    if (extractor == NULL) {
39488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        jniThrowException(env, "java/lang/IllegalStateException", NULL);
39588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        return -1ll;
39688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    }
39788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
39888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    int64_t sampleTimeUs;
39988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    status_t err = extractor->getSampleTime(&sampleTimeUs);
40088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
40188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    if (err == ERROR_END_OF_STREAM) {
40288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        return -1ll;
40388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    } else if (err != OK) {
40488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
40588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        return false;
40688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    }
40788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
40888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    return sampleTimeUs;
40988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}
41088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
4119b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huberstatic jint android_media_MediaExtractor_getSampleFlags(
4129b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber        JNIEnv *env, jobject thiz) {
4139b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber    sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz);
4149b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber
4159b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber    if (extractor == NULL) {
4169b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber        jniThrowException(env, "java/lang/IllegalStateException", NULL);
4179b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber        return -1ll;
4189b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber    }
4199b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber
4209b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber    uint32_t sampleFlags;
4219b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber    status_t err = extractor->getSampleFlags(&sampleFlags);
4229b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber
4239b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber    if (err == ERROR_END_OF_STREAM) {
4249b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber        return -1ll;
4259b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber    } else if (err != OK) {
4269b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber        jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
4279b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber        return false;
4289b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber    }
4299b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber
4309b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber    return sampleFlags;
4319b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber}
4329b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber
43391befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huberstatic jboolean android_media_MediaExtractor_getSampleCryptoInfo(
43491befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        JNIEnv *env, jobject thiz, jobject cryptoInfoObj) {
43591befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz);
43691befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber
43791befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    if (extractor == NULL) {
43891befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        jniThrowException(env, "java/lang/IllegalStateException", NULL);
43991befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        return -1ll;
44091befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    }
44191befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber
44291befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    sp<MetaData> meta;
44391befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    status_t err = extractor->getSampleMeta(&meta);
44491befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber
44591befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    if (err != OK) {
44691befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        return false;
44791befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    }
44891befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber
44991befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    uint32_t type;
45091befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    const void *data;
45191befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    size_t size;
45291befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    if (!meta->findData(kKeyEncryptedSizes, &type, &data, &size)) {
45391befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        return false;
45491befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    }
45591befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber
45691befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    size_t numSubSamples = size / sizeof(size_t);
45791befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber
45891befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    if (numSubSamples == 0) {
45991befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        return false;
46091befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    }
46191befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber
46291befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    jintArray numBytesOfEncryptedDataObj = env->NewIntArray(numSubSamples);
46391befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    jboolean isCopy;
46491befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    jint *dst = env->GetIntArrayElements(numBytesOfEncryptedDataObj, &isCopy);
46591befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    for (size_t i = 0; i < numSubSamples; ++i) {
46691befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        dst[i] = ((const size_t *)data)[i];
46791befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    }
46891befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    env->ReleaseIntArrayElements(numBytesOfEncryptedDataObj, dst, 0);
46991befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    dst = NULL;
47091befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber
47191befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    size_t encSize = size;
47291befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    jintArray numBytesOfPlainDataObj = NULL;
473ab57d03bdb3010d4957fb88c8acb30575ca02ec9Andreas Huber    if (meta->findData(kKeyPlainSizes, &type, &data, &size)) {
47491befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        if (size != encSize) {
47591befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber            // The two must be of the same length.
47691befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber            return false;
47791befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        }
47891befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber
47991befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        numBytesOfPlainDataObj = env->NewIntArray(numSubSamples);
48091befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        jboolean isCopy;
48191befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        jint *dst = env->GetIntArrayElements(numBytesOfPlainDataObj, &isCopy);
48291befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        for (size_t i = 0; i < numSubSamples; ++i) {
48391befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber            dst[i] = ((const size_t *)data)[i];
48491befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        }
48591befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        env->ReleaseIntArrayElements(numBytesOfPlainDataObj, dst, 0);
48691befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        dst = NULL;
48791befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    }
48891befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber
48991befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    jbyteArray keyObj = NULL;
49091befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    if (meta->findData(kKeyCryptoKey, &type, &data, &size)) {
49191befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        if (size != 16) {
49291befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber            // Keys must be 16 bytes in length.
49391befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber            return false;
49491befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        }
49591befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber
49691befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        keyObj = env->NewByteArray(size);
49791befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        jboolean isCopy;
49891befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        jbyte *dst = env->GetByteArrayElements(keyObj, &isCopy);
49991befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        memcpy(dst, data, size);
50091befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        env->ReleaseByteArrayElements(keyObj, dst, 0);
50191befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        dst = NULL;
50291befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    }
50391befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber
50491befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    jbyteArray ivObj = NULL;
50591befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    if (meta->findData(kKeyCryptoIV, &type, &data, &size)) {
50691befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        if (size != 16) {
50791befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber            // IVs must be 16 bytes in length.
50891befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber            return false;
50991befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        }
51091befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber
51191befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        ivObj = env->NewByteArray(size);
51291befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        jboolean isCopy;
51391befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        jbyte *dst = env->GetByteArrayElements(ivObj, &isCopy);
51491befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        memcpy(dst, data, size);
51591befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        env->ReleaseByteArrayElements(ivObj, dst, 0);
51691befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        dst = NULL;
51791befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    }
51891befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber
51991befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    int32_t mode;
52091befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    if (!meta->findInt32(kKeyCryptoMode, &mode)) {
521ab57d03bdb3010d4957fb88c8acb30575ca02ec9Andreas Huber        mode = CryptoPlugin::kMode_AES_CTR;
52291befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    }
52391befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber
52491befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    env->CallVoidMethod(
52591befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber            cryptoInfoObj,
52691befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber            gFields.cryptoInfoSetID,
52791befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber            numSubSamples,
52891befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber            numBytesOfPlainDataObj,
52991befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber            numBytesOfEncryptedDataObj,
53091befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber            keyObj,
53191befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber            ivObj,
53291befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber            mode);
53391befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber
53491befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    return true;
53591befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber}
53691befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber
53788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic void android_media_MediaExtractor_native_init(JNIEnv *env) {
53888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    jclass clazz = env->FindClass("android/media/MediaExtractor");
53988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    CHECK(clazz != NULL);
54088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
54188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    gFields.context = env->GetFieldID(clazz, "mNativeContext", "I");
54288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    CHECK(gFields.context != NULL);
54388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
54491befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    clazz = env->FindClass("android/media/MediaCodec$CryptoInfo");
54591befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    CHECK(clazz != NULL);
54691befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber
54791befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    gFields.cryptoInfoSetID =
54891befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        env->GetMethodID(clazz, "set", "(I[I[I[B[BI)V");
54991befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber
55088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    DataSource::RegisterDefaultSniffers();
55188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}
55288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
55388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic void android_media_MediaExtractor_native_setup(
55407ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber        JNIEnv *env, jobject thiz) {
55588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    sp<JMediaExtractor> extractor = new JMediaExtractor(env, thiz);
55607ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber    setMediaExtractor(env,thiz, extractor);
55707ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber}
55888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
55907ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huberstatic void android_media_MediaExtractor_setDataSource(
56007ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber        JNIEnv *env, jobject thiz,
56107ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber        jstring pathObj, jobjectArray keysArray, jobjectArray valuesArray) {
56207ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber    sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz);
56307ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber
56407ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber    if (extractor == NULL) {
56507ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber        jniThrowException(env, "java/lang/IllegalStateException", NULL);
56607ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber        return;
56707ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber    }
56807ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber
56907ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber    if (pathObj == NULL) {
57088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
57188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        return;
57288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    }
57388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
57407ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber    KeyedVector<String8, String8> headers;
57507ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber    if (!ConvertKeyValueArraysToKeyedVector(
57607ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber                env, keysArray, valuesArray, &headers)) {
57707ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber        return;
57807ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber    }
57988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
58007ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber    const char *path = env->GetStringUTFChars(pathObj, NULL);
58107ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber
58207ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber    if (path == NULL) {
58388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        return;
58488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    }
58588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
58607ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber    status_t err = extractor->setDataSource(path, &headers);
58788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
58807ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber    env->ReleaseStringUTFChars(pathObj, path);
58907ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber    path = NULL;
59088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
59188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    if (err != OK) {
59288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        jniThrowException(
59388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber                env,
59488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber                "java/io/IOException",
59588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber                "Failed to instantiate extractor.");
59688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        return;
59788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    }
59807ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber}
59988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
60007ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huberstatic void android_media_MediaExtractor_setDataSourceFd(
60107ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber        JNIEnv *env, jobject thiz,
60207ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber        jobject fileDescObj, jlong offset, jlong length) {
60307ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber    sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz);
60407ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber
60507ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber    if (extractor == NULL) {
60607ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber        jniThrowException(env, "java/lang/IllegalStateException", NULL);
60707ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber        return;
60807ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber    }
60907ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber
61007ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber    if (fileDescObj == NULL) {
61107ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber        jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
61207ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber        return;
61307ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber    }
61407ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber
61507ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber    int fd = jniGetFDFromFileDescriptor(env, fileDescObj);
61607ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber
61707ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber    status_t err = extractor->setDataSource(fd, offset, length);
61807ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber
61907ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber    if (err != OK) {
62007ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber        jniThrowException(
62107ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber                env,
62207ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber                "java/io/IOException",
62307ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber                "Failed to instantiate extractor.");
62407ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber        return;
62507ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber    }
62688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}
62788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
62874a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huberstatic jlong android_media_MediaExtractor_getCachedDurationUs(
62974a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber        JNIEnv *env, jobject thiz) {
63074a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber    sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz);
63174a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber
63274a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber    if (extractor == NULL) {
63374a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber        jniThrowException(env, "java/lang/IllegalStateException", NULL);
63474a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber        return -1ll;
63574a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber    }
63674a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber
63774a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber    int64_t cachedDurationUs;
63874a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber    bool eos;
63974a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber    if (!extractor->getCachedDuration(&cachedDurationUs, &eos)) {
64074a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber        return -1ll;
64174a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber    }
64274a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber
64374a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber    return cachedDurationUs;
64474a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber}
64574a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber
64674a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huberstatic jboolean android_media_MediaExtractor_hasCacheReachedEOS(
64774a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber        JNIEnv *env, jobject thiz) {
64874a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber    sp<JMediaExtractor> extractor = getMediaExtractor(env, thiz);
64974a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber
65074a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber    if (extractor == NULL) {
65174a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber        jniThrowException(env, "java/lang/IllegalStateException", NULL);
65274a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber        return true;
65374a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber    }
65474a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber
65574a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber    int64_t cachedDurationUs;
65674a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber    bool eos;
65774a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber    if (!extractor->getCachedDuration(&cachedDurationUs, &eos)) {
65874a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber        return true;
65974a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber    }
66074a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber
66174a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber    return eos;
66274a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber}
66374a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber
66488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic void android_media_MediaExtractor_native_finalize(
66588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        JNIEnv *env, jobject thiz) {
66688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    android_media_MediaExtractor_release(env, thiz);
66788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}
66888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
66988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberstatic JNINativeMethod gMethods[] = {
67088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    { "release", "()V", (void *)android_media_MediaExtractor_release },
67188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
67260d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    { "getTrackCount", "()I", (void *)android_media_MediaExtractor_getTrackCount },
67388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
67460d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber    { "getTrackFormatNative", "(I)Ljava/util/Map;",
67560d610bf103379277a4b29a7ead4f013f6128e4eAndreas Huber        (void *)android_media_MediaExtractor_getTrackFormatNative },
67688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
67788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    { "selectTrack", "(I)V", (void *)android_media_MediaExtractor_selectTrack },
67888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
679f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber    { "unselectTrack", "(I)V",
680f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber        (void *)android_media_MediaExtractor_unselectTrack },
681f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber
682f2855b3df5994e165b29025c4c49d8e7d634c034Andreas Huber    { "seekTo", "(JI)V", (void *)android_media_MediaExtractor_seekTo },
68388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
68488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    { "advance", "()Z", (void *)android_media_MediaExtractor_advance },
68588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
68688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    { "readSampleData", "(Ljava/nio/ByteBuffer;I)I",
68788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        (void *)android_media_MediaExtractor_readSampleData },
68888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
68988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    { "getSampleTrackIndex", "()I",
69088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        (void *)android_media_MediaExtractor_getSampleTrackIndex },
69188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
69288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    { "getSampleTime", "()J",
69388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        (void *)android_media_MediaExtractor_getSampleTime },
69488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
6959b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber    { "getSampleFlags", "()I",
6969b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber        (void *)android_media_MediaExtractor_getSampleFlags },
6979b8e496f4d143280deff137c5f30ca8907bc28dbAndreas Huber
69891befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber    { "getSampleCryptoInfo", "(Landroid/media/MediaCodec$CryptoInfo;)Z",
69991befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber        (void *)android_media_MediaExtractor_getSampleCryptoInfo },
70091befdc0c4710234840cdfd853e7d30e8f9de62cAndreas Huber
70188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    { "native_init", "()V", (void *)android_media_MediaExtractor_native_init },
70288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
70307ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber    { "native_setup", "()V",
70488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber      (void *)android_media_MediaExtractor_native_setup },
70588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
70688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    { "native_finalize", "()V",
70788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber      (void *)android_media_MediaExtractor_native_finalize },
70807ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber
70907ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber    { "setDataSource", "(Ljava/lang/String;[Ljava/lang/String;"
71007ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber                       "[Ljava/lang/String;)V",
71107ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber      (void *)android_media_MediaExtractor_setDataSource },
71207ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber
71307ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber    { "setDataSource", "(Ljava/io/FileDescriptor;JJ)V",
71407ea426e3ae8915ca6bf67135f523f42cd920af0Andreas Huber      (void *)android_media_MediaExtractor_setDataSourceFd },
71574a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber
71674a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber    { "getCachedDuration", "()J",
71774a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber      (void *)android_media_MediaExtractor_getCachedDurationUs },
71874a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber
71974a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber    { "hasCacheReachedEndOfStream", "()Z",
72074a78b0f6e8c07cfc7da8f043987f6de0648bc05Andreas Huber      (void *)android_media_MediaExtractor_hasCacheReachedEOS },
72188572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber};
72288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
72388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberint register_android_media_MediaExtractor(JNIEnv *env) {
72488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    return AndroidRuntime::registerNativeMethods(env,
72588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber                "android/media/MediaExtractor", gMethods, NELEM(gMethods));
72688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber}
727