Update frame_context_idx for intra_only/e-frames
Currently, the intra_only/error resilient frame will reuse the
frame_context_idx from the frame coded before it. If the frame
coded before it is an altref frame, the reused frame_context_idx
will point to the ARF_FRAME slot even if cpi->refresh_alt_ref_frame != 1.
This can lead to an uninitialized entropy context for the frame after
the intra_only/error resilient frame.
Change-Id: Idece65a9e21e6606c1028b232cc21bf95e503f39
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c
index ac5b245..46ef2c6 100644
--- a/av1/encoder/encoder.c
+++ b/av1/encoder/encoder.c
@@ -282,6 +282,7 @@
}
cm->fb_of_context_type[REGULAR_FRAME] =
get_ref_frame_map_idx(cpi, GOLDEN_FRAME);
+ cm->frame_context_idx = REGULAR_FRAME;
} else if (!cm->large_scale_tile) {
// for large scale tile we leave the default PRIMARY_REF_NONE
const GF_GROUP *gf_group = &cpi->twopass.gf_group;
diff --git a/test/error_resilience_test.cc b/test/error_resilience_test.cc
index 8209a21..55c3b9a 100644
--- a/test/error_resilience_test.cc
+++ b/test/error_resilience_test.cc
@@ -371,24 +371,21 @@
// frame. Currently, this will cause an assertion failure.
// Set an arbitrary error resilient (E) frame
unsigned int num_error_resilient_frames = 1;
- unsigned int error_resilient_frame_list[] = { 8 };
+ unsigned int error_resilient_frame_list[] = { 7 };
SetErrorResilientFrames(num_error_resilient_frames,
error_resilient_frame_list);
// Ensure that any invisible frames before the E frame are dropped
SetInvisibleErrorFrames(num_error_resilient_frames,
error_resilient_frame_list);
- // Set all frames after the error resilient frame to not allow MFMV and to
- // use PRIMARY_REF_NONE for their primary_ref_frame.
- unsigned int num_post_error_resilient_frames = 6;
- unsigned int post_error_resilient_frame_list[] = { 9, 10, 11, 12, 13, 14 };
+ // Set all frames after the error resilient frame to not allow MFMV
+ unsigned int num_post_error_resilient_frames = 7;
+ unsigned int post_error_resilient_frame_list[] = { 8, 9, 10, 11, 12, 13, 14 };
SetNoMFMVFrames(num_post_error_resilient_frames,
post_error_resilient_frame_list);
- // SetPrimaryRefNoneFrames(num_post_error_resilient_frames,
- // post_error_resilient_frame_list);
// Set a few frames before the E frame that are lost (not decoded)
- unsigned int num_error_frames = 5;
- unsigned int error_frame_list[] = { 3, 4, 5, 6, 7 };
+ unsigned int num_error_frames = 4;
+ unsigned int error_frame_list[] = { 3, 4, 5, 6 };
SetErrorFrames(num_error_frames, error_frame_list);
ASSERT_NO_FATAL_FAILURE(RunLoop(&video));