diff --git a/player/video.c b/player/video.c index 6373123407..fb4b41f718 100644 --- a/player/video.c +++ b/player/video.c @@ -217,8 +217,8 @@ static void filter_reconfig(struct MPContext *mpctx, struct vo_chain *vo_c) if (mpctx->opts->deinterlace >= 0) video_vf_vo_control(vo_c, VFCTRL_SET_DEINTERLACE, &(int){0}); - if (params.rotate && (params.rotate % 90 == 0)) { - if (!(vo_c->vo->driver->caps & VO_CAP_ROTATE90)) { + if (params.rotate) { + if (!(vo_c->vo->driver->caps & VO_CAP_ROTATE90) || params.rotate % 90) { // Try to insert a rotation filter. char *args[] = {"angle", "auto", NULL}; if (try_filter(vo_c, "rotate", "autorotate", args) < 0) diff --git a/video/filter/vf_rotate.c b/video/filter/vf_rotate.c index 60e52a00bd..dcaba53c6a 100644 --- a/video/filter/vf_rotate.c +++ b/video/filter/vf_rotate.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include "common/msg.h" @@ -46,11 +47,17 @@ static int lavfi_reconfig(struct vf_instance *vf, struct vf_priv_s *p = vf_lw_old_priv(vf); if (p->angle == 4) { // "auto" int r = in->rotate; - if (r < 0 || r >= 360 || (r % 90) != 0) { + if (r < 0 || r >= 360) { MP_ERR(vf, "Can't apply rotation of %d degrees.\n", r); return -1; } - vf_lw_update_graph(vf, NULL, "%s", rot[(r / 90) % 360]); + if (r % 90) { + double a = r / 180.0 * M_PI; + vf_lw_update_graph(vf, NULL, "rotate=%f:ow=rotw(%f):oh=roth(%f)", + a, a, a); + } else { + vf_lw_update_graph(vf, NULL, "%s", rot[(r / 90) % 360]); + } out->rotate = 0; } return 0;