[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;