blob: 8f14b79660be7a9e89d913648dffae0aee25f3bc [file] [log] [blame]
James Dongc371a022011-04-06 12:16:07 -07001/*
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002**
3** Copyright 2007, The Android Open Source Project
4**
5** Licensed under the Apache License, Version 2.0 (the "License");
6** you may not use this file except in compliance with the License.
7** You may obtain a copy of the License at
8**
9** http://www.apache.org/licenses/LICENSE-2.0
10**
11** Unless required by applicable law or agreed to in writing, software
12** distributed under the License is distributed on an "AS IS" BASIS,
13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14** See the License for the specific language governing permissions and
15** limitations under the License.
16*/
17
18//#define LOG_NDEBUG 0
19#define LOG_TAG "MediaPlayer-JNI"
20#include "utils/Log.h"
21
22#include <media/mediaplayer.h>
Lajos Molnarb3d5fd22015-04-22 13:14:34 -070023#include <media/AudioResamplerPublic.h>
Andreas Huberd2506a52014-01-29 10:32:46 -080024#include <media/IMediaHTTPService.h>
Nicolas Catania20cb94e2009-05-12 23:25:55 -070025#include <media/MediaPlayerInterface.h>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080026#include <stdio.h>
27#include <assert.h>
28#include <limits.h>
29#include <unistd.h>
30#include <fcntl.h>
31#include <utils/threads.h>
32#include "jni.h"
33#include "JNIHelp.h"
34#include "android_runtime/AndroidRuntime.h"
Ted Bonkenburg1ee60112011-07-26 09:51:18 -070035#include "android_runtime/android_view_Surface.h"
Ruben Brunk87eac992013-09-09 17:44:59 -070036#include "android_runtime/Log.h"
The Android Open Source Project4df24232009-03-05 14:34:35 -080037#include "utils/Errors.h" // for status_t
Andreas Huber25643002010-01-28 11:19:57 -080038#include "utils/KeyedVector.h"
39#include "utils/String8.h"
Chris Watkins4eaa2932015-03-20 10:31:42 -070040#include "android_media_MediaDataSource.h"
Wei Jia2d61e2b2015-05-08 15:23:28 -070041#include "android_media_PlaybackParams.h"
42#include "android_media_SyncParams.h"
James Dong79f407c2011-05-05 12:50:04 -070043#include "android_media_Utils.h"
44
Jeff Sharkeyd84e1ce2012-03-06 18:26:19 -080045#include "android_os_Parcel.h"
Nicolas Catania20cb94e2009-05-12 23:25:55 -070046#include "android_util_Binder.h"
47#include <binder/Parcel.h>
Andy McFaddend47f7d82012-12-18 09:48:38 -080048#include <gui/IGraphicBufferProducer.h>
Mathias Agopian8335f1c2012-02-25 18:48:35 -080049#include <gui/Surface.h>
Gloria Wangd211f412011-02-19 18:37:57 -080050#include <binder/IPCThreadState.h>
51#include <binder/IServiceManager.h>
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080052
Andreas Huberd2506a52014-01-29 10:32:46 -080053#include "android_util_Binder.h"
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080054// ----------------------------------------------------------------------------
55
56using namespace android;
57
58// ----------------------------------------------------------------------------
59
60struct fields_t {
61 jfieldID context;
Ted Bonkenburg1ee60112011-07-26 09:51:18 -070062 jfieldID surface_texture;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080063
64 jmethodID post_event;
Andreas Huberd5f9fa52013-05-28 14:39:39 -070065
66 jmethodID proxyConfigGetHost;
67 jmethodID proxyConfigGetPort;
68 jmethodID proxyConfigGetExclusionList;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080069};
70static fields_t fields;
71
Wei Jia2d61e2b2015-05-08 15:23:28 -070072static PlaybackParams::fields_t gPlaybackParamsFields;
73static SyncParams::fields_t gSyncParamsFields;
Lajos Molnarb3d5fd22015-04-22 13:14:34 -070074
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080075static Mutex sLock;
76
77// ----------------------------------------------------------------------------
78// ref-counted object for callbacks
79class JNIMediaPlayerListener: public MediaPlayerListener
80{
81public:
82 JNIMediaPlayerListener(JNIEnv* env, jobject thiz, jobject weak_thiz);
83 ~JNIMediaPlayerListener();
Gloria Wang162ee492011-04-11 17:23:27 -070084 virtual void notify(int msg, int ext1, int ext2, const Parcel *obj = NULL);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080085private:
86 JNIMediaPlayerListener();
87 jclass mClass; // Reference to MediaPlayer class
88 jobject mObject; // Weak ref to MediaPlayer Java object to call on
89};
90
91JNIMediaPlayerListener::JNIMediaPlayerListener(JNIEnv* env, jobject thiz, jobject weak_thiz)
92{
93
94 // Hold onto the MediaPlayer class for use in calling the static method
95 // that posts events to the application thread.
96 jclass clazz = env->GetObjectClass(thiz);
97 if (clazz == NULL) {
Steve Block3762c312012-01-06 19:20:56 +000098 ALOGE("Can't find android/media/MediaPlayer");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080099 jniThrowException(env, "java/lang/Exception", NULL);
100 return;
101 }
102 mClass = (jclass)env->NewGlobalRef(clazz);
103
104 // We use a weak reference so the MediaPlayer object can be garbage collected.
105 // The reference is only used as a proxy for callbacks.
106 mObject = env->NewGlobalRef(weak_thiz);
107}
108
109JNIMediaPlayerListener::~JNIMediaPlayerListener()
110{
111 // remove global references
112 JNIEnv *env = AndroidRuntime::getJNIEnv();
113 env->DeleteGlobalRef(mObject);
114 env->DeleteGlobalRef(mClass);
115}
116
Gloria Wang162ee492011-04-11 17:23:27 -0700117void JNIMediaPlayerListener::notify(int msg, int ext1, int ext2, const Parcel *obj)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800118{
119 JNIEnv *env = AndroidRuntime::getJNIEnv();
Gloria Wang162ee492011-04-11 17:23:27 -0700120 if (obj && obj->dataSize() > 0) {
Insun Kang333c0992012-07-10 12:47:03 +0900121 jobject jParcel = createJavaParcelObject(env);
122 if (jParcel != NULL) {
123 Parcel* nativeParcel = parcelForJavaObject(env, jParcel);
Insun Kang89020972012-05-01 14:13:19 +0900124 nativeParcel->setData(obj->data(), obj->dataSize());
Gloria Wang162ee492011-04-11 17:23:27 -0700125 env->CallStaticVoidMethod(mClass, fields.post_event, mObject,
Insun Kang333c0992012-07-10 12:47:03 +0900126 msg, ext1, ext2, jParcel);
Elliott Hughes99f75212013-11-13 15:10:40 -0800127 env->DeleteLocalRef(jParcel);
Gloria Wang162ee492011-04-11 17:23:27 -0700128 }
129 } else {
130 env->CallStaticVoidMethod(mClass, fields.post_event, mObject,
131 msg, ext1, ext2, NULL);
132 }
Insun Kang89020972012-05-01 14:13:19 +0900133 if (env->ExceptionCheck()) {
134 ALOGW("An exception occurred while notifying an event.");
135 LOGW_EX(env);
136 env->ExceptionClear();
137 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800138}
139
140// ----------------------------------------------------------------------------
141
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800142static sp<MediaPlayer> getMediaPlayer(JNIEnv* env, jobject thiz)
143{
144 Mutex::Autolock l(sLock);
Ashok Bhat075e9a12014-01-06 13:45:09 +0000145 MediaPlayer* const p = (MediaPlayer*)env->GetLongField(thiz, fields.context);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800146 return sp<MediaPlayer>(p);
147}
148
149static sp<MediaPlayer> setMediaPlayer(JNIEnv* env, jobject thiz, const sp<MediaPlayer>& player)
150{
151 Mutex::Autolock l(sLock);
Ashok Bhat075e9a12014-01-06 13:45:09 +0000152 sp<MediaPlayer> old = (MediaPlayer*)env->GetLongField(thiz, fields.context);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800153 if (player.get()) {
Mathias Agopianb1d90c82013-03-06 17:45:42 -0800154 player->incStrong((void*)setMediaPlayer);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800155 }
156 if (old != 0) {
Mathias Agopianb1d90c82013-03-06 17:45:42 -0800157 old->decStrong((void*)setMediaPlayer);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800158 }
Ashok Bhat075e9a12014-01-06 13:45:09 +0000159 env->SetLongField(thiz, fields.context, (jlong)player.get());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800160 return old;
161}
162
Nicolas Catania32f82772009-06-11 16:33:49 -0700163// If exception is NULL and opStatus is not OK, this method sends an error
164// event to the client application; otherwise, if exception is not NULL and
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800165// opStatus is not OK, this method throws the given exception to the client
166// application.
167static void process_media_player_call(JNIEnv *env, jobject thiz, status_t opStatus, const char* exception, const char *message)
168{
169 if (exception == NULL) { // Don't throw exception. Instead, send an event.
170 if (opStatus != (status_t) OK) {
171 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
172 if (mp != 0) mp->notify(MEDIA_ERROR, opStatus, 0);
173 }
174 } else { // Throw exception!
175 if ( opStatus == (status_t) INVALID_OPERATION ) {
176 jniThrowException(env, "java/lang/IllegalStateException", NULL);
Lajos Molnar05ebffe2015-04-29 20:41:19 -0700177 } else if ( opStatus == (status_t) BAD_VALUE ) {
178 jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
Dave Burkefc301b02011-08-30 14:39:17 +0100179 } else if ( opStatus == (status_t) PERMISSION_DENIED ) {
180 jniThrowException(env, "java/lang/SecurityException", NULL);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800181 } else if ( opStatus != (status_t) OK ) {
182 if (strlen(message) > 230) {
183 // if the message is too long, don't bother displaying the status code
184 jniThrowException( env, exception, message);
185 } else {
186 char msg[256];
187 // append the status code to the message
188 sprintf(msg, "%s: status=0x%X", message, opStatus);
189 jniThrowException( env, exception, msg);
190 }
191 }
192 }
193}
194
195static void
Andreas Huber25643002010-01-28 11:19:57 -0800196android_media_MediaPlayer_setDataSourceAndHeaders(
Andreas Huberd2506a52014-01-29 10:32:46 -0800197 JNIEnv *env, jobject thiz, jobject httpServiceBinderObj, jstring path,
James Dong17524dc2011-05-04 13:41:58 -0700198 jobjectArray keys, jobjectArray values) {
199
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800200 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
201 if (mp == NULL ) {
202 jniThrowException(env, "java/lang/IllegalStateException", NULL);
203 return;
204 }
205
206 if (path == NULL) {
207 jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
208 return;
209 }
210
James Dongc371a022011-04-06 12:16:07 -0700211 const char *tmp = env->GetStringUTFChars(path, NULL);
212 if (tmp == NULL) { // Out of memory
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800213 return;
214 }
Steve Block71f2cf12011-10-20 11:56:00 +0100215 ALOGV("setDataSource: path %s", tmp);
Andreas Huber25643002010-01-28 11:19:57 -0800216
James Dongc371a022011-04-06 12:16:07 -0700217 String8 pathStr(tmp);
218 env->ReleaseStringUTFChars(path, tmp);
219 tmp = NULL;
220
James Dong17524dc2011-05-04 13:41:58 -0700221 // We build a KeyedVector out of the key and val arrays
Andreas Huber25643002010-01-28 11:19:57 -0800222 KeyedVector<String8, String8> headersVector;
James Dong79f407c2011-05-05 12:50:04 -0700223 if (!ConvertKeyValueArraysToKeyedVector(
224 env, keys, values, &headersVector)) {
225 return;
Andreas Huber25643002010-01-28 11:19:57 -0800226 }
227
Andreas Huberd2506a52014-01-29 10:32:46 -0800228 sp<IMediaHTTPService> httpService;
229 if (httpServiceBinderObj != NULL) {
230 sp<IBinder> binder = ibinderForJavaObject(env, httpServiceBinderObj);
231 httpService = interface_cast<IMediaHTTPService>(binder);
232 }
233
Andreas Huber25643002010-01-28 11:19:57 -0800234 status_t opStatus =
235 mp->setDataSource(
Andreas Huberd2506a52014-01-29 10:32:46 -0800236 httpService,
James Dongc371a022011-04-06 12:16:07 -0700237 pathStr,
James Dong79f407c2011-05-05 12:50:04 -0700238 headersVector.size() > 0? &headersVector : NULL);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800239
Andreas Huber25643002010-01-28 11:19:57 -0800240 process_media_player_call(
241 env, thiz, opStatus, "java/io/IOException",
242 "setDataSource failed." );
243}
244
245static void
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800246android_media_MediaPlayer_setDataSourceFD(JNIEnv *env, jobject thiz, jobject fileDescriptor, jlong offset, jlong length)
247{
248 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
249 if (mp == NULL ) {
250 jniThrowException(env, "java/lang/IllegalStateException", NULL);
251 return;
252 }
253
254 if (fileDescriptor == NULL) {
255 jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
256 return;
257 }
Elliott Hughesa3804cf2011-04-11 16:50:19 -0700258 int fd = jniGetFDFromFileDescriptor(env, fileDescriptor);
Steve Block71f2cf12011-10-20 11:56:00 +0100259 ALOGV("setDataSourceFD: fd %d", fd);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800260 process_media_player_call( env, thiz, mp->setDataSource(fd, offset, length), "java/io/IOException", "setDataSourceFD failed." );
261}
262
Chris Watkins4eaa2932015-03-20 10:31:42 -0700263static void
264android_media_MediaPlayer_setDataSourceCallback(JNIEnv *env, jobject thiz, jobject dataSource)
265{
266 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
267 if (mp == NULL ) {
268 jniThrowException(env, "java/lang/IllegalStateException", NULL);
269 return;
270 }
271
272 if (dataSource == NULL) {
273 jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
274 return;
275 }
276 sp<IDataSource> callbackDataSource = new JMediaDataSource(env, dataSource);
277 process_media_player_call(env, thiz, mp->setDataSource(callbackDataSource), "java/lang/RuntimeException", "setDataSourceCallback failed." );
278}
279
Andy McFaddend47f7d82012-12-18 09:48:38 -0800280static sp<IGraphicBufferProducer>
Ted Bonkenburg1ee60112011-07-26 09:51:18 -0700281getVideoSurfaceTexture(JNIEnv* env, jobject thiz) {
Ashok Bhat075e9a12014-01-06 13:45:09 +0000282 IGraphicBufferProducer * const p = (IGraphicBufferProducer*)env->GetLongField(thiz, fields.surface_texture);
Andy McFaddend47f7d82012-12-18 09:48:38 -0800283 return sp<IGraphicBufferProducer>(p);
Dave Sparks8b0b1742009-05-29 09:01:20 -0700284}
285
286static void
Gloria Wangd59310d2011-09-14 13:59:45 -0700287decVideoSurfaceRef(JNIEnv *env, jobject thiz)
288{
Gloria Wange828beb2011-09-15 15:28:43 -0700289 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
290 if (mp == NULL) {
291 return;
292 }
293
Andy McFaddend47f7d82012-12-18 09:48:38 -0800294 sp<IGraphicBufferProducer> old_st = getVideoSurfaceTexture(env, thiz);
Gloria Wangd59310d2011-09-14 13:59:45 -0700295 if (old_st != NULL) {
Mathias Agopianb1d90c82013-03-06 17:45:42 -0800296 old_st->decStrong((void*)decVideoSurfaceRef);
Gloria Wangd59310d2011-09-14 13:59:45 -0700297 }
298}
299
300static void
James Dong43ef9132011-08-12 11:33:27 -0700301setVideoSurface(JNIEnv *env, jobject thiz, jobject jsurface, jboolean mediaPlayerMustBeAlive)
Dave Sparks8b0b1742009-05-29 09:01:20 -0700302{
303 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
James Dong43ef9132011-08-12 11:33:27 -0700304 if (mp == NULL) {
305 if (mediaPlayerMustBeAlive) {
306 jniThrowException(env, "java/lang/IllegalStateException", NULL);
307 }
Dave Sparks8b0b1742009-05-29 09:01:20 -0700308 return;
309 }
Ted Bonkenburg1ee60112011-07-26 09:51:18 -0700310
Gloria Wangd59310d2011-09-14 13:59:45 -0700311 decVideoSurfaceRef(env, thiz);
312
Andy McFaddend47f7d82012-12-18 09:48:38 -0800313 sp<IGraphicBufferProducer> new_st;
Ted Bonkenburg1ee60112011-07-26 09:51:18 -0700314 if (jsurface) {
Jeff Brown64a55af2012-08-26 02:47:39 -0700315 sp<Surface> surface(android_view_Surface_getSurface(env, jsurface));
Jamie Gennisf76afc82011-10-14 19:06:55 -0700316 if (surface != NULL) {
Mathias Agopian52800612013-02-14 17:11:20 -0800317 new_st = surface->getIGraphicBufferProducer();
James Dong097922b2012-10-04 09:16:40 -0700318 if (new_st == NULL) {
319 jniThrowException(env, "java/lang/IllegalArgumentException",
320 "The surface does not have a binding SurfaceTexture!");
321 return;
322 }
Mathias Agopianb1d90c82013-03-06 17:45:42 -0800323 new_st->incStrong((void*)decVideoSurfaceRef);
Jamie Gennisf76afc82011-10-14 19:06:55 -0700324 } else {
325 jniThrowException(env, "java/lang/IllegalArgumentException",
326 "The surface has been released");
327 return;
328 }
Ted Bonkenburg1ee60112011-07-26 09:51:18 -0700329 }
Gloria Wangd59310d2011-09-14 13:59:45 -0700330
Ashok Bhat075e9a12014-01-06 13:45:09 +0000331 env->SetLongField(thiz, fields.surface_texture, (jlong)new_st.get());
Ted Bonkenburg1ee60112011-07-26 09:51:18 -0700332
333 // This will fail if the media player has not been initialized yet. This
334 // can be the case if setDisplay() on MediaPlayer.java has been called
335 // before setDataSource(). The redundant call to setVideoSurfaceTexture()
336 // in prepare/prepareAsync covers for this case.
337 mp->setVideoSurfaceTexture(new_st);
Dave Sparks8b0b1742009-05-29 09:01:20 -0700338}
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800339
340static void
James Dong43ef9132011-08-12 11:33:27 -0700341android_media_MediaPlayer_setVideoSurface(JNIEnv *env, jobject thiz, jobject jsurface)
342{
343 setVideoSurface(env, thiz, jsurface, true /* mediaPlayerMustBeAlive */);
344}
345
346static void
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800347android_media_MediaPlayer_prepare(JNIEnv *env, jobject thiz)
348{
349 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
350 if (mp == NULL ) {
351 jniThrowException(env, "java/lang/IllegalStateException", NULL);
352 return;
353 }
Ted Bonkenburg1ee60112011-07-26 09:51:18 -0700354
355 // Handle the case where the display surface was set before the mp was
356 // initialized. We try again to make it stick.
Andy McFaddend47f7d82012-12-18 09:48:38 -0800357 sp<IGraphicBufferProducer> st = getVideoSurfaceTexture(env, thiz);
Ted Bonkenburg1ee60112011-07-26 09:51:18 -0700358 mp->setVideoSurfaceTexture(st);
359
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800360 process_media_player_call( env, thiz, mp->prepare(), "java/io/IOException", "Prepare failed." );
361}
362
363static void
364android_media_MediaPlayer_prepareAsync(JNIEnv *env, jobject thiz)
365{
366 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
367 if (mp == NULL ) {
368 jniThrowException(env, "java/lang/IllegalStateException", NULL);
369 return;
370 }
Ted Bonkenburg1ee60112011-07-26 09:51:18 -0700371
372 // Handle the case where the display surface was set before the mp was
373 // initialized. We try again to make it stick.
Andy McFaddend47f7d82012-12-18 09:48:38 -0800374 sp<IGraphicBufferProducer> st = getVideoSurfaceTexture(env, thiz);
Ted Bonkenburg1ee60112011-07-26 09:51:18 -0700375 mp->setVideoSurfaceTexture(st);
376
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800377 process_media_player_call( env, thiz, mp->prepareAsync(), "java/io/IOException", "Prepare Async failed." );
378}
379
380static void
381android_media_MediaPlayer_start(JNIEnv *env, jobject thiz)
382{
Steve Block71f2cf12011-10-20 11:56:00 +0100383 ALOGV("start");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800384 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
385 if (mp == NULL ) {
386 jniThrowException(env, "java/lang/IllegalStateException", NULL);
387 return;
388 }
389 process_media_player_call( env, thiz, mp->start(), NULL, NULL );
390}
391
392static void
393android_media_MediaPlayer_stop(JNIEnv *env, jobject thiz)
394{
Steve Block71f2cf12011-10-20 11:56:00 +0100395 ALOGV("stop");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800396 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
397 if (mp == NULL ) {
398 jniThrowException(env, "java/lang/IllegalStateException", NULL);
399 return;
400 }
Nicolas Catania32f82772009-06-11 16:33:49 -0700401 process_media_player_call( env, thiz, mp->stop(), NULL, NULL );
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800402}
403
404static void
405android_media_MediaPlayer_pause(JNIEnv *env, jobject thiz)
406{
Steve Block71f2cf12011-10-20 11:56:00 +0100407 ALOGV("pause");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800408 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
409 if (mp == NULL ) {
410 jniThrowException(env, "java/lang/IllegalStateException", NULL);
411 return;
412 }
413 process_media_player_call( env, thiz, mp->pause(), NULL, NULL );
414}
415
416static jboolean
417android_media_MediaPlayer_isPlaying(JNIEnv *env, jobject thiz)
418{
419 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
420 if (mp == NULL ) {
421 jniThrowException(env, "java/lang/IllegalStateException", NULL);
Ashok Bhat075e9a12014-01-06 13:45:09 +0000422 return JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800423 }
The Android Open Source Project4df24232009-03-05 14:34:35 -0800424 const jboolean is_playing = mp->isPlaying();
425
Steve Block71f2cf12011-10-20 11:56:00 +0100426 ALOGV("isPlaying: %d", is_playing);
The Android Open Source Project4df24232009-03-05 14:34:35 -0800427 return is_playing;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800428}
429
430static void
Wei Jia2d61e2b2015-05-08 15:23:28 -0700431android_media_MediaPlayer_setPlaybackParams(JNIEnv *env, jobject thiz, jobject params)
Wei Jiad93fcf42015-02-09 16:05:53 -0800432{
433 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
434 if (mp == NULL) {
435 jniThrowException(env, "java/lang/IllegalStateException", NULL);
436 return;
437 }
Lajos Molnarb3d5fd22015-04-22 13:14:34 -0700438
Wei Jia2d61e2b2015-05-08 15:23:28 -0700439 PlaybackParams pbp;
440 pbp.fillFromJobject(env, gPlaybackParamsFields, params);
441 ALOGV("setPlaybackParams: %d:%f %d:%f %d:%u %d:%u",
442 pbp.speedSet, pbp.audioRate.mSpeed,
443 pbp.pitchSet, pbp.audioRate.mPitch,
444 pbp.audioFallbackModeSet, pbp.audioRate.mFallbackMode,
445 pbp.audioStretchModeSet, pbp.audioRate.mStretchMode);
Lajos Molnarb3d5fd22015-04-22 13:14:34 -0700446
Lajos Molnar05ebffe2015-04-29 20:41:19 -0700447 AudioPlaybackRate rate;
448 status_t err = mp->getPlaybackSettings(&rate);
449 if (err == OK) {
450 bool updatedRate = false;
Wei Jia2d61e2b2015-05-08 15:23:28 -0700451 if (pbp.speedSet) {
452 rate.mSpeed = pbp.audioRate.mSpeed;
Lajos Molnar05ebffe2015-04-29 20:41:19 -0700453 updatedRate = true;
454 }
Wei Jia2d61e2b2015-05-08 15:23:28 -0700455 if (pbp.pitchSet) {
456 rate.mPitch = pbp.audioRate.mPitch;
Lajos Molnar05ebffe2015-04-29 20:41:19 -0700457 updatedRate = true;
458 }
Wei Jia2d61e2b2015-05-08 15:23:28 -0700459 if (pbp.audioFallbackModeSet) {
460 rate.mFallbackMode = pbp.audioRate.mFallbackMode;
Lajos Molnar05ebffe2015-04-29 20:41:19 -0700461 updatedRate = true;
462 }
Wei Jia2d61e2b2015-05-08 15:23:28 -0700463 if (pbp.audioStretchModeSet) {
464 rate.mStretchMode = pbp.audioRate.mStretchMode;
Lajos Molnar05ebffe2015-04-29 20:41:19 -0700465 updatedRate = true;
466 }
467 if (updatedRate) {
468 err = mp->setPlaybackSettings(rate);
469 }
470 }
471 process_media_player_call(
472 env, thiz, err,
473 "java/lang/IllegalStateException", "unexpected error");
Lajos Molnarb3d5fd22015-04-22 13:14:34 -0700474}
475
476static jobject
Wei Jia2d61e2b2015-05-08 15:23:28 -0700477android_media_MediaPlayer_getPlaybackParams(JNIEnv *env, jobject thiz)
Lajos Molnarb3d5fd22015-04-22 13:14:34 -0700478{
479 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
480 if (mp == NULL) {
481 jniThrowException(env, "java/lang/IllegalStateException", NULL);
482 return NULL;
483 }
484
Wei Jia2d61e2b2015-05-08 15:23:28 -0700485 PlaybackParams pbp;
486 AudioPlaybackRate &audioRate = pbp.audioRate;
Lajos Molnar05ebffe2015-04-29 20:41:19 -0700487 process_media_player_call(
488 env, thiz, mp->getPlaybackSettings(&audioRate),
489 "java/lang/IllegalStateException", "unexpected error");
Lajos Molnarb3d5fd22015-04-22 13:14:34 -0700490 ALOGV("getPlaybackSettings: %f %f %d %d",
491 audioRate.mSpeed, audioRate.mPitch, audioRate.mFallbackMode, audioRate.mStretchMode);
492
Wei Jia2d61e2b2015-05-08 15:23:28 -0700493 pbp.speedSet = true;
494 pbp.pitchSet = true;
495 pbp.audioFallbackModeSet = true;
496 pbp.audioStretchModeSet = true;
Lajos Molnarb3d5fd22015-04-22 13:14:34 -0700497
Wei Jia2d61e2b2015-05-08 15:23:28 -0700498 return pbp.asJobject(env, gPlaybackParamsFields);
Wei Jiad93fcf42015-02-09 16:05:53 -0800499}
500
501static void
Wei Jia2d61e2b2015-05-08 15:23:28 -0700502android_media_MediaPlayer_setSyncParams(JNIEnv *env, jobject thiz, jobject params)
Lajos Molnarc98f58e2015-04-22 19:28:53 -0700503{
504 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
505 if (mp == NULL) {
506 jniThrowException(env, "java/lang/IllegalStateException", NULL);
507 return;
508 }
509
Wei Jia2d61e2b2015-05-08 15:23:28 -0700510 SyncParams scp;
511 scp.fillFromJobject(env, gSyncParamsFields, params);
512 ALOGV("setSyncParams: %d:%d %d:%d %d:%f %d:%f",
513 scp.syncSourceSet, scp.sync.mSource,
514 scp.audioAdjustModeSet, scp.sync.mAudioAdjustMode,
515 scp.toleranceSet, scp.sync.mTolerance,
516 scp.frameRateSet, scp.frameRate);
Lajos Molnarc98f58e2015-04-22 19:28:53 -0700517
Lajos Molnar05ebffe2015-04-29 20:41:19 -0700518 AVSyncSettings avsync;
519 float videoFrameRate;
520 status_t err = mp->getSyncSettings(&avsync, &videoFrameRate);
521 if (err == OK) {
Wei Jia2d61e2b2015-05-08 15:23:28 -0700522 bool updatedSync = scp.frameRateSet;
523 if (scp.syncSourceSet) {
524 avsync.mSource = scp.sync.mSource;
Lajos Molnar05ebffe2015-04-29 20:41:19 -0700525 updatedSync = true;
526 }
Wei Jia2d61e2b2015-05-08 15:23:28 -0700527 if (scp.audioAdjustModeSet) {
528 avsync.mAudioAdjustMode = scp.sync.mAudioAdjustMode;
Lajos Molnar05ebffe2015-04-29 20:41:19 -0700529 updatedSync = true;
530 }
Wei Jia2d61e2b2015-05-08 15:23:28 -0700531 if (scp.toleranceSet) {
532 avsync.mTolerance = scp.sync.mTolerance;
Lajos Molnar05ebffe2015-04-29 20:41:19 -0700533 updatedSync = true;
534 }
535 if (updatedSync) {
Wei Jia2d61e2b2015-05-08 15:23:28 -0700536 err = mp->setSyncSettings(avsync, scp.frameRateSet ? scp.frameRate : -1.f);
Lajos Molnar05ebffe2015-04-29 20:41:19 -0700537 }
538 }
539 process_media_player_call(
540 env, thiz, err,
541 "java/lang/IllegalStateException", "unexpected error");
Lajos Molnarc98f58e2015-04-22 19:28:53 -0700542}
543
544static jobject
Wei Jia2d61e2b2015-05-08 15:23:28 -0700545android_media_MediaPlayer_getSyncParams(JNIEnv *env, jobject thiz)
Lajos Molnarc98f58e2015-04-22 19:28:53 -0700546{
547 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
548 if (mp == NULL) {
549 jniThrowException(env, "java/lang/IllegalStateException", NULL);
550 return NULL;
551 }
552
Wei Jia2d61e2b2015-05-08 15:23:28 -0700553 SyncParams scp;
554 scp.frameRate = -1.f;
Lajos Molnar05ebffe2015-04-29 20:41:19 -0700555 process_media_player_call(
Wei Jia2d61e2b2015-05-08 15:23:28 -0700556 env, thiz, mp->getSyncSettings(&scp.sync, &scp.frameRate),
Lajos Molnar05ebffe2015-04-29 20:41:19 -0700557 "java/lang/IllegalStateException", "unexpected error");
Lajos Molnarc98f58e2015-04-22 19:28:53 -0700558
Lajos Molnarc98f58e2015-04-22 19:28:53 -0700559 ALOGV("getSyncSettings: %d %d %f %f",
Wei Jia2d61e2b2015-05-08 15:23:28 -0700560 scp.sync.mSource, scp.sync.mAudioAdjustMode, scp.sync.mTolerance, scp.frameRate);
Lajos Molnar05ebffe2015-04-29 20:41:19 -0700561
Wei Jia2d61e2b2015-05-08 15:23:28 -0700562 // sanity check params
563 if (scp.sync.mSource >= AVSYNC_SOURCE_MAX
564 || scp.sync.mAudioAdjustMode >= AVSYNC_AUDIO_ADJUST_MODE_MAX
565 || scp.sync.mTolerance < 0.f
566 || scp.sync.mTolerance >= AVSYNC_TOLERANCE_MAX) {
Lajos Molnar05ebffe2015-04-29 20:41:19 -0700567 jniThrowException(env, "java/lang/IllegalStateException", NULL);
568 return NULL;
569 }
Lajos Molnarc98f58e2015-04-22 19:28:53 -0700570
Wei Jia2d61e2b2015-05-08 15:23:28 -0700571 scp.syncSourceSet = true;
572 scp.audioAdjustModeSet = true;
573 scp.toleranceSet = true;
574 scp.frameRateSet = scp.frameRate >= 0.f;
Lajos Molnarc98f58e2015-04-22 19:28:53 -0700575
Wei Jia2d61e2b2015-05-08 15:23:28 -0700576 return scp.asJobject(env, gSyncParamsFields);
Lajos Molnarc98f58e2015-04-22 19:28:53 -0700577}
578
579static void
Ashok Bhat075e9a12014-01-06 13:45:09 +0000580android_media_MediaPlayer_seekTo(JNIEnv *env, jobject thiz, jint msec)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800581{
582 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
583 if (mp == NULL ) {
584 jniThrowException(env, "java/lang/IllegalStateException", NULL);
585 return;
586 }
Steve Block71f2cf12011-10-20 11:56:00 +0100587 ALOGV("seekTo: %d(msec)", msec);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800588 process_media_player_call( env, thiz, mp->seekTo(msec), NULL, NULL );
589}
590
Ashok Bhat075e9a12014-01-06 13:45:09 +0000591static jint
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800592android_media_MediaPlayer_getVideoWidth(JNIEnv *env, jobject thiz)
593{
594 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
595 if (mp == NULL ) {
596 jniThrowException(env, "java/lang/IllegalStateException", NULL);
597 return 0;
598 }
599 int w;
The Android Open Source Project4df24232009-03-05 14:34:35 -0800600 if (0 != mp->getVideoWidth(&w)) {
Steve Block3762c312012-01-06 19:20:56 +0000601 ALOGE("getVideoWidth failed");
The Android Open Source Project4df24232009-03-05 14:34:35 -0800602 w = 0;
603 }
Steve Block71f2cf12011-10-20 11:56:00 +0100604 ALOGV("getVideoWidth: %d", w);
Ashok Bhat075e9a12014-01-06 13:45:09 +0000605 return (jint) w;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800606}
607
Ashok Bhat075e9a12014-01-06 13:45:09 +0000608static jint
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800609android_media_MediaPlayer_getVideoHeight(JNIEnv *env, jobject thiz)
610{
611 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
612 if (mp == NULL ) {
613 jniThrowException(env, "java/lang/IllegalStateException", NULL);
614 return 0;
615 }
616 int h;
The Android Open Source Project4df24232009-03-05 14:34:35 -0800617 if (0 != mp->getVideoHeight(&h)) {
Steve Block3762c312012-01-06 19:20:56 +0000618 ALOGE("getVideoHeight failed");
The Android Open Source Project4df24232009-03-05 14:34:35 -0800619 h = 0;
620 }
Steve Block71f2cf12011-10-20 11:56:00 +0100621 ALOGV("getVideoHeight: %d", h);
Ashok Bhat075e9a12014-01-06 13:45:09 +0000622 return (jint) h;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800623}
624
625
Ashok Bhat075e9a12014-01-06 13:45:09 +0000626static jint
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800627android_media_MediaPlayer_getCurrentPosition(JNIEnv *env, jobject thiz)
628{
629 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
630 if (mp == NULL ) {
631 jniThrowException(env, "java/lang/IllegalStateException", NULL);
632 return 0;
633 }
634 int msec;
635 process_media_player_call( env, thiz, mp->getCurrentPosition(&msec), NULL, NULL );
Steve Block71f2cf12011-10-20 11:56:00 +0100636 ALOGV("getCurrentPosition: %d (msec)", msec);
Ashok Bhat075e9a12014-01-06 13:45:09 +0000637 return (jint) msec;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800638}
639
Ashok Bhat075e9a12014-01-06 13:45:09 +0000640static jint
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800641android_media_MediaPlayer_getDuration(JNIEnv *env, jobject thiz)
642{
643 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
644 if (mp == NULL ) {
645 jniThrowException(env, "java/lang/IllegalStateException", NULL);
646 return 0;
647 }
648 int msec;
649 process_media_player_call( env, thiz, mp->getDuration(&msec), NULL, NULL );
Steve Block71f2cf12011-10-20 11:56:00 +0100650 ALOGV("getDuration: %d (msec)", msec);
Ashok Bhat075e9a12014-01-06 13:45:09 +0000651 return (jint) msec;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800652}
653
654static void
655android_media_MediaPlayer_reset(JNIEnv *env, jobject thiz)
656{
Steve Block71f2cf12011-10-20 11:56:00 +0100657 ALOGV("reset");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800658 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
659 if (mp == NULL ) {
660 jniThrowException(env, "java/lang/IllegalStateException", NULL);
661 return;
662 }
663 process_media_player_call( env, thiz, mp->reset(), NULL, NULL );
664}
665
666static void
Ashok Bhat075e9a12014-01-06 13:45:09 +0000667android_media_MediaPlayer_setAudioStreamType(JNIEnv *env, jobject thiz, jint streamtype)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800668{
Steve Block71f2cf12011-10-20 11:56:00 +0100669 ALOGV("setAudioStreamType: %d", streamtype);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800670 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
671 if (mp == NULL ) {
672 jniThrowException(env, "java/lang/IllegalStateException", NULL);
673 return;
674 }
Glenn Kastenbc1d77b2012-01-12 16:38:12 -0800675 process_media_player_call( env, thiz, mp->setAudioStreamType((audio_stream_type_t) streamtype) , NULL, NULL );
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800676}
677
John Spurlock1af30c72014-03-10 08:33:35 -0400678static jint
679android_media_MediaPlayer_getAudioStreamType(JNIEnv *env, jobject thiz)
680{
681 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
682 if (mp == NULL ) {
683 jniThrowException(env, "java/lang/IllegalStateException", NULL);
684 return 0;
685 }
686 audio_stream_type_t streamtype;
687 process_media_player_call( env, thiz, mp->getAudioStreamType(&streamtype), NULL, NULL );
688 ALOGV("getAudioStreamType: %d (streamtype)", streamtype);
689 return (jint) streamtype;
690}
691
Jean-Michel Trivi8df982d2014-06-26 12:05:16 -0700692static jboolean
693android_media_MediaPlayer_setParameter(JNIEnv *env, jobject thiz, jint key, jobject java_request)
694{
695 ALOGV("setParameter: key %d", key);
696 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
697 if (mp == NULL ) {
698 jniThrowException(env, "java/lang/IllegalStateException", NULL);
699 return false;
700 }
701
702 Parcel *request = parcelForJavaObject(env, java_request);
703 status_t err = mp->setParameter(key, *request);
704 if (err == OK) {
705 return true;
706 } else {
707 return false;
708 }
709}
710
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800711static void
712android_media_MediaPlayer_setLooping(JNIEnv *env, jobject thiz, jboolean looping)
713{
Steve Block71f2cf12011-10-20 11:56:00 +0100714 ALOGV("setLooping: %d", looping);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800715 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
716 if (mp == NULL ) {
717 jniThrowException(env, "java/lang/IllegalStateException", NULL);
718 return;
719 }
720 process_media_player_call( env, thiz, mp->setLooping(looping), NULL, NULL );
721}
722
723static jboolean
724android_media_MediaPlayer_isLooping(JNIEnv *env, jobject thiz)
725{
Steve Block71f2cf12011-10-20 11:56:00 +0100726 ALOGV("isLooping");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800727 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
728 if (mp == NULL ) {
729 jniThrowException(env, "java/lang/IllegalStateException", NULL);
Ashok Bhat075e9a12014-01-06 13:45:09 +0000730 return JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800731 }
Ashok Bhat075e9a12014-01-06 13:45:09 +0000732 return mp->isLooping() ? JNI_TRUE : JNI_FALSE;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800733}
734
735static void
Ashok Bhat075e9a12014-01-06 13:45:09 +0000736android_media_MediaPlayer_setVolume(JNIEnv *env, jobject thiz, jfloat leftVolume, jfloat rightVolume)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800737{
Ashok Bhat075e9a12014-01-06 13:45:09 +0000738 ALOGV("setVolume: left %f right %f", (float) leftVolume, (float) rightVolume);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800739 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
740 if (mp == NULL ) {
741 jniThrowException(env, "java/lang/IllegalStateException", NULL);
742 return;
743 }
Ashok Bhat075e9a12014-01-06 13:45:09 +0000744 process_media_player_call( env, thiz, mp->setVolume((float) leftVolume, (float) rightVolume), NULL, NULL );
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800745}
746
Nicolas Catania20cb94e2009-05-12 23:25:55 -0700747// Sends the request and reply parcels to the media player via the
748// binder interface.
749static jint
750android_media_MediaPlayer_invoke(JNIEnv *env, jobject thiz,
751 jobject java_request, jobject java_reply)
752{
753 sp<MediaPlayer> media_player = getMediaPlayer(env, thiz);
754 if (media_player == NULL ) {
755 jniThrowException(env, "java/lang/IllegalStateException", NULL);
Nicolas Cataniab2c69392009-07-08 08:57:42 -0700756 return UNKNOWN_ERROR;
Nicolas Catania20cb94e2009-05-12 23:25:55 -0700757 }
758
Nicolas Catania20cb94e2009-05-12 23:25:55 -0700759 Parcel *request = parcelForJavaObject(env, java_request);
760 Parcel *reply = parcelForJavaObject(env, java_reply);
761
Nicolas Catania20cb94e2009-05-12 23:25:55 -0700762 // Don't use process_media_player_call which use the async loop to
763 // report errors, instead returns the status.
Ashok Bhat075e9a12014-01-06 13:45:09 +0000764 return (jint) media_player->invoke(*request, reply);
Nicolas Catania20cb94e2009-05-12 23:25:55 -0700765}
766
Nicolas Cataniab2c69392009-07-08 08:57:42 -0700767// Sends the new filter to the client.
768static jint
769android_media_MediaPlayer_setMetadataFilter(JNIEnv *env, jobject thiz, jobject request)
770{
771 sp<MediaPlayer> media_player = getMediaPlayer(env, thiz);
772 if (media_player == NULL ) {
773 jniThrowException(env, "java/lang/IllegalStateException", NULL);
774 return UNKNOWN_ERROR;
775 }
776
777 Parcel *filter = parcelForJavaObject(env, request);
778
Nicolas Catania5d55c712009-07-09 09:21:33 -0700779 if (filter == NULL ) {
780 jniThrowException(env, "java/lang/RuntimeException", "Filter is null");
781 return UNKNOWN_ERROR;
782 }
783
Ashok Bhat075e9a12014-01-06 13:45:09 +0000784 return (jint) media_player->setMetadataFilter(*filter);
Nicolas Cataniab2c69392009-07-08 08:57:42 -0700785}
786
Nicolas Catania5d55c712009-07-09 09:21:33 -0700787static jboolean
788android_media_MediaPlayer_getMetadata(JNIEnv *env, jobject thiz, jboolean update_only,
789 jboolean apply_filter, jobject reply)
790{
791 sp<MediaPlayer> media_player = getMediaPlayer(env, thiz);
792 if (media_player == NULL ) {
793 jniThrowException(env, "java/lang/IllegalStateException", NULL);
Ashok Bhat075e9a12014-01-06 13:45:09 +0000794 return JNI_FALSE;
Nicolas Catania5d55c712009-07-09 09:21:33 -0700795 }
796
797 Parcel *metadata = parcelForJavaObject(env, reply);
798
799 if (metadata == NULL ) {
800 jniThrowException(env, "java/lang/RuntimeException", "Reply parcel is null");
Ashok Bhat075e9a12014-01-06 13:45:09 +0000801 return JNI_FALSE;
Nicolas Catania5d55c712009-07-09 09:21:33 -0700802 }
803
804 metadata->freeData();
805 // On return metadata is positioned at the beginning of the
806 // metadata. Note however that the parcel actually starts with the
807 // return code so you should not rewind the parcel using
808 // setDataPosition(0).
Ashok Bhat075e9a12014-01-06 13:45:09 +0000809 if (media_player->getMetadata(update_only, apply_filter, metadata) == OK) {
810 return JNI_TRUE;
811 } else {
812 return JNI_FALSE;
813 }
Nicolas Catania5d55c712009-07-09 09:21:33 -0700814}
815
Marco Nelissen4935d052009-08-03 11:12:58 -0700816// This function gets some field IDs, which in turn causes class initialization.
817// It is called from a static block in MediaPlayer, which won't run until the
818// first time an instance of this class is used.
819static void
820android_media_MediaPlayer_native_init(JNIEnv *env)
821{
822 jclass clazz;
823
824 clazz = env->FindClass("android/media/MediaPlayer");
825 if (clazz == NULL) {
Marco Nelissen4935d052009-08-03 11:12:58 -0700826 return;
827 }
828
Ashok Bhat075e9a12014-01-06 13:45:09 +0000829 fields.context = env->GetFieldID(clazz, "mNativeContext", "J");
Marco Nelissen4935d052009-08-03 11:12:58 -0700830 if (fields.context == NULL) {
Marco Nelissen4935d052009-08-03 11:12:58 -0700831 return;
832 }
833
834 fields.post_event = env->GetStaticMethodID(clazz, "postEventFromNative",
835 "(Ljava/lang/Object;IIILjava/lang/Object;)V");
836 if (fields.post_event == NULL) {
Marco Nelissen4935d052009-08-03 11:12:58 -0700837 return;
838 }
839
Ashok Bhat075e9a12014-01-06 13:45:09 +0000840 fields.surface_texture = env->GetFieldID(clazz, "mNativeSurfaceTexture", "J");
Ted Bonkenburg1ee60112011-07-26 09:51:18 -0700841 if (fields.surface_texture == NULL) {
Glenn Kastencc562a32011-02-08 17:26:17 -0800842 return;
843 }
Andreas Huberd5f9fa52013-05-28 14:39:39 -0700844
Lajos Molnarb3d5fd22015-04-22 13:14:34 -0700845 env->DeleteLocalRef(clazz);
846
Selim Gurun5ba69be2014-05-07 15:04:40 -0700847 clazz = env->FindClass("android/net/ProxyInfo");
Andreas Huberd5f9fa52013-05-28 14:39:39 -0700848 if (clazz == NULL) {
849 return;
850 }
851
852 fields.proxyConfigGetHost =
853 env->GetMethodID(clazz, "getHost", "()Ljava/lang/String;");
854
855 fields.proxyConfigGetPort =
856 env->GetMethodID(clazz, "getPort", "()I");
857
858 fields.proxyConfigGetExclusionList =
Selim Gurun5ba69be2014-05-07 15:04:40 -0700859 env->GetMethodID(clazz, "getExclusionListAsString", "()Ljava/lang/String;");
Lajos Molnarb3d5fd22015-04-22 13:14:34 -0700860
861 env->DeleteLocalRef(clazz);
862
Wei Jia2d61e2b2015-05-08 15:23:28 -0700863 gPlaybackParamsFields.init(env);
864 gSyncParamsFields.init(env);
Marco Nelissen4935d052009-08-03 11:12:58 -0700865}
Nicolas Cataniab2c69392009-07-08 08:57:42 -0700866
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800867static void
868android_media_MediaPlayer_native_setup(JNIEnv *env, jobject thiz, jobject weak_this)
869{
Steve Block71f2cf12011-10-20 11:56:00 +0100870 ALOGV("native_setup");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800871 sp<MediaPlayer> mp = new MediaPlayer();
872 if (mp == NULL) {
873 jniThrowException(env, "java/lang/RuntimeException", "Out of memory");
874 return;
875 }
876
877 // create new listener and give it to MediaPlayer
878 sp<JNIMediaPlayerListener> listener = new JNIMediaPlayerListener(env, thiz, weak_this);
879 mp->setListener(listener);
880
881 // Stow our new C++ MediaPlayer in an opaque field in the Java object.
882 setMediaPlayer(env, thiz, mp);
883}
884
885static void
886android_media_MediaPlayer_release(JNIEnv *env, jobject thiz)
887{
Steve Block71f2cf12011-10-20 11:56:00 +0100888 ALOGV("release");
Gloria Wangd59310d2011-09-14 13:59:45 -0700889 decVideoSurfaceRef(env, thiz);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800890 sp<MediaPlayer> mp = setMediaPlayer(env, thiz, 0);
891 if (mp != NULL) {
892 // this prevents native callbacks after the object is released
893 mp->setListener(0);
894 mp->disconnect();
895 }
896}
897
898static void
899android_media_MediaPlayer_native_finalize(JNIEnv *env, jobject thiz)
900{
Steve Block71f2cf12011-10-20 11:56:00 +0100901 ALOGV("native_finalize");
Marco Nelissen8dc20842011-09-28 09:21:11 -0700902 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
903 if (mp != NULL) {
Steve Block8564c8d2012-01-05 23:22:43 +0000904 ALOGW("MediaPlayer finalized without being released");
Marco Nelissen8dc20842011-09-28 09:21:11 -0700905 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800906 android_media_MediaPlayer_release(env, thiz);
907}
908
Glenn Kasten33b84042016-03-08 12:02:55 -0800909static void android_media_MediaPlayer_set_audio_session_id(JNIEnv *env, jobject thiz,
910 jint sessionId) {
Steve Block71f2cf12011-10-20 11:56:00 +0100911 ALOGV("set_session_id(): %d", sessionId);
Eric Laurent619346f2010-06-21 09:27:30 -0700912 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
913 if (mp == NULL ) {
914 jniThrowException(env, "java/lang/IllegalStateException", NULL);
915 return;
916 }
Glenn Kasten33b84042016-03-08 12:02:55 -0800917 process_media_player_call( env, thiz, mp->setAudioSessionId((audio_session_t) sessionId), NULL,
918 NULL);
Eric Laurent619346f2010-06-21 09:27:30 -0700919}
920
921static jint android_media_MediaPlayer_get_audio_session_id(JNIEnv *env, jobject thiz) {
Steve Block71f2cf12011-10-20 11:56:00 +0100922 ALOGV("get_session_id()");
Eric Laurent619346f2010-06-21 09:27:30 -0700923 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
924 if (mp == NULL ) {
925 jniThrowException(env, "java/lang/IllegalStateException", NULL);
926 return 0;
927 }
928
Ashok Bhat075e9a12014-01-06 13:45:09 +0000929 return (jint) mp->getAudioSessionId();
Eric Laurent619346f2010-06-21 09:27:30 -0700930}
931
Eric Laurent7070b362010-07-16 07:43:46 -0700932static void
933android_media_MediaPlayer_setAuxEffectSendLevel(JNIEnv *env, jobject thiz, jfloat level)
934{
Steve Block71f2cf12011-10-20 11:56:00 +0100935 ALOGV("setAuxEffectSendLevel: level %f", level);
Eric Laurent7070b362010-07-16 07:43:46 -0700936 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
937 if (mp == NULL ) {
938 jniThrowException(env, "java/lang/IllegalStateException", NULL);
939 return;
940 }
941 process_media_player_call( env, thiz, mp->setAuxEffectSendLevel(level), NULL, NULL );
942}
943
944static void android_media_MediaPlayer_attachAuxEffect(JNIEnv *env, jobject thiz, jint effectId) {
Steve Block71f2cf12011-10-20 11:56:00 +0100945 ALOGV("attachAuxEffect(): %d", effectId);
Eric Laurent7070b362010-07-16 07:43:46 -0700946 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
947 if (mp == NULL ) {
948 jniThrowException(env, "java/lang/IllegalStateException", NULL);
949 return;
950 }
951 process_media_player_call( env, thiz, mp->attachAuxEffect(effectId), NULL, NULL );
952}
953
Gloria Wangd211f412011-02-19 18:37:57 -0800954static jint
Andreas Huberd2506a52014-01-29 10:32:46 -0800955android_media_MediaPlayer_pullBatteryData(
956 JNIEnv *env, jobject /* thiz */, jobject java_reply)
Gloria Wangd211f412011-02-19 18:37:57 -0800957{
958 sp<IBinder> binder = defaultServiceManager()->getService(String16("media.player"));
959 sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder);
960 if (service.get() == NULL) {
961 jniThrowException(env, "java/lang/RuntimeException", "cannot get MediaPlayerService");
962 return UNKNOWN_ERROR;
963 }
964
965 Parcel *reply = parcelForJavaObject(env, java_reply);
966
Ashok Bhat075e9a12014-01-06 13:45:09 +0000967 return (jint) service->pullBatteryData(reply);
Gloria Wangd211f412011-02-19 18:37:57 -0800968}
969
John Grossman720aa282012-02-22 15:38:35 -0800970static jint
971android_media_MediaPlayer_setRetransmitEndpoint(JNIEnv *env, jobject thiz,
972 jstring addrString, jint port) {
973 sp<MediaPlayer> mp = getMediaPlayer(env, thiz);
974 if (mp == NULL ) {
975 jniThrowException(env, "java/lang/IllegalStateException", NULL);
976 return INVALID_OPERATION;
977 }
978
979 const char *cAddrString = NULL;
980
981 if (NULL != addrString) {
982 cAddrString = env->GetStringUTFChars(addrString, NULL);
983 if (cAddrString == NULL) { // Out of memory
984 return NO_MEMORY;
985 }
986 }
987 ALOGV("setRetransmitEndpoint: %s:%d",
988 cAddrString ? cAddrString : "(null)", port);
989
990 status_t ret;
991 if (cAddrString && (port > 0xFFFF)) {
992 ret = BAD_VALUE;
993 } else {
994 ret = mp->setRetransmitEndpoint(cAddrString,
995 static_cast<uint16_t>(port));
996 }
997
998 if (NULL != addrString) {
999 env->ReleaseStringUTFChars(addrString, cAddrString);
1000 }
1001
1002 if (ret == INVALID_OPERATION ) {
1003 jniThrowException(env, "java/lang/IllegalStateException", NULL);
1004 }
1005
Ashok Bhat075e9a12014-01-06 13:45:09 +00001006 return (jint) ret;
John Grossman720aa282012-02-22 15:38:35 -08001007}
1008
Marco Nelissen84b83202012-02-28 16:07:44 -08001009static void
1010android_media_MediaPlayer_setNextMediaPlayer(JNIEnv *env, jobject thiz, jobject java_player)
1011{
1012 ALOGV("setNextMediaPlayer");
1013 sp<MediaPlayer> thisplayer = getMediaPlayer(env, thiz);
1014 if (thisplayer == NULL) {
1015 jniThrowException(env, "java/lang/IllegalStateException", "This player not initialized");
1016 return;
1017 }
1018 sp<MediaPlayer> nextplayer = (java_player == NULL) ? NULL : getMediaPlayer(env, java_player);
1019 if (nextplayer == NULL && java_player != NULL) {
1020 jniThrowException(env, "java/lang/IllegalStateException", "That player not initialized");
1021 return;
1022 }
1023
1024 if (nextplayer == thisplayer) {
1025 jniThrowException(env, "java/lang/IllegalArgumentException", "Next player can't be self");
1026 return;
1027 }
1028 // tie the two players together
1029 process_media_player_call(
1030 env, thiz, thisplayer->setNextMediaPlayer(nextplayer),
1031 "java/lang/IllegalArgumentException",
1032 "setNextMediaPlayer failed." );
1033 ;
1034}
1035
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001036// ----------------------------------------------------------------------------
1037
Daniel Micay76f6a862015-09-19 17:31:01 -04001038static const JNINativeMethod gMethods[] = {
James Dong17524dc2011-05-04 13:41:58 -07001039 {
Andreas Huberd2506a52014-01-29 10:32:46 -08001040 "nativeSetDataSource",
1041 "(Landroid/os/IBinder;Ljava/lang/String;[Ljava/lang/String;"
1042 "[Ljava/lang/String;)V",
James Dong17524dc2011-05-04 13:41:58 -07001043 (void *)android_media_MediaPlayer_setDataSourceAndHeaders
1044 },
1045
Chris Watkins4eaa2932015-03-20 10:31:42 -07001046 {"_setDataSource", "(Ljava/io/FileDescriptor;JJ)V", (void *)android_media_MediaPlayer_setDataSourceFD},
1047 {"_setDataSource", "(Landroid/media/MediaDataSource;)V",(void *)android_media_MediaPlayer_setDataSourceCallback },
Ted Bonkenburg1ee60112011-07-26 09:51:18 -07001048 {"_setVideoSurface", "(Landroid/view/Surface;)V", (void *)android_media_MediaPlayer_setVideoSurface},
Robert Shihc42a96d2014-07-25 11:08:50 -07001049 {"_prepare", "()V", (void *)android_media_MediaPlayer_prepare},
Robert Shih07830aa2015-05-27 18:11:44 -07001050 {"prepareAsync", "()V", (void *)android_media_MediaPlayer_prepareAsync},
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001051 {"_start", "()V", (void *)android_media_MediaPlayer_start},
1052 {"_stop", "()V", (void *)android_media_MediaPlayer_stop},
1053 {"getVideoWidth", "()I", (void *)android_media_MediaPlayer_getVideoWidth},
1054 {"getVideoHeight", "()I", (void *)android_media_MediaPlayer_getVideoHeight},
Wei Jia2d61e2b2015-05-08 15:23:28 -07001055 {"setPlaybackParams", "(Landroid/media/PlaybackParams;)V", (void *)android_media_MediaPlayer_setPlaybackParams},
1056 {"getPlaybackParams", "()Landroid/media/PlaybackParams;", (void *)android_media_MediaPlayer_getPlaybackParams},
1057 {"setSyncParams", "(Landroid/media/SyncParams;)V", (void *)android_media_MediaPlayer_setSyncParams},
1058 {"getSyncParams", "()Landroid/media/SyncParams;", (void *)android_media_MediaPlayer_getSyncParams},
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001059 {"seekTo", "(I)V", (void *)android_media_MediaPlayer_seekTo},
1060 {"_pause", "()V", (void *)android_media_MediaPlayer_pause},
1061 {"isPlaying", "()Z", (void *)android_media_MediaPlayer_isPlaying},
1062 {"getCurrentPosition", "()I", (void *)android_media_MediaPlayer_getCurrentPosition},
1063 {"getDuration", "()I", (void *)android_media_MediaPlayer_getDuration},
1064 {"_release", "()V", (void *)android_media_MediaPlayer_release},
1065 {"_reset", "()V", (void *)android_media_MediaPlayer_reset},
John Spurlock1af30c72014-03-10 08:33:35 -04001066 {"_setAudioStreamType", "(I)V", (void *)android_media_MediaPlayer_setAudioStreamType},
1067 {"_getAudioStreamType", "()I", (void *)android_media_MediaPlayer_getAudioStreamType},
Jean-Michel Trivi8df982d2014-06-26 12:05:16 -07001068 {"setParameter", "(ILandroid/os/Parcel;)Z", (void *)android_media_MediaPlayer_setParameter},
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001069 {"setLooping", "(Z)V", (void *)android_media_MediaPlayer_setLooping},
1070 {"isLooping", "()Z", (void *)android_media_MediaPlayer_isLooping},
John Spurlock1af30c72014-03-10 08:33:35 -04001071 {"_setVolume", "(FF)V", (void *)android_media_MediaPlayer_setVolume},
Nicolas Catania20cb94e2009-05-12 23:25:55 -07001072 {"native_invoke", "(Landroid/os/Parcel;Landroid/os/Parcel;)I",(void *)android_media_MediaPlayer_invoke},
Nicolas Cataniab2c69392009-07-08 08:57:42 -07001073 {"native_setMetadataFilter", "(Landroid/os/Parcel;)I", (void *)android_media_MediaPlayer_setMetadataFilter},
Nicolas Catania5d55c712009-07-09 09:21:33 -07001074 {"native_getMetadata", "(ZZLandroid/os/Parcel;)Z", (void *)android_media_MediaPlayer_getMetadata},
Marco Nelissen4935d052009-08-03 11:12:58 -07001075 {"native_init", "()V", (void *)android_media_MediaPlayer_native_init},
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001076 {"native_setup", "(Ljava/lang/Object;)V", (void *)android_media_MediaPlayer_native_setup},
1077 {"native_finalize", "()V", (void *)android_media_MediaPlayer_native_finalize},
Eric Laurent619346f2010-06-21 09:27:30 -07001078 {"getAudioSessionId", "()I", (void *)android_media_MediaPlayer_get_audio_session_id},
1079 {"setAudioSessionId", "(I)V", (void *)android_media_MediaPlayer_set_audio_session_id},
John Spurlock1af30c72014-03-10 08:33:35 -04001080 {"_setAuxEffectSendLevel", "(F)V", (void *)android_media_MediaPlayer_setAuxEffectSendLevel},
Eric Laurent7070b362010-07-16 07:43:46 -07001081 {"attachAuxEffect", "(I)V", (void *)android_media_MediaPlayer_attachAuxEffect},
Gloria Wangd211f412011-02-19 18:37:57 -08001082 {"native_pullBatteryData", "(Landroid/os/Parcel;)I", (void *)android_media_MediaPlayer_pullBatteryData},
John Grossman720aa282012-02-22 15:38:35 -08001083 {"native_setRetransmitEndpoint", "(Ljava/lang/String;I)I", (void *)android_media_MediaPlayer_setRetransmitEndpoint},
Marco Nelissen84b83202012-02-28 16:07:44 -08001084 {"setNextMediaPlayer", "(Landroid/media/MediaPlayer;)V", (void *)android_media_MediaPlayer_setNextMediaPlayer},
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001085};
1086
Marco Nelissen4935d052009-08-03 11:12:58 -07001087// This function only registers the native methods
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001088static int register_android_media_MediaPlayer(JNIEnv *env)
1089{
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001090 return AndroidRuntime::registerNativeMethods(env,
1091 "android/media/MediaPlayer", gMethods, NELEM(gMethods));
1092}
Jaesung Chungfe968df2016-01-15 14:21:11 +09001093extern int register_android_media_ExifInterface(JNIEnv *env);
Zhijun He212e78d2013-06-07 11:36:23 -07001094extern int register_android_media_ImageReader(JNIEnv *env);
Zhijun Hef6a09e52015-02-24 18:12:23 -08001095extern int register_android_media_ImageWriter(JNIEnv *env);
Andreas Huber8240d922012-04-04 14:06:32 -07001096extern int register_android_media_Crypto(JNIEnv *env);
Jeff Tinker8a0c80f2013-02-08 10:20:44 -08001097extern int register_android_media_Drm(JNIEnv *env);
Andreas Huber88572f72012-02-21 11:47:18 -08001098extern int register_android_media_MediaCodec(JNIEnv *env);
1099extern int register_android_media_MediaExtractor(JNIEnv *env);
Andreas Huber5a04bf32012-03-29 16:41:38 -07001100extern int register_android_media_MediaCodecList(JNIEnv *env);
Andreas Huberd2506a52014-01-29 10:32:46 -08001101extern int register_android_media_MediaHTTPConnection(JNIEnv *env);
Andreas Huberbfb9fb12009-12-03 11:31:19 -08001102extern int register_android_media_MediaMetadataRetriever(JNIEnv *env);
ztenghui68ccf102013-02-13 14:07:02 -08001103extern int register_android_media_MediaMuxer(JNIEnv *env);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001104extern int register_android_media_MediaRecorder(JNIEnv *env);
1105extern int register_android_media_MediaScanner(JNIEnv *env);
Wei Jia071a8b72015-03-09 16:38:25 -07001106extern int register_android_media_MediaSync(JNIEnv *env);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001107extern int register_android_media_ResampleInputStream(JNIEnv *env);
James Dongc3711942010-01-19 17:45:38 -08001108extern int register_android_media_MediaProfiles(JNIEnv *env);
Mike Lockwood0cd01362010-12-30 11:54:33 -05001109extern int register_android_mtp_MtpDatabase(JNIEnv *env);
Mike Lockwood8182e722010-12-30 15:38:45 -05001110extern int register_android_mtp_MtpDevice(JNIEnv *env);
Mike Lockwood0cd01362010-12-30 11:54:33 -05001111extern int register_android_mtp_MtpServer(JNIEnv *env);
Andreas Huberbfb9fb12009-12-03 11:31:19 -08001112
Andreas Huberd2506a52014-01-29 10:32:46 -08001113jint JNI_OnLoad(JavaVM* vm, void* /* reserved */)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001114{
1115 JNIEnv* env = NULL;
1116 jint result = -1;
1117
1118 if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
Steve Block3762c312012-01-06 19:20:56 +00001119 ALOGE("ERROR: GetEnv failed\n");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001120 goto bail;
1121 }
1122 assert(env != NULL);
1123
Zhijun Hef6a09e52015-02-24 18:12:23 -08001124 if (register_android_media_ImageWriter(env) != JNI_OK) {
1125 ALOGE("ERROR: ImageWriter native registration failed");
1126 goto bail;
1127 }
1128
Zhijun He212e78d2013-06-07 11:36:23 -07001129 if (register_android_media_ImageReader(env) < 0) {
1130 ALOGE("ERROR: ImageReader native registration failed");
1131 goto bail;
1132 }
1133
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001134 if (register_android_media_MediaPlayer(env) < 0) {
Steve Block3762c312012-01-06 19:20:56 +00001135 ALOGE("ERROR: MediaPlayer native registration failed\n");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001136 goto bail;
1137 }
1138
1139 if (register_android_media_MediaRecorder(env) < 0) {
Steve Block3762c312012-01-06 19:20:56 +00001140 ALOGE("ERROR: MediaRecorder native registration failed\n");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001141 goto bail;
1142 }
1143
1144 if (register_android_media_MediaScanner(env) < 0) {
Steve Block3762c312012-01-06 19:20:56 +00001145 ALOGE("ERROR: MediaScanner native registration failed\n");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001146 goto bail;
1147 }
1148
1149 if (register_android_media_MediaMetadataRetriever(env) < 0) {
Steve Block3762c312012-01-06 19:20:56 +00001150 ALOGE("ERROR: MediaMetadataRetriever native registration failed\n");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001151 goto bail;
1152 }
1153
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001154 if (register_android_media_ResampleInputStream(env) < 0) {
Steve Block3762c312012-01-06 19:20:56 +00001155 ALOGE("ERROR: ResampleInputStream native registration failed\n");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001156 goto bail;
1157 }
1158
James Dongc3711942010-01-19 17:45:38 -08001159 if (register_android_media_MediaProfiles(env) < 0) {
Steve Block3762c312012-01-06 19:20:56 +00001160 ALOGE("ERROR: MediaProfiles native registration failed");
James Dongc3711942010-01-19 17:45:38 -08001161 goto bail;
1162 }
1163
Mike Lockwood0cd01362010-12-30 11:54:33 -05001164 if (register_android_mtp_MtpDatabase(env) < 0) {
Steve Block3762c312012-01-06 19:20:56 +00001165 ALOGE("ERROR: MtpDatabase native registration failed");
Mike Lockwoodd21eac92010-07-03 00:44:05 -04001166 goto bail;
1167 }
1168
Mike Lockwood8182e722010-12-30 15:38:45 -05001169 if (register_android_mtp_MtpDevice(env) < 0) {
Steve Block3762c312012-01-06 19:20:56 +00001170 ALOGE("ERROR: MtpDevice native registration failed");
Mike Lockwood8182e722010-12-30 15:38:45 -05001171 goto bail;
1172 }
1173
Mike Lockwood0cd01362010-12-30 11:54:33 -05001174 if (register_android_mtp_MtpServer(env) < 0) {
Steve Block3762c312012-01-06 19:20:56 +00001175 ALOGE("ERROR: MtpServer native registration failed");
Mike Lockwood81ea83d2010-06-30 17:49:41 -04001176 goto bail;
1177 }
1178
Andreas Huber88572f72012-02-21 11:47:18 -08001179 if (register_android_media_MediaCodec(env) < 0) {
1180 ALOGE("ERROR: MediaCodec native registration failed");
1181 goto bail;
1182 }
1183
Wei Jia071a8b72015-03-09 16:38:25 -07001184 if (register_android_media_MediaSync(env) < 0) {
1185 ALOGE("ERROR: MediaSync native registration failed");
1186 goto bail;
1187 }
1188
Andreas Huber88572f72012-02-21 11:47:18 -08001189 if (register_android_media_MediaExtractor(env) < 0) {
1190 ALOGE("ERROR: MediaCodec native registration failed");
1191 goto bail;
1192 }
1193
ztenghui68ccf102013-02-13 14:07:02 -08001194 if (register_android_media_MediaMuxer(env) < 0) {
1195 ALOGE("ERROR: MediaMuxer native registration failed");
1196 goto bail;
1197 }
1198
Andreas Huber5a04bf32012-03-29 16:41:38 -07001199 if (register_android_media_MediaCodecList(env) < 0) {
1200 ALOGE("ERROR: MediaCodec native registration failed");
1201 goto bail;
1202 }
1203
Andreas Huber8240d922012-04-04 14:06:32 -07001204 if (register_android_media_Crypto(env) < 0) {
1205 ALOGE("ERROR: MediaCodec native registration failed");
1206 goto bail;
1207 }
1208
Jeff Tinker8a0c80f2013-02-08 10:20:44 -08001209 if (register_android_media_Drm(env) < 0) {
1210 ALOGE("ERROR: MediaDrm native registration failed");
1211 goto bail;
1212 }
1213
Andreas Huberd2506a52014-01-29 10:32:46 -08001214 if (register_android_media_MediaHTTPConnection(env) < 0) {
1215 ALOGE("ERROR: MediaHTTPConnection native registration failed");
1216 goto bail;
1217 }
1218
Jaesung Chungfe968df2016-01-15 14:21:11 +09001219 if (register_android_media_ExifInterface(env) < 0) {
1220 ALOGE("ERROR: ExifInterface native registration failed");
1221 goto bail;
1222 }
1223
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001224 /* success -- return valid version number */
1225 result = JNI_VERSION_1_4;
1226
1227bail:
1228 return result;
1229}
1230
1231// KTHXBYE