15ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang/*
25ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang *  Copyright (c) 2013 The WebM project authors. All Rights Reserved.
35ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang *
45ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang *  Use of this source code is governed by a BSD-style license
55ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang *  that can be found in the LICENSE file in the root of the source
65ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang *  tree. An additional intellectual property rights grant can be found
75ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang *  in the file PATENTS.  All contributing project authors may
85ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang *  be found in the AUTHORS file in the root of the source tree.
95ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang */
105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include <math.h>
125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
137ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#include "vpx_ports/mem.h"
147ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#include "vpx_ports/system_state.h"
157ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
164fb68e5dd4e93c7599dc905d861de11ac39c5585hkuang#include "vp9/encoder/vp9_aq_variance.h"
175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "vp9/common/vp9_seg_common.h"
195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "vp9/encoder/vp9_ratectrl.h"
21ba6c59e9d7d7013b3906b6f4230b663422681848Vignesh Venkatasubramanian#include "vp9/encoder/vp9_rd.h"
225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "vp9/encoder/vp9_segmentation.h"
235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
247ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#define ENERGY_MIN (-4)
252ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian#define ENERGY_MAX (1)
267bc9febe8749e98a3812a0dc4380ceae75c29450Johann#define ENERGY_SPAN (ENERGY_MAX - ENERGY_MIN + 1)
277bc9febe8749e98a3812a0dc4380ceae75c29450Johann#define ENERGY_IN_BOUNDS(energy) \
285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  assert((energy) >= ENERGY_MIN && (energy) <= ENERGY_MAX)
295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
307bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const double rate_ratio[MAX_SEGMENTS] = { 2.5,  2.0, 1.5, 1.0,
317bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                                 0.75, 1.0, 1.0, 1.0 };
327bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic const int segment_id[ENERGY_SPAN] = { 0, 1, 1, 2, 3, 4 };
335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
347bc9febe8749e98a3812a0dc4380ceae75c29450Johann#define SEGMENT_ID(i) segment_id[(i)-ENERGY_MIN]
355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
367bc9febe8749e98a3812a0dc4380ceae75c29450JohannDECLARE_ALIGNED(16, static const uint8_t, vp9_64_zeros[64]) = { 0 };
377ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH
387bc9febe8749e98a3812a0dc4380ceae75c29450JohannDECLARE_ALIGNED(16, static const uint16_t, vp9_highbd_64_zeros[64]) = { 0 };
397ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif
405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangunsigned int vp9_vaq_segment_id(int energy) {
425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  ENERGY_IN_BOUNDS(energy);
435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  return SEGMENT_ID(energy);
445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid vp9_vaq_frame_setup(VP9_COMP *cpi) {
475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  VP9_COMMON *cm = &cpi->common;
485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  struct segmentation *seg = &cm->seg;
495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  int i;
505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
5168e1c830ade592be74773e249bf94e2bbfb50de7Johann  if (frame_is_intra_only(cm) || cm->error_resilient_mode ||
527bc9febe8749e98a3812a0dc4380ceae75c29450Johann      cpi->refresh_alt_ref_frame || cpi->force_update_segmentation ||
532ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian      (cpi->refresh_golden_frame && !cpi->rc.is_src_frame_alt_ref)) {
542ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian    vp9_enable_segmentation(seg);
552ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian    vp9_clearall_segfeatures(seg);
565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
572ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian    seg->abs_delta = SEGMENT_DELTADATA;
585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
597ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    vpx_clear_system_state();
605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
617ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    for (i = 0; i < MAX_SEGMENTS; ++i) {
627ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      int qindex_delta =
637ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian          vp9_compute_qdelta_by_rate(&cpi->rc, cm->frame_type, cm->base_qindex,
647ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                                     rate_ratio[i], cm->bit_depth);
655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
667ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      // We don't allow qindex 0 in a segment if the base value is not 0.
677ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      // Q index 0 (lossless) implies 4x4 encoding only and in AQ mode a segment
687ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      // Q delta is sometimes applied without going back around the rd loop.
697ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      // This could lead to an illegal combination of partition size and q.
707ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      if ((cm->base_qindex != 0) && ((cm->base_qindex + qindex_delta) == 0)) {
717ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian        qindex_delta = -cm->base_qindex + 1;
727ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      }
737ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
747ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      // No need to enable SEG_LVL_ALT_Q for this segment.
757ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      if (rate_ratio[i] == 1.0) {
762ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian        continue;
772ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian      }
785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      vp9_set_segdata(seg, i, SEG_LVL_ALT_Q, qindex_delta);
807ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      vp9_enable_segfeature(seg, i, SEG_LVL_ALT_Q);
817ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    }
827ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
837ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
847ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
857ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian/* TODO(agrange, paulwilkins): The block_variance calls the unoptimized versions
867ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian * of variance() and highbd_8_variance(). It should not.
877ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian */
887bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void aq_variance(const uint8_t *a, int a_stride, const uint8_t *b,
897bc9febe8749e98a3812a0dc4380ceae75c29450Johann                        int b_stride, int w, int h, unsigned int *sse,
907bc9febe8749e98a3812a0dc4380ceae75c29450Johann                        int *sum) {
917ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int i, j;
927ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
937ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  *sum = 0;
947ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  *sse = 0;
957ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
967ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (i = 0; i < h; i++) {
977ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    for (j = 0; j < w; j++) {
987ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      const int diff = a[j] - b[j];
997ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      *sum += diff;
1007ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      *sse += diff * diff;
1017ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    }
1025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
1037ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    a += a_stride;
1047ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    b += b_stride;
1057ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  }
1067ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
1075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
1087ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH
1097bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void aq_highbd_variance64(const uint8_t *a8, int a_stride,
1107bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                 const uint8_t *b8, int b_stride, int w, int h,
1117bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                 uint64_t *sse, uint64_t *sum) {
1127ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  int i, j;
1137ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1147ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  uint16_t *a = CONVERT_TO_SHORTPTR(a8);
1157ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  uint16_t *b = CONVERT_TO_SHORTPTR(b8);
1167ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  *sum = 0;
1177ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  *sse = 0;
1187ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian
1197ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  for (i = 0; i < h; i++) {
1207ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    for (j = 0; j < w; j++) {
1217ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      const int diff = a[j] - b[j];
1227ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      *sum += diff;
1237ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      *sse += diff * diff;
1242ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian    }
1257ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    a += a_stride;
1267ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    b += b_stride;
1275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
1285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
1295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
1307bc9febe8749e98a3812a0dc4380ceae75c29450Johannstatic void aq_highbd_8_variance(const uint8_t *a8, int a_stride,
1317bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                 const uint8_t *b8, int b_stride, int w, int h,
1327bc9febe8749e98a3812a0dc4380ceae75c29450Johann                                 unsigned int *sse, int *sum) {
1337ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  uint64_t sse_long = 0;
1347ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  uint64_t sum_long = 0;
1357ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  aq_highbd_variance64(a8, a_stride, b8, b_stride, w, h, &sse_long, &sum_long);
1367ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  *sse = (unsigned int)sse_long;
1377ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  *sum = (int)sum_long;
1387ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
1397ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif  // CONFIG_VP9_HIGHBITDEPTH
1405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
1415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangstatic unsigned int block_variance(VP9_COMP *cpi, MACROBLOCK *x,
1425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                                   BLOCK_SIZE bs) {
1435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  MACROBLOCKD *xd = &x->e_mbd;
1445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  unsigned int var, sse;
1457bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int right_overflow =
1467bc9febe8749e98a3812a0dc4380ceae75c29450Johann      (xd->mb_to_right_edge < 0) ? ((-xd->mb_to_right_edge) >> 3) : 0;
1477bc9febe8749e98a3812a0dc4380ceae75c29450Johann  int bottom_overflow =
1487bc9febe8749e98a3812a0dc4380ceae75c29450Johann      (xd->mb_to_bottom_edge < 0) ? ((-xd->mb_to_bottom_edge) >> 3) : 0;
1495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
1505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  if (right_overflow || bottom_overflow) {
1515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const int bw = 8 * num_8x8_blocks_wide_lookup[bs] - right_overflow;
1525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    const int bh = 8 * num_8x8_blocks_high_lookup[bs] - bottom_overflow;
1535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    int avg;
1547ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH
1557ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
1567ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      aq_highbd_8_variance(x->plane[0].src.buf, x->plane[0].src.stride,
1577ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                           CONVERT_TO_BYTEPTR(vp9_highbd_64_zeros), 0, bw, bh,
1587ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                           &sse, &avg);
1597ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      sse >>= 2 * (xd->bd - 8);
1607ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian      avg >>= (xd->bd - 8);
1617ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    } else {
1627bc9febe8749e98a3812a0dc4380ceae75c29450Johann      aq_variance(x->plane[0].src.buf, x->plane[0].src.stride, vp9_64_zeros, 0,
1637bc9febe8749e98a3812a0dc4380ceae75c29450Johann                  bw, bh, &sse, &avg);
1647ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    }
1657ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#else
1667bc9febe8749e98a3812a0dc4380ceae75c29450Johann    aq_variance(x->plane[0].src.buf, x->plane[0].src.stride, vp9_64_zeros, 0,
1677bc9febe8749e98a3812a0dc4380ceae75c29450Johann                bw, bh, &sse, &avg);
1687ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif  // CONFIG_VP9_HIGHBITDEPTH
1697bc9febe8749e98a3812a0dc4380ceae75c29450Johann    var = sse - (unsigned int)(((int64_t)avg * avg) / (bw * bh));
17068e1c830ade592be74773e249bf94e2bbfb50de7Johann    return (unsigned int)(((uint64_t)256 * var) / (bw * bh));
1715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  } else {
1727ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH
1737ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
1747bc9febe8749e98a3812a0dc4380ceae75c29450Johann      var =
1757bc9febe8749e98a3812a0dc4380ceae75c29450Johann          cpi->fn_ptr[bs].vf(x->plane[0].src.buf, x->plane[0].src.stride,
1767bc9febe8749e98a3812a0dc4380ceae75c29450Johann                             CONVERT_TO_BYTEPTR(vp9_highbd_64_zeros), 0, &sse);
1777ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    } else {
1787bc9febe8749e98a3812a0dc4380ceae75c29450Johann      var = cpi->fn_ptr[bs].vf(x->plane[0].src.buf, x->plane[0].src.stride,
1797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian                               vp9_64_zeros, 0, &sse);
1807ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian    }
1817ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#else
1827bc9febe8749e98a3812a0dc4380ceae75c29450Johann    var = cpi->fn_ptr[bs].vf(x->plane[0].src.buf, x->plane[0].src.stride,
1835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang                             vp9_64_zeros, 0, &sse);
1847ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif  // CONFIG_VP9_HIGHBITDEPTH
18568e1c830ade592be74773e249bf94e2bbfb50de7Johann    return (unsigned int)(((uint64_t)256 * var) >> num_pels_log2_lookup[bs]);
1865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  }
1875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
1885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
1897ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramaniandouble vp9_log_block_var(VP9_COMP *cpi, MACROBLOCK *x, BLOCK_SIZE bs) {
1905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang  unsigned int var = block_variance(cpi, x, bs);
1917ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  vpx_clear_system_state();
1927ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  return log(var + 1.0);
1937ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian}
1945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang
1957ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#define DEFAULT_E_MIDPOINT 10.0
1967ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianint vp9_block_energy(VP9_COMP *cpi, MACROBLOCK *x, BLOCK_SIZE bs) {
1977ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  double energy;
1987ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  double energy_midpoint;
1997ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  vpx_clear_system_state();
2007ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  energy_midpoint =
2017bc9febe8749e98a3812a0dc4380ceae75c29450Johann      (cpi->oxcf.pass == 2) ? cpi->twopass.mb_av_energy : DEFAULT_E_MIDPOINT;
2027ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian  energy = vp9_log_block_var(cpi, x, bs) - energy_midpoint;
2032ec72e65689c948e92b826ae1e867bf369e72f13Vignesh Venkatasubramanian  return clamp((int)round(energy), ENERGY_MIN, ENERGY_MAX);
2045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang}
205