[SCM] libav/experimental: optimizations by arpi

siretart at users.alioth.debian.org siretart at users.alioth.debian.org
Sun Jun 30 15:47:16 UTC 2013


The following commit has been merged in the experimental branch:
commit 22dde0e9550f5a114ce26c65ef4751efeb1d8d02
Author: Michael Niedermayer <michaelni at gmx.at>
Date:   Wed Mar 29 01:59:24 2006 +0000

    optimizations by arpi
    
    Originally committed as revision 5235 to svn://svn.ffmpeg.org/ffmpeg/trunk

diff --git a/libavcodec/mjpeg.c b/libavcodec/mjpeg.c
index 951a622..e6cb52a 100644
--- a/libavcodec/mjpeg.c
+++ b/libavcodec/mjpeg.c
@@ -1246,11 +1246,10 @@ static inline int mjpeg_decode_dc(MJpegDecodeContext *s, int dc_index)
 
 /* 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 @@ static int decode_block(MJpegDecodeContext *s, DCTELEM *block,
         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 @@ static int decode_block(MJpegDecodeContext *s, DCTELEM *block,
         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 @@ static int decode_block(MJpegDecodeContext *s, DCTELEM *block,
                 break;
         }
     }
+    CLOSE_READER(re, &s->gb)
+
     return 0;
 }
 
@@ -1467,7 +1480,7 @@ static int mjpeg_decode_scan(MJpegDecodeContext *s){
                     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;
                     }

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list