提交 2f3e5a59 编写于 作者: Z Zhang Rui

ijkplayer: add MP_STATUS_xxx

上级 145d45dc
......@@ -23,6 +23,7 @@
#include "ff_ffplay.h"
#include "ff_cmdutils.h"
#include "ijkerror.h"
static int packet_queue_put(PacketQueue *q, AVPacket *pkt);
......@@ -2147,6 +2148,8 @@ static int read_thread(void *arg)
if (ffp->infinite_buffer < 0 && is->realtime)
ffp->infinite_buffer = 1;
// FIXME: post prepared event
for (;;) {
if (is->abort_request)
break;
......@@ -2464,3 +2467,52 @@ void ijkff_global_uninit()
g_ffmpeg_global_inited = false;
}
void ijkff_destroy_ffplayer(FFPlayer **pffp)
{
if (!pffp || !*pffp)
return;
FFPlayer *ffp = *pffp;
ijkff_reset(ffp);
free(ffp);
*pffp = NULL;
}
int ijkff_stream_open(FFPlayer *ffp, const char *file_name)
{
assert(ffp);
assert(file_name);
assert(!ffp->is.read_tid);
VideoState *is = stream_open(ffp, file_name, NULL);
if (!is)
return EIJK_OUT_OF_MEMORY;
return 0;
}
int ijkff_start(FFPlayer *ffp)
{
assert(ffp);
VideoState *is = &ffp->is;
if (is->paused) {
is->frame_timer += av_gettime() / 1000000.0 + is->video_current_pts_drift - is->video_current_pts;
if (is->read_pause_return != AVERROR(ENOSYS)) {
is->video_current_pts = is->video_current_pts_drift + av_gettime() / 1000000.0;
}
is->video_current_pts_drift = is->video_current_pts - av_gettime() / 1000000.0;
}
update_external_clock_pts(is, get_external_clock(is));
is->paused = 0;
return 0;
}
int ijkff_pause(FFPlayer *ffp)
{
assert(ffp);
VideoState *is = &ffp->is;
update_external_clock_pts(is, get_external_clock(is));
is->paused = 1;
return 0;
}
......@@ -29,4 +29,11 @@
void ijkff_global_init();
void ijkff_global_uninit();
void ijkff_destroy_ffplayer(FFPlayer **pffp);
int ijkff_stream_open(FFPlayer *ffp, const char *file_name);
int ijkff_start(FFPlayer *ffp);
int ijkff_pause(FFPlayer *ffp);
int ijkff_stop(FFPlayer *ffp);
#endif
......@@ -24,8 +24,8 @@
#ifndef IJKPLAYER__IJKERROR_H
#define IJKPLAYER__IJKERROR_H
#define EIJK_OK 0
#define EIJK_FAILED -1
#define EIJK_OUT_OF_MEMORY -2
#define EIJK_INVALID_STATE -3
#endif
......@@ -26,6 +26,39 @@
#include "ijkerror.h"
#include "ff_ffplay.h"
#define MPST_CHECK_NOT_RET_INT(real, expected, errcode) \
do { \
if (real == expected) return errcode; \
} while(0)
#define MPST_CHECK_NOT_RET(real, expected) \
MPST_CHECK_NOT_RET_INT(real, expected, EIJK_INVALID_STATE)
typedef struct IjkMediaPlayer {
volatile int ref_count;
FFPlayer *ffplayer;
int mp_state;
char *data_source;
} IjkMediaPlayer;
inline static void destroy_mp(IjkMediaPlayer **pmp)
{
if (!pmp)
return;
IjkMediaPlayer *mp = *pmp;
if (!mp)
return;
ijkff_destroy_ffplayer(&mp->ffplayer);
free(mp->data_source);
memset(mp, 0, sizeof(IjkMediaPlayer));
free(mp);
*pmp = NULL;
}
void ijkmp_global_init()
{
ijkff_global_init();
......@@ -61,16 +94,7 @@ IjkMediaPlayer *ijkmp_create()
void ijkmp_shutdown(IjkMediaPlayer *mp)
{
assert(mp);
// FIXME: implement
}
inline static void ijkmp_free(IjkMediaPlayer *mp)
{
memset(mp->ffplayer, 0, sizeof(FFPlayer));
free(mp->ffplayer);
memset(mp, 0, sizeof(IjkMediaPlayer));
free(mp);
// FIXME: implement
}
void ijkmp_inc_ref(IjkMediaPlayer *mp)
......@@ -87,74 +111,133 @@ void ijkmp_dec_ref(IjkMediaPlayer **pmp)
int ref_count = __sync_fetch_and_sub(&mp->ref_count, 1);
if (ref_count == 0) {
ijkmp_shutdown(mp);
ijkmp_free(mp);
destroy_mp(&mp);
}
*pmp = NULL;
}
void ijkmp_set_data_source(IjkMediaPlayer *mp, const char *url)
int ijkmp_set_data_source(IjkMediaPlayer *mp, const char *url)
{
// FIXME: implement
assert(mp);
assert(url);
// MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_IDLE);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_INITIALIZED);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_ASYNC_PREPARING);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_PREPARED);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_STARTED);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_PAUSED);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_COMPLETED);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_STOPPED);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_ERROR);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_END);
char *dup_url = strdup(url);
if (!dup_url)
return EIJK_OUT_OF_MEMORY;
free(mp->data_source);
mp->data_source = dup_url;
mp->mp_state = MP_STATE_INITIALIZED;
return 0;
}
void ijkmp_prepare_async(IjkMediaPlayer *mp)
int ijkmp_prepare_async(IjkMediaPlayer *mp)
{
// FIXME: implement
assert(mp);
assert(url);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_IDLE);
// MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_INITIALIZED);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_ASYNC_PREPARING);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_PREPARED);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_STARTED);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_PAUSED);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_COMPLETED);
// MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_STOPPED);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_ERROR);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_END);
assert(mp->data_source);
int retval = ijkff_stream_open(mp->ffplayer, mp->data_source);
if (retval < 0) {
mp->mp_state = MP_STATE_ERROR;
return retval;
}
mp->mp_state = MP_STATE_ASYNC_PREPARING;
return 0;
}
void ijkmp_start(IjkMediaPlayer *mp)
int ijkmp_start(IjkMediaPlayer *mp)
{
// FIXME: implement
assert(mp);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_IDLE);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_INITIALIZED);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_ASYNC_PREPARING);
// MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_PREPARED);
// MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_STARTED);
// MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_PAUSED);
// MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_COMPLETED);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_STOPPED);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_ERROR);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_END);
assert(mp->data_source);
return 0;
}
void ijkmp_stop(IjkMediaPlayer *mp)
void ijkmp_pause(IjkMediaPlayer *mp)
{
// FIXME: implement
// FIXME: implement
}
void ijkmp_pause(IjkMediaPlayer *mp)
void ijkmp_stop(IjkMediaPlayer *mp)
{
// FIXME: implement
// FIXME: implement
}
int ijkmp_get_video_width(IjkMediaPlayer *mp)
{
// FIXME: implement
// FIXME: implement
return 0;
}
int ijkmp_get_video_height(IjkMediaPlayer *mp)
{
// FIXME: implement
// FIXME: implement
return 0;
}
void ijkmp_seek_to(IjkMediaPlayer *mp, int msec)
{
// FIXME: implement
// FIXME: implement
}
bool ijkmp_is_playing(IjkMediaPlayer *mp)
{
// FIXME: implement
// FIXME: implement
return false;
}
int ijkmp_get_current_position(IjkMediaPlayer *mp)
{
// FIXME: implement
// FIXME: implement
return 0;
}
int ijkmp_get_duration(IjkMediaPlayer *mp)
{
// FIXME: implement
// FIXME: implement
return 0;
}
void ijkmp_reset(IjkMediaPlayer *mp)
{
// FIXME: implement
// FIXME: implement
}
void ijkmp_set_vout(IjkMediaPlayer *mp, SDL_Vout *vout)
......
......@@ -29,10 +29,109 @@ struct IjkMediaPlayer;
typedef struct FFPlayer FFPlayer;
typedef struct SDL_Vout SDL_Vout;
typedef struct IjkMediaPlayer {
volatile int ref_count;
FFPlayer *ffplayer;
} IjkMediaPlayer;
/*-
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_IDLE);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_INITIALIZED);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_ASYNC_PREPARING);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_PREPARED);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_STARTED);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_PAUSED);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_COMPLETED);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_STOPPED);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_ERROR);
MPST_CHECK_NOT_RET(mp->mp_state, MP_STATE_END);
*/
/*-
* ijkmp_set_data_source() -> MP_STATE_INITIALIZED
*
* ijkmp_reset -> self
* ijkmp_release -> MP_STATE_END
*/
#define MP_STATE_IDLE 0
/*-
* ijkmp_prepare_async() -> MP_STATE_ASYNC_PREPARING
*
* ijkmp_reset -> MP_STATE_IDLE
* ijkmp_release -> MP_STATE_END
*/
#define MP_STATE_INITIALIZED 1
/*-
* ... -> MP_STATE_PREPARED
* ... -> MP_STATE_ERROR
*
* ijkmp_reset -> MP_STATE_IDLE
* ijkmp_release -> MP_STATE_END
*/
#define MP_STATE_ASYNC_PREPARING 2
/*-
* ijkmp_seek_to() -> self
* ijkmp_start() -> MP_STATE_STARTED
*
* ijkmp_reset -> MP_STATE_IDLE
* ijkmp_release -> MP_STATE_END
*/
#define MP_STATE_PREPARED 3
/*-
* ijkmp_seek_to() -> self
* ijkmp_start() -> self
* ijkmp_pause() -> MP_STATE_PAUSED
* ijkmp_stop() -> MP_STATE_STOPPED
* ... -> MP_STATE_COMPLETED
* ... -> MP_STATE_ERROR
*
* ijkmp_reset -> MP_STATE_IDLE
* ijkmp_release -> MP_STATE_END
*/
#define MP_STATE_STARTED 4
/*-
* ijkmp_seek_to() -> self
* ijkmp_start() -> MP_STATE_STARTED
* ijkmp_pause() -> self
* ijkmp_stop() -> MP_STATE_STOPPED
*
* ijkmp_reset -> MP_STATE_IDLE
* ijkmp_release -> MP_STATE_END
*/
#define MP_STATE_PAUSED 5
/*-
* ijkmp_seek_to() -> self
* ijkmp_start() -> MP_STATE_STARTED (from beginning)
* ijkmp_pause() -> self
* ijkmp_stop() -> MP_STATE_STOPPED
*
* ijkmp_reset -> MP_STATE_IDLE
* ijkmp_release -> MP_STATE_END
*/
#define MP_STATE_COMPLETED 6
/*-
* ijkmp_stop() -> self
* ijkmp_prepare_async() -> MP_STATE_ASYNC_PREPARING
*
* ijkmp_reset -> MP_STATE_IDLE
* ijkmp_release -> MP_STATE_END
*/
#define MP_STATE_STOPPED 7
/*-
* ijkmp_reset -> MP_STATE_IDLE
* ijkmp_release -> MP_STATE_END
*/
#define MP_STATE_ERROR 8
/*-
* ijkmp_release -> self
*/
#define MP_STATE_END 9
typedef struct IjkMediaPlayer IjkMediaPlayer;
// ref_count is 1 after open
IjkMediaPlayer *ijkmp_create();
......@@ -50,20 +149,20 @@ void ijkmp_inc_ref(IjkMediaPlayer *mp);
// NOTE: ijkmp_dec_ref may block thread
void ijkmp_dec_ref(IjkMediaPlayer **pmp);
void ijkmp_set_data_source(IjkMediaPlayer *mp, const char *url);
void ijkmp_prepare_async(IjkMediaPlayer *mp);
void ijkmp_start(IjkMediaPlayer *mp);
void ijkmp_stop(IjkMediaPlayer *mp);
void ijkmp_pause(IjkMediaPlayer *mp);
int ijkmp_get_video_width(IjkMediaPlayer *mp);
int ijkmp_get_video_height(IjkMediaPlayer *mp);
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_get_video_width(IjkMediaPlayer *mp);
int ijkmp_get_video_height(IjkMediaPlayer *mp);
void ijkmp_seek_to(IjkMediaPlayer *mp, int msec);
bool ijkmp_is_playing(IjkMediaPlayer *mp);
int ijkmp_get_current_position(IjkMediaPlayer *mp);
int ijkmp_get_duration(IjkMediaPlayer *mp);
int ijkmp_get_current_position(IjkMediaPlayer *mp);
int ijkmp_get_duration(IjkMediaPlayer *mp);
void ijkmp_reset(IjkMediaPlayer *mp);
void ijkmp_set_vout(IjkMediaPlayer *mp, SDL_Vout *vout);
void ijkmp_set_vout(IjkMediaPlayer *mp, SDL_Vout *vout);
SDL_Vout *ijkmp_get_vout(IjkMediaPlayer *mp);
#endif
......@@ -27,9 +27,16 @@
#include "ijksdl/ijksdl.h"
#include "ijkutil/ijkutil.h"
#include "ijkplayer.h"
#include "ijkerror.h"
#define JNI_MODULE_PACKAGE "tv/danmaku/ijk/media/player"
#define JNI_CLASS_IJKPLAYER "tv/danmaku/ijk/media/player/IjkMediaPlayer"
#define JNI_IJK_MEDIA_EXCEPTION "tv/danmaku/ijk/media/player/IjkMediaException"
#define IJK_CHECK_MPRET_GOTO(retval, env, label) \
JNI_CHECK_GOTO((retval != EIJK_INVALID_STATE), env, "java/lang/IllegalStateException", NULL, LABEL_RETURN); \
JNI_CHECK_GOTO((retval != EIJK_OUT_OF_MEMORY), env, "java/lang/OutOfMemoryError", NULL, LABEL_RETURN); \
JNI_CHECK_GOTO((retval < 0), env, JNI_IJK_MEDIA_EXCEPTION, NULL, LABEL_RETURN);
typedef struct player_fields_t {
pthread_mutex_t mutex;
......@@ -81,6 +88,7 @@ IjkMediaPlayer_setDataSourceAndHeaders(
JNIEnv *env, jobject thiz, jstring path,
jobjectArray keys, jobjectArray values)
{
int retval = 0;
const char *c_path = NULL;
IjkMediaPlayer *mp = jni_get_media_player(env, thiz);
JNI_CHECK_GOTO(path, env, "java/lang/IllegalArgumentException", "mpjni: setDataSource: null path", LABEL_RETURN);
......@@ -90,9 +98,11 @@ IjkMediaPlayer_setDataSourceAndHeaders(
JNI_CHECK_GOTO(c_path, env, "java/lang/OutOfMemoryError", "mpjni: setDataSource: path.string oom", LABEL_RETURN);
ALOGV("setDataSource: path %s", c_path);
ijkmp_set_data_source(mp, c_path);
retval = ijkmp_set_data_source(mp, c_path);
(*env)->ReleaseStringUTFChars(env, path, c_path);
IJK_CHECK_MPRET_GOTO(retval, env, LABEL_RETURN);
LABEL_RETURN:
ijkmp_dec_ref(&mp);
}
......@@ -116,10 +126,12 @@ IjkMediaPlayer_setVideoSurface(JNIEnv *env, jobject thiz, jobject jsurface)
static void
IjkMediaPlayer_prepareAsync(JNIEnv *env, jobject thiz)
{
int retval = 0;
IjkMediaPlayer *mp = jni_get_media_player(env, thiz);
JNI_CHECK_GOTO(mp, env, "java/lang/IllegalStateException", "mpjni: prepareAsync: null mp", LABEL_RETURN);
ijkmp_prepare_async(mp);
retval = ijkmp_prepare_async(mp);
IJK_CHECK_MPRET_GOTO(retval, env, LABEL_RETURN);
LABEL_RETURN:
ijkmp_dec_ref(&mp);
......@@ -280,7 +292,7 @@ IjkMediaPlayer_reset(JNIEnv *env, jobject thiz)
static void
IjkMediaPlayer_native_init(JNIEnv *env)
{
// FIXME: implement
// FIXME: implement
}
static void
......
package tv.danmaku.ijk.media.player;
public class IjkMediaException extends Exception {
private static final long serialVersionUID = 7234796519009099506L;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册