LCOV - code coverage report
Current view: top level - media/libvpx/libvpx/vp9/encoder - vp9_rd.c (source / functions) Hit Total Coverage
Test: output.info Lines: 0 290 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 24 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
       3             :  *
       4             :  *  Use of this source code is governed by a BSD-style license
       5             :  *  that can be found in the LICENSE file in the root of the source
       6             :  *  tree. An additional intellectual property rights grant can be found
       7             :  *  in the file PATENTS.  All contributing project authors may
       8             :  *  be found in the AUTHORS file in the root of the source tree.
       9             :  */
      10             : 
      11             : #include <assert.h>
      12             : #include <math.h>
      13             : #include <stdio.h>
      14             : 
      15             : #include "./vp9_rtcd.h"
      16             : 
      17             : #include "vpx_dsp/vpx_dsp_common.h"
      18             : #include "vpx_mem/vpx_mem.h"
      19             : #include "vpx_ports/bitops.h"
      20             : #include "vpx_ports/mem.h"
      21             : #include "vpx_ports/system_state.h"
      22             : 
      23             : #include "vp9/common/vp9_common.h"
      24             : #include "vp9/common/vp9_entropy.h"
      25             : #include "vp9/common/vp9_entropymode.h"
      26             : #include "vp9/common/vp9_mvref_common.h"
      27             : #include "vp9/common/vp9_pred_common.h"
      28             : #include "vp9/common/vp9_quant_common.h"
      29             : #include "vp9/common/vp9_reconinter.h"
      30             : #include "vp9/common/vp9_reconintra.h"
      31             : #include "vp9/common/vp9_seg_common.h"
      32             : 
      33             : #include "vp9/encoder/vp9_cost.h"
      34             : #include "vp9/encoder/vp9_encodemb.h"
      35             : #include "vp9/encoder/vp9_encodemv.h"
      36             : #include "vp9/encoder/vp9_encoder.h"
      37             : #include "vp9/encoder/vp9_mcomp.h"
      38             : #include "vp9/encoder/vp9_quantize.h"
      39             : #include "vp9/encoder/vp9_ratectrl.h"
      40             : #include "vp9/encoder/vp9_rd.h"
      41             : #include "vp9/encoder/vp9_tokenize.h"
      42             : 
      43             : #define RD_THRESH_POW 1.25
      44             : 
      45             : // Factor to weigh the rate for switchable interp filters.
      46             : #define SWITCHABLE_INTERP_RATE_FACTOR 1
      47             : 
      48           0 : void vp9_rd_cost_reset(RD_COST *rd_cost) {
      49           0 :   rd_cost->rate = INT_MAX;
      50           0 :   rd_cost->dist = INT64_MAX;
      51           0 :   rd_cost->rdcost = INT64_MAX;
      52           0 : }
      53             : 
      54           0 : void vp9_rd_cost_init(RD_COST *rd_cost) {
      55           0 :   rd_cost->rate = 0;
      56           0 :   rd_cost->dist = 0;
      57           0 :   rd_cost->rdcost = 0;
      58           0 : }
      59             : 
      60             : // The baseline rd thresholds for breaking out of the rd loop for
      61             : // certain modes are assumed to be based on 8x8 blocks.
      62             : // This table is used to correct for block size.
      63             : // The factors here are << 2 (2 = x0.5, 32 = x8 etc).
      64             : static const uint8_t rd_thresh_block_size_factor[BLOCK_SIZES] = {
      65             :   2, 3, 3, 4, 6, 6, 8, 12, 12, 16, 24, 24, 32
      66             : };
      67             : 
      68           0 : static void fill_mode_costs(VP9_COMP *cpi) {
      69           0 :   const FRAME_CONTEXT *const fc = cpi->common.fc;
      70             :   int i, j;
      71             : 
      72           0 :   for (i = 0; i < INTRA_MODES; ++i)
      73           0 :     for (j = 0; j < INTRA_MODES; ++j)
      74           0 :       vp9_cost_tokens(cpi->y_mode_costs[i][j], vp9_kf_y_mode_prob[i][j],
      75             :                       vp9_intra_mode_tree);
      76             : 
      77           0 :   vp9_cost_tokens(cpi->mbmode_cost, fc->y_mode_prob[1], vp9_intra_mode_tree);
      78           0 :   for (i = 0; i < INTRA_MODES; ++i) {
      79           0 :     vp9_cost_tokens(cpi->intra_uv_mode_cost[KEY_FRAME][i],
      80           0 :                     vp9_kf_uv_mode_prob[i], vp9_intra_mode_tree);
      81           0 :     vp9_cost_tokens(cpi->intra_uv_mode_cost[INTER_FRAME][i],
      82           0 :                     fc->uv_mode_prob[i], vp9_intra_mode_tree);
      83             :   }
      84             : 
      85           0 :   for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; ++i)
      86           0 :     vp9_cost_tokens(cpi->switchable_interp_costs[i],
      87           0 :                     fc->switchable_interp_prob[i], vp9_switchable_interp_tree);
      88           0 : }
      89             : 
      90           0 : static void fill_token_costs(vp9_coeff_cost *c,
      91             :                              vp9_coeff_probs_model (*p)[PLANE_TYPES]) {
      92             :   int i, j, k, l;
      93             :   TX_SIZE t;
      94           0 :   for (t = TX_4X4; t <= TX_32X32; ++t)
      95           0 :     for (i = 0; i < PLANE_TYPES; ++i)
      96           0 :       for (j = 0; j < REF_TYPES; ++j)
      97           0 :         for (k = 0; k < COEF_BANDS; ++k)
      98           0 :           for (l = 0; l < BAND_COEFF_CONTEXTS(k); ++l) {
      99             :             vpx_prob probs[ENTROPY_NODES];
     100           0 :             vp9_model_to_full_probs(p[t][i][j][k][l], probs);
     101           0 :             vp9_cost_tokens((int *)c[t][i][j][k][0][l], probs, vp9_coef_tree);
     102           0 :             vp9_cost_tokens_skip((int *)c[t][i][j][k][1][l], probs,
     103             :                                  vp9_coef_tree);
     104           0 :             assert(c[t][i][j][k][0][l][EOB_TOKEN] ==
     105             :                    c[t][i][j][k][1][l][EOB_TOKEN]);
     106             :           }
     107           0 : }
     108             : 
     109             : // Values are now correlated to quantizer.
     110             : static int sad_per_bit16lut_8[QINDEX_RANGE];
     111             : static int sad_per_bit4lut_8[QINDEX_RANGE];
     112             : 
     113             : #if CONFIG_VP9_HIGHBITDEPTH
     114             : static int sad_per_bit16lut_10[QINDEX_RANGE];
     115             : static int sad_per_bit4lut_10[QINDEX_RANGE];
     116             : static int sad_per_bit16lut_12[QINDEX_RANGE];
     117             : static int sad_per_bit4lut_12[QINDEX_RANGE];
     118             : #endif
     119             : 
     120           0 : static void init_me_luts_bd(int *bit16lut, int *bit4lut, int range,
     121             :                             vpx_bit_depth_t bit_depth) {
     122             :   int i;
     123             :   // Initialize the sad lut tables using a formulaic calculation for now.
     124             :   // This is to make it easier to resolve the impact of experimental changes
     125             :   // to the quantizer tables.
     126           0 :   for (i = 0; i < range; i++) {
     127           0 :     const double q = vp9_convert_qindex_to_q(i, bit_depth);
     128           0 :     bit16lut[i] = (int)(0.0418 * q + 2.4107);
     129           0 :     bit4lut[i] = (int)(0.063 * q + 2.742);
     130             :   }
     131           0 : }
     132             : 
     133           0 : void vp9_init_me_luts(void) {
     134           0 :   init_me_luts_bd(sad_per_bit16lut_8, sad_per_bit4lut_8, QINDEX_RANGE,
     135             :                   VPX_BITS_8);
     136             : #if CONFIG_VP9_HIGHBITDEPTH
     137             :   init_me_luts_bd(sad_per_bit16lut_10, sad_per_bit4lut_10, QINDEX_RANGE,
     138             :                   VPX_BITS_10);
     139             :   init_me_luts_bd(sad_per_bit16lut_12, sad_per_bit4lut_12, QINDEX_RANGE,
     140             :                   VPX_BITS_12);
     141             : #endif
     142           0 : }
     143             : 
     144             : static const int rd_boost_factor[16] = { 64, 32, 32, 32, 24, 16, 12, 12,
     145             :                                          8,  8,  4,  4,  2,  2,  1,  0 };
     146             : static const int rd_frame_type_factor[FRAME_UPDATE_TYPES] = { 128, 144, 128,
     147             :                                                               128, 144 };
     148             : 
     149           0 : int vp9_compute_rd_mult(const VP9_COMP *cpi, int qindex) {
     150           0 :   const int64_t q = vp9_dc_quant(qindex, 0, cpi->common.bit_depth);
     151             : #if CONFIG_VP9_HIGHBITDEPTH
     152             :   int64_t rdmult = 0;
     153             :   switch (cpi->common.bit_depth) {
     154             :     case VPX_BITS_8: rdmult = 88 * q * q / 24; break;
     155             :     case VPX_BITS_10: rdmult = ROUND_POWER_OF_TWO(88 * q * q / 24, 4); break;
     156             :     case VPX_BITS_12: rdmult = ROUND_POWER_OF_TWO(88 * q * q / 24, 8); break;
     157             :     default:
     158             :       assert(0 && "bit_depth should be VPX_BITS_8, VPX_BITS_10 or VPX_BITS_12");
     159             :       return -1;
     160             :   }
     161             : #else
     162           0 :   int64_t rdmult = 88 * q * q / 24;
     163             : #endif  // CONFIG_VP9_HIGHBITDEPTH
     164           0 :   if (cpi->oxcf.pass == 2 && (cpi->common.frame_type != KEY_FRAME)) {
     165           0 :     const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
     166           0 :     const FRAME_UPDATE_TYPE frame_type = gf_group->update_type[gf_group->index];
     167           0 :     const int boost_index = VPXMIN(15, (cpi->rc.gfu_boost / 100));
     168             : 
     169           0 :     rdmult = (rdmult * rd_frame_type_factor[frame_type]) >> 7;
     170           0 :     rdmult += ((rdmult * rd_boost_factor[boost_index]) >> 7);
     171             :   }
     172           0 :   if (rdmult < 1) rdmult = 1;
     173           0 :   return (int)rdmult;
     174             : }
     175             : 
     176           0 : static int compute_rd_thresh_factor(int qindex, vpx_bit_depth_t bit_depth) {
     177             :   double q;
     178             : #if CONFIG_VP9_HIGHBITDEPTH
     179             :   switch (bit_depth) {
     180             :     case VPX_BITS_8: q = vp9_dc_quant(qindex, 0, VPX_BITS_8) / 4.0; break;
     181             :     case VPX_BITS_10: q = vp9_dc_quant(qindex, 0, VPX_BITS_10) / 16.0; break;
     182             :     case VPX_BITS_12: q = vp9_dc_quant(qindex, 0, VPX_BITS_12) / 64.0; break;
     183             :     default:
     184             :       assert(0 && "bit_depth should be VPX_BITS_8, VPX_BITS_10 or VPX_BITS_12");
     185             :       return -1;
     186             :   }
     187             : #else
     188             :   (void)bit_depth;
     189           0 :   q = vp9_dc_quant(qindex, 0, VPX_BITS_8) / 4.0;
     190             : #endif  // CONFIG_VP9_HIGHBITDEPTH
     191             :   // TODO(debargha): Adjust the function below.
     192           0 :   return VPXMAX((int)(pow(q, RD_THRESH_POW) * 5.12), 8);
     193             : }
     194             : 
     195           0 : void vp9_initialize_me_consts(VP9_COMP *cpi, MACROBLOCK *x, int qindex) {
     196             : #if CONFIG_VP9_HIGHBITDEPTH
     197             :   switch (cpi->common.bit_depth) {
     198             :     case VPX_BITS_8:
     199             :       x->sadperbit16 = sad_per_bit16lut_8[qindex];
     200             :       x->sadperbit4 = sad_per_bit4lut_8[qindex];
     201             :       break;
     202             :     case VPX_BITS_10:
     203             :       x->sadperbit16 = sad_per_bit16lut_10[qindex];
     204             :       x->sadperbit4 = sad_per_bit4lut_10[qindex];
     205             :       break;
     206             :     case VPX_BITS_12:
     207             :       x->sadperbit16 = sad_per_bit16lut_12[qindex];
     208             :       x->sadperbit4 = sad_per_bit4lut_12[qindex];
     209             :       break;
     210             :     default:
     211             :       assert(0 && "bit_depth should be VPX_BITS_8, VPX_BITS_10 or VPX_BITS_12");
     212             :   }
     213             : #else
     214             :   (void)cpi;
     215           0 :   x->sadperbit16 = sad_per_bit16lut_8[qindex];
     216           0 :   x->sadperbit4 = sad_per_bit4lut_8[qindex];
     217             : #endif  // CONFIG_VP9_HIGHBITDEPTH
     218           0 : }
     219             : 
     220           0 : static void set_block_thresholds(const VP9_COMMON *cm, RD_OPT *rd) {
     221             :   int i, bsize, segment_id;
     222             : 
     223           0 :   for (segment_id = 0; segment_id < MAX_SEGMENTS; ++segment_id) {
     224           0 :     const int qindex =
     225           0 :         clamp(vp9_get_qindex(&cm->seg, segment_id, cm->base_qindex) +
     226           0 :                   cm->y_dc_delta_q,
     227             :               0, MAXQ);
     228           0 :     const int q = compute_rd_thresh_factor(qindex, cm->bit_depth);
     229             : 
     230           0 :     for (bsize = 0; bsize < BLOCK_SIZES; ++bsize) {
     231             :       // Threshold here seems unnecessarily harsh but fine given actual
     232             :       // range of values used for cpi->sf.thresh_mult[].
     233           0 :       const int t = q * rd_thresh_block_size_factor[bsize];
     234           0 :       const int thresh_max = INT_MAX / t;
     235             : 
     236           0 :       if (bsize >= BLOCK_8X8) {
     237           0 :         for (i = 0; i < MAX_MODES; ++i)
     238           0 :           rd->threshes[segment_id][bsize][i] = rd->thresh_mult[i] < thresh_max
     239           0 :                                                    ? rd->thresh_mult[i] * t / 4
     240           0 :                                                    : INT_MAX;
     241             :       } else {
     242           0 :         for (i = 0; i < MAX_REFS; ++i)
     243           0 :           rd->threshes[segment_id][bsize][i] =
     244           0 :               rd->thresh_mult_sub8x8[i] < thresh_max
     245           0 :                   ? rd->thresh_mult_sub8x8[i] * t / 4
     246           0 :                   : INT_MAX;
     247             :       }
     248             :     }
     249             :   }
     250           0 : }
     251             : 
     252           0 : void vp9_initialize_rd_consts(VP9_COMP *cpi) {
     253           0 :   VP9_COMMON *const cm = &cpi->common;
     254           0 :   MACROBLOCK *const x = &cpi->td.mb;
     255           0 :   MACROBLOCKD *const xd = &cpi->td.mb.e_mbd;
     256           0 :   RD_OPT *const rd = &cpi->rd;
     257             :   int i;
     258             : 
     259           0 :   vpx_clear_system_state();
     260             : 
     261           0 :   rd->RDDIV = RDDIV_BITS;  // In bits (to multiply D by 128).
     262           0 :   rd->RDMULT = vp9_compute_rd_mult(cpi, cm->base_qindex + cm->y_dc_delta_q);
     263             : 
     264           0 :   set_error_per_bit(x, rd->RDMULT);
     265             : 
     266           0 :   x->select_tx_size = (cpi->sf.tx_size_search_method == USE_LARGESTALL &&
     267           0 :                        cm->frame_type != KEY_FRAME)
     268             :                           ? 0
     269           0 :                           : 1;
     270             : 
     271           0 :   set_block_thresholds(cm, rd);
     272           0 :   set_partition_probs(cm, xd);
     273             : 
     274           0 :   if (cpi->oxcf.pass == 1) {
     275           0 :     if (!frame_is_intra_only(cm))
     276           0 :       vp9_build_nmv_cost_table(
     277           0 :           x->nmvjointcost,
     278           0 :           cm->allow_high_precision_mv ? x->nmvcost_hp : x->nmvcost,
     279           0 :           &cm->fc->nmvc, cm->allow_high_precision_mv);
     280             :   } else {
     281           0 :     if (!cpi->sf.use_nonrd_pick_mode || cm->frame_type == KEY_FRAME)
     282           0 :       fill_token_costs(x->token_costs, cm->fc->coef_probs);
     283             : 
     284           0 :     if (cpi->sf.partition_search_type != VAR_BASED_PARTITION ||
     285           0 :         cm->frame_type == KEY_FRAME) {
     286           0 :       for (i = 0; i < PARTITION_CONTEXTS; ++i)
     287           0 :         vp9_cost_tokens(cpi->partition_cost[i], get_partition_probs(xd, i),
     288             :                         vp9_partition_tree);
     289             :     }
     290             : 
     291           0 :     if (!cpi->sf.use_nonrd_pick_mode || (cm->current_video_frame & 0x07) == 1 ||
     292           0 :         cm->frame_type == KEY_FRAME) {
     293           0 :       fill_mode_costs(cpi);
     294             : 
     295           0 :       if (!frame_is_intra_only(cm)) {
     296           0 :         vp9_build_nmv_cost_table(
     297           0 :             x->nmvjointcost,
     298           0 :             cm->allow_high_precision_mv ? x->nmvcost_hp : x->nmvcost,
     299           0 :             &cm->fc->nmvc, cm->allow_high_precision_mv);
     300             : 
     301           0 :         for (i = 0; i < INTER_MODE_CONTEXTS; ++i)
     302           0 :           vp9_cost_tokens((int *)cpi->inter_mode_cost[i],
     303           0 :                           cm->fc->inter_mode_probs[i], vp9_inter_mode_tree);
     304             :       }
     305             :     }
     306             :   }
     307           0 : }
     308             : 
     309           0 : static void model_rd_norm(int xsq_q10, int *r_q10, int *d_q10) {
     310             :   // NOTE: The tables below must be of the same size.
     311             : 
     312             :   // The functions described below are sampled at the four most significant
     313             :   // bits of x^2 + 8 / 256.
     314             : 
     315             :   // Normalized rate:
     316             :   // This table models the rate for a Laplacian source with given variance
     317             :   // when quantized with a uniform quantizer with given stepsize. The
     318             :   // closed form expression is:
     319             :   // Rn(x) = H(sqrt(r)) + sqrt(r)*[1 + H(r)/(1 - r)],
     320             :   // where r = exp(-sqrt(2) * x) and x = qpstep / sqrt(variance),
     321             :   // and H(x) is the binary entropy function.
     322             :   static const int rate_tab_q10[] = {
     323             :     65536, 6086, 5574, 5275, 5063, 4899, 4764, 4651, 4553, 4389, 4255, 4142,
     324             :     4044,  3958, 3881, 3811, 3748, 3635, 3538, 3453, 3376, 3307, 3244, 3186,
     325             :     3133,  3037, 2952, 2877, 2809, 2747, 2690, 2638, 2589, 2501, 2423, 2353,
     326             :     2290,  2232, 2179, 2130, 2084, 2001, 1928, 1862, 1802, 1748, 1698, 1651,
     327             :     1608,  1530, 1460, 1398, 1342, 1290, 1243, 1199, 1159, 1086, 1021, 963,
     328             :     911,   864,  821,  781,  745,  680,  623,  574,  530,  490,  455,  424,
     329             :     395,   345,  304,  269,  239,  213,  190,  171,  154,  126,  104,  87,
     330             :     73,    61,   52,   44,   38,   28,   21,   16,   12,   10,   8,    6,
     331             :     5,     3,    2,    1,    1,    1,    0,    0,
     332             :   };
     333             : 
     334             :   // Normalized distortion:
     335             :   // This table models the normalized distortion for a Laplacian source
     336             :   // with given variance when quantized with a uniform quantizer
     337             :   // with given stepsize. The closed form expression is:
     338             :   // Dn(x) = 1 - 1/sqrt(2) * x / sinh(x/sqrt(2))
     339             :   // where x = qpstep / sqrt(variance).
     340             :   // Note the actual distortion is Dn * variance.
     341             :   static const int dist_tab_q10[] = {
     342             :     0,    0,    1,    1,    1,    2,    2,    2,    3,    3,    4,    5,
     343             :     5,    6,    7,    7,    8,    9,    11,   12,   13,   15,   16,   17,
     344             :     18,   21,   24,   26,   29,   31,   34,   36,   39,   44,   49,   54,
     345             :     59,   64,   69,   73,   78,   88,   97,   106,  115,  124,  133,  142,
     346             :     151,  167,  184,  200,  215,  231,  245,  260,  274,  301,  327,  351,
     347             :     375,  397,  418,  439,  458,  495,  528,  559,  587,  613,  637,  659,
     348             :     680,  717,  749,  777,  801,  823,  842,  859,  874,  899,  919,  936,
     349             :     949,  960,  969,  977,  983,  994,  1001, 1006, 1010, 1013, 1015, 1017,
     350             :     1018, 1020, 1022, 1022, 1023, 1023, 1023, 1024,
     351             :   };
     352             :   static const int xsq_iq_q10[] = {
     353             :     0,      4,      8,      12,     16,     20,     24,     28,     32,
     354             :     40,     48,     56,     64,     72,     80,     88,     96,     112,
     355             :     128,    144,    160,    176,    192,    208,    224,    256,    288,
     356             :     320,    352,    384,    416,    448,    480,    544,    608,    672,
     357             :     736,    800,    864,    928,    992,    1120,   1248,   1376,   1504,
     358             :     1632,   1760,   1888,   2016,   2272,   2528,   2784,   3040,   3296,
     359             :     3552,   3808,   4064,   4576,   5088,   5600,   6112,   6624,   7136,
     360             :     7648,   8160,   9184,   10208,  11232,  12256,  13280,  14304,  15328,
     361             :     16352,  18400,  20448,  22496,  24544,  26592,  28640,  30688,  32736,
     362             :     36832,  40928,  45024,  49120,  53216,  57312,  61408,  65504,  73696,
     363             :     81888,  90080,  98272,  106464, 114656, 122848, 131040, 147424, 163808,
     364             :     180192, 196576, 212960, 229344, 245728,
     365             :   };
     366           0 :   const int tmp = (xsq_q10 >> 2) + 8;
     367           0 :   const int k = get_msb(tmp) - 3;
     368           0 :   const int xq = (k << 3) + ((tmp >> k) & 0x7);
     369           0 :   const int one_q10 = 1 << 10;
     370           0 :   const int a_q10 = ((xsq_q10 - xsq_iq_q10[xq]) << 10) >> (2 + k);
     371           0 :   const int b_q10 = one_q10 - a_q10;
     372           0 :   *r_q10 = (rate_tab_q10[xq] * b_q10 + rate_tab_q10[xq + 1] * a_q10) >> 10;
     373           0 :   *d_q10 = (dist_tab_q10[xq] * b_q10 + dist_tab_q10[xq + 1] * a_q10) >> 10;
     374           0 : }
     375             : 
     376           0 : void vp9_model_rd_from_var_lapndz(unsigned int var, unsigned int n_log2,
     377             :                                   unsigned int qstep, int *rate,
     378             :                                   int64_t *dist) {
     379             :   // This function models the rate and distortion for a Laplacian
     380             :   // source with given variance when quantized with a uniform quantizer
     381             :   // with given stepsize. The closed form expressions are in:
     382             :   // Hang and Chen, "Source Model for transform video coder and its
     383             :   // application - Part I: Fundamental Theory", IEEE Trans. Circ.
     384             :   // Sys. for Video Tech., April 1997.
     385           0 :   if (var == 0) {
     386           0 :     *rate = 0;
     387           0 :     *dist = 0;
     388             :   } else {
     389             :     int d_q10, r_q10;
     390             :     static const uint32_t MAX_XSQ_Q10 = 245727;
     391           0 :     const uint64_t xsq_q10_64 =
     392           0 :         (((uint64_t)qstep * qstep << (n_log2 + 10)) + (var >> 1)) / var;
     393           0 :     const int xsq_q10 = (int)VPXMIN(xsq_q10_64, MAX_XSQ_Q10);
     394           0 :     model_rd_norm(xsq_q10, &r_q10, &d_q10);
     395           0 :     *rate = ROUND_POWER_OF_TWO(r_q10 << n_log2, 10 - VP9_PROB_COST_SHIFT);
     396           0 :     *dist = (var * (int64_t)d_q10 + 512) >> 10;
     397             :   }
     398           0 : }
     399             : 
     400           0 : void vp9_get_entropy_contexts(BLOCK_SIZE bsize, TX_SIZE tx_size,
     401             :                               const struct macroblockd_plane *pd,
     402             :                               ENTROPY_CONTEXT t_above[16],
     403             :                               ENTROPY_CONTEXT t_left[16]) {
     404           0 :   const BLOCK_SIZE plane_bsize = get_plane_block_size(bsize, pd);
     405           0 :   const int num_4x4_w = num_4x4_blocks_wide_lookup[plane_bsize];
     406           0 :   const int num_4x4_h = num_4x4_blocks_high_lookup[plane_bsize];
     407           0 :   const ENTROPY_CONTEXT *const above = pd->above_context;
     408           0 :   const ENTROPY_CONTEXT *const left = pd->left_context;
     409             : 
     410             :   int i;
     411           0 :   switch (tx_size) {
     412             :     case TX_4X4:
     413           0 :       memcpy(t_above, above, sizeof(ENTROPY_CONTEXT) * num_4x4_w);
     414           0 :       memcpy(t_left, left, sizeof(ENTROPY_CONTEXT) * num_4x4_h);
     415           0 :       break;
     416             :     case TX_8X8:
     417           0 :       for (i = 0; i < num_4x4_w; i += 2)
     418           0 :         t_above[i] = !!*(const uint16_t *)&above[i];
     419           0 :       for (i = 0; i < num_4x4_h; i += 2)
     420           0 :         t_left[i] = !!*(const uint16_t *)&left[i];
     421           0 :       break;
     422             :     case TX_16X16:
     423           0 :       for (i = 0; i < num_4x4_w; i += 4)
     424           0 :         t_above[i] = !!*(const uint32_t *)&above[i];
     425           0 :       for (i = 0; i < num_4x4_h; i += 4)
     426           0 :         t_left[i] = !!*(const uint32_t *)&left[i];
     427           0 :       break;
     428             :     case TX_32X32:
     429           0 :       for (i = 0; i < num_4x4_w; i += 8)
     430           0 :         t_above[i] = !!*(const uint64_t *)&above[i];
     431           0 :       for (i = 0; i < num_4x4_h; i += 8)
     432           0 :         t_left[i] = !!*(const uint64_t *)&left[i];
     433           0 :       break;
     434           0 :     default: assert(0 && "Invalid transform size."); break;
     435             :   }
     436           0 : }
     437             : 
     438           0 : void vp9_mv_pred(VP9_COMP *cpi, MACROBLOCK *x, uint8_t *ref_y_buffer,
     439             :                  int ref_y_stride, int ref_frame, BLOCK_SIZE block_size) {
     440             :   int i;
     441           0 :   int zero_seen = 0;
     442           0 :   int best_index = 0;
     443           0 :   int best_sad = INT_MAX;
     444           0 :   int this_sad = INT_MAX;
     445           0 :   int max_mv = 0;
     446             :   int near_same_nearest;
     447           0 :   uint8_t *src_y_ptr = x->plane[0].src.buf;
     448             :   uint8_t *ref_y_ptr;
     449           0 :   const int num_mv_refs =
     450             :       MAX_MV_REF_CANDIDATES +
     451           0 :       (cpi->sf.adaptive_motion_search && block_size < x->max_partition_size);
     452             : 
     453             :   MV pred_mv[3];
     454           0 :   pred_mv[0] = x->mbmi_ext->ref_mvs[ref_frame][0].as_mv;
     455           0 :   pred_mv[1] = x->mbmi_ext->ref_mvs[ref_frame][1].as_mv;
     456           0 :   pred_mv[2] = x->pred_mv[ref_frame];
     457           0 :   assert(num_mv_refs <= (int)(sizeof(pred_mv) / sizeof(pred_mv[0])));
     458             : 
     459           0 :   near_same_nearest = x->mbmi_ext->ref_mvs[ref_frame][0].as_int ==
     460           0 :                       x->mbmi_ext->ref_mvs[ref_frame][1].as_int;
     461             :   // Get the sad for each candidate reference mv.
     462           0 :   for (i = 0; i < num_mv_refs; ++i) {
     463           0 :     const MV *this_mv = &pred_mv[i];
     464             :     int fp_row, fp_col;
     465             : 
     466           0 :     if (i == 1 && near_same_nearest) continue;
     467           0 :     fp_row = (this_mv->row + 3 + (this_mv->row >= 0)) >> 3;
     468           0 :     fp_col = (this_mv->col + 3 + (this_mv->col >= 0)) >> 3;
     469           0 :     max_mv = VPXMAX(max_mv, VPXMAX(abs(this_mv->row), abs(this_mv->col)) >> 3);
     470             : 
     471           0 :     if (fp_row == 0 && fp_col == 0 && zero_seen) continue;
     472           0 :     zero_seen |= (fp_row == 0 && fp_col == 0);
     473             : 
     474           0 :     ref_y_ptr = &ref_y_buffer[ref_y_stride * fp_row + fp_col];
     475             :     // Find sad for current vector.
     476           0 :     this_sad = cpi->fn_ptr[block_size].sdf(src_y_ptr, x->plane[0].src.stride,
     477             :                                            ref_y_ptr, ref_y_stride);
     478             :     // Note if it is the best so far.
     479           0 :     if (this_sad < best_sad) {
     480           0 :       best_sad = this_sad;
     481           0 :       best_index = i;
     482             :     }
     483             :   }
     484             : 
     485             :   // Note the index of the mv that worked best in the reference list.
     486           0 :   x->mv_best_ref_index[ref_frame] = best_index;
     487           0 :   x->max_mv_context[ref_frame] = max_mv;
     488           0 :   x->pred_mv_sad[ref_frame] = best_sad;
     489           0 : }
     490             : 
     491           0 : void vp9_setup_pred_block(const MACROBLOCKD *xd,
     492             :                           struct buf_2d dst[MAX_MB_PLANE],
     493             :                           const YV12_BUFFER_CONFIG *src, int mi_row, int mi_col,
     494             :                           const struct scale_factors *scale,
     495             :                           const struct scale_factors *scale_uv) {
     496             :   int i;
     497             : 
     498           0 :   dst[0].buf = src->y_buffer;
     499           0 :   dst[0].stride = src->y_stride;
     500           0 :   dst[1].buf = src->u_buffer;
     501           0 :   dst[2].buf = src->v_buffer;
     502           0 :   dst[1].stride = dst[2].stride = src->uv_stride;
     503             : 
     504           0 :   for (i = 0; i < MAX_MB_PLANE; ++i) {
     505           0 :     setup_pred_plane(dst + i, dst[i].buf, dst[i].stride, mi_row, mi_col,
     506             :                      i ? scale_uv : scale, xd->plane[i].subsampling_x,
     507             :                      xd->plane[i].subsampling_y);
     508             :   }
     509           0 : }
     510             : 
     511           0 : int vp9_raster_block_offset(BLOCK_SIZE plane_bsize, int raster_block,
     512             :                             int stride) {
     513           0 :   const int bw = b_width_log2_lookup[plane_bsize];
     514           0 :   const int y = 4 * (raster_block >> bw);
     515           0 :   const int x = 4 * (raster_block & ((1 << bw) - 1));
     516           0 :   return y * stride + x;
     517             : }
     518             : 
     519           0 : int16_t *vp9_raster_block_offset_int16(BLOCK_SIZE plane_bsize, int raster_block,
     520             :                                        int16_t *base) {
     521           0 :   const int stride = 4 * num_4x4_blocks_wide_lookup[plane_bsize];
     522           0 :   return base + vp9_raster_block_offset(plane_bsize, raster_block, stride);
     523             : }
     524             : 
     525           0 : YV12_BUFFER_CONFIG *vp9_get_scaled_ref_frame(const VP9_COMP *cpi,
     526             :                                              int ref_frame) {
     527           0 :   const VP9_COMMON *const cm = &cpi->common;
     528           0 :   const int scaled_idx = cpi->scaled_ref_idx[ref_frame - 1];
     529           0 :   const int ref_idx = get_ref_frame_buf_idx(cpi, ref_frame);
     530           0 :   return (scaled_idx != ref_idx && scaled_idx != INVALID_IDX)
     531           0 :              ? &cm->buffer_pool->frame_bufs[scaled_idx].buf
     532           0 :              : NULL;
     533             : }
     534             : 
     535           0 : int vp9_get_switchable_rate(const VP9_COMP *cpi, const MACROBLOCKD *const xd) {
     536           0 :   const MODE_INFO *const mi = xd->mi[0];
     537           0 :   const int ctx = get_pred_context_switchable_interp(xd);
     538           0 :   return SWITCHABLE_INTERP_RATE_FACTOR *
     539           0 :          cpi->switchable_interp_costs[ctx][mi->interp_filter];
     540             : }
     541             : 
     542           0 : void vp9_set_rd_speed_thresholds(VP9_COMP *cpi) {
     543             :   int i;
     544           0 :   RD_OPT *const rd = &cpi->rd;
     545           0 :   SPEED_FEATURES *const sf = &cpi->sf;
     546             : 
     547             :   // Set baseline threshold values.
     548           0 :   for (i = 0; i < MAX_MODES; ++i)
     549           0 :     rd->thresh_mult[i] = cpi->oxcf.mode == BEST ? -500 : 0;
     550             : 
     551           0 :   if (sf->adaptive_rd_thresh) {
     552           0 :     rd->thresh_mult[THR_NEARESTMV] = 300;
     553           0 :     rd->thresh_mult[THR_NEARESTG] = 300;
     554           0 :     rd->thresh_mult[THR_NEARESTA] = 300;
     555             :   } else {
     556           0 :     rd->thresh_mult[THR_NEARESTMV] = 0;
     557           0 :     rd->thresh_mult[THR_NEARESTG] = 0;
     558           0 :     rd->thresh_mult[THR_NEARESTA] = 0;
     559             :   }
     560             : 
     561           0 :   rd->thresh_mult[THR_DC] += 1000;
     562             : 
     563           0 :   rd->thresh_mult[THR_NEWMV] += 1000;
     564           0 :   rd->thresh_mult[THR_NEWA] += 1000;
     565           0 :   rd->thresh_mult[THR_NEWG] += 1000;
     566             : 
     567           0 :   rd->thresh_mult[THR_NEARMV] += 1000;
     568           0 :   rd->thresh_mult[THR_NEARA] += 1000;
     569           0 :   rd->thresh_mult[THR_COMP_NEARESTLA] += 1000;
     570           0 :   rd->thresh_mult[THR_COMP_NEARESTGA] += 1000;
     571             : 
     572           0 :   rd->thresh_mult[THR_TM] += 1000;
     573             : 
     574           0 :   rd->thresh_mult[THR_COMP_NEARLA] += 1500;
     575           0 :   rd->thresh_mult[THR_COMP_NEWLA] += 2000;
     576           0 :   rd->thresh_mult[THR_NEARG] += 1000;
     577           0 :   rd->thresh_mult[THR_COMP_NEARGA] += 1500;
     578           0 :   rd->thresh_mult[THR_COMP_NEWGA] += 2000;
     579             : 
     580           0 :   rd->thresh_mult[THR_ZEROMV] += 2000;
     581           0 :   rd->thresh_mult[THR_ZEROG] += 2000;
     582           0 :   rd->thresh_mult[THR_ZEROA] += 2000;
     583           0 :   rd->thresh_mult[THR_COMP_ZEROLA] += 2500;
     584           0 :   rd->thresh_mult[THR_COMP_ZEROGA] += 2500;
     585             : 
     586           0 :   rd->thresh_mult[THR_H_PRED] += 2000;
     587           0 :   rd->thresh_mult[THR_V_PRED] += 2000;
     588           0 :   rd->thresh_mult[THR_D45_PRED] += 2500;
     589           0 :   rd->thresh_mult[THR_D135_PRED] += 2500;
     590           0 :   rd->thresh_mult[THR_D117_PRED] += 2500;
     591           0 :   rd->thresh_mult[THR_D153_PRED] += 2500;
     592           0 :   rd->thresh_mult[THR_D207_PRED] += 2500;
     593           0 :   rd->thresh_mult[THR_D63_PRED] += 2500;
     594           0 : }
     595             : 
     596           0 : void vp9_set_rd_speed_thresholds_sub8x8(VP9_COMP *cpi) {
     597             :   static const int thresh_mult[2][MAX_REFS] = {
     598             :     { 2500, 2500, 2500, 4500, 4500, 2500 },
     599             :     { 2000, 2000, 2000, 4000, 4000, 2000 }
     600             :   };
     601           0 :   RD_OPT *const rd = &cpi->rd;
     602           0 :   const int idx = cpi->oxcf.mode == BEST;
     603           0 :   memcpy(rd->thresh_mult_sub8x8, thresh_mult[idx], sizeof(thresh_mult[idx]));
     604           0 : }
     605             : 
     606           0 : void vp9_update_rd_thresh_fact(int (*factor_buf)[MAX_MODES], int rd_thresh,
     607             :                                int bsize, int best_mode_index) {
     608           0 :   if (rd_thresh > 0) {
     609           0 :     const int top_mode = bsize < BLOCK_8X8 ? MAX_REFS : MAX_MODES;
     610             :     int mode;
     611           0 :     for (mode = 0; mode < top_mode; ++mode) {
     612           0 :       const BLOCK_SIZE min_size = VPXMAX(bsize - 1, BLOCK_4X4);
     613           0 :       const BLOCK_SIZE max_size = VPXMIN(bsize + 2, BLOCK_64X64);
     614             :       BLOCK_SIZE bs;
     615           0 :       for (bs = min_size; bs <= max_size; ++bs) {
     616           0 :         int *const fact = &factor_buf[bs][mode];
     617           0 :         if (mode == best_mode_index) {
     618           0 :           *fact -= (*fact >> 4);
     619             :         } else {
     620           0 :           *fact = VPXMIN(*fact + RD_THRESH_INC, rd_thresh * RD_THRESH_MAX_FACT);
     621             :         }
     622             :       }
     623             :     }
     624             :   }
     625           0 : }
     626             : 
     627           0 : int vp9_get_intra_cost_penalty(int qindex, int qdelta,
     628             :                                vpx_bit_depth_t bit_depth) {
     629           0 :   const int q = vp9_dc_quant(qindex, qdelta, bit_depth);
     630             : #if CONFIG_VP9_HIGHBITDEPTH
     631             :   switch (bit_depth) {
     632             :     case VPX_BITS_8: return 20 * q;
     633             :     case VPX_BITS_10: return 5 * q;
     634             :     case VPX_BITS_12: return ROUND_POWER_OF_TWO(5 * q, 2);
     635             :     default:
     636             :       assert(0 && "bit_depth should be VPX_BITS_8, VPX_BITS_10 or VPX_BITS_12");
     637             :       return -1;
     638             :   }
     639             : #else
     640           0 :   return 20 * q;
     641             : #endif  // CONFIG_VP9_HIGHBITDEPTH
     642             : }

Generated by: LCOV version 1.13