diff --git a/ijkmediaplayer/jni/ijkplayer/ff_ffplay.c b/ijkmediaplayer/jni/ijkplayer/ff_ffplay.c index 9348f5a95c8549ef9e971dcf892efb0821f1bffd..e937b0579de315c499c3f76f7969211430c23c08 100644 --- a/ijkmediaplayer/jni/ijkplayer/ff_ffplay.c +++ b/ijkmediaplayer/jni/ijkplayer/ff_ffplay.c @@ -2550,6 +2550,21 @@ int ijkff_wait_stop(FFPlayer *ffp) return 0; } +int ijkff_seek_to_l(FFPlayer *ffp, long msec) +{ + assert(ffp); + VideoState *is = ffp->is; + if (!is) + return EIJK_NULL_IS_PTR; + + // FIXME: thread-safe + // FIXME: seek by bytes + // FIXME: seek out of range + // FIXME: seekable + stream_seek(ffp, milliseconds_to_fftime(msec), 0, 0); + return 0; +} + long ijkff_get_current_position_l(FFPlayer *ffp) { assert(ffp); diff --git a/ijkmediaplayer/jni/ijkplayer/ff_ffplay.h b/ijkmediaplayer/jni/ijkplayer/ff_ffplay.h index 567b1e1ec5f12bcde8fa0539a8ab901317d9173e..b34d53e790377b12f0f60245ee01abf2b64b5aa3 100644 --- a/ijkmediaplayer/jni/ijkplayer/ff_ffplay.h +++ b/ijkmediaplayer/jni/ijkplayer/ff_ffplay.h @@ -38,6 +38,7 @@ int ijkff_stop_l(FFPlayer *ffp); int ijkff_wait_stop(FFPlayer *ffp); /* all in milliseconds */ +int ijkff_seek_to_l(IjkMediaPlayer *mp, long msec); long ijkff_get_current_position_l(FFPlayer *ffp); long ijkff_get_duration_l(FFPlayer *ffp); diff --git a/ijkmediaplayer/jni/ijkplayer/ff_ffplay_def.h b/ijkmediaplayer/jni/ijkplayer/ff_ffplay_def.h index 904bdd170abbbc3387ac95c7b32fe66ec19e6466..af95f8160e16b564d79e4778e1e259162694a9be 100644 --- a/ijkmediaplayer/jni/ijkplayer/ff_ffplay_def.h +++ b/ijkmediaplayer/jni/ijkplayer/ff_ffplay_def.h @@ -406,7 +406,8 @@ typedef struct FFPlayer { #define IJKFF_MSG_SEEK_COMPLETED 6 #define IJKFF_SAFE_FREE(p) do {free(p); p = NULL;} while(0) -#define fftime_to_milliseconds(t) (t / (AV_TIME_BASE / 1000)) +#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) { diff --git a/ijkmediaplayer/jni/ijkplayer/ijkplayer.c b/ijkmediaplayer/jni/ijkplayer/ijkplayer.c index 103f845d735456294c74debcc7bb37486b3c1054..591d679eb7b31ee62ff1af84c278552d57c2e235 100644 --- a/ijkmediaplayer/jni/ijkplayer/ijkplayer.c +++ b/ijkmediaplayer/jni/ijkplayer/ijkplayer.c @@ -99,7 +99,20 @@ IjkMediaPlayer *ijkmp_create() void ijkmp_shutdown(IjkMediaPlayer *mp) { assert(mp); -// FIXME: implement + // FIXME: implement +} + +void ijkmp_reset(IjkMediaPlayer *mp) +{ + assert(mp); + + ijkmp_stop(mp); + + ijkff_reset(mp->ffplayer); + + free(mp->data_source); + mp->data_source = NULL; + mp->mp_state = MP_STATE_IDLE; } void ijkmp_inc_ref(IjkMediaPlayer *mp) @@ -304,12 +317,6 @@ int ijkmp_stop(IjkMediaPlayer *mp) return retval; } -int ijkmp_seek_to(IjkMediaPlayer *mp, long msec) -{ - // FIXME: implement - return 0; -} - bool ijkmp_is_playing(IjkMediaPlayer *mp) { assert(mp); @@ -321,6 +328,39 @@ bool ijkmp_is_playing(IjkMediaPlayer *mp) return false; } +int ijkmp_seek_to_l(IjkMediaPlayer *mp, long msec) +{ + 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); + + int retval = ijkmp_seek_to_l(mp->ffplayer, msec); + if (retval < 0) { + return retval; + } + + return 0; +} + +int ijkmp_seek_to(IjkMediaPlayer *mp, long msec) +{ + assert(mp); + pthread_mutex_lock(&mp->mutex); + int retval = ijkmp_seek_to(mp, msec); + pthread_mutex_unlock(&mp->mutex); + + return retval; +} + static long ijkmp_get_current_position_l(IjkMediaPlayer *mp) { return ijkff_get_current_position_l(mp->ffplayer); @@ -349,11 +389,6 @@ long ijkmp_get_duration(IjkMediaPlayer *mp) return retval; } -void ijkmp_reset(IjkMediaPlayer *mp) -{ - // FIXME: implement -} - void ijkmp_set_vout(IjkMediaPlayer *mp, SDL_Vout *vout) { mp->ffplayer->vout = vout; diff --git a/ijkmediaplayer/jni/ijkplayer/ijkplayer_jni.c b/ijkmediaplayer/jni/ijkplayer/ijkplayer_jni.c index be588d3f35756e6f3c3ff678c456c395ea0c6747..11cf8ead9f6fc201b195a82fda6a5f21a47b2404 100644 --- a/ijkmediaplayer/jni/ijkplayer/ijkplayer_jni.c +++ b/ijkmediaplayer/jni/ijkplayer/ijkplayer_jni.c @@ -251,7 +251,6 @@ IjkMediaPlayer_release(JNIEnv *env, jobject thiz) static void IjkMediaPlayer_reset(JNIEnv *env, jobject thiz) { - // FIXME: consider create new MediaPlayer IjkMediaPlayer *mp = jni_get_media_player(env, thiz); JNI_CHECK_GOTO(mp, env, NULL, "mpjni: reset: null mp", LABEL_RETURN);