mirror of https://github.com/mpv-player/mpv
player: respect --untimed on last frame
The last video frame is another case that has a separate code path,
although it's pretty similar to the one in commit 73e5aa87
. Fix this
in a different way, which also takes care of the last frame case,
although without context the code becomes slightly more tricky.
As further cleanup, move the decision about framedropping itself to
the same place, so the check in vo.c becomes much simpler. The check
for the vo->driver->encode flag, which is remvoed completely, was
redundant too.
Fixes #1480.
This commit is contained in:
parent
42fa954849
commit
918b06c42c
|
@ -786,7 +786,7 @@ void write_video(struct MPContext *mpctx, double endpts)
|
||||||
struct mp_image_params p = mpctx->next_frame[0]->params;
|
struct mp_image_params p = mpctx->next_frame[0]->params;
|
||||||
if (!vo->params || !mp_image_params_equal(&p, vo->params)) {
|
if (!vo->params || !mp_image_params_equal(&p, vo->params)) {
|
||||||
// Changing config deletes the current frame; wait until it's finished.
|
// Changing config deletes the current frame; wait until it's finished.
|
||||||
if (vo_still_displaying(vo) && !(opts->untimed || vo->driver->untimed))
|
if (vo_still_displaying(vo))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const struct vo_driver *info = mpctx->video_out->driver;
|
const struct vo_driver *info = mpctx->video_out->driver;
|
||||||
|
@ -824,6 +824,8 @@ void write_video(struct MPContext *mpctx, double endpts)
|
||||||
diff = vpts1 - vpts0;
|
diff = vpts1 - vpts0;
|
||||||
if (diff < 0 && mpctx->d_video->fps > 0)
|
if (diff < 0 && mpctx->d_video->fps > 0)
|
||||||
diff = 1.0 / mpctx->d_video->fps; // fallback to demuxer-reported fps
|
diff = 1.0 / mpctx->d_video->fps; // fallback to demuxer-reported fps
|
||||||
|
if (opts->untimed || vo->driver->untimed || !(opts->frame_dropping & 1))
|
||||||
|
diff = -1; // disable frame dropping and aspects of frame timing
|
||||||
if (diff >= 0) {
|
if (diff >= 0) {
|
||||||
// expected A/V sync correction is ignored
|
// expected A/V sync correction is ignored
|
||||||
diff /= opts->playback_speed;
|
diff /= opts->playback_speed;
|
||||||
|
|
|
@ -562,8 +562,7 @@ static bool render_frame(struct vo *vo)
|
||||||
int64_t next_vsync = prev_sync(vo, mp_time_us()) + in->vsync_interval;
|
int64_t next_vsync = prev_sync(vo, mp_time_us()) + in->vsync_interval;
|
||||||
int64_t end_time = pts + duration;
|
int64_t end_time = pts + duration;
|
||||||
|
|
||||||
if (!(vo->global->opts->frame_dropping & 1) || !in->hasframe_rendered ||
|
if (!in->hasframe_rendered)
|
||||||
vo->driver->untimed || vo->driver->encode)
|
|
||||||
duration = -1; // disable framedrop
|
duration = -1; // disable framedrop
|
||||||
|
|
||||||
in->dropped_frame = duration >= 0 && end_time < next_vsync;
|
in->dropped_frame = duration >= 0 && end_time < next_vsync;
|
||||||
|
|
Loading…
Reference in New Issue