1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-11-21 10:55:51 +02:00

factorize update state out

Originally committed as revision 6786 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Michael Niedermayer 2006-10-24 09:34:13 +00:00
parent 3b6d23293c
commit 71977422d1

View File

@ -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);
}
/**