summaryrefslogtreecommitdiffstats
path: root/libavcodec/diracdec.c
diff options
context:
space:
mode:
authorRostislav Pehlivanov <rpehlivanov@ob-encoder.com>2016-06-23 18:06:57 +0100
committerRostislav Pehlivanov <atomnuker@gmail.com>2016-07-11 23:34:25 +0100
commit17caae72025fd77d8edc07d5b2017b09cf0b1dda (patch)
tree4f0fc52976af0b3b256d2d921ac4149ed6b92a5a /libavcodec/diracdec.c
parentbd61f3c6bfb83d7691e124a02394ae76737c26f4 (diff)
downloadffmpeg-streaming-17caae72025fd77d8edc07d5b2017b09cf0b1dda.zip
ffmpeg-streaming-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.c53
1 files changed, 6 insertions, 47 deletions
diff --git a/libavcodec/diracdec.c b/libavcodec/diracdec.c
index c473e87..72947ec 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) \
OpenPOWER on IntegriCloud