]> granicus.if.org Git - libvpx/commitdiff
vp8 dec: only compute ref frame buffer pointer for non intra
authorJerome Jiang <jianj@google.com>
Tue, 6 Nov 2018 01:46:03 +0000 (17:46 -0800)
committerJerome Jiang <jianj@google.com>
Tue, 6 Nov 2018 01:46:03 +0000 (17:46 -0800)
When ref frame is INTRA_FRAME, pre buffer shouldn't be used.

This CL copies behavior in single thread. That should apply to
multithreading case too.

BUG=webm:1496

Change-Id: Ibe9ab8ea9dc664151fa7ebac529d5fd1a481b4a3

vp8/decoder/threading.c

index 8cc301d4fd58936bbc90e18f70443a163006d958..90e0f4d86d8fbdfac044628ba929b7242a3a081c 100644 (file)
@@ -415,13 +415,17 @@ static void mt_decode_mb_rows(VP8D_COMP *pbi, MACROBLOCKD *xd,
                            "Corrupted reference frame");
       }
 
-      xd->pre.y_buffer =
-          ref_buffer[xd->mode_info_context->mbmi.ref_frame][0] + recon_yoffset;
-      xd->pre.u_buffer =
-          ref_buffer[xd->mode_info_context->mbmi.ref_frame][1] + recon_uvoffset;
-      xd->pre.v_buffer =
-          ref_buffer[xd->mode_info_context->mbmi.ref_frame][2] + recon_uvoffset;
-
+      if (xd->mode_info_context->mbmi.ref_frame >= LAST_FRAME) {
+        const MV_REFERENCE_FRAME ref = xd->mode_info_context->mbmi.ref_frame;
+        xd->pre.y_buffer = ref_buffer[ref][0] + recon_yoffset;
+        xd->pre.u_buffer = ref_buffer[ref][1] + recon_uvoffset;
+        xd->pre.v_buffer = ref_buffer[ref][2] + recon_uvoffset;
+      } else {
+        // ref_frame is INTRA_FRAME, pre buffer should not be used.
+        xd->pre.y_buffer = 0;
+        xd->pre.u_buffer = 0;
+        xd->pre.v_buffer = 0;
+      }
       mt_decode_macroblock(pbi, xd, 0);
 
       xd->left_available = 1;