Add sequence (kf) level flag for reference buffer
Allows saving bits when reference buffer is not to be used in
cases where error resilience is unimportant.
Change-Id: I2ef002a7cce96a158e1e58c2b00f0a6846049fff
diff --git a/av1/av1_cx_iface.c b/av1/av1_cx_iface.c
index ec35ef2..40160b9 100644
--- a/av1/av1_cx_iface.c
+++ b/av1/av1_cx_iface.c
@@ -1286,11 +1286,13 @@
&dst_time_stamp, &dst_end_time_stamp,
!img)) {
#if CONFIG_REFERENCE_BUFFER
- if (cpi->common.invalid_delta_frame_id_minus1) {
- ctx->base.err_detail = "Invalid delta_frame_id_minus1";
- return AOM_CODEC_ERROR;
+ if (cpi->common.use_reference_buffer) {
+ if (cpi->common.invalid_delta_frame_id_minus1) {
+ ctx->base.err_detail = "Invalid delta_frame_id_minus1";
+ return AOM_CODEC_ERROR;
+ }
}
-#endif
+#endif // CONFIG_REFERENCE_BUFFER
if (frame_size) {
if (ctx->pending_cx_data == 0) ctx->pending_cx_data = cx_data;
diff --git a/av1/av1_dx_iface.c b/av1/av1_dx_iface.c
index 5247060..3f15e0e 100644
--- a/av1/av1_dx_iface.c
+++ b/av1/av1_dx_iface.c
@@ -242,7 +242,6 @@
si->is_kf = 1;
intra_only_flag = 1;
si->h = 1;
-
#else
int show_frame;
int error_resilient;
@@ -273,29 +272,38 @@
si->is_kf = !aom_rb_read_bit(&rb);
show_frame = aom_rb_read_bit(&rb);
+ if (!si->is_kf) {
+ if (!show_frame) intra_only_flag = show_frame ? 0 : aom_rb_read_bit(&rb);
+ }
error_resilient = aom_rb_read_bit(&rb);
#if CONFIG_REFERENCE_BUFFER
- {
+ int use_reference_buffer = 1;
+ SequenceHeader seq_params = { 0, 0, 0 };
+ if (si->is_kf) {
/* TODO: Move outside frame loop or inside key-frame branch */
- int frame_id_len;
- SequenceHeader seq_params;
- read_sequence_header(&seq_params);
+ use_reference_buffer = aom_rb_read_bit(&rb);
+ if (use_reference_buffer) {
+ read_sequence_header(&seq_params);
#if CONFIG_EXT_TILE
- if (large_scale_tile) seq_params.frame_id_numbers_present_flag = 0;
+ if (large_scale_tile) seq_params.frame_id_numbers_present_flag = 0;
#endif // CONFIG_EXT_TILE
+ }
+ }
+#endif // CONFIG_REFERENCE_BUFFER
+#if CONFIG_REFERENCE_BUFFER
+ if (use_reference_buffer) {
+ int frame_id_len;
if (seq_params.frame_id_numbers_present_flag) {
frame_id_len = seq_params.frame_id_length_minus7 + 7;
aom_rb_read_literal(&rb, frame_id_len);
}
}
-#endif
+#endif // CONFIG_REFERENCE_BUFFER
if (si->is_kf) {
if (!parse_bitdepth_colorspace_sampling(profile, &rb))
return AOM_CODEC_UNSUP_BITSTREAM;
av1_read_frame_size(&rb, (int *)&si->w, (int *)&si->h);
} else {
- intra_only_flag = show_frame ? 0 : aom_rb_read_bit(&rb);
-
rb.bit_offset += error_resilient ? 0 : 2; // reset_frame_context
if (intra_only_flag) {
@@ -307,7 +315,7 @@
av1_read_frame_size(&rb, (int *)&si->w, (int *)&si->h);
}
}
-#endif
+#endif // CONFIG_OBU
}
if (is_intra_only != NULL) *is_intra_only = intra_only_flag;
return AOM_CODEC_OK;
diff --git a/av1/common/onyxc_int.h b/av1/common/onyxc_int.h
index b6e319f..e162269 100644
--- a/av1/common/onyxc_int.h
+++ b/av1/common/onyxc_int.h
@@ -64,7 +64,7 @@
#define FRAME_ID_NUMBERS_PRESENT_FLAG 1
#define FRAME_ID_LENGTH_MINUS7 8 // Allows frame id up to 2^15-1
#define DELTA_FRAME_ID_LENGTH_MINUS2 12 // Allows frame id deltas up to 2^14-1
-#endif
+#endif // CONFIG_REFERENCE_BUFFER
#if CONFIG_NO_FRAME_CONTEXT_SIGNALING
#define FRAME_CONTEXTS (FRAME_BUFFERS + 1)
@@ -508,12 +508,13 @@
#endif
int num_tg;
#if CONFIG_REFERENCE_BUFFER
+ int use_reference_buffer;
int current_frame_id;
int ref_frame_id[REF_FRAMES];
int valid_for_referencing[REF_FRAMES];
int refresh_mask;
int invalid_delta_frame_id_minus1;
-#endif
+#endif // CONFIG_REFERENCE_BUFFER
#if CONFIG_ANS && ANS_MAX_SYMBOLS
int ans_window_size_log2;
#endif
@@ -535,7 +536,7 @@
int frame_id_length_minus7;
int delta_frame_id_length_minus2;
} SequenceHeader;
-#endif
+#endif // CONFIG_REFERENCE_BUFFER
// TODO(hkuang): Don't need to lock the whole pool after implementing atomic
// frame reference count.
@@ -1276,6 +1277,10 @@
return base_partitions[split_idx];
}
+static INLINE void set_use_reference_buffer(AV1_COMMON *const cm, int use) {
+ cm->use_reference_buffer = use;
+}
+
static INLINE void set_sb_size(AV1_COMMON *const cm, BLOCK_SIZE sb_size) {
cm->sb_size = sb_size;
cm->mib_size = mi_size_wide[cm->sb_size];
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index f081a40..fa5742d 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -4386,7 +4386,7 @@
seq_params->frame_id_length_minus7 = FRAME_ID_LENGTH_MINUS7;
seq_params->delta_frame_id_length_minus2 = DELTA_FRAME_ID_LENGTH_MINUS2;
}
-#endif
+#endif // CONFIG_REFERENCE_BUFFER
#if CONFIG_EXT_INTER
static void read_compound_tools(AV1_COMMON *cm,
@@ -4591,13 +4591,6 @@
int i, mask, ref_index = 0;
size_t sz;
-#if !CONFIG_OBU
-#if CONFIG_REFERENCE_BUFFER
- /* TODO: Move outside frame loop or inside key-frame branch */
- read_sequence_header(&pbi->seq_params);
-#endif
-#endif
-
cm->last_frame_type = cm->frame_type;
cm->last_intra_only = cm->intra_only;
@@ -4635,15 +4628,17 @@
const int existing_frame_idx = aom_rb_read_literal(rb, 3);
const int frame_to_show = cm->ref_frame_map[existing_frame_idx];
#if CONFIG_REFERENCE_BUFFER
- if (pbi->seq_params.frame_id_numbers_present_flag) {
- int frame_id_length = pbi->seq_params.frame_id_length_minus7 + 7;
- int display_frame_id = aom_rb_read_literal(rb, frame_id_length);
- /* Compare display_frame_id with ref_frame_id and check valid for
- * referencing */
- if (display_frame_id != cm->ref_frame_id[existing_frame_idx] ||
- cm->valid_for_referencing[existing_frame_idx] == 0)
- aom_internal_error(&cm->error, AOM_CODEC_CORRUPT_FRAME,
- "Reference buffer frame ID mismatch");
+ if (cm->use_reference_buffer) {
+ if (pbi->seq_params.frame_id_numbers_present_flag) {
+ int frame_id_length = pbi->seq_params.frame_id_length_minus7 + 7;
+ int display_frame_id = aom_rb_read_literal(rb, frame_id_length);
+ /* Compare display_frame_id with ref_frame_id and check valid for
+ * referencing */
+ if (display_frame_id != cm->ref_frame_id[existing_frame_idx] ||
+ cm->valid_for_referencing[existing_frame_idx] == 0)
+ aom_internal_error(&cm->error, AOM_CODEC_CORRUPT_FRAME,
+ "Reference buffer frame ID mismatch");
+ }
}
#endif
lock_buffer_pool(pool);
@@ -4675,54 +4670,65 @@
#if !CONFIG_OBU
cm->frame_type = (FRAME_TYPE)aom_rb_read_bit(rb);
+ cm->show_frame = aom_rb_read_bit(rb);
+ if (cm->frame_type != KEY_FRAME)
+ cm->intra_only = cm->show_frame ? 0 : aom_rb_read_bit(rb);
#else
cm->frame_type = (FRAME_TYPE)aom_rb_read_literal(rb, 2); // 2 bits
+ cm->show_frame = aom_rb_read_bit(rb);
cm->intra_only = cm->frame_type == INTRA_ONLY_FRAME;
#endif
- cm->show_frame = aom_rb_read_bit(rb);
cm->error_resilient_mode = aom_rb_read_bit(rb);
#if CONFIG_REFERENCE_BUFFER
- if (pbi->seq_params.frame_id_numbers_present_flag) {
- int frame_id_length = pbi->seq_params.frame_id_length_minus7 + 7;
- int diff_len = pbi->seq_params.delta_frame_id_length_minus2 + 2;
- int prev_frame_id = 0;
- if (cm->frame_type != KEY_FRAME) {
- prev_frame_id = cm->current_frame_id;
- }
- cm->current_frame_id = aom_rb_read_literal(rb, frame_id_length);
+ if (cm->frame_type == KEY_FRAME) {
+ cm->use_reference_buffer = aom_rb_read_bit(rb);
+#if !CONFIG_OBU
+ read_sequence_header(&pbi->seq_params);
+#endif // !CONFIG_OBU
+ }
+ if (cm->use_reference_buffer) {
+ if (pbi->seq_params.frame_id_numbers_present_flag) {
+ int frame_id_length = pbi->seq_params.frame_id_length_minus7 + 7;
+ int diff_len = pbi->seq_params.delta_frame_id_length_minus2 + 2;
+ int prev_frame_id = 0;
+ if (cm->frame_type != KEY_FRAME) {
+ prev_frame_id = cm->current_frame_id;
+ }
+ cm->current_frame_id = aom_rb_read_literal(rb, frame_id_length);
- if (cm->frame_type != KEY_FRAME) {
- int diff_frame_id;
- if (cm->current_frame_id > prev_frame_id) {
- diff_frame_id = cm->current_frame_id - prev_frame_id;
- } else {
- diff_frame_id =
- (1 << frame_id_length) + cm->current_frame_id - prev_frame_id;
+ if (cm->frame_type != KEY_FRAME) {
+ int diff_frame_id;
+ if (cm->current_frame_id > prev_frame_id) {
+ diff_frame_id = cm->current_frame_id - prev_frame_id;
+ } else {
+ diff_frame_id =
+ (1 << frame_id_length) + cm->current_frame_id - prev_frame_id;
+ }
+ /* Check current_frame_id for conformance */
+ if (prev_frame_id == cm->current_frame_id ||
+ diff_frame_id >= (1 << (frame_id_length - 1))) {
+ aom_internal_error(&cm->error, AOM_CODEC_CORRUPT_FRAME,
+ "Invalid value of current_frame_id");
+ }
}
- /* Check current_frame_id for conformance */
- if (prev_frame_id == cm->current_frame_id ||
- diff_frame_id >= (1 << (frame_id_length - 1))) {
- aom_internal_error(&cm->error, AOM_CODEC_CORRUPT_FRAME,
- "Invalid value of current_frame_id");
- }
- }
- /* Check if some frames need to be marked as not valid for referencing */
- for (i = 0; i < REF_FRAMES; i++) {
- if (cm->frame_type == KEY_FRAME) {
- cm->valid_for_referencing[i] = 0;
- } else if (cm->current_frame_id - (1 << diff_len) > 0) {
- if (cm->ref_frame_id[i] > cm->current_frame_id ||
- cm->ref_frame_id[i] < cm->current_frame_id - (1 << diff_len))
+ /* Check if some frames need to be marked as not valid for referencing */
+ for (i = 0; i < REF_FRAMES; i++) {
+ if (cm->frame_type == KEY_FRAME) {
cm->valid_for_referencing[i] = 0;
- } else {
- if (cm->ref_frame_id[i] > cm->current_frame_id &&
- cm->ref_frame_id[i] <
- (1 << frame_id_length) + cm->current_frame_id - (1 << diff_len))
- cm->valid_for_referencing[i] = 0;
+ } else if (cm->current_frame_id - (1 << diff_len) > 0) {
+ if (cm->ref_frame_id[i] > cm->current_frame_id ||
+ cm->ref_frame_id[i] < cm->current_frame_id - (1 << diff_len))
+ cm->valid_for_referencing[i] = 0;
+ } else {
+ if (cm->ref_frame_id[i] > cm->current_frame_id &&
+ cm->ref_frame_id[i] < (1 << frame_id_length) +
+ cm->current_frame_id - (1 << diff_len))
+ cm->valid_for_referencing[i] = 0;
+ }
}
}
}
-#endif
+#endif // CONFIG_REFERENCE_BUFFER
if (cm->frame_type == KEY_FRAME) {
#if !CONFIG_OBU
read_bitdepth_colorspace_sampling(cm, rb, pbi->allow_lowbitdepth);
@@ -4763,9 +4769,6 @@
cm->use_prev_frame_mvs = 0;
#endif
} else {
-#if !CONFIG_OBU
- cm->intra_only = cm->show_frame ? 0 : aom_rb_read_bit(rb);
-#endif
if (cm->intra_only) cm->allow_screen_content_tools = aom_rb_read_bit(rb);
#if CONFIG_TEMPMV_SIGNALING
if (cm->intra_only || cm->error_resilient_mode) cm->use_prev_frame_mvs = 0;
@@ -4838,22 +4841,24 @@
cm->ref_frame_sign_bias[LAST_FRAME + i] = aom_rb_read_bit(rb);
#endif
#if CONFIG_REFERENCE_BUFFER
- if (pbi->seq_params.frame_id_numbers_present_flag) {
- int frame_id_length = pbi->seq_params.frame_id_length_minus7 + 7;
- int diff_len = pbi->seq_params.delta_frame_id_length_minus2 + 2;
- int delta_frame_id_minus1 = aom_rb_read_literal(rb, diff_len);
- int ref_frame_id =
- ((cm->current_frame_id - (delta_frame_id_minus1 + 1) +
- (1 << frame_id_length)) %
- (1 << frame_id_length));
- /* Compare values derived from delta_frame_id_minus1 and
- * refresh_frame_flags. Also, check valid for referencing */
- if (ref_frame_id != cm->ref_frame_id[ref] ||
- cm->valid_for_referencing[ref] == 0)
- aom_internal_error(&cm->error, AOM_CODEC_CORRUPT_FRAME,
- "Reference buffer frame ID mismatch");
+ if (cm->use_reference_buffer) {
+ if (pbi->seq_params.frame_id_numbers_present_flag) {
+ int frame_id_length = pbi->seq_params.frame_id_length_minus7 + 7;
+ int diff_len = pbi->seq_params.delta_frame_id_length_minus2 + 2;
+ int delta_frame_id_minus1 = aom_rb_read_literal(rb, diff_len);
+ int ref_frame_id =
+ ((cm->current_frame_id - (delta_frame_id_minus1 + 1) +
+ (1 << frame_id_length)) %
+ (1 << frame_id_length));
+ /* Compare values derived from delta_frame_id_minus1 and
+ * refresh_frame_flags. Also, check valid for referencing */
+ if (ref_frame_id != cm->ref_frame_id[ref] ||
+ cm->valid_for_referencing[ref] == 0)
+ aom_internal_error(&cm->error, AOM_CODEC_CORRUPT_FRAME,
+ "Reference buffer frame ID mismatch");
+ }
}
-#endif
+#endif // CONFIG_REFERENCE_BUFFER
}
#if CONFIG_VAR_REFS
@@ -4914,19 +4919,21 @@
#endif
#if CONFIG_REFERENCE_BUFFER
- if (pbi->seq_params.frame_id_numbers_present_flag) {
- /* If bitmask is set, update reference frame id values and
- mark frames as valid for reference */
- int refresh_frame_flags =
- cm->frame_type == KEY_FRAME ? 0xFF : pbi->refresh_frame_flags;
- for (i = 0; i < REF_FRAMES; i++) {
- if ((refresh_frame_flags >> i) & 1) {
- cm->ref_frame_id[i] = cm->current_frame_id;
- cm->valid_for_referencing[i] = 1;
+ if (cm->use_reference_buffer) {
+ if (pbi->seq_params.frame_id_numbers_present_flag) {
+ /* If bitmask is set, update reference frame id values and
+ mark frames as valid for reference */
+ int refresh_frame_flags =
+ cm->frame_type == KEY_FRAME ? 0xFF : pbi->refresh_frame_flags;
+ for (i = 0; i < REF_FRAMES; i++) {
+ if ((refresh_frame_flags >> i) & 1) {
+ cm->ref_frame_id[i] = cm->current_frame_id;
+ cm->valid_for_referencing[i] = 1;
+ }
}
}
}
-#endif
+#endif // CONFIG_REFERENCE_BUFFER
get_frame_new_buffer(cm)->bit_depth = cm->bit_depth;
get_frame_new_buffer(cm)->color_space = cm->color_space;
diff --git a/av1/decoder/decoder.h b/av1/decoder/decoder.h
index 5128006..9a5dbb1 100644
--- a/av1/decoder/decoder.h
+++ b/av1/decoder/decoder.h
@@ -142,7 +142,7 @@
int tg_size_bit_offset;
#if CONFIG_REFERENCE_BUFFER
SequenceHeader seq_params;
-#endif
+#endif // CONFIG_REFERENCE_BUFFER
#if CONFIG_INSPECTION
aom_inspect_cb inspect_cb;
void *inspect_ctx;
diff --git a/av1/encoder/bitstream.c b/av1/encoder/bitstream.c
index 00961e9..c8fa96b 100644
--- a/av1/encoder/bitstream.c
+++ b/av1/encoder/bitstream.c
@@ -4331,7 +4331,7 @@
seq_params->frame_id_length_minus7 = FRAME_ID_LENGTH_MINUS7;
seq_params->delta_frame_id_length_minus2 = DELTA_FRAME_ID_LENGTH_MINUS2;
}
-#endif
+#endif // CONFIG_REFERENCE_BUFFER
static void write_sb_size(const AV1_COMMON *cm,
struct aom_write_bit_buffer *wb) {
@@ -4495,15 +4495,6 @@
AV1_COMMON *const cm = &cpi->common;
MACROBLOCKD *const xd = &cpi->td.mb.e_mbd;
-#if CONFIG_REFERENCE_BUFFER
- /* TODO: Move outside frame loop or inside key-frame branch */
- write_sequence_header(
-#if CONFIG_EXT_TILE
- cm,
-#endif // CONFIG_EXT_TILE
- &cpi->seq_params);
-#endif
-
aom_wb_write_literal(wb, AOM_FRAME_MARKER, 2);
write_profile(cm->profile, wb);
@@ -4531,16 +4522,18 @@
aom_wb_write_literal(wb, cpi->existing_fb_idx_to_show, 3);
#if CONFIG_REFERENCE_BUFFER
- if (cpi->seq_params.frame_id_numbers_present_flag) {
- int frame_id_len = cpi->seq_params.frame_id_length_minus7 + 7;
- int display_frame_id = cm->ref_frame_id[cpi->existing_fb_idx_to_show];
- aom_wb_write_literal(wb, display_frame_id, frame_id_len);
- /* Add a zero byte to prevent emulation of superframe marker */
- /* Same logic as when when terminating the entropy coder */
- /* Consider to have this logic only one place */
- aom_wb_write_literal(wb, 0, 8);
+ if (cm->use_reference_buffer) {
+ if (cpi->seq_params.frame_id_numbers_present_flag) {
+ int frame_id_len = cpi->seq_params.frame_id_length_minus7 + 7;
+ int display_frame_id = cm->ref_frame_id[cpi->existing_fb_idx_to_show];
+ aom_wb_write_literal(wb, display_frame_id, frame_id_len);
+ /* Add a zero byte to prevent emulation of superframe marker */
+ /* Same logic as when when terminating the entropy coder */
+ /* Consider to have this logic only one place */
+ aom_wb_write_literal(wb, 0, 8);
+ }
}
-#endif
+#endif // CONFIG_REFERENCE_BUFFER
return;
} else {
@@ -4552,16 +4545,31 @@
aom_wb_write_bit(wb, cm->frame_type);
aom_wb_write_bit(wb, cm->show_frame);
+ if (cm->frame_type != KEY_FRAME)
+ if (!cm->show_frame) aom_wb_write_bit(wb, cm->intra_only);
aom_wb_write_bit(wb, cm->error_resilient_mode);
+ if (cm->frame_type == KEY_FRAME) {
#if CONFIG_REFERENCE_BUFFER
- cm->invalid_delta_frame_id_minus1 = 0;
- if (cpi->seq_params.frame_id_numbers_present_flag) {
- int frame_id_len = cpi->seq_params.frame_id_length_minus7 + 7;
- aom_wb_write_literal(wb, cm->current_frame_id, frame_id_len);
+ aom_wb_write_bit(wb, cm->use_reference_buffer);
+ if (cm->use_reference_buffer) {
+ write_sequence_header(
+#if CONFIG_EXT_TILE
+ cm,
+#endif // CONFIG_EXT_TILE
+ &cpi->seq_params);
+ }
+#endif // CONFIG_REFERENCE_BUFFER
}
-#endif
-
+#if CONFIG_REFERENCE_BUFFER
+ if (cm->use_reference_buffer) {
+ cm->invalid_delta_frame_id_minus1 = 0;
+ if (cpi->seq_params.frame_id_numbers_present_flag) {
+ int frame_id_len = cpi->seq_params.frame_id_length_minus7 + 7;
+ aom_wb_write_literal(wb, cm->current_frame_id, frame_id_len);
+ }
+ }
+#endif // CONFIG_REFERENCE_BUFFER
if (cm->frame_type == KEY_FRAME) {
write_bitdepth_colorspace_sampling(cm, wb);
write_frame_size(cm, wb);
@@ -4584,7 +4592,6 @@
}
#endif
} else {
- if (!cm->show_frame) aom_wb_write_bit(wb, cm->intra_only);
if (cm->intra_only) aom_wb_write_bit(wb, cm->allow_screen_content_tools);
#if !CONFIG_NO_FRAME_CONTEXT_SIGNALING
if (!cm->error_resilient_mode) {
@@ -4642,21 +4649,23 @@
REF_FRAMES_LOG2);
aom_wb_write_bit(wb, cm->ref_frame_sign_bias[ref_frame]);
#if CONFIG_REFERENCE_BUFFER
- if (cpi->seq_params.frame_id_numbers_present_flag) {
- int i = get_ref_frame_map_idx(cpi, ref_frame);
- int frame_id_len = cpi->seq_params.frame_id_length_minus7 + 7;
- int diff_len = cpi->seq_params.delta_frame_id_length_minus2 + 2;
- int delta_frame_id_minus1 =
- ((cm->current_frame_id - cm->ref_frame_id[i] +
- (1 << frame_id_len)) %
- (1 << frame_id_len)) -
- 1;
- if (delta_frame_id_minus1 < 0 ||
- delta_frame_id_minus1 >= (1 << diff_len))
- cm->invalid_delta_frame_id_minus1 = 1;
- aom_wb_write_literal(wb, delta_frame_id_minus1, diff_len);
+ if (cm->use_reference_buffer) {
+ if (cpi->seq_params.frame_id_numbers_present_flag) {
+ int i = get_ref_frame_map_idx(cpi, ref_frame);
+ int frame_id_len = cpi->seq_params.frame_id_length_minus7 + 7;
+ int diff_len = cpi->seq_params.delta_frame_id_length_minus2 + 2;
+ int delta_frame_id_minus1 =
+ ((cm->current_frame_id - cm->ref_frame_id[i] +
+ (1 << frame_id_len)) %
+ (1 << frame_id_len)) -
+ 1;
+ if (delta_frame_id_minus1 < 0 ||
+ delta_frame_id_minus1 >= (1 << diff_len))
+ cm->invalid_delta_frame_id_minus1 = 1;
+ aom_wb_write_literal(wb, delta_frame_id_minus1, diff_len);
+ }
}
-#endif
+#endif // CONFIG_REFERENCE_BUFFER
}
#if CONFIG_FRAME_SIZE
@@ -4702,8 +4711,11 @@
#endif
#if CONFIG_REFERENCE_BUFFER
- cm->refresh_mask = cm->frame_type == KEY_FRAME ? 0xFF : get_refresh_mask(cpi);
-#endif
+ if (cm->use_reference_buffer) {
+ cm->refresh_mask =
+ cm->frame_type == KEY_FRAME ? 0xFF : get_refresh_mask(cpi);
+ }
+#endif // CONFIG_REFERENCE_BUFFER
if (!cm->error_resilient_mode) {
aom_wb_write_bit(
@@ -4811,16 +4823,18 @@
aom_wb_write_literal(wb, cpi->existing_fb_idx_to_show, 3);
#if CONFIG_REFERENCE_BUFFER
- if (cpi->seq_params.frame_id_numbers_present_flag) {
- int frame_id_len = cpi->seq_params.frame_id_length_minus7 + 7;
- int display_frame_id = cm->ref_frame_id[cpi->existing_fb_idx_to_show];
- aom_wb_write_literal(wb, display_frame_id, frame_id_len);
- /* Add a zero byte to prevent emulation of superframe marker */
- /* Same logic as when when terminating the entropy coder */
- /* Consider to have this logic only one place */
- aom_wb_write_literal(wb, 0, 8);
+ if (cm->use_reference_buffer) {
+ if (cpi->seq_params.frame_id_numbers_present_flag) {
+ int frame_id_len = cpi->seq_params.frame_id_length_minus7 + 7;
+ int display_frame_id = cm->ref_frame_id[cpi->existing_fb_idx_to_show];
+ aom_wb_write_literal(wb, display_frame_id, frame_id_len);
+ /* Add a zero byte to prevent emulation of superframe marker */
+ /* Same logic as when when terminating the entropy coder */
+ /* Consider to have this logic only one place */
+ aom_wb_write_literal(wb, 0, 8);
+ }
}
-#endif
+#endif // CONFIG_REFERENCE_BUFFER
return;
} else {
@@ -4839,13 +4853,20 @@
aom_wb_write_bit(wb, cm->error_resilient_mode);
#if CONFIG_REFERENCE_BUFFER
- cm->invalid_delta_frame_id_minus1 = 0;
- if (cpi->seq_params.frame_id_numbers_present_flag) {
- int frame_id_len = cpi->seq_params.frame_id_length_minus7 + 7;
- aom_wb_write_literal(wb, cm->current_frame_id, frame_id_len);
+ if (cm->frame_type == KEY_FRAME) {
+ aom_wb_write_bit(wb, cm->use_reference_buffer);
}
-#endif
+#endif // CONFIG_REFERENCE_BUFFER
+#if CONFIG_REFERENCE_BUFFER
+ if (cm->use_reference_buffer) {
+ cm->invalid_delta_frame_id_minus1 = 0;
+ if (cpi->seq_params.frame_id_numbers_present_flag) {
+ int frame_id_len = cpi->seq_params.frame_id_length_minus7 + 7;
+ aom_wb_write_literal(wb, cm->current_frame_id, frame_id_len);
+ }
+ }
+#endif // CONFIG_REFERENCE_BUFFER
if (cm->frame_type == KEY_FRAME) {
write_frame_size(cm, wb);
write_sb_size(cm, wb);
@@ -4896,7 +4917,6 @@
}
} else if (cm->frame_type == INTER_FRAME) {
MV_REFERENCE_FRAME ref_frame;
-
#if !CONFIG_NO_FRAME_CONTEXT_SIGNALING
if (!cm->error_resilient_mode) {
aom_wb_write_bit(wb, cm->reset_frame_context != RESET_FRAME_CONTEXT_NONE);
@@ -4927,21 +4947,23 @@
REF_FRAMES_LOG2);
aom_wb_write_bit(wb, cm->ref_frame_sign_bias[ref_frame]);
#if CONFIG_REFERENCE_BUFFER
- if (cpi->seq_params.frame_id_numbers_present_flag) {
- int i = get_ref_frame_map_idx(cpi, ref_frame);
- int frame_id_len = cpi->seq_params.frame_id_length_minus7 + 7;
- int diff_len = cpi->seq_params.delta_frame_id_length_minus2 + 2;
- int delta_frame_id_minus1 =
- ((cm->current_frame_id - cm->ref_frame_id[i] +
- (1 << frame_id_len)) %
- (1 << frame_id_len)) -
- 1;
- if (delta_frame_id_minus1 < 0 ||
- delta_frame_id_minus1 >= (1 << diff_len))
- cm->invalid_delta_frame_id_minus1 = 1;
- aom_wb_write_literal(wb, delta_frame_id_minus1, diff_len);
+ if (cm->use_reference_buffer) {
+ if (cpi->seq_params.frame_id_numbers_present_flag) {
+ int i = get_ref_frame_map_idx(cpi, ref_frame);
+ int frame_id_len = cpi->seq_params.frame_id_length_minus7 + 7;
+ int diff_len = cpi->seq_params.delta_frame_id_length_minus2 + 2;
+ int delta_frame_id_minus1 =
+ ((cm->current_frame_id - cm->ref_frame_id[i] +
+ (1 << frame_id_len)) %
+ (1 << frame_id_len)) -
+ 1;
+ if (delta_frame_id_minus1 < 0 ||
+ delta_frame_id_minus1 >= (1 << diff_len))
+ cm->invalid_delta_frame_id_minus1 = 1;
+ aom_wb_write_literal(wb, delta_frame_id_minus1, diff_len);
+ }
}
-#endif
+#endif // CONFIG_REFERENCE_BUFFER
}
#if CONFIG_FRAME_SIZE
@@ -5008,7 +5030,7 @@
cm->invalid_delta_frame_id_minus1 = 1;
aom_wb_write_literal(wb, delta_frame_id_minus1, diff_len);
}
-#endif
+#endif // CONFIG_REFERENCE_BUFFER
}
#if CONFIG_FRAME_SIZE
@@ -5048,8 +5070,11 @@
#endif
#if CONFIG_REFERENCE_BUFFER
- cm->refresh_mask = cm->frame_type == KEY_FRAME ? 0xFF : get_refresh_mask(cpi);
-#endif
+ if (cm->use_reference_buffer) {
+ cm->refresh_mask =
+ cm->frame_type == KEY_FRAME ? 0xFF : get_refresh_mask(cpi);
+ }
+#endif // CONFIG_REFERENCE_BUFFER
if (!cm->error_resilient_mode) {
aom_wb_write_bit(
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index c102e4d..eaba711 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -368,6 +368,9 @@
cpi->refresh_alt_ref_frame = 1;
av1_zero(cpi->interp_filter_selected);
set_sb_size(cm, select_sb_size(cpi));
+#if CONFIG_REFERENCE_BUFFER
+ set_use_reference_buffer(cm, 0);
+#endif // CONFIG_REFERENCE_BUFFER
} else {
#if CONFIG_NO_FRAME_CONTEXT_SIGNALING
if (frame_is_intra_only(cm) || cm->error_resilient_mode ||
@@ -5397,7 +5400,7 @@
#endif
#if CONFIG_REFERENCE_BUFFER
- {
+ if (cm->use_reference_buffer) {
/* Non-normative definition of current_frame_id ("frame counter" with
* wraparound) */
const int frame_id_length = FRAME_ID_LENGTH_MINUS7 + 7;
@@ -5422,7 +5425,7 @@
(1 << frame_id_length);
}
}
-#endif
+#endif // CONFIG_REFERENCE_BUFFER
#if CONFIG_EXT_DELTA_Q
cm->delta_q_present_flag = cpi->oxcf.deltaq_mode != NO_DELTA_Q;
@@ -5497,7 +5500,7 @@
}
#if CONFIG_REFERENCE_BUFFER
- {
+ if (cm->use_reference_buffer) {
int i;
/* Update reference frame id values based on the value of refresh_mask */
for (i = 0; i < REF_FRAMES; i++) {
@@ -5506,7 +5509,7 @@
}
}
}
-#endif
+#endif // CONFIG_REFERENCE_BUFFER
#if DUMP_RECON_FRAMES == 1
// NOTE(zoeliu): For debug - Output the filtered reconstructed video.
@@ -6463,10 +6466,12 @@
#endif
#if CONFIG_REFERENCE_BUFFER
- if (*time_stamp == 0) {
- cpi->common.current_frame_id = -1;
+ if (cm->use_reference_buffer) {
+ if (*time_stamp == 0) {
+ cpi->common.current_frame_id = -1;
+ }
}
-#endif
+#endif // CONFIG_REFERENCE_BUFFER
#if CONFIG_AMVR
cpi->cur_poc++;
if (oxcf->pass != 1 && cpi->common.allow_screen_content_tools) {
diff --git a/av1/encoder/encoder.h b/av1/encoder/encoder.h
index 3930721..9a057828 100644
--- a/av1/encoder/encoder.h
+++ b/av1/encoder/encoder.h
@@ -624,7 +624,7 @@
#endif
#if CONFIG_REFERENCE_BUFFER
SequenceHeader seq_params;
-#endif
+#endif // CONFIG_REFERENCE_BUFFER
#if CONFIG_LV_MAP
tran_low_t *tcoeff_buf[MAX_MB_PLANE];
#endif