diff --git a/deps/media-playback/media-playback/media.c b/deps/media-playback/media-playback/media.c index ed057974b..1edd640d6 100644 --- a/deps/media-playback/media-playback/media.c +++ b/deps/media-playback/media-playback/media.c @@ -436,19 +436,17 @@ static void mp_media_calc_next_ns(mp_media_t *m) m->next_pts_ns = min_next_ns; } -static bool mp_media_reset(mp_media_t *m) +static void seek_to(mp_media_t *m, int64_t pos, bool reset) { AVStream *stream = m->fmt->streams[0]; - int64_t seek_pos; + int64_t seek_pos = pos; int seek_flags; - bool stopping; - bool active; if (m->fmt->duration == AV_NOPTS_VALUE) { - seek_pos = 0; seek_flags = AVSEEK_FLAG_FRAME; } else { - seek_pos = m->fmt->start_time; + if (reset) + seek_pos = m->fmt->start_time; seek_flags = AVSEEK_FLAG_BACKWARD; } @@ -469,6 +467,14 @@ static bool mp_media_reset(mp_media_t *m) mp_decode_flush(&m->v); if (m->has_audio && m->is_local_file) mp_decode_flush(&m->a); +} + +static bool mp_media_reset(mp_media_t *m) +{ + bool stopping; + bool active; + + seek_to(m, 0, true); int64_t next_ts = mp_media_get_base_pts(m); int64_t offset = next_ts - m->next_pts_ns; @@ -829,8 +835,8 @@ void mp_media_stop(mp_media_t *m) int64_t mp_get_current_time(mp_media_t *m) { - return (int64_t)(((float)m->next_pts_ns / 1000000.0f) * - ((float)m->speed / 100.0f)); + int speed = (int)((float)m->speed / 100.0f); + return (mp_media_get_base_pts(m) / 1000000) * speed; } void mp_media_seek_to(mp_media_t *m, int64_t pos) @@ -838,26 +844,5 @@ void mp_media_seek_to(mp_media_t *m, int64_t pos) if (!m->active) return; - int64_t seek_to = pos * 1000; - - AVStream *stream = m->fmt->streams[0]; - - int64_t seek_target = AVSEEK_FLAG_BACKWARD == AVSEEK_FLAG_BACKWARD - ? av_rescale_q(seek_to, AV_TIME_BASE_Q, - stream->time_base) - : seek_to; - - if (m->is_local_file) { - int ret = av_seek_frame(m->fmt, 0, seek_target, - AVSEEK_FLAG_BACKWARD); - if (ret < 0) { - blog(LOG_WARNING, "MP: Failed to seek: %s", - av_err2str(ret)); - } - } - - if (m->has_video && m->is_local_file) - mp_decode_flush(&m->v); - if (m->has_audio && m->is_local_file) - mp_decode_flush(&m->a); + seek_to(m, pos * 1000, false); }