summaryrefslogtreecommitdiff
path: root/libavfilter/vf_scale.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2013-07-14 05:19:46 +0200
committerMichael Niedermayer <michaelni@gmx.at>2013-07-18 01:21:27 +0200
commit37ded53037196144eb712daa5decaca7f92ae3c6 (patch)
tree6e597d0010946cd77461dc9c6392eff696248bec /libavfilter/vf_scale.c
parent353f302250fd63a4d01dbdc0b6a5fa6b313ebbb7 (diff)
vf_scale: use sws_init_context()
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavfilter/vf_scale.c')
-rw-r--r--libavfilter/vf_scale.c42
1 files changed, 26 insertions, 16 deletions
diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c
index 056f54054a..a71340a2bf 100644
--- a/libavfilter/vf_scale.c
+++ b/libavfilter/vf_scale.c
@@ -259,25 +259,35 @@ static int config_props(AVFilterLink *outlink)
if (scale->sws)
sws_freeContext(scale->sws);
+ if (scale->isws[0])
+ sws_freeContext(scale->isws[0]);
+ if (scale->isws[1])
+ sws_freeContext(scale->isws[1]);
+ scale->isws[0] = scale->isws[1] = scale->sws = NULL;
if (inlink->w == outlink->w && inlink->h == outlink->h &&
inlink->format == outlink->format)
- scale->sws = NULL;
+ ;
else {
- scale->sws = sws_getContext(inlink ->w, inlink ->h, inlink ->format,
- outlink->w, outlink->h, outfmt,
- scale->flags, NULL, NULL, NULL);
- if (scale->isws[0])
- sws_freeContext(scale->isws[0]);
- scale->isws[0] = sws_getContext(inlink ->w, inlink ->h/2, inlink ->format,
- outlink->w, outlink->h/2, outfmt,
- scale->flags, NULL, NULL, NULL);
- if (scale->isws[1])
- sws_freeContext(scale->isws[1]);
- scale->isws[1] = sws_getContext(inlink ->w, inlink ->h/2, inlink ->format,
- outlink->w, outlink->h/2, outfmt,
- scale->flags, NULL, NULL, NULL);
- if (!scale->sws || !scale->isws[0] || !scale->isws[1])
- return AVERROR(EINVAL);
+ struct SwsContext **swscs[3] = {&scale->sws, &scale->isws[0], &scale->isws[1]};
+ int i;
+
+ for (i = 0; i < 3; i++) {
+ struct SwsContext **s = swscs[i];
+ *s = sws_alloc_context();
+ if (!*s)
+ return AVERROR(ENOMEM);
+
+ av_opt_set_int(*s, "srcw", inlink ->w, 0);
+ av_opt_set_int(*s, "srch", inlink ->h >> !!i, 0);
+ av_opt_set_int(*s, "src_format", inlink->format, 0);
+ av_opt_set_int(*s, "dstw", outlink->w, 0);
+ av_opt_set_int(*s, "dsth", outlink->h >> !!i, 0);
+ av_opt_set_int(*s, "dst_format", outfmt, 0);
+ av_opt_set_int(*s, "sws_flags", scale->flags, 0);
+
+ if ((ret = sws_init_context(*s, NULL, NULL)) < 0)
+ return ret;
+ }
}
if (inlink->sample_aspect_ratio.num){