summaryrefslogtreecommitdiff
path: root/vp8/decoder/decodframe.c
diff options
context:
space:
mode:
Diffstat (limited to 'vp8/decoder/decodframe.c')
-rw-r--r--vp8/decoder/decodframe.c62
1 files changed, 32 insertions, 30 deletions
diff --git a/vp8/decoder/decodframe.c b/vp8/decoder/decodframe.c
index 877653290..d375cdd52 100644
--- a/vp8/decoder/decodframe.c
+++ b/vp8/decoder/decodframe.c
@@ -45,13 +45,29 @@ int dec_debug = 0;
#endif
#if CONFIG_NEWUPDATE
+
+static int merge_index(int v, int n, int modulus)
+{
+ int max1 = (n-1 - modulus/2)/modulus + 1;
+ if (v < max1) v = v * modulus + modulus/2;
+ else
+ {
+ int w;
+ v -= max1;
+ w = v;
+ v += (v + modulus-modulus/2)/modulus;
+ while (v%modulus == modulus/2 ||
+ w != v - (v + modulus-modulus/2)/modulus) v++;
+ }
+ return v;
+}
+
static int inv_remap_prob(int v, int m)
{
const int n = 256;
- int i;
- //if (v <= n - 2 - s) v += s; else v = n - 2 - v;
- //v = ((v&240)>>4) | ((v&15)<<4);
- v = (v%15)*17 + (v/15);
+ const int modulus = MODULUS_PARAM;
+ int i, w;
+ v = merge_index(v, n-1, modulus);
if ((m<<1)<=n) {
i = inv_recenter_nonneg(v+1, m);
} else {
@@ -59,6 +75,12 @@ static int inv_remap_prob(int v, int m)
}
return i;
}
+
+static vp8_prob read_prob_diff_update(vp8_reader *const bc, int oldp)
+{
+ int delp = vp8_decode_term_subexp(bc, SUBEXP_PARAM, 255);
+ return (vp8_prob)inv_remap_prob(delp, oldp);
+}
#endif
void vp8cx_init_de_quantizer(VP8D_COMP *pbi)
@@ -811,11 +833,7 @@ static void read_coef_probs3(VP8D_COMP *pbi)
{
vp8_prob *const p = pc->fc.coef_probs [i][j][k] + l;
int u = vp8_read(bc, vp8_coef_update_probs [i][j][k][l]);
- if (u)
- {
- int delp = vp8_decode_term_subexp(bc, SUBEXP_PARAM, 255);
- *p = (vp8_prob)inv_remap_prob(delp, *p);
- }
+ if (u) *p = read_prob_diff_update(bc, *p);
}
}
}
@@ -839,11 +857,7 @@ static void read_coef_probs3(VP8D_COMP *pbi)
{
vp8_prob *const p = pc->fc.coef_probs_8x8 [i][j][k] + l;
int u = vp8_read(bc, vp8_coef_update_probs_8x8 [i][j][k][l]);
- if (u)
- {
- int delp = vp8_decode_term_subexp(bc, SUBEXP_PARAM, 255);
- *p = (vp8_prob)inv_remap_prob(delp, *p);
- }
+ if (u) *p = read_prob_diff_update(bc, *p);
}
}
}
@@ -874,11 +888,7 @@ static void read_coef_probs2(VP8D_COMP *pbi)
{
vp8_prob *const p = pc->fc.coef_probs [i][j][k] + l;
int u = vp8_read(bc, vp8_coef_update_probs [i][j][k][l]);
- if (u)
- {
- int delp = vp8_decode_term_subexp(bc, SUBEXP_PARAM, 255);
- *p = (vp8_prob)inv_remap_prob(delp, *p);
- }
+ if (u) *p = read_prob_diff_update(bc, *p);
}
}
}
@@ -902,11 +912,7 @@ static void read_coef_probs2(VP8D_COMP *pbi)
vp8_prob *const p = pc->fc.coef_probs_8x8 [i][j][k] + l;
int u = vp8_read(bc, vp8_coef_update_probs_8x8 [i][j][k][l]);
- if (u)
- {
- int delp = vp8_decode_term_subexp(bc, SUBEXP_PARAM, 255);
- *p = (vp8_prob)inv_remap_prob(delp, *p);
- }
+ if (u) *p = read_prob_diff_update(bc, *p);
}
}
}
@@ -945,10 +951,7 @@ static void read_coef_probs(VP8D_COMP *pbi)
if (vp8_read(bc, vp8_coef_update_probs [i][j][k][l]))
{
#if CONFIG_NEWUPDATE
- int delp = vp8_decode_term_subexp(bc, SUBEXP_PARAM, 255);
- //printf("delp = %d/%d", *p, delp);
- *p = (vp8_prob)inv_remap_prob(delp, *p);
- //printf("/%d\n", *p);
+ *p = read_prob_diff_update(bc, *p);
#else
*p = (vp8_prob)vp8_read_literal(bc, 8);
#endif
@@ -982,8 +985,7 @@ static void read_coef_probs(VP8D_COMP *pbi)
if (vp8_read(bc, vp8_coef_update_probs_8x8 [i][j][k][l]))
{
#if CONFIG_NEWUPDATE
- int delp = vp8_decode_term_subexp(bc, SUBEXP_PARAM, 255);
- *p = (vp8_prob)inv_remap_prob(delp, *p);
+ *p = read_prob_diff_update(bc, *p);
#else
*p = (vp8_prob)vp8_read_literal(bc, 8);
#endif