From d9e6a6c629c073e3432e76a320245ce3616b4f3f Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Sun, 13 Jul 2003 11:06:45 +0000 Subject: [PATCH] golomb rice code cleanup / simplify (~0.5% compression gain and slightly faster) jpegls style golomb rice coder Originally committed as revision 2040 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/ffv1.c | 13 +++++-- libavcodec/golomb.h | 90 ++++++++++++++++++++++++++++++++++++++------- 2 files changed, 85 insertions(+), 18 deletions(-) diff --git a/libavcodec/ffv1.c b/libavcodec/ffv1.c index a2c4dffaa1..a9bdf0c3ef 100644 --- a/libavcodec/ffv1.c +++ b/libavcodec/ffv1.c @@ -300,6 +300,9 @@ static inline void put_vlc_symbol(PutBitContext *pb, VlcState * const state, int k++; i += i; } + + assert(k<=8); + #if 0 // JPEG LS if(k==0 && 2*state->drift <= - state->count) code= v ^ (-1); else code= v; @@ -310,7 +313,7 @@ static inline void put_vlc_symbol(PutBitContext *pb, VlcState * const state, int code = -2*code-1; code^= (code>>31); //printf("v:%d/%d bias:%d error:%d drift:%d count:%d k:%d\n", v, code, state->bias, state->error_sum, state->drift, state->count, k); - set_ur_golomb(pb, code, k, 8, 8); + set_ur_golomb(pb, code, k, 12, 8); update_vlc_state(state, v); } @@ -324,10 +327,12 @@ static inline int get_vlc_symbol(GetBitContext *gb, VlcState * const state){ k++; i += i; } - - v= get_ur_golomb(gb, k, 8, 8); + + assert(k<=8); + + v= get_ur_golomb(gb, k, 12, 8); //printf("v:%d bias:%d error:%d drift:%d count:%d k:%d", v, state->bias, state->error_sum, state->drift, state->count, k); - + v++; if(v&1) v= (v>>1); else v= -(v>>1); diff --git a/libavcodec/golomb.h b/libavcodec/golomb.h index 9861b18d1a..7c73f3bae6 100644 --- a/libavcodec/golomb.h +++ b/libavcodec/golomb.h @@ -179,7 +179,7 @@ static inline int svq3_get_se_golomb(GetBitContext *gb){ } /** - * read unsigned golomb rice code. + * read unsigned golomb rice code (ffv1). */ static inline int get_ur_golomb(GetBitContext *gb, int k, int limit, int esc_len){ unsigned int buf; @@ -190,7 +190,7 @@ static inline int get_ur_golomb(GetBitContext *gb, int k, int limit, int esc_len buf=GET_CACHE(re, gb); log= av_log2(buf); -//printf("buf:%X log:%d\n", buf, log); + if(log > 31-limit){ buf >>= log - k; buf += (30-log)<>= log - esc_len; - buf -= 1<>= 32 - limit - esc_len; + LAST_SKIP_BITS(re, gb, esc_len + limit); CLOSE_READER(re, gb); - return buf + 1; - }else - return -1; + return buf + limit - 1; + } +} + +/** + * read unsigned golomb rice code (jpegls). + */ +static inline int get_ur_golomb_jpegls(GetBitContext *gb, int k, int limit, int esc_len){ + unsigned int buf; + int log; + + OPEN_READER(re, gb); + UPDATE_CACHE(re, gb); + buf=GET_CACHE(re, gb); + + log= av_log2(buf); + + if(log > 31-12){ + buf >>= log - k; + buf += (30-log)<=0); + + e= (i>>k) + 1; + if(e