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:
parent
3b6d23293c
commit
71977422d1
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user