android_media_MediaPlayer.cpp revision 035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117
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>
260e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick#include <media/MediaAnalyticsItem.h>
270e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick#include <media/stagefright/Utils.h>            // for FOURCC definition
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h>
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <assert.h>
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <limits.h>
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <unistd.h>
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <fcntl.h>
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/threads.h>
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h"
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "JNIHelp.h"
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "android_runtime/AndroidRuntime.h"
371ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg#include "android_runtime/android_view_Surface.h"
3887eac99a21772ae56018cb81db6966557b459554Ruben Brunk#include "android_runtime/Log.h"
394df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project#include "utils/Errors.h"  // for status_t
40256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber#include "utils/KeyedVector.h"
41256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber#include "utils/String8.h"
4223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia#include "android_media_BufferingParams.h"
434eaa2938084353a54dc259466172909329a048ccChris Watkins#include "android_media_MediaDataSource.h"
440e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick#include "android_media_MediaMetricsJNI.h"
452d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia#include "android_media_PlaybackParams.h"
462d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia#include "android_media_SyncParams.h"
47035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung#include "android_media_VolumeShaper.h"
4879f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong#include "android_media_Utils.h"
4979f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong
50d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#include "android_os_Parcel.h"
5120cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania#include "android_util_Binder.h"
5220cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania#include <binder/Parcel.h>
53d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden#include <gui/IGraphicBufferProducer.h>
548335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian#include <gui/Surface.h>
55d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang#include <binder/IPCThreadState.h>
56d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang#include <binder/IServiceManager.h>
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
58d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber#include "android_util_Binder.h"
590b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
600b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania// Modular DRM begin
610b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania#include <media/drm/DrmAPI.h>
620b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
630b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania#define FIND_CLASS(var, className) \
640b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniavar = env->FindClass(className); \
650b52e95c3fe5e8de93276678d7db9a17b217622eHassan ShojaniaLOG_FATAL_IF(! (var), "Unable to find class " className);
660b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
670b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania#define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \
680b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniavar = env->GetFieldID(clazz, fieldName, fieldDescriptor); \
690b52e95c3fe5e8de93276678d7db9a17b217622eHassan ShojaniaLOG_FATAL_IF(! (var), "Unable to find field " fieldName);
700b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
710b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania#define GET_METHOD_ID(var, clazz, fieldName, fieldDescriptor) \
720b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniavar = env->GetMethodID(clazz, fieldName, fieldDescriptor); \
730b52e95c3fe5e8de93276678d7db9a17b217622eHassan ShojaniaLOG_FATAL_IF(! (var), "Unable to find method " fieldName);
740b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
750b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania#define GET_STATIC_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \
760b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniavar = env->GetStaticFieldID(clazz, fieldName, fieldDescriptor); \
770b52e95c3fe5e8de93276678d7db9a17b217622eHassan ShojaniaLOG_FATAL_IF(! (var), "Unable to find field " fieldName);
780b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
790b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
800b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania// TODO: investigate if these can be shared with their MediaDrm counterparts
810b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastruct RequestFields {
820b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    jfieldID data;
830b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    jfieldID defaultUrl;
840b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    jfieldID requestType;
850b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania};
860b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
870b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastruct HashmapFields {
880b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    jmethodID init;
890b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    jmethodID get;
900b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    jmethodID put;
910b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    jmethodID entrySet;
920b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania};
930b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
940b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastruct SetFields {
950b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    jmethodID iterator;
960b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania};
970b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
980b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastruct IteratorFields {
990b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    jmethodID next;
1000b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    jmethodID hasNext;
1010b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania};
1020b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
1030b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastruct EntryFields {
1040b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    jmethodID getKey;
1050b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    jmethodID getValue;
1060b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania};
1070b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
1080b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastruct KeyTypes {
1090b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    jint kKeyTypeStreaming;
1100b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    jint kKeyTypeOffline;
1110b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    jint kKeyTypeRelease;
1120b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania};
1130b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
1140b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastatic KeyTypes gKeyTypes;
1150b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
1160b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastruct KeyRequestTypes {
1170b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    jint kKeyRequestTypeInitial;
1180b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    jint kKeyRequestTypeRenewal;
1190b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    jint kKeyRequestTypeRelease;
1200b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania};
1210b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
1220b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastatic KeyRequestTypes gKeyRequestTypes;
1230b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
1240b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastruct StateExceptionFields {
1250b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    jmethodID init;
1260b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    jclass classId;
1270b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania};
1280b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
1290b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastruct drm_fields_t {
1300b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    RequestFields keyRequest;
1310b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    HashmapFields hashmap;
1320b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    SetFields set;
1330b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    IteratorFields iterator;
1340b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    EntryFields entry;
1350b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    StateExceptionFields stateException;
1360b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    jclass stringClassId;
1370b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania};
1380b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
1390b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastatic drm_fields_t gFields;
1400b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
1410b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania// Modular DRM end
1420b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace android;
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct fields_t {
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jfieldID    context;
1511ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg    jfieldID    surface_texture;
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jmethodID   post_event;
154d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber
155d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber    jmethodID   proxyConfigGetHost;
156d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber    jmethodID   proxyConfigGetPort;
157d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber    jmethodID   proxyConfigGetExclusionList;
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic fields_t fields;
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16123dfee521a7782bf901344beec6f94614e0b02b8Wei Jiastatic BufferingParams::fields_t gBufferingParamsFields;
1622d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jiastatic PlaybackParams::fields_t gPlaybackParamsFields;
1632d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jiastatic SyncParams::fields_t gSyncParamsFields;
164035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hungstatic VolumeShaperHelper::fields_t gVolumeShaperFields;
165b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic Mutex sLock;
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ref-counted object for callbacks
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass JNIMediaPlayerListener: public MediaPlayerListener
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic:
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    JNIMediaPlayerListener(JNIEnv* env, jobject thiz, jobject weak_thiz);
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ~JNIMediaPlayerListener();
175162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang    virtual void notify(int msg, int ext1, int ext2, const Parcel *obj = NULL);
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate:
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    JNIMediaPlayerListener();
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jclass      mClass;     // Reference to MediaPlayer class
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jobject     mObject;    // Weak ref to MediaPlayer Java object to call on
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJNIMediaPlayerListener::JNIMediaPlayerListener(JNIEnv* env, jobject thiz, jobject weak_thiz)
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Hold onto the MediaPlayer class for use in calling the static method
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // that posts events to the application thread.
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jclass clazz = env->GetObjectClass(thiz);
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (clazz == NULL) {
1893762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("Can't find android/media/MediaPlayer");
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/Exception", NULL);
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mClass = (jclass)env->NewGlobalRef(clazz);
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // We use a weak reference so the MediaPlayer object can be garbage collected.
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // The reference is only used as a proxy for callbacks.
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mObject  = env->NewGlobalRef(weak_thiz);
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectJNIMediaPlayerListener::~JNIMediaPlayerListener()
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // remove global references
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    JNIEnv *env = AndroidRuntime::getJNIEnv();
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->DeleteGlobalRef(mObject);
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->DeleteGlobalRef(mClass);
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
208162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wangvoid JNIMediaPlayerListener::notify(int msg, int ext1, int ext2, const Parcel *obj)
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    JNIEnv *env = AndroidRuntime::getJNIEnv();
211162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang    if (obj && obj->dataSize() > 0) {
212333c09945e7399c6a2b1f4d9fdf981508e38db52Insun Kang        jobject jParcel = createJavaParcelObject(env);
213333c09945e7399c6a2b1f4d9fdf981508e38db52Insun Kang        if (jParcel != NULL) {
214333c09945e7399c6a2b1f4d9fdf981508e38db52Insun Kang            Parcel* nativeParcel = parcelForJavaObject(env, jParcel);
2158902097bb686752ff207e3bda12713be1a8c74ebInsun Kang            nativeParcel->setData(obj->data(), obj->dataSize());
216162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang            env->CallStaticVoidMethod(mClass, fields.post_event, mObject,
217333c09945e7399c6a2b1f4d9fdf981508e38db52Insun Kang                    msg, ext1, ext2, jParcel);
21899f752149b1a0df9ea0ba311d609d4d6e103787cElliott Hughes            env->DeleteLocalRef(jParcel);
219162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang        }
220162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang    } else {
221162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang        env->CallStaticVoidMethod(mClass, fields.post_event, mObject,
222162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang                msg, ext1, ext2, NULL);
223162ee49e1ce8800de80697fdd0e0e42ad7e9374eGloria Wang    }
2248902097bb686752ff207e3bda12713be1a8c74ebInsun Kang    if (env->ExceptionCheck()) {
2258902097bb686752ff207e3bda12713be1a8c74ebInsun Kang        ALOGW("An exception occurred while notifying an event.");
2268902097bb686752ff207e3bda12713be1a8c74ebInsun Kang        LOGW_EX(env);
2278902097bb686752ff207e3bda12713be1a8c74ebInsun Kang        env->ExceptionClear();
2288902097bb686752ff207e3bda12713be1a8c74ebInsun Kang    }
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic sp<MediaPlayer> getMediaPlayer(JNIEnv* env, jobject thiz)
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Mutex::Autolock l(sLock);
236075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    MediaPlayer* const p = (MediaPlayer*)env->GetLongField(thiz, fields.context);
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return sp<MediaPlayer>(p);
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic sp<MediaPlayer> setMediaPlayer(JNIEnv* env, jobject thiz, const sp<MediaPlayer>& player)
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Mutex::Autolock l(sLock);
243075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    sp<MediaPlayer> old = (MediaPlayer*)env->GetLongField(thiz, fields.context);
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (player.get()) {
245b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian        player->incStrong((void*)setMediaPlayer);
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (old != 0) {
248b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian        old->decStrong((void*)setMediaPlayer);
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
250075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    env->SetLongField(thiz, fields.context, (jlong)player.get());
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return old;
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25432f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania// If exception is NULL and opStatus is not OK, this method sends an error
25532f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania// event to the client application; otherwise, if exception is not NULL and
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// opStatus is not OK, this method throws the given exception to the client
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// application.
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void process_media_player_call(JNIEnv *env, jobject thiz, status_t opStatus, const char* exception, const char *message)
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (exception == NULL) {  // Don't throw exception. Instead, send an event.
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (opStatus != (status_t) OK) {
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mp != 0) mp->notify(MEDIA_ERROR, opStatus, 0);
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {  // Throw exception!
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ( opStatus == (status_t) INVALID_OPERATION ) {
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            jniThrowException(env, "java/lang/IllegalStateException", NULL);
26805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar        } else if ( opStatus == (status_t) BAD_VALUE ) {
26905ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar            jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
270fc301b0bb5c635c6bb51b48c504a8db5f9010e5cDave Burke        } else if ( opStatus == (status_t) PERMISSION_DENIED ) {
271fc301b0bb5c635c6bb51b48c504a8db5f9010e5cDave Burke            jniThrowException(env, "java/lang/SecurityException", NULL);
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if ( opStatus != (status_t) OK ) {
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (strlen(message) > 230) {
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               // if the message is too long, don't bother displaying the status code
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               jniThrowException( env, exception, message);
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               char msg[256];
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // append the status code to the message
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               sprintf(msg, "%s: status=0x%X", message, opStatus);
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               jniThrowException( env, exception, msg);
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void
287256430093679e1d62b54fb0c852126e54d162f6fAndreas Huberandroid_media_MediaPlayer_setDataSourceAndHeaders(
288d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber        JNIEnv *env, jobject thiz, jobject httpServiceBinderObj, jstring path,
28917524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong        jobjectArray keys, jobjectArray values) {
29017524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (path == NULL) {
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
302c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong    const char *tmp = env->GetStringUTFChars(path, NULL);
303c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong    if (tmp == NULL) {  // Out of memory
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30671f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("setDataSource: path %s", tmp);
307256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber
308c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong    String8 pathStr(tmp);
309c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong    env->ReleaseStringUTFChars(path, tmp);
310c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong    tmp = NULL;
311c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong
31217524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong    // We build a KeyedVector out of the key and val arrays
31317524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong    KeyedVector<String8, String8> headersVector;
31479f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong    if (!ConvertKeyValueArraysToKeyedVector(
31579f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong            env, keys, values, &headersVector)) {
31679f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong        return;
317256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber    }
318256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber
319d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber    sp<IMediaHTTPService> httpService;
320d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber    if (httpServiceBinderObj != NULL) {
321d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber        sp<IBinder> binder = ibinderForJavaObject(env, httpServiceBinderObj);
322d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber        httpService = interface_cast<IMediaHTTPService>(binder);
323d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber    }
324d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber
325256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber    status_t opStatus =
326256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber        mp->setDataSource(
327d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber                httpService,
328c371a02e7cf504e9a926ca29c33e63b658c2cef7James Dong                pathStr,
32979f407cc6c5ae34fc6f04d52fd034b49d1f002c4James Dong                headersVector.size() > 0? &headersVector : NULL);
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
331256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber    process_media_player_call(
332256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber            env, thiz, opStatus, "java/io/IOException",
333256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber            "setDataSource failed." );
334256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber}
335256430093679e1d62b54fb0c852126e54d162f6fAndreas Huber
336256430093679e1d62b54fb0c852126e54d162f6fAndreas Huberstatic void
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_setDataSourceFD(JNIEnv *env, jobject thiz, jobject fileDescriptor, jlong offset, jlong length)
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (fileDescriptor == NULL) {
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
349a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes    int fd = jniGetFDFromFileDescriptor(env, fileDescriptor);
35071f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("setDataSourceFD: fd %d", fd);
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    process_media_player_call( env, thiz, mp->setDataSource(fd, offset, length), "java/io/IOException", "setDataSourceFD failed." );
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3544eaa2938084353a54dc259466172909329a048ccChris Watkinsstatic void
3554eaa2938084353a54dc259466172909329a048ccChris Watkinsandroid_media_MediaPlayer_setDataSourceCallback(JNIEnv *env, jobject thiz, jobject dataSource)
3564eaa2938084353a54dc259466172909329a048ccChris Watkins{
3574eaa2938084353a54dc259466172909329a048ccChris Watkins    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
3584eaa2938084353a54dc259466172909329a048ccChris Watkins    if (mp == NULL ) {
3594eaa2938084353a54dc259466172909329a048ccChris Watkins        jniThrowException(env, "java/lang/IllegalStateException", NULL);
3604eaa2938084353a54dc259466172909329a048ccChris Watkins        return;
3614eaa2938084353a54dc259466172909329a048ccChris Watkins    }
3624eaa2938084353a54dc259466172909329a048ccChris Watkins
3634eaa2938084353a54dc259466172909329a048ccChris Watkins    if (dataSource == NULL) {
3644eaa2938084353a54dc259466172909329a048ccChris Watkins        jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
3654eaa2938084353a54dc259466172909329a048ccChris Watkins        return;
3664eaa2938084353a54dc259466172909329a048ccChris Watkins    }
3674eaa2938084353a54dc259466172909329a048ccChris Watkins    sp<IDataSource> callbackDataSource = new JMediaDataSource(env, dataSource);
3684eaa2938084353a54dc259466172909329a048ccChris Watkins    process_media_player_call(env, thiz, mp->setDataSource(callbackDataSource), "java/lang/RuntimeException", "setDataSourceCallback failed." );
3694eaa2938084353a54dc259466172909329a048ccChris Watkins}
3704eaa2938084353a54dc259466172909329a048ccChris Watkins
371d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFaddenstatic sp<IGraphicBufferProducer>
3721ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted BonkenburggetVideoSurfaceTexture(JNIEnv* env, jobject thiz) {
373075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    IGraphicBufferProducer * const p = (IGraphicBufferProducer*)env->GetLongField(thiz, fields.surface_texture);
374d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden    return sp<IGraphicBufferProducer>(p);
3758b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks}
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void
378d59310d08637c8531dc7949fc166b0daeede53c0Gloria WangdecVideoSurfaceRef(JNIEnv *env, jobject thiz)
379d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang{
380e828beb3866e2275cd26acd2a58f9f8a3967ba30Gloria Wang    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
381e828beb3866e2275cd26acd2a58f9f8a3967ba30Gloria Wang    if (mp == NULL) {
382e828beb3866e2275cd26acd2a58f9f8a3967ba30Gloria Wang        return;
383e828beb3866e2275cd26acd2a58f9f8a3967ba30Gloria Wang    }
384e828beb3866e2275cd26acd2a58f9f8a3967ba30Gloria Wang
385d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden    sp<IGraphicBufferProducer> old_st = getVideoSurfaceTexture(env, thiz);
386d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang    if (old_st != NULL) {
387b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian        old_st->decStrong((void*)decVideoSurfaceRef);
388d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang    }
389d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang}
390d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang
391d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wangstatic void
39243ef913815ec84d04877a698614a31e129cd97e3James DongsetVideoSurface(JNIEnv *env, jobject thiz, jobject jsurface, jboolean mediaPlayerMustBeAlive)
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
39543ef913815ec84d04877a698614a31e129cd97e3James Dong    if (mp == NULL) {
39643ef913815ec84d04877a698614a31e129cd97e3James Dong        if (mediaPlayerMustBeAlive) {
39743ef913815ec84d04877a698614a31e129cd97e3James Dong            jniThrowException(env, "java/lang/IllegalStateException", NULL);
39843ef913815ec84d04877a698614a31e129cd97e3James Dong        }
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4011ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg
402d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang    decVideoSurfaceRef(env, thiz);
403d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang
404d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden    sp<IGraphicBufferProducer> new_st;
4051ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg    if (jsurface) {
40664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        sp<Surface> surface(android_view_Surface_getSurface(env, jsurface));
407f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis        if (surface != NULL) {
40852800617946c456e78ed010c82d0ec4358368164Mathias Agopian            new_st = surface->getIGraphicBufferProducer();
409097922b9c1e0821beb107024bcd0dc14144c0920James Dong            if (new_st == NULL) {
410097922b9c1e0821beb107024bcd0dc14144c0920James Dong                jniThrowException(env, "java/lang/IllegalArgumentException",
411097922b9c1e0821beb107024bcd0dc14144c0920James Dong                    "The surface does not have a binding SurfaceTexture!");
412097922b9c1e0821beb107024bcd0dc14144c0920James Dong                return;
413097922b9c1e0821beb107024bcd0dc14144c0920James Dong            }
414b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian            new_st->incStrong((void*)decVideoSurfaceRef);
415f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis        } else {
416f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis            jniThrowException(env, "java/lang/IllegalArgumentException",
417f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis                    "The surface has been released");
418f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis            return;
419f76afc80d229cf0c918e849acf5d8c4f5d4ffd07Jamie Gennis        }
4201ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg    }
421d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang
422075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    env->SetLongField(thiz, fields.surface_texture, (jlong)new_st.get());
4231ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg
4241ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg    // This will fail if the media player has not been initialized yet. This
4251ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg    // can be the case if setDisplay() on MediaPlayer.java has been called
4261ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg    // before setDataSource(). The redundant call to setVideoSurfaceTexture()
4271ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg    // in prepare/prepareAsync covers for this case.
4281ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg    mp->setVideoSurfaceTexture(new_st);
4298b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks}
4308b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks
4318b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparksstatic void
43243ef913815ec84d04877a698614a31e129cd97e3James Dongandroid_media_MediaPlayer_setVideoSurface(JNIEnv *env, jobject thiz, jobject jsurface)
43343ef913815ec84d04877a698614a31e129cd97e3James Dong{
43443ef913815ec84d04877a698614a31e129cd97e3James Dong    setVideoSurface(env, thiz, jsurface, true /* mediaPlayerMustBeAlive */);
43543ef913815ec84d04877a698614a31e129cd97e3James Dong}
43643ef913815ec84d04877a698614a31e129cd97e3James Dong
43723dfee521a7782bf901344beec6f94614e0b02b8Wei Jiastatic jobject
43823dfee521a7782bf901344beec6f94614e0b02b8Wei Jiaandroid_media_MediaPlayer_getDefaultBufferingParams(JNIEnv *env, jobject thiz)
43923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia{
44023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
44123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    if (mp == NULL) {
44223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        jniThrowException(env, "java/lang/IllegalStateException", NULL);
44323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        return NULL;
44423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    }
44523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
44623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    BufferingParams bp;
44723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    BufferingSettings &settings = bp.settings;
44823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    process_media_player_call(
44923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            env, thiz, mp->getDefaultBufferingSettings(&settings),
45023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            "java/lang/IllegalStateException", "unexpected error");
45123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    ALOGV("getDefaultBufferingSettings:{%s}", settings.toString().string());
45223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
45323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    return bp.asJobject(env, gBufferingParamsFields);
45423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia}
45523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
45623dfee521a7782bf901344beec6f94614e0b02b8Wei Jiastatic jobject
45723dfee521a7782bf901344beec6f94614e0b02b8Wei Jiaandroid_media_MediaPlayer_getBufferingParams(JNIEnv *env, jobject thiz)
45823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia{
45923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
46023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    if (mp == NULL) {
46123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        jniThrowException(env, "java/lang/IllegalStateException", NULL);
46223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        return NULL;
46323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    }
46423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
46523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    BufferingParams bp;
46623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    BufferingSettings &settings = bp.settings;
46723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    process_media_player_call(
46823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            env, thiz, mp->getBufferingSettings(&settings),
46923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            "java/lang/IllegalStateException", "unexpected error");
47023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    ALOGV("getBufferingSettings:{%s}", settings.toString().string());
47123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
47223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    return bp.asJobject(env, gBufferingParamsFields);
47323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia}
47423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
47523dfee521a7782bf901344beec6f94614e0b02b8Wei Jiastatic void
47623dfee521a7782bf901344beec6f94614e0b02b8Wei Jiaandroid_media_MediaPlayer_setBufferingParams(JNIEnv *env, jobject thiz, jobject params)
47723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia{
47823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    if (params == NULL) {
47923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        return;
48023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    }
48123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
48223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
48323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    if (mp == NULL) {
48423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        jniThrowException(env, "java/lang/IllegalStateException", NULL);
48523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia        return;
48623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    }
48723dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
48823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    BufferingParams bp;
48923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    bp.fillFromJobject(env, gBufferingParamsFields, params);
49023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    ALOGV("setBufferingParams:{%s}", bp.settings.toString().string());
49123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
49223dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    process_media_player_call(
49323dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            env, thiz, mp->setBufferingSettings(bp.settings),
49423dfee521a7782bf901344beec6f94614e0b02b8Wei Jia            "java/lang/IllegalStateException", "unexpected error");
49523dfee521a7782bf901344beec6f94614e0b02b8Wei Jia}
49623dfee521a7782bf901344beec6f94614e0b02b8Wei Jia
49743ef913815ec84d04877a698614a31e129cd97e3James Dongstatic void
4988b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparksandroid_media_MediaPlayer_prepare(JNIEnv *env, jobject thiz)
4998b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks{
5008b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
5018b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks    if (mp == NULL ) {
5028b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks        jniThrowException(env, "java/lang/IllegalStateException", NULL);
5038b0b174198793cabb2b3fcc015f9bfdc9d5082b5Dave Sparks        return;
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5051ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg
5061ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg    // Handle the case where the display surface was set before the mp was
5071ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg    // initialized. We try again to make it stick.
508d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden    sp<IGraphicBufferProducer> st = getVideoSurfaceTexture(env, thiz);
5091ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg    mp->setVideoSurfaceTexture(st);
5101ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    process_media_player_call( env, thiz, mp->prepare(), "java/io/IOException", "Prepare failed." );
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_prepareAsync(JNIEnv *env, jobject thiz)
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5221ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg
5231ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg    // Handle the case where the display surface was set before the mp was
5241ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg    // initialized. We try again to make it stick.
525d47f7d8b5fe3a3861d7cbdc5f912235407823c8eAndy McFadden    sp<IGraphicBufferProducer> st = getVideoSurfaceTexture(env, thiz);
5261ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg    mp->setVideoSurfaceTexture(st);
5271ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    process_media_player_call( env, thiz, mp->prepareAsync(), "java/io/IOException", "Prepare Async failed." );
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_start(JNIEnv *env, jobject thiz)
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
53471f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("start");
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    process_media_player_call( env, thiz, mp->start(), NULL, NULL );
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_stop(JNIEnv *env, jobject thiz)
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
54671f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("stop");
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
55232f82774884bdd709789ab9f3ccdf5b972ff7681Nicolas Catania    process_media_player_call( env, thiz, mp->stop(), NULL, NULL );
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_pause(JNIEnv *env, jobject thiz)
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
55871f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("pause");
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    process_media_player_call( env, thiz, mp->pause(), NULL, NULL );
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_isPlaying(JNIEnv *env, jobject thiz)
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
573075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat        return JNI_FALSE;
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5754df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    const jboolean is_playing = mp->isPlaying();
5764df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project
57771f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("isPlaying: %d", is_playing);
5784df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    return is_playing;
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void
5822d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jiaandroid_media_MediaPlayer_setPlaybackParams(JNIEnv *env, jobject thiz, jobject params)
583d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia{
584d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
585d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia    if (mp == NULL) {
586d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia        jniThrowException(env, "java/lang/IllegalStateException", NULL);
587d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia        return;
588d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia    }
589b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
5902d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    PlaybackParams pbp;
5912d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    pbp.fillFromJobject(env, gPlaybackParamsFields, params);
5922d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    ALOGV("setPlaybackParams: %d:%f %d:%f %d:%u %d:%u",
5932d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            pbp.speedSet, pbp.audioRate.mSpeed,
5942d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            pbp.pitchSet, pbp.audioRate.mPitch,
5952d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            pbp.audioFallbackModeSet, pbp.audioRate.mFallbackMode,
5962d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            pbp.audioStretchModeSet, pbp.audioRate.mStretchMode);
597b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
59805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar    AudioPlaybackRate rate;
59905ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar    status_t err = mp->getPlaybackSettings(&rate);
60005ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar    if (err == OK) {
60105ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar        bool updatedRate = false;
6022d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia        if (pbp.speedSet) {
6032d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            rate.mSpeed = pbp.audioRate.mSpeed;
60405ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar            updatedRate = true;
60505ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar        }
6062d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia        if (pbp.pitchSet) {
6072d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            rate.mPitch = pbp.audioRate.mPitch;
60805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar            updatedRate = true;
60905ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar        }
6102d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia        if (pbp.audioFallbackModeSet) {
6112d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            rate.mFallbackMode = pbp.audioRate.mFallbackMode;
61205ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar            updatedRate = true;
61305ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar        }
6142d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia        if (pbp.audioStretchModeSet) {
6152d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            rate.mStretchMode = pbp.audioRate.mStretchMode;
61605ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar            updatedRate = true;
61705ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar        }
61805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar        if (updatedRate) {
61905ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar            err = mp->setPlaybackSettings(rate);
62005ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar        }
62105ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar    }
62205ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar    process_media_player_call(
62305ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar            env, thiz, err,
62405ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar            "java/lang/IllegalStateException", "unexpected error");
625b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar}
626b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
627b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnarstatic jobject
6282d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jiaandroid_media_MediaPlayer_getPlaybackParams(JNIEnv *env, jobject thiz)
629b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar{
630b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
631b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar    if (mp == NULL) {
632b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar        jniThrowException(env, "java/lang/IllegalStateException", NULL);
633b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar        return NULL;
634b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar    }
635b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
6362d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    PlaybackParams pbp;
6372d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    AudioPlaybackRate &audioRate = pbp.audioRate;
63805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar    process_media_player_call(
63905ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar            env, thiz, mp->getPlaybackSettings(&audioRate),
64005ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar            "java/lang/IllegalStateException", "unexpected error");
641b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar    ALOGV("getPlaybackSettings: %f %f %d %d",
642b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar            audioRate.mSpeed, audioRate.mPitch, audioRate.mFallbackMode, audioRate.mStretchMode);
643b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
6442d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    pbp.speedSet = true;
6452d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    pbp.pitchSet = true;
6462d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    pbp.audioFallbackModeSet = true;
6472d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    pbp.audioStretchModeSet = true;
648b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
6492d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    return pbp.asJobject(env, gPlaybackParamsFields);
650d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia}
651d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jia
652d93fcf400222e4d8b27a1025f6aa307839239b9fWei Jiastatic void
6532d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jiaandroid_media_MediaPlayer_setSyncParams(JNIEnv *env, jobject thiz, jobject params)
654c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar{
655c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
656c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar    if (mp == NULL) {
657c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar        jniThrowException(env, "java/lang/IllegalStateException", NULL);
658c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar        return;
659c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar    }
660c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar
6612d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    SyncParams scp;
6622d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    scp.fillFromJobject(env, gSyncParamsFields, params);
6632d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    ALOGV("setSyncParams: %d:%d %d:%d %d:%f %d:%f",
6642d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia          scp.syncSourceSet, scp.sync.mSource,
6652d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia          scp.audioAdjustModeSet, scp.sync.mAudioAdjustMode,
6662d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia          scp.toleranceSet, scp.sync.mTolerance,
6672d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia          scp.frameRateSet, scp.frameRate);
66805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar
66905ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar    AVSyncSettings avsync;
67005ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar    float videoFrameRate;
67105ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar    status_t err = mp->getSyncSettings(&avsync, &videoFrameRate);
67205ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar    if (err == OK) {
6732d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia        bool updatedSync = scp.frameRateSet;
6742d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia        if (scp.syncSourceSet) {
6752d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            avsync.mSource = scp.sync.mSource;
67605ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar            updatedSync = true;
67705ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar        }
6782d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia        if (scp.audioAdjustModeSet) {
6792d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            avsync.mAudioAdjustMode = scp.sync.mAudioAdjustMode;
68005ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar            updatedSync = true;
68105ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar        }
6822d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia        if (scp.toleranceSet) {
6832d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            avsync.mTolerance = scp.sync.mTolerance;
68405ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar            updatedSync = true;
68505ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar        }
68605ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar        if (updatedSync) {
6872d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            err = mp->setSyncSettings(avsync, scp.frameRateSet ? scp.frameRate : -1.f);
68805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar        }
68905ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar    }
69005ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar    process_media_player_call(
69105ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar            env, thiz, err,
69205ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar            "java/lang/IllegalStateException", "unexpected error");
693c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar}
694c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar
695c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnarstatic jobject
6962d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jiaandroid_media_MediaPlayer_getSyncParams(JNIEnv *env, jobject thiz)
697c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar{
698c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
699c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar    if (mp == NULL) {
700c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar        jniThrowException(env, "java/lang/IllegalStateException", NULL);
701c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar        return NULL;
702c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar    }
703c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar
7042d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    SyncParams scp;
7052d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    scp.frameRate = -1.f;
70605ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar    process_media_player_call(
7072d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            env, thiz, mp->getSyncSettings(&scp.sync, &scp.frameRate),
70805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar            "java/lang/IllegalStateException", "unexpected error");
70905ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar
710c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar    ALOGV("getSyncSettings: %d %d %f %f",
7112d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            scp.sync.mSource, scp.sync.mAudioAdjustMode, scp.sync.mTolerance, scp.frameRate);
71205ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar
7132d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    // sanity check params
7142d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    if (scp.sync.mSource >= AVSYNC_SOURCE_MAX
7152d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            || scp.sync.mAudioAdjustMode >= AVSYNC_AUDIO_ADJUST_MODE_MAX
7162d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            || scp.sync.mTolerance < 0.f
7172d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia            || scp.sync.mTolerance >= AVSYNC_TOLERANCE_MAX) {
71805ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar        jniThrowException(env,  "java/lang/IllegalStateException", NULL);
71905ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar        return NULL;
72005ebffe6bf6cdacc6de4b3bbf480c31869a81661Lajos Molnar    }
721c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar
7222d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    scp.syncSourceSet = true;
7232d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    scp.audioAdjustModeSet = true;
7242d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    scp.toleranceSet = true;
7252d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    scp.frameRateSet = scp.frameRate >= 0.f;
726c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar
7272d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    return scp.asJobject(env, gSyncParamsFields);
728c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar}
729c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnar
730c98f58efd147c574faa4a4f9956b5ab95e3027a5Lajos Molnarstatic void
731ebc2b694d1b5dc6b8a2cd2825e11f914e542cc56Wei Jiaandroid_media_MediaPlayer_seekTo(JNIEnv *env, jobject thiz, jint msec, jint mode)
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
738ebc2b694d1b5dc6b8a2cd2825e11f914e542cc56Wei Jia    ALOGV("seekTo: %d(msec), mode=%d", msec, mode);
739ebc2b694d1b5dc6b8a2cd2825e11f914e542cc56Wei Jia    process_media_player_call( env, thiz, mp->seekTo(msec, (MediaPlayerSeekMode)mode), NULL, NULL );
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
742075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatstatic jint
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_getVideoWidth(JNIEnv *env, jobject thiz)
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int w;
7514df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    if (0 != mp->getVideoWidth(&w)) {
7523762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("getVideoWidth failed");
7534df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        w = 0;
7544df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
75571f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("getVideoWidth: %d", w);
756075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    return (jint) w;
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatstatic jint
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_getVideoHeight(JNIEnv *env, jobject thiz)
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int h;
7684df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    if (0 != mp->getVideoHeight(&h)) {
7693762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("getVideoHeight failed");
7704df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project        h = 0;
7714df2423a947bcd3f024cc3d3a1a315a8dc428598The Android Open Source Project    }
77271f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("getVideoHeight: %d", h);
773075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    return (jint) h;
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7760e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essickstatic jobject
7770e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essickandroid_media_MediaPlayer_getMetrics(JNIEnv *env, jobject thiz)
7780e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick{
7790e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
7800e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    if (mp == NULL ) {
7810e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick        jniThrowException(env, "java/lang/IllegalStateException", NULL);
7820e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick        return 0;
7830e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    }
7840e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick
7850e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    Parcel p;
7860e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    int key = FOURCC('m','t','r','X');
7870e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    status_t status = mp->getParameter(key, &p);
7880e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    if (status != OK) {
7890e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick        ALOGD("getMetrics() failed: %d", status);
7900e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick        return (jobject) NULL;
7910e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    }
7920e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick
7930e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    MediaAnalyticsItem *item = new MediaAnalyticsItem;
7940e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    item->readFromParcel(p);
7950e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    jobject mybundle = MediaMetricsJNI::writeMetricsToBundle(env, item, NULL);
7960e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick
7970e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    // housekeeping
7980e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    delete item;
7990e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    item = NULL;
8000e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick
8010e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    return mybundle;
8020e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick}
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
804075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatstatic jint
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_getCurrentPosition(JNIEnv *env, jobject thiz)
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int msec;
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    process_media_player_call( env, thiz, mp->getCurrentPosition(&msec), NULL, NULL );
81471f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("getCurrentPosition: %d (msec)", msec);
815075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    return (jint) msec;
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
818075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatstatic jint
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_getDuration(JNIEnv *env, jobject thiz)
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int msec;
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    process_media_player_call( env, thiz, mp->getDuration(&msec), NULL, NULL );
82871f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("getDuration: %d (msec)", msec);
829075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    return (jint) msec;
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_reset(JNIEnv *env, jobject thiz)
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
83571f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("reset");
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    process_media_player_call( env, thiz, mp->reset(), NULL, NULL );
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void
845075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatandroid_media_MediaPlayer_setAudioStreamType(JNIEnv *env, jobject thiz, jint streamtype)
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
84771f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("setAudioStreamType: %d", streamtype);
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
853bc1d77b6cbce23fbe25f7231651037ae195bc90eGlenn Kasten    process_media_player_call( env, thiz, mp->setAudioStreamType((audio_stream_type_t) streamtype) , NULL, NULL );
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8561af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlockstatic jint
8571af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlockandroid_media_MediaPlayer_getAudioStreamType(JNIEnv *env, jobject thiz)
8581af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock{
8591af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
8601af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock    if (mp == NULL ) {
8611af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock        jniThrowException(env, "java/lang/IllegalStateException", NULL);
8621af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock        return 0;
8631af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock    }
8641af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock    audio_stream_type_t streamtype;
8651af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock    process_media_player_call( env, thiz, mp->getAudioStreamType(&streamtype), NULL, NULL );
8661af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock    ALOGV("getAudioStreamType: %d (streamtype)", streamtype);
8671af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock    return (jint) streamtype;
8681af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock}
8691af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock
8708df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivistatic jboolean
8718df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Triviandroid_media_MediaPlayer_setParameter(JNIEnv *env, jobject thiz, jint key, jobject java_request)
8728df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi{
8738df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    ALOGV("setParameter: key %d", key);
8748df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
8758df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    if (mp == NULL ) {
8768df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        jniThrowException(env, "java/lang/IllegalStateException", NULL);
8778df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        return false;
8788df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    }
8798df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi
8808df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    Parcel *request = parcelForJavaObject(env, java_request);
8818df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    status_t err = mp->setParameter(key, *request);
8828df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    if (err == OK) {
8838df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        return true;
8848df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    } else {
8858df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi        return false;
8868df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    }
8878df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi}
8888df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_setLooping(JNIEnv *env, jobject thiz, jboolean looping)
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
89271f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("setLooping: %d", looping);
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    process_media_player_call( env, thiz, mp->setLooping(looping), NULL, NULL );
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_isLooping(JNIEnv *env, jobject thiz)
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
90471f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("isLooping");
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
908075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat        return JNI_FALSE;
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
910075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    return mp->isLooping() ? JNI_TRUE : JNI_FALSE;
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void
914075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhatandroid_media_MediaPlayer_setVolume(JNIEnv *env, jobject thiz, jfloat leftVolume, jfloat rightVolume)
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
916075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    ALOGV("setVolume: left %f  right %f", (float) leftVolume, (float) rightVolume);
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL ) {
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/IllegalStateException", NULL);
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
922075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    process_media_player_call( env, thiz, mp->setVolume((float) leftVolume, (float) rightVolume), NULL, NULL );
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
92520cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania// Sends the request and reply parcels to the media player via the
92620cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania// binder interface.
92720cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Cataniastatic jint
92820cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Cataniaandroid_media_MediaPlayer_invoke(JNIEnv *env, jobject thiz,
92920cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania                                 jobject java_request, jobject java_reply)
93020cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania{
93120cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania    sp<MediaPlayer> media_player = getMediaPlayer(env, thiz);
93220cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania    if (media_player == NULL ) {
93320cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania        jniThrowException(env, "java/lang/IllegalStateException", NULL);
934b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania        return UNKNOWN_ERROR;
93520cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania    }
93620cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania
93720cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania    Parcel *request = parcelForJavaObject(env, java_request);
93820cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania    Parcel *reply = parcelForJavaObject(env, java_reply);
93920cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania
94020cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania    // Don't use process_media_player_call which use the async loop to
94120cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania    // report errors, instead returns the status.
942075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    return (jint) media_player->invoke(*request, reply);
94320cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania}
94420cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania
945b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania// Sends the new filter to the client.
946b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Cataniastatic jint
947b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Cataniaandroid_media_MediaPlayer_setMetadataFilter(JNIEnv *env, jobject thiz, jobject request)
948b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania{
949b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania    sp<MediaPlayer> media_player = getMediaPlayer(env, thiz);
950b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania    if (media_player == NULL ) {
951b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania        jniThrowException(env, "java/lang/IllegalStateException", NULL);
952b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania        return UNKNOWN_ERROR;
953b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania    }
954b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania
955b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania    Parcel *filter = parcelForJavaObject(env, request);
956b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania
9575d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania    if (filter == NULL ) {
9585d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania        jniThrowException(env, "java/lang/RuntimeException", "Filter is null");
9595d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania        return UNKNOWN_ERROR;
9605d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania    }
9615d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania
962075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    return (jint) media_player->setMetadataFilter(*filter);
963b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania}
964b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania
9655d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Cataniastatic jboolean
9665d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Cataniaandroid_media_MediaPlayer_getMetadata(JNIEnv *env, jobject thiz, jboolean update_only,
9675d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania                                      jboolean apply_filter, jobject reply)
9685d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania{
9695d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania    sp<MediaPlayer> media_player = getMediaPlayer(env, thiz);
9705d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania    if (media_player == NULL ) {
9715d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania        jniThrowException(env, "java/lang/IllegalStateException", NULL);
972075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat        return JNI_FALSE;
9735d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania    }
9745d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania
9755d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania    Parcel *metadata = parcelForJavaObject(env, reply);
9765d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania
9775d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania    if (metadata == NULL ) {
9785d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania        jniThrowException(env, "java/lang/RuntimeException", "Reply parcel is null");
979075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat        return JNI_FALSE;
9805d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania    }
9815d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania
9825d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania    metadata->freeData();
9835d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania    // On return metadata is positioned at the beginning of the
9845d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania    // metadata. Note however that the parcel actually starts with the
9855d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania    // return code so you should not rewind the parcel using
9865d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania    // setDataPosition(0).
987075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    if (media_player->getMetadata(update_only, apply_filter, metadata) == OK) {
988075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat        return JNI_TRUE;
989075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    } else {
990075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat        return JNI_FALSE;
991075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    }
9925d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania}
9935d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania
9944935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen// This function gets some field IDs, which in turn causes class initialization.
9954935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen// It is called from a static block in MediaPlayer, which won't run until the
9964935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen// first time an instance of this class is used.
9974935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissenstatic void
9984935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissenandroid_media_MediaPlayer_native_init(JNIEnv *env)
9994935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen{
10004935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen    jclass clazz;
10014935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen
10024935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen    clazz = env->FindClass("android/media/MediaPlayer");
10034935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen    if (clazz == NULL) {
10044935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen        return;
10054935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen    }
10064935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen
1007075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    fields.context = env->GetFieldID(clazz, "mNativeContext", "J");
10084935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen    if (fields.context == NULL) {
10094935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen        return;
10104935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen    }
10114935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen
10124935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen    fields.post_event = env->GetStaticMethodID(clazz, "postEventFromNative",
10134935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen                                               "(Ljava/lang/Object;IIILjava/lang/Object;)V");
10144935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen    if (fields.post_event == NULL) {
10154935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen        return;
10164935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen    }
10174935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen
1018075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    fields.surface_texture = env->GetFieldID(clazz, "mNativeSurfaceTexture", "J");
10191ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg    if (fields.surface_texture == NULL) {
1020cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten        return;
1021cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten    }
1022d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber
1023b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar    env->DeleteLocalRef(clazz);
1024b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
10255ba69bef8c36e78d1e08fae52fe276276668c20dSelim Gurun    clazz = env->FindClass("android/net/ProxyInfo");
1026d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber    if (clazz == NULL) {
1027d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber        return;
1028d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber    }
1029d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber
1030d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber    fields.proxyConfigGetHost =
1031d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber        env->GetMethodID(clazz, "getHost", "()Ljava/lang/String;");
1032d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber
1033d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber    fields.proxyConfigGetPort =
1034d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber        env->GetMethodID(clazz, "getPort", "()I");
1035d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber
1036d5f9fa574da2ee210ac86154ab0aea9fee5e8278Andreas Huber    fields.proxyConfigGetExclusionList =
10375ba69bef8c36e78d1e08fae52fe276276668c20dSelim Gurun        env->GetMethodID(clazz, "getExclusionListAsString", "()Ljava/lang/String;");
1038b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
1039b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar    env->DeleteLocalRef(clazz);
1040b3d5fd252851071f2f7e3dd66be84683750379abLajos Molnar
104123dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    gBufferingParamsFields.init(env);
10420b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
10430b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    // Modular DRM
10440b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    FIND_CLASS(clazz, "android/media/MediaDrm");
10450b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    if (clazz) {
10460b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        jfieldID field;
10470b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        GET_STATIC_FIELD_ID(field, clazz, "KEY_TYPE_STREAMING", "I");
10480b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        gKeyTypes.kKeyTypeStreaming = env->GetStaticIntField(clazz, field);
10490b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        GET_STATIC_FIELD_ID(field, clazz, "KEY_TYPE_OFFLINE", "I");
10500b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        gKeyTypes.kKeyTypeOffline = env->GetStaticIntField(clazz, field);
10510b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        GET_STATIC_FIELD_ID(field, clazz, "KEY_TYPE_RELEASE", "I");
10520b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        gKeyTypes.kKeyTypeRelease = env->GetStaticIntField(clazz, field);
10530b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
10540b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        env->DeleteLocalRef(clazz);
10550b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    } else {
10560b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        ALOGE("JNI getKeyRequest android_media_MediaPlayer_native_init couldn't "
10570b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania              "get clazz android/media/MediaDrm");
10580b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    }
10590b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
10600b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    FIND_CLASS(clazz, "android/media/MediaDrm$KeyRequest");
10610b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    if (clazz) {
10620b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        GET_FIELD_ID(gFields.keyRequest.data, clazz, "mData", "[B");
10630b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        GET_FIELD_ID(gFields.keyRequest.defaultUrl, clazz, "mDefaultUrl", "Ljava/lang/String;");
10640b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        GET_FIELD_ID(gFields.keyRequest.requestType, clazz, "mRequestType", "I");
10650b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
10660b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        jfieldID field;
10670b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        GET_STATIC_FIELD_ID(field, clazz, "REQUEST_TYPE_INITIAL", "I");
10680b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        gKeyRequestTypes.kKeyRequestTypeInitial = env->GetStaticIntField(clazz, field);
10690b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        GET_STATIC_FIELD_ID(field, clazz, "REQUEST_TYPE_RENEWAL", "I");
10700b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        gKeyRequestTypes.kKeyRequestTypeRenewal = env->GetStaticIntField(clazz, field);
10710b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        GET_STATIC_FIELD_ID(field, clazz, "REQUEST_TYPE_RELEASE", "I");
10720b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        gKeyRequestTypes.kKeyRequestTypeRelease = env->GetStaticIntField(clazz, field);
10730b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
10740b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        env->DeleteLocalRef(clazz);
10750b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    } else {
10760b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        ALOGE("JNI getKeyRequest android_media_MediaPlayer_native_init couldn't "
10770b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania              "get clazz android/media/MediaDrm$KeyRequest");
10780b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    }
10790b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
10800b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    FIND_CLASS(clazz, "android/media/MediaDrm$MediaDrmStateException");
10810b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    if (clazz) {
10820b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        GET_METHOD_ID(gFields.stateException.init, clazz, "<init>", "(ILjava/lang/String;)V");
10830b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        gFields.stateException.classId = static_cast<jclass>(env->NewGlobalRef(clazz));
10840b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
10850b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        env->DeleteLocalRef(clazz);
10860b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    } else {
10870b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        ALOGE("JNI getKeyRequest android_media_MediaPlayer_native_init couldn't "
10880b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania              "get clazz android/media/MediaDrm$MediaDrmStateException");
10890b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    }
10900b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
10912d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    gPlaybackParamsFields.init(env);
10922d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    gSyncParamsFields.init(env);
1093035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung    gVolumeShaperFields.init(env);
10944935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen}
1095b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_native_setup(JNIEnv *env, jobject thiz, jobject weak_this)
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
109971f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("native_setup");
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = new MediaPlayer();
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp == NULL) {
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jniThrowException(env, "java/lang/RuntimeException", "Out of memory");
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // create new listener and give it to MediaPlayer
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<JNIMediaPlayerListener> listener = new JNIMediaPlayerListener(env, thiz, weak_this);
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mp->setListener(listener);
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Stow our new C++ MediaPlayer in an opaque field in the Java object.
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    setMediaPlayer(env, thiz, mp);
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_release(JNIEnv *env, jobject thiz)
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
111771f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("release");
1118d59310d08637c8531dc7949fc166b0daeede53c0Gloria Wang    decVideoSurfaceRef(env, thiz);
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    sp<MediaPlayer> mp = setMediaPlayer(env, thiz, 0);
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mp != NULL) {
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // this prevents native callbacks after the object is released
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mp->setListener(0);
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mp->disconnect();
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectandroid_media_MediaPlayer_native_finalize(JNIEnv *env, jobject thiz)
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
113071f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("native_finalize");
11318dc208476f1fbbf6cd0b8cc3d48487a62cb72883Marco Nelissen    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
11328dc208476f1fbbf6cd0b8cc3d48487a62cb72883Marco Nelissen    if (mp != NULL) {
11338564c8da817a845353d213acd8636b76f567b234Steve Block        ALOGW("MediaPlayer finalized without being released");
11348dc208476f1fbbf6cd0b8cc3d48487a62cb72883Marco Nelissen    }
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    android_media_MediaPlayer_release(env, thiz);
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
113833b840444f5a481dd31e129079d3c0cf3acdf80eGlenn Kastenstatic void android_media_MediaPlayer_set_audio_session_id(JNIEnv *env,  jobject thiz,
113933b840444f5a481dd31e129079d3c0cf3acdf80eGlenn Kasten        jint sessionId) {
114071f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("set_session_id(): %d", sessionId);
1141619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
1142619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent    if (mp == NULL ) {
1143619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent        jniThrowException(env, "java/lang/IllegalStateException", NULL);
1144619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent        return;
1145619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent    }
114633b840444f5a481dd31e129079d3c0cf3acdf80eGlenn Kasten    process_media_player_call( env, thiz, mp->setAudioSessionId((audio_session_t) sessionId), NULL,
114733b840444f5a481dd31e129079d3c0cf3acdf80eGlenn Kasten            NULL);
1148619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent}
1149619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent
1150619346f902241736d933657a4fe10f10c50a1ba8Eric Laurentstatic jint android_media_MediaPlayer_get_audio_session_id(JNIEnv *env,  jobject thiz) {
115171f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("get_session_id()");
1152619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
1153619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent    if (mp == NULL ) {
1154619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent        jniThrowException(env, "java/lang/IllegalStateException", NULL);
1155619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent        return 0;
1156619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent    }
1157619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent
1158075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    return (jint) mp->getAudioSessionId();
1159619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent}
1160619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent
11617070b36549d511d6627538c73dfbab23fbae5b43Eric Laurentstatic void
11627070b36549d511d6627538c73dfbab23fbae5b43Eric Laurentandroid_media_MediaPlayer_setAuxEffectSendLevel(JNIEnv *env, jobject thiz, jfloat level)
11637070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent{
116471f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("setAuxEffectSendLevel: level %f", level);
11657070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
11667070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent    if (mp == NULL ) {
11677070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent        jniThrowException(env, "java/lang/IllegalStateException", NULL);
11687070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent        return;
11697070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent    }
11707070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent    process_media_player_call( env, thiz, mp->setAuxEffectSendLevel(level), NULL, NULL );
11717070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent}
11727070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent
11737070b36549d511d6627538c73dfbab23fbae5b43Eric Laurentstatic void android_media_MediaPlayer_attachAuxEffect(JNIEnv *env,  jobject thiz, jint effectId) {
117471f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("attachAuxEffect(): %d", effectId);
11757070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
11767070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent    if (mp == NULL ) {
11777070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent        jniThrowException(env, "java/lang/IllegalStateException", NULL);
11787070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent        return;
11797070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent    }
11807070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent    process_media_player_call( env, thiz, mp->attachAuxEffect(effectId), NULL, NULL );
11817070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent}
11827070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent
1183d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wangstatic jint
1184d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huberandroid_media_MediaPlayer_pullBatteryData(
1185d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber        JNIEnv *env, jobject /* thiz */, jobject java_reply)
1186d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang{
1187d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang    sp<IBinder> binder = defaultServiceManager()->getService(String16("media.player"));
1188d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang    sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder);
1189d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang    if (service.get() == NULL) {
1190d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang        jniThrowException(env, "java/lang/RuntimeException", "cannot get MediaPlayerService");
1191d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang        return UNKNOWN_ERROR;
1192d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang    }
1193d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang
1194d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang    Parcel *reply = parcelForJavaObject(env, java_reply);
1195d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang
1196075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    return (jint) service->pullBatteryData(reply);
1197d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang}
1198d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang
1199720aa282791ef9405d39a15f419a41ab24f11e30John Grossmanstatic jint
1200720aa282791ef9405d39a15f419a41ab24f11e30John Grossmanandroid_media_MediaPlayer_setRetransmitEndpoint(JNIEnv *env, jobject thiz,
1201720aa282791ef9405d39a15f419a41ab24f11e30John Grossman                                                jstring addrString, jint port) {
1202720aa282791ef9405d39a15f419a41ab24f11e30John Grossman    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
1203720aa282791ef9405d39a15f419a41ab24f11e30John Grossman    if (mp == NULL ) {
1204720aa282791ef9405d39a15f419a41ab24f11e30John Grossman        jniThrowException(env, "java/lang/IllegalStateException", NULL);
1205720aa282791ef9405d39a15f419a41ab24f11e30John Grossman        return INVALID_OPERATION;
1206720aa282791ef9405d39a15f419a41ab24f11e30John Grossman    }
1207720aa282791ef9405d39a15f419a41ab24f11e30John Grossman
1208720aa282791ef9405d39a15f419a41ab24f11e30John Grossman    const char *cAddrString = NULL;
1209720aa282791ef9405d39a15f419a41ab24f11e30John Grossman
1210720aa282791ef9405d39a15f419a41ab24f11e30John Grossman    if (NULL != addrString) {
1211720aa282791ef9405d39a15f419a41ab24f11e30John Grossman        cAddrString = env->GetStringUTFChars(addrString, NULL);
1212720aa282791ef9405d39a15f419a41ab24f11e30John Grossman        if (cAddrString == NULL) {  // Out of memory
1213720aa282791ef9405d39a15f419a41ab24f11e30John Grossman            return NO_MEMORY;
1214720aa282791ef9405d39a15f419a41ab24f11e30John Grossman        }
1215720aa282791ef9405d39a15f419a41ab24f11e30John Grossman    }
1216720aa282791ef9405d39a15f419a41ab24f11e30John Grossman    ALOGV("setRetransmitEndpoint: %s:%d",
1217720aa282791ef9405d39a15f419a41ab24f11e30John Grossman            cAddrString ? cAddrString : "(null)", port);
1218720aa282791ef9405d39a15f419a41ab24f11e30John Grossman
1219720aa282791ef9405d39a15f419a41ab24f11e30John Grossman    status_t ret;
1220720aa282791ef9405d39a15f419a41ab24f11e30John Grossman    if (cAddrString && (port > 0xFFFF)) {
1221720aa282791ef9405d39a15f419a41ab24f11e30John Grossman        ret = BAD_VALUE;
1222720aa282791ef9405d39a15f419a41ab24f11e30John Grossman    } else {
1223720aa282791ef9405d39a15f419a41ab24f11e30John Grossman        ret = mp->setRetransmitEndpoint(cAddrString,
1224720aa282791ef9405d39a15f419a41ab24f11e30John Grossman                static_cast<uint16_t>(port));
1225720aa282791ef9405d39a15f419a41ab24f11e30John Grossman    }
1226720aa282791ef9405d39a15f419a41ab24f11e30John Grossman
1227720aa282791ef9405d39a15f419a41ab24f11e30John Grossman    if (NULL != addrString) {
1228720aa282791ef9405d39a15f419a41ab24f11e30John Grossman        env->ReleaseStringUTFChars(addrString, cAddrString);
1229720aa282791ef9405d39a15f419a41ab24f11e30John Grossman    }
1230720aa282791ef9405d39a15f419a41ab24f11e30John Grossman
1231720aa282791ef9405d39a15f419a41ab24f11e30John Grossman    if (ret == INVALID_OPERATION ) {
1232720aa282791ef9405d39a15f419a41ab24f11e30John Grossman        jniThrowException(env, "java/lang/IllegalStateException", NULL);
1233720aa282791ef9405d39a15f419a41ab24f11e30John Grossman    }
1234720aa282791ef9405d39a15f419a41ab24f11e30John Grossman
1235075e9a19ce645752f8282bc19c91b25978a7dc52Ashok Bhat    return (jint) ret;
1236720aa282791ef9405d39a15f419a41ab24f11e30John Grossman}
1237720aa282791ef9405d39a15f419a41ab24f11e30John Grossman
123884b832054552e00257bb04997143ca33d6d100beMarco Nelissenstatic void
123984b832054552e00257bb04997143ca33d6d100beMarco Nelissenandroid_media_MediaPlayer_setNextMediaPlayer(JNIEnv *env, jobject thiz, jobject java_player)
124084b832054552e00257bb04997143ca33d6d100beMarco Nelissen{
124184b832054552e00257bb04997143ca33d6d100beMarco Nelissen    ALOGV("setNextMediaPlayer");
124284b832054552e00257bb04997143ca33d6d100beMarco Nelissen    sp<MediaPlayer> thisplayer = getMediaPlayer(env, thiz);
124384b832054552e00257bb04997143ca33d6d100beMarco Nelissen    if (thisplayer == NULL) {
124484b832054552e00257bb04997143ca33d6d100beMarco Nelissen        jniThrowException(env, "java/lang/IllegalStateException", "This player not initialized");
124584b832054552e00257bb04997143ca33d6d100beMarco Nelissen        return;
124684b832054552e00257bb04997143ca33d6d100beMarco Nelissen    }
124784b832054552e00257bb04997143ca33d6d100beMarco Nelissen    sp<MediaPlayer> nextplayer = (java_player == NULL) ? NULL : getMediaPlayer(env, java_player);
124884b832054552e00257bb04997143ca33d6d100beMarco Nelissen    if (nextplayer == NULL && java_player != NULL) {
124984b832054552e00257bb04997143ca33d6d100beMarco Nelissen        jniThrowException(env, "java/lang/IllegalStateException", "That player not initialized");
125084b832054552e00257bb04997143ca33d6d100beMarco Nelissen        return;
125184b832054552e00257bb04997143ca33d6d100beMarco Nelissen    }
125284b832054552e00257bb04997143ca33d6d100beMarco Nelissen
125384b832054552e00257bb04997143ca33d6d100beMarco Nelissen    if (nextplayer == thisplayer) {
125484b832054552e00257bb04997143ca33d6d100beMarco Nelissen        jniThrowException(env, "java/lang/IllegalArgumentException", "Next player can't be self");
125584b832054552e00257bb04997143ca33d6d100beMarco Nelissen        return;
125684b832054552e00257bb04997143ca33d6d100beMarco Nelissen    }
125784b832054552e00257bb04997143ca33d6d100beMarco Nelissen    // tie the two players together
125884b832054552e00257bb04997143ca33d6d100beMarco Nelissen    process_media_player_call(
125984b832054552e00257bb04997143ca33d6d100beMarco Nelissen            env, thiz, thisplayer->setNextMediaPlayer(nextplayer),
126084b832054552e00257bb04997143ca33d6d100beMarco Nelissen            "java/lang/IllegalArgumentException",
126184b832054552e00257bb04997143ca33d6d100beMarco Nelissen            "setNextMediaPlayer failed." );
126284b832054552e00257bb04997143ca33d6d100beMarco Nelissen    ;
126384b832054552e00257bb04997143ca33d6d100beMarco Nelissen}
126484b832054552e00257bb04997143ca33d6d100beMarco Nelissen
1265035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung// Pass through the arguments to the MediaServer player implementation.
1266035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hungstatic jint android_media_MediaPlayer_applyVolumeShaper(JNIEnv *env, jobject thiz,
1267035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung        jobject jconfig, jobject joperation) {
1268035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung    // NOTE: hard code here to prevent platform issues. Must match VolumeShaper.java
1269035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung    const int VOLUME_SHAPER_INVALID_OPERATION = -38;
1270035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung
1271035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
1272035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung    if (mp == nullptr) {
1273035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung        return (jint)VOLUME_SHAPER_INVALID_OPERATION;
1274035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung    }
1275035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung
1276035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung    sp<VolumeShaper::Configuration> configuration;
1277035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung    sp<VolumeShaper::Operation> operation;
1278035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung    if (jconfig != nullptr) {
1279035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung        configuration = VolumeShaperHelper::convertJobjectToConfiguration(
1280035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung                env, gVolumeShaperFields, jconfig);
1281035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung        ALOGV("applyVolumeShaper configuration: %s", configuration->toString().c_str());
1282035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung    }
1283035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung    if (joperation != nullptr) {
1284035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung        operation = VolumeShaperHelper::convertJobjectToOperation(
1285035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung                env, gVolumeShaperFields, joperation);
1286035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung        ALOGV("applyVolumeShaper operation: %s", operation->toString().c_str());
1287035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung    }
1288035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung    VolumeShaper::Status status = mp->applyVolumeShaper(configuration, operation);
1289035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung    if (status == INVALID_OPERATION) {
1290035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung        status = VOLUME_SHAPER_INVALID_OPERATION;
1291035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung    }
1292035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung    return (jint)status; // if status < 0 an error, else a VolumeShaper id
1293035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung}
1294035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung
1295035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung// Pass through the arguments to the MediaServer player implementation.
1296035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hungstatic jobject android_media_MediaPlayer_getVolumeShaperState(JNIEnv *env, jobject thiz,
1297035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung        jint id) {
1298035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
1299035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung    if (mp == nullptr) {
1300035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung        return (jobject)nullptr;
1301035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung    }
1302035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung
1303035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung    sp<VolumeShaper::State> state = mp->getVolumeShaperState((int)id);
1304035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung    if (state.get() == nullptr) {
1305035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung        return (jobject)nullptr;
1306035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung    }
1307035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung    return VolumeShaperHelper::convertStateToJobject(env, gVolumeShaperFields, state);
1308035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung}
1309035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung
13100b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania/////////////////////////////////////////////////////////////////////////////////////
13110b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania// Modular DRM begin
13120b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
13130b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania// TODO: investigate if these can be shared with their MediaDrm counterparts
13140b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastatic void throwDrmStateException(JNIEnv *env, const char *msg, status_t err)
13150b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania{
13160b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    ALOGE("Illegal DRM state exception: %s (%d)", msg, err);
13170b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
13180b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    jobject exception = env->NewObject(gFields.stateException.classId,
13190b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania            gFields.stateException.init, static_cast<int>(err),
13200b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania            env->NewStringUTF(msg));
13210b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    env->Throw(static_cast<jthrowable>(exception));
13220b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania}
13230b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
13240b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania// TODO: investigate if these can be shared with their MediaDrm counterparts
13250b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastatic bool throwDrmExceptionAsNecessary(JNIEnv *env, status_t err, const char *msg = NULL)
13260b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania{
13270b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    const char *drmMessage = "Unknown DRM Msg";
13280b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
13290b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    switch (err) {
13300b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    case ERROR_DRM_UNKNOWN:
13310b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        drmMessage = "General DRM error";
13320b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        break;
13330b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    case ERROR_DRM_NO_LICENSE:
13340b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        drmMessage = "No license";
13350b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        break;
13360b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    case ERROR_DRM_LICENSE_EXPIRED:
13370b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        drmMessage = "License expired";
13380b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        break;
13390b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    case ERROR_DRM_SESSION_NOT_OPENED:
13400b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        drmMessage = "Session not opened";
13410b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        break;
13420b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    case ERROR_DRM_DECRYPT_UNIT_NOT_INITIALIZED:
13430b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        drmMessage = "Not initialized";
13440b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        break;
13450b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    case ERROR_DRM_DECRYPT:
13460b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        drmMessage = "Decrypt error";
13470b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        break;
13480b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    case ERROR_DRM_CANNOT_HANDLE:
13490b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        drmMessage = "Unsupported scheme or data format";
13500b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        break;
13510b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    case ERROR_DRM_TAMPER_DETECTED:
13520b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        drmMessage = "Invalid state";
13530b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        break;
13540b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    default:
13550b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        break;
13560b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    }
13570b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
13580b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    String8 vendorMessage;
13590b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    if (err >= ERROR_DRM_VENDOR_MIN && err <= ERROR_DRM_VENDOR_MAX) {
13600b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        vendorMessage = String8::format("DRM vendor-defined error: %d", err);
13610b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        drmMessage = vendorMessage.string();
13620b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    }
13630b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
13640b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    if (err == BAD_VALUE) {
13650b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        jniThrowException(env, "java/lang/IllegalArgumentException", msg);
13660b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        return true;
13670b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    } else if (err == ERROR_DRM_NOT_PROVISIONED) {
13680b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        jniThrowException(env, "android/media/NotProvisionedException", msg);
13690b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        return true;
13700b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    } else if (err == ERROR_DRM_RESOURCE_BUSY) {
13710b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        jniThrowException(env, "android/media/ResourceBusyException", msg);
13720b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        return true;
13730b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    } else if (err == ERROR_DRM_DEVICE_REVOKED) {
13740b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        jniThrowException(env, "android/media/DeniedByServerException", msg);
13750b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        return true;
13760b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    } else if (err == DEAD_OBJECT) {
13770b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        jniThrowException(env, "android/media/MediaDrmResetException",
13780b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                          "mediaserver died");
13790b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        return true;
13800b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    } else if (err != OK) {
13810b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        String8 errbuf;
13820b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        if (drmMessage != NULL) {
13830b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania            if (msg == NULL) {
13840b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                msg = drmMessage;
13850b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania            } else {
13860b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                errbuf = String8::format("%s: %s", msg, drmMessage);
13870b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                msg = errbuf.string();
13880b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania            }
13890b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        }
13900b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        throwDrmStateException(env, msg, err);
13910b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        return true;
13920b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    }
13930b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    return false;
13940b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania}
13950b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
13960b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania// TODO: investigate if these can be shared with their MediaDrm counterparts
13970b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastatic jbyteArray VectorToJByteArray(JNIEnv *env, Vector<uint8_t> const &vector)
13980b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania{
13990b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    size_t length = vector.size();
14000b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    jbyteArray result = env->NewByteArray(length);
14010b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    if (result != NULL) {
14020b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        env->SetByteArrayRegion(result, 0, length, (jbyte *)vector.array());
14030b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    }
14040b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    return result;
14050b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania}
14060b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
14070b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania// TODO: investigate if these can be shared with their MediaDrm counterparts
14080b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastatic Vector<uint8_t> JByteArrayToVector(JNIEnv *env, jbyteArray const &byteArray)
14090b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania{
14100b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    Vector<uint8_t> vector;
14110b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    size_t length = env->GetArrayLength(byteArray);
14120b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    vector.insertAt((size_t)0, length);
14130b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    env->GetByteArrayRegion(byteArray, 0, length, (jbyte *)vector.editArray());
14140b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    return vector;
14150b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania}
14160b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
14170b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania// TODO: investigate if these can be shared with their MediaDrm counterparts
14180b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastatic String8 JStringToString8(JNIEnv *env, jstring const &jstr)
14190b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania{
14200b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    String8 result;
14210b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
14220b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    const char *s = env->GetStringUTFChars(jstr, NULL);
14230b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    if (s) {
14240b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        result = s;
14250b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        env->ReleaseStringUTFChars(jstr, s);
14260b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    }
14270b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    return result;
14280b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania}
14290b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
14300b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania// TODO: investigate if these can be shared with their MediaDrm counterparts
14310b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastatic KeyedVector<String8, String8> HashMapToKeyedVector(JNIEnv *env,
14320b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                                             jobject &hashMap, bool* pIsOK)
14330b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania{
14340b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    jclass clazz = gFields.stringClassId;
14350b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    KeyedVector<String8, String8> keyedVector;
14360b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    *pIsOK = true;
14370b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
14380b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    jobject entrySet = env->CallObjectMethod(hashMap, gFields.hashmap.entrySet);
14390b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    if (entrySet) {
14400b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        jobject iterator = env->CallObjectMethod(entrySet, gFields.set.iterator);
14410b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        if (iterator) {
14420b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania            jboolean hasNext = env->CallBooleanMethod(iterator, gFields.iterator.hasNext);
14430b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania            while (hasNext) {
14440b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                jobject entry = env->CallObjectMethod(iterator, gFields.iterator.next);
14450b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                if (entry) {
14460b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                    jobject obj = env->CallObjectMethod(entry, gFields.entry.getKey);
14470b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                    if (obj == NULL || !env->IsInstanceOf(obj, clazz)) {
14480b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                        jniThrowException(env, "java/lang/IllegalArgumentException",
14490b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                                          "HashMap key is not a String");
14500b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                        env->DeleteLocalRef(entry);
14510b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                        *pIsOK = false;
14520b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                        break;
14530b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                    }
14540b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                    jstring jkey = static_cast<jstring>(obj);
14550b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
14560b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                    obj = env->CallObjectMethod(entry, gFields.entry.getValue);
14570b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                    if (obj == NULL || !env->IsInstanceOf(obj, clazz)) {
14580b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                        jniThrowException(env, "java/lang/IllegalArgumentException",
14590b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                                          "HashMap value is not a String");
14600b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                        env->DeleteLocalRef(entry);
14610b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                        *pIsOK = false;
14620b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                        break;
14630b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                    }
14640b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                    jstring jvalue = static_cast<jstring>(obj);
14650b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
14660b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                    String8 key = JStringToString8(env, jkey);
14670b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                    String8 value = JStringToString8(env, jvalue);
14680b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                    keyedVector.add(key, value);
14690b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
14700b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                    env->DeleteLocalRef(jkey);
14710b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                    env->DeleteLocalRef(jvalue);
14720b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                    hasNext = env->CallBooleanMethod(iterator, gFields.iterator.hasNext);
14730b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                }
14740b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                env->DeleteLocalRef(entry);
14750b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania            }
14760b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania            env->DeleteLocalRef(iterator);
14770b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        }
14780b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        env->DeleteLocalRef(entrySet);
14790b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    }
14800b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    return keyedVector;
14810b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania}
14820b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
14830b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastatic void android_media_MediaPlayer_prepareDrm(JNIEnv *env, jobject thiz,
14840b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                    jbyteArray uuidObj, jint mode)
14850b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania{
14860b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
14870b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    if (mp == NULL) {
14880b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        jniThrowException(env, "java/lang/IllegalStateException", NULL);
14890b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        return;
14900b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    }
14910b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
14920b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    if (uuidObj == NULL) {
14930b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
14940b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        return;
14950b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    }
14960b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
14970b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    Vector<uint8_t> uuid = JByteArrayToVector(env, uuidObj);
14980b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
14990b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    if (uuid.size() != 16) {
15000b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        jniThrowException(
15010b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                          env,
15020b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                          "java/lang/IllegalArgumentException",
15030b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                          "invalid UUID size, expected 16 bytes");
15040b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        return;
15050b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    }
15060b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
15070b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    status_t err = mp->prepareDrm(uuid.array(), mode);
15080b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    if (err != OK) {
15090b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        if (err == INVALID_OPERATION) {
15100b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania            jniThrowException(
15110b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                              env,
15120b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                              "java/lang/IllegalStateException",
15130b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                              "The player is not prepared yet.");
15140b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        } else if (err == ERROR_DRM_CANNOT_HANDLE) {
15150b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania            jniThrowException(
15160b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                              env,
15170b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                              "android/media/UnsupportedSchemeException",
15180b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                              "Failed to instantiate drm object.");
15190b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        } else {
15200b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania            throwDrmExceptionAsNecessary(env, err, "Failed to prepare DRM scheme");
15210b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        }
15220b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    }
15230b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania}
15240b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
15250b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastatic void android_media_MediaPlayer_releaseDrm(JNIEnv *env, jobject thiz)
15260b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania{
15270b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
15280b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    if (mp == NULL ) {
15290b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        jniThrowException(env, "java/lang/IllegalStateException", NULL);
15300b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        return;
15310b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    }
15320b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
15330b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    status_t err = mp->releaseDrm();
15340b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    if (err != OK) {
15350b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        if (err == INVALID_OPERATION) {
15360b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania            jniThrowException(
15370b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                              env,
15380b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                              "java/lang/IllegalStateException",
15390b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                              "The player is not prepared yet.");
15400b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        }
15410b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    }
15420b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania}
15430b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
15440b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastatic jobject android_media_MediaPlayer_getKeyRequest(JNIEnv *env, jobject thiz, jbyteArray jscope,
15450b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                       jstring jmimeType, jint jkeyType, jobject joptParams)
15460b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania{
15470b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
15480b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    if (mp == NULL) {
15490b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        jniThrowException(env, "java/lang/IllegalStateException", NULL);
15500b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        return NULL;
15510b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    }
15520b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
15530b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    Vector<uint8_t> scope;
15540b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    if (jscope != NULL) {
15550b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        scope = JByteArrayToVector(env, jscope);
15560b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    }
15570b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
15580b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    String8 mimeType;
15590b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    if (jmimeType != NULL) {
15600b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        mimeType = JStringToString8(env, jmimeType);
15610b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    }
15620b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
15630b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    DrmPlugin::KeyType keyType;
15640b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    if (jkeyType == gKeyTypes.kKeyTypeStreaming) {
15650b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        keyType = DrmPlugin::kKeyType_Streaming;
15660b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    } else if (jkeyType == gKeyTypes.kKeyTypeOffline) {
15670b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        keyType = DrmPlugin::kKeyType_Offline;
15680b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    } else if (jkeyType == gKeyTypes.kKeyTypeRelease) {
15690b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        keyType = DrmPlugin::kKeyType_Release;
15700b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    } else {
15710b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        jniThrowException(env, "java/lang/IllegalArgumentException", "invalid keyType");
15720b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        return NULL;
15730b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    }
15740b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
15750b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    KeyedVector<String8, String8> optParams;
15760b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    if (joptParams != NULL) {
15770b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        bool isOK;
15780b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        optParams = HashMapToKeyedVector(env, joptParams, &isOK);
15790b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        if (!isOK) {
15800b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania            return NULL;
15810b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        }
15820b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    }
15830b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
15840b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    Vector<uint8_t> request;
15850b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    String8 defaultUrl;
15860b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    DrmPlugin::KeyRequestType keyRequestType;
15870b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    status_t err = mp->getKeyRequest(scope, mimeType, keyType, optParams, request, defaultUrl,
15880b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                           keyRequestType);
15890b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
15900b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    if (throwDrmExceptionAsNecessary(env, err, "Failed to get key request")) {
15910b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        return NULL;
15920b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    }
15930b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
15940b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    ALOGV("JNI getKeyRequest err %d  request %d  url %s  keyReqType %d",
15950b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania          err, (int)request.size(), defaultUrl.string(), (int)keyRequestType);
15960b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
15970b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    // Fill out return obj
15980b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    jclass clazz;
15990b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    FIND_CLASS(clazz, "android/media/MediaDrm$KeyRequest");
16000b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
16010b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    jobject keyObj = NULL;
16020b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
16030b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    if (clazz) {
16040b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        keyObj = env->AllocObject(clazz);
16050b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        jbyteArray jrequest = VectorToJByteArray(env, request);
16060b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        env->SetObjectField(keyObj, gFields.keyRequest.data, jrequest);
16070b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
16080b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        jstring jdefaultUrl = env->NewStringUTF(defaultUrl.string());
16090b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        env->SetObjectField(keyObj, gFields.keyRequest.defaultUrl, jdefaultUrl);
16100b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
16110b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        switch (keyRequestType) {
16120b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        case DrmPlugin::kKeyRequestType_Initial:
16130b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania            env->SetIntField(keyObj, gFields.keyRequest.requestType,
16140b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                         gKeyRequestTypes.kKeyRequestTypeInitial);
16150b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania            break;
16160b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        case DrmPlugin::kKeyRequestType_Renewal:
16170b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania            env->SetIntField(keyObj, gFields.keyRequest.requestType,
16180b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                         gKeyRequestTypes.kKeyRequestTypeRenewal);
16190b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania            break;
16200b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        case DrmPlugin::kKeyRequestType_Release:
16210b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania            env->SetIntField(keyObj, gFields.keyRequest.requestType,
16220b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                         gKeyRequestTypes.kKeyRequestTypeRelease);
16230b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania            break;
16240b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        default:
16250b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania            throwDrmStateException(env, "MediaPlayer/DRM plugin failure: unknown "
16260b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                    "key request type", ERROR_DRM_UNKNOWN);
16270b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania            break;
16280b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        }
16290b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    }
16300b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
16310b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    return keyObj;
16320b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania}
16330b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
16340b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastatic jbyteArray android_media_MediaPlayer_provideKeyResponse(JNIEnv *env, jobject thiz,
16350b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                          jbyteArray jreleaseKeySetId, jbyteArray jresponse)
16360b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania{
16370b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
16380b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    if (mp == NULL ) {
16390b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        jniThrowException(env, "java/lang/IllegalStateException", NULL);
16400b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        return NULL;
16410b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    }
16420b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
16430b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    if (jresponse == NULL) {
16440b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        jniThrowException(env, "java/lang/IllegalArgumentException", "key response is null");
16450b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        return NULL;
16460b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    }
16470b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
16480b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    Vector<uint8_t> releaseKeySetId;
16490b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    if (jreleaseKeySetId != NULL) {
16500b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        releaseKeySetId = JByteArrayToVector(env, jreleaseKeySetId);
16510b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    }
16520b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
16530b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    Vector<uint8_t> response(JByteArrayToVector(env, jresponse));
16540b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    Vector<uint8_t> keySetId;
16550b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
16560b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    status_t err = mp->provideKeyResponse(releaseKeySetId, response, keySetId);
16570b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
16580b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    if (throwDrmExceptionAsNecessary(env, err, "Failed to handle key response")) {
16590b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        return NULL;
16600b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    }
16610b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    return VectorToJByteArray(env, keySetId);
16620b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania}
16630b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
16640b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastatic void android_media_MediaPlayer_restoreKeys(JNIEnv *env, jobject thiz, jbyteArray jkeySetId)
16650b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania{
16660b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania     sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
16670b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania     if (mp == NULL) {
16680b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania         jniThrowException(env, "java/lang/IllegalStateException", NULL);
16690b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania         return;
16700b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania     }
16710b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
16720b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    if (jkeySetId == NULL) {
16730b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        jniThrowException(env, "java/lang/IllegalArgumentException", "invalid keyType");
16740b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        return;
16750b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    }
16760b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
16770b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    Vector<uint8_t> keySetId;
16780b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    keySetId = JByteArrayToVector(env, jkeySetId);
16790b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
16800b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    status_t err = mp->restoreKeys(keySetId);
16810b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
16820b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    ALOGV("JNI restoreKeys err %d ", err);
16830b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    throwDrmExceptionAsNecessary(env, err, "Failed to restore keys");
16840b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania}
16850b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
16860b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastatic jstring android_media_MediaPlayer_getDrmPropertyString(JNIEnv *env, jobject thiz,
16870b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                       jstring jname)
16880b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania{
16890b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
16900b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    if (mp == NULL) {
16910b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        jniThrowException(env, "java/lang/IllegalStateException", NULL);
16920b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        return NULL;
16930b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    }
16940b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
16950b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    if (jname == NULL) {
16960b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        jniThrowException(env, "java/lang/IllegalArgumentException",
16970b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                "property name String is null");
16980b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        return NULL;
16990b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    }
17000b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
17010b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    String8 name = JStringToString8(env, jname);
17020b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    String8 value;
17030b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
17040b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    status_t err = mp->getDrmPropertyString(name, value);
17050b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
17060b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    ALOGV("JNI getPropertyString err %d", err);
17070b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
17080b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    if (throwDrmExceptionAsNecessary(env, err, "Failed to get property")) {
17090b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        return NULL;
17100b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    }
17110b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
17120b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    return env->NewStringUTF(value.string());
17130b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania}
17140b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
17150b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojaniastatic void android_media_MediaPlayer_setDrmPropertyString(JNIEnv *env, jobject thiz,
17160b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                    jstring jname, jstring jvalue)
17170b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania{
17180b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
17190b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    if (mp == NULL) {
17200b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        jniThrowException(env, "java/lang/IllegalStateException", NULL);
17210b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        return;
17220b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    }
17230b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
17240b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    if (jname == NULL) {
17250b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        jniThrowException(env, "java/lang/IllegalArgumentException",
17260b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                "property name String is null");
17270b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        return;
17280b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    }
17290b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
17300b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    if (jvalue == NULL) {
17310b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        jniThrowException(env, "java/lang/IllegalArgumentException",
17320b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania                "property value String is null");
17330b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        return;
17340b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    }
17350b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
17360b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    String8 name = JStringToString8(env, jname);
17370b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    String8 value = JStringToString8(env, jvalue);
17380b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
17390b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    status_t err = mp->setDrmPropertyString(name, value);
17400b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania
17410b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    ALOGV("JNI setPropertyString err %d", err);
17420b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    throwDrmExceptionAsNecessary(env, err, "Failed to set property");
17430b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania}
17440b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania// Modular DRM end
17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
174776f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gMethods[] = {
174817524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong    {
1749d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber        "nativeSetDataSource",
1750d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber        "(Landroid/os/IBinder;Ljava/lang/String;[Ljava/lang/String;"
1751d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber        "[Ljava/lang/String;)V",
175217524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong        (void *)android_media_MediaPlayer_setDataSourceAndHeaders
175317524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong    },
175417524dc0d296146c8ffb3f692dc8ab05fee5b1e0James Dong
17554eaa2938084353a54dc259466172909329a048ccChris Watkins    {"_setDataSource",      "(Ljava/io/FileDescriptor;JJ)V",    (void *)android_media_MediaPlayer_setDataSourceFD},
17564eaa2938084353a54dc259466172909329a048ccChris Watkins    {"_setDataSource",      "(Landroid/media/MediaDataSource;)V",(void *)android_media_MediaPlayer_setDataSourceCallback },
17571ee60119c4fa51ebfa781cf5fdc33f192e8551b8Ted Bonkenburg    {"_setVideoSurface",    "(Landroid/view/Surface;)V",        (void *)android_media_MediaPlayer_setVideoSurface},
175823dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    {"getDefaultBufferingParams", "()Landroid/media/BufferingParams;", (void *)android_media_MediaPlayer_getDefaultBufferingParams},
175923dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    {"getBufferingParams", "()Landroid/media/BufferingParams;", (void *)android_media_MediaPlayer_getBufferingParams},
176023dfee521a7782bf901344beec6f94614e0b02b8Wei Jia    {"setBufferingParams", "(Landroid/media/BufferingParams;)V", (void *)android_media_MediaPlayer_setBufferingParams},
1761c42a96dba4beaf87875e71b8d8b77ce7154c5cdbRobert Shih    {"_prepare",            "()V",                              (void *)android_media_MediaPlayer_prepare},
176207830aa6ba4804880df3cb39f8932aa6b3906a8aRobert Shih    {"prepareAsync",        "()V",                              (void *)android_media_MediaPlayer_prepareAsync},
17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"_start",              "()V",                              (void *)android_media_MediaPlayer_start},
17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"_stop",               "()V",                              (void *)android_media_MediaPlayer_stop},
17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"getVideoWidth",       "()I",                              (void *)android_media_MediaPlayer_getVideoWidth},
17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"getVideoHeight",      "()I",                              (void *)android_media_MediaPlayer_getVideoHeight},
17670e0fee1e3a04023c9ec122d3bd7da54e9565c3e7Ray Essick    {"getMetrics",          "()Landroid/os/Bundle;",            (void *)android_media_MediaPlayer_getMetrics},
17682d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    {"setPlaybackParams", "(Landroid/media/PlaybackParams;)V", (void *)android_media_MediaPlayer_setPlaybackParams},
17692d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    {"getPlaybackParams", "()Landroid/media/PlaybackParams;", (void *)android_media_MediaPlayer_getPlaybackParams},
17702d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    {"setSyncParams",     "(Landroid/media/SyncParams;)V",  (void *)android_media_MediaPlayer_setSyncParams},
17712d61e2b97c92ac2de80ebb3782b728ae5cdf5306Wei Jia    {"getSyncParams",     "()Landroid/media/SyncParams;",   (void *)android_media_MediaPlayer_getSyncParams},
1772ebc2b694d1b5dc6b8a2cd2825e11f914e542cc56Wei Jia    {"_seekTo",             "(II)V",                            (void *)android_media_MediaPlayer_seekTo},
17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"_pause",              "()V",                              (void *)android_media_MediaPlayer_pause},
17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"isPlaying",           "()Z",                              (void *)android_media_MediaPlayer_isPlaying},
17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"getCurrentPosition",  "()I",                              (void *)android_media_MediaPlayer_getCurrentPosition},
17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"getDuration",         "()I",                              (void *)android_media_MediaPlayer_getDuration},
17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"_release",            "()V",                              (void *)android_media_MediaPlayer_release},
17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"_reset",              "()V",                              (void *)android_media_MediaPlayer_reset},
17791af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock    {"_setAudioStreamType", "(I)V",                             (void *)android_media_MediaPlayer_setAudioStreamType},
17801af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock    {"_getAudioStreamType", "()I",                              (void *)android_media_MediaPlayer_getAudioStreamType},
17818df982dfa5408afe67cd6a4b45bfbf26c94299d0Jean-Michel Trivi    {"setParameter",        "(ILandroid/os/Parcel;)Z",          (void *)android_media_MediaPlayer_setParameter},
17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"setLooping",          "(Z)V",                             (void *)android_media_MediaPlayer_setLooping},
17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"isLooping",           "()Z",                              (void *)android_media_MediaPlayer_isLooping},
17841af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock    {"_setVolume",          "(FF)V",                            (void *)android_media_MediaPlayer_setVolume},
178520cb94eeb5b9672573fc86bf51e09bd66a774581Nicolas Catania    {"native_invoke",       "(Landroid/os/Parcel;Landroid/os/Parcel;)I",(void *)android_media_MediaPlayer_invoke},
1786b2c693919be966f179080a9ec70a7a82dbf57627Nicolas Catania    {"native_setMetadataFilter", "(Landroid/os/Parcel;)I",      (void *)android_media_MediaPlayer_setMetadataFilter},
17875d55c7119820ee9bb06fc072e416fe98ba77cd28Nicolas Catania    {"native_getMetadata", "(ZZLandroid/os/Parcel;)Z",          (void *)android_media_MediaPlayer_getMetadata},
17884935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen    {"native_init",         "()V",                              (void *)android_media_MediaPlayer_native_init},
17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"native_setup",        "(Ljava/lang/Object;)V",            (void *)android_media_MediaPlayer_native_setup},
17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {"native_finalize",     "()V",                              (void *)android_media_MediaPlayer_native_finalize},
1791619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent    {"getAudioSessionId",   "()I",                              (void *)android_media_MediaPlayer_get_audio_session_id},
1792619346f902241736d933657a4fe10f10c50a1ba8Eric Laurent    {"setAudioSessionId",   "(I)V",                             (void *)android_media_MediaPlayer_set_audio_session_id},
17931af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock    {"_setAuxEffectSendLevel", "(F)V",                          (void *)android_media_MediaPlayer_setAuxEffectSendLevel},
17947070b36549d511d6627538c73dfbab23fbae5b43Eric Laurent    {"attachAuxEffect",     "(I)V",                             (void *)android_media_MediaPlayer_attachAuxEffect},
1795d211f41f764fe81fe00b10a99b4b44cb84479cbeGloria Wang    {"native_pullBatteryData", "(Landroid/os/Parcel;)I",        (void *)android_media_MediaPlayer_pullBatteryData},
1796720aa282791ef9405d39a15f419a41ab24f11e30John Grossman    {"native_setRetransmitEndpoint", "(Ljava/lang/String;I)I",  (void *)android_media_MediaPlayer_setRetransmitEndpoint},
179784b832054552e00257bb04997143ca33d6d100beMarco Nelissen    {"setNextMediaPlayer",  "(Landroid/media/MediaPlayer;)V",   (void *)android_media_MediaPlayer_setNextMediaPlayer},
1798035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung    {"native_applyVolumeShaper",
1799035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung                            "(Landroid/media/VolumeShaper$Configuration;Landroid/media/VolumeShaper$Operation;)I",
1800035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung                                                                (void *)android_media_MediaPlayer_applyVolumeShaper},
1801035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung    {"native_getVolumeShaperState",
1802035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung                            "(I)Landroid/media/VolumeShaper$State;",
1803035d4ec772b0cde2a8d4b05d2daa9b9cbe11e117Andy Hung                                                                (void *)android_media_MediaPlayer_getVolumeShaperState},
18040b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    // Modular DRM
18050b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    { "_prepareDrm", "([BI)V",                                  (void *)android_media_MediaPlayer_prepareDrm },
18060b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    { "_releaseDrm", "()V",                                     (void *)android_media_MediaPlayer_releaseDrm },
18070b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    { "_getKeyRequest", "([BLjava/lang/String;ILjava/util/Map;)" "Landroid/media/MediaDrm$KeyRequest;",
18080b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania        (void *)android_media_MediaPlayer_getKeyRequest },
18090b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    { "_provideKeyResponse", "([B[B)[B",                        (void *)android_media_MediaPlayer_provideKeyResponse },
18100b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    { "_getDrmPropertyString", "(Ljava/lang/String;)Ljava/lang/String;", (void *)android_media_MediaPlayer_getDrmPropertyString },
18110b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    { "_setDrmPropertyString", "(Ljava/lang/String;Ljava/lang/String;)V",(void *)android_media_MediaPlayer_setDrmPropertyString },
18120b52e95c3fe5e8de93276678d7db9a17b217622eHassan Shojania    { "_restoreKeys", "([B)V",                                  (void *)android_media_MediaPlayer_restoreKeys },
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18154935d05eaa306cef88cf0ab13eca386f270409ecMarco Nelissen// This function only registers the native methods
18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int register_android_media_MediaPlayer(JNIEnv *env)
18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return AndroidRuntime::registerNativeMethods(env,
18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "android/media/MediaPlayer", gMethods, NELEM(gMethods));
18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1821212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun Heextern int register_android_media_ImageReader(JNIEnv *env);
1822f6a09e510649ae4701bb5ad4c40d102d59a5608cZhijun Heextern int register_android_media_ImageWriter(JNIEnv *env);
18238240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huberextern int register_android_media_Crypto(JNIEnv *env);
18248a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinkerextern int register_android_media_Drm(JNIEnv *env);
182588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberextern int register_android_media_MediaCodec(JNIEnv *env);
182688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huberextern int register_android_media_MediaExtractor(JNIEnv *env);
18275a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huberextern int register_android_media_MediaCodecList(JNIEnv *env);
1828d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huberextern int register_android_media_MediaHTTPConnection(JNIEnv *env);
1829bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huberextern int register_android_media_MediaMetadataRetriever(JNIEnv *env);
183068ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghuiextern int register_android_media_MediaMuxer(JNIEnv *env);
18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern int register_android_media_MediaRecorder(JNIEnv *env);
18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern int register_android_media_MediaScanner(JNIEnv *env);
1833071a8b71d1212e218a3ebf7dbb8908a4acf5cf6dWei Jiaextern int register_android_media_MediaSync(JNIEnv *env);
18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectextern int register_android_media_ResampleInputStream(JNIEnv *env);
1835c371194e4e0651c328f1870a90bbfd4e217c747bJames Dongextern int register_android_media_MediaProfiles(JNIEnv *env);
18360cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwoodextern int register_android_mtp_MtpDatabase(JNIEnv *env);
18378182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwoodextern int register_android_mtp_MtpDevice(JNIEnv *env);
18380cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwoodextern int register_android_mtp_MtpServer(JNIEnv *env);
1839bfb9fb143b67c2d0307af2bce9af3c08f362b29aAndreas Huber
1840d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huberjint JNI_OnLoad(JavaVM* vm, void* /* reserved */)
18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    JNIEnv* env = NULL;
18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jint result = -1;
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
18463762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("ERROR: GetEnv failed\n");
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        goto bail;
18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    assert(env != NULL);
18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1851f6a09e510649ae4701bb5ad4c40d102d59a5608cZhijun He    if (register_android_media_ImageWriter(env) != JNI_OK) {
1852f6a09e510649ae4701bb5ad4c40d102d59a5608cZhijun He        ALOGE("ERROR: ImageWriter native registration failed");
1853f6a09e510649ae4701bb5ad4c40d102d59a5608cZhijun He        goto bail;
1854f6a09e510649ae4701bb5ad4c40d102d59a5608cZhijun He    }
1855f6a09e510649ae4701bb5ad4c40d102d59a5608cZhijun He
1856212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun He    if (register_android_media_ImageReader(env) < 0) {
1857212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun He        ALOGE("ERROR: ImageReader native registration failed");
1858212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun He        goto bail;
1859212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun He    }
1860212e78df9eb3bfff069de01aa7820cf4201c5f82Zhijun He
18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (register_android_media_MediaPlayer(env) < 0) {
18623762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("ERROR: MediaPlayer native registration failed\n");
18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        goto bail;
18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (register_android_media_MediaRecorder(env) < 0) {
18673762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("ERROR: MediaRecorder native registration failed\n");
18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        goto bail;
18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (register_android_media_MediaScanner(env) < 0) {
18723762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("ERROR: MediaScanner native registration failed\n");
18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        goto bail;
18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (register_android_media_MediaMetadataRetriever(env) < 0) {
18773762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("ERROR: MediaMetadataRetriever native registration failed\n");
18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        goto bail;
18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (register_android_media_ResampleInputStream(env) < 0) {
18823762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("ERROR: ResampleInputStream native registration failed\n");
18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        goto bail;
18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1886c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    if (register_android_media_MediaProfiles(env) < 0) {
18873762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("ERROR: MediaProfiles native registration failed");
1888c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong        goto bail;
1889c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong    }
1890c371194e4e0651c328f1870a90bbfd4e217c747bJames Dong
18910cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwood    if (register_android_mtp_MtpDatabase(env) < 0) {
18923762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("ERROR: MtpDatabase native registration failed");
1893d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood        goto bail;
1894d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood    }
1895d21eac9c70940f2c73da5faaf401dbbc44b70a15Mike Lockwood
18968182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    if (register_android_mtp_MtpDevice(env) < 0) {
18973762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("ERROR: MtpDevice native registration failed");
18988182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood        goto bail;
18998182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood    }
19008182e72479a8b0d832df9c392890b25bfa6f97b5Mike Lockwood
19010cd0136d440cf6ad9d5fab430269116786e671ecMike Lockwood    if (register_android_mtp_MtpServer(env) < 0) {
19023762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("ERROR: MtpServer native registration failed");
190381ea83d10883886013bc95eac2fe032acf1e7aa9Mike Lockwood        goto bail;
190481ea83d10883886013bc95eac2fe032acf1e7aa9Mike Lockwood    }
190581ea83d10883886013bc95eac2fe032acf1e7aa9Mike Lockwood
190688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    if (register_android_media_MediaCodec(env) < 0) {
190788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        ALOGE("ERROR: MediaCodec native registration failed");
1908071a8b71d1212e218a3ebf7dbb8908a4acf5cf6dWei Jia        goto bail;
1909071a8b71d1212e218a3ebf7dbb8908a4acf5cf6dWei Jia    }
1910071a8b71d1212e218a3ebf7dbb8908a4acf5cf6dWei Jia
1911071a8b71d1212e218a3ebf7dbb8908a4acf5cf6dWei Jia    if (register_android_media_MediaSync(env) < 0) {
1912071a8b71d1212e218a3ebf7dbb8908a4acf5cf6dWei Jia        ALOGE("ERROR: MediaSync native registration failed");
191388572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        goto bail;
191488572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    }
191588572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
191688572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    if (register_android_media_MediaExtractor(env) < 0) {
191788572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        ALOGE("ERROR: MediaCodec native registration failed");
191888572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber        goto bail;
191988572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber    }
192088572f7a3e9d7ef85c26865a0150f3c2041561c2Andreas Huber
192168ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    if (register_android_media_MediaMuxer(env) < 0) {
192268ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        ALOGE("ERROR: MediaMuxer native registration failed");
192368ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui        goto bail;
192468ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui    }
192568ccf103a10c674f1db649bb15bb3e790bc6dad3ztenghui
19265a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber    if (register_android_media_MediaCodecList(env) < 0) {
19275a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber        ALOGE("ERROR: MediaCodec native registration failed");
19285a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber        goto bail;
19295a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber    }
19305a04bf395514a9342dd26af519b88f4b3e309eb9Andreas Huber
19318240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber    if (register_android_media_Crypto(env) < 0) {
19328240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber        ALOGE("ERROR: MediaCodec native registration failed");
19338240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber        goto bail;
19348240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber    }
19358240d9239d9aabed75c49f9d4d69fd8a5fe4c899Andreas Huber
19368a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker    if (register_android_media_Drm(env) < 0) {
19378a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker        ALOGE("ERROR: MediaDrm native registration failed");
19388a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker        goto bail;
19398a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker    }
19408a0c80fdcc46faa8cb8c9f4dda06f4b63ec2f906Jeff Tinker
1941d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber    if (register_android_media_MediaHTTPConnection(env) < 0) {
1942d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber        ALOGE("ERROR: MediaHTTPConnection native registration failed");
1943d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber        goto bail;
1944d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber    }
1945d2506a506303ed94fd1991cf986b825b870a67c5Andreas Huber
19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* success -- return valid version number */
19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    result = JNI_VERSION_1_4;
19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbail:
19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return result;
19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// KTHXBYE
1954