[FFmpeg-cvslog] Blowfish: restructure/simplify code a bit.

Michael Niedermayer git at videolan.org
Fri Jul 6 02:26:23 CEST 2012


ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Fri Jul  6 01:37:44 2012 +0200| [ec086762322cccacb68cc1b41dc2b42cbd94a3f7] | committer: Michael Niedermayer

Blowfish: restructure/simplify code a bit.

Very slightly faster (2% or so)

Signed-off-by: Michael Niedermayer <michaelni at gmx.at>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=ec086762322cccacb68cc1b41dc2b42cbd94a3f7
---

 libavutil/blowfish.c |   44 ++++++++++++++++++--------------------------
 1 file changed, 18 insertions(+), 26 deletions(-)

diff --git a/libavutil/blowfish.c b/libavutil/blowfish.c
index fd894cd..5fe95e8 100644
--- a/libavutil/blowfish.c
+++ b/libavutil/blowfish.c
@@ -294,24 +294,12 @@ static const uint32_t orig_s[4][256] = {
       0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6 }
 };
 
-static void F(AVBlowfish *ctx, uint32_t *xl, uint32_t *xr, int i)
-{
-    uint32_t Xl, Xr;
-    uint32_t y;
-
-    Xl = *xl;
-    Xr = *xr;
-
-    Xl ^= ctx->p[i];
-    y   = ctx->s[0][(Xl >> 24) & 0xFF];
-    y  += ctx->s[1][(Xl >> 16) & 0xFF];
-    y  ^= ctx->s[2][(Xl >>  8) & 0xFF];
-    y  += ctx->s[3][ Xl        & 0xFF];
-    Xr ^= y;
-
-    *xl = Xr;
-    *xr = Xl;
-}
+#define F(Xl, Xr, P) \
+    Xr ^=((( ctx->s[0][ Xl >> 24        ] \
+           + ctx->s[1][(Xl >> 16) & 0xFF])\
+           ^ ctx->s[2][(Xl >>  8) & 0xFF])\
+           + ctx->s[3][ Xl        & 0xFF])\
+           ^ P;
 
 av_cold void av_blowfish_init(AVBlowfish *ctx, const uint8_t *key, int key_len)
 {
@@ -358,17 +346,21 @@ void av_blowfish_crypt_ecb(AVBlowfish *ctx, uint32_t *xl, uint32_t *xr,
     Xr = *xr;
 
     if (decrypt) {
-        for (i = AV_BF_ROUNDS + 1; i > 1; --i)
-            F(ctx, &Xl, &Xr, i);
+        Xl ^= ctx->p[AV_BF_ROUNDS + 1];
+        for (i = AV_BF_ROUNDS; i > 0; i-=2) {
+            F(Xl, Xr, ctx->p[i  ]);
+            F(Xr, Xl, ctx->p[i-1]);
+        }
 
-        Xl = Xl ^ ctx->p[1];
-        Xr = Xr ^ ctx->p[0];
+        Xr ^= ctx->p[0];
     } else {
-        for (i = 0; i < AV_BF_ROUNDS; ++i)
-            F(ctx, &Xl, &Xr, i);
+        Xl ^= ctx->p[0];
+        for (i = 1; i < AV_BF_ROUNDS+1; i+=2){
+            F(Xl, Xr, ctx->p[i  ]);
+            F(Xr, Xl, ctx->p[i+1]);
+        }
 
-        Xl = Xl ^ ctx->p[AV_BF_ROUNDS];
-        Xr = Xr ^ ctx->p[AV_BF_ROUNDS + 1];
+        Xr ^= ctx->p[AV_BF_ROUNDS + 1];
     }
 
     *xl = Xr;



More information about the ffmpeg-cvslog mailing list