]> granicus.if.org Git - libvpx/commitdiff
vp10: fix entropy counts for the hp bit.
authorRonald S. Bultje <rsbultje@gmail.com>
Mon, 7 Sep 2015 18:32:28 +0000 (14:32 -0400)
committerRonald S. Bultje <rsbultje@gmail.com>
Mon, 14 Sep 2015 20:13:59 +0000 (16:13 -0400)
The counts didn't take usehp into account, which means that if the
scope of the refmv is too large for the hp bit to be coded, the value
(always 1) is still included in the stats. Therefore, the final
counts will not reflect the entropy of the coded bits, but rather the
entropy of the combination of coded bits and the implied value (which
is always 1). Fix that by only including counts if the hp bit is
actually coded.

See issue 1060.

Change-Id: I19a3adda4a8662a05f08a9e58d7e56ff979be11e

vp10/common/entropymv.c
vp10/common/entropymv.h
vp10/decoder/decodemv.c
vp10/encoder/encodemv.c

index ebf7a079b13106f85f4c8bd77cd1c3a6b32765af..6b99606ffb75d30f6fa891d8951eb09df971a316 100644 (file)
@@ -161,17 +161,19 @@ static void inc_mv_component(int v, nmv_component_counts *comp_counts,
   }
 }
 
-void vp10_inc_mv(const MV *mv, nmv_context_counts *counts) {
+void vp10_inc_mv(const MV *mv, nmv_context_counts *counts, const int usehp) {
   if (counts != NULL) {
     const MV_JOINT_TYPE j = vp10_get_mv_joint(mv);
     ++counts->joints[j];
 
     if (mv_joint_vertical(j)) {
-      inc_mv_component(mv->row, &counts->comps[0], 1, 1);
+      inc_mv_component(mv->row, &counts->comps[0], 1,
+                       !CONFIG_MISC_FIXES || usehp);
     }
 
     if (mv_joint_horizontal(j)) {
-      inc_mv_component(mv->col, &counts->comps[1], 1, 1);
+      inc_mv_component(mv->col, &counts->comps[1], 1,
+                       !CONFIG_MISC_FIXES || usehp);
     }
   }
 }
index fd9f1c0ce7c40c69465925b31fafd7285c06abbb..d1eb95c5798ba41cf4cb16aadf3f44319287a84d 100644 (file)
@@ -124,7 +124,7 @@ typedef struct {
   nmv_component_counts comps[2];
 } nmv_context_counts;
 
-void vp10_inc_mv(const MV *mv, nmv_context_counts *mvctx);
+void vp10_inc_mv(const MV *mv, nmv_context_counts *mvctx, const int usehp);
 
 #ifdef __cplusplus
 }  // extern "C"
index b190f734c65a942665cb4085ccc0154ba3d82013..f157ada20e19116b8f1a3f37b18e492d7b790798 100644 (file)
@@ -294,7 +294,7 @@ static INLINE void read_mv(vpx_reader *r, MV *mv, const MV *ref,
   if (mv_joint_horizontal(joint_type))
     diff.col = read_mv_component(r, &ctx->comps[1], use_hp);
 
-  vp10_inc_mv(&diff, counts);
+  vp10_inc_mv(&diff, counts, use_hp);
 
   mv->row = ref->row + diff.row;
   mv->col = ref->col + diff.col;
index f1fe5a78f83cd32c2058fe2bc68fda8418f71c4f..ca2de1fba358e2457326cce1b73a92a018905284 100644 (file)
@@ -239,7 +239,7 @@ static void inc_mvs(const MB_MODE_INFO *mbmi, const MB_MODE_INFO_EXT *mbmi_ext,
     const MV *ref = &mbmi_ext->ref_mvs[mbmi->ref_frame[i]][0].as_mv;
     const MV diff = {mvs[i].as_mv.row - ref->row,
                      mvs[i].as_mv.col - ref->col};
-    vp10_inc_mv(&diff, counts);
+    vp10_inc_mv(&diff, counts, vp10_use_mv_hp(ref));
   }
 }