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