]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/jpeg_ls.c
revert bad checkin
[ffmpeg] / libavcodec / jpeg_ls.c
index cb99b5f519cda9a44e073bbbb1e4c9c7aaef6e83..1b4df2b1a00e8511ba2e2bbe54542546fb1c9114 100644 (file)
@@ -204,17 +204,13 @@ static inline int update_state_regular(JLSState *state, int Q, int err){
     downscale_state(state, Q);
 
     if(state->B[Q] <= -state->N[Q]) {
-        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]--;
-        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];
+        state->B[Q]= FFMIN(state->B[Q] - state->N[Q], 0);
         if(state->C[Q] < 127)
             state->C[Q]++;
-        if(state->B[Q] > 0)
-            state->B[Q] = 0;
     }
 
     return err;
@@ -388,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;
     }
@@ -532,7 +529,7 @@ static inline void ls_encode_regular(JLSState *state, PutBitContext *pb, int Q,
  */
 static inline void ls_encode_runterm(JLSState *state, PutBitContext *pb, int RItype, int err, int limit_add){
     int k;
-    int val;
+    int val, map;
     int Q = 365 + RItype;
     int temp;
 
@@ -540,13 +537,14 @@ static inline void ls_encode_runterm(JLSState *state, PutBitContext *pb, int RIt
     if(RItype)
         temp += state->N[Q] >> 1;
     for(k = 0; (state->N[Q] << k) < temp; k++);
-    if(!k && (2 * state->B[Q] < state->N[Q]))
-        err= -err;
+    map = 0;
+    if(!k && err && (2 * state->B[Q] < state->N[Q]))
+        map = 1;
 
     if(err < 0)
-        val = - (2 * err) - 1 - RItype;
+        val = - (2 * err) - 1 - RItype + map;
     else
-        val = 2 * err - RItype;
+        val = 2 * err - RItype - map;
     set_ur_golomb_jpegls(pb, val, k, state->limit - limit_add - 1, state->qbpp);
 
     if(err < 0)