[NORMATIVE] order_hint_bits_minus1

For the adopted EXPLICIT_ORDER_HINT:

* The number of bits for OrderHint is enforced to be 1, hence
  order_hint_bits_minus1 is signaled;

* Signaling of order_hint_bits_minus1 depends on the value of
  enable_order_hint in the sequence header;

* When enable_order_hint is off, order_hint_bits_minus1 is -1
  by default.

BUG=aomedia:1497

Change-Id: I8164fd75f118aae962172ad6fec1f905438ed6ec
diff --git a/av1/common/mvref_common.c b/av1/common/mvref_common.c
index c80e6d1..21fbca4 100644
--- a/av1/common/mvref_common.c
+++ b/av1/common/mvref_common.c
@@ -1779,7 +1779,7 @@
     ref_frame_info[i].map_idx = map_idx;
     ref_frame_info[i].offset = -1;
 #if CONFIG_EXPLICIT_ORDER_HINT
-    ref_frame_info[i].bits = cm->seq_params.order_hint_bits;
+    ref_frame_info[i].bits = cm->seq_params.order_hint_bits_minus1 + 1;
 #endif
 
     const int buf_idx = cm->ref_frame_map[map_idx];
diff --git a/av1/common/mvref_common.h b/av1/common/mvref_common.h
index 6877268..c94150c 100644
--- a/av1/common/mvref_common.h
+++ b/av1/common/mvref_common.h
@@ -37,22 +37,21 @@
 
 #if CONFIG_EXPLICIT_ORDER_HINT
 static INLINE int get_relative_dist_b(int bits, int a, int b) {
-  // IMDAD: CAN bits EVER ACTUALLY BE 0?
-  // IMDAD: we find that if bits == 1, then sometimes b > (1 << bits) = 2.
+  assert(bits >= 1);
   assert(a >= 0 && a < (1 << bits));
   assert(b >= 0 && b < (1 << bits));
-  if (bits == 0) {
-    return 0;
-  } else {
-    int diff = a - b;
-    int m = 1 << (bits - 1);
-    diff = (diff & (m - 1)) - (diff & m);
-    return diff;
-  }
+
+  int diff = a - b;
+  int m = 1 << (bits - 1);
+  diff = (diff & (m - 1)) - (diff & m);
+  return diff;
 }
 
 static INLINE int get_relative_dist(const AV1_COMMON *cm, int a, int b) {
-  return get_relative_dist_b(cm->seq_params.order_hint_bits, a, b);
+  return cm->seq_params.enable_order_hint
+             ? get_relative_dist_b(cm->seq_params.order_hint_bits_minus1 + 1, a,
+                                   b)
+             : 0;
 }
 #endif
 
diff --git a/av1/common/onyxc_int.h b/av1/common/onyxc_int.h
index 42f2d7f..3f9950b 100644
--- a/av1/common/onyxc_int.h
+++ b/av1/common/onyxc_int.h
@@ -212,7 +212,7 @@
   int mib_size;        // Size of the superblock in units of MI blocks
   int mib_size_log2;   // Log 2 of above.
 #if CONFIG_EXPLICIT_ORDER_HINT
-  int order_hint_bits;
+  int order_hint_bits_minus1;
 #endif
   int force_screen_content_tools;  // 0 - force off
                                    // 1 - force on
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index 551801f..0e641d3 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -2386,7 +2386,8 @@
 #endif
 
 #if CONFIG_EXPLICIT_ORDER_HINT
-  seq_params->order_hint_bits = aom_rb_read_literal(rb, 3);
+  seq_params->order_hint_bits_minus1 =
+      seq_params->enable_order_hint ? aom_rb_read_literal(rb, 3) : -1;
 #endif
 }
 
@@ -2785,7 +2786,8 @@
 #endif  // CONFIG_NO_FRAME_CONTEXT_SIGNALING
 
 #if CONFIG_EXPLICIT_ORDER_HINT
-  cm->frame_offset = aom_rb_read_literal(rb, cm->seq_params.order_hint_bits);
+  cm->frame_offset =
+      aom_rb_read_literal(rb, cm->seq_params.order_hint_bits_minus1 + 1);
   cm->current_video_frame = cm->frame_offset;
 #else
   if (cm->show_frame == 0) {
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index b22396d..44a9976 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -2843,7 +2843,8 @@
 #endif
 
 #if CONFIG_EXPLICIT_ORDER_HINT
-  aom_wb_write_literal(wb, seq_params->order_hint_bits, 3);
+  if (seq_params->enable_order_hint)
+    aom_wb_write_literal(wb, seq_params->order_hint_bits_minus1, 3);
 #endif
 }
 
@@ -3072,8 +3073,8 @@
 #endif  // CONFIG_FRAME_REFS_SIGNALING
 
 #if CONFIG_EXPLICIT_ORDER_HINT
-  aom_wb_write_literal(wb, cm->frame_offset, cm->seq_params.order_hint_bits);
-  // assert(cm->current_video_frame == cm->frame_offset);
+  aom_wb_write_literal(wb, cm->frame_offset,
+                       cm->seq_params.order_hint_bits_minus1 + 1);
 #else
   if (cm->show_frame == 0) {
     int arf_offset = AOMMIN(
diff --git a/av1/encoder/encodeframe.c b/av1/encoder/encodeframe.c
index 80b2e10..0d9c19a 100644
--- a/av1/encoder/encodeframe.c
+++ b/av1/encoder/encodeframe.c
@@ -4382,7 +4382,7 @@
     cm->frame_offset = cm->current_video_frame;
   }
 #if CONFIG_EXPLICIT_ORDER_HINT
-  cm->frame_offset %= (1 << cm->seq_params.order_hint_bits);
+  cm->frame_offset %= (1 << (cm->seq_params.order_hint_bits_minus1 + 1));
 #endif  // CONFIG_EXPLICIT_ORDER_HINT
   av1_setup_frame_buf_refs(cm);
   if (cpi->sf.selective_ref_frame >= 2) enforce_max_ref_frames(cpi);
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index 0005390..0c1a74a 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -2562,7 +2562,7 @@
   cm->allow_filter_intra = 1;
 
 #if CONFIG_EXPLICIT_ORDER_HINT
-  cm->seq_params.order_hint_bits = DEFAULT_EXPLICIT_ORDER_HINT_BITS;
+  cm->seq_params.order_hint_bits_minus1 = DEFAULT_EXPLICIT_ORDER_HINT_BITS - 1;
 #endif  // CONFIG_EXPLICIT_ORDER_HINT
   cm->seq_params.enable_dual_filter = oxcf->enable_dual_filter;
   cm->seq_params.enable_order_hint = oxcf->enable_order_hint;