aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2012-03-29 07:02:27 +0200
committerAnton Khirnov <anton@khirnov.net>2012-04-01 09:04:14 +0200
commit416fd90ead0cdea962a1319a1b20b9272be4fb49 (patch)
tree1879d001b9653659f5b553e8a74c1877503cf995
parent63736fe48c30c5db313c3a25d1462ad31b2a1671 (diff)
downloadffmpeg-416fd90ead0cdea962a1319a1b20b9272be4fb49.tar.gz
vf_scale: avoid a pointless memcpy in no-op conversion.
I.e. just pass the buffer along when src parameters == dst parameters.
-rw-r--r--libavfilter/vf_scale.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c
index 46009a7daa..a4da088936 100644
--- a/libavfilter/vf_scale.c
+++ b/libavfilter/vf_scale.c
@@ -213,11 +213,16 @@ static int config_props(AVFilterLink *outlink)
if (scale->sws)
sws_freeContext(scale->sws);
- scale->sws = sws_getContext(inlink ->w, inlink ->h, inlink ->format,
- outlink->w, outlink->h, outlink->format,
- scale->flags, NULL, NULL, NULL);
- if (!scale->sws)
- return AVERROR(EINVAL);
+ 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, outlink->format,
+ scale->flags, NULL, NULL, NULL);
+ if (!scale->sws)
+ return AVERROR(EINVAL);
+ }
if (inlink->sample_aspect_ratio.num)
@@ -241,6 +246,11 @@ static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
AVFilterLink *outlink = link->dst->outputs[0];
AVFilterBufferRef *outpicref;
+ if (!scale->sws) {
+ avfilter_start_frame(outlink, avfilter_ref_buffer(picref, ~0));
+ return;
+ }
+
scale->hsub = av_pix_fmt_descriptors[link->format].log2_chroma_w;
scale->vsub = av_pix_fmt_descriptors[link->format].log2_chroma_h;
@@ -267,6 +277,11 @@ static void draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
AVFilterBufferRef *cur_pic = link->cur_buf;
const uint8_t *data[4];
+ if (!scale->sws) {
+ avfilter_draw_slice(link->dst->outputs[0], y, h, slice_dir);
+ return;
+ }
+
if (scale->slice_y == 0 && slice_dir == -1)
scale->slice_y = link->dst->outputs[0]->h;