Mercurial > libavcodec.hg
changeset 2558:2b01396ab483 libavcodec
optimize & simplify
author | michael |
---|---|
date | Wed, 09 Mar 2005 23:48:17 +0000 |
parents | dd8c4d4b8abc |
children | 7d8ba28e18d9 |
files | loco.c |
diffstat | 1 files changed, 18 insertions(+), 52 deletions(-) [+] |
line wrap: on
line diff
--- a/loco.c Wed Mar 09 19:46:31 2005 +0000 +++ b/loco.c Wed Mar 09 23:48:17 2005 +0000 @@ -42,30 +42,9 @@ GetBitContext gb; int save, run, run2; /* internal rice decoder state */ int sum, count; /* sum and count for getting rice parameter */ + int lossy; }RICEContext; -/* could use get_sr_golomb() but is behaves differently on numbers like Rice(2, -64) */ -static inline int get_rice(GetBitContext *gb, int K) -{ - int i; - int V = 0; - for(i = 0; !get_bits1(gb); i++); - V = i; - for(i = 0; i < K; i++) V = (V << 1) | get_bits1(gb); - if(V & 1) return (V + 1) >> 1; - return -(V >> 1); -} - -static inline int get_u_rice(GetBitContext *gb, int K) -{ - int i; - int V = 0; - for(i = 0; !get_bits1(gb); i++); - V = i; - for(i = 0; i < K; i++) V = (V << 1) | get_bits1(gb); - return V; -} - static int loco_get_rice_param(RICEContext *r) { int cnt = 0; @@ -81,8 +60,6 @@ static inline void loco_update_rice_param(RICEContext *r, int val) { - if (val < 0) - val = -val; r->sum += val; r->count++; @@ -95,15 +72,16 @@ static inline int loco_get_rice(RICEContext *r) { int v; - if (r->run > 0) { /* we have zero run */ r->run--; + loco_update_rice_param(r, 0); return 0; } - v = -get_rice(&r->gb, loco_get_rice_param(r)); + v = get_ur_golomb_jpegls(&r->gb, loco_get_rice_param(r), INT_MAX, 0); + loco_update_rice_param(r, (v+1)>>1); if (!v) { if (r->save >= 0) { - r->run = get_u_rice(&r->gb, 2); + r->run = get_ur_golomb_jpegls(&r->gb, 2, INT_MAX, 0); if(r->run > 1) r->save += r->run + 1; else @@ -111,12 +89,15 @@ } else r->run2++; - } else if (r->run2 > 0) { - if (r->run2 > 2) - r->save += r->run2; - else - r->save -= 3; - r->run2 = 0; + } else { + v = ((v>>1) + r->lossy) ^ -(v&1); + if (r->run2 > 0) { + if (r->run2 > 2) + r->save += r->run2; + else + r->save -= 3; + r->run2 = 0; + } } return v; @@ -125,19 +106,13 @@ /* LOCO main predictor - LOCO-I/JPEG-LS predictor */ static inline int loco_predict(uint8_t* data, int stride, int step) { - int max_ab, min_ab; int a, b, c; a = data[-stride]; b = data[-step]; c = data[-stride - step]; - max_ab = (a > b) ? a : b; - min_ab = (a < b) ? a : b; - - if (c >= max_ab) return min_ab; - if (c <= min_ab) return max_ab; - return (a + b - c); + return mid_pred(a, a + b - c, b); } static int loco_decode_plane(LOCOContext *l, uint8_t *data, int width, int height, @@ -151,38 +126,27 @@ rc.save = 0; rc.run = 0; rc.run2 = 0; + rc.lossy = l->lossy; rc.sum = 8; rc.count = 1; /* restore top left pixel */ val = loco_get_rice(&rc); - loco_update_rice_param(&rc, val); - if (val < 0) val -= l->lossy; - if (val > 0) val += l->lossy; data[0] = 128 + val; /* restore top line */ for (i = 1; i < width; i++) { val = loco_get_rice(&rc); - loco_update_rice_param(&rc, val); - if (val < 0) val -= l->lossy; - if (val > 0) val += l->lossy; data[i * step] = data[i * step - step] + val; } data += stride; for (j = 1; j < height; j++) { /* restore left column */ val = loco_get_rice(&rc); - loco_update_rice_param(&rc, val); - if (val < 0) val -= l->lossy; - if (val > 0) val += l->lossy; data[0] = data[-stride] + val; /* restore all other pixels */ for (i = 1; i < width; i++) { val = loco_get_rice(&rc); - loco_update_rice_param(&rc, val); - if (val < 0) val -= l->lossy; - if (val > 0) val += l->lossy; data[i * step] = loco_predict(&data[i * step], stride, step) + val; } data += stride; @@ -302,6 +266,8 @@ av_log(avctx, AV_LOG_INFO, "Unknown colorspace, index = %i\n", l->mode); return -1; } + if(avctx->debug & FF_DEBUG_PICT_INFO) + av_log(avctx, AV_LOG_INFO, "lossy:%i, version:%i, mode: %i\n", l->lossy, version, l->mode); return 0; }