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

jni: simplify xx_free

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