Commit 416fd90e authored by Anton Khirnov's avatar Anton Khirnov

vf_scale: avoid a pointless memcpy in no-op conversion.

I.e. just pass the buffer along when src parameters == dst parameters.
parent 63736fe4
...@@ -213,11 +213,16 @@ static int config_props(AVFilterLink *outlink) ...@@ -213,11 +213,16 @@ static int config_props(AVFilterLink *outlink)
if (scale->sws) if (scale->sws)
sws_freeContext(scale->sws); sws_freeContext(scale->sws);
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, scale->sws = sws_getContext(inlink ->w, inlink ->h, inlink ->format,
outlink->w, outlink->h, outlink->format, outlink->w, outlink->h, outlink->format,
scale->flags, NULL, NULL, NULL); scale->flags, NULL, NULL, NULL);
if (!scale->sws) if (!scale->sws)
return AVERROR(EINVAL); return AVERROR(EINVAL);
}
if (inlink->sample_aspect_ratio.num) if (inlink->sample_aspect_ratio.num)
...@@ -241,6 +246,11 @@ static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref) ...@@ -241,6 +246,11 @@ static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
AVFilterLink *outlink = link->dst->outputs[0]; AVFilterLink *outlink = link->dst->outputs[0];
AVFilterBufferRef *outpicref; 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->hsub = av_pix_fmt_descriptors[link->format].log2_chroma_w;
scale->vsub = av_pix_fmt_descriptors[link->format].log2_chroma_h; 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) ...@@ -267,6 +277,11 @@ static void draw_slice(AVFilterLink *link, int y, int h, int slice_dir)
AVFilterBufferRef *cur_pic = link->cur_buf; AVFilterBufferRef *cur_pic = link->cur_buf;
const uint8_t *data[4]; 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) if (scale->slice_y == 0 && slice_dir == -1)
scale->slice_y = link->dst->outputs[0]->h; scale->slice_y = link->dst->outputs[0]->h;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment