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