From ba1380223a8d77a0cb62523d52bd855c5dc621b6 Mon Sep 17 00:00:00 2001 From: wm4 Date: Mon, 21 Apr 2014 01:26:56 +0200 Subject: vf: remove autoinserted filters on reconfig When using rotation with hw decoding, and the VO does not support rotation, vf_rotate is attempted to be inserted. This will go wrong, and after that it can't recover because a vf_scale filter was autoinserted. Just removing all autoinserted filters before reconfig fixes this. --- video/filter/vf.c | 7 +++++++ video/filter/vf.h | 1 + 2 files changed, 8 insertions(+) (limited to 'video') diff --git a/video/filter/vf.c b/video/filter/vf.c index ef34b8242d..fc12bc1eda 100644 --- a/video/filter/vf.c +++ b/video/filter/vf.c @@ -470,6 +470,7 @@ static void update_formats(struct vf_chain *c, struct vf_instance *vf, MP_INFO(c, "Using conversion filter.\n"); struct vf_instance *conv = vf_open(c, "scale", NULL); if (conv) { + conv->autoinserted = true; conv->next = vf->next; vf->next = conv; update_formats(c, conv, vf->last_outfmts); @@ -523,6 +524,12 @@ int vf_reconfig(struct vf_chain *c, const struct mp_image_params *params) { struct mp_image_params cur = *params; int r = 0; + for (struct vf_instance *vf = c->first; vf; ) { + struct vf_instance *next = vf->next; + if (vf->autoinserted) + vf_remove_filter(c, vf); + vf = next; + } c->first->fmt_in = *params; uint8_t unused[IMGFMT_END - IMGFMT_START]; update_formats(c, c->first, unused); diff --git a/video/filter/vf.h b/video/filter/vf.h index e186add4d0..d11c6de575 100644 --- a/video/filter/vf.h +++ b/video/filter/vf.h @@ -75,6 +75,7 @@ typedef struct vf_instance { void (*uninit)(struct vf_instance *vf); char *label; + bool autoinserted; struct mp_image_params fmt_in, fmt_out; -- cgit v1.2.3