diff --git a/core/mp_core.h b/core/mp_core.h index c9c6a57487..25482ac3ef 100644 --- a/core/mp_core.h +++ b/core/mp_core.h @@ -282,6 +282,7 @@ int seek_chapter(struct MPContext *mpctx, int chapter, double *seek_pts); double get_time_length(struct MPContext *mpctx); double get_current_time(struct MPContext *mpctx); int get_percent_pos(struct MPContext *mpctx); +double get_current_pos_ratio(struct MPContext *mpctx); int get_current_chapter(struct MPContext *mpctx); char *chapter_display_name(struct MPContext *mpctx, int chapter); char *chapter_name(struct MPContext *mpctx, int chapter); diff --git a/core/mplayer.c b/core/mplayer.c index 97ab1e8ab4..f9bc7ffb69 100644 --- a/core/mplayer.c +++ b/core/mplayer.c @@ -1460,8 +1460,8 @@ static void sadd_osd_status(char **buffer, struct MPContext *mpctx, bool full) static void add_seek_osd_messages(struct MPContext *mpctx) { if (mpctx->add_osd_seek_info & OSD_SEEK_INFO_BAR) { - set_osd_bar(mpctx, OSD_BAR_SEEK, "Position", 0, 100, - get_percent_pos(mpctx)); + set_osd_bar(mpctx, OSD_BAR_SEEK, "Position", 0, 1, + av_clipf(get_current_pos_ratio(mpctx), 0, 1)); } if (mpctx->add_osd_seek_info & OSD_SEEK_INFO_TEXT) { mp_osd_msg_t *msg = add_osd_msg(mpctx, OSD_MSG_TEXT, 1, @@ -1500,7 +1500,8 @@ static void update_osd_msg(struct MPContext *mpctx) struct osd_state *osd = mpctx->osd; add_seek_osd_messages(mpctx); - update_osd_bar(mpctx, OSD_BAR_SEEK, 0, 100, get_percent_pos(mpctx)); + update_osd_bar(mpctx, OSD_BAR_SEEK, 0, 1, + av_clipf(get_current_pos_ratio(mpctx), 0, 1)); // Look if we have a msg mp_osd_msg_t *msg = get_osd_msg(mpctx); @@ -2980,33 +2981,33 @@ static double get_start_time(struct MPContext *mpctx) return time; } -int get_percent_pos(struct MPContext *mpctx) +// Return playback position in 0.0-1.0 ratio, or -1 if unknown. +double get_current_pos_ratio(struct MPContext *mpctx) { struct demuxer *demuxer = mpctx->demuxer; if (!demuxer) - return 0; - int ans = 0; + return -1; + double ans = -1; double start = get_start_time(mpctx); double len = get_time_length(mpctx); double pos = get_current_time(mpctx); if (len > 0) { - ans = (pos - start) / len * 100; + ans = av_clipf((pos - start) / len, 0, 1); } else { - int len = (demuxer->movi_end - demuxer->movi_start) / 100; + int len = (demuxer->movi_end - demuxer->movi_start); int64_t pos = demuxer->filepos > 0 ? demuxer->filepos : stream_tell(demuxer->stream); if (len > 0) - ans = (pos - demuxer->movi_start) / len; - else - ans = 0; + ans = av_clipf((double)(pos - demuxer->movi_start) / len, 0, 1); } - if (ans < 0) - ans = 0; - if (ans > 100) - ans = 100; return ans; } +int get_percent_pos(struct MPContext *mpctx) +{ + return av_clip(get_current_pos_ratio(mpctx) * 100, 0, 100); +} + // -2 is no chapters, -1 is before first chapter int get_current_chapter(struct MPContext *mpctx) {