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

ijkplayer: add ijkff_seek_to

上级 8189163c
......@@ -2480,7 +2480,7 @@ void ijkff_destroy_ffplayer(FFPlayer **pffp)
*pffp = NULL;
}
int ijkff_stream_open_l(FFPlayer *ffp, const char *file_name)
int ijkff_prepare_async_l(FFPlayer *ffp, const char *file_name)
{
assert(ffp);
assert(!ffp->is);
......@@ -2488,7 +2488,7 @@ int ijkff_stream_open_l(FFPlayer *ffp, const char *file_name)
VideoState *is = stream_open(ffp, file_name, NULL);
if (!is) {
av_log(NULL, AV_LOG_WARNING, "ijkff_stream_open_l: stream_open failed OOM");
av_log(NULL, AV_LOG_WARNING, "ijkff_prepare_async_l: stream_open failed OOM");
return EIJK_OUT_OF_MEMORY;
}
......@@ -2538,7 +2538,7 @@ int ijkff_stop_l(FFPlayer *ffp)
return 0;
}
int ijkff_wait_stop(FFPlayer *ffp)
int ijkff_wait_stop_l(FFPlayer *ffp)
{
assert(ffp);
VideoState *is = ffp->is;
......@@ -2557,11 +2557,16 @@ int ijkff_seek_to_l(FFPlayer *ffp, long msec)
if (!is)
return EIJK_NULL_IS_PTR;
int64_t seek_pos = milliseconds_to_fftime(msec);
int64_t start_time = is->ic->start_time;
if (start_time > 0)
seek_pos += start_time;
// FIXME: thread-safe
// FIXME: seek by bytes
// FIXME: seek out of range
// FIXME: seekable
stream_seek(ffp, milliseconds_to_fftime(msec), 0, 0);
stream_seek(is, seek_pos, 0, 0);
return 0;
}
......@@ -2580,7 +2585,7 @@ long ijkff_get_current_position_l(FFPlayer *ffp)
if (pos < 0 || pos < start_time)
return 0;
int64_t adjust_post = pos - start_time;
int64_t adjust_post = pos - start_time > 0 ? start_time : 0;
return fftime_to_milliseconds(adjust_post);
}
......@@ -2596,6 +2601,6 @@ long ijkff_get_duration_l(FFPlayer *ffp)
if (duration < 0 || duration < start_time)
return 0;
int64_t adjust_duration = duration - start_time;
int64_t adjust_duration = duration - start_time > 0 ? start_time : 0;
return fftime_to_milliseconds(adjust_duration);
}
......@@ -31,14 +31,14 @@ void ijkff_global_uninit();
void ijkff_destroy_ffplayer(FFPlayer **pffp);
int ijkff_stream_open_l(FFPlayer *ffp, const char *file_name);
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(FFPlayer *ffp);
int ijkff_wait_stop_l(FFPlayer *ffp);
/* all in milliseconds */
int ijkff_seek_to_l(IjkMediaPlayer *mp, long msec);
int ijkff_seek_to_l(FFPlayer *ffp, long msec);
long ijkff_get_current_position_l(FFPlayer *ffp);
long ijkff_get_duration_l(FFPlayer *ffp);
......
......@@ -106,13 +106,18 @@ void ijkmp_reset(IjkMediaPlayer *mp)
{
assert(mp);
ijkmp_stop(mp);
pthread_mutex_lock(&mp->mutex);
ijkff_stop_l(mp->ffplayer);
/* FIXME: try to avoid dead-lock */
ijkff_wait_stop_l(mp->ffplayer);
ijkff_reset(mp->ffplayer);
free(mp->data_source);
mp->data_source = NULL;
mp->mp_state = MP_STATE_IDLE;
pthread_mutex_unlock(&mp->mutex);
}
void ijkmp_inc_ref(IjkMediaPlayer *mp)
......@@ -189,7 +194,7 @@ static int ijkmp_prepare_async_l(IjkMediaPlayer *mp)
assert(mp->data_source);
mp->mp_state = MP_STATE_ASYNC_PREPARING;
int retval = ijkff_stream_open_l(mp->ffplayer, mp->data_source);
int retval = ijkff_prepare_async_l(mp->ffplayer, mp->data_source);
if (retval < 0) {
mp->mp_state = MP_STATE_ERROR;
return retval;
......@@ -300,6 +305,7 @@ static int ijkmp_stop_l(IjkMediaPlayer *mp)
return retval;
}
// FIXME: change to MP_STATE_STOPPED in read_thread() */
mp->mp_state = MP_STATE_STOPPED;
return 0;
}
......@@ -310,10 +316,6 @@ int ijkmp_stop(IjkMediaPlayer *mp)
pthread_mutex_lock(&mp->mutex);
int retval = ijkmp_stop_l(mp);
pthread_mutex_unlock(&mp->mutex);
if (retval == 0)
ijkff_wait_stop(mp->ffplayer);
return retval;
}
......@@ -343,7 +345,7 @@ int ijkmp_seek_to_l(IjkMediaPlayer *mp, long msec)
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);
int retval = ijkff_seek_to_l(mp->ffplayer, msec);
if (retval < 0) {
return retval;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册