Make the code match the spec regarding RefValid[i]
Most of the changes involve using cm->valid_for_referencing[i] not only
when cm->seq_params.frame_id_numbers_present_flag is 1.
This CL does not deal with the use of RefValid[i] in the following parts
of the spec:
- The handling of the error condition covered in bug aomedia:2420
- Section 7.3.1 of the large scale tile decoding process
- Annex C.5 of the error resilience behavior (informative)
BUG=aomedia:2295,aomedia:2420
Change-Id: I254ab9b570a2b32fc4342b3022c391f942175449
diff --git a/av1/decoder/decodeframe.c b/av1/decoder/decodeframe.c
index abe3e61..8c29861 100644
--- a/av1/decoder/decodeframe.c
+++ b/av1/decoder/decodeframe.c
@@ -4566,7 +4566,6 @@
// If the refresh_frame_flags bitmask is set, update reference frame id values
// and mark frames as valid for reference.
static void update_ref_frame_id(AV1_COMMON *const cm, int frame_id) {
- assert(cm->seq_params.frame_id_numbers_present_flag);
int refresh_frame_flags = cm->current_frame.refresh_frame_flags;
for (int i = 0; i < REF_FRAMES; i++) {
if ((refresh_frame_flags >> i) & 1) {
@@ -4597,10 +4596,8 @@
// Note that the displayed frame must be valid for referencing in order to
// have been selected.
- if (cm->seq_params.frame_id_numbers_present_flag) {
- cm->current_frame_id = cm->ref_frame_id[existing_frame_idx];
- update_ref_frame_id(cm, cm->current_frame_id);
- }
+ cm->current_frame_id = cm->ref_frame_id[existing_frame_idx];
+ update_ref_frame_id(cm, cm->current_frame_id);
cm->refresh_frame_context = REFRESH_FRAME_CONTEXT_DISABLED;
@@ -4776,6 +4773,12 @@
: aom_rb_read_bit(rb);
}
+ if (current_frame->frame_type == KEY_FRAME && cm->show_frame) {
+ /* All frames need to be marked as not valid for referencing */
+ for (int i = 0; i < REF_FRAMES; i++) {
+ cm->valid_for_referencing[i] = 0;
+ }
+ }
cm->disable_cdf_update = aom_rb_read_bit(rb);
if (seq_params->force_screen_content_tools == 2) {
cm->allow_screen_content_tools = aom_rb_read_bit(rb);
@@ -4827,9 +4830,7 @@
}
/* Check if some frames need to be marked as not valid for referencing */
for (int i = 0; i < REF_FRAMES; i++) {
- if (current_frame->frame_type == KEY_FRAME && cm->show_frame) {
- cm->valid_for_referencing[i] = 0;
- } else if (cm->current_frame_id - (1 << diff_len) > 0) {
+ 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;
@@ -4927,6 +4928,8 @@
}
// If no corresponding buffer exists, allocate a new buffer with all
// pixels set to neutral grey.
+ // TODO(https://crbug.com/aomedia/2420): The spec seems to say we
+ // just need to set cm->valid_for_referencing[ref_idx] to 0.
int buf_idx = get_free_fb(cm);
if (buf_idx == INVALID_IDX) {
aom_internal_error(&cm->error, AOM_CODEC_MEM_ERROR,
@@ -5021,6 +5024,10 @@
} else {
ref = cm->remapped_ref_idx[i];
}
+ // Check valid for referencing
+ if (cm->valid_for_referencing[ref] == 0)
+ aom_internal_error(&cm->error, AOM_CODEC_CORRUPT_FRAME,
+ "Reference frame not valid for referencing");
cm->ref_frame_sign_bias[LAST_FRAME + i] = 0;
@@ -5033,9 +5040,8 @@
(1 << frame_id_length)) %
(1 << frame_id_length));
// Compare values derived from delta_frame_id_minus_1 and
- // refresh_frame_flags. Also, check valid for referencing
- if (ref_frame_id != cm->ref_frame_id[ref] ||
- cm->valid_for_referencing[ref] == 0)
+ // refresh_frame_flags.
+ if (ref_frame_id != cm->ref_frame_id[ref])
aom_internal_error(&cm->error, AOM_CODEC_CORRUPT_FRAME,
"Reference buffer frame ID mismatch");
}
@@ -5091,9 +5097,7 @@
cm->cur_frame->frame_type = current_frame->frame_type;
- if (seq_params->frame_id_numbers_present_flag) {
- update_ref_frame_id(cm, cm->current_frame_id);
- }
+ update_ref_frame_id(cm, cm->current_frame_id);
const int might_bwd_adapt =
!(seq_params->reduced_still_picture_hdr) && !(cm->disable_cdf_update);