diff options
-rw-r--r-- | player/video.c | 8 | ||||
-rw-r--r-- | video/filter/vf.c | 7 | ||||
-rw-r--r-- | video/filter/vf.h | 1 |
3 files changed, 13 insertions, 3 deletions
diff --git a/player/video.c b/player/video.c index 23f8eefa33..6373123407 100644 --- a/player/video.c +++ b/player/video.c @@ -840,9 +840,11 @@ static int video_output_image(struct MPContext *mpctx) struct mp_image *img = vf_read_output_frame(vo_c->vf); if (img) { double endpts = get_play_end_pts(mpctx); - if (endpts != MP_NOPTS_VALUE && img->pts >= endpts) { - r = VD_EOF; - } else if (mpctx->max_frames == 0) { + if ((endpts != MP_NOPTS_VALUE && img->pts >= endpts) || + mpctx->max_frames == 0) + { + vf_unread_output_frame(vo_c->vf, img); + img = NULL; r = VD_EOF; } else if (hrseek && mpctx->hrseek_lastframe) { mp_image_setrefp(&mpctx->saved_frame, img); diff --git a/video/filter/vf.c b/video/filter/vf.c index 274ca945a2..b632314426 100644 --- a/video/filter/vf.c +++ b/video/filter/vf.c @@ -458,6 +458,13 @@ struct mp_image *vf_read_output_frame(struct vf_chain *c) return vf_dequeue_output_frame(c->last); } +// Undo the previous vf_read_output_frame(). +void vf_unread_output_frame(struct vf_chain *c, struct mp_image *img) +{ + struct vf_instance *vf = c->last; + MP_TARRAY_INSERT_AT(vf, vf->out_queued, vf->num_out_queued, 0, img); +} + // Some filters (vf_vapoursynth) filter on separate threads, and may need new // input from the decoder, even though the core does not need a new output image // yet (this is required to get proper pipelining in the filter). If the filter diff --git a/video/filter/vf.h b/video/filter/vf.h index 49296fb9b2..901ccead95 100644 --- a/video/filter/vf.h +++ b/video/filter/vf.h @@ -157,6 +157,7 @@ int vf_filter_frame(struct vf_chain *c, struct mp_image *img); int vf_output_frame(struct vf_chain *c, bool eof); int vf_needs_input(struct vf_chain *c); struct mp_image *vf_read_output_frame(struct vf_chain *c); +void vf_unread_output_frame(struct vf_chain *c, struct mp_image *img); void vf_seek_reset(struct vf_chain *c); struct vf_instance *vf_append_filter(struct vf_chain *c, const char *name, char **args); |