]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/jpeg_ls.c
revert bad checkin
[ffmpeg] / libavcodec / jpeg_ls.c
index 8dabcc06a8f0da17ffaa26feba596ec5f0ea6796..1b4df2b1a00e8511ba2e2bbe54542546fb1c9114 100644 (file)
@@ -77,9 +77,7 @@ static void ls_init_state(JLSState *state){
         state->limit = (4 * state->bpp) - state->qbpp;
 
     for(i = 0; i < 367; i++) {
-        state->A[i] = (state->range + 32) >> 6;
-        if(state->A[i] < 2)
-            state->A[i] = 2;
+        state->A[i] = FFMAX((state->range + 32) >> 6, 2);
         state->N[i] = 1;
     }
 
@@ -189,6 +187,34 @@ 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]= FFMAX(state->B[Q] + state->N[Q], 1-state->N[Q]);
+        if(state->C[Q] > -128)
+            state->C[Q]--;
+    }else if(state->B[Q] > 0){
+        state->B[Q]= FFMIN(state->B[Q] - state->N[Q], 0);
+        if(state->C[Q] < 127)
+            state->C[Q]++;
+    }
+
+    return err;
+}
 
 /**
  * Get context-dependent Golomb code, decode it and update context
@@ -213,30 +239,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;
 }
@@ -275,12 +278,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;
 }
@@ -386,6 +384,7 @@ static inline void ls_decode_line(JLSState *state, MJpegDecodeContext *s, void *
             pred = clip(pred, 0, state->maxval);
         }
 
+        pred &= state->maxval;
         W(dst, x, pred);
         x += stride;
     }
@@ -522,29 +521,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);
 }
 
 /**
@@ -574,12 +551,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);
 }
 
 /**