shithub: libvpx

Download patch

ref: 73987d140a961c6644261491bec023b5e3b074c1
parent: d01357bbad6fb495f16c763add16dcc351a6f8b3
author: Ronald S. Bultje <rbultje@google.com>
date: Sat Nov 10 03:39:51 EST 2012

Remove 'thismb' data pointer when superblock experiment is on.

This should prevent inconsistent results between identical encodes with
the superblock experiment turned on.

Change-Id: I41a005fae53f2eb59736cc70041185fb7d63cfca

--- a/vp9/encoder/block.h
+++ b/vp9/encoder/block.h
@@ -86,9 +86,11 @@
 typedef struct macroblock {
   DECLARE_ALIGNED(16, short, src_diff[400]);  // 16x16 Y 8x8 U 8x8 V 4x4 2nd Y
   DECLARE_ALIGNED(16, short, coeff[400]);     // 16x16 Y 8x8 U 8x8 V 4x4 2nd Y
+#if !CONFIG_SUPERBLOCKS
   DECLARE_ALIGNED(16, unsigned char, thismb[256]);    // 16x16 Y
 
   unsigned char *thismb_ptr;
+#endif
   // 16 Y blocks, 4 U blocks, 4 V blocks,
   // 1 DC 2nd order block each with 16 entries
   BLOCK block[25];
--- a/vp9/encoder/encodeframe.c
+++ b/vp9/encoder/encodeframe.c
@@ -294,8 +294,10 @@
       xd->left_available = (mb_col != 0);
       recon_yoffset += 16;
 #endif
+#if !CONFIG_SUPERBLOCKS
       // Copy current mb to a buffer
       vp9_copy_mem16x16(x->src.y_buffer, x->src.y_stride, x->thismb, 16);
+#endif
 
       // measure activity
       mb_activity = mb_activity_measure(cpi, x, mb_row, mb_col);
@@ -575,8 +577,10 @@
     xd->dst.u_buffer = cm->yv12_fb[dst_fb_idx].u_buffer + recon_uvoffset;
     xd->dst.v_buffer = cm->yv12_fb[dst_fb_idx].v_buffer + recon_uvoffset;
 
+#if !CONFIG_SUPERBLOCKS
     // Copy current MB to a work buffer
     vp9_copy_mem16x16(x->src.y_buffer, x->src.y_stride, x->thismb, 16);
+#endif
 
     x->rddiv = cpi->RDDIV;
     x->rdmult = cpi->RDMULT;
@@ -953,8 +957,10 @@
     xd->dst.u_buffer = cm->yv12_fb[dst_fb_idx].u_buffer + recon_uvoffset;
     xd->dst.v_buffer = cm->yv12_fb[dst_fb_idx].v_buffer + recon_uvoffset;
 
+#if !CONFIG_SUPERBLOCKS
     // Copy current MB to a work buffer
     vp9_copy_mem16x16(x->src.y_buffer, x->src.y_stride, x->thismb, 16);
+#endif
 
     if (cpi->oxcf.tuning == VP8_TUNE_SSIM)
       vp9_activity_masking(cpi, x);
@@ -1694,6 +1700,7 @@
 
   vp9_build_block_doffsets(&x->e_mbd);
 
+#if !CONFIG_SUPERBLOCKS
   // y blocks
   x->thismb_ptr = &x->thismb[0];
   for (br = 0; br < 4; br++) {
@@ -1708,6 +1715,20 @@
       ++block;
     }
   }
+#else
+  for (br = 0; br < 4; br++) {
+    for (bc = 0; bc < 4; bc++) {
+      BLOCK *this_block = &x->block[block];
+      // this_block->base_src = &x->src.y_buffer;
+      // this_block->src_stride = x->src.y_stride;
+      // this_block->src = 4 * br * this_block->src_stride + 4 * bc;
+      this_block->base_src = &x->src.y_buffer;
+      this_block->src_stride = x->src.y_stride;
+      this_block->src = 4 * br * this_block->src_stride + 4 * bc;
+      ++block;
+    }
+  }
+#endif
 
   // u blocks
   for (br = 0; br < 2; br++) {
--- a/vp9/encoder/firstpass.c
+++ b/vp9/encoder/firstpass.c
@@ -521,8 +521,10 @@
       xd->dst.v_buffer = new_yv12->v_buffer + recon_uvoffset;
       xd->left_available = (mb_col != 0);
 
+#if !CONFIG_SUPERBLOCKS
       // Copy current mb to a buffer
       vp9_copy_mem16x16(x->src.y_buffer, x->src.y_stride, x->thismb, 16);
+#endif
 
       // do intra 16x16 prediction
       this_error = vp9_encode_intra(cpi, x, use_dc_pred);