vf_scale: avoid a pointless memcpy in no-op conversion.
authorAnton Khirnov <anton@khirnov.net>
Thu, 29 Mar 2012 05:02:27 +0000 (07:02 +0200)
committerAnton Khirnov <anton@khirnov.net>
Sun, 1 Apr 2012 07:04:14 +0000 (09:04 +0200)
I.e. just pass the buffer along when src parameters == dst parameters.

libavfilter/vf_scale.c

index 46009a7..a4da088 100644 (file)
@@ -213,11 +213,16 @@ static int config_props(AVFilterLink *outlink)
 
     if (scale->sws)
         sws_freeContext(scale->sws);
 
     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)
 
 
     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;
 
     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;
 
     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];
 
     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;
 
     if (scale->slice_y == 0 && slice_dir == -1)
         scale->slice_y = link->dst->outputs[0]->h;