]> git.sesse.net Git - ffmpeg/commitdiff
avcodec/diracdec: Inline svq3_get_ue_golomb() and merge the sign bit decoding into it
authorMichael Niedermayer <michael@niedermayer.cc>
Tue, 12 Jan 2016 22:32:56 +0000 (23:32 +0100)
committerMichael Niedermayer <michael@niedermayer.cc>
Wed, 13 Jan 2016 17:54:50 +0000 (18:54 +0100)
This avoids closing and opening the bit reader

Reviewed-by: Rostislav Pehlivanov <atomnuker@gmail.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
libavcodec/diracdec.c

index c67f845712f97e068e3c2924f3e37d14d6747dbf..fe879bb7263b697db929466e78547d1005da05d5 100644 (file)
@@ -485,13 +485,44 @@ static av_cold int dirac_decode_end(AVCodecContext *avctx)
 static inline int coeff_unpack_golomb(GetBitContext *gb, int qfactor, int qoffset)
 {
     int sign, coeff;
+    uint32_t buf;
 
-    coeff = svq3_get_ue_golomb(gb);
+    OPEN_READER(re, gb);
+    UPDATE_CACHE(re, gb);
+    buf = GET_CACHE(re, gb);
+
+    if (buf & 0xAA800000) {
+        buf >>= 32 - 8;
+        SKIP_BITS(re, gb, ff_interleaved_golomb_vlc_len[buf]);
+
+        coeff = ff_interleaved_ue_golomb_vlc_code[buf];
+    } else {
+        unsigned ret = 1;
+
+        do {
+            buf >>= 32 - 8;
+            SKIP_BITS(re, gb,
+                           FFMIN(ff_interleaved_golomb_vlc_len[buf], 8));
+
+            if (ff_interleaved_golomb_vlc_len[buf] != 9) {
+                ret <<= (ff_interleaved_golomb_vlc_len[buf] - 1) >> 1;
+                ret  |= ff_interleaved_dirac_golomb_vlc_code[buf];
+                break;
+            }
+            ret = (ret << 4) | ff_interleaved_dirac_golomb_vlc_code[buf];
+            UPDATE_CACHE(re, gb);
+            buf = GET_CACHE(re, gb);
+        } while (ret<0x8000000U && BITS_AVAILABLE(re, gb));
+
+        coeff = ret - 1;
+    }
     if (coeff) {
         coeff = (coeff * qfactor + qoffset + 2) >> 2;
-        sign  = get_bits1(gb);
-        coeff = (coeff ^ -sign) + sign;
+        sign  = SHOW_SBITS(re, gb, 1);
+        LAST_SKIP_BITS(re, gb, 1);
+        coeff = (coeff ^ sign) - sign;
     }
+    CLOSE_READER(re, gb);
     return coeff;
 }