static void IjkMediaPlayer_native_setup(JNIEnv *env, jobject thiz, jobject weak_this) { MPTRACE("IjkMediaPlayer_native_setup"); IjkMediaPlayer *mp = ijkmp_android_create(message_loop); JNI_CHECK_GOTO(mp, env, "java/lang/OutOfMemoryError", "mpjni: native_setup: ijkmp_create() failed", LABEL_RETURN); jni_set_media_player(env, thiz, mp); ijkmp_set_weak_thiz(mp, (*env)->NewGlobalRef(env, weak_this)); LABEL_RETURN: ijkmp_dec_ref_p(&mp); }
static void IjkMediaPlayer_reset(JNIEnv *env, jobject thiz) { MPTRACE("IjkMediaPlayer_reset"); IjkMediaPlayer *mp = jni_get_media_player(env, thiz); if (!mp) return; jobject weak_thiz = (jobject) ijkmp_set_weak_thiz(mp, NULL ); IjkMediaPlayer_release(env, thiz); IjkMediaPlayer_native_setup(env, thiz, weak_thiz); ijkmp_dec_ref_p(&mp); }
static void IjkMediaPlayer_release(JNIEnv *env, jobject thiz) { MPTRACE("IjkMediaPlayer_release"); IjkMediaPlayer *mp = jni_get_media_player(env, thiz); if (!mp) return; // explicit shutdown mp, in case it is not the last mp-ref here ijkmp_android_set_surface(env, mp, NULL ); ijkmp_shutdown(mp); //only delete weak_thiz at release jobject weak_thiz = (jobject) ijkmp_set_weak_thiz(mp, NULL ); (*env)->DeleteGlobalRef(env, weak_thiz); jni_set_media_player(env, thiz, NULL ); ijkmp_dec_ref_p(&mp); }
static void message_loop_n(JNIEnv *env, IjkMediaPlayer *mp) { jobject weak_thiz = (jobject) ijkmp_set_weak_thiz(mp, NULL); JNI_CHECK_GOTO(mp, env, NULL, "mpjni: native_message_loop: null weak_thiz", LABEL_RETURN); while (true) { AVMessage msg; int retval = ijkmp_get_msg(mp, &msg, 1); if (retval < 0) break; // block-get should never return 0 assert(retval > 0); switch (msg.what) { case FFP_MSG_FLUSH: MPTRACE("FFP_MSG_FLUSH:"); post_event(env, weak_thiz, MEDIA_NOP, 0, 0); break; case FFP_MSG_ERROR: MPTRACE("FFP_MSG_ERROR: %d", msg.arg1); post_event(env, weak_thiz, MEDIA_ERROR, MEDIA_ERROR_IJK_PLAYER, msg.arg1); break; case FFP_MSG_PREPARED: MPTRACE("FFP_MSG_PREPARED:"); post_event(env, weak_thiz, MEDIA_PREPARED, 0, 0); break; case FFP_MSG_COMPLETED: MPTRACE("FFP_MSG_COMPLETED:"); post_event(env, weak_thiz, MEDIA_PLAYBACK_COMPLETE, 0, 0); break; case FFP_MSG_VIDEO_SIZE_CHANGED: MPTRACE("FFP_MSG_VIDEO_SIZE_CHANGED: %d, %d", msg.arg1, msg.arg2); post_event(env, weak_thiz, MEDIA_SET_VIDEO_SIZE, msg.arg1, msg.arg2); break; case FFP_MSG_SAR_CHANGED: MPTRACE("FFP_MSG_SAR_CHANGED: %d, %d", msg.arg1, msg.arg2); post_event(env, weak_thiz, MEDIA_SET_VIDEO_SAR, msg.arg1, msg.arg2); break; case FFP_MSG_BUFFERING_START: MPTRACE("FFP_MSG_BUFFERING_START:"); post_event(env, weak_thiz, MEDIA_INFO, MEDIA_INFO_BUFFERING_START, 0); break; case FFP_MSG_BUFFERING_END: MPTRACE("FFP_MSG_BUFFERING_END:"); post_event(env, weak_thiz, MEDIA_INFO, MEDIA_INFO_BUFFERING_END, 0); break; case FFP_MSG_BUFFERING_UPDATE: // MPTRACE("FFP_MSG_BUFFERING_UPDATE: %d, %d", msg.arg1, msg.arg2); post_event(env, weak_thiz, MEDIA_BUFFERING_UPDATE, msg.arg1, msg.arg2); break; case FFP_MSG_BUFFERING_BYTES_UPDATE: break; case FFP_MSG_BUFFERING_TIME_UPDATE: break; case FFP_MSG_SEEK_COMPLETE: MPTRACE("FFP_MSG_SEEK_COMPLETE:"); post_event(env, weak_thiz, MEDIA_SEEK_COMPLETE, 0, 0); break; default: ALOGE("unknown FFP_MSG_xxx(%d)", msg.what); break; } } LABEL_RETURN: (*env)->DeleteGlobalRef(env, weak_thiz); }