]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/mjpeg.c
Chinese AVS decoder
[ffmpeg] / libavcodec / mjpeg.c
index 7a86482874c9b7805e4b4618673e139cb4269b9c..dffd9894694079c9c0422530b68f3a7d8890a396 100644 (file)
@@ -1259,7 +1259,6 @@ static int decode_block(MJpegDecodeContext *s, DCTELEM *block,
                         int component, int dc_index, int ac_index, int16_t *quant_matrix)
 {
     int code, i, j, level, val;
-    VLC *ac_vlc;
 
     /* DC coef */
     val = mjpeg_decode_dc(s, dc_index);
@@ -1271,7 +1270,6 @@ static int decode_block(MJpegDecodeContext *s, DCTELEM *block,
     s->last_dc[component] = val;
     block[0] = val;
     /* AC coefs */
-    ac_vlc = &s->vlcs[1][ac_index];
     i = 0;
     {OPEN_READER(re, &s->gb)
     for(;;) {
@@ -1281,18 +1279,16 @@ static int decode_block(MJpegDecodeContext *s, DCTELEM *block,
         /* EOB */
         if (code == 0x10)
             break;
-        if (code == 0x100) {
-            i += 16;
-        } else {
-            i += ((unsigned)code) >> 4;
+        i += ((unsigned)code) >> 4;
+        if(code != 0x100){
             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);
+            if(code > MIN_CACHE_BITS - 16){
+                UPDATE_CACHE(re, &s->gb)
+            }
+            {
+                int cache=GET_CACHE(re,&s->gb);
+                int sign=(~cache)>>31;
+                level = (NEG_USR32(sign ^ cache,code) ^ sign) - sign;
             }
 
             LAST_SKIP_BITS(re, &s->gb, code)