vp8: fix update_lf_deltas in libavcodec/vp8.c
authorJanne Salonen <jsalonen@google.com>
Mon, 19 Mar 2012 07:35:09 +0000 (09:35 +0200)
committerRonald S. Bultje <rsbultje@gmail.com>
Sat, 24 Mar 2012 15:22:05 +0000 (08:22 -0700)
lf_delta.ref[i] and lf_delta.mode[i] were incorrectly reset to 0 if
specific delta value was not updated. Fixed to keep the previous value
if flag indicates that element in question is not updated.

Signed-off-by: Janne Salonen <jsalonen@google.com>
Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
libavcodec/vp8.c

index 36518d5..6da835b 100644 (file)
@@ -162,11 +162,23 @@ static void update_lf_deltas(VP8Context *s)
     VP56RangeCoder *c = &s->c;
     int i;
 
-    for (i = 0; i < 4; i++)
-        s->lf_delta.ref[i]  = vp8_rac_get_sint(c, 6);
+    for (i = 0; i < 4; i++) {
+        if (vp8_rac_get(c)) {
+            s->lf_delta.ref[i] = vp8_rac_get_uint(c, 6);
+
+            if (vp8_rac_get(c))
+                s->lf_delta.ref[i] = -s->lf_delta.ref[i];
+        }
+    }
+
+    for (i = MODE_I4x4; i <= VP8_MVMODE_SPLIT; i++) {
+        if (vp8_rac_get(c)) {
+            s->lf_delta.mode[i] = vp8_rac_get_uint(c, 6);
 
-    for (i = MODE_I4x4; i <= VP8_MVMODE_SPLIT; i++)
-        s->lf_delta.mode[i] = vp8_rac_get_sint(c, 6);
+            if (vp8_rac_get(c))
+                s->lf_delta.mode[i] = -s->lf_delta.mode[i];
+        }
+    }
 }
 
 static int setup_partitions(VP8Context *s, const uint8_t *buf, int buf_size)