提交 db25a410 编写于 作者: Z Zhang Rui

jni: simplify xx_free

上级 3f9f6d07
...@@ -2047,7 +2047,7 @@ void ffp_global_uninit() ...@@ -2047,7 +2047,7 @@ void ffp_global_uninit()
g_ffmpeg_global_inited = false; g_ffmpeg_global_inited = false;
} }
FFPlayer *ffp_create_ffplayer() FFPlayer *ffp_create()
{ {
FFPlayer* ffp = (FFPlayer*) malloc(sizeof(ffp)); FFPlayer* ffp = (FFPlayer*) malloc(sizeof(ffp));
if (!ffp) if (!ffp)
...@@ -2060,12 +2060,11 @@ FFPlayer *ffp_create_ffplayer() ...@@ -2060,12 +2060,11 @@ FFPlayer *ffp_create_ffplayer()
return ffp; return ffp;
} }
void ffp_destroy_ffplayer(FFPlayer **pffp) void ffp_destroy(FFPlayer *ffp)
{ {
if (!pffp || !*pffp) if (!ffp)
return; return;
FFPlayer *ffp = *pffp;
if (ffp && ffp->is) { if (ffp && ffp->is) {
av_log(NULL, AV_LOG_WARNING, "ffp_destroy_ffplayer: force stream_close()"); av_log(NULL, AV_LOG_WARNING, "ffp_destroy_ffplayer: force stream_close()");
stream_close(ffp); stream_close(ffp);
...@@ -2075,13 +2074,20 @@ void ffp_destroy_ffplayer(FFPlayer **pffp) ...@@ -2075,13 +2074,20 @@ void ffp_destroy_ffplayer(FFPlayer **pffp)
ffp_reset_internal(ffp); ffp_reset_internal(ffp);
msg_queue_destroy(&ffp->msg_queue); msg_queue_destroy(&ffp->msg_queue);
SDL_VoutFreeP(&ffp->vout);
SDL_AoutFreeP(&ffp->aout);
free(ffp); free(ffp);
*pffp = NULL;
} }
void ffp_reset(FFPlayer *ffp) void ffp_destroy_p(FFPlayer **pffp)
{ {
ffp_reset_internal(ffp); if (!pffp)
return;
ffp_destroy(*pffp);
*pffp = NULL;
} }
int ffp_prepare_async_l(FFPlayer *ffp, const char *file_name) int ffp_prepare_async_l(FFPlayer *ffp, const char *file_name)
......
...@@ -31,8 +31,9 @@ ...@@ -31,8 +31,9 @@
void ffp_global_init(); void ffp_global_init();
void ffp_global_uninit(); void ffp_global_uninit();
FFPlayer *ffp_create_ffplayer(); FFPlayer *ffp_create();
void ffp_destroy_ffplayer(FFPlayer **pffp); void ffp_destroy(FFPlayer *ffp);
void ffp_destroy_p(FFPlayer *ffp);
void ffp_reset(FFPlayer *ffp); void ffp_reset(FFPlayer *ffp);
int ffp_prepare_async_l(FFPlayer *ffp, const char *file_name); int ffp_prepare_async_l(FFPlayer *ffp, const char *file_name);
......
...@@ -43,27 +43,26 @@ typedef struct IjkMediaPlayer { ...@@ -43,27 +43,26 @@ typedef struct IjkMediaPlayer {
char *data_source; char *data_source;
} IjkMediaPlayer; } IjkMediaPlayer;
inline static void destroy_mp(IjkMediaPlayer **pmp) inline static void ijkmp_destroy(IjkMediaPlayer *mp)
{ {
if (!pmp)
return;
IjkMediaPlayer *mp = *pmp;
if (!mp) if (!mp)
return; return;
FFPlayer *ffp = mp->ffplayer; ffp_destroy_p(&mp->ffplayer);
if (ffp) {
SDL_AoutFree(ffp->aout);
SDL_VoutFree(ffp->vout);
ffp_destroy_ffplayer(&mp->ffplayer);
}
pthread_mutex_destroy(&mp->mutex); pthread_mutex_destroy(&mp->mutex);
FFP_SAFE_FREE(mp->data_source); FFP_SAFE_FREE(mp->data_source);
memset(mp, 0, sizeof(IjkMediaPlayer)); memset(mp, 0, sizeof(IjkMediaPlayer));
FFP_SAFE_FREE(mp); FFP_SAFE_FREE(mp);
}
inline static void ijkmp_destroy_p(IjkMediaPlayer **pmp)
{
if (!pmp)
return;
ijkmp_destroy(*pmp);
*pmp = NULL; *pmp = NULL;
} }
...@@ -79,25 +78,31 @@ void ijkmp_global_uninit() ...@@ -79,25 +78,31 @@ void ijkmp_global_uninit()
IjkMediaPlayer *ijkmp_create() IjkMediaPlayer *ijkmp_create()
{ {
FFPlayer *ffp;
IjkMediaPlayer *mp = (IjkMediaPlayer *) malloc(sizeof(IjkMediaPlayer)); IjkMediaPlayer *mp = (IjkMediaPlayer *) malloc(sizeof(IjkMediaPlayer));
if (!mp) { if (!mp)
return NULL; goto fail;
}
memset(mp, 0, sizeof(IjkMediaPlayer)); memset(mp, 0, sizeof(IjkMediaPlayer));
FFPlayer *ffp = ffp_create_ffplayer(); mp->ffplayer = ffp_create();
if (!mp) { if (!mp)
FFP_SAFE_FREE(mp); goto fail;
return NULL;
}
pthread_mutex_init(&mp->mutex, NULL);
ijkmp_inc_ref(mp); mp->ffplayer->vout = SDL_VoutAndroid_CreateForAndroidSurface();
if (!mp->ffplayer->vout)
goto fail;
mp->ffplayer = ffp; mp->ffplayer->aout = SDL_AoutAndroid_CreateForAudioTrack();
if (!mp->ffplayer->vout)
goto fail;
pthread_mutex_init(&mp->mutex, NULL);
ijkmp_inc_ref(mp);
return mp; return mp;
fail:
ijkmp_destroy_p(&mp);
return NULL;
} }
void ijkmp_shutdown_l(IjkMediaPlayer *mp) void ijkmp_shutdown_l(IjkMediaPlayer *mp)
......
...@@ -32,7 +32,7 @@ JavaVM *SDL_AndroidJni_GetJvm() ...@@ -32,7 +32,7 @@ JavaVM *SDL_AndroidJni_GetJvm()
return g_jvm; return g_jvm;
} }
jint SDL_AndroidJni_AttachCurrentThread(JNIEnv **p_env, void *thr_args) jint SDL_AndroidJni_AttachCurrentThread(JNIEnv **p_env)
{ {
JavaVM *jvm = g_jvm; JavaVM *jvm = g_jvm;
if (!jvm) { if (!jvm) {
...@@ -40,7 +40,7 @@ jint SDL_AndroidJni_AttachCurrentThread(JNIEnv **p_env, void *thr_args) ...@@ -40,7 +40,7 @@ jint SDL_AndroidJni_AttachCurrentThread(JNIEnv **p_env, void *thr_args)
return -1; return -1;
} }
return (*jvm)->AttachCurrentThread(jvm, p_env, thr_args); return (*jvm)->AttachCurrentThread(jvm, p_env, NULL);
} }
jint SDL_AndroidJni_DetachCurrentThread() jint SDL_AndroidJni_DetachCurrentThread()
......
...@@ -28,6 +28,8 @@ ...@@ -28,6 +28,8 @@
JavaVM *SDL_AndroidJni_GetJvm(); JavaVM *SDL_AndroidJni_GetJvm();
jint SDL_AndroidJni_AttachCurrentThread(JNIEnv **p_env, void *thr_args); jint SDL_AndroidJni_AttachCurrentThread(JNIEnv **p_env);
jint SDL_AndroidJni_DetachCurrentThread();
#endif #endif
...@@ -87,7 +87,7 @@ int aout_thread(void *arg) ...@@ -87,7 +87,7 @@ int aout_thread(void *arg)
SDL_Aout_Opaque *opaque = aout->opaque; SDL_Aout_Opaque *opaque = aout->opaque;
JNIEnv *env = NULL; JNIEnv *env = NULL;
if (!SDL_AndroidJni_AttachCurrentThread(&env, NULL)) { if (JNI_OK != SDL_AndroidJni_AttachCurrentThread(&env, NULL)) {
ALOGE("aout_thread: AttachCurrentThread: failed"); ALOGE("aout_thread: AttachCurrentThread: failed");
return -1; return -1;
} }
...@@ -130,7 +130,7 @@ int aout_open_audio(SDL_Aout *aout, SDL_AudioSpec *desired, SDL_AudioSpec *obtai ...@@ -130,7 +130,7 @@ int aout_open_audio(SDL_Aout *aout, SDL_AudioSpec *desired, SDL_AudioSpec *obtai
{ {
SDL_Aout_Opaque *opaque = aout->opaque; SDL_Aout_Opaque *opaque = aout->opaque;
JNIEnv *env = NULL; JNIEnv *env = NULL;
if (!SDL_AndroidJni_AttachCurrentThread(&env, NULL)) { if (JNI_OK != SDL_AndroidJni_AttachCurrentThread(&env, NULL)) {
ALOGE("aout_open_audio: AttachCurrentThread: failed"); ALOGE("aout_open_audio: AttachCurrentThread: failed");
return -1; return -1;
} }
......
...@@ -31,7 +31,7 @@ SDL_Vout *SDL_VoutAndroid_CreateForAndroidSurface() ...@@ -31,7 +31,7 @@ SDL_Vout *SDL_VoutAndroid_CreateForAndroidSurface()
return SDL_VoutAndroid_CreateForANativeWindow(); return SDL_VoutAndroid_CreateForANativeWindow();
} }
void SDL_VoutAndroid_SetAndroidSurface(SDL_Vout *vout, JNIEnv *env, jobject android_surface) static void SDL_VoutAndroid_SetAndroidSurface_n(JNIEnv *env, SDL_Vout *vout, jobject android_surface)
{ {
if (!android_surface) if (!android_surface)
return; return;
...@@ -43,3 +43,19 @@ void SDL_VoutAndroid_SetAndroidSurface(SDL_Vout *vout, JNIEnv *env, jobject andr ...@@ -43,3 +43,19 @@ void SDL_VoutAndroid_SetAndroidSurface(SDL_Vout *vout, JNIEnv *env, jobject andr
SDL_VoutAndroid_SetNativeWindow(vout, native_window); SDL_VoutAndroid_SetNativeWindow(vout, native_window);
ANativeWindow_release(native_window); ANativeWindow_release(native_window);
} }
void SDL_VoutAndroid_SetAndroidSurface(SDL_Vout *vout, jobject android_surface)
{
if (!android_surface)
return;
JNIEnv *env = NULL;
if (JNI_OK != SDL_AndroidJni_AttachCurrentThread(&env, NULL)) {
ALOGE("SDL_VoutAndroid_SetAndroidSurface: AttachCurrentThread: failed");
return;
}
SDL_VoutAndroid_SetAndroidSurface_n(env, vout, android_surface);
SDL_AndroidJni_DetachCurrentThread();
}
...@@ -29,6 +29,6 @@ ...@@ -29,6 +29,6 @@
#include "../ijksdl_vout.h" #include "../ijksdl_vout.h"
SDL_Vout *SDL_VoutAndroid_CreateForAndroidSurface(); SDL_Vout *SDL_VoutAndroid_CreateForAndroidSurface();
void SDL_VoutAndroid_SetAndroidSurface(SDL_Vout *vout, JNIEnv *env, jobject android_surface); void SDL_VoutAndroid_SetAndroidSurface(SDL_Vout *vout, jobject android_surface);
#endif #endif
...@@ -53,3 +53,12 @@ void SDL_AoutFree(SDL_Aout *aout) ...@@ -53,3 +53,12 @@ void SDL_AoutFree(SDL_Aout *aout)
else else
free(aout); free(aout);
} }
void SDL_AoutFreeP(SDL_Aout **paout)
{
if (!paout)
return;
SDL_AoutFree(*paout);
*paout = NULL;
}
...@@ -43,5 +43,6 @@ int SDL_AoutOpenAudio(SDL_Aout *aout, SDL_AudioSpec *desired, SDL_AudioSpec *obt ...@@ -43,5 +43,6 @@ int SDL_AoutOpenAudio(SDL_Aout *aout, SDL_AudioSpec *desired, SDL_AudioSpec *obt
void SDL_AoutPauseAudio(SDL_Aout *aout, int pause_on); void SDL_AoutPauseAudio(SDL_Aout *aout, int pause_on);
void SDL_AoutCloseAudio(SDL_Aout *aout); void SDL_AoutCloseAudio(SDL_Aout *aout);
void SDL_AoutFree(SDL_Aout *aout); void SDL_AoutFree(SDL_Aout *aout);
void SDL_AoutFreeP(SDL_Aout **paout);
#endif #endif
...@@ -38,6 +38,15 @@ void SDL_VoutFree(SDL_Vout *vout) ...@@ -38,6 +38,15 @@ void SDL_VoutFree(SDL_Vout *vout)
} }
} }
void SDL_VoutFreeP(SDL_Vout **pvout)
{
if (!pvout)
return;
SDL_VoutFree(*pvout);
*pvout = NULL;
}
int SDL_VoutDisplayYUVOverlay(SDL_Vout *vout, SDL_VoutOverlay *overlay) int SDL_VoutDisplayYUVOverlay(SDL_Vout *vout, SDL_VoutOverlay *overlay)
{ {
if (vout && overlay && vout->display_overlay) if (vout && overlay && vout->display_overlay)
......
...@@ -55,6 +55,7 @@ typedef struct SDL_Vout { ...@@ -55,6 +55,7 @@ typedef struct SDL_Vout {
} SDL_Vout; } SDL_Vout;
void SDL_VoutFree(SDL_Vout *vout); void SDL_VoutFree(SDL_Vout *vout);
void SDL_VoutFreeP(SDL_Vout **pvout)
int SDL_VoutDisplayYUVOverlay(SDL_Vout *vout, SDL_VoutOverlay *overlay); int SDL_VoutDisplayYUVOverlay(SDL_Vout *vout, SDL_VoutOverlay *overlay);
int SDL_VoutLockYUVOverlay(SDL_VoutOverlay *overlay); int SDL_VoutLockYUVOverlay(SDL_VoutOverlay *overlay);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册