• Deb Mukherjee's avatar
    Balancing coef-tree to reduce bool decodes · b8b3f1a4
    Deb Mukherjee authored
    This patch changes the coefficient tree to move the EOB to below
    the ZERO node in order to save number of bool decodes.
    
    The advantages of moving EOB one step down as opposed to two steps down
    in the other parallel patch are: 1. The coef modeling based on
    the One-node becomes independent of the tree structure above it, and
    2. Fewer conext/counter increases are needed.
    
    The drawback is that the potential savings in bool decodes will be
    less, but assuming that 0s are much more predominant than 1's the
    potential savings is still likely to be substantial.
    
    Results on derf300: -0.237%
    
    Change-Id: Ie784be13dc98291306b338e8228703a4c2ea2242
    b8b3f1a4
vp9_sad_c.c 26.57 KiB
/*
 *  Copyright (c) 2010 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.
 */
#include <stdlib.h>
#include "vp9/common/vp9_sadmxn.h"
#include "vp9/encoder/vp9_variance.h"
#include "./vpx_config.h"
#include "vpx/vpx_integer.h"
#include "./vp9_rtcd.h"
#define sad_mxn_func(m, n) \
unsigned int vp9_sad##m##x##n##_c(const uint8_t *src_ptr, \
                                  int  src_stride, \
                                  const uint8_t *ref_ptr, \
                                  int  ref_stride, \
                                  unsigned int max_sad) { \
  return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, m, n); \
} \
unsigned int vp9_sad##m##x##n##_avg_c(const uint8_t *src_ptr, \
                                      int  src_stride, \
                                      const uint8_t *ref_ptr, \
                                      int  ref_stride, \
                                      const uint8_t *second_pred, \
                                      unsigned int max_sad) { \
  uint8_t comp_pred[m * n]; \
  comp_avg_pred(comp_pred, second_pred, m, n, ref_ptr, ref_stride); \
  return sad_mx_n_c(src_ptr, src_stride, comp_pred, m, m, n); \
sad_mxn_func(64, 64)
sad_mxn_func(64, 32)
sad_mxn_func(32, 64)
sad_mxn_func(32, 32)
sad_mxn_func(32, 16)
sad_mxn_func(16, 32)
sad_mxn_func(16, 16)
sad_mxn_func(16, 8)
sad_mxn_func(8, 16)
sad_mxn_func(8, 8)
sad_mxn_func(8, 4)
sad_mxn_func(4, 8)
sad_mxn_func(4, 4)
void vp9_sad64x32x4d_c(const uint8_t *src_ptr,
                       int  src_stride,
                       const uint8_t* const ref_ptr[],
                       int  ref_stride,
                       unsigned int *sad_array) {
  sad_array[0] = vp9_sad64x32(src_ptr, src_stride,
                              ref_ptr[0], ref_stride, 0x7fffffff);
  sad_array[1] = vp9_sad64x32(src_ptr, src_stride,
                              ref_ptr[1], ref_stride, 0x7fffffff);
  sad_array[2] = vp9_sad64x32(src_ptr, src_stride,
                              ref_ptr[2], ref_stride, 0x7fffffff);
  sad_array[3] = vp9_sad64x32(src_ptr, src_stride,
                              ref_ptr[3], ref_stride, 0x7fffffff);
void vp9_sad32x64x4d_c(const uint8_t *src_ptr,
                       int  src_stride,
                       const uint8_t* const ref_ptr[],
                       int  ref_stride,