Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / third_party / libvpx / source / libvpx / vp9 / decoder / vp9_dsubexp.c
index fcca017..e67b372 100644 (file)
@@ -19,14 +19,10 @@ static int inv_recenter_nonneg(int v, int m) {
   return v % 2 ? m - (v + 1) / 2 : m + v / 2;
 }
 
-static int decode_uniform(vp9_reader *r, int n) {
-  int v;
-  const int l = get_unsigned_bits(n);
-  const int m = (1 << l) - n;
-  if (!l)
-    return 0;
-
-  v = vp9_read_literal(r, l - 1);
+static int decode_uniform(vp9_reader *r) {
+  const int l = 8;
+  const int m = (1 << l) - 191;
+  const int v = vp9_read_literal(r, l - 1);
   return v < m ?  v : (v << 1) - m + vp9_read_bit(r);
 }
 
@@ -78,30 +74,19 @@ static int inv_remap_prob(int v, int m) {
   }
 }
 
-static int decode_term_subexp(vp9_reader *r, int k, int num_syms) {
-  int i = 0, mk = 0, word;
-  while (1) {
-    const int b = i ? k + i - 1 : k;
-    const int a = 1 << b;
-    if (num_syms <= mk + 3 * a) {
-      word = decode_uniform(r, num_syms - mk) + mk;
-      break;
-    } else {
-      if (vp9_read_bit(r)) {
-        i++;
-        mk += a;
-      } else {
-        word = vp9_read_literal(r, b) + mk;
-        break;
-      }
-    }
-  }
-  return word;
+static int decode_term_subexp(vp9_reader *r) {
+  if (!vp9_read_bit(r))
+    return vp9_read_literal(r, 4);
+  if (!vp9_read_bit(r))
+    return vp9_read_literal(r, 4) + 16;
+  if (!vp9_read_bit(r))
+    return vp9_read_literal(r, 5) + 32;
+  return decode_uniform(r) + 64;
 }
 
 void vp9_diff_update_prob(vp9_reader *r, vp9_prob* p) {
   if (vp9_read(r, DIFF_UPDATE_PROB)) {
-    const int delp = decode_term_subexp(r, SUBEXP_PARAM, 255);
+    const int delp = decode_term_subexp(r);
     *p = (vp9_prob)inv_remap_prob(delp, *p);
   }
 }