[Ffmpeg-cvslog] r5607 - trunk/libavcodec/vc1.c

kostya subversion
Tue Jul 4 17:33:29 CEST 2006


Author: kostya
Date: Tue Jul  4 17:33:28 2006
New Revision: 5607

Modified:
   trunk/libavcodec/vc1.c

Log:
Optimizations suggested by Michael Niedermayer


Modified: trunk/libavcodec/vc1.c
==============================================================================
--- trunk/libavcodec/vc1.c	(original)
+++ trunk/libavcodec/vc1.c	Tue Jul  4 17:33:28 2006
@@ -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;                                     \
   }
 
 /**




More information about the ffmpeg-cvslog mailing list