This is to replace vp10/common/reconinter.c:build_masked_compound. Functionality is equivalent, but the interface is slightly more generic. Total encoder speedup with ext-inter: ~7.5% Change-Id: Iee18b83ae324ffc9c7f7dc16d4b2b06adb4d4305
		
			
				
	
	
		
			279 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			279 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
 *  Copyright (c) 2016 The WebM project authors. All Rights Reserved.
 | 
						|
 *
 | 
						|
 *  Use of this source code is governed by a BSD-style license
 | 
						|
 *  that can be found in the LICENSE file in the root of the source
 | 
						|
 *  tree. An additional intellectual property rights grant can be found
 | 
						|
 *  in the file PATENTS.  All contributing project authors may
 | 
						|
 *  be found in the AUTHORS file in the root of the source tree.
 | 
						|
 */
 | 
						|
 | 
						|
 | 
						|
#ifndef TEST_ASSERTION_HELPERS_H_
 | 
						|
#define TEST_ASSERTION_HELPERS_H_
 | 
						|
 | 
						|
#include "third_party/googletest/src/include/gtest/gtest.h"
 | 
						|
 | 
						|
namespace libvpx_test {
 | 
						|
namespace assertion_helpers {
 | 
						|
 | 
						|
// Arrays (1D) are element-wise equal
 | 
						|
template<typename E, size_t n>
 | 
						|
::testing::AssertionResult ArraysEq(const E (&a)[n],
 | 
						|
                                    const E (&b)[n]) {
 | 
						|
  for (size_t i = 0; i < n; i++) {
 | 
						|
    const E &va = a[i];
 | 
						|
    const E &vb = b[i];
 | 
						|
    if (va != vb) {
 | 
						|
      return ::testing::AssertionFailure()
 | 
						|
        << "Arrays do not equal at index "
 | 
						|
        << "[" << i << "]"
 | 
						|
        << " values are: " << va << " vs " << vb;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return ::testing::AssertionSuccess();
 | 
						|
}
 | 
						|
 | 
						|
// Arrays (1D) are element-wise equal
 | 
						|
// within the index interval [lo, hi)
 | 
						|
template<typename E, size_t n>
 | 
						|
::testing::AssertionResult ArraysEqWithin(const E (&a)[n],
 | 
						|
                                          const E (&b)[n],
 | 
						|
                                          const size_t lo,
 | 
						|
                                          const size_t hi) {
 | 
						|
  assert(hi > lo);
 | 
						|
  assert(hi <= n);
 | 
						|
 | 
						|
  for (size_t i = lo; i < hi; i++) {
 | 
						|
    const E &va = a[i];
 | 
						|
    const E &vb = b[i];
 | 
						|
    if (va != vb) {
 | 
						|
      return ::testing::AssertionFailure()
 | 
						|
        << "Arrays do not equal at index "
 | 
						|
        << "[" << i << "]"
 | 
						|
        << " values are: " << va << " vs " << vb;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return ::testing::AssertionSuccess();
 | 
						|
}
 | 
						|
 | 
						|
// Arrays (1D) are element-wise equal
 | 
						|
// outside the index interval [lo, hi)
 | 
						|
template<typename E, size_t n>
 | 
						|
::testing::AssertionResult ArraysEqOutside(const E (&a)[n],
 | 
						|
                                           const E (&b)[n],
 | 
						|
                                           const size_t lo,
 | 
						|
                                           const size_t hi) {
 | 
						|
  assert(hi > lo);
 | 
						|
  assert(hi <= n);
 | 
						|
 | 
						|
  for (size_t i = 0; i < n; i++) {
 | 
						|
    if (lo <= i && i < hi)
 | 
						|
      continue;
 | 
						|
 | 
						|
    const E &va = a[i];
 | 
						|
    const E &vb = b[i];
 | 
						|
    if (va != vb) {
 | 
						|
      return ::testing::AssertionFailure()
 | 
						|
        << "Arrays do not equal at index "
 | 
						|
        << "[" << i << "]"
 | 
						|
        << " values are: " << va << " vs " << vb;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return ::testing::AssertionSuccess();
 | 
						|
}
 | 
						|
 | 
						|
// Arrays (2D) are element-wise equal
 | 
						|
template<typename E, size_t n, size_t m>
 | 
						|
::testing::AssertionResult ArraysEq(const E (&a)[n][m],
 | 
						|
                                    const E (&b)[n][m]) {
 | 
						|
  for (size_t i = 0; i < n; i++) {
 | 
						|
    for (size_t j = 0; j < m; j++) {
 | 
						|
      const E &va = a[i][j];
 | 
						|
      const E &vb = b[i][j];
 | 
						|
      if (va != vb) {
 | 
						|
        return ::testing::AssertionFailure()
 | 
						|
          << "Arrays do not equal at index "
 | 
						|
          << "[" << i << "][" << j << "]"
 | 
						|
          << " values are: " << va << " vs " << vb;
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return ::testing::AssertionSuccess();
 | 
						|
}
 | 
						|
 | 
						|
// Arrays (2D) are element-wise equal
 | 
						|
// within the index interval [lo0, hi0) x [lo1, hi1) (Cartesian product)
 | 
						|
template<typename E, size_t n, size_t m>
 | 
						|
::testing::AssertionResult ArraysEqWithin(const E (&a)[n][m],
 | 
						|
                                          const E (&b)[n][m],
 | 
						|
                                          const size_t lo0,
 | 
						|
                                          const size_t hi0,
 | 
						|
                                          const size_t lo1,
 | 
						|
                                          const size_t hi1) {
 | 
						|
  assert(hi0 > lo0);
 | 
						|
  assert(hi0 <= n);
 | 
						|
  assert(hi1 > lo1);
 | 
						|
  assert(hi1 <= m);
 | 
						|
 | 
						|
  for (size_t i = lo0; i < hi0; i++) {
 | 
						|
    for (size_t j = lo1; j < hi1; j++) {
 | 
						|
      const E &va = a[i][j];
 | 
						|
      const E &vb = b[i][j];
 | 
						|
      if (va != vb) {
 | 
						|
        return ::testing::AssertionFailure()
 | 
						|
          << "Arrays do not equal at index "
 | 
						|
          << "[" << i << "][" << j << "]"
 | 
						|
          << " values are: " << va << " vs " << vb;
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return ::testing::AssertionSuccess();
 | 
						|
}
 | 
						|
 | 
						|
// Arrays (2D) are element-wise equal
 | 
						|
// outside the index interval [lo0, hi0) x [lo1, hi1) (Cartesian product)
 | 
						|
template<typename E, size_t n, size_t m>
 | 
						|
::testing::AssertionResult ArraysEqOutside(const E (&a)[n][m],
 | 
						|
                                           const E (&b)[n][m],
 | 
						|
                                           const size_t lo0,
 | 
						|
                                           const size_t hi0,
 | 
						|
                                           const size_t lo1,
 | 
						|
                                           const size_t hi1) {
 | 
						|
  assert(hi0 > lo0);
 | 
						|
  assert(hi0 <= n);
 | 
						|
  assert(hi1 > lo1);
 | 
						|
  assert(hi1 <= m);
 | 
						|
 | 
						|
  for (size_t i = 0; i < n; i++) {
 | 
						|
    if (lo0 <= i && i < hi0)
 | 
						|
      continue;
 | 
						|
 | 
						|
    for (size_t j = 0; j < m; j++) {
 | 
						|
      if (lo1 <= j && j < hi1)
 | 
						|
        continue;
 | 
						|
 | 
						|
      const E &va = a[i][j];
 | 
						|
      const E &vb = b[i][j];
 | 
						|
      if (va != vb) {
 | 
						|
        return ::testing::AssertionFailure()
 | 
						|
          << "Arrays do not equal at index "
 | 
						|
          << "[" << i << "][" << j << "]"
 | 
						|
          << " values are: " << va << " vs " << vb;
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return ::testing::AssertionSuccess();
 | 
						|
}
 | 
						|
 | 
						|
// Non contiguous 2D array buffers are element-wise equal
 | 
						|
// at corresponding linear indices specified by rows/cols/stride/offset
 | 
						|
template<typename E, size_t n, size_t m>
 | 
						|
::testing::AssertionResult BuffersEqWithin(const E (&a)[n][m],
 | 
						|
                                           const E (&b)[n][m],
 | 
						|
                                           const size_t stridea,
 | 
						|
                                           const size_t strideb,
 | 
						|
                                           const size_t offseta,
 | 
						|
                                           const size_t offsetb,
 | 
						|
                                           const size_t rows,
 | 
						|
                                           const size_t cols) {
 | 
						|
  assert(rows <= n);
 | 
						|
  assert(cols <= m);
 | 
						|
  assert(stridea <= m);
 | 
						|
  assert(strideb <= m);
 | 
						|
  assert(cols <= stridea);
 | 
						|
  assert(cols <= strideb);
 | 
						|
  assert(offseta < n * m);
 | 
						|
  assert(offsetb < n * m);
 | 
						|
  assert(offseta + (rows - 1) * stridea + (cols - 1) < n * m);
 | 
						|
  assert(offsetb + (rows - 1) * strideb + (cols - 1) < n * m);
 | 
						|
 | 
						|
  const E *pa = &a[0][0] + offseta;
 | 
						|
  const E *pb = &b[0][0] + offsetb;
 | 
						|
 | 
						|
  for (size_t r = 0 ; r < rows ; r++) {
 | 
						|
    for (size_t c = 0 ; c < cols ; c++) {
 | 
						|
      const E &va = pa[c];
 | 
						|
      const E &vb = pb[c];
 | 
						|
      if (va != vb) {
 | 
						|
        return ::testing::AssertionFailure()
 | 
						|
          << "Arrays do not equal at linear index "
 | 
						|
          << "[" << pa - &a[0][0]  << "] vs [" << pb - &b[0][0]  << "]"
 | 
						|
          << " row=" << r << " col=" << c
 | 
						|
          << " values are: " << va << " vs " << vb;
 | 
						|
      }
 | 
						|
    }
 | 
						|
    pa += stridea;
 | 
						|
    pb += strideb;
 | 
						|
  }
 | 
						|
 | 
						|
  return ::testing::AssertionSuccess();
 | 
						|
}
 | 
						|
 | 
						|
// Non contiguous 2D array buffers are element-wise equal
 | 
						|
// except at corresponding linear indices specified by
 | 
						|
// rows/cols/stride/offset.
 | 
						|
template<typename E, size_t n, size_t m>
 | 
						|
::testing::AssertionResult BuffersEqOutside(const E (&a)[n][m],
 | 
						|
                                            const E (&b)[n][m],
 | 
						|
                                            const size_t stride,
 | 
						|
                                            const size_t offset,
 | 
						|
                                            const size_t rows,
 | 
						|
                                            const size_t cols ) {
 | 
						|
  assert(rows <= n);
 | 
						|
  assert(cols <= m);
 | 
						|
  assert(stride <= m);
 | 
						|
  assert(cols <= stride);
 | 
						|
  assert(offset < n * m);
 | 
						|
  assert(offset + (rows - 1) * stride + (cols - 1) < n * m);
 | 
						|
 | 
						|
  const E *const pa = &a[0][0];
 | 
						|
  const E *const pb = &b[0][0];
 | 
						|
 | 
						|
  size_t idx = 0;
 | 
						|
  size_t r = 0;
 | 
						|
  size_t end = offset;  // beginning of first row
 | 
						|
 | 
						|
  while (idx < n * m) {
 | 
						|
    while (idx < end) {   // until beginning of row or end of buffer
 | 
						|
      const E &va = pa[idx];
 | 
						|
      const E &vb = pb[idx];
 | 
						|
      if (va != vb) {
 | 
						|
        return ::testing::AssertionFailure()
 | 
						|
          << "Arrays do not equal at index "
 | 
						|
          << "[" << idx / m << "][" << idx % m << "]"
 | 
						|
          << " values are: " << va << " vs " << vb;
 | 
						|
      }
 | 
						|
 | 
						|
      idx++;
 | 
						|
    }
 | 
						|
 | 
						|
    // Move past row end
 | 
						|
    idx += cols;
 | 
						|
 | 
						|
    if (++r < rows) {
 | 
						|
      // Move to next row
 | 
						|
      end += stride;
 | 
						|
    } else {
 | 
						|
      // Move to end of buffer
 | 
						|
      end = n * m;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  // Sanity check
 | 
						|
  assert(idx == n * m + cols);
 | 
						|
 | 
						|
  return ::testing::AssertionSuccess();
 | 
						|
}
 | 
						|
 | 
						|
}   // namespace assertion_helpers
 | 
						|
}   // namespace libvpx_test
 | 
						|
 | 
						|
#endif  // TEST_ASSERTION_HELPERS_H_
 |