ref: 5470e0cfdad67f774d0b3987f155ea00b59292e1
parent: 5437474c54a8ec24b724ca299998bf6725144913
parent: 41d3c989fdbe5406ca155206e271279473d5691f
author: Alex Converse <aconverse@google.com>
date: Mon Feb 3 07:29:52 EST 2014
Merge "Propgate constants through subexp routines."
--- a/vp9/decoder/vp9_dsubexp.c
+++ b/vp9/decoder/vp9_dsubexp.c
@@ -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);
}
}
--- a/vp9/encoder/vp9_subexp.c
+++ b/vp9/encoder/vp9_subexp.c
@@ -18,17 +18,6 @@
static int update_bits[255];
-static int count_uniform(int v, int n) {- int l = get_unsigned_bits(n);
- int m;
- if (l == 0) return 0;
- m = (1 << l) - n;
- if (v < m)
- return l - 1;
- else
- return l;
-}
-
static int split_index(int i, int n, int modulus) {int max1 = (n - 1 - modulus / 2) / modulus + 1;
if (i % modulus == modulus / 2)
@@ -81,29 +70,16 @@
return i;
}
-static int count_term_subexp(int word, int k, int num_syms) {- int count = 0;
- int i = 0;
- int mk = 0;
- while (1) {- int b = (i ? k + i - 1 : k);
- int a = (1 << b);
- if (num_syms <= mk + 3 * a) {- count += count_uniform(word - mk, num_syms - mk);
- break;
- } else {- int t = (word >= mk + a);
- count++;
- if (t) {- i = i + 1;
- mk += a;
- } else {- count += b;
- break;
- }
- }
- }
- return count;
+static int count_term_subexp(int word) {+ if (word < 16)
+ return 5;
+ if (word < 32)
+ return 6;
+ if (word < 64)
+ return 8;
+ if (word < 129)
+ return 10;
+ return 11;
}
static int prob_diff_update_cost(vp9_prob newp, vp9_prob oldp) {@@ -111,12 +87,9 @@
return update_bits[delp] * 256;
}
-static void encode_uniform(vp9_writer *w, int v, int n) {- int l = get_unsigned_bits(n);
- int m;
- if (l == 0)
- return;
- m = (1 << l) - n;
+static void encode_uniform(vp9_writer *w, int v) {+ const int l = 8;
+ const int m = (1 << l) - 191;
if (v < m) {vp9_write_literal(w, v, l - 1);
} else {@@ -125,38 +98,32 @@
}
}
-static void encode_term_subexp(vp9_writer *w, int word, int k, int num_syms) {- int i = 0;
- int mk = 0;
- while (1) {- int b = (i ? k + i - 1 : k);
- int a = (1 << b);
- if (num_syms <= mk + 3 * a) {- encode_uniform(w, word - mk, num_syms - mk);
- break;
- } else {- int t = (word >= mk + a);
- vp9_write_literal(w, t, 1);
- if (t) {- i = i + 1;
- mk += a;
- } else {- vp9_write_literal(w, word - mk, b);
- break;
- }
- }
+static INLINE int write_bit_gte(vp9_writer *w, int word, int test) {+ vp9_write_literal(w, word >= test, 1);
+ return word >= test;
+}
+
+static void encode_term_subexp(vp9_writer *w, int word) {+ if (!write_bit_gte(w, word, 16)) {+ vp9_write_literal(w, word, 4);
+ } else if (!write_bit_gte(w, word, 32)) {+ vp9_write_literal(w, word - 16, 4);
+ } else if (!write_bit_gte(w, word, 64)) {+ vp9_write_literal(w, word - 32, 5);
+ } else {+ encode_uniform(w, word - 64);
}
}
void vp9_write_prob_diff_update(vp9_writer *w, vp9_prob newp, vp9_prob oldp) {const int delp = remap_prob(newp, oldp);
- encode_term_subexp(w, delp, SUBEXP_PARAM, 255);
+ encode_term_subexp(w, delp);
}
void vp9_compute_update_table() {int i;
for (i = 0; i < 254; i++)
- update_bits[i] = count_term_subexp(i, SUBEXP_PARAM, 255);
+ update_bits[i] = count_term_subexp(i);
}
int vp9_prob_diff_update_savings_search(const unsigned int *ct,
--
⑨