diff vc1.c @ 3404:0f56ae23d338 libavcodec

Optimizations suggested by Michael Niedermayer
author kostya
date Tue, 04 Jul 2006 15:33:28 +0000
parents e88c3bc82b15
children 58c4fd135462
line wrap: on
line diff
--- a/vc1.c	Mon Jul 03 18:43:45 2006 +0000
+++ b/vc1.c	Tue Jul 04 15:33:28 2006 +0000
@@ -1019,20 +1019,15 @@
     }
 }
 
-#define SETMAXMIN(var)     \
-    if(var > ma) ma = var; \
-    if(var < mi) mi = var;
-
 static inline int median4(int a, int b, int c, int d)
 {
-    int ma, mi;
-
-    ma = mi = a;
-    SETMAXMIN(b);
-    SETMAXMIN(c);
-    SETMAXMIN(d);
-
-    return (a + b + c + d - ma - mi) >> 1;
+    if(a < b) {
+        if(c < d) return (FFMIN(b, d) + FFMAX(a, c)) >> 1;
+        else      return (FFMIN(b, c) + FFMAX(a, d)) >> 1;
+    } else {
+        if(c < d) return (FFMIN(a, d) + FFMAX(b, c)) >> 1;
+        else      return (FFMIN(a, c) + FFMAX(b, d)) >> 1;
+    }
 }
 
 
@@ -1408,6 +1403,7 @@
 #define GET_MQUANT()                                           \
   if (v->dquantfrm)                                            \
   {                                                            \
+    int edges = 0;                                             \
     if (v->dqprofile == DQPROFILE_ALL_MBS)                     \
     {                                                          \
       if (v->dqbilevel)                                        \
@@ -1421,49 +1417,21 @@
         else mquant = get_bits(gb, 5);                         \
       }                                                        \
     }                                                          \
-    else if(v->dqprofile == DQPROFILE_SINGLE_EDGE)             \
-    {                                                          \
-        switch(v->dqsbedge){                                   \
-        case 0: /* left */                                     \
-            mquant = (s->mb_x) ? v->pq : v->altpq;             \
-            break;                                             \
-        case 1: /* top */                                      \
-            mquant = (s->mb_y) ? v->pq : v->altpq;             \
-            break;                                             \
-        case 2: /* right */                                    \
-            mquant = (s->mb_x != (s->mb_width - 1)) ? v->pq : v->altpq; \
-            break;                                             \
-        case 3: /* bottom */                                   \
-            mquant = (s->mb_y != (s->mb_height-1)) ? v->pq : v->altpq; \
-            break;                                             \
-        default:                                               \
-            mquant = v->pq;                                    \
-        }                                                      \
-    }                                                          \
+    if(v->dqprofile == DQPROFILE_SINGLE_EDGE)                  \
+        edges = 1 << v->dqsbedge;                              \
     else if(v->dqprofile == DQPROFILE_DOUBLE_EDGES)            \
-    {                                                          \
-        switch(v->dqsbedge){                                   \
-        case 0: /* left and top */                             \
-            mquant = (s->mb_x && s->mb_y) ? v->pq : v->altpq;  \
-            break;                                             \
-        case 1: /* top and right */                            \
-            mquant = (s->mb_y && s->mb_x != (s->mb_width - 1)) ? v->pq : v->altpq; \
-            break;                                             \
-        case 2: /* right and bottom */                         \
-            mquant = (s->mb_x != (s->mb_width - 1) && s->mb_y != (s->mb_height-1)) ? v->pq : v->altpq; \
-            break;                                             \
-        case 3: /* bottom and left */                          \
-            mquant = (s->mb_x && s->mb_y != (s->mb_height-1)) ? v->pq : v->altpq; \
-            break;                                             \
-        default:                                               \
-            mquant = v->pq;                                    \
-        }                                                      \
-    }                                                          \
+        edges = (3 << v->dqsbedge) % 15;                       \
     else if(v->dqprofile == DQPROFILE_FOUR_EDGES)              \
-    {                                                          \
-        mquant = (s->mb_x && s->mb_y && s->mb_x != (s->mb_width - 1) && s->mb_y != (s->mb_height-1)) ? v->pq : v->altpq; \
-    }                                                          \
-    else mquant = v->pq;                                       \
+        edges = 15;                                            \
+    mquant = v->pq;                                            \
+    if((edges&1) && !s->mb_x)                                  \
+        mquant = v->altpq;                                     \
+    if((edges&2) && !s->mb_y)                                  \
+        mquant = v->altpq;                                     \
+    if((edges&4) && s->mb_x == (s->mb_width - 1))              \
+        mquant = v->altpq;                                     \
+    if((edges&8) && s->mb_y == (s->mb_height - 1))             \
+        mquant = v->altpq;                                     \
   }
 
 /**