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