static int ijkmp_prepare_async_l(IjkMediaPlayer *mp) { assert(mp); MPST_RET_IF_EQ(mp->mp_state, MP_STATE_IDLE); // MPST_RET_IF_EQ(mp->mp_state, MP_STATE_INITIALIZED); MPST_RET_IF_EQ(mp->mp_state, MP_STATE_ASYNC_PREPARING); MPST_RET_IF_EQ(mp->mp_state, MP_STATE_PREPARED); MPST_RET_IF_EQ(mp->mp_state, MP_STATE_STARTED); MPST_RET_IF_EQ(mp->mp_state, MP_STATE_PAUSED); MPST_RET_IF_EQ(mp->mp_state, MP_STATE_COMPLETED); // MPST_RET_IF_EQ(mp->mp_state, MP_STATE_STOPPED); MPST_RET_IF_EQ(mp->mp_state, MP_STATE_ERROR); MPST_RET_IF_EQ(mp->mp_state, MP_STATE_END); assert(mp->data_source); ijkmp_change_state_l(mp, MP_STATE_ASYNC_PREPARING); msg_queue_start(&mp->ffplayer->msg_queue); // released in msg_loop ijkmp_inc_ref(mp); mp->msg_thread = SDL_CreateThreadEx(&mp->_msg_thread, mp->msg_loop, mp, "ff_msg_loop"); // TODO: 9 release weak_thiz if pthread_create() failed; int retval = ffp_prepare_async_l(mp->ffplayer, mp->data_source); if (retval < 0) { ijkmp_change_state_l(mp, MP_STATE_ERROR); return retval; } return 0; }
IjkMediaPlayer *ijkmp_create(void *(*msg_loop)(void*)) { IjkMediaPlayer *mp = (IjkMediaPlayer *) av_mallocz(sizeof(IjkMediaPlayer)); if (!mp) goto fail; mp->ffplayer = ffp_create(); if (!mp) goto fail; mp->ffplayer->vout = SDL_VoutAndroid_CreateForAndroidSurface(); if (!mp->ffplayer->vout) goto fail; mp->ffplayer->aout = SDL_AoutAndroid_CreateForAudioTrack(); if (!mp->ffplayer->vout) goto fail; mp->msg_loop = msg_loop; ijkmp_inc_ref(mp); pthread_mutex_init(&mp->mutex, NULL); return mp; fail: ijkmp_destroy_p(&mp); return NULL; }
static IjkMediaPlayer *jni_get_media_player(JNIEnv* env, jobject thiz) { pthread_mutex_lock(&g_clazz.mutex); IjkMediaPlayer *mp = (IjkMediaPlayer *) (intptr_t) (*env)->GetLongField(env, thiz, g_clazz.mNativeMediaPlayer); if (mp) { ijkmp_inc_ref(mp); } pthread_mutex_unlock(&g_clazz.mutex); return mp; }
static IjkMediaPlayer *jni_get_media_player(JNIEnv* env, jobject thiz) { pthread_mutex_lock(&g_clazz.mutex); IjkMediaPlayer *mp = (IjkMediaPlayer *) (intptr_t) J4AC_IjkMediaPlayer__mNativeMediaPlayer__get__catchAll(env, thiz); if (mp) { ijkmp_inc_ref(mp); } pthread_mutex_unlock(&g_clazz.mutex); return mp; }
static IjkMediaPlayer *jni_set_media_player(JNIEnv* env, jobject thiz, IjkMediaPlayer *mp) { pthread_mutex_lock(&g_clazz.mutex); IjkMediaPlayer *old = (IjkMediaPlayer*) (intptr_t) (*env)->GetLongField(env, thiz, g_clazz.mNativeMediaPlayer); if (mp) { ijkmp_inc_ref(mp); } (*env)->SetLongField(env, thiz, g_clazz.mNativeMediaPlayer, (intptr_t) mp); pthread_mutex_unlock(&g_clazz.mutex); // NOTE: ijkmp_dec_ref may block thread if (old != NULL) { ijkmp_dec_ref_p(&old); } return old; }
static IjkMediaPlayer *jni_set_media_player(JNIEnv* env, jobject thiz, IjkMediaPlayer *mp) { pthread_mutex_lock(&g_clazz.mutex); IjkMediaPlayer *old = (IjkMediaPlayer*) (intptr_t) J4AC_IjkMediaPlayer__mNativeMediaPlayer__get__catchAll(env, thiz); if (mp) { ijkmp_inc_ref(mp); } J4AC_IjkMediaPlayer__mNativeMediaPlayer__set__catchAll(env, thiz, (intptr_t) mp); pthread_mutex_unlock(&g_clazz.mutex); // NOTE: ijkmp_dec_ref may block thread if (old != NULL ) { ijkmp_dec_ref_p(&old); } return old; }
IjkMediaPlayer *ijkmp_create(int (*msg_loop)(void*)) { IjkMediaPlayer *mp = (IjkMediaPlayer *) av_mallocz(sizeof(IjkMediaPlayer)); if (!mp) goto fail; mp->ffplayer = ffp_create(); if (!mp) goto fail; mp->msg_loop = msg_loop; ijkmp_inc_ref(mp); pthread_mutex_init(&mp->mutex, NULL); return mp; fail: ijkmp_destroy_p(&mp); return NULL; }