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