shithub: libvpx

Download patch

ref: f167433d9cb40b1ea29b46f1aff72b472d721dc2
parent: c4048dbdd39dbd4763852a6d0a27f183677c4225
author: Jim Bankoski <jimbankoski@google.com>
date: Tue Aug 20 04:14:52 EDT 2013

fix the mv_ref_idx issue

The following issue was reported :
https://code.google.com/p/webm/issues/detail?id=601&q=jimbankoski&sort=-id&colspec=ID%20Pri%20mstone%20ReleaseBlock%20Type%20Component%20Status%20Owner%20Summary

This code makes the choice and code cleaner and removes any question
about whether the border needs to be checked.

Change-Id: Ia7aecfb3168e340618805bd318499176c2989597

--- a/vp9/common/vp9_mvref_common.c
+++ b/vp9/common/vp9_mvref_common.c
@@ -167,13 +167,15 @@
 
 // Checks that the given mi_row, mi_col and search point
 // are inside the borders of the tile.
-static INLINE int is_inside(int mi_col, int mi_row, int cur_tile_mi_col_start,
+static INLINE int is_inside(int mi_col, int mi_row,
+                            int cur_tile_mi_col_start,
+                            int cur_tile_mi_col_end,
+                            int mi_rows,
                             const MV *mv_ref) {
-  // Check that the candidate is within the border.  We only need to check
-  // the left side because all the positive right side ones are for blocks that
-  // are large enough to support the + value they have within their border.
   return !(mi_row + mv_ref->row < 0 ||
-           mi_col + mv_ref->col < cur_tile_mi_col_start);
+           mi_col + mv_ref->col < cur_tile_mi_col_start ||
+           mi_row + mv_ref->row >= mi_rows ||
+           mi_col + mv_ref->col >= cur_tile_mi_col_end);
 }
 
 // This function searches the neighbourhood of a given MB/SB
@@ -202,7 +204,8 @@
   for (idx = 0; idx < 2; ++idx) {
     const MV *mv_ref = &mv_ref_search[idx];
 
-    if (!is_inside(mi_col, mi_row, cm->cur_tile_mi_col_start, mv_ref))
+    if (!is_inside(mi_col, mi_row, cm->cur_tile_mi_col_start,
+                   cm->cur_tile_mi_col_end, cm->mi_rows, mv_ref))
       continue;
 
     candidate = here + mv_ref->col + mv_ref->row * xd->mode_info_stride;
@@ -230,7 +233,8 @@
   // mode counts.
   for (; idx < MVREF_NEIGHBOURS; ++idx) {
     const MV *mv_ref = &mv_ref_search[idx];
-    if (!is_inside(mi_col, mi_row, cm->cur_tile_mi_col_start, mv_ref))
+    if (!is_inside(mi_col, mi_row, cm->cur_tile_mi_col_start,
+                   cm->cur_tile_mi_col_end, cm->mi_rows, mv_ref))
       continue;
 
     candidate = here + mv_ref->col + mv_ref->row * xd->mode_info_stride;
@@ -261,7 +265,8 @@
   if (different_ref_found) {
     for (idx = 0; idx < MVREF_NEIGHBOURS; ++idx) {
       const MV *mv_ref = &mv_ref_search[idx];
-      if (!is_inside(mi_col, mi_row, cm->cur_tile_mi_col_start, mv_ref))
+      if (!is_inside(mi_col, mi_row, cm->cur_tile_mi_col_start,
+                     cm->cur_tile_mi_col_end, cm->mi_rows, mv_ref))
         continue;
 
       candidate = here + mv_ref->col + mv_ref->row * xd->mode_info_stride;