summaryrefslogtreecommitdiff
path: root/libavcodec/jpeg_ls.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2006-10-24 09:34:13 +0000
committerMichael Niedermayer <michaelni@gmx.at>2006-10-24 09:34:13 +0000
commit71977422d191e06e0f748ad293f002f9edf673c7 (patch)
treefbe9d9c9a532c26b37d042801b8ba3d2a23753f8 /libavcodec/jpeg_ls.c
parent3b6d23293caf0e909575cdcea89bc1c63112b290 (diff)
factorize update state out
Originally committed as revision 6786 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/jpeg_ls.c')
-rw-r--r--libavcodec/jpeg_ls.c95
1 files changed, 36 insertions, 59 deletions
diff --git a/libavcodec/jpeg_ls.c b/libavcodec/jpeg_ls.c
index b322ab7591..c0ce742c53 100644
--- a/libavcodec/jpeg_ls.c
+++ b/libavcodec/jpeg_ls.c
@@ -187,6 +187,38 @@ static int decode_lse(MJpegDecodeContext *s)
return 0;
}
+static void inline downscale_state(JLSState *state, int Q){
+ if(state->N[Q] == state->reset){
+ state->A[Q] >>=1;
+ state->B[Q] >>=1;
+ state->N[Q] >>=1;
+ }
+ state->N[Q]++;
+}
+
+static inline int update_state_regular(JLSState *state, int Q, int err){
+ state->A[Q] += FFABS(err);
+ err *= state->twonear;
+ state->B[Q] += err;
+
+ downscale_state(state, Q);
+
+ if(state->B[Q] <= -state->N[Q]) {
+ state->B[Q] += state->N[Q];
+ if(state->C[Q] > -128)
+ state->C[Q]--;
+ if(state->B[Q] <= -state->N[Q])
+ state->B[Q] = -state->N[Q] + 1;
+ }else if(state->B[Q] > 0){
+ state->B[Q] -= state->N[Q];
+ if(state->C[Q] < 127)
+ state->C[Q]++;
+ if(state->B[Q] > 0)
+ state->B[Q] = 0;
+ }
+
+ return err;
+}
/**
* Get context-dependent Golomb code, decode it and update context
@@ -211,30 +243,7 @@ static inline int ls_get_code_regular(GetBitContext *gb, JLSState *state, int Q)
if(!state->near && !k && (2 * state->B[Q] <= -state->N[Q]))
ret = -(ret + 1);
- state->A[Q] += FFABS(ret);
- ret *= state->twonear;
- state->B[Q] += ret;
-
- if(state->N[Q] == state->reset) {
- state->A[Q] >>= 1;
- state->B[Q] >>= 1;
- state->N[Q] >>= 1;
- }
- state->N[Q]++;
-
- if(state->B[Q] <= -state->N[Q]) {
- state->B[Q] += state->N[Q];
- if(state->C[Q] > -128)
- state->C[Q]--;
- if(state->B[Q] <= -state->N[Q])
- state->B[Q] = -state->N[Q] + 1;
- }else if(state->B[Q] > 0){
- state->B[Q] -= state->N[Q];
- if(state->C[Q] < 127)
- state->C[Q]++;
- if(state->B[Q] > 0)
- state->B[Q] = 0;
- }
+ ret= update_state_regular(state, Q, ret);
return ret;
}
@@ -273,12 +282,7 @@ static inline int ls_get_code_runterm(GetBitContext *gb, JLSState *state, int RI
/* update state */
state->A[Q] += FFABS(ret) - RItype;
ret *= state->twonear;
- if(state->N[Q] == state->reset){
- state->A[Q] >>=1;
- state->B[Q] >>=1;
- state->N[Q] >>=1;
- }
- state->N[Q]++;
+ downscale_state(state, Q);
return ret;
}
@@ -520,29 +524,7 @@ static inline void ls_encode_regular(JLSState *state, PutBitContext *pb, int Q,
set_ur_golomb_jpegls(pb, val, k, state->limit, state->qbpp);
- state->A[Q] += FFABS(err);
- state->B[Q] += err * state->twonear;
-
- if(state->N[Q] == state->reset) {
- state->A[Q] >>= 1;
- state->B[Q] >>= 1;
- state->N[Q] >>= 1;
- }
- state->N[Q]++;
-
- if(state->B[Q] <= -state->N[Q]) {
- state->B[Q] += state->N[Q];
- if(state->C[Q] > -128)
- state->C[Q]--;
- if(state->B[Q] <= -state->N[Q])
- state->B[Q] = -state->N[Q] + 1;
- }else if(state->B[Q] > 0){
- state->B[Q] -= state->N[Q];
- if(state->C[Q] < 127)
- state->C[Q]++;
- if(state->B[Q] > 0)
- state->B[Q] = 0;
- }
+ update_state_regular(state, Q, err);
}
/**
@@ -572,12 +554,7 @@ static inline void ls_encode_runterm(JLSState *state, PutBitContext *pb, int RIt
state->B[Q]++;
state->A[Q] += (val + 1 - RItype) >> 1;
- if(state->N[Q] == state->reset) {
- state->A[Q] >>= 1;
- state->B[Q] >>= 1;
- state->N[Q] >>= 1;
- }
- state->N[Q]++;
+ downscale_state(state, Q);
}
/**