diff options
author | Kostya Shishkov <kostya.shishkov@gmail.com> | 2006-07-04 15:33:28 +0000 |
---|---|---|
committer | Kostya Shishkov <kostya.shishkov@gmail.com> | 2006-07-04 15:33:28 +0000 |
commit | 35a9cac888cef99c98cd250b9ac9ac5ce4091618 (patch) | |
tree | dfd28062c3b44c88ff19cbe59a91edac327f866e | |
parent | 5cb49ca11bca4bedb71ee0204e8115fa970d6dbb (diff) | |
download | ffmpeg-35a9cac888cef99c98cd250b9ac9ac5ce4091618.tar.gz |
Optimizations suggested by Michael Niedermayer
Originally committed as revision 5607 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavcodec/vc1.c | 74 |
1 files changed, 21 insertions, 53 deletions
diff --git a/libavcodec/vc1.c b/libavcodec/vc1.c index eec0efc14c..29acb845b3 100644 --- a/libavcodec/vc1.c +++ b/libavcodec/vc1.c @@ -1019,20 +1019,15 @@ static void vc1_mc_4mv_luma(VC1Context *v, int n) } } -#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 @@ static int vc1_parse_frame_header(VC1Context *v, GetBitContext* gb) #define GET_MQUANT() \ if (v->dquantfrm) \ { \ + int edges = 0; \ if (v->dqprofile == DQPROFILE_ALL_MBS) \ { \ if (v->dqbilevel) \ @@ -1421,49 +1417,21 @@ static int vc1_parse_frame_header(VC1Context *v, GetBitContext* gb) 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; \ } /** |