Fix ioc warnings related to sub8x8 reference frame
authorJingning Han <jingning@google.com>
Wed, 9 Sep 2015 19:29:57 +0000 (12:29 -0700)
committerJingning Han <jingning@google.com>
Wed, 9 Sep 2015 22:48:00 +0000 (15:48 -0700)
Access scaled reference frame in the sub8x8 rate-distortion
optimization loop only when the current test mode is an inter mode.
This prevents an ioc warning triggered by sending intra_frame index
to fetch scaled reference frame.

Change-Id: I6177ecc946651dd86c7ce362e3f65c4074444604

vp9/encoder/vp9_rdopt.c

index 72a09a9..3c84a77 100644 (file)
@@ -3787,11 +3787,6 @@ void vp9_rd_pick_inter_mode_sub8x8(VP9_COMP *cpi,
     int64_t total_sse = INT_MAX;
     int early_term = 0;
     struct buf_2d backup_yv12[2][MAX_MB_PLANE];
-    const YV12_BUFFER_CONFIG *scaled_ref_frame[2] = {
-        vp9_get_scaled_ref_frame(cpi, vp9_ref_order[ref_index].ref_frame[0]),
-        vp9_get_scaled_ref_frame(cpi, vp9_ref_order[ref_index].ref_frame[1])
-    };
-    int ref;
 
     ref_frame = vp9_ref_order[ref_index].ref_frame[0];
     second_ref_frame = vp9_ref_order[ref_index].ref_frame[1];
@@ -3927,7 +3922,13 @@ void vp9_rd_pick_inter_mode_sub8x8(VP9_COMP *cpi,
       int pred_exists = 0;
       int uv_skippable;
 
+      YV12_BUFFER_CONFIG *scaled_ref_frame[2] = {NULL, NULL};
+      int ref;
+
       for (ref = 0; ref < 2; ++ref) {
+        scaled_ref_frame[ref] = mbmi->ref_frame[ref] > INTRA_FRAME ?
+            vp9_get_scaled_ref_frame(cpi, mbmi->ref_frame[ref]) : NULL;
+
         if (scaled_ref_frame[ref]) {
           int i;
           // Swap out the reference frame for a version that's been scaled to
@@ -4089,14 +4090,14 @@ void vp9_rd_pick_inter_mode_sub8x8(VP9_COMP *cpi,
         skippable = skippable && uv_skippable;
         total_sse += uv_sse;
       }
-    }
 
-    for (ref = 0; ref < 2; ++ref) {
-      if (scaled_ref_frame[ref]) {
-        // Restore the prediction frame pointers to their unscaled versions.
-        int i;
-        for (i = 0; i < MAX_MB_PLANE; ++i)
-          xd->plane[i].pre[ref] = backup_yv12[ref][i];
+      for (ref = 0; ref < 2; ++ref) {
+        if (scaled_ref_frame[ref]) {
+          // Restore the prediction frame pointers to their unscaled versions.
+          int i;
+          for (i = 0; i < MAX_MB_PLANE; ++i)
+            xd->plane[i].pre[ref] = backup_yv12[ref][i];
+        }
       }
     }