diff options
Diffstat (limited to 'player/video.c')
-rw-r--r-- | player/video.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/player/video.c b/player/video.c index 17dff84984..fde92851a1 100644 --- a/player/video.c +++ b/player/video.c @@ -256,6 +256,7 @@ void reinit_video_chain_src(struct MPContext *mpctx, struct track *track) vo_c->dec_src = track->dec->f->pins[0]; vo_c->filter->container_fps = track->dec->fps; vo_c->is_coverart = !!track->stream->attached_picture; + vo_c->is_sparse = track->stream->still_image; track->vo_c = vo_c; vo_c->track = track; @@ -365,9 +366,12 @@ static void handle_new_frame(struct MPContext *mpctx) double frame_time = 0; double pts = mpctx->next_frames[0]->pts; + bool is_sparse = mpctx->vo_chain && mpctx->vo_chain->is_sparse; + if (mpctx->video_pts != MP_NOPTS_VALUE) { frame_time = pts - mpctx->video_pts; - double tolerance = mpctx->demuxer->ts_resets_possible ? 5 : 1e4; + double tolerance = mpctx->demuxer->ts_resets_possible && + !is_sparse ? 5 : 1e4; if (frame_time <= 0 || frame_time >= tolerance) { // Assume a discontinuity. MP_WARN(mpctx, "Invalid video timestamp: %f -> %f\n", @@ -403,6 +407,9 @@ static int get_req_frames(struct MPContext *mpctx, bool eof) if (mpctx->video_out->driver->caps & VO_CAP_NORETAIN) return 1; + if (mpctx->vo_chain && mpctx->vo_chain->is_sparse) + return 1; + if (mpctx->opts->untimed || mpctx->video_out->driver->untimed) return 1; @@ -594,6 +601,9 @@ static void update_av_diff(struct MPContext *mpctx, double offset) mpctx->video_status != STATUS_PLAYING) return; + if (mpctx->vo_chain && mpctx->vo_chain->is_sparse) + return; + double a_pos = playing_audio_pts(mpctx); if (a_pos != MP_NOPTS_VALUE && mpctx->video_pts != MP_NOPTS_VALUE) { mpctx->last_av_difference = a_pos - mpctx->video_pts |