diff options
author | Rostislav Pehlivanov <rpehlivanov@ob-encoder.com> | 2016-06-23 18:06:57 +0100 |
---|---|---|
committer | Rostislav Pehlivanov <atomnuker@gmail.com> | 2016-07-11 23:34:25 +0100 |
commit | 17caae72025fd77d8edc07d5b2017b09cf0b1dda (patch) | |
tree | 4f0fc52976af0b3b256d2d921ac4149ed6b92a5a /libavcodec/diracdec.c | |
parent | bd61f3c6bfb83d7691e124a02394ae76737c26f4 (diff) | |
download | ffmpeg-17caae72025fd77d8edc07d5b2017b09cf0b1dda.tar.gz |
diracdec: simplify golomb parsing and dequantization
In preparation for the following commits, this commit simplifies the
coefficient parsing and dequantization function. It was needlessly
inlined without much performance gain.
Signed-off-by: Rostislav Pehlivanov <rpehlivanov@obe.tv>
Diffstat (limited to 'libavcodec/diracdec.c')
-rw-r--r-- | libavcodec/diracdec.c | 53 |
1 files changed, 6 insertions, 47 deletions
diff --git a/libavcodec/diracdec.c b/libavcodec/diracdec.c index c473e8778f..72947ec22c 100644 --- a/libavcodec/diracdec.c +++ b/libavcodec/diracdec.c @@ -406,58 +406,17 @@ static av_cold int dirac_decode_end(AVCodecContext *avctx) return 0; } -#define SIGN_CTX(x) (CTX_SIGN_ZERO + ((x) > 0) - ((x) < 0)) - static inline int coeff_unpack_golomb(GetBitContext *gb, int qfactor, int qoffset) { - int sign, coeff; - uint32_t buf; - - OPEN_READER(re, gb); - UPDATE_CACHE(re, gb); - buf = GET_CACHE(re, gb); - - if (buf & 0x80000000) { - LAST_SKIP_BITS(re,gb,1); - CLOSE_READER(re, gb); - return 0; - } - - 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; - } - - coeff = (coeff * qfactor + qoffset) >> 2; - sign = SHOW_SBITS(re, gb, 1); - LAST_SKIP_BITS(re, gb, 1); - coeff = (coeff ^ sign) - sign; - - CLOSE_READER(re, gb); + int coeff = dirac_get_se_golomb(gb); + const int sign = FFSIGN(coeff); + if (coeff) + coeff = sign*((sign * coeff * qfactor + qoffset) >> 2); return coeff; } +#define SIGN_CTX(x) (CTX_SIGN_ZERO + ((x) > 0) - ((x) < 0)) + #define UNPACK_ARITH(n, type) \ static inline void coeff_unpack_arith_##n(DiracArith *c, int qfactor, int qoffset, \ SubBand *b, type *buf, int x, int y) \ |