Update class_cdf table once per frame. Move computing the class_cdf table per coded mv class symbol to computing it only when the probabilities are updated. Change-Id: I6c4a9075817e8ba2e251f0e82436995f08f2ec5c
diff --git a/av1/common/entropymv.c b/av1/common/entropymv.c index b46f2da..b96cc31 100644 --- a/av1/common/entropymv.c +++ b/av1/common/entropymv.c
@@ -50,6 +50,9 @@ // Vertical component 128, // sign { 224, 144, 192, 168, 192, 176, 192, 198, 198, 245 }, // class +#if CONFIG_DAALA_EC + { 0 }, // class_cdf is computed from class in av1_init_mv_probs() +#endif { 216 }, // class0 { 136, 140, 148, 160, 176, 192, 224, 234, 234, 240 }, // bits { { 128, 128, 64 }, { 96, 112, 64 } }, // class0_fp @@ -61,6 +64,9 @@ // Horizontal component 128, // sign { 216, 128, 176, 160, 176, 176, 192, 198, 198, 208 }, // class +#if CONFIG_DAALA_EC + { 0 }, // class_cdf is computed from class in av1_init_mv_probs() +#endif { 208 }, // class0 { 136, 140, 148, 160, 176, 192, 224, 234, 234, 240 }, // bits { { 128, 128, 64 }, { 96, 112, 64 } }, // class0_fp @@ -268,6 +274,10 @@ #if CONFIG_DAALA_EC av1_tree_to_cdf(av1_mv_joint_tree, cm->fc->nmvc.joints, cm->fc->nmvc.joint_cdf); + av1_tree_to_cdf(av1_mv_class_tree, cm->fc->nmvc.comps[0].classes, + cm->fc->nmvc.comps[0].class_cdf); + av1_tree_to_cdf(av1_mv_class_tree, cm->fc->nmvc.comps[1].classes, + cm->fc->nmvc.comps[1].class_cdf); #endif #endif #if CONFIG_GLOBAL_MOTION
diff --git a/av1/common/entropymv.h b/av1/common/entropymv.h index 803a444..c68e634 100644 --- a/av1/common/entropymv.h +++ b/av1/common/entropymv.h
@@ -85,6 +85,9 @@ typedef struct { aom_prob sign; aom_prob classes[MV_CLASSES - 1]; +#if CONFIG_DAALA_EC + aom_cdf_prob class_cdf[MV_CLASSES]; +#endif aom_prob class0[CLASS0_SIZE - 1]; aom_prob bits[MV_OFFSET_BITS]; aom_prob class0_fp[CLASS0_SIZE][MV_FP_SIZE - 1];
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c index dec37f8..4e0398f 100644 --- a/av1/decoder/decodeframe.c +++ b/av1/decoder/decodeframe.c
@@ -219,6 +219,9 @@ update_mv_probs(comp_ctx->classes, MV_CLASSES - 1, r); update_mv_probs(comp_ctx->class0, CLASS0_SIZE - 1, r); update_mv_probs(comp_ctx->bits, MV_OFFSET_BITS, r); +#if CONFIG_DAALA_EC + av1_tree_to_cdf(av1_mv_class_tree, comp_ctx->classes, comp_ctx->class_cdf); +#endif } for (i = 0; i < 2; ++i) {
diff --git a/av1/decoder/decodemv.c b/av1/decoder/decodemv.c index eb909f6..692dc73 100644 --- a/av1/decoder/decodemv.c +++ b/av1/decoder/decodemv.c
@@ -784,7 +784,11 @@ int mag, d, fr, hp; const int sign = aom_read(r, mvcomp->sign, ACCT_STR); const int mv_class = +#if CONFIG_DAALA_EC + aom_read_symbol(r, mvcomp->class_cdf, MV_CLASSES, ACCT_STR); +#else aom_read_tree(r, av1_mv_class_tree, mvcomp->classes, ACCT_STR); +#endif const int class0 = mv_class == MV_CLASS_0; // Integer part
diff --git a/av1/encoder/encodemv.c b/av1/encoder/encodemv.c index 5385d6b..7e5179c 100644 --- a/av1/encoder/encodemv.c +++ b/av1/encoder/encodemv.c
@@ -45,9 +45,13 @@ // Sign aom_write(w, sign, mvcomp->sign); - // Class +// Class +#if CONFIG_DAALA_EC + aom_write_symbol(w, mv_class, mvcomp->class_cdf, MV_CLASSES); +#else av1_write_token(w, av1_mv_class_tree, mvcomp->classes, &mv_class_encodings[mv_class]); +#endif // Integer bits if (mv_class == MV_CLASS_0) { @@ -203,6 +207,9 @@ update_mv(w, comp_counts->sign, &comp->sign, MV_UPDATE_PROB); write_mv_update(av1_mv_class_tree, comp->classes, comp_counts->classes, MV_CLASSES, w); +#if CONFIG_DAALA_EC + av1_tree_to_cdf(av1_mv_class_tree, comp->classes, comp->class_cdf); +#endif write_mv_update(av1_mv_class0_tree, comp->class0, comp_counts->class0, CLASS0_SIZE, w); for (j = 0; j < MV_OFFSET_BITS; ++j)