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