summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libmpcodecs/vf_dsize.c32
-rw-r--r--libmpcodecs/vf_scale.c13
2 files changed, 26 insertions, 19 deletions
diff --git a/libmpcodecs/vf_dsize.c b/libmpcodecs/vf_dsize.c
index 7772b3732d..d46d22ebb2 100644
--- a/libmpcodecs/vf_dsize.c
+++ b/libmpcodecs/vf_dsize.c
@@ -39,29 +39,31 @@ static int config(struct vf_instance *vf,
int width, int height, int d_width, int d_height,
unsigned int flags, unsigned int outfmt)
{
+ int w = vf->priv->w;
+ int h = vf->priv->h;
if (vf->priv->aspect < 0.001) { // did the user input aspect or w,h params
- if (vf->priv->w == 0) vf->priv->w = d_width;
- if (vf->priv->h == 0) vf->priv->h = d_height;
- if (vf->priv->w == -1) vf->priv->w = width;
- if (vf->priv->h == -1) vf->priv->h = height;
- if (vf->priv->w == -2) vf->priv->w = vf->priv->h * (double)d_width / d_height;
- if (vf->priv->w == -3) vf->priv->w = vf->priv->h * (double)width / height;
- if (vf->priv->h == -2) vf->priv->h = vf->priv->w * (double)d_height / d_width;
- if (vf->priv->h == -3) vf->priv->h = vf->priv->w * (double)height / width;
+ if (w == 0) w = d_width;
+ if (h == 0) h = d_height;
+ if (w == -1) w = width;
+ if (h == -1) h = height;
+ if (w == -2) w = h * (double)d_width / d_height;
+ if (w == -3) w = h * (double)width / height;
+ if (h == -2) h = w * (double)d_height / d_width;
+ if (h == -3) h = w * (double)height / width;
if (vf->priv->method > -1) {
double aspect = (vf->priv->method & 2) ? ((double)height / width) : ((double)d_height / d_width);
- if ((vf->priv->h > vf->priv->w * aspect) ^ (vf->priv->method & 1)) {
- vf->priv->h = vf->priv->w * aspect;
+ if ((h > w * aspect) ^ (vf->priv->method & 1)) {
+ h = w * aspect;
} else {
- vf->priv->w = vf->priv->h / aspect;
+ w = h / aspect;
}
}
if (vf->priv->round > 1) { // round up
- vf->priv->w += (vf->priv->round - 1 - (vf->priv->w - 1) % vf->priv->round);
- vf->priv->h += (vf->priv->round - 1 - (vf->priv->h - 1) % vf->priv->round);
+ w += (vf->priv->round - 1 - (w - 1) % vf->priv->round);
+ h += (vf->priv->round - 1 - (h - 1) % vf->priv->round);
}
- d_width = vf->priv->w;
- d_height = vf->priv->h;
+ d_width = w;
+ d_height = h;
} else {
if (vf->priv->aspect * height > width) {
d_width = height * vf->priv->aspect + .5;
diff --git a/libmpcodecs/vf_scale.c b/libmpcodecs/vf_scale.c
index a088d1926e..585ef4d9a1 100644
--- a/libmpcodecs/vf_scale.c
+++ b/libmpcodecs/vf_scale.c
@@ -44,6 +44,7 @@
static struct vf_priv_s {
int w,h;
+ int cfg_w, cfg_h;
int v_chr_drop;
double param[2];
unsigned int fmt;
@@ -55,6 +56,7 @@ static struct vf_priv_s {
int accurate_rnd;
struct mp_csp_details colorspace;
} const vf_priv_dflt = {
+ 0, 0,
-1,-1,
0,
{SWS_PARAM_DEFAULT, SWS_PARAM_DEFAULT},
@@ -204,6 +206,9 @@ static int config(struct vf_instance *vf,
vo_flags=vf->next->query_format(vf->next,best);
+ vf->priv->w = vf->priv->cfg_w;
+ vf->priv->h = vf->priv->cfg_h;
+
// scaling to dwidth*d_height, if all these TRUE:
// - option -zoom
// - no other sw/hw up/down scaling avail.
@@ -628,8 +633,8 @@ static int vf_open(vf_instance_t *vf, char *args){
vf->control= control;
vf->uninit=uninit;
mp_msg(MSGT_VFILTER,MSGL_V,"SwScale params: %d x %d (-1=no scaling)\n",
- vf->priv->w,
- vf->priv->h);
+ vf->priv->cfg_w,
+ vf->priv->cfg_h);
return 1;
}
@@ -754,8 +759,8 @@ static const m_obj_presets_t size_preset = {
#undef ST_OFF
#define ST_OFF(f) M_ST_OFF(struct vf_priv_s,f)
static const m_option_t vf_opts_fields[] = {
- {"w", ST_OFF(w), CONF_TYPE_INT, M_OPT_MIN,-11,0, NULL},
- {"h", ST_OFF(h), CONF_TYPE_INT, M_OPT_MIN,-11,0, NULL},
+ {"w", ST_OFF(cfg_w), CONF_TYPE_INT, M_OPT_MIN,-11,0, NULL},
+ {"h", ST_OFF(cfg_h), CONF_TYPE_INT, M_OPT_MIN,-11,0, NULL},
{"interlaced", ST_OFF(interlaced), CONF_TYPE_INT, M_OPT_RANGE, 0, 1, NULL},
{"chr-drop", ST_OFF(v_chr_drop), CONF_TYPE_INT, M_OPT_RANGE, 0, 3, NULL},
{"param" , ST_OFF(param[0]), CONF_TYPE_DOUBLE, M_OPT_RANGE, 0.0, 100.0, NULL},