diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2013-07-14 05:19:46 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2013-07-18 01:21:27 +0200 |
commit | 37ded53037196144eb712daa5decaca7f92ae3c6 (patch) | |
tree | 6e597d0010946cd77461dc9c6392eff696248bec | |
parent | 353f302250fd63a4d01dbdc0b6a5fa6b313ebbb7 (diff) | |
download | ffmpeg-37ded53037196144eb712daa5decaca7f92ae3c6.tar.gz |
vf_scale: use sws_init_context()
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavfilter/vf_scale.c | 42 |
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){ |