Index: source/libvpx/vp9/decoder/vp9_dsubexp.c |
=================================================================== |
--- source/libvpx/vp9/decoder/vp9_dsubexp.c (revision 251189) |
+++ source/libvpx/vp9/decoder/vp9_dsubexp.c (working copy) |
@@ -19,14 +19,10 @@ |
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 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); |
} |
} |