changeset 3225:a0d2d5053c9d libavcodec

optimizations by arpi
author michael
date Wed, 29 Mar 2006 01:59:24 +0000
parents 28aaf0a0135e
children e3ddc57c2d6e
files mjpeg.c
diffstat 1 files changed, 19 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/mjpeg.c	Mon Mar 27 22:22:50 2006 +0000
+++ b/mjpeg.c	Wed Mar 29 01:59:24 2006 +0000
@@ -1246,11 +1246,10 @@
 
 /* decode block and dequantize */
 static int decode_block(MJpegDecodeContext *s, DCTELEM *block,
-                        int component, int dc_index, int ac_index, int quant_index)
+                        int component, int dc_index, int ac_index, int16_t *quant_matrix)
 {
     int code, i, j, level, val;
     VLC *ac_vlc;
-    int16_t *quant_matrix;
 
     /* DC coef */
     val = mjpeg_decode_dc(s, dc_index);
@@ -1258,15 +1257,16 @@
         dprintf("error dc\n");
         return -1;
     }
-    quant_matrix = s->quant_matrixes[quant_index];
     val = val * quant_matrix[0] + s->last_dc[component];
     s->last_dc[component] = val;
     block[0] = val;
     /* AC coefs */
     ac_vlc = &s->vlcs[1][ac_index];
     i = 1;
+    OPEN_READER(re, &s->gb)
     for(;;) {
-        code = get_vlc2(&s->gb, s->vlcs[1][ac_index].table, 9, 2);
+        UPDATE_CACHE(re, &s->gb);
+        GET_VLC(code, re, &s->gb, s->vlcs[1][ac_index].table, 9, 2)
 
         if (code < 0) {
             dprintf("error ac\n");
@@ -1278,8 +1278,19 @@
         if (code == 0xf0) {
             i += 16;
         } else {
-            level = get_xbits(&s->gb, code & 0xf);
             i += code >> 4;
+            code &= 0xf;
+
+            UPDATE_CACHE(re, &s->gb)
+
+            if ((int32_t)GET_CACHE(re,&s->gb)<0) { //MSB=1
+                level =   NEG_USR32( GET_CACHE(re,&s->gb),code);
+            } else {
+                level = - NEG_USR32(~GET_CACHE(re,&s->gb),code);
+            }
+
+            SKIP_BITS(re, &s->gb, code)
+
             if (i >= 64) {
                 dprintf("error count: %d\n", i);
                 return -1;
@@ -1291,6 +1302,8 @@
                 break;
         }
     }
+    CLOSE_READER(re, &s->gb)
+
     return 0;
 }
 
@@ -1467,7 +1480,7 @@
                     memset(s->block, 0, sizeof(s->block));
                     if (decode_block(s, s->block, i,
                                      s->dc_index[i], s->ac_index[i],
-                                     s->quant_index[c]) < 0) {
+                                     s->quant_matrixes[ s->quant_index[c] ]) < 0) {
                         dprintf("error y=%d x=%d\n", mb_y, mb_x);
                         return -1;
                     }