11b362b15af34006e6a11974088a46d42b903418eJohann/* 21b362b15af34006e6a11974088a46d42b903418eJohann * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 31b362b15af34006e6a11974088a46d42b903418eJohann * 41b362b15af34006e6a11974088a46d42b903418eJohann * Use of this source code is governed by a BSD-style license 51b362b15af34006e6a11974088a46d42b903418eJohann * that can be found in the LICENSE file in the root of the source 61b362b15af34006e6a11974088a46d42b903418eJohann * tree. An additional intellectual property rights grant can be found 71b362b15af34006e6a11974088a46d42b903418eJohann * in the file PATENTS. All contributing project authors may 81b362b15af34006e6a11974088a46d42b903418eJohann * be found in the AUTHORS file in the root of the source tree. 91b362b15af34006e6a11974088a46d42b903418eJohann */ 101b362b15af34006e6a11974088a46d42b903418eJohann 111b362b15af34006e6a11974088a46d42b903418eJohann 121b362b15af34006e6a11974088a46d42b903418eJohann#include <stdio.h> 131b362b15af34006e6a11974088a46d42b903418eJohann#include <math.h> 141b362b15af34006e6a11974088a46d42b903418eJohann#include <limits.h> 151b362b15af34006e6a11974088a46d42b903418eJohann#include <assert.h> 161b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_config.h" 171b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_rtcd.h" 181b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/pragmas.h" 191b362b15af34006e6a11974088a46d42b903418eJohann#include "tokenize.h" 201b362b15af34006e6a11974088a46d42b903418eJohann#include "treewriter.h" 211b362b15af34006e6a11974088a46d42b903418eJohann#include "onyx_int.h" 221b362b15af34006e6a11974088a46d42b903418eJohann#include "modecosts.h" 231b362b15af34006e6a11974088a46d42b903418eJohann#include "encodeintra.h" 241b362b15af34006e6a11974088a46d42b903418eJohann#include "pickinter.h" 251b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/entropymode.h" 261b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/reconinter.h" 271b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/reconintra4x4.h" 281b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/findnearmv.h" 291b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/quant_common.h" 301b362b15af34006e6a11974088a46d42b903418eJohann#include "encodemb.h" 311b362b15af34006e6a11974088a46d42b903418eJohann#include "quantize.h" 321b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/variance.h" 331b362b15af34006e6a11974088a46d42b903418eJohann#include "mcomp.h" 341b362b15af34006e6a11974088a46d42b903418eJohann#include "rdopt.h" 351b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_mem/vpx_mem.h" 361b362b15af34006e6a11974088a46d42b903418eJohann#include "vp8/common/systemdependent.h" 371b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_TEMPORAL_DENOISING 381b362b15af34006e6a11974088a46d42b903418eJohann#include "denoising.h" 391b362b15af34006e6a11974088a46d42b903418eJohann#endif 401b362b15af34006e6a11974088a46d42b903418eJohannextern void vp8_update_zbin_extra(VP8_COMP *cpi, MACROBLOCK *x); 411b362b15af34006e6a11974088a46d42b903418eJohann 421b362b15af34006e6a11974088a46d42b903418eJohann#define MAXF(a,b) (((a) > (b)) ? (a) : (b)) 431b362b15af34006e6a11974088a46d42b903418eJohann 441b362b15af34006e6a11974088a46d42b903418eJohanntypedef struct rate_distortion_struct 451b362b15af34006e6a11974088a46d42b903418eJohann{ 461b362b15af34006e6a11974088a46d42b903418eJohann int rate2; 471b362b15af34006e6a11974088a46d42b903418eJohann int rate_y; 481b362b15af34006e6a11974088a46d42b903418eJohann int rate_uv; 491b362b15af34006e6a11974088a46d42b903418eJohann int distortion2; 501b362b15af34006e6a11974088a46d42b903418eJohann int distortion_uv; 511b362b15af34006e6a11974088a46d42b903418eJohann} RATE_DISTORTION; 521b362b15af34006e6a11974088a46d42b903418eJohann 531b362b15af34006e6a11974088a46d42b903418eJohanntypedef struct best_mode_struct 541b362b15af34006e6a11974088a46d42b903418eJohann{ 551b362b15af34006e6a11974088a46d42b903418eJohann int yrd; 561b362b15af34006e6a11974088a46d42b903418eJohann int rd; 571b362b15af34006e6a11974088a46d42b903418eJohann int intra_rd; 581b362b15af34006e6a11974088a46d42b903418eJohann MB_MODE_INFO mbmode; 591b362b15af34006e6a11974088a46d42b903418eJohann union b_mode_info bmodes[16]; 601b362b15af34006e6a11974088a46d42b903418eJohann PARTITION_INFO partition; 611b362b15af34006e6a11974088a46d42b903418eJohann} BEST_MODE; 621b362b15af34006e6a11974088a46d42b903418eJohann 631b362b15af34006e6a11974088a46d42b903418eJohannstatic const int auto_speed_thresh[17] = 641b362b15af34006e6a11974088a46d42b903418eJohann{ 651b362b15af34006e6a11974088a46d42b903418eJohann 1000, 661b362b15af34006e6a11974088a46d42b903418eJohann 200, 671b362b15af34006e6a11974088a46d42b903418eJohann 150, 681b362b15af34006e6a11974088a46d42b903418eJohann 130, 691b362b15af34006e6a11974088a46d42b903418eJohann 150, 701b362b15af34006e6a11974088a46d42b903418eJohann 125, 711b362b15af34006e6a11974088a46d42b903418eJohann 120, 721b362b15af34006e6a11974088a46d42b903418eJohann 115, 731b362b15af34006e6a11974088a46d42b903418eJohann 115, 741b362b15af34006e6a11974088a46d42b903418eJohann 115, 751b362b15af34006e6a11974088a46d42b903418eJohann 115, 761b362b15af34006e6a11974088a46d42b903418eJohann 115, 771b362b15af34006e6a11974088a46d42b903418eJohann 115, 781b362b15af34006e6a11974088a46d42b903418eJohann 115, 791b362b15af34006e6a11974088a46d42b903418eJohann 115, 801b362b15af34006e6a11974088a46d42b903418eJohann 115, 811b362b15af34006e6a11974088a46d42b903418eJohann 105 821b362b15af34006e6a11974088a46d42b903418eJohann}; 831b362b15af34006e6a11974088a46d42b903418eJohann 841b362b15af34006e6a11974088a46d42b903418eJohannconst MB_PREDICTION_MODE vp8_mode_order[MAX_MODES] = 851b362b15af34006e6a11974088a46d42b903418eJohann{ 861b362b15af34006e6a11974088a46d42b903418eJohann ZEROMV, 871b362b15af34006e6a11974088a46d42b903418eJohann DC_PRED, 881b362b15af34006e6a11974088a46d42b903418eJohann 891b362b15af34006e6a11974088a46d42b903418eJohann NEARESTMV, 901b362b15af34006e6a11974088a46d42b903418eJohann NEARMV, 911b362b15af34006e6a11974088a46d42b903418eJohann 921b362b15af34006e6a11974088a46d42b903418eJohann ZEROMV, 931b362b15af34006e6a11974088a46d42b903418eJohann NEARESTMV, 941b362b15af34006e6a11974088a46d42b903418eJohann 951b362b15af34006e6a11974088a46d42b903418eJohann ZEROMV, 961b362b15af34006e6a11974088a46d42b903418eJohann NEARESTMV, 971b362b15af34006e6a11974088a46d42b903418eJohann 981b362b15af34006e6a11974088a46d42b903418eJohann NEARMV, 991b362b15af34006e6a11974088a46d42b903418eJohann NEARMV, 1001b362b15af34006e6a11974088a46d42b903418eJohann 1011b362b15af34006e6a11974088a46d42b903418eJohann V_PRED, 1021b362b15af34006e6a11974088a46d42b903418eJohann H_PRED, 1031b362b15af34006e6a11974088a46d42b903418eJohann TM_PRED, 1041b362b15af34006e6a11974088a46d42b903418eJohann 1051b362b15af34006e6a11974088a46d42b903418eJohann NEWMV, 1061b362b15af34006e6a11974088a46d42b903418eJohann NEWMV, 1071b362b15af34006e6a11974088a46d42b903418eJohann NEWMV, 1081b362b15af34006e6a11974088a46d42b903418eJohann 1091b362b15af34006e6a11974088a46d42b903418eJohann SPLITMV, 1101b362b15af34006e6a11974088a46d42b903418eJohann SPLITMV, 1111b362b15af34006e6a11974088a46d42b903418eJohann SPLITMV, 1121b362b15af34006e6a11974088a46d42b903418eJohann 1131b362b15af34006e6a11974088a46d42b903418eJohann B_PRED, 1141b362b15af34006e6a11974088a46d42b903418eJohann}; 1151b362b15af34006e6a11974088a46d42b903418eJohann 1161b362b15af34006e6a11974088a46d42b903418eJohann/* This table determines the search order in reference frame priority order, 1171b362b15af34006e6a11974088a46d42b903418eJohann * which may not necessarily match INTRA,LAST,GOLDEN,ARF 1181b362b15af34006e6a11974088a46d42b903418eJohann */ 1191b362b15af34006e6a11974088a46d42b903418eJohannconst int vp8_ref_frame_order[MAX_MODES] = 1201b362b15af34006e6a11974088a46d42b903418eJohann{ 1211b362b15af34006e6a11974088a46d42b903418eJohann 1, 1221b362b15af34006e6a11974088a46d42b903418eJohann 0, 1231b362b15af34006e6a11974088a46d42b903418eJohann 1241b362b15af34006e6a11974088a46d42b903418eJohann 1, 1251b362b15af34006e6a11974088a46d42b903418eJohann 1, 1261b362b15af34006e6a11974088a46d42b903418eJohann 1271b362b15af34006e6a11974088a46d42b903418eJohann 2, 1281b362b15af34006e6a11974088a46d42b903418eJohann 2, 1291b362b15af34006e6a11974088a46d42b903418eJohann 1301b362b15af34006e6a11974088a46d42b903418eJohann 3, 1311b362b15af34006e6a11974088a46d42b903418eJohann 3, 1321b362b15af34006e6a11974088a46d42b903418eJohann 1331b362b15af34006e6a11974088a46d42b903418eJohann 2, 1341b362b15af34006e6a11974088a46d42b903418eJohann 3, 1351b362b15af34006e6a11974088a46d42b903418eJohann 1361b362b15af34006e6a11974088a46d42b903418eJohann 0, 1371b362b15af34006e6a11974088a46d42b903418eJohann 0, 1381b362b15af34006e6a11974088a46d42b903418eJohann 0, 1391b362b15af34006e6a11974088a46d42b903418eJohann 1401b362b15af34006e6a11974088a46d42b903418eJohann 1, 1411b362b15af34006e6a11974088a46d42b903418eJohann 2, 1421b362b15af34006e6a11974088a46d42b903418eJohann 3, 1431b362b15af34006e6a11974088a46d42b903418eJohann 1441b362b15af34006e6a11974088a46d42b903418eJohann 1, 1451b362b15af34006e6a11974088a46d42b903418eJohann 2, 1461b362b15af34006e6a11974088a46d42b903418eJohann 3, 1471b362b15af34006e6a11974088a46d42b903418eJohann 1481b362b15af34006e6a11974088a46d42b903418eJohann 0, 1491b362b15af34006e6a11974088a46d42b903418eJohann}; 1501b362b15af34006e6a11974088a46d42b903418eJohann 1511b362b15af34006e6a11974088a46d42b903418eJohannstatic void fill_token_costs( 1521b362b15af34006e6a11974088a46d42b903418eJohann int c[BLOCK_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS][MAX_ENTROPY_TOKENS], 1531b362b15af34006e6a11974088a46d42b903418eJohann const vp8_prob p[BLOCK_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS][ENTROPY_NODES] 1541b362b15af34006e6a11974088a46d42b903418eJohann) 1551b362b15af34006e6a11974088a46d42b903418eJohann{ 1561b362b15af34006e6a11974088a46d42b903418eJohann int i, j, k; 1571b362b15af34006e6a11974088a46d42b903418eJohann 1581b362b15af34006e6a11974088a46d42b903418eJohann 1591b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < BLOCK_TYPES; i++) 1601b362b15af34006e6a11974088a46d42b903418eJohann for (j = 0; j < COEF_BANDS; j++) 1611b362b15af34006e6a11974088a46d42b903418eJohann for (k = 0; k < PREV_COEF_CONTEXTS; k++) 1621b362b15af34006e6a11974088a46d42b903418eJohann 1631b362b15af34006e6a11974088a46d42b903418eJohann /* check for pt=0 and band > 1 if block type 0 1641b362b15af34006e6a11974088a46d42b903418eJohann * and 0 if blocktype 1 1651b362b15af34006e6a11974088a46d42b903418eJohann */ 1661b362b15af34006e6a11974088a46d42b903418eJohann if (k == 0 && j > (i == 0)) 1671b362b15af34006e6a11974088a46d42b903418eJohann vp8_cost_tokens2(c[i][j][k], p [i][j][k], vp8_coef_tree, 2); 1681b362b15af34006e6a11974088a46d42b903418eJohann else 1691b362b15af34006e6a11974088a46d42b903418eJohann vp8_cost_tokens(c[i][j][k], p [i][j][k], vp8_coef_tree); 1701b362b15af34006e6a11974088a46d42b903418eJohann} 1711b362b15af34006e6a11974088a46d42b903418eJohann 1721b362b15af34006e6a11974088a46d42b903418eJohannstatic const int rd_iifactor[32] = 1731b362b15af34006e6a11974088a46d42b903418eJohann{ 1741b362b15af34006e6a11974088a46d42b903418eJohann 4, 4, 3, 2, 1, 0, 0, 0, 1751b362b15af34006e6a11974088a46d42b903418eJohann 0, 0, 0, 0, 0, 0, 0, 0, 1761b362b15af34006e6a11974088a46d42b903418eJohann 0, 0, 0, 0, 0, 0, 0, 0, 1771b362b15af34006e6a11974088a46d42b903418eJohann 0, 0, 0, 0, 0, 0, 0, 0 1781b362b15af34006e6a11974088a46d42b903418eJohann}; 1791b362b15af34006e6a11974088a46d42b903418eJohann 1801b362b15af34006e6a11974088a46d42b903418eJohann/* values are now correlated to quantizer */ 1811b362b15af34006e6a11974088a46d42b903418eJohannstatic const int sad_per_bit16lut[QINDEX_RANGE] = 1821b362b15af34006e6a11974088a46d42b903418eJohann{ 1831b362b15af34006e6a11974088a46d42b903418eJohann 2, 2, 2, 2, 2, 2, 2, 2, 1841b362b15af34006e6a11974088a46d42b903418eJohann 2, 2, 2, 2, 2, 2, 2, 2, 1851b362b15af34006e6a11974088a46d42b903418eJohann 3, 3, 3, 3, 3, 3, 3, 3, 1861b362b15af34006e6a11974088a46d42b903418eJohann 3, 3, 3, 3, 3, 3, 4, 4, 1871b362b15af34006e6a11974088a46d42b903418eJohann 4, 4, 4, 4, 4, 4, 4, 4, 1881b362b15af34006e6a11974088a46d42b903418eJohann 4, 4, 5, 5, 5, 5, 5, 5, 1891b362b15af34006e6a11974088a46d42b903418eJohann 5, 5, 5, 5, 5, 5, 6, 6, 1901b362b15af34006e6a11974088a46d42b903418eJohann 6, 6, 6, 6, 6, 6, 6, 6, 1911b362b15af34006e6a11974088a46d42b903418eJohann 6, 6, 7, 7, 7, 7, 7, 7, 1921b362b15af34006e6a11974088a46d42b903418eJohann 7, 7, 7, 7, 7, 7, 8, 8, 1931b362b15af34006e6a11974088a46d42b903418eJohann 8, 8, 8, 8, 8, 8, 8, 8, 1941b362b15af34006e6a11974088a46d42b903418eJohann 8, 8, 9, 9, 9, 9, 9, 9, 1951b362b15af34006e6a11974088a46d42b903418eJohann 9, 9, 9, 9, 9, 9, 10, 10, 1961b362b15af34006e6a11974088a46d42b903418eJohann 10, 10, 10, 10, 10, 10, 11, 11, 1971b362b15af34006e6a11974088a46d42b903418eJohann 11, 11, 11, 11, 12, 12, 12, 12, 1981b362b15af34006e6a11974088a46d42b903418eJohann 12, 12, 13, 13, 13, 13, 14, 14 1991b362b15af34006e6a11974088a46d42b903418eJohann}; 2001b362b15af34006e6a11974088a46d42b903418eJohannstatic const int sad_per_bit4lut[QINDEX_RANGE] = 2011b362b15af34006e6a11974088a46d42b903418eJohann{ 2021b362b15af34006e6a11974088a46d42b903418eJohann 2, 2, 2, 2, 2, 2, 3, 3, 2031b362b15af34006e6a11974088a46d42b903418eJohann 3, 3, 3, 3, 3, 3, 3, 3, 2041b362b15af34006e6a11974088a46d42b903418eJohann 3, 3, 3, 3, 4, 4, 4, 4, 2051b362b15af34006e6a11974088a46d42b903418eJohann 4, 4, 4, 4, 4, 4, 5, 5, 2061b362b15af34006e6a11974088a46d42b903418eJohann 5, 5, 5, 5, 6, 6, 6, 6, 2071b362b15af34006e6a11974088a46d42b903418eJohann 6, 6, 6, 6, 6, 6, 6, 6, 2081b362b15af34006e6a11974088a46d42b903418eJohann 7, 7, 7, 7, 7, 7, 7, 7, 2091b362b15af34006e6a11974088a46d42b903418eJohann 7, 7, 7, 7, 7, 8, 8, 8, 2101b362b15af34006e6a11974088a46d42b903418eJohann 8, 8, 9, 9, 9, 9, 9, 9, 2111b362b15af34006e6a11974088a46d42b903418eJohann 10, 10, 10, 10, 10, 10, 10, 10, 2121b362b15af34006e6a11974088a46d42b903418eJohann 11, 11, 11, 11, 11, 11, 11, 11, 2131b362b15af34006e6a11974088a46d42b903418eJohann 12, 12, 12, 12, 12, 12, 12, 12, 2141b362b15af34006e6a11974088a46d42b903418eJohann 13, 13, 13, 13, 13, 13, 13, 14, 2151b362b15af34006e6a11974088a46d42b903418eJohann 14, 14, 14, 14, 15, 15, 15, 15, 2161b362b15af34006e6a11974088a46d42b903418eJohann 16, 16, 16, 16, 17, 17, 17, 18, 2171b362b15af34006e6a11974088a46d42b903418eJohann 18, 18, 19, 19, 19, 20, 20, 20, 2181b362b15af34006e6a11974088a46d42b903418eJohann}; 2191b362b15af34006e6a11974088a46d42b903418eJohann 2201b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8cx_initialize_me_consts(VP8_COMP *cpi, int QIndex) 2211b362b15af34006e6a11974088a46d42b903418eJohann{ 2221b362b15af34006e6a11974088a46d42b903418eJohann cpi->mb.sadperbit16 = sad_per_bit16lut[QIndex]; 2231b362b15af34006e6a11974088a46d42b903418eJohann cpi->mb.sadperbit4 = sad_per_bit4lut[QIndex]; 2241b362b15af34006e6a11974088a46d42b903418eJohann} 2251b362b15af34006e6a11974088a46d42b903418eJohann 2261b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_initialize_rd_consts(VP8_COMP *cpi, int Qvalue) 2271b362b15af34006e6a11974088a46d42b903418eJohann{ 2281b362b15af34006e6a11974088a46d42b903418eJohann int q; 2291b362b15af34006e6a11974088a46d42b903418eJohann int i; 2301b362b15af34006e6a11974088a46d42b903418eJohann double capped_q = (Qvalue < 160) ? (double)Qvalue : 160.0; 2311b362b15af34006e6a11974088a46d42b903418eJohann double rdconst = 2.80; 2321b362b15af34006e6a11974088a46d42b903418eJohann 2331b362b15af34006e6a11974088a46d42b903418eJohann vp8_clear_system_state(); 2341b362b15af34006e6a11974088a46d42b903418eJohann 2351b362b15af34006e6a11974088a46d42b903418eJohann /* Further tests required to see if optimum is different 2361b362b15af34006e6a11974088a46d42b903418eJohann * for key frames, golden frames and arf frames. 2371b362b15af34006e6a11974088a46d42b903418eJohann */ 2381b362b15af34006e6a11974088a46d42b903418eJohann cpi->RDMULT = (int)(rdconst * (capped_q * capped_q)); 2391b362b15af34006e6a11974088a46d42b903418eJohann 2401b362b15af34006e6a11974088a46d42b903418eJohann /* Extend rate multiplier along side quantizer zbin increases */ 2411b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->zbin_over_quant > 0) 2421b362b15af34006e6a11974088a46d42b903418eJohann { 2431b362b15af34006e6a11974088a46d42b903418eJohann double oq_factor; 2441b362b15af34006e6a11974088a46d42b903418eJohann double modq; 2451b362b15af34006e6a11974088a46d42b903418eJohann 2461b362b15af34006e6a11974088a46d42b903418eJohann /* Experimental code using the same basic equation as used for Q above 2471b362b15af34006e6a11974088a46d42b903418eJohann * The units of cpi->zbin_over_quant are 1/128 of Q bin size 2481b362b15af34006e6a11974088a46d42b903418eJohann */ 2491b362b15af34006e6a11974088a46d42b903418eJohann oq_factor = 1.0 + ((double)0.0015625 * cpi->zbin_over_quant); 2501b362b15af34006e6a11974088a46d42b903418eJohann modq = (int)((double)capped_q * oq_factor); 2511b362b15af34006e6a11974088a46d42b903418eJohann cpi->RDMULT = (int)(rdconst * (modq * modq)); 2521b362b15af34006e6a11974088a46d42b903418eJohann } 2531b362b15af34006e6a11974088a46d42b903418eJohann 2541b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->pass == 2 && (cpi->common.frame_type != KEY_FRAME)) 2551b362b15af34006e6a11974088a46d42b903418eJohann { 2561b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->twopass.next_iiratio > 31) 2571b362b15af34006e6a11974088a46d42b903418eJohann cpi->RDMULT += (cpi->RDMULT * rd_iifactor[31]) >> 4; 2581b362b15af34006e6a11974088a46d42b903418eJohann else 2591b362b15af34006e6a11974088a46d42b903418eJohann cpi->RDMULT += 2601b362b15af34006e6a11974088a46d42b903418eJohann (cpi->RDMULT * rd_iifactor[cpi->twopass.next_iiratio]) >> 4; 2611b362b15af34006e6a11974088a46d42b903418eJohann } 2621b362b15af34006e6a11974088a46d42b903418eJohann 2631b362b15af34006e6a11974088a46d42b903418eJohann cpi->mb.errorperbit = (cpi->RDMULT / 110); 2641b362b15af34006e6a11974088a46d42b903418eJohann cpi->mb.errorperbit += (cpi->mb.errorperbit==0); 2651b362b15af34006e6a11974088a46d42b903418eJohann 2661b362b15af34006e6a11974088a46d42b903418eJohann vp8_set_speed_features(cpi); 2671b362b15af34006e6a11974088a46d42b903418eJohann 2681b362b15af34006e6a11974088a46d42b903418eJohann q = (int)pow(Qvalue, 1.25); 2691b362b15af34006e6a11974088a46d42b903418eJohann 2701b362b15af34006e6a11974088a46d42b903418eJohann if (q < 8) 2711b362b15af34006e6a11974088a46d42b903418eJohann q = 8; 2721b362b15af34006e6a11974088a46d42b903418eJohann 2731b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->RDMULT > 1000) 2741b362b15af34006e6a11974088a46d42b903418eJohann { 2751b362b15af34006e6a11974088a46d42b903418eJohann cpi->RDDIV = 1; 2761b362b15af34006e6a11974088a46d42b903418eJohann cpi->RDMULT /= 100; 2771b362b15af34006e6a11974088a46d42b903418eJohann 2781b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < MAX_MODES; i++) 2791b362b15af34006e6a11974088a46d42b903418eJohann { 2801b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->sf.thresh_mult[i] < INT_MAX) 2811b362b15af34006e6a11974088a46d42b903418eJohann { 2821b362b15af34006e6a11974088a46d42b903418eJohann cpi->rd_threshes[i] = cpi->sf.thresh_mult[i] * q / 100; 2831b362b15af34006e6a11974088a46d42b903418eJohann } 2841b362b15af34006e6a11974088a46d42b903418eJohann else 2851b362b15af34006e6a11974088a46d42b903418eJohann { 2861b362b15af34006e6a11974088a46d42b903418eJohann cpi->rd_threshes[i] = INT_MAX; 2871b362b15af34006e6a11974088a46d42b903418eJohann } 2881b362b15af34006e6a11974088a46d42b903418eJohann 2891b362b15af34006e6a11974088a46d42b903418eJohann cpi->rd_baseline_thresh[i] = cpi->rd_threshes[i]; 2901b362b15af34006e6a11974088a46d42b903418eJohann } 2911b362b15af34006e6a11974088a46d42b903418eJohann } 2921b362b15af34006e6a11974088a46d42b903418eJohann else 2931b362b15af34006e6a11974088a46d42b903418eJohann { 2941b362b15af34006e6a11974088a46d42b903418eJohann cpi->RDDIV = 100; 2951b362b15af34006e6a11974088a46d42b903418eJohann 2961b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < MAX_MODES; i++) 2971b362b15af34006e6a11974088a46d42b903418eJohann { 2981b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->sf.thresh_mult[i] < (INT_MAX / q)) 2991b362b15af34006e6a11974088a46d42b903418eJohann { 3001b362b15af34006e6a11974088a46d42b903418eJohann cpi->rd_threshes[i] = cpi->sf.thresh_mult[i] * q; 3011b362b15af34006e6a11974088a46d42b903418eJohann } 3021b362b15af34006e6a11974088a46d42b903418eJohann else 3031b362b15af34006e6a11974088a46d42b903418eJohann { 3041b362b15af34006e6a11974088a46d42b903418eJohann cpi->rd_threshes[i] = INT_MAX; 3051b362b15af34006e6a11974088a46d42b903418eJohann } 3061b362b15af34006e6a11974088a46d42b903418eJohann 3071b362b15af34006e6a11974088a46d42b903418eJohann cpi->rd_baseline_thresh[i] = cpi->rd_threshes[i]; 3081b362b15af34006e6a11974088a46d42b903418eJohann } 3091b362b15af34006e6a11974088a46d42b903418eJohann } 3101b362b15af34006e6a11974088a46d42b903418eJohann 3111b362b15af34006e6a11974088a46d42b903418eJohann { 3121b362b15af34006e6a11974088a46d42b903418eJohann /* build token cost array for the type of frame we have now */ 3131b362b15af34006e6a11974088a46d42b903418eJohann FRAME_CONTEXT *l = &cpi->lfc_n; 3141b362b15af34006e6a11974088a46d42b903418eJohann 3151b362b15af34006e6a11974088a46d42b903418eJohann if(cpi->common.refresh_alt_ref_frame) 3161b362b15af34006e6a11974088a46d42b903418eJohann l = &cpi->lfc_a; 3171b362b15af34006e6a11974088a46d42b903418eJohann else if(cpi->common.refresh_golden_frame) 3181b362b15af34006e6a11974088a46d42b903418eJohann l = &cpi->lfc_g; 3191b362b15af34006e6a11974088a46d42b903418eJohann 3201b362b15af34006e6a11974088a46d42b903418eJohann fill_token_costs( 3211b362b15af34006e6a11974088a46d42b903418eJohann cpi->mb.token_costs, 3221b362b15af34006e6a11974088a46d42b903418eJohann (const vp8_prob( *)[8][3][11]) l->coef_probs 3231b362b15af34006e6a11974088a46d42b903418eJohann ); 3241b362b15af34006e6a11974088a46d42b903418eJohann /* 3251b362b15af34006e6a11974088a46d42b903418eJohann fill_token_costs( 3261b362b15af34006e6a11974088a46d42b903418eJohann cpi->mb.token_costs, 3271b362b15af34006e6a11974088a46d42b903418eJohann (const vp8_prob( *)[8][3][11]) cpi->common.fc.coef_probs); 3281b362b15af34006e6a11974088a46d42b903418eJohann */ 3291b362b15af34006e6a11974088a46d42b903418eJohann 3301b362b15af34006e6a11974088a46d42b903418eJohann 3311b362b15af34006e6a11974088a46d42b903418eJohann /* TODO make these mode costs depend on last,alt or gold too. (jbb) */ 3321b362b15af34006e6a11974088a46d42b903418eJohann vp8_init_mode_costs(cpi); 3331b362b15af34006e6a11974088a46d42b903418eJohann } 3341b362b15af34006e6a11974088a46d42b903418eJohann 3351b362b15af34006e6a11974088a46d42b903418eJohann} 3361b362b15af34006e6a11974088a46d42b903418eJohann 3371b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_auto_select_speed(VP8_COMP *cpi) 3381b362b15af34006e6a11974088a46d42b903418eJohann{ 3391b362b15af34006e6a11974088a46d42b903418eJohann int milliseconds_for_compress = (int)(1000000 / cpi->frame_rate); 3401b362b15af34006e6a11974088a46d42b903418eJohann 3411b362b15af34006e6a11974088a46d42b903418eJohann milliseconds_for_compress = milliseconds_for_compress * (16 - cpi->oxcf.cpu_used) / 16; 3421b362b15af34006e6a11974088a46d42b903418eJohann 3431b362b15af34006e6a11974088a46d42b903418eJohann#if 0 3441b362b15af34006e6a11974088a46d42b903418eJohann 3451b362b15af34006e6a11974088a46d42b903418eJohann if (0) 3461b362b15af34006e6a11974088a46d42b903418eJohann { 3471b362b15af34006e6a11974088a46d42b903418eJohann FILE *f; 3481b362b15af34006e6a11974088a46d42b903418eJohann 3491b362b15af34006e6a11974088a46d42b903418eJohann f = fopen("speed.stt", "a"); 3501b362b15af34006e6a11974088a46d42b903418eJohann fprintf(f, " %8ld %10ld %10ld %10ld\n", 3511b362b15af34006e6a11974088a46d42b903418eJohann cpi->common.current_video_frame, cpi->Speed, milliseconds_for_compress, cpi->avg_pick_mode_time); 3521b362b15af34006e6a11974088a46d42b903418eJohann fclose(f); 3531b362b15af34006e6a11974088a46d42b903418eJohann } 3541b362b15af34006e6a11974088a46d42b903418eJohann 3551b362b15af34006e6a11974088a46d42b903418eJohann#endif 3561b362b15af34006e6a11974088a46d42b903418eJohann 3571b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->avg_pick_mode_time < milliseconds_for_compress && (cpi->avg_encode_time - cpi->avg_pick_mode_time) < milliseconds_for_compress) 3581b362b15af34006e6a11974088a46d42b903418eJohann { 3591b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->avg_pick_mode_time == 0) 3601b362b15af34006e6a11974088a46d42b903418eJohann { 3611b362b15af34006e6a11974088a46d42b903418eJohann cpi->Speed = 4; 3621b362b15af34006e6a11974088a46d42b903418eJohann } 3631b362b15af34006e6a11974088a46d42b903418eJohann else 3641b362b15af34006e6a11974088a46d42b903418eJohann { 3651b362b15af34006e6a11974088a46d42b903418eJohann if (milliseconds_for_compress * 100 < cpi->avg_encode_time * 95) 3661b362b15af34006e6a11974088a46d42b903418eJohann { 3671b362b15af34006e6a11974088a46d42b903418eJohann cpi->Speed += 2; 3681b362b15af34006e6a11974088a46d42b903418eJohann cpi->avg_pick_mode_time = 0; 3691b362b15af34006e6a11974088a46d42b903418eJohann cpi->avg_encode_time = 0; 3701b362b15af34006e6a11974088a46d42b903418eJohann 3711b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->Speed > 16) 3721b362b15af34006e6a11974088a46d42b903418eJohann { 3731b362b15af34006e6a11974088a46d42b903418eJohann cpi->Speed = 16; 3741b362b15af34006e6a11974088a46d42b903418eJohann } 3751b362b15af34006e6a11974088a46d42b903418eJohann } 3761b362b15af34006e6a11974088a46d42b903418eJohann 3771b362b15af34006e6a11974088a46d42b903418eJohann if (milliseconds_for_compress * 100 > cpi->avg_encode_time * auto_speed_thresh[cpi->Speed]) 3781b362b15af34006e6a11974088a46d42b903418eJohann { 3791b362b15af34006e6a11974088a46d42b903418eJohann cpi->Speed -= 1; 3801b362b15af34006e6a11974088a46d42b903418eJohann cpi->avg_pick_mode_time = 0; 3811b362b15af34006e6a11974088a46d42b903418eJohann cpi->avg_encode_time = 0; 3821b362b15af34006e6a11974088a46d42b903418eJohann 3831b362b15af34006e6a11974088a46d42b903418eJohann /* In real-time mode, cpi->speed is in [4, 16]. */ 3841b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->Speed < 4) 3851b362b15af34006e6a11974088a46d42b903418eJohann { 3861b362b15af34006e6a11974088a46d42b903418eJohann cpi->Speed = 4; 3871b362b15af34006e6a11974088a46d42b903418eJohann } 3881b362b15af34006e6a11974088a46d42b903418eJohann } 3891b362b15af34006e6a11974088a46d42b903418eJohann } 3901b362b15af34006e6a11974088a46d42b903418eJohann } 3911b362b15af34006e6a11974088a46d42b903418eJohann else 3921b362b15af34006e6a11974088a46d42b903418eJohann { 3931b362b15af34006e6a11974088a46d42b903418eJohann cpi->Speed += 4; 3941b362b15af34006e6a11974088a46d42b903418eJohann 3951b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->Speed > 16) 3961b362b15af34006e6a11974088a46d42b903418eJohann cpi->Speed = 16; 3971b362b15af34006e6a11974088a46d42b903418eJohann 3981b362b15af34006e6a11974088a46d42b903418eJohann 3991b362b15af34006e6a11974088a46d42b903418eJohann cpi->avg_pick_mode_time = 0; 4001b362b15af34006e6a11974088a46d42b903418eJohann cpi->avg_encode_time = 0; 4011b362b15af34006e6a11974088a46d42b903418eJohann } 4021b362b15af34006e6a11974088a46d42b903418eJohann} 4031b362b15af34006e6a11974088a46d42b903418eJohann 4041b362b15af34006e6a11974088a46d42b903418eJohannint vp8_block_error_c(short *coeff, short *dqcoeff) 4051b362b15af34006e6a11974088a46d42b903418eJohann{ 4061b362b15af34006e6a11974088a46d42b903418eJohann int i; 4071b362b15af34006e6a11974088a46d42b903418eJohann int error = 0; 4081b362b15af34006e6a11974088a46d42b903418eJohann 4091b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < 16; i++) 4101b362b15af34006e6a11974088a46d42b903418eJohann { 4111b362b15af34006e6a11974088a46d42b903418eJohann int this_diff = coeff[i] - dqcoeff[i]; 4121b362b15af34006e6a11974088a46d42b903418eJohann error += this_diff * this_diff; 4131b362b15af34006e6a11974088a46d42b903418eJohann } 4141b362b15af34006e6a11974088a46d42b903418eJohann 4151b362b15af34006e6a11974088a46d42b903418eJohann return error; 4161b362b15af34006e6a11974088a46d42b903418eJohann} 4171b362b15af34006e6a11974088a46d42b903418eJohann 4181b362b15af34006e6a11974088a46d42b903418eJohannint vp8_mbblock_error_c(MACROBLOCK *mb, int dc) 4191b362b15af34006e6a11974088a46d42b903418eJohann{ 4201b362b15af34006e6a11974088a46d42b903418eJohann BLOCK *be; 4211b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *bd; 4221b362b15af34006e6a11974088a46d42b903418eJohann int i, j; 4231b362b15af34006e6a11974088a46d42b903418eJohann int berror, error = 0; 4241b362b15af34006e6a11974088a46d42b903418eJohann 4251b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < 16; i++) 4261b362b15af34006e6a11974088a46d42b903418eJohann { 4271b362b15af34006e6a11974088a46d42b903418eJohann be = &mb->block[i]; 4281b362b15af34006e6a11974088a46d42b903418eJohann bd = &mb->e_mbd.block[i]; 4291b362b15af34006e6a11974088a46d42b903418eJohann 4301b362b15af34006e6a11974088a46d42b903418eJohann berror = 0; 4311b362b15af34006e6a11974088a46d42b903418eJohann 4321b362b15af34006e6a11974088a46d42b903418eJohann for (j = dc; j < 16; j++) 4331b362b15af34006e6a11974088a46d42b903418eJohann { 4341b362b15af34006e6a11974088a46d42b903418eJohann int this_diff = be->coeff[j] - bd->dqcoeff[j]; 4351b362b15af34006e6a11974088a46d42b903418eJohann berror += this_diff * this_diff; 4361b362b15af34006e6a11974088a46d42b903418eJohann } 4371b362b15af34006e6a11974088a46d42b903418eJohann 4381b362b15af34006e6a11974088a46d42b903418eJohann error += berror; 4391b362b15af34006e6a11974088a46d42b903418eJohann } 4401b362b15af34006e6a11974088a46d42b903418eJohann 4411b362b15af34006e6a11974088a46d42b903418eJohann return error; 4421b362b15af34006e6a11974088a46d42b903418eJohann} 4431b362b15af34006e6a11974088a46d42b903418eJohann 4441b362b15af34006e6a11974088a46d42b903418eJohannint vp8_mbuverror_c(MACROBLOCK *mb) 4451b362b15af34006e6a11974088a46d42b903418eJohann{ 4461b362b15af34006e6a11974088a46d42b903418eJohann 4471b362b15af34006e6a11974088a46d42b903418eJohann BLOCK *be; 4481b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *bd; 4491b362b15af34006e6a11974088a46d42b903418eJohann 4501b362b15af34006e6a11974088a46d42b903418eJohann 4511b362b15af34006e6a11974088a46d42b903418eJohann int i; 4521b362b15af34006e6a11974088a46d42b903418eJohann int error = 0; 4531b362b15af34006e6a11974088a46d42b903418eJohann 4541b362b15af34006e6a11974088a46d42b903418eJohann for (i = 16; i < 24; i++) 4551b362b15af34006e6a11974088a46d42b903418eJohann { 4561b362b15af34006e6a11974088a46d42b903418eJohann be = &mb->block[i]; 4571b362b15af34006e6a11974088a46d42b903418eJohann bd = &mb->e_mbd.block[i]; 4581b362b15af34006e6a11974088a46d42b903418eJohann 4591b362b15af34006e6a11974088a46d42b903418eJohann error += vp8_block_error_c(be->coeff, bd->dqcoeff); 4601b362b15af34006e6a11974088a46d42b903418eJohann } 4611b362b15af34006e6a11974088a46d42b903418eJohann 4621b362b15af34006e6a11974088a46d42b903418eJohann return error; 4631b362b15af34006e6a11974088a46d42b903418eJohann} 4641b362b15af34006e6a11974088a46d42b903418eJohann 4651b362b15af34006e6a11974088a46d42b903418eJohannint VP8_UVSSE(MACROBLOCK *x) 4661b362b15af34006e6a11974088a46d42b903418eJohann{ 4671b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *uptr, *vptr; 4681b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *upred_ptr = (*(x->block[16].base_src) + x->block[16].src); 4691b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *vpred_ptr = (*(x->block[20].base_src) + x->block[20].src); 4701b362b15af34006e6a11974088a46d42b903418eJohann int uv_stride = x->block[16].src_stride; 4711b362b15af34006e6a11974088a46d42b903418eJohann 4721b362b15af34006e6a11974088a46d42b903418eJohann unsigned int sse1 = 0; 4731b362b15af34006e6a11974088a46d42b903418eJohann unsigned int sse2 = 0; 4741b362b15af34006e6a11974088a46d42b903418eJohann int mv_row = x->e_mbd.mode_info_context->mbmi.mv.as_mv.row; 4751b362b15af34006e6a11974088a46d42b903418eJohann int mv_col = x->e_mbd.mode_info_context->mbmi.mv.as_mv.col; 4761b362b15af34006e6a11974088a46d42b903418eJohann int offset; 4771b362b15af34006e6a11974088a46d42b903418eJohann int pre_stride = x->e_mbd.pre.uv_stride; 4781b362b15af34006e6a11974088a46d42b903418eJohann 4791b362b15af34006e6a11974088a46d42b903418eJohann if (mv_row < 0) 4801b362b15af34006e6a11974088a46d42b903418eJohann mv_row -= 1; 4811b362b15af34006e6a11974088a46d42b903418eJohann else 4821b362b15af34006e6a11974088a46d42b903418eJohann mv_row += 1; 4831b362b15af34006e6a11974088a46d42b903418eJohann 4841b362b15af34006e6a11974088a46d42b903418eJohann if (mv_col < 0) 4851b362b15af34006e6a11974088a46d42b903418eJohann mv_col -= 1; 4861b362b15af34006e6a11974088a46d42b903418eJohann else 4871b362b15af34006e6a11974088a46d42b903418eJohann mv_col += 1; 4881b362b15af34006e6a11974088a46d42b903418eJohann 4891b362b15af34006e6a11974088a46d42b903418eJohann mv_row /= 2; 4901b362b15af34006e6a11974088a46d42b903418eJohann mv_col /= 2; 4911b362b15af34006e6a11974088a46d42b903418eJohann 4921b362b15af34006e6a11974088a46d42b903418eJohann offset = (mv_row >> 3) * pre_stride + (mv_col >> 3); 4931b362b15af34006e6a11974088a46d42b903418eJohann uptr = x->e_mbd.pre.u_buffer + offset; 4941b362b15af34006e6a11974088a46d42b903418eJohann vptr = x->e_mbd.pre.v_buffer + offset; 4951b362b15af34006e6a11974088a46d42b903418eJohann 4961b362b15af34006e6a11974088a46d42b903418eJohann if ((mv_row | mv_col) & 7) 4971b362b15af34006e6a11974088a46d42b903418eJohann { 4981b362b15af34006e6a11974088a46d42b903418eJohann vp8_sub_pixel_variance8x8(uptr, pre_stride, 4991b362b15af34006e6a11974088a46d42b903418eJohann mv_col & 7, mv_row & 7, upred_ptr, uv_stride, &sse2); 5001b362b15af34006e6a11974088a46d42b903418eJohann vp8_sub_pixel_variance8x8(vptr, pre_stride, 5011b362b15af34006e6a11974088a46d42b903418eJohann mv_col & 7, mv_row & 7, vpred_ptr, uv_stride, &sse1); 5021b362b15af34006e6a11974088a46d42b903418eJohann sse2 += sse1; 5031b362b15af34006e6a11974088a46d42b903418eJohann } 5041b362b15af34006e6a11974088a46d42b903418eJohann else 5051b362b15af34006e6a11974088a46d42b903418eJohann { 5061b362b15af34006e6a11974088a46d42b903418eJohann vp8_variance8x8(uptr, pre_stride, 5071b362b15af34006e6a11974088a46d42b903418eJohann upred_ptr, uv_stride, &sse2); 5081b362b15af34006e6a11974088a46d42b903418eJohann vp8_variance8x8(vptr, pre_stride, 5091b362b15af34006e6a11974088a46d42b903418eJohann vpred_ptr, uv_stride, &sse1); 5101b362b15af34006e6a11974088a46d42b903418eJohann sse2 += sse1; 5111b362b15af34006e6a11974088a46d42b903418eJohann } 5121b362b15af34006e6a11974088a46d42b903418eJohann return sse2; 5131b362b15af34006e6a11974088a46d42b903418eJohann 5141b362b15af34006e6a11974088a46d42b903418eJohann} 5151b362b15af34006e6a11974088a46d42b903418eJohann 5161b362b15af34006e6a11974088a46d42b903418eJohannstatic int cost_coeffs(MACROBLOCK *mb, BLOCKD *b, int type, ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l) 5171b362b15af34006e6a11974088a46d42b903418eJohann{ 5181b362b15af34006e6a11974088a46d42b903418eJohann int c = !type; /* start at coef 0, unless Y with Y2 */ 5191b362b15af34006e6a11974088a46d42b903418eJohann int eob = (int)(*b->eob); 5201b362b15af34006e6a11974088a46d42b903418eJohann int pt ; /* surrounding block/prev coef predictor */ 5211b362b15af34006e6a11974088a46d42b903418eJohann int cost = 0; 5221b362b15af34006e6a11974088a46d42b903418eJohann short *qcoeff_ptr = b->qcoeff; 5231b362b15af34006e6a11974088a46d42b903418eJohann 5241b362b15af34006e6a11974088a46d42b903418eJohann VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); 5251b362b15af34006e6a11974088a46d42b903418eJohann 5261b362b15af34006e6a11974088a46d42b903418eJohann# define QC( I) ( qcoeff_ptr [vp8_default_zig_zag1d[I]] ) 5271b362b15af34006e6a11974088a46d42b903418eJohann 5281b362b15af34006e6a11974088a46d42b903418eJohann for (; c < eob; c++) 5291b362b15af34006e6a11974088a46d42b903418eJohann { 5301b362b15af34006e6a11974088a46d42b903418eJohann int v = QC(c); 5311b362b15af34006e6a11974088a46d42b903418eJohann int t = vp8_dct_value_tokens_ptr[v].Token; 5321b362b15af34006e6a11974088a46d42b903418eJohann cost += mb->token_costs [type] [vp8_coef_bands[c]] [pt] [t]; 5331b362b15af34006e6a11974088a46d42b903418eJohann cost += vp8_dct_value_cost_ptr[v]; 5341b362b15af34006e6a11974088a46d42b903418eJohann pt = vp8_prev_token_class[t]; 5351b362b15af34006e6a11974088a46d42b903418eJohann } 5361b362b15af34006e6a11974088a46d42b903418eJohann 5371b362b15af34006e6a11974088a46d42b903418eJohann# undef QC 5381b362b15af34006e6a11974088a46d42b903418eJohann 5391b362b15af34006e6a11974088a46d42b903418eJohann if (c < 16) 5401b362b15af34006e6a11974088a46d42b903418eJohann cost += mb->token_costs [type] [vp8_coef_bands[c]] [pt] [DCT_EOB_TOKEN]; 5411b362b15af34006e6a11974088a46d42b903418eJohann 5421b362b15af34006e6a11974088a46d42b903418eJohann pt = (c != !type); /* is eob first coefficient; */ 5431b362b15af34006e6a11974088a46d42b903418eJohann *a = *l = pt; 5441b362b15af34006e6a11974088a46d42b903418eJohann 5451b362b15af34006e6a11974088a46d42b903418eJohann return cost; 5461b362b15af34006e6a11974088a46d42b903418eJohann} 5471b362b15af34006e6a11974088a46d42b903418eJohann 5481b362b15af34006e6a11974088a46d42b903418eJohannstatic int vp8_rdcost_mby(MACROBLOCK *mb) 5491b362b15af34006e6a11974088a46d42b903418eJohann{ 5501b362b15af34006e6a11974088a46d42b903418eJohann int cost = 0; 5511b362b15af34006e6a11974088a46d42b903418eJohann int b; 5521b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *x = &mb->e_mbd; 5531b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT_PLANES t_above, t_left; 5541b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT *ta; 5551b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT *tl; 5561b362b15af34006e6a11974088a46d42b903418eJohann 5571b362b15af34006e6a11974088a46d42b903418eJohann vpx_memcpy(&t_above, mb->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES)); 5581b362b15af34006e6a11974088a46d42b903418eJohann vpx_memcpy(&t_left, mb->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES)); 5591b362b15af34006e6a11974088a46d42b903418eJohann 5601b362b15af34006e6a11974088a46d42b903418eJohann ta = (ENTROPY_CONTEXT *)&t_above; 5611b362b15af34006e6a11974088a46d42b903418eJohann tl = (ENTROPY_CONTEXT *)&t_left; 5621b362b15af34006e6a11974088a46d42b903418eJohann 5631b362b15af34006e6a11974088a46d42b903418eJohann for (b = 0; b < 16; b++) 5641b362b15af34006e6a11974088a46d42b903418eJohann cost += cost_coeffs(mb, x->block + b, PLANE_TYPE_Y_NO_DC, 5651b362b15af34006e6a11974088a46d42b903418eJohann ta + vp8_block2above[b], tl + vp8_block2left[b]); 5661b362b15af34006e6a11974088a46d42b903418eJohann 5671b362b15af34006e6a11974088a46d42b903418eJohann cost += cost_coeffs(mb, x->block + 24, PLANE_TYPE_Y2, 5681b362b15af34006e6a11974088a46d42b903418eJohann ta + vp8_block2above[24], tl + vp8_block2left[24]); 5691b362b15af34006e6a11974088a46d42b903418eJohann 5701b362b15af34006e6a11974088a46d42b903418eJohann return cost; 5711b362b15af34006e6a11974088a46d42b903418eJohann} 5721b362b15af34006e6a11974088a46d42b903418eJohann 5731b362b15af34006e6a11974088a46d42b903418eJohannstatic void macro_block_yrd( MACROBLOCK *mb, 5741b362b15af34006e6a11974088a46d42b903418eJohann int *Rate, 5751b362b15af34006e6a11974088a46d42b903418eJohann int *Distortion) 5761b362b15af34006e6a11974088a46d42b903418eJohann{ 5771b362b15af34006e6a11974088a46d42b903418eJohann int b; 5781b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *const x = &mb->e_mbd; 5791b362b15af34006e6a11974088a46d42b903418eJohann BLOCK *const mb_y2 = mb->block + 24; 5801b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *const x_y2 = x->block + 24; 5811b362b15af34006e6a11974088a46d42b903418eJohann short *Y2DCPtr = mb_y2->src_diff; 5821b362b15af34006e6a11974088a46d42b903418eJohann BLOCK *beptr; 5831b362b15af34006e6a11974088a46d42b903418eJohann int d; 5841b362b15af34006e6a11974088a46d42b903418eJohann 5851b362b15af34006e6a11974088a46d42b903418eJohann vp8_subtract_mby( mb->src_diff, *(mb->block[0].base_src), 5861b362b15af34006e6a11974088a46d42b903418eJohann mb->block[0].src_stride, mb->e_mbd.predictor, 16); 5871b362b15af34006e6a11974088a46d42b903418eJohann 5881b362b15af34006e6a11974088a46d42b903418eJohann /* Fdct and building the 2nd order block */ 5891b362b15af34006e6a11974088a46d42b903418eJohann for (beptr = mb->block; beptr < mb->block + 16; beptr += 2) 5901b362b15af34006e6a11974088a46d42b903418eJohann { 5911b362b15af34006e6a11974088a46d42b903418eJohann mb->short_fdct8x4(beptr->src_diff, beptr->coeff, 32); 5921b362b15af34006e6a11974088a46d42b903418eJohann *Y2DCPtr++ = beptr->coeff[0]; 5931b362b15af34006e6a11974088a46d42b903418eJohann *Y2DCPtr++ = beptr->coeff[16]; 5941b362b15af34006e6a11974088a46d42b903418eJohann } 5951b362b15af34006e6a11974088a46d42b903418eJohann 5961b362b15af34006e6a11974088a46d42b903418eJohann /* 2nd order fdct */ 5971b362b15af34006e6a11974088a46d42b903418eJohann mb->short_walsh4x4(mb_y2->src_diff, mb_y2->coeff, 8); 5981b362b15af34006e6a11974088a46d42b903418eJohann 5991b362b15af34006e6a11974088a46d42b903418eJohann /* Quantization */ 6001b362b15af34006e6a11974088a46d42b903418eJohann for (b = 0; b < 16; b++) 6011b362b15af34006e6a11974088a46d42b903418eJohann { 6021b362b15af34006e6a11974088a46d42b903418eJohann mb->quantize_b(&mb->block[b], &mb->e_mbd.block[b]); 6031b362b15af34006e6a11974088a46d42b903418eJohann } 6041b362b15af34006e6a11974088a46d42b903418eJohann 6051b362b15af34006e6a11974088a46d42b903418eJohann /* DC predication and Quantization of 2nd Order block */ 6061b362b15af34006e6a11974088a46d42b903418eJohann mb->quantize_b(mb_y2, x_y2); 6071b362b15af34006e6a11974088a46d42b903418eJohann 6081b362b15af34006e6a11974088a46d42b903418eJohann /* Distortion */ 6091b362b15af34006e6a11974088a46d42b903418eJohann d = vp8_mbblock_error(mb, 1) << 2; 6101b362b15af34006e6a11974088a46d42b903418eJohann d += vp8_block_error(mb_y2->coeff, x_y2->dqcoeff); 6111b362b15af34006e6a11974088a46d42b903418eJohann 6121b362b15af34006e6a11974088a46d42b903418eJohann *Distortion = (d >> 4); 6131b362b15af34006e6a11974088a46d42b903418eJohann 6141b362b15af34006e6a11974088a46d42b903418eJohann /* rate */ 6151b362b15af34006e6a11974088a46d42b903418eJohann *Rate = vp8_rdcost_mby(mb); 6161b362b15af34006e6a11974088a46d42b903418eJohann} 6171b362b15af34006e6a11974088a46d42b903418eJohann 6181b362b15af34006e6a11974088a46d42b903418eJohannstatic void copy_predictor(unsigned char *dst, const unsigned char *predictor) 6191b362b15af34006e6a11974088a46d42b903418eJohann{ 6201b362b15af34006e6a11974088a46d42b903418eJohann const unsigned int *p = (const unsigned int *)predictor; 6211b362b15af34006e6a11974088a46d42b903418eJohann unsigned int *d = (unsigned int *)dst; 6221b362b15af34006e6a11974088a46d42b903418eJohann d[0] = p[0]; 6231b362b15af34006e6a11974088a46d42b903418eJohann d[4] = p[4]; 6241b362b15af34006e6a11974088a46d42b903418eJohann d[8] = p[8]; 6251b362b15af34006e6a11974088a46d42b903418eJohann d[12] = p[12]; 6261b362b15af34006e6a11974088a46d42b903418eJohann} 6271b362b15af34006e6a11974088a46d42b903418eJohannstatic int rd_pick_intra4x4block( 6281b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCK *x, 6291b362b15af34006e6a11974088a46d42b903418eJohann BLOCK *be, 6301b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *b, 6311b362b15af34006e6a11974088a46d42b903418eJohann B_PREDICTION_MODE *best_mode, 6321b362b15af34006e6a11974088a46d42b903418eJohann const int *bmode_costs, 6331b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT *a, 6341b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT *l, 6351b362b15af34006e6a11974088a46d42b903418eJohann 6361b362b15af34006e6a11974088a46d42b903418eJohann int *bestrate, 6371b362b15af34006e6a11974088a46d42b903418eJohann int *bestratey, 6381b362b15af34006e6a11974088a46d42b903418eJohann int *bestdistortion) 6391b362b15af34006e6a11974088a46d42b903418eJohann{ 6401b362b15af34006e6a11974088a46d42b903418eJohann B_PREDICTION_MODE mode; 6411b362b15af34006e6a11974088a46d42b903418eJohann int best_rd = INT_MAX; 6421b362b15af34006e6a11974088a46d42b903418eJohann int rate = 0; 6431b362b15af34006e6a11974088a46d42b903418eJohann int distortion; 6441b362b15af34006e6a11974088a46d42b903418eJohann 6451b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT ta = *a, tempa = *a; 6461b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT tl = *l, templ = *l; 6471b362b15af34006e6a11974088a46d42b903418eJohann /* 6481b362b15af34006e6a11974088a46d42b903418eJohann * The predictor buffer is a 2d buffer with a stride of 16. Create 6491b362b15af34006e6a11974088a46d42b903418eJohann * a temp buffer that meets the stride requirements, but we are only 6501b362b15af34006e6a11974088a46d42b903418eJohann * interested in the left 4x4 block 6511b362b15af34006e6a11974088a46d42b903418eJohann * */ 6521b362b15af34006e6a11974088a46d42b903418eJohann DECLARE_ALIGNED_ARRAY(16, unsigned char, best_predictor, 16*4); 6531b362b15af34006e6a11974088a46d42b903418eJohann DECLARE_ALIGNED_ARRAY(16, short, best_dqcoeff, 16); 6541b362b15af34006e6a11974088a46d42b903418eJohann int dst_stride = x->e_mbd.dst.y_stride; 6551b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *dst = x->e_mbd.dst.y_buffer + b->offset; 6561b362b15af34006e6a11974088a46d42b903418eJohann 6571b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *Above = dst - dst_stride; 6581b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *yleft = dst - 1; 6591b362b15af34006e6a11974088a46d42b903418eJohann unsigned char top_left = Above[-1]; 6601b362b15af34006e6a11974088a46d42b903418eJohann 6611b362b15af34006e6a11974088a46d42b903418eJohann for (mode = B_DC_PRED; mode <= B_HU_PRED; mode++) 6621b362b15af34006e6a11974088a46d42b903418eJohann { 6631b362b15af34006e6a11974088a46d42b903418eJohann int this_rd; 6641b362b15af34006e6a11974088a46d42b903418eJohann int ratey; 6651b362b15af34006e6a11974088a46d42b903418eJohann 6661b362b15af34006e6a11974088a46d42b903418eJohann rate = bmode_costs[mode]; 6671b362b15af34006e6a11974088a46d42b903418eJohann 6681b362b15af34006e6a11974088a46d42b903418eJohann vp8_intra4x4_predict(Above, yleft, dst_stride, mode, 6691b362b15af34006e6a11974088a46d42b903418eJohann b->predictor, 16, top_left); 6701b362b15af34006e6a11974088a46d42b903418eJohann vp8_subtract_b(be, b, 16); 6711b362b15af34006e6a11974088a46d42b903418eJohann x->short_fdct4x4(be->src_diff, be->coeff, 32); 6721b362b15af34006e6a11974088a46d42b903418eJohann x->quantize_b(be, b); 6731b362b15af34006e6a11974088a46d42b903418eJohann 6741b362b15af34006e6a11974088a46d42b903418eJohann tempa = ta; 6751b362b15af34006e6a11974088a46d42b903418eJohann templ = tl; 6761b362b15af34006e6a11974088a46d42b903418eJohann 6771b362b15af34006e6a11974088a46d42b903418eJohann ratey = cost_coeffs(x, b, PLANE_TYPE_Y_WITH_DC, &tempa, &templ); 6781b362b15af34006e6a11974088a46d42b903418eJohann rate += ratey; 6791b362b15af34006e6a11974088a46d42b903418eJohann distortion = vp8_block_error(be->coeff, b->dqcoeff) >> 2; 6801b362b15af34006e6a11974088a46d42b903418eJohann 6811b362b15af34006e6a11974088a46d42b903418eJohann this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion); 6821b362b15af34006e6a11974088a46d42b903418eJohann 6831b362b15af34006e6a11974088a46d42b903418eJohann if (this_rd < best_rd) 6841b362b15af34006e6a11974088a46d42b903418eJohann { 6851b362b15af34006e6a11974088a46d42b903418eJohann *bestrate = rate; 6861b362b15af34006e6a11974088a46d42b903418eJohann *bestratey = ratey; 6871b362b15af34006e6a11974088a46d42b903418eJohann *bestdistortion = distortion; 6881b362b15af34006e6a11974088a46d42b903418eJohann best_rd = this_rd; 6891b362b15af34006e6a11974088a46d42b903418eJohann *best_mode = mode; 6901b362b15af34006e6a11974088a46d42b903418eJohann *a = tempa; 6911b362b15af34006e6a11974088a46d42b903418eJohann *l = templ; 6921b362b15af34006e6a11974088a46d42b903418eJohann copy_predictor(best_predictor, b->predictor); 6931b362b15af34006e6a11974088a46d42b903418eJohann vpx_memcpy(best_dqcoeff, b->dqcoeff, 32); 6941b362b15af34006e6a11974088a46d42b903418eJohann } 6951b362b15af34006e6a11974088a46d42b903418eJohann } 6961b362b15af34006e6a11974088a46d42b903418eJohann b->bmi.as_mode = *best_mode; 6971b362b15af34006e6a11974088a46d42b903418eJohann 6981b362b15af34006e6a11974088a46d42b903418eJohann vp8_short_idct4x4llm(best_dqcoeff, best_predictor, 16, dst, dst_stride); 6991b362b15af34006e6a11974088a46d42b903418eJohann 7001b362b15af34006e6a11974088a46d42b903418eJohann return best_rd; 7011b362b15af34006e6a11974088a46d42b903418eJohann} 7021b362b15af34006e6a11974088a46d42b903418eJohann 7031b362b15af34006e6a11974088a46d42b903418eJohannstatic int rd_pick_intra4x4mby_modes(MACROBLOCK *mb, int *Rate, 7041b362b15af34006e6a11974088a46d42b903418eJohann int *rate_y, int *Distortion, int best_rd) 7051b362b15af34006e6a11974088a46d42b903418eJohann{ 7061b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *const xd = &mb->e_mbd; 7071b362b15af34006e6a11974088a46d42b903418eJohann int i; 7081b362b15af34006e6a11974088a46d42b903418eJohann int cost = mb->mbmode_cost [xd->frame_type] [B_PRED]; 7091b362b15af34006e6a11974088a46d42b903418eJohann int distortion = 0; 7101b362b15af34006e6a11974088a46d42b903418eJohann int tot_rate_y = 0; 7111b362b15af34006e6a11974088a46d42b903418eJohann int64_t total_rd = 0; 7121b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT_PLANES t_above, t_left; 7131b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT *ta; 7141b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT *tl; 7151b362b15af34006e6a11974088a46d42b903418eJohann const int *bmode_costs; 7161b362b15af34006e6a11974088a46d42b903418eJohann 7171b362b15af34006e6a11974088a46d42b903418eJohann vpx_memcpy(&t_above, mb->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES)); 7181b362b15af34006e6a11974088a46d42b903418eJohann vpx_memcpy(&t_left, mb->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES)); 7191b362b15af34006e6a11974088a46d42b903418eJohann 7201b362b15af34006e6a11974088a46d42b903418eJohann ta = (ENTROPY_CONTEXT *)&t_above; 7211b362b15af34006e6a11974088a46d42b903418eJohann tl = (ENTROPY_CONTEXT *)&t_left; 7221b362b15af34006e6a11974088a46d42b903418eJohann 7231b362b15af34006e6a11974088a46d42b903418eJohann intra_prediction_down_copy(xd, xd->dst.y_buffer - xd->dst.y_stride + 16); 7241b362b15af34006e6a11974088a46d42b903418eJohann 7251b362b15af34006e6a11974088a46d42b903418eJohann bmode_costs = mb->inter_bmode_costs; 7261b362b15af34006e6a11974088a46d42b903418eJohann 7271b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < 16; i++) 7281b362b15af34006e6a11974088a46d42b903418eJohann { 7291b362b15af34006e6a11974088a46d42b903418eJohann MODE_INFO *const mic = xd->mode_info_context; 7301b362b15af34006e6a11974088a46d42b903418eJohann const int mis = xd->mode_info_stride; 7311b362b15af34006e6a11974088a46d42b903418eJohann B_PREDICTION_MODE UNINITIALIZED_IS_SAFE(best_mode); 7321b362b15af34006e6a11974088a46d42b903418eJohann int UNINITIALIZED_IS_SAFE(r), UNINITIALIZED_IS_SAFE(ry), UNINITIALIZED_IS_SAFE(d); 7331b362b15af34006e6a11974088a46d42b903418eJohann 7341b362b15af34006e6a11974088a46d42b903418eJohann if (mb->e_mbd.frame_type == KEY_FRAME) 7351b362b15af34006e6a11974088a46d42b903418eJohann { 7361b362b15af34006e6a11974088a46d42b903418eJohann const B_PREDICTION_MODE A = above_block_mode(mic, i, mis); 7371b362b15af34006e6a11974088a46d42b903418eJohann const B_PREDICTION_MODE L = left_block_mode(mic, i); 7381b362b15af34006e6a11974088a46d42b903418eJohann 7391b362b15af34006e6a11974088a46d42b903418eJohann bmode_costs = mb->bmode_costs[A][L]; 7401b362b15af34006e6a11974088a46d42b903418eJohann } 7411b362b15af34006e6a11974088a46d42b903418eJohann 7421b362b15af34006e6a11974088a46d42b903418eJohann total_rd += rd_pick_intra4x4block( 7431b362b15af34006e6a11974088a46d42b903418eJohann mb, mb->block + i, xd->block + i, &best_mode, bmode_costs, 7441b362b15af34006e6a11974088a46d42b903418eJohann ta + vp8_block2above[i], 7451b362b15af34006e6a11974088a46d42b903418eJohann tl + vp8_block2left[i], &r, &ry, &d); 7461b362b15af34006e6a11974088a46d42b903418eJohann 7471b362b15af34006e6a11974088a46d42b903418eJohann cost += r; 7481b362b15af34006e6a11974088a46d42b903418eJohann distortion += d; 7491b362b15af34006e6a11974088a46d42b903418eJohann tot_rate_y += ry; 7501b362b15af34006e6a11974088a46d42b903418eJohann 7511b362b15af34006e6a11974088a46d42b903418eJohann mic->bmi[i].as_mode = best_mode; 7521b362b15af34006e6a11974088a46d42b903418eJohann 7531b362b15af34006e6a11974088a46d42b903418eJohann if(total_rd >= (int64_t)best_rd) 7541b362b15af34006e6a11974088a46d42b903418eJohann break; 7551b362b15af34006e6a11974088a46d42b903418eJohann } 7561b362b15af34006e6a11974088a46d42b903418eJohann 7571b362b15af34006e6a11974088a46d42b903418eJohann if(total_rd >= (int64_t)best_rd) 7581b362b15af34006e6a11974088a46d42b903418eJohann return INT_MAX; 7591b362b15af34006e6a11974088a46d42b903418eJohann 7601b362b15af34006e6a11974088a46d42b903418eJohann *Rate = cost; 7611b362b15af34006e6a11974088a46d42b903418eJohann *rate_y = tot_rate_y; 7621b362b15af34006e6a11974088a46d42b903418eJohann *Distortion = distortion; 7631b362b15af34006e6a11974088a46d42b903418eJohann 7641b362b15af34006e6a11974088a46d42b903418eJohann return RDCOST(mb->rdmult, mb->rddiv, cost, distortion); 7651b362b15af34006e6a11974088a46d42b903418eJohann} 7661b362b15af34006e6a11974088a46d42b903418eJohann 7671b362b15af34006e6a11974088a46d42b903418eJohann 7681b362b15af34006e6a11974088a46d42b903418eJohannstatic int rd_pick_intra16x16mby_mode(MACROBLOCK *x, 7691b362b15af34006e6a11974088a46d42b903418eJohann int *Rate, 7701b362b15af34006e6a11974088a46d42b903418eJohann int *rate_y, 7711b362b15af34006e6a11974088a46d42b903418eJohann int *Distortion) 7721b362b15af34006e6a11974088a46d42b903418eJohann{ 7731b362b15af34006e6a11974088a46d42b903418eJohann MB_PREDICTION_MODE mode; 7741b362b15af34006e6a11974088a46d42b903418eJohann MB_PREDICTION_MODE UNINITIALIZED_IS_SAFE(mode_selected); 7751b362b15af34006e6a11974088a46d42b903418eJohann int rate, ratey; 7761b362b15af34006e6a11974088a46d42b903418eJohann int distortion; 7771b362b15af34006e6a11974088a46d42b903418eJohann int best_rd = INT_MAX; 7781b362b15af34006e6a11974088a46d42b903418eJohann int this_rd; 7791b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *xd = &x->e_mbd; 7801b362b15af34006e6a11974088a46d42b903418eJohann 7811b362b15af34006e6a11974088a46d42b903418eJohann /* Y Search for 16x16 intra prediction mode */ 7821b362b15af34006e6a11974088a46d42b903418eJohann for (mode = DC_PRED; mode <= TM_PRED; mode++) 7831b362b15af34006e6a11974088a46d42b903418eJohann { 7841b362b15af34006e6a11974088a46d42b903418eJohann xd->mode_info_context->mbmi.mode = mode; 7851b362b15af34006e6a11974088a46d42b903418eJohann 7861b362b15af34006e6a11974088a46d42b903418eJohann vp8_build_intra_predictors_mby_s(xd, 7871b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.y_buffer - xd->dst.y_stride, 7881b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.y_buffer - 1, 7891b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.y_stride, 7901b362b15af34006e6a11974088a46d42b903418eJohann xd->predictor, 7911b362b15af34006e6a11974088a46d42b903418eJohann 16); 7921b362b15af34006e6a11974088a46d42b903418eJohann 7931b362b15af34006e6a11974088a46d42b903418eJohann macro_block_yrd(x, &ratey, &distortion); 7941b362b15af34006e6a11974088a46d42b903418eJohann rate = ratey + x->mbmode_cost[xd->frame_type] 7951b362b15af34006e6a11974088a46d42b903418eJohann [xd->mode_info_context->mbmi.mode]; 7961b362b15af34006e6a11974088a46d42b903418eJohann 7971b362b15af34006e6a11974088a46d42b903418eJohann this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion); 7981b362b15af34006e6a11974088a46d42b903418eJohann 7991b362b15af34006e6a11974088a46d42b903418eJohann if (this_rd < best_rd) 8001b362b15af34006e6a11974088a46d42b903418eJohann { 8011b362b15af34006e6a11974088a46d42b903418eJohann mode_selected = mode; 8021b362b15af34006e6a11974088a46d42b903418eJohann best_rd = this_rd; 8031b362b15af34006e6a11974088a46d42b903418eJohann *Rate = rate; 8041b362b15af34006e6a11974088a46d42b903418eJohann *rate_y = ratey; 8051b362b15af34006e6a11974088a46d42b903418eJohann *Distortion = distortion; 8061b362b15af34006e6a11974088a46d42b903418eJohann } 8071b362b15af34006e6a11974088a46d42b903418eJohann } 8081b362b15af34006e6a11974088a46d42b903418eJohann 8091b362b15af34006e6a11974088a46d42b903418eJohann xd->mode_info_context->mbmi.mode = mode_selected; 8101b362b15af34006e6a11974088a46d42b903418eJohann return best_rd; 8111b362b15af34006e6a11974088a46d42b903418eJohann} 8121b362b15af34006e6a11974088a46d42b903418eJohann 8131b362b15af34006e6a11974088a46d42b903418eJohannstatic int rd_cost_mbuv(MACROBLOCK *mb) 8141b362b15af34006e6a11974088a46d42b903418eJohann{ 8151b362b15af34006e6a11974088a46d42b903418eJohann int b; 8161b362b15af34006e6a11974088a46d42b903418eJohann int cost = 0; 8171b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *x = &mb->e_mbd; 8181b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT_PLANES t_above, t_left; 8191b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT *ta; 8201b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT *tl; 8211b362b15af34006e6a11974088a46d42b903418eJohann 8221b362b15af34006e6a11974088a46d42b903418eJohann vpx_memcpy(&t_above, mb->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES)); 8231b362b15af34006e6a11974088a46d42b903418eJohann vpx_memcpy(&t_left, mb->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES)); 8241b362b15af34006e6a11974088a46d42b903418eJohann 8251b362b15af34006e6a11974088a46d42b903418eJohann ta = (ENTROPY_CONTEXT *)&t_above; 8261b362b15af34006e6a11974088a46d42b903418eJohann tl = (ENTROPY_CONTEXT *)&t_left; 8271b362b15af34006e6a11974088a46d42b903418eJohann 8281b362b15af34006e6a11974088a46d42b903418eJohann for (b = 16; b < 24; b++) 8291b362b15af34006e6a11974088a46d42b903418eJohann cost += cost_coeffs(mb, x->block + b, PLANE_TYPE_UV, 8301b362b15af34006e6a11974088a46d42b903418eJohann ta + vp8_block2above[b], tl + vp8_block2left[b]); 8311b362b15af34006e6a11974088a46d42b903418eJohann 8321b362b15af34006e6a11974088a46d42b903418eJohann return cost; 8331b362b15af34006e6a11974088a46d42b903418eJohann} 8341b362b15af34006e6a11974088a46d42b903418eJohann 8351b362b15af34006e6a11974088a46d42b903418eJohann 8361b362b15af34006e6a11974088a46d42b903418eJohannstatic int rd_inter16x16_uv(VP8_COMP *cpi, MACROBLOCK *x, int *rate, 8371b362b15af34006e6a11974088a46d42b903418eJohann int *distortion, int fullpixel) 8381b362b15af34006e6a11974088a46d42b903418eJohann{ 8391b362b15af34006e6a11974088a46d42b903418eJohann vp8_build_inter16x16_predictors_mbuv(&x->e_mbd); 8401b362b15af34006e6a11974088a46d42b903418eJohann vp8_subtract_mbuv(x->src_diff, 8411b362b15af34006e6a11974088a46d42b903418eJohann x->src.u_buffer, x->src.v_buffer, x->src.uv_stride, 8421b362b15af34006e6a11974088a46d42b903418eJohann &x->e_mbd.predictor[256], &x->e_mbd.predictor[320], 8); 8431b362b15af34006e6a11974088a46d42b903418eJohann 8441b362b15af34006e6a11974088a46d42b903418eJohann vp8_transform_mbuv(x); 8451b362b15af34006e6a11974088a46d42b903418eJohann vp8_quantize_mbuv(x); 8461b362b15af34006e6a11974088a46d42b903418eJohann 8471b362b15af34006e6a11974088a46d42b903418eJohann *rate = rd_cost_mbuv(x); 8481b362b15af34006e6a11974088a46d42b903418eJohann *distortion = vp8_mbuverror(x) / 4; 8491b362b15af34006e6a11974088a46d42b903418eJohann 8501b362b15af34006e6a11974088a46d42b903418eJohann return RDCOST(x->rdmult, x->rddiv, *rate, *distortion); 8511b362b15af34006e6a11974088a46d42b903418eJohann} 8521b362b15af34006e6a11974088a46d42b903418eJohann 8531b362b15af34006e6a11974088a46d42b903418eJohannstatic int rd_inter4x4_uv(VP8_COMP *cpi, MACROBLOCK *x, int *rate, 8541b362b15af34006e6a11974088a46d42b903418eJohann int *distortion, int fullpixel) 8551b362b15af34006e6a11974088a46d42b903418eJohann{ 8561b362b15af34006e6a11974088a46d42b903418eJohann vp8_build_inter4x4_predictors_mbuv(&x->e_mbd); 8571b362b15af34006e6a11974088a46d42b903418eJohann vp8_subtract_mbuv(x->src_diff, 8581b362b15af34006e6a11974088a46d42b903418eJohann x->src.u_buffer, x->src.v_buffer, x->src.uv_stride, 8591b362b15af34006e6a11974088a46d42b903418eJohann &x->e_mbd.predictor[256], &x->e_mbd.predictor[320], 8); 8601b362b15af34006e6a11974088a46d42b903418eJohann 8611b362b15af34006e6a11974088a46d42b903418eJohann vp8_transform_mbuv(x); 8621b362b15af34006e6a11974088a46d42b903418eJohann vp8_quantize_mbuv(x); 8631b362b15af34006e6a11974088a46d42b903418eJohann 8641b362b15af34006e6a11974088a46d42b903418eJohann *rate = rd_cost_mbuv(x); 8651b362b15af34006e6a11974088a46d42b903418eJohann *distortion = vp8_mbuverror(x) / 4; 8661b362b15af34006e6a11974088a46d42b903418eJohann 8671b362b15af34006e6a11974088a46d42b903418eJohann return RDCOST(x->rdmult, x->rddiv, *rate, *distortion); 8681b362b15af34006e6a11974088a46d42b903418eJohann} 8691b362b15af34006e6a11974088a46d42b903418eJohann 8701b362b15af34006e6a11974088a46d42b903418eJohannstatic void rd_pick_intra_mbuv_mode(MACROBLOCK *x, int *rate, 8711b362b15af34006e6a11974088a46d42b903418eJohann int *rate_tokenonly, int *distortion) 8721b362b15af34006e6a11974088a46d42b903418eJohann{ 8731b362b15af34006e6a11974088a46d42b903418eJohann MB_PREDICTION_MODE mode; 8741b362b15af34006e6a11974088a46d42b903418eJohann MB_PREDICTION_MODE UNINITIALIZED_IS_SAFE(mode_selected); 8751b362b15af34006e6a11974088a46d42b903418eJohann int best_rd = INT_MAX; 8761b362b15af34006e6a11974088a46d42b903418eJohann int UNINITIALIZED_IS_SAFE(d), UNINITIALIZED_IS_SAFE(r); 8771b362b15af34006e6a11974088a46d42b903418eJohann int rate_to; 8781b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *xd = &x->e_mbd; 8791b362b15af34006e6a11974088a46d42b903418eJohann 8801b362b15af34006e6a11974088a46d42b903418eJohann for (mode = DC_PRED; mode <= TM_PRED; mode++) 8811b362b15af34006e6a11974088a46d42b903418eJohann { 8821b362b15af34006e6a11974088a46d42b903418eJohann int rate; 8831b362b15af34006e6a11974088a46d42b903418eJohann int distortion; 8841b362b15af34006e6a11974088a46d42b903418eJohann int this_rd; 8851b362b15af34006e6a11974088a46d42b903418eJohann 8861b362b15af34006e6a11974088a46d42b903418eJohann xd->mode_info_context->mbmi.uv_mode = mode; 8871b362b15af34006e6a11974088a46d42b903418eJohann 8881b362b15af34006e6a11974088a46d42b903418eJohann vp8_build_intra_predictors_mbuv_s(xd, 8891b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.u_buffer - xd->dst.uv_stride, 8901b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.v_buffer - xd->dst.uv_stride, 8911b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.u_buffer - 1, 8921b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.v_buffer - 1, 8931b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.uv_stride, 8941b362b15af34006e6a11974088a46d42b903418eJohann &xd->predictor[256], &xd->predictor[320], 8951b362b15af34006e6a11974088a46d42b903418eJohann 8); 8961b362b15af34006e6a11974088a46d42b903418eJohann 8971b362b15af34006e6a11974088a46d42b903418eJohann 8981b362b15af34006e6a11974088a46d42b903418eJohann vp8_subtract_mbuv(x->src_diff, 8991b362b15af34006e6a11974088a46d42b903418eJohann x->src.u_buffer, x->src.v_buffer, x->src.uv_stride, 9001b362b15af34006e6a11974088a46d42b903418eJohann &xd->predictor[256], &xd->predictor[320], 8); 9011b362b15af34006e6a11974088a46d42b903418eJohann vp8_transform_mbuv(x); 9021b362b15af34006e6a11974088a46d42b903418eJohann vp8_quantize_mbuv(x); 9031b362b15af34006e6a11974088a46d42b903418eJohann 9041b362b15af34006e6a11974088a46d42b903418eJohann rate_to = rd_cost_mbuv(x); 9051b362b15af34006e6a11974088a46d42b903418eJohann rate = rate_to + x->intra_uv_mode_cost[xd->frame_type][xd->mode_info_context->mbmi.uv_mode]; 9061b362b15af34006e6a11974088a46d42b903418eJohann 9071b362b15af34006e6a11974088a46d42b903418eJohann distortion = vp8_mbuverror(x) / 4; 9081b362b15af34006e6a11974088a46d42b903418eJohann 9091b362b15af34006e6a11974088a46d42b903418eJohann this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion); 9101b362b15af34006e6a11974088a46d42b903418eJohann 9111b362b15af34006e6a11974088a46d42b903418eJohann if (this_rd < best_rd) 9121b362b15af34006e6a11974088a46d42b903418eJohann { 9131b362b15af34006e6a11974088a46d42b903418eJohann best_rd = this_rd; 9141b362b15af34006e6a11974088a46d42b903418eJohann d = distortion; 9151b362b15af34006e6a11974088a46d42b903418eJohann r = rate; 9161b362b15af34006e6a11974088a46d42b903418eJohann *rate_tokenonly = rate_to; 9171b362b15af34006e6a11974088a46d42b903418eJohann mode_selected = mode; 9181b362b15af34006e6a11974088a46d42b903418eJohann } 9191b362b15af34006e6a11974088a46d42b903418eJohann } 9201b362b15af34006e6a11974088a46d42b903418eJohann 9211b362b15af34006e6a11974088a46d42b903418eJohann *rate = r; 9221b362b15af34006e6a11974088a46d42b903418eJohann *distortion = d; 9231b362b15af34006e6a11974088a46d42b903418eJohann 9241b362b15af34006e6a11974088a46d42b903418eJohann xd->mode_info_context->mbmi.uv_mode = mode_selected; 9251b362b15af34006e6a11974088a46d42b903418eJohann} 9261b362b15af34006e6a11974088a46d42b903418eJohann 9271b362b15af34006e6a11974088a46d42b903418eJohannint vp8_cost_mv_ref(MB_PREDICTION_MODE m, const int near_mv_ref_ct[4]) 9281b362b15af34006e6a11974088a46d42b903418eJohann{ 9291b362b15af34006e6a11974088a46d42b903418eJohann vp8_prob p [VP8_MVREFS-1]; 9301b362b15af34006e6a11974088a46d42b903418eJohann assert(NEARESTMV <= m && m <= SPLITMV); 9311b362b15af34006e6a11974088a46d42b903418eJohann vp8_mv_ref_probs(p, near_mv_ref_ct); 9321b362b15af34006e6a11974088a46d42b903418eJohann return vp8_cost_token(vp8_mv_ref_tree, p, 9331b362b15af34006e6a11974088a46d42b903418eJohann vp8_mv_ref_encoding_array - NEARESTMV + m); 9341b362b15af34006e6a11974088a46d42b903418eJohann} 9351b362b15af34006e6a11974088a46d42b903418eJohann 9361b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_set_mbmode_and_mvs(MACROBLOCK *x, MB_PREDICTION_MODE mb, int_mv *mv) 9371b362b15af34006e6a11974088a46d42b903418eJohann{ 9381b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.mode = mb; 9391b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.mv.as_int = mv->as_int; 9401b362b15af34006e6a11974088a46d42b903418eJohann} 9411b362b15af34006e6a11974088a46d42b903418eJohann 9421b362b15af34006e6a11974088a46d42b903418eJohannstatic int labels2mode( 9431b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCK *x, 9441b362b15af34006e6a11974088a46d42b903418eJohann int const *labelings, int which_label, 9451b362b15af34006e6a11974088a46d42b903418eJohann B_PREDICTION_MODE this_mode, 9461b362b15af34006e6a11974088a46d42b903418eJohann int_mv *this_mv, int_mv *best_ref_mv, 9471b362b15af34006e6a11974088a46d42b903418eJohann int *mvcost[2] 9481b362b15af34006e6a11974088a46d42b903418eJohann) 9491b362b15af34006e6a11974088a46d42b903418eJohann{ 9501b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *const xd = & x->e_mbd; 9511b362b15af34006e6a11974088a46d42b903418eJohann MODE_INFO *const mic = xd->mode_info_context; 9521b362b15af34006e6a11974088a46d42b903418eJohann const int mis = xd->mode_info_stride; 9531b362b15af34006e6a11974088a46d42b903418eJohann 9541b362b15af34006e6a11974088a46d42b903418eJohann int cost = 0; 9551b362b15af34006e6a11974088a46d42b903418eJohann int thismvcost = 0; 9561b362b15af34006e6a11974088a46d42b903418eJohann 9571b362b15af34006e6a11974088a46d42b903418eJohann /* We have to be careful retrieving previously-encoded motion vectors. 9581b362b15af34006e6a11974088a46d42b903418eJohann Ones from this macroblock have to be pulled from the BLOCKD array 9591b362b15af34006e6a11974088a46d42b903418eJohann as they have not yet made it to the bmi array in our MB_MODE_INFO. */ 9601b362b15af34006e6a11974088a46d42b903418eJohann 9611b362b15af34006e6a11974088a46d42b903418eJohann int i = 0; 9621b362b15af34006e6a11974088a46d42b903418eJohann 9631b362b15af34006e6a11974088a46d42b903418eJohann do 9641b362b15af34006e6a11974088a46d42b903418eJohann { 9651b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *const d = xd->block + i; 9661b362b15af34006e6a11974088a46d42b903418eJohann const int row = i >> 2, col = i & 3; 9671b362b15af34006e6a11974088a46d42b903418eJohann 9681b362b15af34006e6a11974088a46d42b903418eJohann B_PREDICTION_MODE m; 9691b362b15af34006e6a11974088a46d42b903418eJohann 9701b362b15af34006e6a11974088a46d42b903418eJohann if (labelings[i] != which_label) 9711b362b15af34006e6a11974088a46d42b903418eJohann continue; 9721b362b15af34006e6a11974088a46d42b903418eJohann 9731b362b15af34006e6a11974088a46d42b903418eJohann if (col && labelings[i] == labelings[i-1]) 9741b362b15af34006e6a11974088a46d42b903418eJohann m = LEFT4X4; 9751b362b15af34006e6a11974088a46d42b903418eJohann else if (row && labelings[i] == labelings[i-4]) 9761b362b15af34006e6a11974088a46d42b903418eJohann m = ABOVE4X4; 9771b362b15af34006e6a11974088a46d42b903418eJohann else 9781b362b15af34006e6a11974088a46d42b903418eJohann { 9791b362b15af34006e6a11974088a46d42b903418eJohann /* the only time we should do costing for new motion vector 9801b362b15af34006e6a11974088a46d42b903418eJohann * or mode is when we are on a new label (jbb May 08, 2007) 9811b362b15af34006e6a11974088a46d42b903418eJohann */ 9821b362b15af34006e6a11974088a46d42b903418eJohann switch (m = this_mode) 9831b362b15af34006e6a11974088a46d42b903418eJohann { 9841b362b15af34006e6a11974088a46d42b903418eJohann case NEW4X4 : 9851b362b15af34006e6a11974088a46d42b903418eJohann thismvcost = vp8_mv_bit_cost(this_mv, best_ref_mv, mvcost, 102); 9861b362b15af34006e6a11974088a46d42b903418eJohann break; 9871b362b15af34006e6a11974088a46d42b903418eJohann case LEFT4X4: 9881b362b15af34006e6a11974088a46d42b903418eJohann this_mv->as_int = col ? d[-1].bmi.mv.as_int : left_block_mv(mic, i); 9891b362b15af34006e6a11974088a46d42b903418eJohann break; 9901b362b15af34006e6a11974088a46d42b903418eJohann case ABOVE4X4: 9911b362b15af34006e6a11974088a46d42b903418eJohann this_mv->as_int = row ? d[-4].bmi.mv.as_int : above_block_mv(mic, i, mis); 9921b362b15af34006e6a11974088a46d42b903418eJohann break; 9931b362b15af34006e6a11974088a46d42b903418eJohann case ZERO4X4: 9941b362b15af34006e6a11974088a46d42b903418eJohann this_mv->as_int = 0; 9951b362b15af34006e6a11974088a46d42b903418eJohann break; 9961b362b15af34006e6a11974088a46d42b903418eJohann default: 9971b362b15af34006e6a11974088a46d42b903418eJohann break; 9981b362b15af34006e6a11974088a46d42b903418eJohann } 9991b362b15af34006e6a11974088a46d42b903418eJohann 10001b362b15af34006e6a11974088a46d42b903418eJohann if (m == ABOVE4X4) /* replace above with left if same */ 10011b362b15af34006e6a11974088a46d42b903418eJohann { 10021b362b15af34006e6a11974088a46d42b903418eJohann int_mv left_mv; 10031b362b15af34006e6a11974088a46d42b903418eJohann 10041b362b15af34006e6a11974088a46d42b903418eJohann left_mv.as_int = col ? d[-1].bmi.mv.as_int : 10051b362b15af34006e6a11974088a46d42b903418eJohann left_block_mv(mic, i); 10061b362b15af34006e6a11974088a46d42b903418eJohann 10071b362b15af34006e6a11974088a46d42b903418eJohann if (left_mv.as_int == this_mv->as_int) 10081b362b15af34006e6a11974088a46d42b903418eJohann m = LEFT4X4; 10091b362b15af34006e6a11974088a46d42b903418eJohann } 10101b362b15af34006e6a11974088a46d42b903418eJohann 10111b362b15af34006e6a11974088a46d42b903418eJohann cost = x->inter_bmode_costs[ m]; 10121b362b15af34006e6a11974088a46d42b903418eJohann } 10131b362b15af34006e6a11974088a46d42b903418eJohann 10141b362b15af34006e6a11974088a46d42b903418eJohann d->bmi.mv.as_int = this_mv->as_int; 10151b362b15af34006e6a11974088a46d42b903418eJohann 10161b362b15af34006e6a11974088a46d42b903418eJohann x->partition_info->bmi[i].mode = m; 10171b362b15af34006e6a11974088a46d42b903418eJohann x->partition_info->bmi[i].mv.as_int = this_mv->as_int; 10181b362b15af34006e6a11974088a46d42b903418eJohann 10191b362b15af34006e6a11974088a46d42b903418eJohann } 10201b362b15af34006e6a11974088a46d42b903418eJohann while (++i < 16); 10211b362b15af34006e6a11974088a46d42b903418eJohann 10221b362b15af34006e6a11974088a46d42b903418eJohann cost += thismvcost ; 10231b362b15af34006e6a11974088a46d42b903418eJohann return cost; 10241b362b15af34006e6a11974088a46d42b903418eJohann} 10251b362b15af34006e6a11974088a46d42b903418eJohann 10261b362b15af34006e6a11974088a46d42b903418eJohannstatic int rdcost_mbsegment_y(MACROBLOCK *mb, const int *labels, 10271b362b15af34006e6a11974088a46d42b903418eJohann int which_label, ENTROPY_CONTEXT *ta, 10281b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT *tl) 10291b362b15af34006e6a11974088a46d42b903418eJohann{ 10301b362b15af34006e6a11974088a46d42b903418eJohann int cost = 0; 10311b362b15af34006e6a11974088a46d42b903418eJohann int b; 10321b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *x = &mb->e_mbd; 10331b362b15af34006e6a11974088a46d42b903418eJohann 10341b362b15af34006e6a11974088a46d42b903418eJohann for (b = 0; b < 16; b++) 10351b362b15af34006e6a11974088a46d42b903418eJohann if (labels[ b] == which_label) 10361b362b15af34006e6a11974088a46d42b903418eJohann cost += cost_coeffs(mb, x->block + b, PLANE_TYPE_Y_WITH_DC, 10371b362b15af34006e6a11974088a46d42b903418eJohann ta + vp8_block2above[b], 10381b362b15af34006e6a11974088a46d42b903418eJohann tl + vp8_block2left[b]); 10391b362b15af34006e6a11974088a46d42b903418eJohann 10401b362b15af34006e6a11974088a46d42b903418eJohann return cost; 10411b362b15af34006e6a11974088a46d42b903418eJohann 10421b362b15af34006e6a11974088a46d42b903418eJohann} 10431b362b15af34006e6a11974088a46d42b903418eJohannstatic unsigned int vp8_encode_inter_mb_segment(MACROBLOCK *x, int const *labels, int which_label) 10441b362b15af34006e6a11974088a46d42b903418eJohann{ 10451b362b15af34006e6a11974088a46d42b903418eJohann int i; 10461b362b15af34006e6a11974088a46d42b903418eJohann unsigned int distortion = 0; 10471b362b15af34006e6a11974088a46d42b903418eJohann int pre_stride = x->e_mbd.pre.y_stride; 10481b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *base_pre = x->e_mbd.pre.y_buffer; 10491b362b15af34006e6a11974088a46d42b903418eJohann 10501b362b15af34006e6a11974088a46d42b903418eJohann 10511b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < 16; i++) 10521b362b15af34006e6a11974088a46d42b903418eJohann { 10531b362b15af34006e6a11974088a46d42b903418eJohann if (labels[i] == which_label) 10541b362b15af34006e6a11974088a46d42b903418eJohann { 10551b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *bd = &x->e_mbd.block[i]; 10561b362b15af34006e6a11974088a46d42b903418eJohann BLOCK *be = &x->block[i]; 10571b362b15af34006e6a11974088a46d42b903418eJohann 10581b362b15af34006e6a11974088a46d42b903418eJohann vp8_build_inter_predictors_b(bd, 16, base_pre, pre_stride, x->e_mbd.subpixel_predict); 10591b362b15af34006e6a11974088a46d42b903418eJohann vp8_subtract_b(be, bd, 16); 10601b362b15af34006e6a11974088a46d42b903418eJohann x->short_fdct4x4(be->src_diff, be->coeff, 32); 10611b362b15af34006e6a11974088a46d42b903418eJohann x->quantize_b(be, bd); 10621b362b15af34006e6a11974088a46d42b903418eJohann 10631b362b15af34006e6a11974088a46d42b903418eJohann distortion += vp8_block_error(be->coeff, bd->dqcoeff); 10641b362b15af34006e6a11974088a46d42b903418eJohann } 10651b362b15af34006e6a11974088a46d42b903418eJohann } 10661b362b15af34006e6a11974088a46d42b903418eJohann 10671b362b15af34006e6a11974088a46d42b903418eJohann return distortion; 10681b362b15af34006e6a11974088a46d42b903418eJohann} 10691b362b15af34006e6a11974088a46d42b903418eJohann 10701b362b15af34006e6a11974088a46d42b903418eJohann 10711b362b15af34006e6a11974088a46d42b903418eJohannstatic const unsigned int segmentation_to_sseshift[4] = {3, 3, 2, 0}; 10721b362b15af34006e6a11974088a46d42b903418eJohann 10731b362b15af34006e6a11974088a46d42b903418eJohann 10741b362b15af34006e6a11974088a46d42b903418eJohanntypedef struct 10751b362b15af34006e6a11974088a46d42b903418eJohann{ 10761b362b15af34006e6a11974088a46d42b903418eJohann int_mv *ref_mv; 10771b362b15af34006e6a11974088a46d42b903418eJohann int_mv mvp; 10781b362b15af34006e6a11974088a46d42b903418eJohann 10791b362b15af34006e6a11974088a46d42b903418eJohann int segment_rd; 10801b362b15af34006e6a11974088a46d42b903418eJohann int segment_num; 10811b362b15af34006e6a11974088a46d42b903418eJohann int r; 10821b362b15af34006e6a11974088a46d42b903418eJohann int d; 10831b362b15af34006e6a11974088a46d42b903418eJohann int segment_yrate; 10841b362b15af34006e6a11974088a46d42b903418eJohann B_PREDICTION_MODE modes[16]; 10851b362b15af34006e6a11974088a46d42b903418eJohann int_mv mvs[16]; 10861b362b15af34006e6a11974088a46d42b903418eJohann unsigned char eobs[16]; 10871b362b15af34006e6a11974088a46d42b903418eJohann 10881b362b15af34006e6a11974088a46d42b903418eJohann int mvthresh; 10891b362b15af34006e6a11974088a46d42b903418eJohann int *mdcounts; 10901b362b15af34006e6a11974088a46d42b903418eJohann 10911b362b15af34006e6a11974088a46d42b903418eJohann int_mv sv_mvp[4]; /* save 4 mvp from 8x8 */ 10921b362b15af34006e6a11974088a46d42b903418eJohann int sv_istep[2]; /* save 2 initial step_param for 16x8/8x16 */ 10931b362b15af34006e6a11974088a46d42b903418eJohann 10941b362b15af34006e6a11974088a46d42b903418eJohann} BEST_SEG_INFO; 10951b362b15af34006e6a11974088a46d42b903418eJohann 10961b362b15af34006e6a11974088a46d42b903418eJohann 10971b362b15af34006e6a11974088a46d42b903418eJohannstatic void rd_check_segment(VP8_COMP *cpi, MACROBLOCK *x, 10981b362b15af34006e6a11974088a46d42b903418eJohann BEST_SEG_INFO *bsi, unsigned int segmentation) 10991b362b15af34006e6a11974088a46d42b903418eJohann{ 11001b362b15af34006e6a11974088a46d42b903418eJohann int i; 11011b362b15af34006e6a11974088a46d42b903418eJohann int const *labels; 11021b362b15af34006e6a11974088a46d42b903418eJohann int br = 0; 11031b362b15af34006e6a11974088a46d42b903418eJohann int bd = 0; 11041b362b15af34006e6a11974088a46d42b903418eJohann B_PREDICTION_MODE this_mode; 11051b362b15af34006e6a11974088a46d42b903418eJohann 11061b362b15af34006e6a11974088a46d42b903418eJohann 11071b362b15af34006e6a11974088a46d42b903418eJohann int label_count; 11081b362b15af34006e6a11974088a46d42b903418eJohann int this_segment_rd = 0; 11091b362b15af34006e6a11974088a46d42b903418eJohann int label_mv_thresh; 11101b362b15af34006e6a11974088a46d42b903418eJohann int rate = 0; 11111b362b15af34006e6a11974088a46d42b903418eJohann int sbr = 0; 11121b362b15af34006e6a11974088a46d42b903418eJohann int sbd = 0; 11131b362b15af34006e6a11974088a46d42b903418eJohann int segmentyrate = 0; 11141b362b15af34006e6a11974088a46d42b903418eJohann 11151b362b15af34006e6a11974088a46d42b903418eJohann vp8_variance_fn_ptr_t *v_fn_ptr; 11161b362b15af34006e6a11974088a46d42b903418eJohann 11171b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT_PLANES t_above, t_left; 11181b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT *ta; 11191b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT *tl; 11201b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT_PLANES t_above_b, t_left_b; 11211b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT *ta_b; 11221b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT *tl_b; 11231b362b15af34006e6a11974088a46d42b903418eJohann 11241b362b15af34006e6a11974088a46d42b903418eJohann vpx_memcpy(&t_above, x->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES)); 11251b362b15af34006e6a11974088a46d42b903418eJohann vpx_memcpy(&t_left, x->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES)); 11261b362b15af34006e6a11974088a46d42b903418eJohann 11271b362b15af34006e6a11974088a46d42b903418eJohann ta = (ENTROPY_CONTEXT *)&t_above; 11281b362b15af34006e6a11974088a46d42b903418eJohann tl = (ENTROPY_CONTEXT *)&t_left; 11291b362b15af34006e6a11974088a46d42b903418eJohann ta_b = (ENTROPY_CONTEXT *)&t_above_b; 11301b362b15af34006e6a11974088a46d42b903418eJohann tl_b = (ENTROPY_CONTEXT *)&t_left_b; 11311b362b15af34006e6a11974088a46d42b903418eJohann 11321b362b15af34006e6a11974088a46d42b903418eJohann br = 0; 11331b362b15af34006e6a11974088a46d42b903418eJohann bd = 0; 11341b362b15af34006e6a11974088a46d42b903418eJohann 11351b362b15af34006e6a11974088a46d42b903418eJohann v_fn_ptr = &cpi->fn_ptr[segmentation]; 11361b362b15af34006e6a11974088a46d42b903418eJohann labels = vp8_mbsplits[segmentation]; 11371b362b15af34006e6a11974088a46d42b903418eJohann label_count = vp8_mbsplit_count[segmentation]; 11381b362b15af34006e6a11974088a46d42b903418eJohann 11391b362b15af34006e6a11974088a46d42b903418eJohann /* 64 makes this threshold really big effectively making it so that we 11401b362b15af34006e6a11974088a46d42b903418eJohann * very rarely check mvs on segments. setting this to 1 would make mv 11411b362b15af34006e6a11974088a46d42b903418eJohann * thresh roughly equal to what it is for macroblocks 11421b362b15af34006e6a11974088a46d42b903418eJohann */ 11431b362b15af34006e6a11974088a46d42b903418eJohann label_mv_thresh = 1 * bsi->mvthresh / label_count ; 11441b362b15af34006e6a11974088a46d42b903418eJohann 11451b362b15af34006e6a11974088a46d42b903418eJohann /* Segmentation method overheads */ 11461b362b15af34006e6a11974088a46d42b903418eJohann rate = vp8_cost_token(vp8_mbsplit_tree, vp8_mbsplit_probs, vp8_mbsplit_encodings + segmentation); 11471b362b15af34006e6a11974088a46d42b903418eJohann rate += vp8_cost_mv_ref(SPLITMV, bsi->mdcounts); 11481b362b15af34006e6a11974088a46d42b903418eJohann this_segment_rd += RDCOST(x->rdmult, x->rddiv, rate, 0); 11491b362b15af34006e6a11974088a46d42b903418eJohann br += rate; 11501b362b15af34006e6a11974088a46d42b903418eJohann 11511b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < label_count; i++) 11521b362b15af34006e6a11974088a46d42b903418eJohann { 11531b362b15af34006e6a11974088a46d42b903418eJohann int_mv mode_mv[B_MODE_COUNT]; 11541b362b15af34006e6a11974088a46d42b903418eJohann int best_label_rd = INT_MAX; 11551b362b15af34006e6a11974088a46d42b903418eJohann B_PREDICTION_MODE mode_selected = ZERO4X4; 11561b362b15af34006e6a11974088a46d42b903418eJohann int bestlabelyrate = 0; 11571b362b15af34006e6a11974088a46d42b903418eJohann 11581b362b15af34006e6a11974088a46d42b903418eJohann /* search for the best motion vector on this segment */ 11591b362b15af34006e6a11974088a46d42b903418eJohann for (this_mode = LEFT4X4; this_mode <= NEW4X4 ; this_mode ++) 11601b362b15af34006e6a11974088a46d42b903418eJohann { 11611b362b15af34006e6a11974088a46d42b903418eJohann int this_rd; 11621b362b15af34006e6a11974088a46d42b903418eJohann int distortion; 11631b362b15af34006e6a11974088a46d42b903418eJohann int labelyrate; 11641b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT_PLANES t_above_s, t_left_s; 11651b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT *ta_s; 11661b362b15af34006e6a11974088a46d42b903418eJohann ENTROPY_CONTEXT *tl_s; 11671b362b15af34006e6a11974088a46d42b903418eJohann 11681b362b15af34006e6a11974088a46d42b903418eJohann vpx_memcpy(&t_above_s, &t_above, sizeof(ENTROPY_CONTEXT_PLANES)); 11691b362b15af34006e6a11974088a46d42b903418eJohann vpx_memcpy(&t_left_s, &t_left, sizeof(ENTROPY_CONTEXT_PLANES)); 11701b362b15af34006e6a11974088a46d42b903418eJohann 11711b362b15af34006e6a11974088a46d42b903418eJohann ta_s = (ENTROPY_CONTEXT *)&t_above_s; 11721b362b15af34006e6a11974088a46d42b903418eJohann tl_s = (ENTROPY_CONTEXT *)&t_left_s; 11731b362b15af34006e6a11974088a46d42b903418eJohann 11741b362b15af34006e6a11974088a46d42b903418eJohann if (this_mode == NEW4X4) 11751b362b15af34006e6a11974088a46d42b903418eJohann { 11761b362b15af34006e6a11974088a46d42b903418eJohann int sseshift; 11771b362b15af34006e6a11974088a46d42b903418eJohann int num00; 11781b362b15af34006e6a11974088a46d42b903418eJohann int step_param = 0; 11791b362b15af34006e6a11974088a46d42b903418eJohann int further_steps; 11801b362b15af34006e6a11974088a46d42b903418eJohann int n; 11811b362b15af34006e6a11974088a46d42b903418eJohann int thissme; 11821b362b15af34006e6a11974088a46d42b903418eJohann int bestsme = INT_MAX; 11831b362b15af34006e6a11974088a46d42b903418eJohann int_mv temp_mv; 11841b362b15af34006e6a11974088a46d42b903418eJohann BLOCK *c; 11851b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *e; 11861b362b15af34006e6a11974088a46d42b903418eJohann 11871b362b15af34006e6a11974088a46d42b903418eJohann /* Is the best so far sufficiently good that we cant justify 11881b362b15af34006e6a11974088a46d42b903418eJohann * doing a new motion search. 11891b362b15af34006e6a11974088a46d42b903418eJohann */ 11901b362b15af34006e6a11974088a46d42b903418eJohann if (best_label_rd < label_mv_thresh) 11911b362b15af34006e6a11974088a46d42b903418eJohann break; 11921b362b15af34006e6a11974088a46d42b903418eJohann 11931b362b15af34006e6a11974088a46d42b903418eJohann if(cpi->compressor_speed) 11941b362b15af34006e6a11974088a46d42b903418eJohann { 11951b362b15af34006e6a11974088a46d42b903418eJohann if (segmentation == BLOCK_8X16 || segmentation == BLOCK_16X8) 11961b362b15af34006e6a11974088a46d42b903418eJohann { 11971b362b15af34006e6a11974088a46d42b903418eJohann bsi->mvp.as_int = bsi->sv_mvp[i].as_int; 11981b362b15af34006e6a11974088a46d42b903418eJohann if (i==1 && segmentation == BLOCK_16X8) 11991b362b15af34006e6a11974088a46d42b903418eJohann bsi->mvp.as_int = bsi->sv_mvp[2].as_int; 12001b362b15af34006e6a11974088a46d42b903418eJohann 12011b362b15af34006e6a11974088a46d42b903418eJohann step_param = bsi->sv_istep[i]; 12021b362b15af34006e6a11974088a46d42b903418eJohann } 12031b362b15af34006e6a11974088a46d42b903418eJohann 12041b362b15af34006e6a11974088a46d42b903418eJohann /* use previous block's result as next block's MV 12051b362b15af34006e6a11974088a46d42b903418eJohann * predictor. 12061b362b15af34006e6a11974088a46d42b903418eJohann */ 12071b362b15af34006e6a11974088a46d42b903418eJohann if (segmentation == BLOCK_4X4 && i>0) 12081b362b15af34006e6a11974088a46d42b903418eJohann { 12091b362b15af34006e6a11974088a46d42b903418eJohann bsi->mvp.as_int = x->e_mbd.block[i-1].bmi.mv.as_int; 12101b362b15af34006e6a11974088a46d42b903418eJohann if (i==4 || i==8 || i==12) 12111b362b15af34006e6a11974088a46d42b903418eJohann bsi->mvp.as_int = x->e_mbd.block[i-4].bmi.mv.as_int; 12121b362b15af34006e6a11974088a46d42b903418eJohann step_param = 2; 12131b362b15af34006e6a11974088a46d42b903418eJohann } 12141b362b15af34006e6a11974088a46d42b903418eJohann } 12151b362b15af34006e6a11974088a46d42b903418eJohann 12161b362b15af34006e6a11974088a46d42b903418eJohann further_steps = (MAX_MVSEARCH_STEPS - 1) - step_param; 12171b362b15af34006e6a11974088a46d42b903418eJohann 12181b362b15af34006e6a11974088a46d42b903418eJohann { 12191b362b15af34006e6a11974088a46d42b903418eJohann int sadpb = x->sadperbit4; 12201b362b15af34006e6a11974088a46d42b903418eJohann int_mv mvp_full; 12211b362b15af34006e6a11974088a46d42b903418eJohann 12221b362b15af34006e6a11974088a46d42b903418eJohann mvp_full.as_mv.row = bsi->mvp.as_mv.row >>3; 12231b362b15af34006e6a11974088a46d42b903418eJohann mvp_full.as_mv.col = bsi->mvp.as_mv.col >>3; 12241b362b15af34006e6a11974088a46d42b903418eJohann 12251b362b15af34006e6a11974088a46d42b903418eJohann /* find first label */ 12261b362b15af34006e6a11974088a46d42b903418eJohann n = vp8_mbsplit_offset[segmentation][i]; 12271b362b15af34006e6a11974088a46d42b903418eJohann 12281b362b15af34006e6a11974088a46d42b903418eJohann c = &x->block[n]; 12291b362b15af34006e6a11974088a46d42b903418eJohann e = &x->e_mbd.block[n]; 12301b362b15af34006e6a11974088a46d42b903418eJohann 12311b362b15af34006e6a11974088a46d42b903418eJohann { 12321b362b15af34006e6a11974088a46d42b903418eJohann bestsme = cpi->diamond_search_sad(x, c, e, &mvp_full, 12331b362b15af34006e6a11974088a46d42b903418eJohann &mode_mv[NEW4X4], step_param, 12341b362b15af34006e6a11974088a46d42b903418eJohann sadpb, &num00, v_fn_ptr, 12351b362b15af34006e6a11974088a46d42b903418eJohann x->mvcost, bsi->ref_mv); 12361b362b15af34006e6a11974088a46d42b903418eJohann 12371b362b15af34006e6a11974088a46d42b903418eJohann n = num00; 12381b362b15af34006e6a11974088a46d42b903418eJohann num00 = 0; 12391b362b15af34006e6a11974088a46d42b903418eJohann 12401b362b15af34006e6a11974088a46d42b903418eJohann while (n < further_steps) 12411b362b15af34006e6a11974088a46d42b903418eJohann { 12421b362b15af34006e6a11974088a46d42b903418eJohann n++; 12431b362b15af34006e6a11974088a46d42b903418eJohann 12441b362b15af34006e6a11974088a46d42b903418eJohann if (num00) 12451b362b15af34006e6a11974088a46d42b903418eJohann num00--; 12461b362b15af34006e6a11974088a46d42b903418eJohann else 12471b362b15af34006e6a11974088a46d42b903418eJohann { 12481b362b15af34006e6a11974088a46d42b903418eJohann thissme = cpi->diamond_search_sad(x, c, e, 12491b362b15af34006e6a11974088a46d42b903418eJohann &mvp_full, &temp_mv, 12501b362b15af34006e6a11974088a46d42b903418eJohann step_param + n, sadpb, 12511b362b15af34006e6a11974088a46d42b903418eJohann &num00, v_fn_ptr, 12521b362b15af34006e6a11974088a46d42b903418eJohann x->mvcost, bsi->ref_mv); 12531b362b15af34006e6a11974088a46d42b903418eJohann 12541b362b15af34006e6a11974088a46d42b903418eJohann if (thissme < bestsme) 12551b362b15af34006e6a11974088a46d42b903418eJohann { 12561b362b15af34006e6a11974088a46d42b903418eJohann bestsme = thissme; 12571b362b15af34006e6a11974088a46d42b903418eJohann mode_mv[NEW4X4].as_int = temp_mv.as_int; 12581b362b15af34006e6a11974088a46d42b903418eJohann } 12591b362b15af34006e6a11974088a46d42b903418eJohann } 12601b362b15af34006e6a11974088a46d42b903418eJohann } 12611b362b15af34006e6a11974088a46d42b903418eJohann } 12621b362b15af34006e6a11974088a46d42b903418eJohann 12631b362b15af34006e6a11974088a46d42b903418eJohann sseshift = segmentation_to_sseshift[segmentation]; 12641b362b15af34006e6a11974088a46d42b903418eJohann 12651b362b15af34006e6a11974088a46d42b903418eJohann /* Should we do a full search (best quality only) */ 12661b362b15af34006e6a11974088a46d42b903418eJohann if ((cpi->compressor_speed == 0) && (bestsme >> sseshift) > 4000) 12671b362b15af34006e6a11974088a46d42b903418eJohann { 12681b362b15af34006e6a11974088a46d42b903418eJohann /* Check if mvp_full is within the range. */ 12691b362b15af34006e6a11974088a46d42b903418eJohann vp8_clamp_mv(&mvp_full, x->mv_col_min, x->mv_col_max, x->mv_row_min, x->mv_row_max); 12701b362b15af34006e6a11974088a46d42b903418eJohann 12711b362b15af34006e6a11974088a46d42b903418eJohann thissme = cpi->full_search_sad(x, c, e, &mvp_full, 12721b362b15af34006e6a11974088a46d42b903418eJohann sadpb, 16, v_fn_ptr, 12731b362b15af34006e6a11974088a46d42b903418eJohann x->mvcost, bsi->ref_mv); 12741b362b15af34006e6a11974088a46d42b903418eJohann 12751b362b15af34006e6a11974088a46d42b903418eJohann if (thissme < bestsme) 12761b362b15af34006e6a11974088a46d42b903418eJohann { 12771b362b15af34006e6a11974088a46d42b903418eJohann bestsme = thissme; 12781b362b15af34006e6a11974088a46d42b903418eJohann mode_mv[NEW4X4].as_int = e->bmi.mv.as_int; 12791b362b15af34006e6a11974088a46d42b903418eJohann } 12801b362b15af34006e6a11974088a46d42b903418eJohann else 12811b362b15af34006e6a11974088a46d42b903418eJohann { 12821b362b15af34006e6a11974088a46d42b903418eJohann /* The full search result is actually worse so 12831b362b15af34006e6a11974088a46d42b903418eJohann * re-instate the previous best vector 12841b362b15af34006e6a11974088a46d42b903418eJohann */ 12851b362b15af34006e6a11974088a46d42b903418eJohann e->bmi.mv.as_int = mode_mv[NEW4X4].as_int; 12861b362b15af34006e6a11974088a46d42b903418eJohann } 12871b362b15af34006e6a11974088a46d42b903418eJohann } 12881b362b15af34006e6a11974088a46d42b903418eJohann } 12891b362b15af34006e6a11974088a46d42b903418eJohann 12901b362b15af34006e6a11974088a46d42b903418eJohann if (bestsme < INT_MAX) 12911b362b15af34006e6a11974088a46d42b903418eJohann { 12921b362b15af34006e6a11974088a46d42b903418eJohann int distortion; 12931b362b15af34006e6a11974088a46d42b903418eJohann unsigned int sse; 12941b362b15af34006e6a11974088a46d42b903418eJohann cpi->find_fractional_mv_step(x, c, e, &mode_mv[NEW4X4], 12951b362b15af34006e6a11974088a46d42b903418eJohann bsi->ref_mv, x->errorperbit, v_fn_ptr, x->mvcost, 12961b362b15af34006e6a11974088a46d42b903418eJohann &distortion, &sse); 12971b362b15af34006e6a11974088a46d42b903418eJohann 12981b362b15af34006e6a11974088a46d42b903418eJohann } 12991b362b15af34006e6a11974088a46d42b903418eJohann } /* NEW4X4 */ 13001b362b15af34006e6a11974088a46d42b903418eJohann 13011b362b15af34006e6a11974088a46d42b903418eJohann rate = labels2mode(x, labels, i, this_mode, &mode_mv[this_mode], 13021b362b15af34006e6a11974088a46d42b903418eJohann bsi->ref_mv, x->mvcost); 13031b362b15af34006e6a11974088a46d42b903418eJohann 13041b362b15af34006e6a11974088a46d42b903418eJohann /* Trap vectors that reach beyond the UMV borders */ 13051b362b15af34006e6a11974088a46d42b903418eJohann if (((mode_mv[this_mode].as_mv.row >> 3) < x->mv_row_min) || ((mode_mv[this_mode].as_mv.row >> 3) > x->mv_row_max) || 13061b362b15af34006e6a11974088a46d42b903418eJohann ((mode_mv[this_mode].as_mv.col >> 3) < x->mv_col_min) || ((mode_mv[this_mode].as_mv.col >> 3) > x->mv_col_max)) 13071b362b15af34006e6a11974088a46d42b903418eJohann { 13081b362b15af34006e6a11974088a46d42b903418eJohann continue; 13091b362b15af34006e6a11974088a46d42b903418eJohann } 13101b362b15af34006e6a11974088a46d42b903418eJohann 13111b362b15af34006e6a11974088a46d42b903418eJohann distortion = vp8_encode_inter_mb_segment(x, labels, i) / 4; 13121b362b15af34006e6a11974088a46d42b903418eJohann 13131b362b15af34006e6a11974088a46d42b903418eJohann labelyrate = rdcost_mbsegment_y(x, labels, i, ta_s, tl_s); 13141b362b15af34006e6a11974088a46d42b903418eJohann rate += labelyrate; 13151b362b15af34006e6a11974088a46d42b903418eJohann 13161b362b15af34006e6a11974088a46d42b903418eJohann this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion); 13171b362b15af34006e6a11974088a46d42b903418eJohann 13181b362b15af34006e6a11974088a46d42b903418eJohann if (this_rd < best_label_rd) 13191b362b15af34006e6a11974088a46d42b903418eJohann { 13201b362b15af34006e6a11974088a46d42b903418eJohann sbr = rate; 13211b362b15af34006e6a11974088a46d42b903418eJohann sbd = distortion; 13221b362b15af34006e6a11974088a46d42b903418eJohann bestlabelyrate = labelyrate; 13231b362b15af34006e6a11974088a46d42b903418eJohann mode_selected = this_mode; 13241b362b15af34006e6a11974088a46d42b903418eJohann best_label_rd = this_rd; 13251b362b15af34006e6a11974088a46d42b903418eJohann 13261b362b15af34006e6a11974088a46d42b903418eJohann vpx_memcpy(ta_b, ta_s, sizeof(ENTROPY_CONTEXT_PLANES)); 13271b362b15af34006e6a11974088a46d42b903418eJohann vpx_memcpy(tl_b, tl_s, sizeof(ENTROPY_CONTEXT_PLANES)); 13281b362b15af34006e6a11974088a46d42b903418eJohann 13291b362b15af34006e6a11974088a46d42b903418eJohann } 13301b362b15af34006e6a11974088a46d42b903418eJohann } /*for each 4x4 mode*/ 13311b362b15af34006e6a11974088a46d42b903418eJohann 13321b362b15af34006e6a11974088a46d42b903418eJohann vpx_memcpy(ta, ta_b, sizeof(ENTROPY_CONTEXT_PLANES)); 13331b362b15af34006e6a11974088a46d42b903418eJohann vpx_memcpy(tl, tl_b, sizeof(ENTROPY_CONTEXT_PLANES)); 13341b362b15af34006e6a11974088a46d42b903418eJohann 13351b362b15af34006e6a11974088a46d42b903418eJohann labels2mode(x, labels, i, mode_selected, &mode_mv[mode_selected], 13361b362b15af34006e6a11974088a46d42b903418eJohann bsi->ref_mv, x->mvcost); 13371b362b15af34006e6a11974088a46d42b903418eJohann 13381b362b15af34006e6a11974088a46d42b903418eJohann br += sbr; 13391b362b15af34006e6a11974088a46d42b903418eJohann bd += sbd; 13401b362b15af34006e6a11974088a46d42b903418eJohann segmentyrate += bestlabelyrate; 13411b362b15af34006e6a11974088a46d42b903418eJohann this_segment_rd += best_label_rd; 13421b362b15af34006e6a11974088a46d42b903418eJohann 13431b362b15af34006e6a11974088a46d42b903418eJohann if (this_segment_rd >= bsi->segment_rd) 13441b362b15af34006e6a11974088a46d42b903418eJohann break; 13451b362b15af34006e6a11974088a46d42b903418eJohann 13461b362b15af34006e6a11974088a46d42b903418eJohann } /* for each label */ 13471b362b15af34006e6a11974088a46d42b903418eJohann 13481b362b15af34006e6a11974088a46d42b903418eJohann if (this_segment_rd < bsi->segment_rd) 13491b362b15af34006e6a11974088a46d42b903418eJohann { 13501b362b15af34006e6a11974088a46d42b903418eJohann bsi->r = br; 13511b362b15af34006e6a11974088a46d42b903418eJohann bsi->d = bd; 13521b362b15af34006e6a11974088a46d42b903418eJohann bsi->segment_yrate = segmentyrate; 13531b362b15af34006e6a11974088a46d42b903418eJohann bsi->segment_rd = this_segment_rd; 13541b362b15af34006e6a11974088a46d42b903418eJohann bsi->segment_num = segmentation; 13551b362b15af34006e6a11974088a46d42b903418eJohann 13561b362b15af34006e6a11974088a46d42b903418eJohann /* store everything needed to come back to this!! */ 13571b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < 16; i++) 13581b362b15af34006e6a11974088a46d42b903418eJohann { 13591b362b15af34006e6a11974088a46d42b903418eJohann bsi->mvs[i].as_mv = x->partition_info->bmi[i].mv.as_mv; 13601b362b15af34006e6a11974088a46d42b903418eJohann bsi->modes[i] = x->partition_info->bmi[i].mode; 13611b362b15af34006e6a11974088a46d42b903418eJohann bsi->eobs[i] = x->e_mbd.eobs[i]; 13621b362b15af34006e6a11974088a46d42b903418eJohann } 13631b362b15af34006e6a11974088a46d42b903418eJohann } 13641b362b15af34006e6a11974088a46d42b903418eJohann} 13651b362b15af34006e6a11974088a46d42b903418eJohann 13661b362b15af34006e6a11974088a46d42b903418eJohannstatic 13671b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_cal_step_param(int sr, int *sp) 13681b362b15af34006e6a11974088a46d42b903418eJohann{ 13691b362b15af34006e6a11974088a46d42b903418eJohann int step = 0; 13701b362b15af34006e6a11974088a46d42b903418eJohann 13711b362b15af34006e6a11974088a46d42b903418eJohann if (sr > MAX_FIRST_STEP) sr = MAX_FIRST_STEP; 13721b362b15af34006e6a11974088a46d42b903418eJohann else if (sr < 1) sr = 1; 13731b362b15af34006e6a11974088a46d42b903418eJohann 13741b362b15af34006e6a11974088a46d42b903418eJohann while (sr>>=1) 13751b362b15af34006e6a11974088a46d42b903418eJohann step++; 13761b362b15af34006e6a11974088a46d42b903418eJohann 13771b362b15af34006e6a11974088a46d42b903418eJohann *sp = MAX_MVSEARCH_STEPS - 1 - step; 13781b362b15af34006e6a11974088a46d42b903418eJohann} 13791b362b15af34006e6a11974088a46d42b903418eJohann 13801b362b15af34006e6a11974088a46d42b903418eJohannstatic int vp8_rd_pick_best_mbsegmentation(VP8_COMP *cpi, MACROBLOCK *x, 13811b362b15af34006e6a11974088a46d42b903418eJohann int_mv *best_ref_mv, int best_rd, 13821b362b15af34006e6a11974088a46d42b903418eJohann int *mdcounts, int *returntotrate, 13831b362b15af34006e6a11974088a46d42b903418eJohann int *returnyrate, int *returndistortion, 13841b362b15af34006e6a11974088a46d42b903418eJohann int mvthresh) 13851b362b15af34006e6a11974088a46d42b903418eJohann{ 13861b362b15af34006e6a11974088a46d42b903418eJohann int i; 13871b362b15af34006e6a11974088a46d42b903418eJohann BEST_SEG_INFO bsi; 13881b362b15af34006e6a11974088a46d42b903418eJohann 13891b362b15af34006e6a11974088a46d42b903418eJohann vpx_memset(&bsi, 0, sizeof(bsi)); 13901b362b15af34006e6a11974088a46d42b903418eJohann 13911b362b15af34006e6a11974088a46d42b903418eJohann bsi.segment_rd = best_rd; 13921b362b15af34006e6a11974088a46d42b903418eJohann bsi.ref_mv = best_ref_mv; 13931b362b15af34006e6a11974088a46d42b903418eJohann bsi.mvp.as_int = best_ref_mv->as_int; 13941b362b15af34006e6a11974088a46d42b903418eJohann bsi.mvthresh = mvthresh; 13951b362b15af34006e6a11974088a46d42b903418eJohann bsi.mdcounts = mdcounts; 13961b362b15af34006e6a11974088a46d42b903418eJohann 13971b362b15af34006e6a11974088a46d42b903418eJohann for(i = 0; i < 16; i++) 13981b362b15af34006e6a11974088a46d42b903418eJohann { 13991b362b15af34006e6a11974088a46d42b903418eJohann bsi.modes[i] = ZERO4X4; 14001b362b15af34006e6a11974088a46d42b903418eJohann } 14011b362b15af34006e6a11974088a46d42b903418eJohann 14021b362b15af34006e6a11974088a46d42b903418eJohann if(cpi->compressor_speed == 0) 14031b362b15af34006e6a11974088a46d42b903418eJohann { 14041b362b15af34006e6a11974088a46d42b903418eJohann /* for now, we will keep the original segmentation order 14051b362b15af34006e6a11974088a46d42b903418eJohann when in best quality mode */ 14061b362b15af34006e6a11974088a46d42b903418eJohann rd_check_segment(cpi, x, &bsi, BLOCK_16X8); 14071b362b15af34006e6a11974088a46d42b903418eJohann rd_check_segment(cpi, x, &bsi, BLOCK_8X16); 14081b362b15af34006e6a11974088a46d42b903418eJohann rd_check_segment(cpi, x, &bsi, BLOCK_8X8); 14091b362b15af34006e6a11974088a46d42b903418eJohann rd_check_segment(cpi, x, &bsi, BLOCK_4X4); 14101b362b15af34006e6a11974088a46d42b903418eJohann } 14111b362b15af34006e6a11974088a46d42b903418eJohann else 14121b362b15af34006e6a11974088a46d42b903418eJohann { 14131b362b15af34006e6a11974088a46d42b903418eJohann int sr; 14141b362b15af34006e6a11974088a46d42b903418eJohann 14151b362b15af34006e6a11974088a46d42b903418eJohann rd_check_segment(cpi, x, &bsi, BLOCK_8X8); 14161b362b15af34006e6a11974088a46d42b903418eJohann 14171b362b15af34006e6a11974088a46d42b903418eJohann if (bsi.segment_rd < best_rd) 14181b362b15af34006e6a11974088a46d42b903418eJohann { 14191b362b15af34006e6a11974088a46d42b903418eJohann int col_min = ((best_ref_mv->as_mv.col+7)>>3) - MAX_FULL_PEL_VAL; 14201b362b15af34006e6a11974088a46d42b903418eJohann int row_min = ((best_ref_mv->as_mv.row+7)>>3) - MAX_FULL_PEL_VAL; 14211b362b15af34006e6a11974088a46d42b903418eJohann int col_max = (best_ref_mv->as_mv.col>>3) + MAX_FULL_PEL_VAL; 14221b362b15af34006e6a11974088a46d42b903418eJohann int row_max = (best_ref_mv->as_mv.row>>3) + MAX_FULL_PEL_VAL; 14231b362b15af34006e6a11974088a46d42b903418eJohann 14241b362b15af34006e6a11974088a46d42b903418eJohann int tmp_col_min = x->mv_col_min; 14251b362b15af34006e6a11974088a46d42b903418eJohann int tmp_col_max = x->mv_col_max; 14261b362b15af34006e6a11974088a46d42b903418eJohann int tmp_row_min = x->mv_row_min; 14271b362b15af34006e6a11974088a46d42b903418eJohann int tmp_row_max = x->mv_row_max; 14281b362b15af34006e6a11974088a46d42b903418eJohann 14291b362b15af34006e6a11974088a46d42b903418eJohann /* Get intersection of UMV window and valid MV window to reduce # of checks in diamond search. */ 14301b362b15af34006e6a11974088a46d42b903418eJohann if (x->mv_col_min < col_min ) 14311b362b15af34006e6a11974088a46d42b903418eJohann x->mv_col_min = col_min; 14321b362b15af34006e6a11974088a46d42b903418eJohann if (x->mv_col_max > col_max ) 14331b362b15af34006e6a11974088a46d42b903418eJohann x->mv_col_max = col_max; 14341b362b15af34006e6a11974088a46d42b903418eJohann if (x->mv_row_min < row_min ) 14351b362b15af34006e6a11974088a46d42b903418eJohann x->mv_row_min = row_min; 14361b362b15af34006e6a11974088a46d42b903418eJohann if (x->mv_row_max > row_max ) 14371b362b15af34006e6a11974088a46d42b903418eJohann x->mv_row_max = row_max; 14381b362b15af34006e6a11974088a46d42b903418eJohann 14391b362b15af34006e6a11974088a46d42b903418eJohann /* Get 8x8 result */ 14401b362b15af34006e6a11974088a46d42b903418eJohann bsi.sv_mvp[0].as_int = bsi.mvs[0].as_int; 14411b362b15af34006e6a11974088a46d42b903418eJohann bsi.sv_mvp[1].as_int = bsi.mvs[2].as_int; 14421b362b15af34006e6a11974088a46d42b903418eJohann bsi.sv_mvp[2].as_int = bsi.mvs[8].as_int; 14431b362b15af34006e6a11974088a46d42b903418eJohann bsi.sv_mvp[3].as_int = bsi.mvs[10].as_int; 14441b362b15af34006e6a11974088a46d42b903418eJohann 14451b362b15af34006e6a11974088a46d42b903418eJohann /* Use 8x8 result as 16x8/8x16's predictor MV. Adjust search range according to the closeness of 2 MV. */ 14461b362b15af34006e6a11974088a46d42b903418eJohann /* block 8X16 */ 14471b362b15af34006e6a11974088a46d42b903418eJohann { 14481b362b15af34006e6a11974088a46d42b903418eJohann sr = MAXF((abs(bsi.sv_mvp[0].as_mv.row - bsi.sv_mvp[2].as_mv.row))>>3, (abs(bsi.sv_mvp[0].as_mv.col - bsi.sv_mvp[2].as_mv.col))>>3); 14491b362b15af34006e6a11974088a46d42b903418eJohann vp8_cal_step_param(sr, &bsi.sv_istep[0]); 14501b362b15af34006e6a11974088a46d42b903418eJohann 14511b362b15af34006e6a11974088a46d42b903418eJohann sr = MAXF((abs(bsi.sv_mvp[1].as_mv.row - bsi.sv_mvp[3].as_mv.row))>>3, (abs(bsi.sv_mvp[1].as_mv.col - bsi.sv_mvp[3].as_mv.col))>>3); 14521b362b15af34006e6a11974088a46d42b903418eJohann vp8_cal_step_param(sr, &bsi.sv_istep[1]); 14531b362b15af34006e6a11974088a46d42b903418eJohann 14541b362b15af34006e6a11974088a46d42b903418eJohann rd_check_segment(cpi, x, &bsi, BLOCK_8X16); 14551b362b15af34006e6a11974088a46d42b903418eJohann } 14561b362b15af34006e6a11974088a46d42b903418eJohann 14571b362b15af34006e6a11974088a46d42b903418eJohann /* block 16X8 */ 14581b362b15af34006e6a11974088a46d42b903418eJohann { 14591b362b15af34006e6a11974088a46d42b903418eJohann sr = MAXF((abs(bsi.sv_mvp[0].as_mv.row - bsi.sv_mvp[1].as_mv.row))>>3, (abs(bsi.sv_mvp[0].as_mv.col - bsi.sv_mvp[1].as_mv.col))>>3); 14601b362b15af34006e6a11974088a46d42b903418eJohann vp8_cal_step_param(sr, &bsi.sv_istep[0]); 14611b362b15af34006e6a11974088a46d42b903418eJohann 14621b362b15af34006e6a11974088a46d42b903418eJohann sr = MAXF((abs(bsi.sv_mvp[2].as_mv.row - bsi.sv_mvp[3].as_mv.row))>>3, (abs(bsi.sv_mvp[2].as_mv.col - bsi.sv_mvp[3].as_mv.col))>>3); 14631b362b15af34006e6a11974088a46d42b903418eJohann vp8_cal_step_param(sr, &bsi.sv_istep[1]); 14641b362b15af34006e6a11974088a46d42b903418eJohann 14651b362b15af34006e6a11974088a46d42b903418eJohann rd_check_segment(cpi, x, &bsi, BLOCK_16X8); 14661b362b15af34006e6a11974088a46d42b903418eJohann } 14671b362b15af34006e6a11974088a46d42b903418eJohann 14681b362b15af34006e6a11974088a46d42b903418eJohann /* If 8x8 is better than 16x8/8x16, then do 4x4 search */ 14691b362b15af34006e6a11974088a46d42b903418eJohann /* Not skip 4x4 if speed=0 (good quality) */ 14701b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->sf.no_skip_block4x4_search || bsi.segment_num == BLOCK_8X8) /* || (sv_segment_rd8x8-bsi.segment_rd) < sv_segment_rd8x8>>5) */ 14711b362b15af34006e6a11974088a46d42b903418eJohann { 14721b362b15af34006e6a11974088a46d42b903418eJohann bsi.mvp.as_int = bsi.sv_mvp[0].as_int; 14731b362b15af34006e6a11974088a46d42b903418eJohann rd_check_segment(cpi, x, &bsi, BLOCK_4X4); 14741b362b15af34006e6a11974088a46d42b903418eJohann } 14751b362b15af34006e6a11974088a46d42b903418eJohann 14761b362b15af34006e6a11974088a46d42b903418eJohann /* restore UMV window */ 14771b362b15af34006e6a11974088a46d42b903418eJohann x->mv_col_min = tmp_col_min; 14781b362b15af34006e6a11974088a46d42b903418eJohann x->mv_col_max = tmp_col_max; 14791b362b15af34006e6a11974088a46d42b903418eJohann x->mv_row_min = tmp_row_min; 14801b362b15af34006e6a11974088a46d42b903418eJohann x->mv_row_max = tmp_row_max; 14811b362b15af34006e6a11974088a46d42b903418eJohann } 14821b362b15af34006e6a11974088a46d42b903418eJohann } 14831b362b15af34006e6a11974088a46d42b903418eJohann 14841b362b15af34006e6a11974088a46d42b903418eJohann /* set it to the best */ 14851b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < 16; i++) 14861b362b15af34006e6a11974088a46d42b903418eJohann { 14871b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *bd = &x->e_mbd.block[i]; 14881b362b15af34006e6a11974088a46d42b903418eJohann 14891b362b15af34006e6a11974088a46d42b903418eJohann bd->bmi.mv.as_int = bsi.mvs[i].as_int; 14901b362b15af34006e6a11974088a46d42b903418eJohann *bd->eob = bsi.eobs[i]; 14911b362b15af34006e6a11974088a46d42b903418eJohann } 14921b362b15af34006e6a11974088a46d42b903418eJohann 14931b362b15af34006e6a11974088a46d42b903418eJohann *returntotrate = bsi.r; 14941b362b15af34006e6a11974088a46d42b903418eJohann *returndistortion = bsi.d; 14951b362b15af34006e6a11974088a46d42b903418eJohann *returnyrate = bsi.segment_yrate; 14961b362b15af34006e6a11974088a46d42b903418eJohann 14971b362b15af34006e6a11974088a46d42b903418eJohann /* save partitions */ 14981b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.partitioning = bsi.segment_num; 14991b362b15af34006e6a11974088a46d42b903418eJohann x->partition_info->count = vp8_mbsplit_count[bsi.segment_num]; 15001b362b15af34006e6a11974088a46d42b903418eJohann 15011b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < x->partition_info->count; i++) 15021b362b15af34006e6a11974088a46d42b903418eJohann { 15031b362b15af34006e6a11974088a46d42b903418eJohann int j; 15041b362b15af34006e6a11974088a46d42b903418eJohann 15051b362b15af34006e6a11974088a46d42b903418eJohann j = vp8_mbsplit_offset[bsi.segment_num][i]; 15061b362b15af34006e6a11974088a46d42b903418eJohann 15071b362b15af34006e6a11974088a46d42b903418eJohann x->partition_info->bmi[i].mode = bsi.modes[j]; 15081b362b15af34006e6a11974088a46d42b903418eJohann x->partition_info->bmi[i].mv.as_mv = bsi.mvs[j].as_mv; 15091b362b15af34006e6a11974088a46d42b903418eJohann } 15101b362b15af34006e6a11974088a46d42b903418eJohann /* 15111b362b15af34006e6a11974088a46d42b903418eJohann * used to set x->e_mbd.mode_info_context->mbmi.mv.as_int 15121b362b15af34006e6a11974088a46d42b903418eJohann */ 15131b362b15af34006e6a11974088a46d42b903418eJohann x->partition_info->bmi[15].mv.as_int = bsi.mvs[15].as_int; 15141b362b15af34006e6a11974088a46d42b903418eJohann 15151b362b15af34006e6a11974088a46d42b903418eJohann return bsi.segment_rd; 15161b362b15af34006e6a11974088a46d42b903418eJohann} 15171b362b15af34006e6a11974088a46d42b903418eJohann 15181b362b15af34006e6a11974088a46d42b903418eJohann/* The improved MV prediction */ 15191b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_mv_pred 15201b362b15af34006e6a11974088a46d42b903418eJohann( 15211b362b15af34006e6a11974088a46d42b903418eJohann VP8_COMP *cpi, 15221b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *xd, 15231b362b15af34006e6a11974088a46d42b903418eJohann const MODE_INFO *here, 15241b362b15af34006e6a11974088a46d42b903418eJohann int_mv *mvp, 15251b362b15af34006e6a11974088a46d42b903418eJohann int refframe, 15261b362b15af34006e6a11974088a46d42b903418eJohann int *ref_frame_sign_bias, 15271b362b15af34006e6a11974088a46d42b903418eJohann int *sr, 15281b362b15af34006e6a11974088a46d42b903418eJohann int near_sadidx[] 15291b362b15af34006e6a11974088a46d42b903418eJohann) 15301b362b15af34006e6a11974088a46d42b903418eJohann{ 15311b362b15af34006e6a11974088a46d42b903418eJohann const MODE_INFO *above = here - xd->mode_info_stride; 15321b362b15af34006e6a11974088a46d42b903418eJohann const MODE_INFO *left = here - 1; 15331b362b15af34006e6a11974088a46d42b903418eJohann const MODE_INFO *aboveleft = above - 1; 15341b362b15af34006e6a11974088a46d42b903418eJohann int_mv near_mvs[8]; 15351b362b15af34006e6a11974088a46d42b903418eJohann int near_ref[8]; 15361b362b15af34006e6a11974088a46d42b903418eJohann int_mv mv; 15371b362b15af34006e6a11974088a46d42b903418eJohann int vcnt=0; 15381b362b15af34006e6a11974088a46d42b903418eJohann int find=0; 15391b362b15af34006e6a11974088a46d42b903418eJohann int mb_offset; 15401b362b15af34006e6a11974088a46d42b903418eJohann 15411b362b15af34006e6a11974088a46d42b903418eJohann int mvx[8]; 15421b362b15af34006e6a11974088a46d42b903418eJohann int mvy[8]; 15431b362b15af34006e6a11974088a46d42b903418eJohann int i; 15441b362b15af34006e6a11974088a46d42b903418eJohann 15451b362b15af34006e6a11974088a46d42b903418eJohann mv.as_int = 0; 15461b362b15af34006e6a11974088a46d42b903418eJohann 15471b362b15af34006e6a11974088a46d42b903418eJohann if(here->mbmi.ref_frame != INTRA_FRAME) 15481b362b15af34006e6a11974088a46d42b903418eJohann { 15491b362b15af34006e6a11974088a46d42b903418eJohann near_mvs[0].as_int = near_mvs[1].as_int = near_mvs[2].as_int = near_mvs[3].as_int = near_mvs[4].as_int = near_mvs[5].as_int = near_mvs[6].as_int = near_mvs[7].as_int = 0; 15501b362b15af34006e6a11974088a46d42b903418eJohann near_ref[0] = near_ref[1] = near_ref[2] = near_ref[3] = near_ref[4] = near_ref[5] = near_ref[6] = near_ref[7] = 0; 15511b362b15af34006e6a11974088a46d42b903418eJohann 15521b362b15af34006e6a11974088a46d42b903418eJohann /* read in 3 nearby block's MVs from current frame as prediction 15531b362b15af34006e6a11974088a46d42b903418eJohann * candidates. 15541b362b15af34006e6a11974088a46d42b903418eJohann */ 15551b362b15af34006e6a11974088a46d42b903418eJohann if (above->mbmi.ref_frame != INTRA_FRAME) 15561b362b15af34006e6a11974088a46d42b903418eJohann { 15571b362b15af34006e6a11974088a46d42b903418eJohann near_mvs[vcnt].as_int = above->mbmi.mv.as_int; 15581b362b15af34006e6a11974088a46d42b903418eJohann mv_bias(ref_frame_sign_bias[above->mbmi.ref_frame], refframe, &near_mvs[vcnt], ref_frame_sign_bias); 15591b362b15af34006e6a11974088a46d42b903418eJohann near_ref[vcnt] = above->mbmi.ref_frame; 15601b362b15af34006e6a11974088a46d42b903418eJohann } 15611b362b15af34006e6a11974088a46d42b903418eJohann vcnt++; 15621b362b15af34006e6a11974088a46d42b903418eJohann if (left->mbmi.ref_frame != INTRA_FRAME) 15631b362b15af34006e6a11974088a46d42b903418eJohann { 15641b362b15af34006e6a11974088a46d42b903418eJohann near_mvs[vcnt].as_int = left->mbmi.mv.as_int; 15651b362b15af34006e6a11974088a46d42b903418eJohann mv_bias(ref_frame_sign_bias[left->mbmi.ref_frame], refframe, &near_mvs[vcnt], ref_frame_sign_bias); 15661b362b15af34006e6a11974088a46d42b903418eJohann near_ref[vcnt] = left->mbmi.ref_frame; 15671b362b15af34006e6a11974088a46d42b903418eJohann } 15681b362b15af34006e6a11974088a46d42b903418eJohann vcnt++; 15691b362b15af34006e6a11974088a46d42b903418eJohann if (aboveleft->mbmi.ref_frame != INTRA_FRAME) 15701b362b15af34006e6a11974088a46d42b903418eJohann { 15711b362b15af34006e6a11974088a46d42b903418eJohann near_mvs[vcnt].as_int = aboveleft->mbmi.mv.as_int; 15721b362b15af34006e6a11974088a46d42b903418eJohann mv_bias(ref_frame_sign_bias[aboveleft->mbmi.ref_frame], refframe, &near_mvs[vcnt], ref_frame_sign_bias); 15731b362b15af34006e6a11974088a46d42b903418eJohann near_ref[vcnt] = aboveleft->mbmi.ref_frame; 15741b362b15af34006e6a11974088a46d42b903418eJohann } 15751b362b15af34006e6a11974088a46d42b903418eJohann vcnt++; 15761b362b15af34006e6a11974088a46d42b903418eJohann 15771b362b15af34006e6a11974088a46d42b903418eJohann /* read in 5 nearby block's MVs from last frame. */ 15781b362b15af34006e6a11974088a46d42b903418eJohann if(cpi->common.last_frame_type != KEY_FRAME) 15791b362b15af34006e6a11974088a46d42b903418eJohann { 15801b362b15af34006e6a11974088a46d42b903418eJohann mb_offset = (-xd->mb_to_top_edge/128 + 1) * (xd->mode_info_stride +1) + (-xd->mb_to_left_edge/128 +1) ; 15811b362b15af34006e6a11974088a46d42b903418eJohann 15821b362b15af34006e6a11974088a46d42b903418eJohann /* current in last frame */ 15831b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->lf_ref_frame[mb_offset] != INTRA_FRAME) 15841b362b15af34006e6a11974088a46d42b903418eJohann { 15851b362b15af34006e6a11974088a46d42b903418eJohann near_mvs[vcnt].as_int = cpi->lfmv[mb_offset].as_int; 15861b362b15af34006e6a11974088a46d42b903418eJohann mv_bias(cpi->lf_ref_frame_sign_bias[mb_offset], refframe, &near_mvs[vcnt], ref_frame_sign_bias); 15871b362b15af34006e6a11974088a46d42b903418eJohann near_ref[vcnt] = cpi->lf_ref_frame[mb_offset]; 15881b362b15af34006e6a11974088a46d42b903418eJohann } 15891b362b15af34006e6a11974088a46d42b903418eJohann vcnt++; 15901b362b15af34006e6a11974088a46d42b903418eJohann 15911b362b15af34006e6a11974088a46d42b903418eJohann /* above in last frame */ 15921b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->lf_ref_frame[mb_offset - xd->mode_info_stride-1] != INTRA_FRAME) 15931b362b15af34006e6a11974088a46d42b903418eJohann { 15941b362b15af34006e6a11974088a46d42b903418eJohann near_mvs[vcnt].as_int = cpi->lfmv[mb_offset - xd->mode_info_stride-1].as_int; 15951b362b15af34006e6a11974088a46d42b903418eJohann mv_bias(cpi->lf_ref_frame_sign_bias[mb_offset - xd->mode_info_stride-1], refframe, &near_mvs[vcnt], ref_frame_sign_bias); 15961b362b15af34006e6a11974088a46d42b903418eJohann near_ref[vcnt] = cpi->lf_ref_frame[mb_offset - xd->mode_info_stride-1]; 15971b362b15af34006e6a11974088a46d42b903418eJohann } 15981b362b15af34006e6a11974088a46d42b903418eJohann vcnt++; 15991b362b15af34006e6a11974088a46d42b903418eJohann 16001b362b15af34006e6a11974088a46d42b903418eJohann /* left in last frame */ 16011b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->lf_ref_frame[mb_offset-1] != INTRA_FRAME) 16021b362b15af34006e6a11974088a46d42b903418eJohann { 16031b362b15af34006e6a11974088a46d42b903418eJohann near_mvs[vcnt].as_int = cpi->lfmv[mb_offset -1].as_int; 16041b362b15af34006e6a11974088a46d42b903418eJohann mv_bias(cpi->lf_ref_frame_sign_bias[mb_offset -1], refframe, &near_mvs[vcnt], ref_frame_sign_bias); 16051b362b15af34006e6a11974088a46d42b903418eJohann near_ref[vcnt] = cpi->lf_ref_frame[mb_offset - 1]; 16061b362b15af34006e6a11974088a46d42b903418eJohann } 16071b362b15af34006e6a11974088a46d42b903418eJohann vcnt++; 16081b362b15af34006e6a11974088a46d42b903418eJohann 16091b362b15af34006e6a11974088a46d42b903418eJohann /* right in last frame */ 16101b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->lf_ref_frame[mb_offset +1] != INTRA_FRAME) 16111b362b15af34006e6a11974088a46d42b903418eJohann { 16121b362b15af34006e6a11974088a46d42b903418eJohann near_mvs[vcnt].as_int = cpi->lfmv[mb_offset +1].as_int; 16131b362b15af34006e6a11974088a46d42b903418eJohann mv_bias(cpi->lf_ref_frame_sign_bias[mb_offset +1], refframe, &near_mvs[vcnt], ref_frame_sign_bias); 16141b362b15af34006e6a11974088a46d42b903418eJohann near_ref[vcnt] = cpi->lf_ref_frame[mb_offset +1]; 16151b362b15af34006e6a11974088a46d42b903418eJohann } 16161b362b15af34006e6a11974088a46d42b903418eJohann vcnt++; 16171b362b15af34006e6a11974088a46d42b903418eJohann 16181b362b15af34006e6a11974088a46d42b903418eJohann /* below in last frame */ 16191b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->lf_ref_frame[mb_offset + xd->mode_info_stride +1] != INTRA_FRAME) 16201b362b15af34006e6a11974088a46d42b903418eJohann { 16211b362b15af34006e6a11974088a46d42b903418eJohann near_mvs[vcnt].as_int = cpi->lfmv[mb_offset + xd->mode_info_stride +1].as_int; 16221b362b15af34006e6a11974088a46d42b903418eJohann mv_bias(cpi->lf_ref_frame_sign_bias[mb_offset + xd->mode_info_stride +1], refframe, &near_mvs[vcnt], ref_frame_sign_bias); 16231b362b15af34006e6a11974088a46d42b903418eJohann near_ref[vcnt] = cpi->lf_ref_frame[mb_offset + xd->mode_info_stride +1]; 16241b362b15af34006e6a11974088a46d42b903418eJohann } 16251b362b15af34006e6a11974088a46d42b903418eJohann vcnt++; 16261b362b15af34006e6a11974088a46d42b903418eJohann } 16271b362b15af34006e6a11974088a46d42b903418eJohann 16281b362b15af34006e6a11974088a46d42b903418eJohann for(i=0; i< vcnt; i++) 16291b362b15af34006e6a11974088a46d42b903418eJohann { 16301b362b15af34006e6a11974088a46d42b903418eJohann if(near_ref[near_sadidx[i]] != INTRA_FRAME) 16311b362b15af34006e6a11974088a46d42b903418eJohann { 16321b362b15af34006e6a11974088a46d42b903418eJohann if(here->mbmi.ref_frame == near_ref[near_sadidx[i]]) 16331b362b15af34006e6a11974088a46d42b903418eJohann { 16341b362b15af34006e6a11974088a46d42b903418eJohann mv.as_int = near_mvs[near_sadidx[i]].as_int; 16351b362b15af34006e6a11974088a46d42b903418eJohann find = 1; 16361b362b15af34006e6a11974088a46d42b903418eJohann if (i < 3) 16371b362b15af34006e6a11974088a46d42b903418eJohann *sr = 3; 16381b362b15af34006e6a11974088a46d42b903418eJohann else 16391b362b15af34006e6a11974088a46d42b903418eJohann *sr = 2; 16401b362b15af34006e6a11974088a46d42b903418eJohann break; 16411b362b15af34006e6a11974088a46d42b903418eJohann } 16421b362b15af34006e6a11974088a46d42b903418eJohann } 16431b362b15af34006e6a11974088a46d42b903418eJohann } 16441b362b15af34006e6a11974088a46d42b903418eJohann 16451b362b15af34006e6a11974088a46d42b903418eJohann if(!find) 16461b362b15af34006e6a11974088a46d42b903418eJohann { 16471b362b15af34006e6a11974088a46d42b903418eJohann for(i=0; i<vcnt; i++) 16481b362b15af34006e6a11974088a46d42b903418eJohann { 16491b362b15af34006e6a11974088a46d42b903418eJohann mvx[i] = near_mvs[i].as_mv.row; 16501b362b15af34006e6a11974088a46d42b903418eJohann mvy[i] = near_mvs[i].as_mv.col; 16511b362b15af34006e6a11974088a46d42b903418eJohann } 16521b362b15af34006e6a11974088a46d42b903418eJohann 16531b362b15af34006e6a11974088a46d42b903418eJohann insertsortmv(mvx, vcnt); 16541b362b15af34006e6a11974088a46d42b903418eJohann insertsortmv(mvy, vcnt); 16551b362b15af34006e6a11974088a46d42b903418eJohann mv.as_mv.row = mvx[vcnt/2]; 16561b362b15af34006e6a11974088a46d42b903418eJohann mv.as_mv.col = mvy[vcnt/2]; 16571b362b15af34006e6a11974088a46d42b903418eJohann 16581b362b15af34006e6a11974088a46d42b903418eJohann find = 1; 16591b362b15af34006e6a11974088a46d42b903418eJohann /* sr is set to 0 to allow calling function to decide the search 16601b362b15af34006e6a11974088a46d42b903418eJohann * range. 16611b362b15af34006e6a11974088a46d42b903418eJohann */ 16621b362b15af34006e6a11974088a46d42b903418eJohann *sr = 0; 16631b362b15af34006e6a11974088a46d42b903418eJohann } 16641b362b15af34006e6a11974088a46d42b903418eJohann } 16651b362b15af34006e6a11974088a46d42b903418eJohann 16661b362b15af34006e6a11974088a46d42b903418eJohann /* Set up return values */ 16671b362b15af34006e6a11974088a46d42b903418eJohann mvp->as_int = mv.as_int; 16681b362b15af34006e6a11974088a46d42b903418eJohann vp8_clamp_mv2(mvp, xd); 16691b362b15af34006e6a11974088a46d42b903418eJohann} 16701b362b15af34006e6a11974088a46d42b903418eJohann 16711b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_cal_sad(VP8_COMP *cpi, MACROBLOCKD *xd, MACROBLOCK *x, int recon_yoffset, int near_sadidx[]) 16721b362b15af34006e6a11974088a46d42b903418eJohann{ 16731b362b15af34006e6a11974088a46d42b903418eJohann /* near_sad indexes: 16741b362b15af34006e6a11974088a46d42b903418eJohann * 0-cf above, 1-cf left, 2-cf aboveleft, 16751b362b15af34006e6a11974088a46d42b903418eJohann * 3-lf current, 4-lf above, 5-lf left, 6-lf right, 7-lf below 16761b362b15af34006e6a11974088a46d42b903418eJohann */ 16771b362b15af34006e6a11974088a46d42b903418eJohann int near_sad[8] = {0}; 16781b362b15af34006e6a11974088a46d42b903418eJohann BLOCK *b = &x->block[0]; 16791b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *src_y_ptr = *(b->base_src); 16801b362b15af34006e6a11974088a46d42b903418eJohann 16811b362b15af34006e6a11974088a46d42b903418eJohann /* calculate sad for current frame 3 nearby MBs. */ 16821b362b15af34006e6a11974088a46d42b903418eJohann if( xd->mb_to_top_edge==0 && xd->mb_to_left_edge ==0) 16831b362b15af34006e6a11974088a46d42b903418eJohann { 16841b362b15af34006e6a11974088a46d42b903418eJohann near_sad[0] = near_sad[1] = near_sad[2] = INT_MAX; 16851b362b15af34006e6a11974088a46d42b903418eJohann }else if(xd->mb_to_top_edge==0) 16861b362b15af34006e6a11974088a46d42b903418eJohann { /* only has left MB for sad calculation. */ 16871b362b15af34006e6a11974088a46d42b903418eJohann near_sad[0] = near_sad[2] = INT_MAX; 16881b362b15af34006e6a11974088a46d42b903418eJohann near_sad[1] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, xd->dst.y_buffer - 16,xd->dst.y_stride, UINT_MAX); 16891b362b15af34006e6a11974088a46d42b903418eJohann }else if(xd->mb_to_left_edge ==0) 16901b362b15af34006e6a11974088a46d42b903418eJohann { /* only has left MB for sad calculation. */ 16911b362b15af34006e6a11974088a46d42b903418eJohann near_sad[1] = near_sad[2] = INT_MAX; 16921b362b15af34006e6a11974088a46d42b903418eJohann near_sad[0] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, xd->dst.y_buffer - xd->dst.y_stride *16,xd->dst.y_stride, UINT_MAX); 16931b362b15af34006e6a11974088a46d42b903418eJohann }else 16941b362b15af34006e6a11974088a46d42b903418eJohann { 16951b362b15af34006e6a11974088a46d42b903418eJohann near_sad[0] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, xd->dst.y_buffer - xd->dst.y_stride *16,xd->dst.y_stride, UINT_MAX); 16961b362b15af34006e6a11974088a46d42b903418eJohann near_sad[1] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, xd->dst.y_buffer - 16,xd->dst.y_stride, UINT_MAX); 16971b362b15af34006e6a11974088a46d42b903418eJohann near_sad[2] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, xd->dst.y_buffer - xd->dst.y_stride *16 -16,xd->dst.y_stride, UINT_MAX); 16981b362b15af34006e6a11974088a46d42b903418eJohann } 16991b362b15af34006e6a11974088a46d42b903418eJohann 17001b362b15af34006e6a11974088a46d42b903418eJohann if(cpi->common.last_frame_type != KEY_FRAME) 17011b362b15af34006e6a11974088a46d42b903418eJohann { 17021b362b15af34006e6a11974088a46d42b903418eJohann /* calculate sad for last frame 5 nearby MBs. */ 17031b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *pre_y_buffer = cpi->common.yv12_fb[cpi->common.lst_fb_idx].y_buffer + recon_yoffset; 17041b362b15af34006e6a11974088a46d42b903418eJohann int pre_y_stride = cpi->common.yv12_fb[cpi->common.lst_fb_idx].y_stride; 17051b362b15af34006e6a11974088a46d42b903418eJohann 17061b362b15af34006e6a11974088a46d42b903418eJohann if(xd->mb_to_top_edge==0) near_sad[4] = INT_MAX; 17071b362b15af34006e6a11974088a46d42b903418eJohann if(xd->mb_to_left_edge ==0) near_sad[5] = INT_MAX; 17081b362b15af34006e6a11974088a46d42b903418eJohann if(xd->mb_to_right_edge ==0) near_sad[6] = INT_MAX; 17091b362b15af34006e6a11974088a46d42b903418eJohann if(xd->mb_to_bottom_edge==0) near_sad[7] = INT_MAX; 17101b362b15af34006e6a11974088a46d42b903418eJohann 17111b362b15af34006e6a11974088a46d42b903418eJohann if(near_sad[4] != INT_MAX) 17121b362b15af34006e6a11974088a46d42b903418eJohann near_sad[4] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, pre_y_buffer - pre_y_stride *16, pre_y_stride, UINT_MAX); 17131b362b15af34006e6a11974088a46d42b903418eJohann if(near_sad[5] != INT_MAX) 17141b362b15af34006e6a11974088a46d42b903418eJohann near_sad[5] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, pre_y_buffer - 16, pre_y_stride, UINT_MAX); 17151b362b15af34006e6a11974088a46d42b903418eJohann near_sad[3] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, pre_y_buffer, pre_y_stride, UINT_MAX); 17161b362b15af34006e6a11974088a46d42b903418eJohann if(near_sad[6] != INT_MAX) 17171b362b15af34006e6a11974088a46d42b903418eJohann near_sad[6] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, pre_y_buffer + 16, pre_y_stride, UINT_MAX); 17181b362b15af34006e6a11974088a46d42b903418eJohann if(near_sad[7] != INT_MAX) 17191b362b15af34006e6a11974088a46d42b903418eJohann near_sad[7] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, pre_y_buffer + pre_y_stride *16, pre_y_stride, UINT_MAX); 17201b362b15af34006e6a11974088a46d42b903418eJohann } 17211b362b15af34006e6a11974088a46d42b903418eJohann 17221b362b15af34006e6a11974088a46d42b903418eJohann if(cpi->common.last_frame_type != KEY_FRAME) 17231b362b15af34006e6a11974088a46d42b903418eJohann { 17241b362b15af34006e6a11974088a46d42b903418eJohann insertsortsad(near_sad, near_sadidx, 8); 17251b362b15af34006e6a11974088a46d42b903418eJohann }else 17261b362b15af34006e6a11974088a46d42b903418eJohann { 17271b362b15af34006e6a11974088a46d42b903418eJohann insertsortsad(near_sad, near_sadidx, 3); 17281b362b15af34006e6a11974088a46d42b903418eJohann } 17291b362b15af34006e6a11974088a46d42b903418eJohann} 17301b362b15af34006e6a11974088a46d42b903418eJohann 17311b362b15af34006e6a11974088a46d42b903418eJohannstatic void rd_update_mvcount(VP8_COMP *cpi, MACROBLOCK *x, int_mv *best_ref_mv) 17321b362b15af34006e6a11974088a46d42b903418eJohann{ 17331b362b15af34006e6a11974088a46d42b903418eJohann if (x->e_mbd.mode_info_context->mbmi.mode == SPLITMV) 17341b362b15af34006e6a11974088a46d42b903418eJohann { 17351b362b15af34006e6a11974088a46d42b903418eJohann int i; 17361b362b15af34006e6a11974088a46d42b903418eJohann 17371b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < x->partition_info->count; i++) 17381b362b15af34006e6a11974088a46d42b903418eJohann { 17391b362b15af34006e6a11974088a46d42b903418eJohann if (x->partition_info->bmi[i].mode == NEW4X4) 17401b362b15af34006e6a11974088a46d42b903418eJohann { 17411b362b15af34006e6a11974088a46d42b903418eJohann x->MVcount[0][mv_max+((x->partition_info->bmi[i].mv.as_mv.row 17421b362b15af34006e6a11974088a46d42b903418eJohann - best_ref_mv->as_mv.row) >> 1)]++; 17431b362b15af34006e6a11974088a46d42b903418eJohann x->MVcount[1][mv_max+((x->partition_info->bmi[i].mv.as_mv.col 17441b362b15af34006e6a11974088a46d42b903418eJohann - best_ref_mv->as_mv.col) >> 1)]++; 17451b362b15af34006e6a11974088a46d42b903418eJohann } 17461b362b15af34006e6a11974088a46d42b903418eJohann } 17471b362b15af34006e6a11974088a46d42b903418eJohann } 17481b362b15af34006e6a11974088a46d42b903418eJohann else if (x->e_mbd.mode_info_context->mbmi.mode == NEWMV) 17491b362b15af34006e6a11974088a46d42b903418eJohann { 17501b362b15af34006e6a11974088a46d42b903418eJohann x->MVcount[0][mv_max+((x->e_mbd.mode_info_context->mbmi.mv.as_mv.row 17511b362b15af34006e6a11974088a46d42b903418eJohann - best_ref_mv->as_mv.row) >> 1)]++; 17521b362b15af34006e6a11974088a46d42b903418eJohann x->MVcount[1][mv_max+((x->e_mbd.mode_info_context->mbmi.mv.as_mv.col 17531b362b15af34006e6a11974088a46d42b903418eJohann - best_ref_mv->as_mv.col) >> 1)]++; 17541b362b15af34006e6a11974088a46d42b903418eJohann } 17551b362b15af34006e6a11974088a46d42b903418eJohann} 17561b362b15af34006e6a11974088a46d42b903418eJohann 17571b362b15af34006e6a11974088a46d42b903418eJohannstatic int evaluate_inter_mode_rd(int mdcounts[4], 17581b362b15af34006e6a11974088a46d42b903418eJohann RATE_DISTORTION* rd, 17591b362b15af34006e6a11974088a46d42b903418eJohann int* disable_skip, 17601b362b15af34006e6a11974088a46d42b903418eJohann VP8_COMP *cpi, MACROBLOCK *x) 17611b362b15af34006e6a11974088a46d42b903418eJohann{ 17621b362b15af34006e6a11974088a46d42b903418eJohann MB_PREDICTION_MODE this_mode = x->e_mbd.mode_info_context->mbmi.mode; 17631b362b15af34006e6a11974088a46d42b903418eJohann BLOCK *b = &x->block[0]; 17641b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *xd = &x->e_mbd; 17651b362b15af34006e6a11974088a46d42b903418eJohann int distortion; 17661b362b15af34006e6a11974088a46d42b903418eJohann vp8_build_inter16x16_predictors_mby(&x->e_mbd, x->e_mbd.predictor, 16); 17671b362b15af34006e6a11974088a46d42b903418eJohann 17681b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->active_map_enabled && x->active_ptr[0] == 0) { 17691b362b15af34006e6a11974088a46d42b903418eJohann x->skip = 1; 17701b362b15af34006e6a11974088a46d42b903418eJohann } 17711b362b15af34006e6a11974088a46d42b903418eJohann else if (x->encode_breakout) 17721b362b15af34006e6a11974088a46d42b903418eJohann { 17731b362b15af34006e6a11974088a46d42b903418eJohann unsigned int sse; 17741b362b15af34006e6a11974088a46d42b903418eJohann unsigned int var; 17751b362b15af34006e6a11974088a46d42b903418eJohann unsigned int threshold = (xd->block[0].dequant[1] 17761b362b15af34006e6a11974088a46d42b903418eJohann * xd->block[0].dequant[1] >>4); 17771b362b15af34006e6a11974088a46d42b903418eJohann 17781b362b15af34006e6a11974088a46d42b903418eJohann if(threshold < x->encode_breakout) 17791b362b15af34006e6a11974088a46d42b903418eJohann threshold = x->encode_breakout; 17801b362b15af34006e6a11974088a46d42b903418eJohann 17811b362b15af34006e6a11974088a46d42b903418eJohann var = vp8_variance16x16 17821b362b15af34006e6a11974088a46d42b903418eJohann (*(b->base_src), b->src_stride, 17831b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.predictor, 16, &sse); 17841b362b15af34006e6a11974088a46d42b903418eJohann 17851b362b15af34006e6a11974088a46d42b903418eJohann if (sse < threshold) 17861b362b15af34006e6a11974088a46d42b903418eJohann { 17871b362b15af34006e6a11974088a46d42b903418eJohann unsigned int q2dc = xd->block[24].dequant[0]; 17881b362b15af34006e6a11974088a46d42b903418eJohann /* If theres is no codeable 2nd order dc 17891b362b15af34006e6a11974088a46d42b903418eJohann or a very small uniform pixel change change */ 17901b362b15af34006e6a11974088a46d42b903418eJohann if ((sse - var < q2dc * q2dc >>4) || 17911b362b15af34006e6a11974088a46d42b903418eJohann (sse /2 > var && sse-var < 64)) 17921b362b15af34006e6a11974088a46d42b903418eJohann { 17931b362b15af34006e6a11974088a46d42b903418eJohann /* Check u and v to make sure skip is ok */ 17941b362b15af34006e6a11974088a46d42b903418eJohann unsigned int sse2 = VP8_UVSSE(x); 17951b362b15af34006e6a11974088a46d42b903418eJohann if (sse2 * 2 < threshold) 17961b362b15af34006e6a11974088a46d42b903418eJohann { 17971b362b15af34006e6a11974088a46d42b903418eJohann x->skip = 1; 17981b362b15af34006e6a11974088a46d42b903418eJohann rd->distortion2 = sse + sse2; 17991b362b15af34006e6a11974088a46d42b903418eJohann rd->rate2 = 500; 18001b362b15af34006e6a11974088a46d42b903418eJohann 18011b362b15af34006e6a11974088a46d42b903418eJohann /* for best_yrd calculation */ 18021b362b15af34006e6a11974088a46d42b903418eJohann rd->rate_uv = 0; 18031b362b15af34006e6a11974088a46d42b903418eJohann rd->distortion_uv = sse2; 18041b362b15af34006e6a11974088a46d42b903418eJohann 18051b362b15af34006e6a11974088a46d42b903418eJohann *disable_skip = 1; 18061b362b15af34006e6a11974088a46d42b903418eJohann return RDCOST(x->rdmult, x->rddiv, rd->rate2, 18071b362b15af34006e6a11974088a46d42b903418eJohann rd->distortion2); 18081b362b15af34006e6a11974088a46d42b903418eJohann } 18091b362b15af34006e6a11974088a46d42b903418eJohann } 18101b362b15af34006e6a11974088a46d42b903418eJohann } 18111b362b15af34006e6a11974088a46d42b903418eJohann } 18121b362b15af34006e6a11974088a46d42b903418eJohann 18131b362b15af34006e6a11974088a46d42b903418eJohann 18141b362b15af34006e6a11974088a46d42b903418eJohann /* Add in the Mv/mode cost */ 18151b362b15af34006e6a11974088a46d42b903418eJohann rd->rate2 += vp8_cost_mv_ref(this_mode, mdcounts); 18161b362b15af34006e6a11974088a46d42b903418eJohann 18171b362b15af34006e6a11974088a46d42b903418eJohann /* Y cost and distortion */ 18181b362b15af34006e6a11974088a46d42b903418eJohann macro_block_yrd(x, &rd->rate_y, &distortion); 18191b362b15af34006e6a11974088a46d42b903418eJohann rd->rate2 += rd->rate_y; 18201b362b15af34006e6a11974088a46d42b903418eJohann rd->distortion2 += distortion; 18211b362b15af34006e6a11974088a46d42b903418eJohann 18221b362b15af34006e6a11974088a46d42b903418eJohann /* UV cost and distortion */ 18231b362b15af34006e6a11974088a46d42b903418eJohann rd_inter16x16_uv(cpi, x, &rd->rate_uv, &rd->distortion_uv, 18241b362b15af34006e6a11974088a46d42b903418eJohann cpi->common.full_pixel); 18251b362b15af34006e6a11974088a46d42b903418eJohann rd->rate2 += rd->rate_uv; 18261b362b15af34006e6a11974088a46d42b903418eJohann rd->distortion2 += rd->distortion_uv; 18271b362b15af34006e6a11974088a46d42b903418eJohann return INT_MAX; 18281b362b15af34006e6a11974088a46d42b903418eJohann} 18291b362b15af34006e6a11974088a46d42b903418eJohann 18301b362b15af34006e6a11974088a46d42b903418eJohannstatic int calculate_final_rd_costs(int this_rd, 18311b362b15af34006e6a11974088a46d42b903418eJohann RATE_DISTORTION* rd, 18321b362b15af34006e6a11974088a46d42b903418eJohann int* other_cost, 18331b362b15af34006e6a11974088a46d42b903418eJohann int disable_skip, 18341b362b15af34006e6a11974088a46d42b903418eJohann int uv_intra_tteob, 18351b362b15af34006e6a11974088a46d42b903418eJohann int intra_rd_penalty, 18361b362b15af34006e6a11974088a46d42b903418eJohann VP8_COMP *cpi, MACROBLOCK *x) 18371b362b15af34006e6a11974088a46d42b903418eJohann{ 18381b362b15af34006e6a11974088a46d42b903418eJohann MB_PREDICTION_MODE this_mode = x->e_mbd.mode_info_context->mbmi.mode; 18391b362b15af34006e6a11974088a46d42b903418eJohann 18401b362b15af34006e6a11974088a46d42b903418eJohann /* Where skip is allowable add in the default per mb cost for the no 18411b362b15af34006e6a11974088a46d42b903418eJohann * skip case. where we then decide to skip we have to delete this and 18421b362b15af34006e6a11974088a46d42b903418eJohann * replace it with the cost of signalling a skip 18431b362b15af34006e6a11974088a46d42b903418eJohann */ 18441b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->common.mb_no_coeff_skip) 18451b362b15af34006e6a11974088a46d42b903418eJohann { 18461b362b15af34006e6a11974088a46d42b903418eJohann *other_cost += vp8_cost_bit(cpi->prob_skip_false, 0); 18471b362b15af34006e6a11974088a46d42b903418eJohann rd->rate2 += *other_cost; 18481b362b15af34006e6a11974088a46d42b903418eJohann } 18491b362b15af34006e6a11974088a46d42b903418eJohann 18501b362b15af34006e6a11974088a46d42b903418eJohann /* Estimate the reference frame signaling cost and add it 18511b362b15af34006e6a11974088a46d42b903418eJohann * to the rolling cost variable. 18521b362b15af34006e6a11974088a46d42b903418eJohann */ 18531b362b15af34006e6a11974088a46d42b903418eJohann rd->rate2 += 18541b362b15af34006e6a11974088a46d42b903418eJohann x->ref_frame_cost[x->e_mbd.mode_info_context->mbmi.ref_frame]; 18551b362b15af34006e6a11974088a46d42b903418eJohann 18561b362b15af34006e6a11974088a46d42b903418eJohann if (!disable_skip) 18571b362b15af34006e6a11974088a46d42b903418eJohann { 18581b362b15af34006e6a11974088a46d42b903418eJohann /* Test for the condition where skip block will be activated 18591b362b15af34006e6a11974088a46d42b903418eJohann * because there are no non zero coefficients and make any 18601b362b15af34006e6a11974088a46d42b903418eJohann * necessary adjustment for rate 18611b362b15af34006e6a11974088a46d42b903418eJohann */ 18621b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->common.mb_no_coeff_skip) 18631b362b15af34006e6a11974088a46d42b903418eJohann { 18641b362b15af34006e6a11974088a46d42b903418eJohann int i; 18651b362b15af34006e6a11974088a46d42b903418eJohann int tteob; 18661b362b15af34006e6a11974088a46d42b903418eJohann int has_y2_block = (this_mode!=SPLITMV && this_mode!=B_PRED); 18671b362b15af34006e6a11974088a46d42b903418eJohann 18681b362b15af34006e6a11974088a46d42b903418eJohann tteob = 0; 18691b362b15af34006e6a11974088a46d42b903418eJohann if(has_y2_block) 18701b362b15af34006e6a11974088a46d42b903418eJohann tteob += x->e_mbd.eobs[24]; 18711b362b15af34006e6a11974088a46d42b903418eJohann 18721b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < 16; i++) 18731b362b15af34006e6a11974088a46d42b903418eJohann tteob += (x->e_mbd.eobs[i] > has_y2_block); 18741b362b15af34006e6a11974088a46d42b903418eJohann 18751b362b15af34006e6a11974088a46d42b903418eJohann if (x->e_mbd.mode_info_context->mbmi.ref_frame) 18761b362b15af34006e6a11974088a46d42b903418eJohann { 18771b362b15af34006e6a11974088a46d42b903418eJohann for (i = 16; i < 24; i++) 18781b362b15af34006e6a11974088a46d42b903418eJohann tteob += x->e_mbd.eobs[i]; 18791b362b15af34006e6a11974088a46d42b903418eJohann } 18801b362b15af34006e6a11974088a46d42b903418eJohann else 18811b362b15af34006e6a11974088a46d42b903418eJohann tteob += uv_intra_tteob; 18821b362b15af34006e6a11974088a46d42b903418eJohann 18831b362b15af34006e6a11974088a46d42b903418eJohann if (tteob == 0) 18841b362b15af34006e6a11974088a46d42b903418eJohann { 18851b362b15af34006e6a11974088a46d42b903418eJohann rd->rate2 -= (rd->rate_y + rd->rate_uv); 18861b362b15af34006e6a11974088a46d42b903418eJohann /* for best_yrd calculation */ 18871b362b15af34006e6a11974088a46d42b903418eJohann rd->rate_uv = 0; 18881b362b15af34006e6a11974088a46d42b903418eJohann 18891b362b15af34006e6a11974088a46d42b903418eJohann /* Back out no skip flag costing and add in skip flag costing */ 18901b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->prob_skip_false) 18911b362b15af34006e6a11974088a46d42b903418eJohann { 18921b362b15af34006e6a11974088a46d42b903418eJohann int prob_skip_cost; 18931b362b15af34006e6a11974088a46d42b903418eJohann 18941b362b15af34006e6a11974088a46d42b903418eJohann prob_skip_cost = vp8_cost_bit(cpi->prob_skip_false, 1); 18951b362b15af34006e6a11974088a46d42b903418eJohann prob_skip_cost -= vp8_cost_bit(cpi->prob_skip_false, 0); 18961b362b15af34006e6a11974088a46d42b903418eJohann rd->rate2 += prob_skip_cost; 18971b362b15af34006e6a11974088a46d42b903418eJohann *other_cost += prob_skip_cost; 18981b362b15af34006e6a11974088a46d42b903418eJohann } 18991b362b15af34006e6a11974088a46d42b903418eJohann } 19001b362b15af34006e6a11974088a46d42b903418eJohann } 19011b362b15af34006e6a11974088a46d42b903418eJohann /* Calculate the final RD estimate for this mode */ 19021b362b15af34006e6a11974088a46d42b903418eJohann this_rd = RDCOST(x->rdmult, x->rddiv, rd->rate2, rd->distortion2); 19031b362b15af34006e6a11974088a46d42b903418eJohann if (this_rd < INT_MAX && x->e_mbd.mode_info_context->mbmi.ref_frame 19041b362b15af34006e6a11974088a46d42b903418eJohann == INTRA_FRAME) 19051b362b15af34006e6a11974088a46d42b903418eJohann this_rd += intra_rd_penalty; 19061b362b15af34006e6a11974088a46d42b903418eJohann } 19071b362b15af34006e6a11974088a46d42b903418eJohann return this_rd; 19081b362b15af34006e6a11974088a46d42b903418eJohann} 19091b362b15af34006e6a11974088a46d42b903418eJohann 19101b362b15af34006e6a11974088a46d42b903418eJohannstatic void update_best_mode(BEST_MODE* best_mode, int this_rd, 19111b362b15af34006e6a11974088a46d42b903418eJohann RATE_DISTORTION* rd, int other_cost, MACROBLOCK *x) 19121b362b15af34006e6a11974088a46d42b903418eJohann{ 19131b362b15af34006e6a11974088a46d42b903418eJohann MB_PREDICTION_MODE this_mode = x->e_mbd.mode_info_context->mbmi.mode; 19141b362b15af34006e6a11974088a46d42b903418eJohann 19151b362b15af34006e6a11974088a46d42b903418eJohann other_cost += 19161b362b15af34006e6a11974088a46d42b903418eJohann x->ref_frame_cost[x->e_mbd.mode_info_context->mbmi.ref_frame]; 19171b362b15af34006e6a11974088a46d42b903418eJohann 19181b362b15af34006e6a11974088a46d42b903418eJohann /* Calculate the final y RD estimate for this mode */ 19191b362b15af34006e6a11974088a46d42b903418eJohann best_mode->yrd = RDCOST(x->rdmult, x->rddiv, (rd->rate2-rd->rate_uv-other_cost), 19201b362b15af34006e6a11974088a46d42b903418eJohann (rd->distortion2-rd->distortion_uv)); 19211b362b15af34006e6a11974088a46d42b903418eJohann 19221b362b15af34006e6a11974088a46d42b903418eJohann best_mode->rd = this_rd; 19231b362b15af34006e6a11974088a46d42b903418eJohann vpx_memcpy(&best_mode->mbmode, &x->e_mbd.mode_info_context->mbmi, sizeof(MB_MODE_INFO)); 19241b362b15af34006e6a11974088a46d42b903418eJohann vpx_memcpy(&best_mode->partition, x->partition_info, sizeof(PARTITION_INFO)); 19251b362b15af34006e6a11974088a46d42b903418eJohann 19261b362b15af34006e6a11974088a46d42b903418eJohann if ((this_mode == B_PRED) || (this_mode == SPLITMV)) 19271b362b15af34006e6a11974088a46d42b903418eJohann { 19281b362b15af34006e6a11974088a46d42b903418eJohann int i; 19291b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < 16; i++) 19301b362b15af34006e6a11974088a46d42b903418eJohann { 19311b362b15af34006e6a11974088a46d42b903418eJohann best_mode->bmodes[i] = x->e_mbd.block[i].bmi; 19321b362b15af34006e6a11974088a46d42b903418eJohann } 19331b362b15af34006e6a11974088a46d42b903418eJohann } 19341b362b15af34006e6a11974088a46d42b903418eJohann} 19351b362b15af34006e6a11974088a46d42b903418eJohann 19361b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, 19371b362b15af34006e6a11974088a46d42b903418eJohann int recon_uvoffset, int *returnrate, 19381b362b15af34006e6a11974088a46d42b903418eJohann int *returndistortion, int *returnintra) 19391b362b15af34006e6a11974088a46d42b903418eJohann{ 19401b362b15af34006e6a11974088a46d42b903418eJohann BLOCK *b = &x->block[0]; 19411b362b15af34006e6a11974088a46d42b903418eJohann BLOCKD *d = &x->e_mbd.block[0]; 19421b362b15af34006e6a11974088a46d42b903418eJohann MACROBLOCKD *xd = &x->e_mbd; 19431b362b15af34006e6a11974088a46d42b903418eJohann int_mv best_ref_mv_sb[2]; 19441b362b15af34006e6a11974088a46d42b903418eJohann int_mv mode_mv_sb[2][MB_MODE_COUNT]; 19451b362b15af34006e6a11974088a46d42b903418eJohann int_mv best_ref_mv; 19461b362b15af34006e6a11974088a46d42b903418eJohann int_mv *mode_mv; 19471b362b15af34006e6a11974088a46d42b903418eJohann MB_PREDICTION_MODE this_mode; 19481b362b15af34006e6a11974088a46d42b903418eJohann int num00; 19491b362b15af34006e6a11974088a46d42b903418eJohann int best_mode_index = 0; 19501b362b15af34006e6a11974088a46d42b903418eJohann BEST_MODE best_mode; 19511b362b15af34006e6a11974088a46d42b903418eJohann 19521b362b15af34006e6a11974088a46d42b903418eJohann int i; 19531b362b15af34006e6a11974088a46d42b903418eJohann int mode_index; 19541b362b15af34006e6a11974088a46d42b903418eJohann int mdcounts[4]; 19551b362b15af34006e6a11974088a46d42b903418eJohann int rate; 19561b362b15af34006e6a11974088a46d42b903418eJohann RATE_DISTORTION rd; 19571b362b15af34006e6a11974088a46d42b903418eJohann int uv_intra_rate, uv_intra_distortion, uv_intra_rate_tokenonly; 19581b362b15af34006e6a11974088a46d42b903418eJohann int uv_intra_tteob = 0; 19591b362b15af34006e6a11974088a46d42b903418eJohann int uv_intra_done = 0; 19601b362b15af34006e6a11974088a46d42b903418eJohann 19611b362b15af34006e6a11974088a46d42b903418eJohann MB_PREDICTION_MODE uv_intra_mode = 0; 19621b362b15af34006e6a11974088a46d42b903418eJohann int_mv mvp; 19631b362b15af34006e6a11974088a46d42b903418eJohann int near_sadidx[8] = {0, 1, 2, 3, 4, 5, 6, 7}; 19641b362b15af34006e6a11974088a46d42b903418eJohann int saddone=0; 19651b362b15af34006e6a11974088a46d42b903418eJohann /* search range got from mv_pred(). It uses step_param levels. (0-7) */ 19661b362b15af34006e6a11974088a46d42b903418eJohann int sr=0; 19671b362b15af34006e6a11974088a46d42b903418eJohann 19681b362b15af34006e6a11974088a46d42b903418eJohann unsigned char *plane[4][3]; 19691b362b15af34006e6a11974088a46d42b903418eJohann int ref_frame_map[4]; 19701b362b15af34006e6a11974088a46d42b903418eJohann int sign_bias = 0; 19711b362b15af34006e6a11974088a46d42b903418eJohann 19721b362b15af34006e6a11974088a46d42b903418eJohann int intra_rd_penalty = 10* vp8_dc_quant(cpi->common.base_qindex, 19731b362b15af34006e6a11974088a46d42b903418eJohann cpi->common.y1dc_delta_q); 19741b362b15af34006e6a11974088a46d42b903418eJohann 19751b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_TEMPORAL_DENOISING 19761b362b15af34006e6a11974088a46d42b903418eJohann unsigned int zero_mv_sse = INT_MAX, best_sse = INT_MAX, 19771b362b15af34006e6a11974088a46d42b903418eJohann best_rd_sse = INT_MAX; 19781b362b15af34006e6a11974088a46d42b903418eJohann#endif 19791b362b15af34006e6a11974088a46d42b903418eJohann 19801b362b15af34006e6a11974088a46d42b903418eJohann mode_mv = mode_mv_sb[sign_bias]; 19811b362b15af34006e6a11974088a46d42b903418eJohann best_ref_mv.as_int = 0; 19821b362b15af34006e6a11974088a46d42b903418eJohann best_mode.rd = INT_MAX; 19831b362b15af34006e6a11974088a46d42b903418eJohann best_mode.yrd = INT_MAX; 19841b362b15af34006e6a11974088a46d42b903418eJohann best_mode.intra_rd = INT_MAX; 19851b362b15af34006e6a11974088a46d42b903418eJohann vpx_memset(mode_mv_sb, 0, sizeof(mode_mv_sb)); 19861b362b15af34006e6a11974088a46d42b903418eJohann vpx_memset(&best_mode.mbmode, 0, sizeof(best_mode.mbmode)); 19871b362b15af34006e6a11974088a46d42b903418eJohann vpx_memset(&best_mode.bmodes, 0, sizeof(best_mode.bmodes)); 19881b362b15af34006e6a11974088a46d42b903418eJohann 19891b362b15af34006e6a11974088a46d42b903418eJohann /* Setup search priorities */ 19901b362b15af34006e6a11974088a46d42b903418eJohann get_reference_search_order(cpi, ref_frame_map); 19911b362b15af34006e6a11974088a46d42b903418eJohann 19921b362b15af34006e6a11974088a46d42b903418eJohann /* Check to see if there is at least 1 valid reference frame that we need 19931b362b15af34006e6a11974088a46d42b903418eJohann * to calculate near_mvs. 19941b362b15af34006e6a11974088a46d42b903418eJohann */ 19951b362b15af34006e6a11974088a46d42b903418eJohann if (ref_frame_map[1] > 0) 19961b362b15af34006e6a11974088a46d42b903418eJohann { 19971b362b15af34006e6a11974088a46d42b903418eJohann sign_bias = vp8_find_near_mvs_bias(&x->e_mbd, 19981b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context, 19991b362b15af34006e6a11974088a46d42b903418eJohann mode_mv_sb, 20001b362b15af34006e6a11974088a46d42b903418eJohann best_ref_mv_sb, 20011b362b15af34006e6a11974088a46d42b903418eJohann mdcounts, 20021b362b15af34006e6a11974088a46d42b903418eJohann ref_frame_map[1], 20031b362b15af34006e6a11974088a46d42b903418eJohann cpi->common.ref_frame_sign_bias); 20041b362b15af34006e6a11974088a46d42b903418eJohann 20051b362b15af34006e6a11974088a46d42b903418eJohann mode_mv = mode_mv_sb[sign_bias]; 20061b362b15af34006e6a11974088a46d42b903418eJohann best_ref_mv.as_int = best_ref_mv_sb[sign_bias].as_int; 20071b362b15af34006e6a11974088a46d42b903418eJohann } 20081b362b15af34006e6a11974088a46d42b903418eJohann 20091b362b15af34006e6a11974088a46d42b903418eJohann get_predictor_pointers(cpi, plane, recon_yoffset, recon_uvoffset); 20101b362b15af34006e6a11974088a46d42b903418eJohann 20111b362b15af34006e6a11974088a46d42b903418eJohann *returnintra = INT_MAX; 20121b362b15af34006e6a11974088a46d42b903418eJohann /* Count of the number of MBs tested so far this frame */ 20131b362b15af34006e6a11974088a46d42b903418eJohann cpi->mbs_tested_so_far++; 20141b362b15af34006e6a11974088a46d42b903418eJohann 20151b362b15af34006e6a11974088a46d42b903418eJohann x->skip = 0; 20161b362b15af34006e6a11974088a46d42b903418eJohann 20171b362b15af34006e6a11974088a46d42b903418eJohann for (mode_index = 0; mode_index < MAX_MODES; mode_index++) 20181b362b15af34006e6a11974088a46d42b903418eJohann { 20191b362b15af34006e6a11974088a46d42b903418eJohann int this_rd = INT_MAX; 20201b362b15af34006e6a11974088a46d42b903418eJohann int disable_skip = 0; 20211b362b15af34006e6a11974088a46d42b903418eJohann int other_cost = 0; 20221b362b15af34006e6a11974088a46d42b903418eJohann int this_ref_frame = ref_frame_map[vp8_ref_frame_order[mode_index]]; 20231b362b15af34006e6a11974088a46d42b903418eJohann 20241b362b15af34006e6a11974088a46d42b903418eJohann /* Test best rd so far against threshold for trying this mode. */ 20251b362b15af34006e6a11974088a46d42b903418eJohann if (best_mode.rd <= cpi->rd_threshes[mode_index]) 20261b362b15af34006e6a11974088a46d42b903418eJohann continue; 20271b362b15af34006e6a11974088a46d42b903418eJohann 20281b362b15af34006e6a11974088a46d42b903418eJohann if (this_ref_frame < 0) 20291b362b15af34006e6a11974088a46d42b903418eJohann continue; 20301b362b15af34006e6a11974088a46d42b903418eJohann 20311b362b15af34006e6a11974088a46d42b903418eJohann /* These variables hold are rolling total cost and distortion for 20321b362b15af34006e6a11974088a46d42b903418eJohann * this mode 20331b362b15af34006e6a11974088a46d42b903418eJohann */ 20341b362b15af34006e6a11974088a46d42b903418eJohann rd.rate2 = 0; 20351b362b15af34006e6a11974088a46d42b903418eJohann rd.distortion2 = 0; 20361b362b15af34006e6a11974088a46d42b903418eJohann 20371b362b15af34006e6a11974088a46d42b903418eJohann this_mode = vp8_mode_order[mode_index]; 20381b362b15af34006e6a11974088a46d42b903418eJohann 20391b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.mode = this_mode; 20401b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.ref_frame = this_ref_frame; 20411b362b15af34006e6a11974088a46d42b903418eJohann 20421b362b15af34006e6a11974088a46d42b903418eJohann /* Only consider ZEROMV/ALTREF_FRAME for alt ref frame, 20431b362b15af34006e6a11974088a46d42b903418eJohann * unless ARNR filtering is enabled in which case we want 20441b362b15af34006e6a11974088a46d42b903418eJohann * an unfiltered alternative 20451b362b15af34006e6a11974088a46d42b903418eJohann */ 20461b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->is_src_frame_alt_ref && (cpi->oxcf.arnr_max_frames == 0)) 20471b362b15af34006e6a11974088a46d42b903418eJohann { 20481b362b15af34006e6a11974088a46d42b903418eJohann if (this_mode != ZEROMV || x->e_mbd.mode_info_context->mbmi.ref_frame != ALTREF_FRAME) 20491b362b15af34006e6a11974088a46d42b903418eJohann continue; 20501b362b15af34006e6a11974088a46d42b903418eJohann } 20511b362b15af34006e6a11974088a46d42b903418eJohann 20521b362b15af34006e6a11974088a46d42b903418eJohann /* everything but intra */ 20531b362b15af34006e6a11974088a46d42b903418eJohann if (x->e_mbd.mode_info_context->mbmi.ref_frame) 20541b362b15af34006e6a11974088a46d42b903418eJohann { 20551b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.pre.y_buffer = plane[this_ref_frame][0]; 20561b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.pre.u_buffer = plane[this_ref_frame][1]; 20571b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.pre.v_buffer = plane[this_ref_frame][2]; 20581b362b15af34006e6a11974088a46d42b903418eJohann 20591b362b15af34006e6a11974088a46d42b903418eJohann if (sign_bias != cpi->common.ref_frame_sign_bias[this_ref_frame]) 20601b362b15af34006e6a11974088a46d42b903418eJohann { 20611b362b15af34006e6a11974088a46d42b903418eJohann sign_bias = cpi->common.ref_frame_sign_bias[this_ref_frame]; 20621b362b15af34006e6a11974088a46d42b903418eJohann mode_mv = mode_mv_sb[sign_bias]; 20631b362b15af34006e6a11974088a46d42b903418eJohann best_ref_mv.as_int = best_ref_mv_sb[sign_bias].as_int; 20641b362b15af34006e6a11974088a46d42b903418eJohann } 20651b362b15af34006e6a11974088a46d42b903418eJohann } 20661b362b15af34006e6a11974088a46d42b903418eJohann 20671b362b15af34006e6a11974088a46d42b903418eJohann /* Check to see if the testing frequency for this mode is at its 20681b362b15af34006e6a11974088a46d42b903418eJohann * max If so then prevent it from being tested and increase the 20691b362b15af34006e6a11974088a46d42b903418eJohann * threshold for its testing 20701b362b15af34006e6a11974088a46d42b903418eJohann */ 20711b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->mode_test_hit_counts[mode_index] && (cpi->mode_check_freq[mode_index] > 1)) 20721b362b15af34006e6a11974088a46d42b903418eJohann { 20731b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->mbs_tested_so_far <= cpi->mode_check_freq[mode_index] * cpi->mode_test_hit_counts[mode_index]) 20741b362b15af34006e6a11974088a46d42b903418eJohann { 20751b362b15af34006e6a11974088a46d42b903418eJohann /* Increase the threshold for coding this mode to make it 20761b362b15af34006e6a11974088a46d42b903418eJohann * less likely to be chosen 20771b362b15af34006e6a11974088a46d42b903418eJohann */ 20781b362b15af34006e6a11974088a46d42b903418eJohann cpi->rd_thresh_mult[mode_index] += 4; 20791b362b15af34006e6a11974088a46d42b903418eJohann 20801b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->rd_thresh_mult[mode_index] > MAX_THRESHMULT) 20811b362b15af34006e6a11974088a46d42b903418eJohann cpi->rd_thresh_mult[mode_index] = MAX_THRESHMULT; 20821b362b15af34006e6a11974088a46d42b903418eJohann 20831b362b15af34006e6a11974088a46d42b903418eJohann cpi->rd_threshes[mode_index] = (cpi->rd_baseline_thresh[mode_index] >> 7) * cpi->rd_thresh_mult[mode_index]; 20841b362b15af34006e6a11974088a46d42b903418eJohann 20851b362b15af34006e6a11974088a46d42b903418eJohann continue; 20861b362b15af34006e6a11974088a46d42b903418eJohann } 20871b362b15af34006e6a11974088a46d42b903418eJohann } 20881b362b15af34006e6a11974088a46d42b903418eJohann 20891b362b15af34006e6a11974088a46d42b903418eJohann /* We have now reached the point where we are going to test the 20901b362b15af34006e6a11974088a46d42b903418eJohann * current mode so increment the counter for the number of times 20911b362b15af34006e6a11974088a46d42b903418eJohann * it has been tested 20921b362b15af34006e6a11974088a46d42b903418eJohann */ 20931b362b15af34006e6a11974088a46d42b903418eJohann cpi->mode_test_hit_counts[mode_index] ++; 20941b362b15af34006e6a11974088a46d42b903418eJohann 20951b362b15af34006e6a11974088a46d42b903418eJohann /* Experimental code. Special case for gf and arf zeromv modes. 20961b362b15af34006e6a11974088a46d42b903418eJohann * Increase zbin size to supress noise 20971b362b15af34006e6a11974088a46d42b903418eJohann */ 20981b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->zbin_mode_boost_enabled) 20991b362b15af34006e6a11974088a46d42b903418eJohann { 21001b362b15af34006e6a11974088a46d42b903418eJohann if ( this_ref_frame == INTRA_FRAME ) 21011b362b15af34006e6a11974088a46d42b903418eJohann cpi->zbin_mode_boost = 0; 21021b362b15af34006e6a11974088a46d42b903418eJohann else 21031b362b15af34006e6a11974088a46d42b903418eJohann { 21041b362b15af34006e6a11974088a46d42b903418eJohann if (vp8_mode_order[mode_index] == ZEROMV) 21051b362b15af34006e6a11974088a46d42b903418eJohann { 21061b362b15af34006e6a11974088a46d42b903418eJohann if (this_ref_frame != LAST_FRAME) 21071b362b15af34006e6a11974088a46d42b903418eJohann cpi->zbin_mode_boost = GF_ZEROMV_ZBIN_BOOST; 21081b362b15af34006e6a11974088a46d42b903418eJohann else 21091b362b15af34006e6a11974088a46d42b903418eJohann cpi->zbin_mode_boost = LF_ZEROMV_ZBIN_BOOST; 21101b362b15af34006e6a11974088a46d42b903418eJohann } 21111b362b15af34006e6a11974088a46d42b903418eJohann else if (vp8_mode_order[mode_index] == SPLITMV) 21121b362b15af34006e6a11974088a46d42b903418eJohann cpi->zbin_mode_boost = 0; 21131b362b15af34006e6a11974088a46d42b903418eJohann else 21141b362b15af34006e6a11974088a46d42b903418eJohann cpi->zbin_mode_boost = MV_ZBIN_BOOST; 21151b362b15af34006e6a11974088a46d42b903418eJohann } 21161b362b15af34006e6a11974088a46d42b903418eJohann 21171b362b15af34006e6a11974088a46d42b903418eJohann vp8_update_zbin_extra(cpi, x); 21181b362b15af34006e6a11974088a46d42b903418eJohann } 21191b362b15af34006e6a11974088a46d42b903418eJohann 21201b362b15af34006e6a11974088a46d42b903418eJohann if(!uv_intra_done && this_ref_frame == INTRA_FRAME) 21211b362b15af34006e6a11974088a46d42b903418eJohann { 21221b362b15af34006e6a11974088a46d42b903418eJohann rd_pick_intra_mbuv_mode(x, &uv_intra_rate, 21231b362b15af34006e6a11974088a46d42b903418eJohann &uv_intra_rate_tokenonly, 21241b362b15af34006e6a11974088a46d42b903418eJohann &uv_intra_distortion); 21251b362b15af34006e6a11974088a46d42b903418eJohann uv_intra_mode = x->e_mbd.mode_info_context->mbmi.uv_mode; 21261b362b15af34006e6a11974088a46d42b903418eJohann 21271b362b15af34006e6a11974088a46d42b903418eJohann /* 21281b362b15af34006e6a11974088a46d42b903418eJohann * Total of the eobs is used later to further adjust rate2. Since uv 21291b362b15af34006e6a11974088a46d42b903418eJohann * block's intra eobs will be overwritten when we check inter modes, 21301b362b15af34006e6a11974088a46d42b903418eJohann * we need to save uv_intra_tteob here. 21311b362b15af34006e6a11974088a46d42b903418eJohann */ 21321b362b15af34006e6a11974088a46d42b903418eJohann for (i = 16; i < 24; i++) 21331b362b15af34006e6a11974088a46d42b903418eJohann uv_intra_tteob += x->e_mbd.eobs[i]; 21341b362b15af34006e6a11974088a46d42b903418eJohann 21351b362b15af34006e6a11974088a46d42b903418eJohann uv_intra_done = 1; 21361b362b15af34006e6a11974088a46d42b903418eJohann } 21371b362b15af34006e6a11974088a46d42b903418eJohann 21381b362b15af34006e6a11974088a46d42b903418eJohann switch (this_mode) 21391b362b15af34006e6a11974088a46d42b903418eJohann { 21401b362b15af34006e6a11974088a46d42b903418eJohann case B_PRED: 21411b362b15af34006e6a11974088a46d42b903418eJohann { 21421b362b15af34006e6a11974088a46d42b903418eJohann int tmp_rd; 21431b362b15af34006e6a11974088a46d42b903418eJohann 21441b362b15af34006e6a11974088a46d42b903418eJohann /* Note the rate value returned here includes the cost of 21451b362b15af34006e6a11974088a46d42b903418eJohann * coding the BPRED mode: x->mbmode_cost[x->e_mbd.frame_type][BPRED] 21461b362b15af34006e6a11974088a46d42b903418eJohann */ 21471b362b15af34006e6a11974088a46d42b903418eJohann int distortion; 21481b362b15af34006e6a11974088a46d42b903418eJohann tmp_rd = rd_pick_intra4x4mby_modes(x, &rate, &rd.rate_y, &distortion, best_mode.yrd); 21491b362b15af34006e6a11974088a46d42b903418eJohann rd.rate2 += rate; 21501b362b15af34006e6a11974088a46d42b903418eJohann rd.distortion2 += distortion; 21511b362b15af34006e6a11974088a46d42b903418eJohann 21521b362b15af34006e6a11974088a46d42b903418eJohann if(tmp_rd < best_mode.yrd) 21531b362b15af34006e6a11974088a46d42b903418eJohann { 21541b362b15af34006e6a11974088a46d42b903418eJohann rd.rate2 += uv_intra_rate; 21551b362b15af34006e6a11974088a46d42b903418eJohann rd.rate_uv = uv_intra_rate_tokenonly; 21561b362b15af34006e6a11974088a46d42b903418eJohann rd.distortion2 += uv_intra_distortion; 21571b362b15af34006e6a11974088a46d42b903418eJohann rd.distortion_uv = uv_intra_distortion; 21581b362b15af34006e6a11974088a46d42b903418eJohann } 21591b362b15af34006e6a11974088a46d42b903418eJohann else 21601b362b15af34006e6a11974088a46d42b903418eJohann { 21611b362b15af34006e6a11974088a46d42b903418eJohann this_rd = INT_MAX; 21621b362b15af34006e6a11974088a46d42b903418eJohann disable_skip = 1; 21631b362b15af34006e6a11974088a46d42b903418eJohann } 21641b362b15af34006e6a11974088a46d42b903418eJohann } 21651b362b15af34006e6a11974088a46d42b903418eJohann break; 21661b362b15af34006e6a11974088a46d42b903418eJohann 21671b362b15af34006e6a11974088a46d42b903418eJohann case SPLITMV: 21681b362b15af34006e6a11974088a46d42b903418eJohann { 21691b362b15af34006e6a11974088a46d42b903418eJohann int tmp_rd; 21701b362b15af34006e6a11974088a46d42b903418eJohann int this_rd_thresh; 21711b362b15af34006e6a11974088a46d42b903418eJohann int distortion; 21721b362b15af34006e6a11974088a46d42b903418eJohann 21731b362b15af34006e6a11974088a46d42b903418eJohann this_rd_thresh = (vp8_ref_frame_order[mode_index] == 1) ? cpi->rd_threshes[THR_NEW1] : cpi->rd_threshes[THR_NEW3]; 21741b362b15af34006e6a11974088a46d42b903418eJohann this_rd_thresh = (vp8_ref_frame_order[mode_index] == 2) ? cpi->rd_threshes[THR_NEW2] : this_rd_thresh; 21751b362b15af34006e6a11974088a46d42b903418eJohann 21761b362b15af34006e6a11974088a46d42b903418eJohann tmp_rd = vp8_rd_pick_best_mbsegmentation(cpi, x, &best_ref_mv, 21771b362b15af34006e6a11974088a46d42b903418eJohann best_mode.yrd, mdcounts, 21781b362b15af34006e6a11974088a46d42b903418eJohann &rate, &rd.rate_y, &distortion, this_rd_thresh) ; 21791b362b15af34006e6a11974088a46d42b903418eJohann 21801b362b15af34006e6a11974088a46d42b903418eJohann rd.rate2 += rate; 21811b362b15af34006e6a11974088a46d42b903418eJohann rd.distortion2 += distortion; 21821b362b15af34006e6a11974088a46d42b903418eJohann 21831b362b15af34006e6a11974088a46d42b903418eJohann /* If even the 'Y' rd value of split is higher than best so far 21841b362b15af34006e6a11974088a46d42b903418eJohann * then dont bother looking at UV 21851b362b15af34006e6a11974088a46d42b903418eJohann */ 21861b362b15af34006e6a11974088a46d42b903418eJohann if (tmp_rd < best_mode.yrd) 21871b362b15af34006e6a11974088a46d42b903418eJohann { 21881b362b15af34006e6a11974088a46d42b903418eJohann /* Now work out UV cost and add it in */ 21891b362b15af34006e6a11974088a46d42b903418eJohann rd_inter4x4_uv(cpi, x, &rd.rate_uv, &rd.distortion_uv, cpi->common.full_pixel); 21901b362b15af34006e6a11974088a46d42b903418eJohann rd.rate2 += rd.rate_uv; 21911b362b15af34006e6a11974088a46d42b903418eJohann rd.distortion2 += rd.distortion_uv; 21921b362b15af34006e6a11974088a46d42b903418eJohann } 21931b362b15af34006e6a11974088a46d42b903418eJohann else 21941b362b15af34006e6a11974088a46d42b903418eJohann { 21951b362b15af34006e6a11974088a46d42b903418eJohann this_rd = INT_MAX; 21961b362b15af34006e6a11974088a46d42b903418eJohann disable_skip = 1; 21971b362b15af34006e6a11974088a46d42b903418eJohann } 21981b362b15af34006e6a11974088a46d42b903418eJohann } 21991b362b15af34006e6a11974088a46d42b903418eJohann break; 22001b362b15af34006e6a11974088a46d42b903418eJohann case DC_PRED: 22011b362b15af34006e6a11974088a46d42b903418eJohann case V_PRED: 22021b362b15af34006e6a11974088a46d42b903418eJohann case H_PRED: 22031b362b15af34006e6a11974088a46d42b903418eJohann case TM_PRED: 22041b362b15af34006e6a11974088a46d42b903418eJohann { 22051b362b15af34006e6a11974088a46d42b903418eJohann int distortion; 22061b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME; 22071b362b15af34006e6a11974088a46d42b903418eJohann 22081b362b15af34006e6a11974088a46d42b903418eJohann vp8_build_intra_predictors_mby_s(xd, 22091b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.y_buffer - xd->dst.y_stride, 22101b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.y_buffer - 1, 22111b362b15af34006e6a11974088a46d42b903418eJohann xd->dst.y_stride, 22121b362b15af34006e6a11974088a46d42b903418eJohann xd->predictor, 22131b362b15af34006e6a11974088a46d42b903418eJohann 16); 22141b362b15af34006e6a11974088a46d42b903418eJohann macro_block_yrd(x, &rd.rate_y, &distortion) ; 22151b362b15af34006e6a11974088a46d42b903418eJohann rd.rate2 += rd.rate_y; 22161b362b15af34006e6a11974088a46d42b903418eJohann rd.distortion2 += distortion; 22171b362b15af34006e6a11974088a46d42b903418eJohann rd.rate2 += x->mbmode_cost[x->e_mbd.frame_type][x->e_mbd.mode_info_context->mbmi.mode]; 22181b362b15af34006e6a11974088a46d42b903418eJohann rd.rate2 += uv_intra_rate; 22191b362b15af34006e6a11974088a46d42b903418eJohann rd.rate_uv = uv_intra_rate_tokenonly; 22201b362b15af34006e6a11974088a46d42b903418eJohann rd.distortion2 += uv_intra_distortion; 22211b362b15af34006e6a11974088a46d42b903418eJohann rd.distortion_uv = uv_intra_distortion; 22221b362b15af34006e6a11974088a46d42b903418eJohann } 22231b362b15af34006e6a11974088a46d42b903418eJohann break; 22241b362b15af34006e6a11974088a46d42b903418eJohann 22251b362b15af34006e6a11974088a46d42b903418eJohann case NEWMV: 22261b362b15af34006e6a11974088a46d42b903418eJohann { 22271b362b15af34006e6a11974088a46d42b903418eJohann int thissme; 22281b362b15af34006e6a11974088a46d42b903418eJohann int bestsme = INT_MAX; 22291b362b15af34006e6a11974088a46d42b903418eJohann int step_param = cpi->sf.first_step; 22301b362b15af34006e6a11974088a46d42b903418eJohann int further_steps; 22311b362b15af34006e6a11974088a46d42b903418eJohann int n; 22321b362b15af34006e6a11974088a46d42b903418eJohann int do_refine=1; /* If last step (1-away) of n-step search doesn't pick the center point as the best match, 22331b362b15af34006e6a11974088a46d42b903418eJohann we will do a final 1-away diamond refining search */ 22341b362b15af34006e6a11974088a46d42b903418eJohann 22351b362b15af34006e6a11974088a46d42b903418eJohann int sadpb = x->sadperbit16; 22361b362b15af34006e6a11974088a46d42b903418eJohann int_mv mvp_full; 22371b362b15af34006e6a11974088a46d42b903418eJohann 22381b362b15af34006e6a11974088a46d42b903418eJohann int col_min = ((best_ref_mv.as_mv.col+7)>>3) - MAX_FULL_PEL_VAL; 22391b362b15af34006e6a11974088a46d42b903418eJohann int row_min = ((best_ref_mv.as_mv.row+7)>>3) - MAX_FULL_PEL_VAL; 22401b362b15af34006e6a11974088a46d42b903418eJohann int col_max = (best_ref_mv.as_mv.col>>3) + MAX_FULL_PEL_VAL; 22411b362b15af34006e6a11974088a46d42b903418eJohann int row_max = (best_ref_mv.as_mv.row>>3) + MAX_FULL_PEL_VAL; 22421b362b15af34006e6a11974088a46d42b903418eJohann 22431b362b15af34006e6a11974088a46d42b903418eJohann int tmp_col_min = x->mv_col_min; 22441b362b15af34006e6a11974088a46d42b903418eJohann int tmp_col_max = x->mv_col_max; 22451b362b15af34006e6a11974088a46d42b903418eJohann int tmp_row_min = x->mv_row_min; 22461b362b15af34006e6a11974088a46d42b903418eJohann int tmp_row_max = x->mv_row_max; 22471b362b15af34006e6a11974088a46d42b903418eJohann 22481b362b15af34006e6a11974088a46d42b903418eJohann if(!saddone) 22491b362b15af34006e6a11974088a46d42b903418eJohann { 22501b362b15af34006e6a11974088a46d42b903418eJohann vp8_cal_sad(cpi,xd,x, recon_yoffset ,&near_sadidx[0] ); 22511b362b15af34006e6a11974088a46d42b903418eJohann saddone = 1; 22521b362b15af34006e6a11974088a46d42b903418eJohann } 22531b362b15af34006e6a11974088a46d42b903418eJohann 22541b362b15af34006e6a11974088a46d42b903418eJohann vp8_mv_pred(cpi, &x->e_mbd, x->e_mbd.mode_info_context, &mvp, 22551b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.ref_frame, cpi->common.ref_frame_sign_bias, &sr, &near_sadidx[0]); 22561b362b15af34006e6a11974088a46d42b903418eJohann 22571b362b15af34006e6a11974088a46d42b903418eJohann mvp_full.as_mv.col = mvp.as_mv.col>>3; 22581b362b15af34006e6a11974088a46d42b903418eJohann mvp_full.as_mv.row = mvp.as_mv.row>>3; 22591b362b15af34006e6a11974088a46d42b903418eJohann 22601b362b15af34006e6a11974088a46d42b903418eJohann /* Get intersection of UMV window and valid MV window to 22611b362b15af34006e6a11974088a46d42b903418eJohann * reduce # of checks in diamond search. 22621b362b15af34006e6a11974088a46d42b903418eJohann */ 22631b362b15af34006e6a11974088a46d42b903418eJohann if (x->mv_col_min < col_min ) 22641b362b15af34006e6a11974088a46d42b903418eJohann x->mv_col_min = col_min; 22651b362b15af34006e6a11974088a46d42b903418eJohann if (x->mv_col_max > col_max ) 22661b362b15af34006e6a11974088a46d42b903418eJohann x->mv_col_max = col_max; 22671b362b15af34006e6a11974088a46d42b903418eJohann if (x->mv_row_min < row_min ) 22681b362b15af34006e6a11974088a46d42b903418eJohann x->mv_row_min = row_min; 22691b362b15af34006e6a11974088a46d42b903418eJohann if (x->mv_row_max > row_max ) 22701b362b15af34006e6a11974088a46d42b903418eJohann x->mv_row_max = row_max; 22711b362b15af34006e6a11974088a46d42b903418eJohann 22721b362b15af34006e6a11974088a46d42b903418eJohann /* adjust search range according to sr from mv prediction */ 22731b362b15af34006e6a11974088a46d42b903418eJohann if(sr > step_param) 22741b362b15af34006e6a11974088a46d42b903418eJohann step_param = sr; 22751b362b15af34006e6a11974088a46d42b903418eJohann 22761b362b15af34006e6a11974088a46d42b903418eJohann /* Initial step/diamond search */ 22771b362b15af34006e6a11974088a46d42b903418eJohann { 22781b362b15af34006e6a11974088a46d42b903418eJohann bestsme = cpi->diamond_search_sad(x, b, d, &mvp_full, &d->bmi.mv, 22791b362b15af34006e6a11974088a46d42b903418eJohann step_param, sadpb, &num00, 22801b362b15af34006e6a11974088a46d42b903418eJohann &cpi->fn_ptr[BLOCK_16X16], 22811b362b15af34006e6a11974088a46d42b903418eJohann x->mvcost, &best_ref_mv); 22821b362b15af34006e6a11974088a46d42b903418eJohann mode_mv[NEWMV].as_int = d->bmi.mv.as_int; 22831b362b15af34006e6a11974088a46d42b903418eJohann 22841b362b15af34006e6a11974088a46d42b903418eJohann /* Further step/diamond searches as necessary */ 22851b362b15af34006e6a11974088a46d42b903418eJohann n = 0; 22861b362b15af34006e6a11974088a46d42b903418eJohann further_steps = (cpi->sf.max_step_search_steps - 1) - step_param; 22871b362b15af34006e6a11974088a46d42b903418eJohann 22881b362b15af34006e6a11974088a46d42b903418eJohann n = num00; 22891b362b15af34006e6a11974088a46d42b903418eJohann num00 = 0; 22901b362b15af34006e6a11974088a46d42b903418eJohann 22911b362b15af34006e6a11974088a46d42b903418eJohann /* If there won't be more n-step search, check to see if refining search is needed. */ 22921b362b15af34006e6a11974088a46d42b903418eJohann if (n > further_steps) 22931b362b15af34006e6a11974088a46d42b903418eJohann do_refine = 0; 22941b362b15af34006e6a11974088a46d42b903418eJohann 22951b362b15af34006e6a11974088a46d42b903418eJohann while (n < further_steps) 22961b362b15af34006e6a11974088a46d42b903418eJohann { 22971b362b15af34006e6a11974088a46d42b903418eJohann n++; 22981b362b15af34006e6a11974088a46d42b903418eJohann 22991b362b15af34006e6a11974088a46d42b903418eJohann if (num00) 23001b362b15af34006e6a11974088a46d42b903418eJohann num00--; 23011b362b15af34006e6a11974088a46d42b903418eJohann else 23021b362b15af34006e6a11974088a46d42b903418eJohann { 23031b362b15af34006e6a11974088a46d42b903418eJohann thissme = cpi->diamond_search_sad(x, b, d, &mvp_full, 23041b362b15af34006e6a11974088a46d42b903418eJohann &d->bmi.mv, step_param + n, sadpb, &num00, 23051b362b15af34006e6a11974088a46d42b903418eJohann &cpi->fn_ptr[BLOCK_16X16], x->mvcost, 23061b362b15af34006e6a11974088a46d42b903418eJohann &best_ref_mv); 23071b362b15af34006e6a11974088a46d42b903418eJohann 23081b362b15af34006e6a11974088a46d42b903418eJohann /* check to see if refining search is needed. */ 23091b362b15af34006e6a11974088a46d42b903418eJohann if (num00 > (further_steps-n)) 23101b362b15af34006e6a11974088a46d42b903418eJohann do_refine = 0; 23111b362b15af34006e6a11974088a46d42b903418eJohann 23121b362b15af34006e6a11974088a46d42b903418eJohann if (thissme < bestsme) 23131b362b15af34006e6a11974088a46d42b903418eJohann { 23141b362b15af34006e6a11974088a46d42b903418eJohann bestsme = thissme; 23151b362b15af34006e6a11974088a46d42b903418eJohann mode_mv[NEWMV].as_int = d->bmi.mv.as_int; 23161b362b15af34006e6a11974088a46d42b903418eJohann } 23171b362b15af34006e6a11974088a46d42b903418eJohann else 23181b362b15af34006e6a11974088a46d42b903418eJohann { 23191b362b15af34006e6a11974088a46d42b903418eJohann d->bmi.mv.as_int = mode_mv[NEWMV].as_int; 23201b362b15af34006e6a11974088a46d42b903418eJohann } 23211b362b15af34006e6a11974088a46d42b903418eJohann } 23221b362b15af34006e6a11974088a46d42b903418eJohann } 23231b362b15af34006e6a11974088a46d42b903418eJohann } 23241b362b15af34006e6a11974088a46d42b903418eJohann 23251b362b15af34006e6a11974088a46d42b903418eJohann /* final 1-away diamond refining search */ 23261b362b15af34006e6a11974088a46d42b903418eJohann if (do_refine == 1) 23271b362b15af34006e6a11974088a46d42b903418eJohann { 23281b362b15af34006e6a11974088a46d42b903418eJohann int search_range; 23291b362b15af34006e6a11974088a46d42b903418eJohann 23301b362b15af34006e6a11974088a46d42b903418eJohann search_range = 8; 23311b362b15af34006e6a11974088a46d42b903418eJohann 23321b362b15af34006e6a11974088a46d42b903418eJohann thissme = cpi->refining_search_sad(x, b, d, &d->bmi.mv, sadpb, 23331b362b15af34006e6a11974088a46d42b903418eJohann search_range, &cpi->fn_ptr[BLOCK_16X16], 23341b362b15af34006e6a11974088a46d42b903418eJohann x->mvcost, &best_ref_mv); 23351b362b15af34006e6a11974088a46d42b903418eJohann 23361b362b15af34006e6a11974088a46d42b903418eJohann if (thissme < bestsme) 23371b362b15af34006e6a11974088a46d42b903418eJohann { 23381b362b15af34006e6a11974088a46d42b903418eJohann bestsme = thissme; 23391b362b15af34006e6a11974088a46d42b903418eJohann mode_mv[NEWMV].as_int = d->bmi.mv.as_int; 23401b362b15af34006e6a11974088a46d42b903418eJohann } 23411b362b15af34006e6a11974088a46d42b903418eJohann else 23421b362b15af34006e6a11974088a46d42b903418eJohann { 23431b362b15af34006e6a11974088a46d42b903418eJohann d->bmi.mv.as_int = mode_mv[NEWMV].as_int; 23441b362b15af34006e6a11974088a46d42b903418eJohann } 23451b362b15af34006e6a11974088a46d42b903418eJohann } 23461b362b15af34006e6a11974088a46d42b903418eJohann 23471b362b15af34006e6a11974088a46d42b903418eJohann x->mv_col_min = tmp_col_min; 23481b362b15af34006e6a11974088a46d42b903418eJohann x->mv_col_max = tmp_col_max; 23491b362b15af34006e6a11974088a46d42b903418eJohann x->mv_row_min = tmp_row_min; 23501b362b15af34006e6a11974088a46d42b903418eJohann x->mv_row_max = tmp_row_max; 23511b362b15af34006e6a11974088a46d42b903418eJohann 23521b362b15af34006e6a11974088a46d42b903418eJohann if (bestsme < INT_MAX) 23531b362b15af34006e6a11974088a46d42b903418eJohann { 23541b362b15af34006e6a11974088a46d42b903418eJohann int dis; /* TODO: use dis in distortion calculation later. */ 23551b362b15af34006e6a11974088a46d42b903418eJohann unsigned int sse; 23561b362b15af34006e6a11974088a46d42b903418eJohann cpi->find_fractional_mv_step(x, b, d, &d->bmi.mv, &best_ref_mv, 23571b362b15af34006e6a11974088a46d42b903418eJohann x->errorperbit, 23581b362b15af34006e6a11974088a46d42b903418eJohann &cpi->fn_ptr[BLOCK_16X16], 23591b362b15af34006e6a11974088a46d42b903418eJohann x->mvcost, &dis, &sse); 23601b362b15af34006e6a11974088a46d42b903418eJohann } 23611b362b15af34006e6a11974088a46d42b903418eJohann 23621b362b15af34006e6a11974088a46d42b903418eJohann mode_mv[NEWMV].as_int = d->bmi.mv.as_int; 23631b362b15af34006e6a11974088a46d42b903418eJohann 23641b362b15af34006e6a11974088a46d42b903418eJohann /* Add the new motion vector cost to our rolling cost variable */ 23651b362b15af34006e6a11974088a46d42b903418eJohann rd.rate2 += vp8_mv_bit_cost(&mode_mv[NEWMV], &best_ref_mv, x->mvcost, 96); 23661b362b15af34006e6a11974088a46d42b903418eJohann } 23671b362b15af34006e6a11974088a46d42b903418eJohann 23681b362b15af34006e6a11974088a46d42b903418eJohann case NEARESTMV: 23691b362b15af34006e6a11974088a46d42b903418eJohann case NEARMV: 23701b362b15af34006e6a11974088a46d42b903418eJohann /* Clip "next_nearest" so that it does not extend to far out 23711b362b15af34006e6a11974088a46d42b903418eJohann * of image 23721b362b15af34006e6a11974088a46d42b903418eJohann */ 23731b362b15af34006e6a11974088a46d42b903418eJohann vp8_clamp_mv2(&mode_mv[this_mode], xd); 23741b362b15af34006e6a11974088a46d42b903418eJohann 23751b362b15af34006e6a11974088a46d42b903418eJohann /* Do not bother proceeding if the vector (from newmv, nearest 23761b362b15af34006e6a11974088a46d42b903418eJohann * or near) is 0,0 as this should then be coded using the zeromv 23771b362b15af34006e6a11974088a46d42b903418eJohann * mode. 23781b362b15af34006e6a11974088a46d42b903418eJohann */ 23791b362b15af34006e6a11974088a46d42b903418eJohann if (((this_mode == NEARMV) || (this_mode == NEARESTMV)) && (mode_mv[this_mode].as_int == 0)) 23801b362b15af34006e6a11974088a46d42b903418eJohann continue; 23811b362b15af34006e6a11974088a46d42b903418eJohann 23821b362b15af34006e6a11974088a46d42b903418eJohann case ZEROMV: 23831b362b15af34006e6a11974088a46d42b903418eJohann 23841b362b15af34006e6a11974088a46d42b903418eJohann /* Trap vectors that reach beyond the UMV borders 23851b362b15af34006e6a11974088a46d42b903418eJohann * Note that ALL New MV, Nearest MV Near MV and Zero MV code 23861b362b15af34006e6a11974088a46d42b903418eJohann * drops through to this point because of the lack of break 23871b362b15af34006e6a11974088a46d42b903418eJohann * statements in the previous two cases. 23881b362b15af34006e6a11974088a46d42b903418eJohann */ 23891b362b15af34006e6a11974088a46d42b903418eJohann if (((mode_mv[this_mode].as_mv.row >> 3) < x->mv_row_min) || ((mode_mv[this_mode].as_mv.row >> 3) > x->mv_row_max) || 23901b362b15af34006e6a11974088a46d42b903418eJohann ((mode_mv[this_mode].as_mv.col >> 3) < x->mv_col_min) || ((mode_mv[this_mode].as_mv.col >> 3) > x->mv_col_max)) 23911b362b15af34006e6a11974088a46d42b903418eJohann continue; 23921b362b15af34006e6a11974088a46d42b903418eJohann 23931b362b15af34006e6a11974088a46d42b903418eJohann vp8_set_mbmode_and_mvs(x, this_mode, &mode_mv[this_mode]); 23941b362b15af34006e6a11974088a46d42b903418eJohann this_rd = evaluate_inter_mode_rd(mdcounts, &rd, 23951b362b15af34006e6a11974088a46d42b903418eJohann &disable_skip, cpi, x); 23961b362b15af34006e6a11974088a46d42b903418eJohann break; 23971b362b15af34006e6a11974088a46d42b903418eJohann 23981b362b15af34006e6a11974088a46d42b903418eJohann default: 23991b362b15af34006e6a11974088a46d42b903418eJohann break; 24001b362b15af34006e6a11974088a46d42b903418eJohann } 24011b362b15af34006e6a11974088a46d42b903418eJohann 24021b362b15af34006e6a11974088a46d42b903418eJohann this_rd = calculate_final_rd_costs(this_rd, &rd, &other_cost, 24031b362b15af34006e6a11974088a46d42b903418eJohann disable_skip, uv_intra_tteob, 24041b362b15af34006e6a11974088a46d42b903418eJohann intra_rd_penalty, cpi, x); 24051b362b15af34006e6a11974088a46d42b903418eJohann 24061b362b15af34006e6a11974088a46d42b903418eJohann /* Keep record of best intra distortion */ 24071b362b15af34006e6a11974088a46d42b903418eJohann if ((x->e_mbd.mode_info_context->mbmi.ref_frame == INTRA_FRAME) && 24081b362b15af34006e6a11974088a46d42b903418eJohann (this_rd < best_mode.intra_rd) ) 24091b362b15af34006e6a11974088a46d42b903418eJohann { 24101b362b15af34006e6a11974088a46d42b903418eJohann best_mode.intra_rd = this_rd; 24111b362b15af34006e6a11974088a46d42b903418eJohann *returnintra = rd.distortion2 ; 24121b362b15af34006e6a11974088a46d42b903418eJohann } 24131b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_TEMPORAL_DENOISING 24141b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->oxcf.noise_sensitivity) 24151b362b15af34006e6a11974088a46d42b903418eJohann { 24161b362b15af34006e6a11974088a46d42b903418eJohann unsigned int sse; 24171b362b15af34006e6a11974088a46d42b903418eJohann vp8_get_inter_mbpred_error(x,&cpi->fn_ptr[BLOCK_16X16],&sse, 24181b362b15af34006e6a11974088a46d42b903418eJohann mode_mv[this_mode]); 24191b362b15af34006e6a11974088a46d42b903418eJohann 24201b362b15af34006e6a11974088a46d42b903418eJohann if (sse < best_rd_sse) 24211b362b15af34006e6a11974088a46d42b903418eJohann best_rd_sse = sse; 24221b362b15af34006e6a11974088a46d42b903418eJohann 24231b362b15af34006e6a11974088a46d42b903418eJohann /* Store for later use by denoiser. */ 24241b362b15af34006e6a11974088a46d42b903418eJohann if (this_mode == ZEROMV && sse < zero_mv_sse ) 24251b362b15af34006e6a11974088a46d42b903418eJohann { 24261b362b15af34006e6a11974088a46d42b903418eJohann zero_mv_sse = sse; 24271b362b15af34006e6a11974088a46d42b903418eJohann x->best_zeromv_reference_frame = 24281b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.ref_frame; 24291b362b15af34006e6a11974088a46d42b903418eJohann } 24301b362b15af34006e6a11974088a46d42b903418eJohann 24311b362b15af34006e6a11974088a46d42b903418eJohann /* Store the best NEWMV in x for later use in the denoiser. */ 24321b362b15af34006e6a11974088a46d42b903418eJohann if (x->e_mbd.mode_info_context->mbmi.mode == NEWMV && 24331b362b15af34006e6a11974088a46d42b903418eJohann sse < best_sse) 24341b362b15af34006e6a11974088a46d42b903418eJohann { 24351b362b15af34006e6a11974088a46d42b903418eJohann best_sse = sse; 24361b362b15af34006e6a11974088a46d42b903418eJohann vp8_get_inter_mbpred_error(x,&cpi->fn_ptr[BLOCK_16X16],&best_sse, 24371b362b15af34006e6a11974088a46d42b903418eJohann mode_mv[this_mode]); 24381b362b15af34006e6a11974088a46d42b903418eJohann x->best_sse_inter_mode = NEWMV; 24391b362b15af34006e6a11974088a46d42b903418eJohann x->best_sse_mv = x->e_mbd.mode_info_context->mbmi.mv; 24401b362b15af34006e6a11974088a46d42b903418eJohann x->need_to_clamp_best_mvs = 24411b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.need_to_clamp_mvs; 24421b362b15af34006e6a11974088a46d42b903418eJohann x->best_reference_frame = 24431b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.ref_frame; 24441b362b15af34006e6a11974088a46d42b903418eJohann } 24451b362b15af34006e6a11974088a46d42b903418eJohann } 24461b362b15af34006e6a11974088a46d42b903418eJohann#endif 24471b362b15af34006e6a11974088a46d42b903418eJohann 24481b362b15af34006e6a11974088a46d42b903418eJohann /* Did this mode help.. i.i is it the new best mode */ 24491b362b15af34006e6a11974088a46d42b903418eJohann if (this_rd < best_mode.rd || x->skip) 24501b362b15af34006e6a11974088a46d42b903418eJohann { 24511b362b15af34006e6a11974088a46d42b903418eJohann /* Note index of best mode so far */ 24521b362b15af34006e6a11974088a46d42b903418eJohann best_mode_index = mode_index; 24531b362b15af34006e6a11974088a46d42b903418eJohann *returnrate = rd.rate2; 24541b362b15af34006e6a11974088a46d42b903418eJohann *returndistortion = rd.distortion2; 24551b362b15af34006e6a11974088a46d42b903418eJohann if (this_mode <= B_PRED) 24561b362b15af34006e6a11974088a46d42b903418eJohann { 24571b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.uv_mode = uv_intra_mode; 24581b362b15af34006e6a11974088a46d42b903418eJohann /* required for left and above block mv */ 24591b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.mv.as_int = 0; 24601b362b15af34006e6a11974088a46d42b903418eJohann } 24611b362b15af34006e6a11974088a46d42b903418eJohann update_best_mode(&best_mode, this_rd, &rd, other_cost, x); 24621b362b15af34006e6a11974088a46d42b903418eJohann 24631b362b15af34006e6a11974088a46d42b903418eJohann 24641b362b15af34006e6a11974088a46d42b903418eJohann /* Testing this mode gave rise to an improvement in best error 24651b362b15af34006e6a11974088a46d42b903418eJohann * score. Lower threshold a bit for next time 24661b362b15af34006e6a11974088a46d42b903418eJohann */ 24671b362b15af34006e6a11974088a46d42b903418eJohann cpi->rd_thresh_mult[mode_index] = (cpi->rd_thresh_mult[mode_index] >= (MIN_THRESHMULT + 2)) ? cpi->rd_thresh_mult[mode_index] - 2 : MIN_THRESHMULT; 24681b362b15af34006e6a11974088a46d42b903418eJohann cpi->rd_threshes[mode_index] = (cpi->rd_baseline_thresh[mode_index] >> 7) * cpi->rd_thresh_mult[mode_index]; 24691b362b15af34006e6a11974088a46d42b903418eJohann } 24701b362b15af34006e6a11974088a46d42b903418eJohann 24711b362b15af34006e6a11974088a46d42b903418eJohann /* If the mode did not help improve the best error case then raise 24721b362b15af34006e6a11974088a46d42b903418eJohann * the threshold for testing that mode next time around. 24731b362b15af34006e6a11974088a46d42b903418eJohann */ 24741b362b15af34006e6a11974088a46d42b903418eJohann else 24751b362b15af34006e6a11974088a46d42b903418eJohann { 24761b362b15af34006e6a11974088a46d42b903418eJohann cpi->rd_thresh_mult[mode_index] += 4; 24771b362b15af34006e6a11974088a46d42b903418eJohann 24781b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->rd_thresh_mult[mode_index] > MAX_THRESHMULT) 24791b362b15af34006e6a11974088a46d42b903418eJohann cpi->rd_thresh_mult[mode_index] = MAX_THRESHMULT; 24801b362b15af34006e6a11974088a46d42b903418eJohann 24811b362b15af34006e6a11974088a46d42b903418eJohann cpi->rd_threshes[mode_index] = (cpi->rd_baseline_thresh[mode_index] >> 7) * cpi->rd_thresh_mult[mode_index]; 24821b362b15af34006e6a11974088a46d42b903418eJohann } 24831b362b15af34006e6a11974088a46d42b903418eJohann 24841b362b15af34006e6a11974088a46d42b903418eJohann if (x->skip) 24851b362b15af34006e6a11974088a46d42b903418eJohann break; 24861b362b15af34006e6a11974088a46d42b903418eJohann 24871b362b15af34006e6a11974088a46d42b903418eJohann } 24881b362b15af34006e6a11974088a46d42b903418eJohann 24891b362b15af34006e6a11974088a46d42b903418eJohann /* Reduce the activation RD thresholds for the best choice mode */ 24901b362b15af34006e6a11974088a46d42b903418eJohann if ((cpi->rd_baseline_thresh[best_mode_index] > 0) && (cpi->rd_baseline_thresh[best_mode_index] < (INT_MAX >> 2))) 24911b362b15af34006e6a11974088a46d42b903418eJohann { 24921b362b15af34006e6a11974088a46d42b903418eJohann int best_adjustment = (cpi->rd_thresh_mult[best_mode_index] >> 2); 24931b362b15af34006e6a11974088a46d42b903418eJohann 24941b362b15af34006e6a11974088a46d42b903418eJohann cpi->rd_thresh_mult[best_mode_index] = (cpi->rd_thresh_mult[best_mode_index] >= (MIN_THRESHMULT + best_adjustment)) ? cpi->rd_thresh_mult[best_mode_index] - best_adjustment : MIN_THRESHMULT; 24951b362b15af34006e6a11974088a46d42b903418eJohann cpi->rd_threshes[best_mode_index] = (cpi->rd_baseline_thresh[best_mode_index] >> 7) * cpi->rd_thresh_mult[best_mode_index]; 24961b362b15af34006e6a11974088a46d42b903418eJohann } 24971b362b15af34006e6a11974088a46d42b903418eJohann 24981b362b15af34006e6a11974088a46d42b903418eJohann /* Note how often each mode chosen as best */ 24991b362b15af34006e6a11974088a46d42b903418eJohann cpi->mode_chosen_counts[best_mode_index] ++; 25001b362b15af34006e6a11974088a46d42b903418eJohann 25011b362b15af34006e6a11974088a46d42b903418eJohann#if CONFIG_TEMPORAL_DENOISING 25021b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->oxcf.noise_sensitivity) 25031b362b15af34006e6a11974088a46d42b903418eJohann { 25041b362b15af34006e6a11974088a46d42b903418eJohann if (x->best_sse_inter_mode == DC_PRED) 25051b362b15af34006e6a11974088a46d42b903418eJohann { 25061b362b15af34006e6a11974088a46d42b903418eJohann /* No best MV found. */ 25071b362b15af34006e6a11974088a46d42b903418eJohann x->best_sse_inter_mode = best_mode.mbmode.mode; 25081b362b15af34006e6a11974088a46d42b903418eJohann x->best_sse_mv = best_mode.mbmode.mv; 25091b362b15af34006e6a11974088a46d42b903418eJohann x->need_to_clamp_best_mvs = best_mode.mbmode.need_to_clamp_mvs; 25101b362b15af34006e6a11974088a46d42b903418eJohann x->best_reference_frame = best_mode.mbmode.ref_frame; 25111b362b15af34006e6a11974088a46d42b903418eJohann best_sse = best_rd_sse; 25121b362b15af34006e6a11974088a46d42b903418eJohann } 25131b362b15af34006e6a11974088a46d42b903418eJohann vp8_denoiser_denoise_mb(&cpi->denoiser, x, best_sse, zero_mv_sse, 25141b362b15af34006e6a11974088a46d42b903418eJohann recon_yoffset, recon_uvoffset); 25151b362b15af34006e6a11974088a46d42b903418eJohann 25161b362b15af34006e6a11974088a46d42b903418eJohann 25171b362b15af34006e6a11974088a46d42b903418eJohann /* Reevaluate ZEROMV after denoising. */ 25181b362b15af34006e6a11974088a46d42b903418eJohann if (best_mode.mbmode.ref_frame == INTRA_FRAME && 25191b362b15af34006e6a11974088a46d42b903418eJohann x->best_zeromv_reference_frame != INTRA_FRAME) 25201b362b15af34006e6a11974088a46d42b903418eJohann { 25211b362b15af34006e6a11974088a46d42b903418eJohann int this_rd = INT_MAX; 25221b362b15af34006e6a11974088a46d42b903418eJohann int disable_skip = 0; 25231b362b15af34006e6a11974088a46d42b903418eJohann int other_cost = 0; 25241b362b15af34006e6a11974088a46d42b903418eJohann int this_ref_frame = x->best_zeromv_reference_frame; 25251b362b15af34006e6a11974088a46d42b903418eJohann rd.rate2 = x->ref_frame_cost[this_ref_frame] + 25261b362b15af34006e6a11974088a46d42b903418eJohann vp8_cost_mv_ref(ZEROMV, mdcounts); 25271b362b15af34006e6a11974088a46d42b903418eJohann rd.distortion2 = 0; 25281b362b15af34006e6a11974088a46d42b903418eJohann 25291b362b15af34006e6a11974088a46d42b903418eJohann /* set up the proper prediction buffers for the frame */ 25301b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.ref_frame = this_ref_frame; 25311b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.pre.y_buffer = plane[this_ref_frame][0]; 25321b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.pre.u_buffer = plane[this_ref_frame][1]; 25331b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.pre.v_buffer = plane[this_ref_frame][2]; 25341b362b15af34006e6a11974088a46d42b903418eJohann 25351b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.mode = ZEROMV; 25361b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED; 25371b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.mv.as_int = 0; 25381b362b15af34006e6a11974088a46d42b903418eJohann 25391b362b15af34006e6a11974088a46d42b903418eJohann this_rd = evaluate_inter_mode_rd(mdcounts, &rd, &disable_skip, cpi, x); 25401b362b15af34006e6a11974088a46d42b903418eJohann this_rd = calculate_final_rd_costs(this_rd, &rd, &other_cost, 25411b362b15af34006e6a11974088a46d42b903418eJohann disable_skip, uv_intra_tteob, 25421b362b15af34006e6a11974088a46d42b903418eJohann intra_rd_penalty, cpi, x); 25431b362b15af34006e6a11974088a46d42b903418eJohann if (this_rd < best_mode.rd || x->skip) 25441b362b15af34006e6a11974088a46d42b903418eJohann { 25451b362b15af34006e6a11974088a46d42b903418eJohann /* Note index of best mode so far */ 25461b362b15af34006e6a11974088a46d42b903418eJohann best_mode_index = mode_index; 25471b362b15af34006e6a11974088a46d42b903418eJohann *returnrate = rd.rate2; 25481b362b15af34006e6a11974088a46d42b903418eJohann *returndistortion = rd.distortion2; 25491b362b15af34006e6a11974088a46d42b903418eJohann update_best_mode(&best_mode, this_rd, &rd, other_cost, x); 25501b362b15af34006e6a11974088a46d42b903418eJohann } 25511b362b15af34006e6a11974088a46d42b903418eJohann } 25521b362b15af34006e6a11974088a46d42b903418eJohann 25531b362b15af34006e6a11974088a46d42b903418eJohann } 25541b362b15af34006e6a11974088a46d42b903418eJohann#endif 25551b362b15af34006e6a11974088a46d42b903418eJohann 25561b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->is_src_frame_alt_ref && 25571b362b15af34006e6a11974088a46d42b903418eJohann (best_mode.mbmode.mode != ZEROMV || best_mode.mbmode.ref_frame != ALTREF_FRAME)) 25581b362b15af34006e6a11974088a46d42b903418eJohann { 25591b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.mode = ZEROMV; 25601b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.ref_frame = ALTREF_FRAME; 25611b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.mv.as_int = 0; 25621b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED; 25631b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.mb_skip_coeff = 25641b362b15af34006e6a11974088a46d42b903418eJohann (cpi->common.mb_no_coeff_skip); 25651b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.partitioning = 0; 25661b362b15af34006e6a11974088a46d42b903418eJohann return; 25671b362b15af34006e6a11974088a46d42b903418eJohann } 25681b362b15af34006e6a11974088a46d42b903418eJohann 25691b362b15af34006e6a11974088a46d42b903418eJohann 25701b362b15af34006e6a11974088a46d42b903418eJohann /* macroblock modes */ 25711b362b15af34006e6a11974088a46d42b903418eJohann vpx_memcpy(&x->e_mbd.mode_info_context->mbmi, &best_mode.mbmode, sizeof(MB_MODE_INFO)); 25721b362b15af34006e6a11974088a46d42b903418eJohann 25731b362b15af34006e6a11974088a46d42b903418eJohann if (best_mode.mbmode.mode == B_PRED) 25741b362b15af34006e6a11974088a46d42b903418eJohann { 25751b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < 16; i++) 25761b362b15af34006e6a11974088a46d42b903418eJohann xd->mode_info_context->bmi[i].as_mode = best_mode.bmodes[i].as_mode; 25771b362b15af34006e6a11974088a46d42b903418eJohann } 25781b362b15af34006e6a11974088a46d42b903418eJohann 25791b362b15af34006e6a11974088a46d42b903418eJohann if (best_mode.mbmode.mode == SPLITMV) 25801b362b15af34006e6a11974088a46d42b903418eJohann { 25811b362b15af34006e6a11974088a46d42b903418eJohann for (i = 0; i < 16; i++) 25821b362b15af34006e6a11974088a46d42b903418eJohann xd->mode_info_context->bmi[i].mv.as_int = best_mode.bmodes[i].mv.as_int; 25831b362b15af34006e6a11974088a46d42b903418eJohann 25841b362b15af34006e6a11974088a46d42b903418eJohann vpx_memcpy(x->partition_info, &best_mode.partition, sizeof(PARTITION_INFO)); 25851b362b15af34006e6a11974088a46d42b903418eJohann 25861b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.mv.as_int = 25871b362b15af34006e6a11974088a46d42b903418eJohann x->partition_info->bmi[15].mv.as_int; 25881b362b15af34006e6a11974088a46d42b903418eJohann } 25891b362b15af34006e6a11974088a46d42b903418eJohann 25901b362b15af34006e6a11974088a46d42b903418eJohann if (sign_bias 25911b362b15af34006e6a11974088a46d42b903418eJohann != cpi->common.ref_frame_sign_bias[xd->mode_info_context->mbmi.ref_frame]) 25921b362b15af34006e6a11974088a46d42b903418eJohann best_ref_mv.as_int = best_ref_mv_sb[!sign_bias].as_int; 25931b362b15af34006e6a11974088a46d42b903418eJohann 25941b362b15af34006e6a11974088a46d42b903418eJohann rd_update_mvcount(cpi, x, &best_ref_mv); 25951b362b15af34006e6a11974088a46d42b903418eJohann} 25961b362b15af34006e6a11974088a46d42b903418eJohann 25971b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_rd_pick_intra_mode(MACROBLOCK *x, int *rate_) 25981b362b15af34006e6a11974088a46d42b903418eJohann{ 25991b362b15af34006e6a11974088a46d42b903418eJohann int error4x4, error16x16; 26001b362b15af34006e6a11974088a46d42b903418eJohann int rate4x4, rate16x16 = 0, rateuv; 26011b362b15af34006e6a11974088a46d42b903418eJohann int dist4x4, dist16x16, distuv; 26021b362b15af34006e6a11974088a46d42b903418eJohann int rate; 26031b362b15af34006e6a11974088a46d42b903418eJohann int rate4x4_tokenonly = 0; 26041b362b15af34006e6a11974088a46d42b903418eJohann int rate16x16_tokenonly = 0; 26051b362b15af34006e6a11974088a46d42b903418eJohann int rateuv_tokenonly = 0; 26061b362b15af34006e6a11974088a46d42b903418eJohann 26071b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME; 26081b362b15af34006e6a11974088a46d42b903418eJohann 26091b362b15af34006e6a11974088a46d42b903418eJohann rd_pick_intra_mbuv_mode(x, &rateuv, &rateuv_tokenonly, &distuv); 26101b362b15af34006e6a11974088a46d42b903418eJohann rate = rateuv; 26111b362b15af34006e6a11974088a46d42b903418eJohann 26121b362b15af34006e6a11974088a46d42b903418eJohann error16x16 = rd_pick_intra16x16mby_mode(x, &rate16x16, &rate16x16_tokenonly, 26131b362b15af34006e6a11974088a46d42b903418eJohann &dist16x16); 26141b362b15af34006e6a11974088a46d42b903418eJohann 26151b362b15af34006e6a11974088a46d42b903418eJohann error4x4 = rd_pick_intra4x4mby_modes(x, &rate4x4, &rate4x4_tokenonly, 26161b362b15af34006e6a11974088a46d42b903418eJohann &dist4x4, error16x16); 26171b362b15af34006e6a11974088a46d42b903418eJohann 26181b362b15af34006e6a11974088a46d42b903418eJohann if (error4x4 < error16x16) 26191b362b15af34006e6a11974088a46d42b903418eJohann { 26201b362b15af34006e6a11974088a46d42b903418eJohann x->e_mbd.mode_info_context->mbmi.mode = B_PRED; 26211b362b15af34006e6a11974088a46d42b903418eJohann rate += rate4x4; 26221b362b15af34006e6a11974088a46d42b903418eJohann } 26231b362b15af34006e6a11974088a46d42b903418eJohann else 26241b362b15af34006e6a11974088a46d42b903418eJohann { 26251b362b15af34006e6a11974088a46d42b903418eJohann rate += rate16x16; 26261b362b15af34006e6a11974088a46d42b903418eJohann } 26271b362b15af34006e6a11974088a46d42b903418eJohann 26281b362b15af34006e6a11974088a46d42b903418eJohann *rate_ = rate; 26291b362b15af34006e6a11974088a46d42b903418eJohann} 2630