1c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2007, The Android Open Source Project
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** you may not use this file except in compliance with the License.
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** You may obtain a copy of the License at
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**     http://www.apache.org/licenses/LICENSE-2.0
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Unless required by applicable law or agreed to in writing, software
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS,
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** See the License for the specific language governing permissions and
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License.
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//#define LOG_NDEBUG 0
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "MediaPlayer-JNI"
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "utils/Log.h"
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/mediaplayer.h>
23b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar#include <media/AudioResamplerPublic.h>
24d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber#include <media/IMediaHTTPService.h>
2520cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania#include <media/MediaPlayerInterface.h>
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h>
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <assert.h>
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <limits.h>
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <unistd.h>
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <fcntl.h>
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/threads.h>
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h"
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "JNIHelp.h"
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "android_runtime/AndroidRuntime.h"
351ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg#include "android_runtime/android_view_Surface.h"
3687eac99a21772ae56018cb81db6966557b459554Ruben Brunk#include "android_runtime/Log.h"
374df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project#include "utils/Errors.h"  // for status_t
38256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber#include "utils/KeyedVector.h"
39256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber#include "utils/String8.h"
404eaa2938084353a54dc259466172909329a048ccChris Watkins#include "android_media_MediaDataSource.h"
412d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia#include "android_media_PlaybackParams.h"
422d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia#include "android_media_SyncParams.h"
4379f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong#include "android_media_Utils.h"
4479f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong
45d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#include "android_os_Parcel.h"
4620cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania#include "android_util_Binder.h"
4720cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania#include <binder/Parcel.h>
48d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden#include <gui/IGraphicBufferProducer.h>
498335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian#include <gui/Surface.h>
50d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang#include <binder/IPCThreadState.h>
51d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang#include <binder/IServiceManager.h>
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber#include "android_util_Binder.h"
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace android;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct fields_t {
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jfieldID    context;
621ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg    jfieldID    surface_texture;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jmethodID   post_event;
65d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber
66d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber    jmethodID   proxyConfigGetHost;
67d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber    jmethodID   proxyConfigGetPort;
68d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber    jmethodID   proxyConfigGetExclusionList;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic fields_t fields;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
722d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jiastatic PlaybackParams::fields_t gPlaybackParamsFields;
732d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jiastatic SyncParams::fields_t gSyncParamsFields;
74b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic Mutex sLock;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ref-counted object for callbacks
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass JNIMediaPlayerListener: public MediaPlayerListener
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    JNIMediaPlayerListener(JNIEnv* env, jobject thiz, jobject weak_thiz);
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ~JNIMediaPlayerListener();
84162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang    virtual void notify(int msg, int ext1, int ext2, const Parcel *obj = NULL);
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    JNIMediaPlayerListener();
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jclass      mClass;     // Reference to MediaPlayer class
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jobject     mObject;    // Weak ref to MediaPlayer Java object to call on
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJNIMediaPlayerListener::JNIMediaPlayerListener(JNIEnv* env, jobject thiz, jobject weak_thiz)
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Hold onto the MediaPlayer class for use in calling the static method
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // that posts events to the application thread.
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jclass clazz = env->GetObjectClass(thiz);
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (clazz == NULL) {
983762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("Can't find android/media/MediaPlayer");
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/Exception", NULL);
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mClass = (jclass)env->NewGlobalRef(clazz);
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // We use a weak reference so the MediaPlayer object can be garbage collected.
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // The reference is only used as a proxy for callbacks.
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mObject  = env->NewGlobalRef(weak_thiz);
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJNIMediaPlayerListener::~JNIMediaPlayerListener()
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // remove global references
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    JNIEnv *env = AndroidRuntime::getJNIEnv();
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->DeleteGlobalRef(mObject);
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->DeleteGlobalRef(mClass);
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
117162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wangvoid JNIMediaPlayerListener::notify(int msg, int ext1, int ext2, const Parcel *obj)
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    JNIEnv *env = AndroidRuntime::getJNIEnv();
120162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang    if (obj && obj->dataSize() > 0) {
121333c09945e7399c6a2b1f4d9fdf981508e38db52Insun Kang        jobject jParcel = createJavaParcelObject(env);
122333c09945e7399c6a2b1f4d9fdf981508e38db52Insun Kang        if (jParcel != NULL) {
123333c09945e7399c6a2b1f4d9fdf981508e38db52Insun Kang            Parcel* nativeParcel = parcelForJavaObject(env, jParcel);
1248902097bb686752ff207e3bda12713be1a8c74ebInsun Kang            nativeParcel->setData(obj->data(), obj->dataSize());
125162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang            env->CallStaticVoidMethod(mClass, fields.post_event, mObject,
126333c09945e7399c6a2b1f4d9fdf981508e38db52Insun Kang                    msg, ext1, ext2, jParcel);
12799f752149b1a0df9ea0ba311d609d4d6e103787cElliott Hughes            env->DeleteLocalRef(jParcel);
128162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang        }
129162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang    } else {
130162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang        env->CallStaticVoidMethod(mClass, fields.post_event, mObject,
131162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang                msg, ext1, ext2, NULL);
132162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang    }
1338902097bb686752ff207e3bda12713be1a8c74ebInsun Kang    if (env->ExceptionCheck()) {
1348902097bb686752ff207e3bda12713be1a8c74ebInsun Kang        ALOGW("An exception occurred while notifying an event.");
1358902097bb686752ff207e3bda12713be1a8c74ebInsun Kang        LOGW_EX(env);
1368902097bb686752ff207e3bda12713be1a8c74ebInsun Kang        env->ExceptionClear();
1378902097bb686752ff207e3bda12713be1a8c74ebInsun Kang    }
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic sp<MediaPlayer> getMediaPlayer(JNIEnv* env, jobject thiz)
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Mutex::Autolock l(sLock);
145075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    MediaPlayer* const p = (MediaPlayer*)env->GetLongField(thiz, fields.context);
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return sp<MediaPlayer>(p);
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic sp<MediaPlayer> setMediaPlayer(JNIEnv* env, jobject thiz, const sp<MediaPlayer>& player)
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Mutex::Autolock l(sLock);
152075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    sp<MediaPlayer> old = (MediaPlayer*)env->GetLongField(thiz, fields.context);
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (player.get()) {
154b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian        player->incStrong((void*)setMediaPlayer);
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (old != 0) {
157b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian        old->decStrong((void*)setMediaPlayer);
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
159075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    env->SetLongField(thiz, fields.context, (jlong)player.get());
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return old;
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16332f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania// If exception is NULL and opStatus is not OK, this method sends an error
16432f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania// event to the client application; otherwise, if exception is not NULL and
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// opStatus is not OK, this method throws the given exception to the client
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// application.
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void process_media_player_call(JNIEnv *env, jobject thiz, status_t opStatus, const char* exception, const char *message)
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (exception == NULL) {  // Don't throw exception. Instead, send an event.
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (opStatus != (status_t) OK) {
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mp != 0) mp->notify(MEDIA_ERROR, opStatus, 0);
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {  // Throw exception!
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ( opStatus == (status_t) INVALID_OPERATION ) {
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            jniThrowException(env, "java/lang/IllegalStateException", NULL);
17705ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar        } else if ( opStatus == (status_t) BAD_VALUE ) {
17805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar            jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
179fc301b0bb5c635c6bb51b48c504a8db5f9010e5cDave Burke        } else if ( opStatus == (status_t) PERMISSION_DENIED ) {
180fc301b0bb5c635c6bb51b48c504a8db5f9010e5cDave Burke            jniThrowException(env, "java/lang/SecurityException", NULL);
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if ( opStatus != (status_t) OK ) {
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (strlen(message) > 230) {
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               // if the message is too long, don't bother displaying the status code
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               jniThrowException( env, exception, message);
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               char msg[256];
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // append the status code to the message
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               sprintf(msg, "%s: status=0x%X", message, opStatus);
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               jniThrowException( env, exception, msg);
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void
196256430093679e1d62b54fb0c852126e54d162f6fAndreas Huberandroid_media_MediaPlayer_setDataSourceAndHeaders(
197d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber        JNIEnv *env, jobject thiz, jobject httpServiceBinderObj, jstring path,
19817524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong        jobjectArray keys, jobjectArray values) {
19917524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (path == NULL) {
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
211c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong    const char *tmp = env->GetStringUTFChars(path, NULL);
212c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong    if (tmp == NULL) {  // Out of memory
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21571f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("setDataSource: path %s", tmp);
216256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber
217c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong    String8 pathStr(tmp);
218c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong    env->ReleaseStringUTFChars(path, tmp);
219c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong    tmp = NULL;
220c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong
22117524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong    // We build a KeyedVector out of the key and val arrays
22217524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong    KeyedVector<String8, String8> headersVector;
22379f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong    if (!ConvertKeyValueArraysToKeyedVector(
22479f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong            env, keys, values, &headersVector)) {
22579f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong        return;
226256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber    }
227256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber
228d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber    sp<IMediaHTTPService> httpService;
229d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber    if (httpServiceBinderObj != NULL) {
230d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber        sp<IBinder> binder = ibinderForJavaObject(env, httpServiceBinderObj);
231d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber        httpService = interface_cast<IMediaHTTPService>(binder);
232d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber    }
233d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber
234256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber    status_t opStatus =
235256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber        mp->setDataSource(
236d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber                httpService,
237c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong                pathStr,
23879f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong                headersVector.size() > 0? &headersVector : NULL);
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
240256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber    process_media_player_call(
241256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber            env, thiz, opStatus, "java/io/IOException",
242256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber            "setDataSource failed." );
243256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber}
244256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber
245256430093679e1d62b54fb0c852126e54d162f6fAndreas Huberstatic void
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_setDataSourceFD(JNIEnv *env, jobject thiz, jobject fileDescriptor, jlong offset, jlong length)
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (fileDescriptor == NULL) {
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
258a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes    int fd = jniGetFDFromFileDescriptor(env, fileDescriptor);
25971f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("setDataSourceFD: fd %d", fd);
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    process_media_player_call( env, thiz, mp->setDataSource(fd, offset, length), "java/io/IOException", "setDataSourceFD failed." );
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2634eaa2938084353a54dc259466172909329a048ccChris Watkinsstatic void
2644eaa2938084353a54dc259466172909329a048ccChris Watkinsandroid_media_MediaPlayer_setDataSourceCallback(JNIEnv *env, jobject thiz, jobject dataSource)
2654eaa2938084353a54dc259466172909329a048ccChris Watkins{
2664eaa2938084353a54dc259466172909329a048ccChris Watkins    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
2674eaa2938084353a54dc259466172909329a048ccChris Watkins    if (mp == NULL ) {
2684eaa2938084353a54dc259466172909329a048ccChris Watkins        jniThrowException(env, "java/lang/IllegalStateException", NULL);
2694eaa2938084353a54dc259466172909329a048ccChris Watkins        return;
2704eaa2938084353a54dc259466172909329a048ccChris Watkins    }
2714eaa2938084353a54dc259466172909329a048ccChris Watkins
2724eaa2938084353a54dc259466172909329a048ccChris Watkins    if (dataSource == NULL) {
2734eaa2938084353a54dc259466172909329a048ccChris Watkins        jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
2744eaa2938084353a54dc259466172909329a048ccChris Watkins        return;
2754eaa2938084353a54dc259466172909329a048ccChris Watkins    }
2764eaa2938084353a54dc259466172909329a048ccChris Watkins    sp<IDataSource> callbackDataSource = new JMediaDataSource(env, dataSource);
2774eaa2938084353a54dc259466172909329a048ccChris Watkins    process_media_player_call(env, thiz, mp->setDataSource(callbackDataSource), "java/lang/RuntimeException", "setDataSourceCallback failed." );
2784eaa2938084353a54dc259466172909329a048ccChris Watkins}
2794eaa2938084353a54dc259466172909329a048ccChris Watkins
280d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFaddenstatic sp<IGraphicBufferProducer>
2811ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted BonkenburggetVideoSurfaceTexture(JNIEnv* env, jobject thiz) {
282075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    IGraphicBufferProducer * const p = (IGraphicBufferProducer*)env->GetLongField(thiz, fields.surface_texture);
283d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden    return sp<IGraphicBufferProducer>(p);
2848b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks}
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void
287d59310d08637c8531dc7949fc166b0daeede53c0Gloria WangdecVideoSurfaceRef(JNIEnv *env, jobject thiz)
288d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang{
289e828beb3866e2275cd26acd2a58f9f8a3967ba30Gloria Wang    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
290e828beb3866e2275cd26acd2a58f9f8a3967ba30Gloria Wang    if (mp == NULL) {
291e828beb3866e2275cd26acd2a58f9f8a3967ba30Gloria Wang        return;
292e828beb3866e2275cd26acd2a58f9f8a3967ba30Gloria Wang    }
293e828beb3866e2275cd26acd2a58f9f8a3967ba30Gloria Wang
294d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden    sp<IGraphicBufferProducer> old_st = getVideoSurfaceTexture(env, thiz);
295d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang    if (old_st != NULL) {
296b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian        old_st->decStrong((void*)decVideoSurfaceRef);
297d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang    }
298d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang}
299d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang
300d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wangstatic void
30143ef913815ec84d04877a698614a31e129cd97e3James DongsetVideoSurface(JNIEnv *env, jobject thiz, jobject jsurface, jboolean mediaPlayerMustBeAlive)
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
30443ef913815ec84d04877a698614a31e129cd97e3James Dong    if (mp == NULL) {
30543ef913815ec84d04877a698614a31e129cd97e3James Dong        if (mediaPlayerMustBeAlive) {
30643ef913815ec84d04877a698614a31e129cd97e3James Dong            jniThrowException(env, "java/lang/IllegalStateException", NULL);
30743ef913815ec84d04877a698614a31e129cd97e3James Dong        }
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3101ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg
311d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang    decVideoSurfaceRef(env, thiz);
312d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang
313d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden    sp<IGraphicBufferProducer> new_st;
3141ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg    if (jsurface) {
31564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        sp<Surface> surface(android_view_Surface_getSurface(env, jsurface));
316f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis        if (surface != NULL) {
31752800617946c456e78ed010c82d0ec4358368164Mathias Agopian            new_st = surface->getIGraphicBufferProducer();
318097922b9c1e0821beb107024bcd0dc14144c0920James Dong            if (new_st == NULL) {
319097922b9c1e0821beb107024bcd0dc14144c0920James Dong                jniThrowException(env, "java/lang/IllegalArgumentException",
320097922b9c1e0821beb107024bcd0dc14144c0920James Dong                    "The surface does not have a binding SurfaceTexture!");
321097922b9c1e0821beb107024bcd0dc14144c0920James Dong                return;
322097922b9c1e0821beb107024bcd0dc14144c0920James Dong            }
323b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian            new_st->incStrong((void*)decVideoSurfaceRef);
324f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis        } else {
325f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis            jniThrowException(env, "java/lang/IllegalArgumentException",
326f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis                    "The surface has been released");
327f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis            return;
328f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis        }
3291ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg    }
330d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang
331075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    env->SetLongField(thiz, fields.surface_texture, (jlong)new_st.get());
3321ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg
3331ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg    // This will fail if the media player has not been initialized yet. This
3341ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg    // can be the case if setDisplay() on MediaPlayer.java has been called
3351ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg    // before setDataSource(). The redundant call to setVideoSurfaceTexture()
3361ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg    // in prepare/prepareAsync covers for this case.
3371ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg    mp->setVideoSurfaceTexture(new_st);
3388b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks}
3398b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks
3408b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparksstatic void
34143ef913815ec84d04877a698614a31e129cd97e3James Dongandroid_media_MediaPlayer_setVideoSurface(JNIEnv *env, jobject thiz, jobject jsurface)
34243ef913815ec84d04877a698614a31e129cd97e3James Dong{
34343ef913815ec84d04877a698614a31e129cd97e3James Dong    setVideoSurface(env, thiz, jsurface, true /* mediaPlayerMustBeAlive */);
34443ef913815ec84d04877a698614a31e129cd97e3James Dong}
34543ef913815ec84d04877a698614a31e129cd97e3James Dong
34643ef913815ec84d04877a698614a31e129cd97e3James Dongstatic void
3478b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparksandroid_media_MediaPlayer_prepare(JNIEnv *env, jobject thiz)
3488b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks{
3498b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
3508b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks    if (mp == NULL ) {
3518b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks        jniThrowException(env, "java/lang/IllegalStateException", NULL);
3528b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks        return;
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3541ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg
3551ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg    // Handle the case where the display surface was set before the mp was
3561ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg    // initialized. We try again to make it stick.
357d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden    sp<IGraphicBufferProducer> st = getVideoSurfaceTexture(env, thiz);
3581ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg    mp->setVideoSurfaceTexture(st);
3591ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    process_media_player_call( env, thiz, mp->prepare(), "java/io/IOException", "Prepare failed." );
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_prepareAsync(JNIEnv *env, jobject thiz)
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3711ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg
3721ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg    // Handle the case where the display surface was set before the mp was
3731ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg    // initialized. We try again to make it stick.
374d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden    sp<IGraphicBufferProducer> st = getVideoSurfaceTexture(env, thiz);
3751ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg    mp->setVideoSurfaceTexture(st);
3761ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    process_media_player_call( env, thiz, mp->prepareAsync(), "java/io/IOException", "Prepare Async failed." );
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_start(JNIEnv *env, jobject thiz)
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
38371f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("start");
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    process_media_player_call( env, thiz, mp->start(), NULL, NULL );
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_stop(JNIEnv *env, jobject thiz)
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
39571f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("stop");
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40132f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania    process_media_player_call( env, thiz, mp->stop(), NULL, NULL );
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_pause(JNIEnv *env, jobject thiz)
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
40771f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("pause");
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    process_media_player_call( env, thiz, mp->pause(), NULL, NULL );
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_isPlaying(JNIEnv *env, jobject thiz)
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
422075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat        return JNI_FALSE;
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4244df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    const jboolean is_playing = mp->isPlaying();
4254df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
42671f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("isPlaying: %d", is_playing);
4274df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    return is_playing;
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void
4312d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jiaandroid_media_MediaPlayer_setPlaybackParams(JNIEnv *env, jobject thiz, jobject params)
432d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia{
433d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
434d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia    if (mp == NULL) {
435d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia        jniThrowException(env, "java/lang/IllegalStateException", NULL);
436d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia        return;
437d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia    }
438b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
4392d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    PlaybackParams pbp;
4402d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    pbp.fillFromJobject(env, gPlaybackParamsFields, params);
4412d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    ALOGV("setPlaybackParams: %d:%f %d:%f %d:%u %d:%u",
4422d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            pbp.speedSet, pbp.audioRate.mSpeed,
4432d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            pbp.pitchSet, pbp.audioRate.mPitch,
4442d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            pbp.audioFallbackModeSet, pbp.audioRate.mFallbackMode,
4452d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            pbp.audioStretchModeSet, pbp.audioRate.mStretchMode);
446b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
44705ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar    AudioPlaybackRate rate;
44805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar    status_t err = mp->getPlaybackSettings(&rate);
44905ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar    if (err == OK) {
45005ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar        bool updatedRate = false;
4512d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia        if (pbp.speedSet) {
4522d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            rate.mSpeed = pbp.audioRate.mSpeed;
45305ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar            updatedRate = true;
45405ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar        }
4552d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia        if (pbp.pitchSet) {
4562d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            rate.mPitch = pbp.audioRate.mPitch;
45705ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar            updatedRate = true;
45805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar        }
4592d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia        if (pbp.audioFallbackModeSet) {
4602d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            rate.mFallbackMode = pbp.audioRate.mFallbackMode;
46105ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar            updatedRate = true;
46205ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar        }
4632d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia        if (pbp.audioStretchModeSet) {
4642d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            rate.mStretchMode = pbp.audioRate.mStretchMode;
46505ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar            updatedRate = true;
46605ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar        }
46705ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar        if (updatedRate) {
46805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar            err = mp->setPlaybackSettings(rate);
46905ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar        }
47005ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar    }
47105ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar    process_media_player_call(
47205ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar            env, thiz, err,
47305ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar            "java/lang/IllegalStateException", "unexpected error");
474b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar}
475b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
476b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnarstatic jobject
4772d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jiaandroid_media_MediaPlayer_getPlaybackParams(JNIEnv *env, jobject thiz)
478b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar{
479b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
480b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar    if (mp == NULL) {
481b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar        jniThrowException(env, "java/lang/IllegalStateException", NULL);
482b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar        return NULL;
483b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar    }
484b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
4852d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    PlaybackParams pbp;
4862d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    AudioPlaybackRate &audioRate = pbp.audioRate;
48705ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar    process_media_player_call(
48805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar            env, thiz, mp->getPlaybackSettings(&audioRate),
48905ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar            "java/lang/IllegalStateException", "unexpected error");
490b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar    ALOGV("getPlaybackSettings: %f %f %d %d",
491b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar            audioRate.mSpeed, audioRate.mPitch, audioRate.mFallbackMode, audioRate.mStretchMode);
492b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
4932d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    pbp.speedSet = true;
4942d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    pbp.pitchSet = true;
4952d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    pbp.audioFallbackModeSet = true;
4962d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    pbp.audioStretchModeSet = true;
497b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
4982d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    return pbp.asJobject(env, gPlaybackParamsFields);
499d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia}
500d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia
501d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jiastatic void
5022d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jiaandroid_media_MediaPlayer_setSyncParams(JNIEnv *env, jobject thiz, jobject params)
503c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar{
504c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
505c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar    if (mp == NULL) {
506c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar        jniThrowException(env, "java/lang/IllegalStateException", NULL);
507c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar        return;
508c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar    }
509c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar
5102d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    SyncParams scp;
5112d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    scp.fillFromJobject(env, gSyncParamsFields, params);
5122d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    ALOGV("setSyncParams: %d:%d %d:%d %d:%f %d:%f",
5132d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia          scp.syncSourceSet, scp.sync.mSource,
5142d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia          scp.audioAdjustModeSet, scp.sync.mAudioAdjustMode,
5152d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia          scp.toleranceSet, scp.sync.mTolerance,
5162d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia          scp.frameRateSet, scp.frameRate);
51705ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar
51805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar    AVSyncSettings avsync;
51905ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar    float videoFrameRate;
52005ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar    status_t err = mp->getSyncSettings(&avsync, &videoFrameRate);
52105ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar    if (err == OK) {
5222d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia        bool updatedSync = scp.frameRateSet;
5232d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia        if (scp.syncSourceSet) {
5242d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            avsync.mSource = scp.sync.mSource;
52505ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar            updatedSync = true;
52605ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar        }
5272d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia        if (scp.audioAdjustModeSet) {
5282d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            avsync.mAudioAdjustMode = scp.sync.mAudioAdjustMode;
52905ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar            updatedSync = true;
53005ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar        }
5312d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia        if (scp.toleranceSet) {
5322d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            avsync.mTolerance = scp.sync.mTolerance;
53305ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar            updatedSync = true;
53405ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar        }
53505ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar        if (updatedSync) {
5362d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            err = mp->setSyncSettings(avsync, scp.frameRateSet ? scp.frameRate : -1.f);
53705ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar        }
53805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar    }
53905ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar    process_media_player_call(
54005ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar            env, thiz, err,
54105ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar            "java/lang/IllegalStateException", "unexpected error");
542c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar}
543c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar
544c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnarstatic jobject
5452d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jiaandroid_media_MediaPlayer_getSyncParams(JNIEnv *env, jobject thiz)
546c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar{
547c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
548c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar    if (mp == NULL) {
549c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar        jniThrowException(env, "java/lang/IllegalStateException", NULL);
550c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar        return NULL;
551c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar    }
552c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar
5532d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    SyncParams scp;
5542d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    scp.frameRate = -1.f;
55505ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar    process_media_player_call(
5562d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            env, thiz, mp->getSyncSettings(&scp.sync, &scp.frameRate),
55705ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar            "java/lang/IllegalStateException", "unexpected error");
55805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar
559c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar    ALOGV("getSyncSettings: %d %d %f %f",
5602d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            scp.sync.mSource, scp.sync.mAudioAdjustMode, scp.sync.mTolerance, scp.frameRate);
56105ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar
5622d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    // sanity check params
5632d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    if (scp.sync.mSource >= AVSYNC_SOURCE_MAX
5642d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            || scp.sync.mAudioAdjustMode >= AVSYNC_AUDIO_ADJUST_MODE_MAX
5652d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            || scp.sync.mTolerance < 0.f
5662d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            || scp.sync.mTolerance >= AVSYNC_TOLERANCE_MAX) {
56705ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar        jniThrowException(env,  "java/lang/IllegalStateException", NULL);
56805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar        return NULL;
56905ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar    }
570c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar
5712d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    scp.syncSourceSet = true;
5722d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    scp.audioAdjustModeSet = true;
5732d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    scp.toleranceSet = true;
5742d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    scp.frameRateSet = scp.frameRate >= 0.f;
575c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar
5762d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    return scp.asJobject(env, gSyncParamsFields);
577c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar}
578c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar
579c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnarstatic void
580075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatandroid_media_MediaPlayer_seekTo(JNIEnv *env, jobject thiz, jint msec)
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
58771f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("seekTo: %d(msec)", msec);
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    process_media_player_call( env, thiz, mp->seekTo(msec), NULL, NULL );
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
591075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatstatic jint
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_getVideoWidth(JNIEnv *env, jobject thiz)
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int w;
6004df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    if (0 != mp->getVideoWidth(&w)) {
6013762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("getVideoWidth failed");
6024df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        w = 0;
6034df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
60471f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("getVideoWidth: %d", w);
605075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    return (jint) w;
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
608075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatstatic jint
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_getVideoHeight(JNIEnv *env, jobject thiz)
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int h;
6174df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    if (0 != mp->getVideoHeight(&h)) {
6183762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("getVideoHeight failed");
6194df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        h = 0;
6204df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
62171f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("getVideoHeight: %d", h);
622075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    return (jint) h;
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
626075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatstatic jint
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_getCurrentPosition(JNIEnv *env, jobject thiz)
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int msec;
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    process_media_player_call( env, thiz, mp->getCurrentPosition(&msec), NULL, NULL );
63671f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("getCurrentPosition: %d (msec)", msec);
637075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    return (jint) msec;
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
640075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatstatic jint
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_getDuration(JNIEnv *env, jobject thiz)
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int msec;
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    process_media_player_call( env, thiz, mp->getDuration(&msec), NULL, NULL );
65071f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("getDuration: %d (msec)", msec);
651075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    return (jint) msec;
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_reset(JNIEnv *env, jobject thiz)
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
65771f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("reset");
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    process_media_player_call( env, thiz, mp->reset(), NULL, NULL );
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void
667075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatandroid_media_MediaPlayer_setAudioStreamType(JNIEnv *env, jobject thiz, jint streamtype)
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
66971f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("setAudioStreamType: %d", streamtype);
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
675bc1d77b6cbce23fbe25f7231651037ae195bc90eGlenn Kasten    process_media_player_call( env, thiz, mp->setAudioStreamType((audio_stream_type_t) streamtype) , NULL, NULL );
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6781af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlockstatic jint
6791af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlockandroid_media_MediaPlayer_getAudioStreamType(JNIEnv *env, jobject thiz)
6801af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock{
6811af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
6821af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock    if (mp == NULL ) {
6831af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock        jniThrowException(env, "java/lang/IllegalStateException", NULL);
6841af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock        return 0;
6851af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock    }
6861af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock    audio_stream_type_t streamtype;
6871af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock    process_media_player_call( env, thiz, mp->getAudioStreamType(&streamtype), NULL, NULL );
6881af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock    ALOGV("getAudioStreamType: %d (streamtype)", streamtype);
6891af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock    return (jint) streamtype;
6901af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock}
6911af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock
6928df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivistatic jboolean
6938df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Triviandroid_media_MediaPlayer_setParameter(JNIEnv *env, jobject thiz, jint key, jobject java_request)
6948df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi{
6958df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    ALOGV("setParameter: key %d", key);
6968df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
6978df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    if (mp == NULL ) {
6988df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        jniThrowException(env, "java/lang/IllegalStateException", NULL);
6998df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        return false;
7008df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    }
7018df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi
7028df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    Parcel *request = parcelForJavaObject(env, java_request);
7038df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    status_t err = mp->setParameter(key, *request);
7048df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    if (err == OK) {
7058df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        return true;
7068df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    } else {
7078df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        return false;
7088df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    }
7098df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi}
7108df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_setLooping(JNIEnv *env, jobject thiz, jboolean looping)
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
71471f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("setLooping: %d", looping);
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    process_media_player_call( env, thiz, mp->setLooping(looping), NULL, NULL );
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_isLooping(JNIEnv *env, jobject thiz)
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
72671f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("isLooping");
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
730075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat        return JNI_FALSE;
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
732075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    return mp->isLooping() ? JNI_TRUE : JNI_FALSE;
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void
736075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatandroid_media_MediaPlayer_setVolume(JNIEnv *env, jobject thiz, jfloat leftVolume, jfloat rightVolume)
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
738075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    ALOGV("setVolume: left %f  right %f", (float) leftVolume, (float) rightVolume);
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
744075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    process_media_player_call( env, thiz, mp->setVolume((float) leftVolume, (float) rightVolume), NULL, NULL );
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
74720cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania// Sends the request and reply parcels to the media player via the
74820cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania// binder interface.
74920cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Cataniastatic jint
75020cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Cataniaandroid_media_MediaPlayer_invoke(JNIEnv *env, jobject thiz,
75120cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania                                 jobject java_request, jobject java_reply)
75220cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania{
75320cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania    sp<MediaPlayer> media_player = getMediaPlayer(env, thiz);
75420cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania    if (media_player == NULL ) {
75520cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania        jniThrowException(env, "java/lang/IllegalStateException", NULL);
756b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania        return UNKNOWN_ERROR;
75720cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania    }
75820cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania
75920cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania    Parcel *request = parcelForJavaObject(env, java_request);
76020cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania    Parcel *reply = parcelForJavaObject(env, java_reply);
76120cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania
76220cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania    // Don't use process_media_player_call which use the async loop to
76320cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania    // report errors, instead returns the status.
764075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    return (jint) media_player->invoke(*request, reply);
76520cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania}
76620cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania
767b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania// Sends the new filter to the client.
768b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Cataniastatic jint
769b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Cataniaandroid_media_MediaPlayer_setMetadataFilter(JNIEnv *env, jobject thiz, jobject request)
770b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania{
771b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania    sp<MediaPlayer> media_player = getMediaPlayer(env, thiz);
772b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania    if (media_player == NULL ) {
773b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania        jniThrowException(env, "java/lang/IllegalStateException", NULL);
774b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania        return UNKNOWN_ERROR;
775b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania    }
776b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania
777b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania    Parcel *filter = parcelForJavaObject(env, request);
778b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania
7795d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania    if (filter == NULL ) {
7805d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania        jniThrowException(env, "java/lang/RuntimeException", "Filter is null");
7815d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania        return UNKNOWN_ERROR;
7825d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania    }
7835d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania
784075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    return (jint) media_player->setMetadataFilter(*filter);
785b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania}
786b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania
7875d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Cataniastatic jboolean
7885d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Cataniaandroid_media_MediaPlayer_getMetadata(JNIEnv *env, jobject thiz, jboolean update_only,
7895d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania                                      jboolean apply_filter, jobject reply)
7905d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania{
7915d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania    sp<MediaPlayer> media_player = getMediaPlayer(env, thiz);
7925d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania    if (media_player == NULL ) {
7935d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania        jniThrowException(env, "java/lang/IllegalStateException", NULL);
794075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat        return JNI_FALSE;
7955d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania    }
7965d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania
7975d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania    Parcel *metadata = parcelForJavaObject(env, reply);
7985d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania
7995d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania    if (metadata == NULL ) {
8005d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania        jniThrowException(env, "java/lang/RuntimeException", "Reply parcel is null");
801075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat        return JNI_FALSE;
8025d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania    }
8035d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania
8045d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania    metadata->freeData();
8055d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania    // On return metadata is positioned at the beginning of the
8065d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania    // metadata. Note however that the parcel actually starts with the
8075d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania    // return code so you should not rewind the parcel using
8085d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania    // setDataPosition(0).
809075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    if (media_player->getMetadata(update_only, apply_filter, metadata) == OK) {
810075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat        return JNI_TRUE;
811075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    } else {
812075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat        return JNI_FALSE;
813075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    }
8145d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania}
8155d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania
8164935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen// This function gets some field IDs, which in turn causes class initialization.
8174935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen// It is called from a static block in MediaPlayer, which won't run until the
8184935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen// first time an instance of this class is used.
8194935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissenstatic void
8204935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissenandroid_media_MediaPlayer_native_init(JNIEnv *env)
8214935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen{
8224935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen    jclass clazz;
8234935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen
8244935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen    clazz = env->FindClass("android/media/MediaPlayer");
8254935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen    if (clazz == NULL) {
8264935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen        return;
8274935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen    }
8284935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen
829075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    fields.context = env->GetFieldID(clazz, "mNativeContext", "J");
8304935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen    if (fields.context == NULL) {
8314935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen        return;
8324935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen    }
8334935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen
8344935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen    fields.post_event = env->GetStaticMethodID(clazz, "postEventFromNative",
8354935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen                                               "(Ljava/lang/Object;IIILjava/lang/Object;)V");
8364935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen    if (fields.post_event == NULL) {
8374935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen        return;
8384935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen    }
8394935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen
840075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    fields.surface_texture = env->GetFieldID(clazz, "mNativeSurfaceTexture", "J");
8411ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg    if (fields.surface_texture == NULL) {
842cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten        return;
843cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten    }
844d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber
845b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar    env->DeleteLocalRef(clazz);
846b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
8475ba69bef8c36e78d1e08fae52fe276276668c20dSelim Gurun    clazz = env->FindClass("android/net/ProxyInfo");
848d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber    if (clazz == NULL) {
849d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber        return;
850d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber    }
851d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber
852d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber    fields.proxyConfigGetHost =
853d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber        env->GetMethodID(clazz, "getHost", "()Ljava/lang/String;");
854d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber
855d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber    fields.proxyConfigGetPort =
856d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber        env->GetMethodID(clazz, "getPort", "()I");
857d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber
858d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber    fields.proxyConfigGetExclusionList =
8595ba69bef8c36e78d1e08fae52fe276276668c20dSelim Gurun        env->GetMethodID(clazz, "getExclusionListAsString", "()Ljava/lang/String;");
860b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
861b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar    env->DeleteLocalRef(clazz);
862b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
8632d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    gPlaybackParamsFields.init(env);
8642d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    gSyncParamsFields.init(env);
8654935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen}
866b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_native_setup(JNIEnv *env, jobject thiz, jobject weak_this)
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
87071f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("native_setup");
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = new MediaPlayer();
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL) {
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/RuntimeException", "Out of memory");
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // create new listener and give it to MediaPlayer
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<JNIMediaPlayerListener> listener = new JNIMediaPlayerListener(env, thiz, weak_this);
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mp->setListener(listener);
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Stow our new C++ MediaPlayer in an opaque field in the Java object.
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    setMediaPlayer(env, thiz, mp);
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_release(JNIEnv *env, jobject thiz)
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
88871f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("release");
889d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang    decVideoSurfaceRef(env, thiz);
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = setMediaPlayer(env, thiz, 0);
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp != NULL) {
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this prevents native callbacks after the object is released
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mp->setListener(0);
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mp->disconnect();
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_native_finalize(JNIEnv *env, jobject thiz)
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
90171f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("native_finalize");
9028dc208476f1fbbf6cd0b8cc3d48487a62cb72883Marco Nelissen    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
9038dc208476f1fbbf6cd0b8cc3d48487a62cb72883Marco Nelissen    if (mp != NULL) {
9048564c8da817a845353d213acd8636b76f567b234Steve Block        ALOGW("MediaPlayer finalized without being released");
9058dc208476f1fbbf6cd0b8cc3d48487a62cb72883Marco Nelissen    }
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    android_media_MediaPlayer_release(env, thiz);
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
90933b840444f5a481dd31e129079d3c0cf3acdf80eGlenn Kastenstatic void android_media_MediaPlayer_set_audio_session_id(JNIEnv *env,  jobject thiz,
91033b840444f5a481dd31e129079d3c0cf3acdf80eGlenn Kasten        jint sessionId) {
91171f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("set_session_id(): %d", sessionId);
912619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
913619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent    if (mp == NULL ) {
914619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent        jniThrowException(env, "java/lang/IllegalStateException", NULL);
915619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent        return;
916619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent    }
91733b840444f5a481dd31e129079d3c0cf3acdf80eGlenn Kasten    process_media_player_call( env, thiz, mp->setAudioSessionId((audio_session_t) sessionId), NULL,
91833b840444f5a481dd31e129079d3c0cf3acdf80eGlenn Kasten            NULL);
919619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent}
920619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent
921619346f902241736d933657a4fe10f10c50a1ba8Eric Laurentstatic jint android_media_MediaPlayer_get_audio_session_id(JNIEnv *env,  jobject thiz) {
92271f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("get_session_id()");
923619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
924619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent    if (mp == NULL ) {
925619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent        jniThrowException(env, "java/lang/IllegalStateException", NULL);
926619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent        return 0;
927619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent    }
928619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent
929075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    return (jint) mp->getAudioSessionId();
930619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent}
931619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent
9327070b36549d511d6627538c73dfbab23fbae5b43Eric Laurentstatic void
9337070b36549d511d6627538c73dfbab23fbae5b43Eric Laurentandroid_media_MediaPlayer_setAuxEffectSendLevel(JNIEnv *env, jobject thiz, jfloat level)
9347070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent{
93571f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("setAuxEffectSendLevel: level %f", level);
9367070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
9377070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent    if (mp == NULL ) {
9387070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent        jniThrowException(env, "java/lang/IllegalStateException", NULL);
9397070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent        return;
9407070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent    }
9417070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent    process_media_player_call( env, thiz, mp->setAuxEffectSendLevel(level), NULL, NULL );
9427070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent}
9437070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent
9447070b36549d511d6627538c73dfbab23fbae5b43Eric Laurentstatic void android_media_MediaPlayer_attachAuxEffect(JNIEnv *env,  jobject thiz, jint effectId) {
94571f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("attachAuxEffect(): %d", effectId);
9467070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
9477070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent    if (mp == NULL ) {
9487070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent        jniThrowException(env, "java/lang/IllegalStateException", NULL);
9497070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent        return;
9507070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent    }
9517070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent    process_media_player_call( env, thiz, mp->attachAuxEffect(effectId), NULL, NULL );
9527070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent}
9537070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent
954d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wangstatic jint
955d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huberandroid_media_MediaPlayer_pullBatteryData(
956d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber        JNIEnv *env, jobject /* thiz */, jobject java_reply)
957d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang{
958d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang    sp<IBinder> binder = defaultServiceManager()->getService(String16("media.player"));
959d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang    sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder);
960d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang    if (service.get() == NULL) {
961d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang        jniThrowException(env, "java/lang/RuntimeException", "cannot get MediaPlayerService");
962d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang        return UNKNOWN_ERROR;
963d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang    }
964d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang
965d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang    Parcel *reply = parcelForJavaObject(env, java_reply);
966d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang
967075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    return (jint) service->pullBatteryData(reply);
968d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang}
969d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang
970720aa282791ef9405d39a15f419a41ab24f11e30John Grossmanstatic jint
971720aa282791ef9405d39a15f419a41ab24f11e30John Grossmanandroid_media_MediaPlayer_setRetransmitEndpoint(JNIEnv *env, jobject thiz,
972720aa282791ef9405d39a15f419a41ab24f11e30John Grossman                                                jstring addrString, jint port) {
973720aa282791ef9405d39a15f419a41ab24f11e30John Grossman    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
974720aa282791ef9405d39a15f419a41ab24f11e30John Grossman    if (mp == NULL ) {
975720aa282791ef9405d39a15f419a41ab24f11e30John Grossman        jniThrowException(env, "java/lang/IllegalStateException", NULL);
976720aa282791ef9405d39a15f419a41ab24f11e30John Grossman        return INVALID_OPERATION;
977720aa282791ef9405d39a15f419a41ab24f11e30John Grossman    }
978720aa282791ef9405d39a15f419a41ab24f11e30John Grossman
979720aa282791ef9405d39a15f419a41ab24f11e30John Grossman    const char *cAddrString = NULL;
980720aa282791ef9405d39a15f419a41ab24f11e30John Grossman
981720aa282791ef9405d39a15f419a41ab24f11e30John Grossman    if (NULL != addrString) {
982720aa282791ef9405d39a15f419a41ab24f11e30John Grossman        cAddrString = env->GetStringUTFChars(addrString, NULL);
983720aa282791ef9405d39a15f419a41ab24f11e30John Grossman        if (cAddrString == NULL) {  // Out of memory
984720aa282791ef9405d39a15f419a41ab24f11e30John Grossman            return NO_MEMORY;
985720aa282791ef9405d39a15f419a41ab24f11e30John Grossman        }
986720aa282791ef9405d39a15f419a41ab24f11e30John Grossman    }
987720aa282791ef9405d39a15f419a41ab24f11e30John Grossman    ALOGV("setRetransmitEndpoint: %s:%d",
988720aa282791ef9405d39a15f419a41ab24f11e30John Grossman            cAddrString ? cAddrString : "(null)", port);
989720aa282791ef9405d39a15f419a41ab24f11e30John Grossman
990720aa282791ef9405d39a15f419a41ab24f11e30John Grossman    status_t ret;
991720aa282791ef9405d39a15f419a41ab24f11e30John Grossman    if (cAddrString && (port > 0xFFFF)) {
992720aa282791ef9405d39a15f419a41ab24f11e30John Grossman        ret = BAD_VALUE;
993720aa282791ef9405d39a15f419a41ab24f11e30John Grossman    } else {
994720aa282791ef9405d39a15f419a41ab24f11e30John Grossman        ret = mp->setRetransmitEndpoint(cAddrString,
995720aa282791ef9405d39a15f419a41ab24f11e30John Grossman                static_cast<uint16_t>(port));
996720aa282791ef9405d39a15f419a41ab24f11e30John Grossman    }
997720aa282791ef9405d39a15f419a41ab24f11e30John Grossman
998720aa282791ef9405d39a15f419a41ab24f11e30John Grossman    if (NULL != addrString) {
999720aa282791ef9405d39a15f419a41ab24f11e30John Grossman        env->ReleaseStringUTFChars(addrString, cAddrString);
1000720aa282791ef9405d39a15f419a41ab24f11e30John Grossman    }
1001720aa282791ef9405d39a15f419a41ab24f11e30John Grossman
1002720aa282791ef9405d39a15f419a41ab24f11e30John Grossman    if (ret == INVALID_OPERATION ) {
1003720aa282791ef9405d39a15f419a41ab24f11e30John Grossman        jniThrowException(env, "java/lang/IllegalStateException", NULL);
1004720aa282791ef9405d39a15f419a41ab24f11e30John Grossman    }
1005720aa282791ef9405d39a15f419a41ab24f11e30John Grossman
1006075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    return (jint) ret;
1007720aa282791ef9405d39a15f419a41ab24f11e30John Grossman}
1008720aa282791ef9405d39a15f419a41ab24f11e30John Grossman
100984b832054552e00257bb04997143ca33d6d100beMarco Nelissenstatic void
101084b832054552e00257bb04997143ca33d6d100beMarco Nelissenandroid_media_MediaPlayer_setNextMediaPlayer(JNIEnv *env, jobject thiz, jobject java_player)
101184b832054552e00257bb04997143ca33d6d100beMarco Nelissen{
101284b832054552e00257bb04997143ca33d6d100beMarco Nelissen    ALOGV("setNextMediaPlayer");
101384b832054552e00257bb04997143ca33d6d100beMarco Nelissen    sp<MediaPlayer> thisplayer = getMediaPlayer(env, thiz);
101484b832054552e00257bb04997143ca33d6d100beMarco Nelissen    if (thisplayer == NULL) {
101584b832054552e00257bb04997143ca33d6d100beMarco Nelissen        jniThrowException(env, "java/lang/IllegalStateException", "This player not initialized");
101684b832054552e00257bb04997143ca33d6d100beMarco Nelissen        return;
101784b832054552e00257bb04997143ca33d6d100beMarco Nelissen    }
101884b832054552e00257bb04997143ca33d6d100beMarco Nelissen    sp<MediaPlayer> nextplayer = (java_player == NULL) ? NULL : getMediaPlayer(env, java_player);
101984b832054552e00257bb04997143ca33d6d100beMarco Nelissen    if (nextplayer == NULL && java_player != NULL) {
102084b832054552e00257bb04997143ca33d6d100beMarco Nelissen        jniThrowException(env, "java/lang/IllegalStateException", "That player not initialized");
102184b832054552e00257bb04997143ca33d6d100beMarco Nelissen        return;
102284b832054552e00257bb04997143ca33d6d100beMarco Nelissen    }
102384b832054552e00257bb04997143ca33d6d100beMarco Nelissen
102484b832054552e00257bb04997143ca33d6d100beMarco Nelissen    if (nextplayer == thisplayer) {
102584b832054552e00257bb04997143ca33d6d100beMarco Nelissen        jniThrowException(env, "java/lang/IllegalArgumentException", "Next player can't be self");
102684b832054552e00257bb04997143ca33d6d100beMarco Nelissen        return;
102784b832054552e00257bb04997143ca33d6d100beMarco Nelissen    }
102884b832054552e00257bb04997143ca33d6d100beMarco Nelissen    // tie the two players together
102984b832054552e00257bb04997143ca33d6d100beMarco Nelissen    process_media_player_call(
103084b832054552e00257bb04997143ca33d6d100beMarco Nelissen            env, thiz, thisplayer->setNextMediaPlayer(nextplayer),
103184b832054552e00257bb04997143ca33d6d100beMarco Nelissen            "java/lang/IllegalArgumentException",
103284b832054552e00257bb04997143ca33d6d100beMarco Nelissen            "setNextMediaPlayer failed." );
103384b832054552e00257bb04997143ca33d6d100beMarco Nelissen    ;
103484b832054552e00257bb04997143ca33d6d100beMarco Nelissen}
103584b832054552e00257bb04997143ca33d6d100beMarco Nelissen
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
103876f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gMethods[] = {
103917524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong    {
1040d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber        "nativeSetDataSource",
1041d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber        "(Landroid/os/IBinder;Ljava/lang/String;[Ljava/lang/String;"
1042d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber        "[Ljava/lang/String;)V",
104317524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong        (void *)android_media_MediaPlayer_setDataSourceAndHeaders
104417524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong    },
104517524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong
10464eaa2938084353a54dc259466172909329a048ccChris Watkins    {"_setDataSource",      "(Ljava/io/FileDescriptor;JJ)V",    (void *)android_media_MediaPlayer_setDataSourceFD},
10474eaa2938084353a54dc259466172909329a048ccChris Watkins    {"_setDataSource",      "(Landroid/media/MediaDataSource;)V",(void *)android_media_MediaPlayer_setDataSourceCallback },
10481ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg    {"_setVideoSurface",    "(Landroid/view/Surface;)V",        (void *)android_media_MediaPlayer_setVideoSurface},
1049c42a96dba4beaf87875e71b8d8b77ce7154c5cdbRobert Shih    {"_prepare",            "()V",                              (void *)android_media_MediaPlayer_prepare},
105007830aa6ba4804880df3cb39f8932aa6b3906a8aRobert Shih    {"prepareAsync",        "()V",                              (void *)android_media_MediaPlayer_prepareAsync},
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"_start",              "()V",                              (void *)android_media_MediaPlayer_start},
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"_stop",               "()V",                              (void *)android_media_MediaPlayer_stop},
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"getVideoWidth",       "()I",                              (void *)android_media_MediaPlayer_getVideoWidth},
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"getVideoHeight",      "()I",                              (void *)android_media_MediaPlayer_getVideoHeight},
10552d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    {"setPlaybackParams", "(Landroid/media/PlaybackParams;)V", (void *)android_media_MediaPlayer_setPlaybackParams},
10562d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    {"getPlaybackParams", "()Landroid/media/PlaybackParams;", (void *)android_media_MediaPlayer_getPlaybackParams},
10572d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    {"setSyncParams",     "(Landroid/media/SyncParams;)V",  (void *)android_media_MediaPlayer_setSyncParams},
10582d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    {"getSyncParams",     "()Landroid/media/SyncParams;",   (void *)android_media_MediaPlayer_getSyncParams},
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"seekTo",              "(I)V",                             (void *)android_media_MediaPlayer_seekTo},
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"_pause",              "()V",                              (void *)android_media_MediaPlayer_pause},
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"isPlaying",           "()Z",                              (void *)android_media_MediaPlayer_isPlaying},
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"getCurrentPosition",  "()I",                              (void *)android_media_MediaPlayer_getCurrentPosition},
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"getDuration",         "()I",                              (void *)android_media_MediaPlayer_getDuration},
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"_release",            "()V",                              (void *)android_media_MediaPlayer_release},
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"_reset",              "()V",                              (void *)android_media_MediaPlayer_reset},
10661af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock    {"_setAudioStreamType", "(I)V",                             (void *)android_media_MediaPlayer_setAudioStreamType},
10671af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock    {"_getAudioStreamType", "()I",                              (void *)android_media_MediaPlayer_getAudioStreamType},
10688df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    {"setParameter",        "(ILandroid/os/Parcel;)Z",          (void *)android_media_MediaPlayer_setParameter},
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"setLooping",          "(Z)V",                             (void *)android_media_MediaPlayer_setLooping},
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"isLooping",           "()Z",                              (void *)android_media_MediaPlayer_isLooping},
10711af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock    {"_setVolume",          "(FF)V",                            (void *)android_media_MediaPlayer_setVolume},
107220cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania    {"native_invoke",       "(Landroid/os/Parcel;Landroid/os/Parcel;)I",(void *)android_media_MediaPlayer_invoke},
1073b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania    {"native_setMetadataFilter", "(Landroid/os/Parcel;)I",      (void *)android_media_MediaPlayer_setMetadataFilter},
10745d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania    {"native_getMetadata", "(ZZLandroid/os/Parcel;)Z",          (void *)android_media_MediaPlayer_getMetadata},
10754935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen    {"native_init",         "()V",                              (void *)android_media_MediaPlayer_native_init},
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"native_setup",        "(Ljava/lang/Object;)V",            (void *)android_media_MediaPlayer_native_setup},
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"native_finalize",     "()V",                              (void *)android_media_MediaPlayer_native_finalize},
1078619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent    {"getAudioSessionId",   "()I",                              (void *)android_media_MediaPlayer_get_audio_session_id},
1079619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent    {"setAudioSessionId",   "(I)V",                             (void *)android_media_MediaPlayer_set_audio_session_id},
10801af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock    {"_setAuxEffectSendLevel", "(F)V",                          (void *)android_media_MediaPlayer_setAuxEffectSendLevel},
10817070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent    {"attachAuxEffect",     "(I)V",                             (void *)android_media_MediaPlayer_attachAuxEffect},
1082d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang    {"native_pullBatteryData", "(Landroid/os/Parcel;)I",        (void *)android_media_MediaPlayer_pullBatteryData},
1083720aa282791ef9405d39a15f419a41ab24f11e30John Grossman    {"native_setRetransmitEndpoint", "(Ljava/lang/String;I)I",  (void *)android_media_MediaPlayer_setRetransmitEndpoint},
108484b832054552e00257bb04997143ca33d6d100beMarco Nelissen    {"setNextMediaPlayer",  "(Landroid/media/MediaPlayer;)V",   (void *)android_media_MediaPlayer_setNextMediaPlayer},
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10874935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen// This function only registers the native methods
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int register_android_media_MediaPlayer(JNIEnv *env)
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return AndroidRuntime::registerNativeMethods(env,
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "android/media/MediaPlayer", gMethods, NELEM(gMethods));
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1093fe968dfc12fd4e0ef633ca88dfc403678bf4d16aJaesung Chungextern int register_android_media_ExifInterface(JNIEnv *env);
1094212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun Heextern int register_android_media_ImageReader(JNIEnv *env);
1095f6a09e510649ae4701bb5ad4c40d102d59a5608cZhijun Heextern int register_android_media_ImageWriter(JNIEnv *env);
10968240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huberextern int register_android_media_Crypto(JNIEnv *env);
10978a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerextern int register_android_media_Drm(JNIEnv *env);
109888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberextern int register_android_media_MediaCodec(JNIEnv *env);
109988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberextern int register_android_media_MediaExtractor(JNIEnv *env);
11005a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huberextern int register_android_media_MediaCodecList(JNIEnv *env);
1101d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huberextern int register_android_media_MediaHTTPConnection(JNIEnv *env);
1102bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huberextern int register_android_media_MediaMetadataRetriever(JNIEnv *env);
110368ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghuiextern int register_android_media_MediaMuxer(JNIEnv *env);
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern int register_android_media_MediaRecorder(JNIEnv *env);
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern int register_android_media_MediaScanner(JNIEnv *env);
1106071a8b71d1212e218a3ebf7dbb8908a4acf5cf6dWei Jiaextern int register_android_media_MediaSync(JNIEnv *env);
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern int register_android_media_ResampleInputStream(JNIEnv *env);
1108c371194e4e0651c328f1870a90bbfd4e217c747bJames Dongextern int register_android_media_MediaProfiles(JNIEnv *env);
1109bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huberextern int register_android_media_AmrInputStream(JNIEnv *env);
11100cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwoodextern int register_android_mtp_MtpDatabase(JNIEnv *env);
11118182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwoodextern int register_android_mtp_MtpDevice(JNIEnv *env);
11120cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwoodextern int register_android_mtp_MtpServer(JNIEnv *env);
1113bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huber
1114d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huberjint JNI_OnLoad(JavaVM* vm, void* /* reserved */)
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    JNIEnv* env = NULL;
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jint result = -1;
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
11203762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("ERROR: GetEnv failed\n");
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        goto bail;
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    assert(env != NULL);
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1125f6a09e510649ae4701bb5ad4c40d102d59a5608cZhijun He    if (register_android_media_ImageWriter(env) != JNI_OK) {
1126f6a09e510649ae4701bb5ad4c40d102d59a5608cZhijun He        ALOGE("ERROR: ImageWriter native registration failed");
1127f6a09e510649ae4701bb5ad4c40d102d59a5608cZhijun He        goto bail;
1128f6a09e510649ae4701bb5ad4c40d102d59a5608cZhijun He    }
1129f6a09e510649ae4701bb5ad4c40d102d59a5608cZhijun He
1130212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun He    if (register_android_media_ImageReader(env) < 0) {
1131212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun He        ALOGE("ERROR: ImageReader native registration failed");
1132212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun He        goto bail;
1133212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun He    }
1134212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun He
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (register_android_media_MediaPlayer(env) < 0) {
11363762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("ERROR: MediaPlayer native registration failed\n");
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        goto bail;
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (register_android_media_MediaRecorder(env) < 0) {
11413762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("ERROR: MediaRecorder native registration failed\n");
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        goto bail;
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (register_android_media_MediaScanner(env) < 0) {
11463762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("ERROR: MediaScanner native registration failed\n");
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        goto bail;
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (register_android_media_MediaMetadataRetriever(env) < 0) {
11513762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("ERROR: MediaMetadataRetriever native registration failed\n");
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        goto bail;
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (register_android_media_AmrInputStream(env) < 0) {
11563762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("ERROR: AmrInputStream native registration failed\n");
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        goto bail;
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (register_android_media_ResampleInputStream(env) < 0) {
11613762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("ERROR: ResampleInputStream native registration failed\n");
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        goto bail;
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1165c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    if (register_android_media_MediaProfiles(env) < 0) {
11663762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("ERROR: MediaProfiles native registration failed");
1167c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        goto bail;
1168c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    }
1169c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong
11700cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwood    if (register_android_mtp_MtpDatabase(env) < 0) {
11713762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("ERROR: MtpDatabase native registration failed");
1172d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood        goto bail;
1173d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood    }
1174d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood
11758182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    if (register_android_mtp_MtpDevice(env) < 0) {
11763762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("ERROR: MtpDevice native registration failed");
11778182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        goto bail;
11788182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
11798182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
11800cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwood    if (register_android_mtp_MtpServer(env) < 0) {
11813762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("ERROR: MtpServer native registration failed");
118281ea83d10883886013bc95eac2fe032acf1e7aa9Mike Lockwood        goto bail;
118381ea83d10883886013bc95eac2fe032acf1e7aa9Mike Lockwood    }
118481ea83d10883886013bc95eac2fe032acf1e7aa9Mike Lockwood
118588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    if (register_android_media_MediaCodec(env) < 0) {
118688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        ALOGE("ERROR: MediaCodec native registration failed");
1187071a8b71d1212e218a3ebf7dbb8908a4acf5cf6dWei Jia        goto bail;
1188071a8b71d1212e218a3ebf7dbb8908a4acf5cf6dWei Jia    }
1189071a8b71d1212e218a3ebf7dbb8908a4acf5cf6dWei Jia
1190071a8b71d1212e218a3ebf7dbb8908a4acf5cf6dWei Jia    if (register_android_media_MediaSync(env) < 0) {
1191071a8b71d1212e218a3ebf7dbb8908a4acf5cf6dWei Jia        ALOGE("ERROR: MediaSync native registration failed");
119288572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        goto bail;
119388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    }
119488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
119588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    if (register_android_media_MediaExtractor(env) < 0) {
119688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        ALOGE("ERROR: MediaCodec native registration failed");
119788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        goto bail;
119888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    }
119988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
120068ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    if (register_android_media_MediaMuxer(env) < 0) {
120168ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        ALOGE("ERROR: MediaMuxer native registration failed");
120268ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        goto bail;
120368ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    }
120468ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
12055a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber    if (register_android_media_MediaCodecList(env) < 0) {
12065a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber        ALOGE("ERROR: MediaCodec native registration failed");
12075a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber        goto bail;
12085a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber    }
12095a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber
12108240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber    if (register_android_media_Crypto(env) < 0) {
12118240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber        ALOGE("ERROR: MediaCodec native registration failed");
12128240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber        goto bail;
12138240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber    }
12148240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber
12158a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker    if (register_android_media_Drm(env) < 0) {
12168a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker        ALOGE("ERROR: MediaDrm native registration failed");
12178a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker        goto bail;
12188a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker    }
12198a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker
1220d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber    if (register_android_media_MediaHTTPConnection(env) < 0) {
1221d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber        ALOGE("ERROR: MediaHTTPConnection native registration failed");
1222d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber        goto bail;
1223d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber    }
1224d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber
1225fe968dfc12fd4e0ef633ca88dfc403678bf4d16aJaesung Chung    if (register_android_media_ExifInterface(env) < 0) {
1226fe968dfc12fd4e0ef633ca88dfc403678bf4d16aJaesung Chung        ALOGE("ERROR: ExifInterface native registration failed");
1227fe968dfc12fd4e0ef633ca88dfc403678bf4d16aJaesung Chung        goto bail;
1228fe968dfc12fd4e0ef633ca88dfc403678bf4d16aJaesung Chung    }
1229fe968dfc12fd4e0ef633ca88dfc403678bf4d16aJaesung Chung
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* success -- return valid version number */
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    result = JNI_VERSION_1_4;
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbail:
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return result;
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// KTHXBYE
1238