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

ijkplayer: simplify mp

上级 3dc99e6f
/*
* ijkerror.h
* ff_error.h
*
* Copyright (c) 2003 Fabrice Bellard
* Copyright (c) 2013 Zhang Rui <bbcallen@gmail.com>
......@@ -21,8 +21,8 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef IJKPLAYER__IJKERROR_H
#define IJKPLAYER__IJKERROR_H
#ifndef IJKPLAYER__FF_ERROR_H
#define IJKPLAYER__FF_ERROR_H
#define EIJK_FAILED -1
#define EIJK_OUT_OF_MEMORY -2
......
......@@ -25,21 +25,24 @@
#define IJKPLAYER__FF_FFPLAY_H
#include "ff_ffplay_def.h"
#include "ff_error.h"
void ijkff_global_init();
void ijkff_global_uninit();
void ijkff_global_init();
void ijkff_global_uninit();
void ijkff_destroy_ffplayer(FFPlayer **pffp);
FFPlayer *ijkff_create_ffplayer();
void ijkff_destroy_ffplayer(FFPlayer **pffp);
void ijkff_reset(FFPlayer *ffp);
int ijkff_prepare_async_l(FFPlayer *ffp, const char *file_name);
int ijkff_start_l(FFPlayer *ffp);
int ijkff_pause_l(FFPlayer *ffp);
int ijkff_stop_l(FFPlayer *ffp);
int ijkff_wait_stop_l(FFPlayer *ffp);
int ijkff_prepare_async_l(FFPlayer *ffp, const char *file_name);
int ijkff_start_l(FFPlayer *ffp);
int ijkff_pause_l(FFPlayer *ffp);
int ijkff_stop_l(FFPlayer *ffp);
int ijkff_wait_stop_l(FFPlayer *ffp);
/* all in milliseconds */
int ijkff_seek_to_l(FFPlayer *ffp, long msec);
long ijkff_get_current_position_l(FFPlayer *ffp);
long ijkff_get_duration_l(FFPlayer *ffp);
int ijkff_seek_to_l(FFPlayer *ffp, long msec);
long ijkff_get_current_position_l(FFPlayer *ffp);
long ijkff_get_duration_l(FFPlayer *ffp);
#endif
......@@ -408,7 +408,7 @@ typedef struct FFPlayer {
#define fftime_to_milliseconds(ts) (ts / (AV_TIME_BASE / 1000))
#define milliseconds_to_fftime(ms) (ms * (AV_TIME_BASE / 1000))
inline static void ijkff_reset(FFPlayer *ffp)
inline static void ijkff_reset_internal(FFPlayer *ffp)
{
/* ffp->is closed in stream_close() */
......
......@@ -89,6 +89,14 @@ static void ijkmp_msg_handler(void *opaque, int what, int arg1, int arg2, void*
// FIXME: implement
}
void ijkmp_setup_internal(IjkMediaPlayer *mp) {
FFPlayer *ffp = mp->ffplayer;
ffp->msg_opaque = mp;
ffp->msg_handler = ijkmp_msg_handler;
ijkmsg_queue_start(&mp->msg_queue);
}
IjkMediaPlayer *ijkmp_create()
{
IjkMediaPlayer *mp = (IjkMediaPlayer *) malloc(sizeof(IjkMediaPlayer));
......@@ -97,28 +105,24 @@ IjkMediaPlayer *ijkmp_create()
}
memset(mp, 0, sizeof(IjkMediaPlayer));
mp->ffplayer = (FFPlayer*) malloc(sizeof(FFPlayer));
FFPlayer *ffp = ijkff_create_ffplayer();
if (!mp) {
free(mp);
return NULL;
}
memset(mp->ffplayer, 0, sizeof(FFPlayer));
FFPlayer *ffp = mp->ffplayer;
ijkff_reset(ffp);
ffp->msg_opaque = mp;
ffp->msg_handler = ijkmp_msg_handler;
pthread_mutex_init(&mp->mutex, NULL);
ijkmsg_queue_init(&mp->msg_queue);
ijkmsg_queue_start(&mp->msg_queue);
ijkmp_inc_ref(mp);
mp->ffplayer = ffp;
ijkmp_setup_internal(mp);
return mp;
}
void ijkmp_shutdown(IjkMediaPlayer *mp)
void ijkmp_shutdown_l(IjkMediaPlayer *mp)
{
assert(mp);
......@@ -130,21 +134,31 @@ void ijkmp_shutdown(IjkMediaPlayer *mp)
}
}
void ijkmp_reset(IjkMediaPlayer *mp)
void ijkmp_shutdown(IjkMediaPlayer *mp)
{
assert(mp);
return ijkmp_shutdown_l(mp);
}
pthread_mutex_lock(&mp->mutex);
void ijkmp_reset_l(IjkMediaPlayer *mp)
{
assert(mp);
ijkff_stop_l(mp->ffplayer);
/* FIXME: try to avoid dead-lock */
ijkff_wait_stop_l(mp->ffplayer);
ijkmp_shutdown_l(mp);
ijkff_reset(mp->ffplayer);
free(mp->data_source);
mp->data_source = NULL;
mp->mp_state = MP_STATE_IDLE;
ijkmp_setup_internal(mp);
}
void ijkmp_reset(IjkMediaPlayer *mp)
{
assert(mp);
pthread_mutex_lock(&mp->mutex);
ijkmp_reset_l(mp);
pthread_mutex_unlock(&mp->mutex);
}
......
......@@ -136,31 +136,28 @@ typedef struct IjkMediaPlayer IjkMediaPlayer;
// ref_count is 1 after open
IjkMediaPlayer *ijkmp_create();
void ijkmp_global_init();
void ijkmp_global_uninit();
// preferred to be called explicity, can be called multiple times
// NOTE: ijkmp_shutdown may block thread
void ijkmp_shutdown(IjkMediaPlayer *mp);
void ijkmp_shutdown(IjkMediaPlayer *mp);
void ijkmp_inc_ref(IjkMediaPlayer *mp);
void ijkmp_inc_ref(IjkMediaPlayer *mp);
// call close at last release, also free memory
// NOTE: ijkmp_dec_ref may block thread
void ijkmp_dec_ref(IjkMediaPlayer **pmp);
int ijkmp_set_data_source(IjkMediaPlayer *mp, const char *url);
int ijkmp_prepare_async(IjkMediaPlayer *mp);
int ijkmp_start(IjkMediaPlayer *mp);
int ijkmp_pause(IjkMediaPlayer *mp);
int ijkmp_stop(IjkMediaPlayer *mp);
int ijkmp_seek_to(IjkMediaPlayer *mp, long msec);
bool ijkmp_is_playing(IjkMediaPlayer *mp);
long ijkmp_get_current_position(IjkMediaPlayer *mp);
long ijkmp_get_duration(IjkMediaPlayer *mp);
void ijkmp_reset(IjkMediaPlayer *mp);
void ijkmp_set_vout(IjkMediaPlayer *mp, SDL_Vout *vout);
SDL_Vout *ijkmp_get_vout(IjkMediaPlayer *mp);
void ijkmp_dec_ref(IjkMediaPlayer **pmp);
int ijkmp_set_data_source(IjkMediaPlayer *mp, const char *url);
int ijkmp_prepare_async(IjkMediaPlayer *mp);
int ijkmp_start(IjkMediaPlayer *mp);
int ijkmp_pause(IjkMediaPlayer *mp);
int ijkmp_stop(IjkMediaPlayer *mp);
int ijkmp_seek_to(IjkMediaPlayer *mp, long msec);
bool ijkmp_is_playing(IjkMediaPlayer *mp);
long ijkmp_get_current_position(IjkMediaPlayer *mp);
long ijkmp_get_duration(IjkMediaPlayer *mp);
void ijkmp_reset(IjkMediaPlayer *mp);
void ijkmp_set_vout(IjkMediaPlayer *mp, SDL_Vout *vout);
SDL_Vout *ijkmp_get_vout(IjkMediaPlayer *mp);
#endif
......@@ -26,7 +26,7 @@
#include <jni.h>
#include "ijksdl_android/ijksdl_android.h"
#include "ijkutil/ijkutil.h"
#include "ffplay/ijkerror.h"
#include "ffplay/ff_ffplay.h"
#include "ijkplayer_android.h"
#define JNI_MODULE_PACKAGE "tv/danmaku/ijk/media/player"
......@@ -344,14 +344,14 @@ jint JNI_OnLoad(JavaVM *vm, void *reserved)
(*env)->RegisterNatives(env, g_clazz.clazz, g_methods, NELEM(g_methods));
ijkmp_global_init();
ijkff_global_init();
return JNI_VERSION_1_4;
}
void JNI_OnUnload(JavaVM *jvm, void *reserved)
{
ijkmp_global_uninit();
ijkff_global_uninit();
pthread_mutex_destroy(&g_clazz.mutex);
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册