[FFmpeg-devel] [PATCH 4/6] Implement and use transpose function.

Stefano Sabatini stefano.sabatini-lala
Fri Oct 15 01:13:48 CEST 2010


---
 libavfilter/vf_transpose.c |  108 ++++++++++++++++++++++++-------------------
 1 files changed, 60 insertions(+), 48 deletions(-)

diff --git a/libavfilter/vf_transpose.c b/libavfilter/vf_transpose.c
index 78a408b..8f18cd7 100644
--- a/libavfilter/vf_transpose.c
+++ b/libavfilter/vf_transpose.c
@@ -29,6 +29,63 @@
 #include "libavcore/imgutils.h"
 #include "avfilter.h"
 
+static void transpose(uint8_t *dst[4], int dst_linesizes[4],
+                      uint8_t *src[4], int src_linesizes[4],
+                      int dstw, int dsth,
+                      int pixsteps[4], int hsub, int vsub,
+                      int dir)
+{
+    int plane;
+
+    for (plane = 0; plane < 4 && dst[plane]; plane++) {
+        int hsub1 = plane == 1 || plane == 2 ? hsub : 0;
+        int vsub1 = plane == 1 || plane == 2 ? vsub : 0;
+        int pixstep = pixsteps[plane];
+        int inh  = dstw>>vsub1;
+        int outw = dstw>>hsub1;
+        int outh = dsth>>vsub1;
+        uint8_t *out, *in;
+        int outlinesize, inlinesize;
+        int x, y;
+
+        out = dst[plane]; outlinesize = dst_linesizes[plane];
+        in  = src[plane]; inlinesize  = src_linesizes[plane];
+
+        if (dir&1) {
+            in +=  src_linesizes[plane] * (inh-1);
+            inlinesize *= -1;
+        }
+
+        if (dir&2) {
+            out += dst_linesizes[plane] * (outh-1);
+            outlinesize *= -1;
+        }
+
+        for (y = 0; y < outh; y++) {
+            for (x = 0; x < outw; x++) {
+                int32_t v;
+
+                switch (pixstep) {
+                case 1:
+                    *(out + x) = *(in + x*inlinesize + y);
+                    break;
+                case 2:
+                    *((uint16_t *)(out + 2*x)) = *((uint16_t *)(in + x*inlinesize + y*2));
+                    break;
+                case 3:
+                    v = AV_RB24(in + x*inlinesize + y*3);
+                    AV_WB24(out + 3*x, v);
+                    break;
+                case 4:
+                    *((uint32_t *)(out + 4*x)) = *((uint32_t *)(in + x*inlinesize + y*4));
+                    break;
+                }
+            }
+            out += outlinesize;
+        }
+    }
+}
+
 typedef struct {
     int hsub, vsub;
     int nb_planes;
@@ -121,55 +178,10 @@ static void end_frame(AVFilterLink *inlink)
     AVFilterBufferRef *inpic  = inlink->cur_buf;
     AVFilterBufferRef *outpic = inlink->dst->outputs[0]->out_buf;
     AVFilterLink *outlink = inlink->dst->outputs[0];
-    int plane;
-
-    for (plane = 0; plane < trans->nb_planes; plane++) {
-        int hsub = plane == 1 || plane == 2 ? trans->hsub : 0;
-        int vsub = plane == 1 || plane == 2 ? trans->vsub : 0;
-        int pixstep = trans->pixsteps[plane];
-        int inh  = inpic->video->h>>vsub;
-        int outw = outpic->video->w>>hsub;
-        int outh = outpic->video->h>>vsub;
-        uint8_t *out, *in;
-        int outlinesize, inlinesize;
-        int x, y;
-
-        out = outpic->data[plane]; outlinesize = outpic->linesize[plane];
-        in  = inpic ->data[plane]; inlinesize  = inpic ->linesize[plane];
 
-        if (trans->dir&1) {
-            in +=  inpic->linesize[plane] * (inh-1);
-            inlinesize *= -1;
-        }
-
-        if (trans->dir&2) {
-            out += outpic->linesize[plane] * (outh-1);
-            outlinesize *= -1;
-        }
-
-        for (y = 0; y < outh; y++) {
-            for (x = 0; x < outw; x++) {
-                int32_t v;
-
-                switch (pixstep) {
-                case 1:
-                    *(out + x) = *(in + x*inlinesize + y);
-                    break;
-                case 2:
-                    *((uint16_t *)(out + 2*x)) = *((uint16_t *)(in + x*inlinesize + y*2));
-                    break;
-                case 3:
-                    v = AV_RB24(in + x*inlinesize + y*3);
-                    AV_WB24(out + 3*x, v);
-                    break;
-                case 4:
-                    *((uint32_t *)(out + 4*x)) = *((uint32_t *)(in + x*inlinesize + y*4));
-                    break;
-                }
-            }
-            out += outlinesize;
-        }
-    }
+    transpose(outpic->data, outpic->linesize, inpic->data, inpic->linesize,
+              outpic->video->w, outpic->video->h, trans->pixsteps,
+              trans->hsub, trans->vsub, trans->dir);
 
     avfilter_unref_buffer(inpic);
     avfilter_draw_slice(outlink, 0, outpic->video->h, 1);
-- 
1.7.1




More information about the ffmpeg-devel mailing list