Add checks for the mode/ref frame lookups
The two data structures must be manually kept in sync; recently discovered
that they weren't and led to a slight PSNR loss. Add some assertions to
verify that each lookup finds the right value.
Change-Id: I642aabd72b38b57af071cf558269f9d43ba3a9e8
diff --git a/av1/encoder/rdopt.c b/av1/encoder/rdopt.c
index 3bf5ad8..b8114c7 100644
--- a/av1/encoder/rdopt.c
+++ b/av1/encoder/rdopt.c
@@ -647,26 +647,33 @@
static int get_prediction_mode_idx(PREDICTION_MODE this_mode,
MV_REFERENCE_FRAME ref_frame,
MV_REFERENCE_FRAME second_ref_frame) {
+ int result;
if (this_mode < INTRA_MODE_END) {
assert(ref_frame == INTRA_FRAME);
assert(second_ref_frame == NONE_FRAME);
- return intra_to_mode_idx[this_mode - INTRA_MODE_START];
- }
- if (this_mode >= SINGLE_INTER_MODE_START &&
- this_mode < SINGLE_INTER_MODE_END) {
+ result = intra_to_mode_idx[this_mode - INTRA_MODE_START];
+ } else if (this_mode >= SINGLE_INTER_MODE_START &&
+ this_mode < SINGLE_INTER_MODE_END) {
assert((ref_frame > INTRA_FRAME) && (ref_frame <= ALTREF_FRAME));
- return single_inter_to_mode_idx[this_mode - SINGLE_INTER_MODE_START]
- [ref_frame];
- }
- if (this_mode >= COMP_INTER_MODE_START && this_mode < COMP_INTER_MODE_END) {
+ result = single_inter_to_mode_idx[this_mode - SINGLE_INTER_MODE_START]
+ [ref_frame];
+ } else if (this_mode >= COMP_INTER_MODE_START &&
+ this_mode < COMP_INTER_MODE_END) {
assert((ref_frame > INTRA_FRAME) && (ref_frame <= ALTREF_FRAME));
assert((second_ref_frame > INTRA_FRAME) &&
(second_ref_frame <= ALTREF_FRAME));
- return comp_inter_to_mode_idx[this_mode - COMP_INTER_MODE_START][ref_frame]
- [second_ref_frame];
+ result = comp_inter_to_mode_idx[this_mode - COMP_INTER_MODE_START]
+ [ref_frame][second_ref_frame];
+ } else {
+ result = -1;
}
- assert(0);
- return -1;
+ // The two data structures that map back and forth between mode number
+ // and (mode, ref frame1, ref frame2) must be manually kept in sync. Add
+ // assertions to catch any drift.
+ assert(result >= 0 && result < MAX_MODES);
+ assert(av1_mode_order[result].mode == this_mode);
+ assert(av1_mode_order[result].ref_frame[0] == ref_frame);
+ return result;
}
static const PREDICTION_MODE intra_rd_search_mode_order[INTRA_MODES] = {