Coverage Report

Created: 2026-02-26 06:46

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libvpx/vp8/encoder/rdopt.c
Line
Count
Source
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 <stdio.h>
13
#include <math.h>
14
#include <limits.h>
15
#include <assert.h>
16
#include "vpx_config.h"
17
#include "vp8_rtcd.h"
18
#include "./vpx_dsp_rtcd.h"
19
#include "encodeframe.h"
20
#include "tokenize.h"
21
#include "treewriter.h"
22
#include "onyx_int.h"
23
#include "modecosts.h"
24
#include "encodeintra.h"
25
#include "pickinter.h"
26
#include "vp8/common/common.h"
27
#include "vp8/common/entropymode.h"
28
#include "vp8/common/reconinter.h"
29
#include "vp8/common/reconintra.h"
30
#include "vp8/common/reconintra4x4.h"
31
#include "vp8/common/findnearmv.h"
32
#include "vp8/common/quant_common.h"
33
#include "encodemb.h"
34
#include "vp8/encoder/quantize.h"
35
#include "vpx_dsp/variance.h"
36
#include "vpx_ports/system_state.h"
37
#include "mcomp.h"
38
#include "rdopt.h"
39
#include "vpx_mem/vpx_mem.h"
40
#include "vp8/common/systemdependent.h"
41
#if CONFIG_TEMPORAL_DENOISING
42
#include "denoising.h"
43
#endif
44
extern void vp8_update_zbin_extra(VP8_COMP *cpi, MACROBLOCK *x);
45
46
778k
#define MAXF(a, b) (((a) > (b)) ? (a) : (b))
47
48
typedef struct rate_distortion_struct {
49
  int rate2;
50
  int rate_y;
51
  int rate_uv;
52
  int distortion2;
53
  int distortion_uv;
54
} RATE_DISTORTION;
55
56
typedef struct best_mode_struct {
57
  int yrd;
58
  int rd;
59
  int intra_rd;
60
  MB_MODE_INFO mbmode;
61
  union b_mode_info bmodes[16];
62
  PARTITION_INFO partition;
63
} BEST_MODE;
64
65
static const int auto_speed_thresh[17] = { 1000, 200, 150, 130, 150, 125,
66
                                           120,  115, 115, 115, 115, 115,
67
                                           115,  115, 115, 115, 105 };
68
69
const MB_PREDICTION_MODE vp8_mode_order[MAX_MODES] = {
70
  ZEROMV,    DC_PRED,
71
72
  NEARESTMV, NEARMV,
73
74
  ZEROMV,    NEARESTMV,
75
76
  ZEROMV,    NEARESTMV,
77
78
  NEARMV,    NEARMV,
79
80
  V_PRED,    H_PRED,    TM_PRED,
81
82
  NEWMV,     NEWMV,     NEWMV,
83
84
  SPLITMV,   SPLITMV,   SPLITMV,
85
86
  B_PRED,
87
};
88
89
/* This table determines the search order in reference frame priority order,
90
 * which may not necessarily match INTRA,LAST,GOLDEN,ARF
91
 */
92
const int vp8_ref_frame_order[MAX_MODES] = {
93
  1, 0,
94
95
  1, 1,
96
97
  2, 2,
98
99
  3, 3,
100
101
  2, 3,
102
103
  0, 0, 0,
104
105
  1, 2, 3,
106
107
  1, 2, 3,
108
109
  0,
110
};
111
112
static void fill_token_costs(
113
    int c[BLOCK_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS][MAX_ENTROPY_TOKENS],
114
    const vp8_prob p[BLOCK_TYPES][COEF_BANDS][PREV_COEF_CONTEXTS]
115
415k
                    [ENTROPY_NODES]) {
116
415k
  int i, j, k;
117
118
2.07M
  for (i = 0; i < BLOCK_TYPES; ++i) {
119
14.9M
    for (j = 0; j < COEF_BANDS; ++j) {
120
53.2M
      for (k = 0; k < PREV_COEF_CONTEXTS; ++k) {
121
        /* check for pt=0 and band > 1 if block type 0
122
         * and 0 if blocktype 1
123
         */
124
39.9M
        if (k == 0 && j > (i == 0)) {
125
11.2M
          vp8_cost_tokens2(c[i][j][k], p[i][j][k], vp8_coef_tree, 2);
126
28.6M
        } else {
127
28.6M
          vp8_cost_tokens(c[i][j][k], p[i][j][k], vp8_coef_tree);
128
28.6M
        }
129
39.9M
      }
130
13.3M
    }
131
1.66M
  }
132
415k
}
133
134
static const int rd_iifactor[32] = { 4, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0,
135
                                     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
136
                                     0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
137
138
/* values are now correlated to quantizer */
139
static const int sad_per_bit16lut[QINDEX_RANGE] = {
140
  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  3,  3,  3,
141
  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  4,  4,  4,  4,  4,  4,  4,  4,
142
  4,  4,  4,  4,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,  6,  6,  6,
143
  6,  6,  6,  6,  6,  6,  6,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
144
  7,  7,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  9,  9,  9,  9,  9,
145
  9,  9,  9,  9,  9,  9,  9,  10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11,
146
  11, 11, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14
147
};
148
static const int sad_per_bit4lut[QINDEX_RANGE] = {
149
  2,  2,  2,  2,  2,  2,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,  3,
150
  3,  4,  4,  4,  4,  4,  4,  4,  4,  4,  4,  5,  5,  5,  5,  5,  5,  6,  6,
151
  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  7,  7,  7,  7,  7,  7,  7,  7,  7,
152
  7,  7,  7,  7,  8,  8,  8,  8,  8,  9,  9,  9,  9,  9,  9,  10, 10, 10, 10,
153
  10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12,
154
  12, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16,
155
  16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20,
156
};
157
158
415k
void vp8cx_initialize_me_consts(VP8_COMP *cpi, int QIndex) {
159
415k
  cpi->mb.sadperbit16 = sad_per_bit16lut[QIndex];
160
415k
  cpi->mb.sadperbit4 = sad_per_bit4lut[QIndex];
161
415k
}
162
163
415k
void vp8_initialize_rd_consts(VP8_COMP *cpi, MACROBLOCK *x, int Qvalue) {
164
415k
  int q;
165
415k
  int i;
166
415k
  double capped_q = (Qvalue < 160) ? (double)Qvalue : 160.0;
167
415k
  double rdconst = 2.80;
168
169
415k
  vpx_clear_system_state();
170
171
  /* Further tests required to see if optimum is different
172
   * for key frames, golden frames and arf frames.
173
   */
174
415k
  cpi->RDMULT = (int)(rdconst * (capped_q * capped_q));
175
176
  /* Extend rate multiplier along side quantizer zbin increases */
177
415k
  if (cpi->mb.zbin_over_quant > 0) {
178
119k
    double oq_factor;
179
119k
    double modq;
180
181
    /* Experimental code using the same basic equation as used for Q above
182
     * The units of cpi->mb.zbin_over_quant are 1/128 of Q bin size
183
     */
184
119k
    oq_factor = 1.0 + ((double)0.0015625 * cpi->mb.zbin_over_quant);
185
119k
    modq = (int)((double)capped_q * oq_factor);
186
119k
    cpi->RDMULT = (int)(rdconst * (modq * modq));
187
119k
  }
188
189
415k
  if (cpi->pass == 2 && (cpi->common.frame_type != KEY_FRAME)) {
190
0
    if (cpi->twopass.next_iiratio > 31) {
191
0
      cpi->RDMULT += (cpi->RDMULT * rd_iifactor[31]) >> 4;
192
0
    } else {
193
0
      cpi->RDMULT +=
194
0
          (cpi->RDMULT * rd_iifactor[cpi->twopass.next_iiratio]) >> 4;
195
0
    }
196
0
  }
197
198
415k
  cpi->mb.errorperbit = (cpi->RDMULT / 110);
199
415k
  cpi->mb.errorperbit += (cpi->mb.errorperbit == 0);
200
201
415k
  vp8_set_speed_features(cpi);
202
203
8.73M
  for (i = 0; i < MAX_MODES; ++i) {
204
8.31M
    x->mode_test_hit_counts[i] = 0;
205
8.31M
  }
206
207
415k
  q = (int)pow(Qvalue, 1.25);
208
209
415k
  if (q < 8) q = 8;
210
211
415k
  if (cpi->RDMULT > 1000) {
212
249k
    cpi->RDDIV = 1;
213
249k
    cpi->RDMULT /= 100;
214
215
5.23M
    for (i = 0; i < MAX_MODES; ++i) {
216
4.98M
      if (cpi->sf.thresh_mult[i] < INT_MAX) {
217
4.72M
        x->rd_threshes[i] = cpi->sf.thresh_mult[i] * q / 100;
218
4.72M
      } else {
219
261k
        x->rd_threshes[i] = INT_MAX;
220
261k
      }
221
222
4.98M
      cpi->rd_baseline_thresh[i] = x->rd_threshes[i];
223
4.98M
    }
224
249k
  } else {
225
166k
    cpi->RDDIV = 100;
226
227
3.49M
    for (i = 0; i < MAX_MODES; ++i) {
228
3.33M
      if (cpi->sf.thresh_mult[i] < (INT_MAX / q)) {
229
3.17M
        x->rd_threshes[i] = cpi->sf.thresh_mult[i] * q;
230
3.17M
      } else {
231
156k
        x->rd_threshes[i] = INT_MAX;
232
156k
      }
233
234
3.33M
      cpi->rd_baseline_thresh[i] = x->rd_threshes[i];
235
3.33M
    }
236
166k
  }
237
238
415k
  {
239
    /* build token cost array for the type of frame we have now */
240
415k
    FRAME_CONTEXT *l = &cpi->lfc_n;
241
242
415k
    if (cpi->common.refresh_alt_ref_frame) {
243
57.8k
      l = &cpi->lfc_a;
244
358k
    } else if (cpi->common.refresh_golden_frame) {
245
0
      l = &cpi->lfc_g;
246
0
    }
247
248
415k
    fill_token_costs(cpi->mb.token_costs,
249
415k
                     (const vp8_prob(*)[8][3][11])l->coef_probs);
250
    /*
251
    fill_token_costs(
252
        cpi->mb.token_costs,
253
        (const vp8_prob( *)[8][3][11]) cpi->common.fc.coef_probs);
254
    */
255
256
    /* TODO make these mode costs depend on last,alt or gold too.  (jbb) */
257
415k
    vp8_init_mode_costs(cpi);
258
415k
  }
259
415k
}
260
261
139k
void vp8_auto_select_speed(VP8_COMP *cpi) {
262
139k
  int milliseconds_for_compress = (int)(1000000 / cpi->framerate);
263
264
139k
  milliseconds_for_compress =
265
139k
      milliseconds_for_compress * (16 - cpi->oxcf.cpu_used) / 16;
266
267
#if 0
268
269
    if (0)
270
    {
271
        FILE *f;
272
273
        f = fopen("speed.stt", "a");
274
        fprintf(f, " %8ld %10ld %10ld %10ld\n",
275
                cpi->common.current_video_frame, cpi->Speed, milliseconds_for_compress, cpi->avg_pick_mode_time);
276
        fclose(f);
277
    }
278
279
#endif
280
281
139k
  if (cpi->avg_pick_mode_time < milliseconds_for_compress &&
282
139k
      (cpi->avg_encode_time - cpi->avg_pick_mode_time) <
283
139k
          milliseconds_for_compress) {
284
139k
    if (cpi->avg_pick_mode_time == 0) {
285
4.91k
      cpi->Speed = 4;
286
134k
    } else {
287
134k
      if (milliseconds_for_compress * 100 < cpi->avg_encode_time * 95) {
288
0
        cpi->Speed += 2;
289
0
        cpi->avg_pick_mode_time = 0;
290
0
        cpi->avg_encode_time = 0;
291
292
0
        if (cpi->Speed > 16) {
293
0
          cpi->Speed = 16;
294
0
        }
295
0
      }
296
297
134k
      if (milliseconds_for_compress * 100 >
298
134k
          cpi->avg_encode_time * auto_speed_thresh[cpi->Speed]) {
299
134k
        cpi->Speed -= 1;
300
134k
        cpi->avg_pick_mode_time = 0;
301
134k
        cpi->avg_encode_time = 0;
302
303
        /* In real-time mode, cpi->speed is in [4, 16]. */
304
134k
        if (cpi->Speed < 4) {
305
134k
          cpi->Speed = 4;
306
134k
        }
307
134k
      }
308
134k
    }
309
139k
  } else {
310
0
    cpi->Speed += 4;
311
312
0
    if (cpi->Speed > 16) cpi->Speed = 16;
313
314
0
    cpi->avg_pick_mode_time = 0;
315
0
    cpi->avg_encode_time = 0;
316
0
  }
317
139k
}
318
319
0
int vp8_block_error_c(short *coeff, short *dqcoeff) {
320
0
  int i;
321
0
  int error = 0;
322
323
0
  for (i = 0; i < 16; ++i) {
324
0
    int this_diff = coeff[i] - dqcoeff[i];
325
0
    error += this_diff * this_diff;
326
0
  }
327
328
0
  return error;
329
0
}
330
331
0
int vp8_mbblock_error_c(MACROBLOCK *mb, int dc) {
332
0
  BLOCK *be;
333
0
  BLOCKD *bd;
334
0
  int i, j;
335
0
  int berror, error = 0;
336
337
0
  for (i = 0; i < 16; ++i) {
338
0
    be = &mb->block[i];
339
0
    bd = &mb->e_mbd.block[i];
340
341
0
    berror = 0;
342
343
0
    for (j = dc; j < 16; ++j) {
344
0
      int this_diff = be->coeff[j] - bd->dqcoeff[j];
345
0
      berror += this_diff * this_diff;
346
0
    }
347
348
0
    error += berror;
349
0
  }
350
351
0
  return error;
352
0
}
353
354
0
int vp8_mbuverror_c(MACROBLOCK *mb) {
355
0
  BLOCK *be;
356
0
  BLOCKD *bd;
357
358
0
  int i;
359
0
  int error = 0;
360
361
0
  for (i = 16; i < 24; ++i) {
362
0
    be = &mb->block[i];
363
0
    bd = &mb->e_mbd.block[i];
364
365
0
    error += vp8_block_error_c(be->coeff, bd->dqcoeff);
366
0
  }
367
368
0
  return error;
369
0
}
370
371
67.7k
int VP8_UVSSE(MACROBLOCK *x) {
372
67.7k
  unsigned char *uptr, *vptr;
373
67.7k
  unsigned char *upred_ptr = (*(x->block[16].base_src) + x->block[16].src);
374
67.7k
  unsigned char *vpred_ptr = (*(x->block[20].base_src) + x->block[20].src);
375
67.7k
  int uv_stride = x->block[16].src_stride;
376
377
67.7k
  unsigned int sse1 = 0;
378
67.7k
  unsigned int sse2 = 0;
379
67.7k
  int mv_row = x->e_mbd.mode_info_context->mbmi.mv.as_mv.row;
380
67.7k
  int mv_col = x->e_mbd.mode_info_context->mbmi.mv.as_mv.col;
381
67.7k
  int offset;
382
67.7k
  int pre_stride = x->e_mbd.pre.uv_stride;
383
384
67.7k
  if (mv_row < 0) {
385
2.99k
    mv_row -= 1;
386
64.7k
  } else {
387
64.7k
    mv_row += 1;
388
64.7k
  }
389
390
67.7k
  if (mv_col < 0) {
391
3.09k
    mv_col -= 1;
392
64.6k
  } else {
393
64.6k
    mv_col += 1;
394
64.6k
  }
395
396
67.7k
  mv_row /= 2;
397
67.7k
  mv_col /= 2;
398
399
67.7k
  offset = (mv_row >> 3) * pre_stride + (mv_col >> 3);
400
67.7k
  uptr = x->e_mbd.pre.u_buffer + offset;
401
67.7k
  vptr = x->e_mbd.pre.v_buffer + offset;
402
403
67.7k
  if ((mv_row | mv_col) & 7) {
404
6.24k
    vpx_sub_pixel_variance8x8(uptr, pre_stride, mv_col & 7, mv_row & 7,
405
6.24k
                              upred_ptr, uv_stride, &sse2);
406
6.24k
    vpx_sub_pixel_variance8x8(vptr, pre_stride, mv_col & 7, mv_row & 7,
407
6.24k
                              vpred_ptr, uv_stride, &sse1);
408
6.24k
    sse2 += sse1;
409
61.4k
  } else {
410
61.4k
    vpx_variance8x8(uptr, pre_stride, upred_ptr, uv_stride, &sse2);
411
61.4k
    vpx_variance8x8(vptr, pre_stride, vpred_ptr, uv_stride, &sse1);
412
61.4k
    sse2 += sse1;
413
61.4k
  }
414
67.7k
  return sse2;
415
67.7k
}
416
417
static int cost_coeffs(MACROBLOCK *mb, BLOCKD *b, int type, ENTROPY_CONTEXT *a,
418
443M
                       ENTROPY_CONTEXT *l) {
419
443M
  int c = !type; /* start at coef 0, unless Y with Y2 */
420
443M
  int eob = (int)(*b->eob);
421
443M
  int pt; /* surrounding block/prev coef predictor */
422
443M
  int cost = 0;
423
443M
  short *qcoeff_ptr = b->qcoeff;
424
425
443M
  VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
426
427
443M
  assert(eob <= 16);
428
3.92G
  for (; c < eob; ++c) {
429
3.48G
    const int v = qcoeff_ptr[vp8_default_zig_zag1d[c]];
430
3.48G
    const int t = vp8_dct_value_tokens_ptr[v].Token;
431
3.48G
    cost += mb->token_costs[type][vp8_coef_bands[c]][pt][t];
432
3.48G
    cost += vp8_dct_value_cost_ptr[v];
433
3.48G
    pt = vp8_prev_token_class[t];
434
3.48G
  }
435
436
443M
  if (c < 16) {
437
337M
    cost += mb->token_costs[type][vp8_coef_bands[c]][pt][DCT_EOB_TOKEN];
438
337M
  }
439
440
443M
  pt = (c != !type); /* is eob first coefficient; */
441
443M
  *a = *l = pt;
442
443
443M
  return cost;
444
443M
}
445
446
7.13M
static int vp8_rdcost_mby(MACROBLOCK *mb) {
447
7.13M
  int cost = 0;
448
7.13M
  int b;
449
7.13M
  MACROBLOCKD *x = &mb->e_mbd;
450
7.13M
  ENTROPY_CONTEXT_PLANES t_above, t_left;
451
7.13M
  ENTROPY_CONTEXT *ta;
452
7.13M
  ENTROPY_CONTEXT *tl;
453
454
7.13M
  t_above = *mb->e_mbd.above_context;
455
7.13M
  t_left = *mb->e_mbd.left_context;
456
457
7.13M
  ta = (ENTROPY_CONTEXT *)&t_above;
458
7.13M
  tl = (ENTROPY_CONTEXT *)&t_left;
459
460
121M
  for (b = 0; b < 16; ++b) {
461
114M
    cost += cost_coeffs(mb, x->block + b, PLANE_TYPE_Y_NO_DC,
462
114M
                        ta + vp8_block2above[b], tl + vp8_block2left[b]);
463
114M
  }
464
465
7.13M
  cost += cost_coeffs(mb, x->block + 24, PLANE_TYPE_Y2,
466
7.13M
                      ta + vp8_block2above[24], tl + vp8_block2left[24]);
467
468
7.13M
  return cost;
469
7.13M
}
470
471
7.13M
static void macro_block_yrd(MACROBLOCK *mb, int *Rate, int *Distortion) {
472
7.13M
  int b;
473
7.13M
  MACROBLOCKD *const x = &mb->e_mbd;
474
7.13M
  BLOCK *const mb_y2 = mb->block + 24;
475
7.13M
  BLOCKD *const x_y2 = x->block + 24;
476
7.13M
  short *Y2DCPtr = mb_y2->src_diff;
477
7.13M
  BLOCK *beptr;
478
7.13M
  int d;
479
480
7.13M
  vp8_subtract_mby(mb->src_diff, *(mb->block[0].base_src),
481
7.13M
                   mb->block[0].src_stride, mb->e_mbd.predictor, 16);
482
483
  /* Fdct and building the 2nd order block */
484
64.2M
  for (beptr = mb->block; beptr < mb->block + 16; beptr += 2) {
485
57.0M
    mb->short_fdct8x4(beptr->src_diff, beptr->coeff, 32);
486
57.0M
    *Y2DCPtr++ = beptr->coeff[0];
487
57.0M
    *Y2DCPtr++ = beptr->coeff[16];
488
57.0M
  }
489
490
  /* 2nd order fdct */
491
7.13M
  mb->short_walsh4x4(mb_y2->src_diff, mb_y2->coeff, 8);
492
493
  /* Quantization */
494
121M
  for (b = 0; b < 16; ++b) {
495
114M
    mb->quantize_b(&mb->block[b], &mb->e_mbd.block[b]);
496
114M
  }
497
498
  /* DC predication and Quantization of 2nd Order block */
499
7.13M
  mb->quantize_b(mb_y2, x_y2);
500
501
  /* Distortion */
502
7.13M
  d = vp8_mbblock_error(mb, 1) << 2;
503
7.13M
  d += vp8_block_error(mb_y2->coeff, x_y2->dqcoeff);
504
505
7.13M
  *Distortion = (d >> 4);
506
507
  /* rate */
508
7.13M
  *Rate = vp8_rdcost_mby(mb);
509
7.13M
}
510
511
18.9M
static void copy_predictor(unsigned char *dst, const unsigned char *predictor) {
512
18.9M
  const unsigned int *p = (const unsigned int *)predictor;
513
18.9M
  unsigned int *d = (unsigned int *)dst;
514
18.9M
  d[0] = p[0];
515
18.9M
  d[4] = p[4];
516
18.9M
  d[8] = p[8];
517
18.9M
  d[12] = p[12];
518
18.9M
}
519
static int rd_pick_intra4x4block(MACROBLOCK *x, BLOCK *be, BLOCKD *b,
520
                                 B_PREDICTION_MODE *best_mode,
521
                                 const int *bmode_costs, ENTROPY_CONTEXT *a,
522
                                 ENTROPY_CONTEXT *l,
523
524
                                 int *bestrate, int *bestratey,
525
9.80M
                                 int *bestdistortion) {
526
9.80M
  B_PREDICTION_MODE mode;
527
9.80M
  int best_rd = INT_MAX;
528
9.80M
  int rate = 0;
529
9.80M
  int distortion;
530
531
9.80M
  ENTROPY_CONTEXT ta = *a, tempa = *a;
532
9.80M
  ENTROPY_CONTEXT tl = *l, templ = *l;
533
  /*
534
   * The predictor buffer is a 2d buffer with a stride of 16.  Create
535
   * a temp buffer that meets the stride requirements, but we are only
536
   * interested in the left 4x4 block
537
   * */
538
9.80M
  DECLARE_ALIGNED(16, unsigned char, best_predictor[16 * 4]);
539
9.80M
  DECLARE_ALIGNED(16, short, best_dqcoeff[16]);
540
9.80M
  int dst_stride = x->e_mbd.dst.y_stride;
541
9.80M
  unsigned char *dst = x->e_mbd.dst.y_buffer + b->offset;
542
543
9.80M
  unsigned char *Above = dst - dst_stride;
544
9.80M
  unsigned char *yleft = dst - 1;
545
9.80M
  unsigned char top_left = Above[-1];
546
547
107M
  for (mode = B_DC_PRED; mode <= B_HU_PRED; ++mode) {
548
98.0M
    int this_rd;
549
98.0M
    int ratey;
550
551
98.0M
    rate = bmode_costs[mode];
552
553
98.0M
    vp8_intra4x4_predict(Above, yleft, dst_stride, mode, b->predictor, 16,
554
98.0M
                         top_left);
555
98.0M
    vp8_subtract_b(be, b, 16);
556
98.0M
    x->short_fdct4x4(be->src_diff, be->coeff, 32);
557
98.0M
    x->quantize_b(be, b);
558
559
98.0M
    tempa = ta;
560
98.0M
    templ = tl;
561
562
98.0M
    ratey = cost_coeffs(x, b, PLANE_TYPE_Y_WITH_DC, &tempa, &templ);
563
98.0M
    rate += ratey;
564
98.0M
    distortion = vp8_block_error(be->coeff, b->dqcoeff) >> 2;
565
566
98.0M
    this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion);
567
568
98.0M
    if (this_rd < best_rd) {
569
18.9M
      *bestrate = rate;
570
18.9M
      *bestratey = ratey;
571
18.9M
      *bestdistortion = distortion;
572
18.9M
      best_rd = this_rd;
573
18.9M
      *best_mode = mode;
574
18.9M
      *a = tempa;
575
18.9M
      *l = templ;
576
18.9M
      copy_predictor(best_predictor, b->predictor);
577
18.9M
      memcpy(best_dqcoeff, b->dqcoeff, 32);
578
18.9M
    }
579
98.0M
  }
580
9.80M
  b->bmi.as_mode = *best_mode;
581
582
9.80M
  vp8_short_idct4x4llm(best_dqcoeff, best_predictor, 16, dst, dst_stride);
583
584
9.80M
  return best_rd;
585
9.80M
}
586
587
static int rd_pick_intra4x4mby_modes(MACROBLOCK *mb, int *Rate, int *rate_y,
588
912k
                                     int *Distortion, int best_rd) {
589
912k
  MACROBLOCKD *const xd = &mb->e_mbd;
590
912k
  int i;
591
912k
  int cost = mb->mbmode_cost[xd->frame_type][B_PRED];
592
912k
  int distortion = 0;
593
912k
  int tot_rate_y = 0;
594
912k
  int64_t total_rd = 0;
595
912k
  ENTROPY_CONTEXT_PLANES t_above, t_left;
596
912k
  ENTROPY_CONTEXT *ta;
597
912k
  ENTROPY_CONTEXT *tl;
598
912k
  const int *bmode_costs;
599
600
912k
  t_above = *mb->e_mbd.above_context;
601
912k
  t_left = *mb->e_mbd.left_context;
602
603
912k
  ta = (ENTROPY_CONTEXT *)&t_above;
604
912k
  tl = (ENTROPY_CONTEXT *)&t_left;
605
606
912k
  intra_prediction_down_copy(xd, xd->dst.y_buffer - xd->dst.y_stride + 16);
607
608
912k
  bmode_costs = mb->inter_bmode_costs;
609
610
10.2M
  for (i = 0; i < 16; ++i) {
611
9.80M
    MODE_INFO *const mic = xd->mode_info_context;
612
9.80M
    const int mis = xd->mode_info_stride;
613
9.80M
    B_PREDICTION_MODE best_mode = B_MODE_COUNT;
614
9.80M
    int r = 0, ry = 0, d = 0;
615
616
9.80M
    if (mb->e_mbd.frame_type == KEY_FRAME) {
617
3.14M
      const B_PREDICTION_MODE A = above_block_mode(mic, i, mis);
618
3.14M
      const B_PREDICTION_MODE L = left_block_mode(mic, i);
619
620
3.14M
      bmode_costs = mb->bmode_costs[A][L];
621
3.14M
    }
622
623
9.80M
    total_rd += rd_pick_intra4x4block(
624
9.80M
        mb, mb->block + i, xd->block + i, &best_mode, bmode_costs,
625
9.80M
        ta + vp8_block2above[i], tl + vp8_block2left[i], &r, &ry, &d);
626
627
9.80M
    cost += r;
628
9.80M
    distortion += d;
629
9.80M
    tot_rate_y += ry;
630
631
9.80M
    assert(best_mode != B_MODE_COUNT);
632
9.80M
    mic->bmi[i].as_mode = best_mode;
633
634
9.80M
    if (total_rd >= (int64_t)best_rd) break;
635
9.80M
  }
636
637
912k
  if (total_rd >= (int64_t)best_rd) return INT_MAX;
638
639
408k
  *Rate = cost;
640
408k
  *rate_y = tot_rate_y;
641
408k
  *Distortion = distortion;
642
643
408k
  return RDCOST(mb->rdmult, mb->rddiv, cost, distortion);
644
912k
}
645
646
static int rd_pick_intra16x16mby_mode(MACROBLOCK *x, int *Rate, int *rate_y,
647
234k
                                      int *Distortion) {
648
234k
  MB_PREDICTION_MODE mode;
649
234k
  MB_PREDICTION_MODE mode_selected = MB_MODE_COUNT;
650
234k
  int rate, ratey;
651
234k
  int distortion;
652
234k
  int best_rd = INT_MAX;
653
234k
  int this_rd;
654
234k
  MACROBLOCKD *xd = &x->e_mbd;
655
656
  /* Y Search for 16x16 intra prediction mode */
657
1.17M
  for (mode = DC_PRED; mode <= TM_PRED; ++mode) {
658
937k
    xd->mode_info_context->mbmi.mode = mode;
659
660
937k
    vp8_build_intra_predictors_mby_s(xd, xd->dst.y_buffer - xd->dst.y_stride,
661
937k
                                     xd->dst.y_buffer - 1, xd->dst.y_stride,
662
937k
                                     xd->predictor, 16);
663
664
937k
    macro_block_yrd(x, &ratey, &distortion);
665
937k
    rate = ratey +
666
937k
           x->mbmode_cost[xd->frame_type][xd->mode_info_context->mbmi.mode];
667
668
937k
    this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion);
669
670
937k
    if (this_rd < best_rd) {
671
313k
      mode_selected = mode;
672
313k
      best_rd = this_rd;
673
313k
      *Rate = rate;
674
313k
      *rate_y = ratey;
675
313k
      *Distortion = distortion;
676
313k
    }
677
937k
  }
678
679
234k
  assert(mode_selected != MB_MODE_COUNT);
680
234k
  xd->mode_info_context->mbmi.mode = mode_selected;
681
234k
  return best_rd;
682
234k
}
683
684
7.98M
static int rd_cost_mbuv(MACROBLOCK *mb) {
685
7.98M
  int b;
686
7.98M
  int cost = 0;
687
7.98M
  MACROBLOCKD *x = &mb->e_mbd;
688
7.98M
  ENTROPY_CONTEXT_PLANES t_above, t_left;
689
7.98M
  ENTROPY_CONTEXT *ta;
690
7.98M
  ENTROPY_CONTEXT *tl;
691
692
7.98M
  t_above = *mb->e_mbd.above_context;
693
7.98M
  t_left = *mb->e_mbd.left_context;
694
695
7.98M
  ta = (ENTROPY_CONTEXT *)&t_above;
696
7.98M
  tl = (ENTROPY_CONTEXT *)&t_left;
697
698
71.8M
  for (b = 16; b < 24; ++b) {
699
63.8M
    cost += cost_coeffs(mb, x->block + b, PLANE_TYPE_UV,
700
63.8M
                        ta + vp8_block2above[b], tl + vp8_block2left[b]);
701
63.8M
  }
702
703
7.98M
  return cost;
704
7.98M
}
705
706
static int rd_inter16x16_uv(VP8_COMP *cpi, MACROBLOCK *x, int *rate,
707
3.28M
                            int *distortion, int fullpixel) {
708
3.28M
  (void)cpi;
709
3.28M
  (void)fullpixel;
710
711
3.28M
  vp8_build_inter16x16_predictors_mbuv(&x->e_mbd);
712
3.28M
  vp8_subtract_mbuv(x->src_diff, x->src.u_buffer, x->src.v_buffer,
713
3.28M
                    x->src.uv_stride, &x->e_mbd.predictor[256],
714
3.28M
                    &x->e_mbd.predictor[320], 8);
715
716
3.28M
  vp8_transform_mbuv(x);
717
3.28M
  vp8_quantize_mbuv(x);
718
719
3.28M
  *rate = rd_cost_mbuv(x);
720
3.28M
  *distortion = vp8_mbuverror(x) / 4;
721
722
3.28M
  return RDCOST(x->rdmult, x->rddiv, *rate, *distortion);
723
3.28M
}
724
725
static int rd_inter4x4_uv(VP8_COMP *cpi, MACROBLOCK *x, int *rate,
726
447k
                          int *distortion, int fullpixel) {
727
447k
  (void)cpi;
728
447k
  (void)fullpixel;
729
730
447k
  vp8_build_inter4x4_predictors_mbuv(&x->e_mbd);
731
447k
  vp8_subtract_mbuv(x->src_diff, x->src.u_buffer, x->src.v_buffer,
732
447k
                    x->src.uv_stride, &x->e_mbd.predictor[256],
733
447k
                    &x->e_mbd.predictor[320], 8);
734
735
447k
  vp8_transform_mbuv(x);
736
447k
  vp8_quantize_mbuv(x);
737
738
447k
  *rate = rd_cost_mbuv(x);
739
447k
  *distortion = vp8_mbuverror(x) / 4;
740
741
447k
  return RDCOST(x->rdmult, x->rddiv, *rate, *distortion);
742
447k
}
743
744
static void rd_pick_intra_mbuv_mode(MACROBLOCK *x, int *rate,
745
1.06M
                                    int *rate_tokenonly, int *distortion) {
746
1.06M
  MB_PREDICTION_MODE mode;
747
1.06M
  MB_PREDICTION_MODE mode_selected = MB_MODE_COUNT;
748
1.06M
  int best_rd = INT_MAX;
749
1.06M
  int d = 0, r = 0;
750
1.06M
  int rate_to;
751
1.06M
  MACROBLOCKD *xd = &x->e_mbd;
752
753
5.32M
  for (mode = DC_PRED; mode <= TM_PRED; ++mode) {
754
4.25M
    int this_rate;
755
4.25M
    int this_distortion;
756
4.25M
    int this_rd;
757
758
4.25M
    xd->mode_info_context->mbmi.uv_mode = mode;
759
760
4.25M
    vp8_build_intra_predictors_mbuv_s(
761
4.25M
        xd, xd->dst.u_buffer - xd->dst.uv_stride,
762
4.25M
        xd->dst.v_buffer - xd->dst.uv_stride, xd->dst.u_buffer - 1,
763
4.25M
        xd->dst.v_buffer - 1, xd->dst.uv_stride, &xd->predictor[256],
764
4.25M
        &xd->predictor[320], 8);
765
766
4.25M
    vp8_subtract_mbuv(x->src_diff, x->src.u_buffer, x->src.v_buffer,
767
4.25M
                      x->src.uv_stride, &xd->predictor[256],
768
4.25M
                      &xd->predictor[320], 8);
769
4.25M
    vp8_transform_mbuv(x);
770
4.25M
    vp8_quantize_mbuv(x);
771
772
4.25M
    rate_to = rd_cost_mbuv(x);
773
4.25M
    this_rate =
774
4.25M
        rate_to + x->intra_uv_mode_cost[xd->frame_type]
775
4.25M
                                       [xd->mode_info_context->mbmi.uv_mode];
776
777
4.25M
    this_distortion = vp8_mbuverror(x) / 4;
778
779
4.25M
    this_rd = RDCOST(x->rdmult, x->rddiv, this_rate, this_distortion);
780
781
4.25M
    if (this_rd < best_rd) {
782
1.46M
      best_rd = this_rd;
783
1.46M
      d = this_distortion;
784
1.46M
      r = this_rate;
785
1.46M
      *rate_tokenonly = rate_to;
786
1.46M
      mode_selected = mode;
787
1.46M
    }
788
4.25M
  }
789
790
1.06M
  *rate = r;
791
1.06M
  *distortion = d;
792
793
1.06M
  assert(mode_selected != MB_MODE_COUNT);
794
1.06M
  xd->mode_info_context->mbmi.uv_mode = mode_selected;
795
1.06M
}
796
797
7.91M
int vp8_cost_mv_ref(MB_PREDICTION_MODE m, const int near_mv_ref_ct[4]) {
798
7.91M
  vp8_prob p[VP8_MVREFS - 1];
799
7.91M
  assert(NEARESTMV <= m && m <= SPLITMV);
800
7.91M
  vp8_mv_ref_probs(p, near_mv_ref_ct);
801
7.91M
  return vp8_cost_token(vp8_mv_ref_tree, p,
802
7.91M
                        vp8_mv_ref_encoding_array + (m - NEARESTMV));
803
7.91M
}
804
805
3.28M
void vp8_set_mbmode_and_mvs(MACROBLOCK *x, MB_PREDICTION_MODE mb, int_mv *mv) {
806
3.28M
  x->e_mbd.mode_info_context->mbmi.mode = mb;
807
3.28M
  x->e_mbd.mode_info_context->mbmi.mv.as_int = mv->as_int;
808
3.28M
}
809
810
static int labels2mode(MACROBLOCK *x, int const *labelings, int which_label,
811
                       B_PREDICTION_MODE this_mode, int_mv *this_mv,
812
69.3M
                       int_mv *best_ref_mv, int *mvcost[2]) {
813
69.3M
  MACROBLOCKD *const xd = &x->e_mbd;
814
69.3M
  MODE_INFO *const mic = xd->mode_info_context;
815
69.3M
  const int mis = xd->mode_info_stride;
816
817
69.3M
  int cost = 0;
818
69.3M
  int thismvcost = 0;
819
820
  /* We have to be careful retrieving previously-encoded motion vectors.
821
     Ones from this macroblock have to be pulled from the BLOCKD array
822
     as they have not yet made it to the bmi array in our MB_MODE_INFO. */
823
824
69.3M
  int i = 0;
825
826
1.11G
  do {
827
1.11G
    BLOCKD *const d = xd->block + i;
828
1.11G
    const int row = i >> 2, col = i & 3;
829
830
1.11G
    B_PREDICTION_MODE m;
831
832
1.11G
    if (labelings[i] != which_label) continue;
833
834
202M
    if (col && labelings[i] == labelings[i - 1]) {
835
92.7M
      m = LEFT4X4;
836
109M
    } else if (row && labelings[i] == labelings[i - 4]) {
837
40.4M
      m = ABOVE4X4;
838
69.3M
    } else {
839
      /* the only time we should do costing for new motion vector
840
       * or mode is when we are on a new label  (jbb May 08, 2007)
841
       */
842
69.3M
      switch (m = this_mode) {
843
17.8M
        case NEW4X4:
844
17.8M
          thismvcost = vp8_mv_bit_cost(this_mv, best_ref_mv, mvcost, 102);
845
17.8M
          break;
846
21.3M
        case LEFT4X4:
847
21.3M
          this_mv->as_int = col ? d[-1].bmi.mv.as_int : left_block_mv(mic, i);
848
21.3M
          break;
849
15.8M
        case ABOVE4X4:
850
15.8M
          this_mv->as_int =
851
15.8M
              row ? d[-4].bmi.mv.as_int : above_block_mv(mic, i, mis);
852
15.8M
          break;
853
14.3M
        case ZERO4X4: this_mv->as_int = 0; break;
854
0
        default: break;
855
69.3M
      }
856
857
69.3M
      if (m == ABOVE4X4) { /* replace above with left if same */
858
15.8M
        int_mv left_mv;
859
860
15.8M
        left_mv.as_int = col ? d[-1].bmi.mv.as_int : left_block_mv(mic, i);
861
862
15.8M
        if (left_mv.as_int == this_mv->as_int) m = LEFT4X4;
863
15.8M
      }
864
865
69.3M
      cost = x->inter_bmode_costs[m];
866
69.3M
    }
867
868
202M
    d->bmi.mv.as_int = this_mv->as_int;
869
870
202M
    x->partition_info->bmi[i].mode = m;
871
202M
    x->partition_info->bmi[i].mv.as_int = this_mv->as_int;
872
873
1.11G
  } while (++i < 16);
874
875
69.3M
  cost += thismvcost;
876
69.3M
  return cost;
877
69.3M
}
878
879
static int rdcost_mbsegment_y(MACROBLOCK *mb, const int *labels,
880
                              int which_label, ENTROPY_CONTEXT *ta,
881
55.0M
                              ENTROPY_CONTEXT *tl) {
882
55.0M
  int cost = 0;
883
55.0M
  int b;
884
55.0M
  MACROBLOCKD *x = &mb->e_mbd;
885
886
935M
  for (b = 0; b < 16; ++b) {
887
880M
    if (labels[b] == which_label) {
888
160M
      cost += cost_coeffs(mb, x->block + b, PLANE_TYPE_Y_WITH_DC,
889
160M
                          ta + vp8_block2above[b], tl + vp8_block2left[b]);
890
160M
    }
891
880M
  }
892
893
55.0M
  return cost;
894
55.0M
}
895
static unsigned int vp8_encode_inter_mb_segment(MACROBLOCK *x,
896
                                                int const *labels,
897
55.0M
                                                int which_label) {
898
55.0M
  int i;
899
55.0M
  unsigned int distortion = 0;
900
55.0M
  int pre_stride = x->e_mbd.pre.y_stride;
901
55.0M
  unsigned char *base_pre = x->e_mbd.pre.y_buffer;
902
903
935M
  for (i = 0; i < 16; ++i) {
904
880M
    if (labels[i] == which_label) {
905
160M
      BLOCKD *bd = &x->e_mbd.block[i];
906
160M
      BLOCK *be = &x->block[i];
907
908
160M
      vp8_build_inter_predictors_b(bd, 16, base_pre, pre_stride,
909
160M
                                   x->e_mbd.subpixel_predict);
910
160M
      vp8_subtract_b(be, bd, 16);
911
160M
      x->short_fdct4x4(be->src_diff, be->coeff, 32);
912
160M
      x->quantize_b(be, bd);
913
914
160M
      distortion += vp8_block_error(be->coeff, bd->dqcoeff);
915
160M
    }
916
880M
  }
917
918
55.0M
  return distortion;
919
55.0M
}
920
921
static const unsigned int segmentation_to_sseshift[4] = { 3, 3, 2, 0 };
922
923
typedef struct {
924
  int_mv *ref_mv;
925
  int_mv mvp;
926
927
  int segment_rd;
928
  int segment_num;
929
  int r;
930
  int d;
931
  int segment_yrate;
932
  B_PREDICTION_MODE modes[16];
933
  int_mv mvs[16];
934
  unsigned char eobs[16];
935
936
  int mvthresh;
937
  int *mdcounts;
938
939
  int_mv sv_mvp[4]; /* save 4 mvp from 8x8 */
940
  int sv_istep[2];  /* save 2 initial step_param for 16x8/8x16 */
941
942
} BEST_SEG_INFO;
943
944
static void rd_check_segment(VP8_COMP *cpi, MACROBLOCK *x, BEST_SEG_INFO *bsi,
945
3.10M
                             unsigned int segmentation) {
946
3.10M
  int i;
947
3.10M
  int const *labels;
948
3.10M
  int br = 0;
949
3.10M
  int bd = 0;
950
3.10M
  B_PREDICTION_MODE this_mode;
951
952
3.10M
  int label_count;
953
3.10M
  int this_segment_rd = 0;
954
3.10M
  int label_mv_thresh;
955
3.10M
  int rate = 0;
956
3.10M
  int sbr = 0;
957
3.10M
  int sbd = 0;
958
3.10M
  int segmentyrate = 0;
959
960
3.10M
  vp8_variance_fn_ptr_t *v_fn_ptr;
961
962
3.10M
  ENTROPY_CONTEXT_PLANES t_above, t_left;
963
3.10M
  ENTROPY_CONTEXT_PLANES t_above_b, t_left_b;
964
965
3.10M
  t_above = *x->e_mbd.above_context;
966
3.10M
  t_left = *x->e_mbd.left_context;
967
968
3.10M
  vp8_zero(t_above_b);
969
3.10M
  vp8_zero(t_left_b);
970
971
3.10M
  br = 0;
972
3.10M
  bd = 0;
973
974
3.10M
  v_fn_ptr = &cpi->fn_ptr[segmentation];
975
3.10M
  labels = vp8_mbsplits[segmentation];
976
3.10M
  label_count = vp8_mbsplit_count[segmentation];
977
978
  /* 64 makes this threshold really big effectively making it so that we
979
   * very rarely check mvs on segments.   setting this to 1 would make mv
980
   * thresh roughly equal to what it is for macroblocks
981
   */
982
3.10M
  label_mv_thresh = 1 * bsi->mvthresh / label_count;
983
984
  /* Segmentation method overheads */
985
3.10M
  rate = vp8_cost_token(vp8_mbsplit_tree, vp8_mbsplit_probs,
986
3.10M
                        vp8_mbsplit_encodings + segmentation);
987
3.10M
  rate += vp8_cost_mv_ref(SPLITMV, bsi->mdcounts);
988
3.10M
  this_segment_rd += RDCOST(x->rdmult, x->rddiv, rate, 0);
989
3.10M
  br += rate;
990
991
15.1M
  for (i = 0; i < label_count; ++i) {
992
14.1M
    int_mv mode_mv[B_MODE_COUNT] = { { 0 }, { 0 } };
993
14.1M
    int best_label_rd = INT_MAX;
994
14.1M
    B_PREDICTION_MODE mode_selected = ZERO4X4;
995
14.1M
    int bestlabelyrate = 0;
996
997
    /* search for the best motion vector on this segment */
998
69.3M
    for (this_mode = LEFT4X4; this_mode <= NEW4X4; ++this_mode) {
999
56.6M
      int this_rd;
1000
56.6M
      int distortion;
1001
56.6M
      int labelyrate;
1002
56.6M
      ENTROPY_CONTEXT_PLANES t_above_s, t_left_s;
1003
56.6M
      ENTROPY_CONTEXT *ta_s;
1004
56.6M
      ENTROPY_CONTEXT *tl_s;
1005
1006
56.6M
      t_above_s = t_above;
1007
56.6M
      t_left_s = t_left;
1008
1009
56.6M
      ta_s = (ENTROPY_CONTEXT *)&t_above_s;
1010
56.6M
      tl_s = (ENTROPY_CONTEXT *)&t_left_s;
1011
1012
56.6M
      if (this_mode == NEW4X4) {
1013
14.1M
        int sseshift;
1014
14.1M
        int num00;
1015
14.1M
        int step_param = 0;
1016
14.1M
        int further_steps;
1017
14.1M
        int n;
1018
14.1M
        int thissme;
1019
14.1M
        int bestsme = INT_MAX;
1020
14.1M
        int_mv temp_mv;
1021
14.1M
        BLOCK *c;
1022
14.1M
        BLOCKD *e;
1023
1024
        /* Is the best so far sufficiently good that we can't justify
1025
         * doing a new motion search.
1026
         */
1027
14.1M
        if (best_label_rd < label_mv_thresh) break;
1028
1029
12.7M
        if (cpi->compressor_speed) {
1030
5.14M
          if (segmentation == BLOCK_8X16 || segmentation == BLOCK_16X8) {
1031
724k
            bsi->mvp.as_int = bsi->sv_mvp[i].as_int;
1032
724k
            if (i == 1 && segmentation == BLOCK_16X8) {
1033
173k
              bsi->mvp.as_int = bsi->sv_mvp[2].as_int;
1034
173k
            }
1035
1036
724k
            step_param = bsi->sv_istep[i];
1037
724k
          }
1038
1039
          /* use previous block's result as next block's MV
1040
           * predictor.
1041
           */
1042
5.14M
          if (segmentation == BLOCK_4X4 && i > 0) {
1043
2.39M
            bsi->mvp.as_int = x->e_mbd.block[i - 1].bmi.mv.as_int;
1044
2.39M
            if (i == 4 || i == 8 || i == 12) {
1045
504k
              bsi->mvp.as_int = x->e_mbd.block[i - 4].bmi.mv.as_int;
1046
504k
            }
1047
2.39M
            step_param = 2;
1048
2.39M
          }
1049
5.14M
        }
1050
1051
12.7M
        further_steps = (MAX_MVSEARCH_STEPS - 1) - step_param;
1052
1053
12.7M
        {
1054
12.7M
          int sadpb = x->sadperbit4;
1055
12.7M
          int_mv mvp_full;
1056
1057
12.7M
          mvp_full.as_mv.row = bsi->mvp.as_mv.row >> 3;
1058
12.7M
          mvp_full.as_mv.col = bsi->mvp.as_mv.col >> 3;
1059
1060
          /* find first label */
1061
12.7M
          n = vp8_mbsplit_offset[segmentation][i];
1062
1063
12.7M
          c = &x->block[n];
1064
12.7M
          e = &x->e_mbd.block[n];
1065
1066
12.7M
          {
1067
12.7M
            bestsme = cpi->diamond_search_sad(
1068
12.7M
                x, c, e, &mvp_full, &mode_mv[NEW4X4], step_param, sadpb, &num00,
1069
12.7M
                v_fn_ptr, x->mvcost, bsi->ref_mv);
1070
1071
12.7M
            n = num00;
1072
12.7M
            num00 = 0;
1073
1074
45.2M
            while (n < further_steps) {
1075
32.5M
              n++;
1076
1077
32.5M
              if (num00) {
1078
5.51M
                num00--;
1079
27.0M
              } else {
1080
27.0M
                thissme = cpi->diamond_search_sad(
1081
27.0M
                    x, c, e, &mvp_full, &temp_mv, step_param + n, sadpb, &num00,
1082
27.0M
                    v_fn_ptr, x->mvcost, bsi->ref_mv);
1083
1084
27.0M
                if (thissme < bestsme) {
1085
4.79M
                  bestsme = thissme;
1086
4.79M
                  mode_mv[NEW4X4].as_int = temp_mv.as_int;
1087
4.79M
                }
1088
27.0M
              }
1089
32.5M
            }
1090
12.7M
          }
1091
1092
12.7M
          sseshift = segmentation_to_sseshift[segmentation];
1093
1094
          /* Should we do a full search (best quality only) */
1095
12.7M
          if ((cpi->compressor_speed == 0) && (bestsme >> sseshift) > 4000) {
1096
            /* Check if mvp_full is within the range. */
1097
5.28M
            vp8_clamp_mv(&mvp_full, x->mv_col_min, x->mv_col_max, x->mv_row_min,
1098
5.28M
                         x->mv_row_max);
1099
1100
5.28M
            thissme = vp8_full_search_sad(x, c, e, &mvp_full, sadpb, 16,
1101
5.28M
                                          v_fn_ptr, x->mvcost, bsi->ref_mv);
1102
1103
5.28M
            if (thissme < bestsme) {
1104
1.95M
              bestsme = thissme;
1105
1.95M
              mode_mv[NEW4X4].as_int = e->bmi.mv.as_int;
1106
3.33M
            } else {
1107
              /* The full search result is actually worse so
1108
               * re-instate the previous best vector
1109
               */
1110
3.33M
              e->bmi.mv.as_int = mode_mv[NEW4X4].as_int;
1111
3.33M
            }
1112
5.28M
          }
1113
12.7M
        }
1114
1115
12.7M
        if (bestsme < INT_MAX) {
1116
12.7M
          int disto;
1117
12.7M
          unsigned int sse;
1118
12.7M
          cpi->find_fractional_mv_step(x, c, e, &mode_mv[NEW4X4], bsi->ref_mv,
1119
12.7M
                                       x->errorperbit, v_fn_ptr, x->mvcost,
1120
12.7M
                                       &disto, &sse);
1121
12.7M
        }
1122
12.7M
      } /* NEW4X4 */
1123
1124
55.2M
      rate = labels2mode(x, labels, i, this_mode, &mode_mv[this_mode],
1125
55.2M
                         bsi->ref_mv, x->mvcost);
1126
1127
      /* Trap vectors that reach beyond the UMV borders */
1128
55.2M
      if (((mode_mv[this_mode].as_mv.row >> 3) < x->mv_row_min) ||
1129
55.2M
          ((mode_mv[this_mode].as_mv.row >> 3) > x->mv_row_max) ||
1130
55.1M
          ((mode_mv[this_mode].as_mv.col >> 3) < x->mv_col_min) ||
1131
55.1M
          ((mode_mv[this_mode].as_mv.col >> 3) > x->mv_col_max)) {
1132
181k
        continue;
1133
181k
      }
1134
1135
55.0M
      distortion = vp8_encode_inter_mb_segment(x, labels, i) / 4;
1136
1137
55.0M
      labelyrate = rdcost_mbsegment_y(x, labels, i, ta_s, tl_s);
1138
55.0M
      rate += labelyrate;
1139
1140
55.0M
      this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion);
1141
1142
55.0M
      if (this_rd < best_label_rd) {
1143
22.9M
        sbr = rate;
1144
22.9M
        sbd = distortion;
1145
22.9M
        bestlabelyrate = labelyrate;
1146
22.9M
        mode_selected = this_mode;
1147
22.9M
        best_label_rd = this_rd;
1148
1149
22.9M
        t_above_b = t_above_s;
1150
22.9M
        t_left_b = t_left_s;
1151
22.9M
      }
1152
55.0M
    } /*for each 4x4 mode*/
1153
1154
14.1M
    t_above = t_above_b;
1155
14.1M
    t_left = t_left_b;
1156
1157
14.1M
    labels2mode(x, labels, i, mode_selected, &mode_mv[mode_selected],
1158
14.1M
                bsi->ref_mv, x->mvcost);
1159
1160
14.1M
    br += sbr;
1161
14.1M
    bd += sbd;
1162
14.1M
    segmentyrate += bestlabelyrate;
1163
14.1M
    this_segment_rd += best_label_rd;
1164
1165
14.1M
    if (this_segment_rd >= bsi->segment_rd) break;
1166
1167
14.1M
  } /* for each label */
1168
1169
3.10M
  if (this_segment_rd < bsi->segment_rd) {
1170
989k
    bsi->r = br;
1171
989k
    bsi->d = bd;
1172
989k
    bsi->segment_yrate = segmentyrate;
1173
989k
    bsi->segment_rd = this_segment_rd;
1174
989k
    bsi->segment_num = segmentation;
1175
1176
    /* store everything needed to come back to this!! */
1177
16.8M
    for (i = 0; i < 16; ++i) {
1178
15.8M
      bsi->mvs[i].as_mv = x->partition_info->bmi[i].mv.as_mv;
1179
15.8M
      bsi->modes[i] = x->partition_info->bmi[i].mode;
1180
15.8M
      bsi->eobs[i] = x->e_mbd.eobs[i];
1181
15.8M
    }
1182
989k
  }
1183
3.10M
}
1184
1185
778k
static void vp8_cal_step_param(int sr, int *sp) {
1186
778k
  int step = 0;
1187
1188
778k
  if (sr > MAX_FIRST_STEP) {
1189
0
    sr = MAX_FIRST_STEP;
1190
778k
  } else if (sr < 1) {
1191
422k
    sr = 1;
1192
422k
  }
1193
1194
1.84M
  while (sr >>= 1) step++;
1195
1196
778k
  *sp = MAX_MVSEARCH_STEPS - 1 - step;
1197
778k
}
1198
1199
static int vp8_rd_pick_best_mbsegmentation(VP8_COMP *cpi, MACROBLOCK *x,
1200
                                           int_mv *best_ref_mv, int best_rd,
1201
                                           int *mdcounts, int *returntotrate,
1202
                                           int *returnyrate,
1203
                                           int *returndistortion,
1204
1.10M
                                           int mvthresh) {
1205
1.10M
  int i;
1206
1.10M
  BEST_SEG_INFO bsi;
1207
1208
1.10M
  memset(&bsi, 0, sizeof(bsi));
1209
1210
1.10M
  bsi.segment_rd = best_rd;
1211
1.10M
  bsi.ref_mv = best_ref_mv;
1212
1.10M
  bsi.mvp.as_int = best_ref_mv->as_int;
1213
1.10M
  bsi.mvthresh = mvthresh;
1214
1.10M
  bsi.mdcounts = mdcounts;
1215
1216
18.7M
  for (i = 0; i < 16; ++i) {
1217
17.6M
    bsi.modes[i] = ZERO4X4;
1218
17.6M
  }
1219
1220
1.10M
  if (cpi->compressor_speed == 0) {
1221
    /* for now, we will keep the original segmentation order
1222
       when in best quality mode */
1223
473k
    rd_check_segment(cpi, x, &bsi, BLOCK_16X8);
1224
473k
    rd_check_segment(cpi, x, &bsi, BLOCK_8X16);
1225
473k
    rd_check_segment(cpi, x, &bsi, BLOCK_8X8);
1226
473k
    rd_check_segment(cpi, x, &bsi, BLOCK_4X4);
1227
628k
  } else {
1228
628k
    int sr;
1229
1230
628k
    rd_check_segment(cpi, x, &bsi, BLOCK_8X8);
1231
1232
628k
    if (bsi.segment_rd < best_rd) {
1233
194k
      int col_min = ((best_ref_mv->as_mv.col + 7) >> 3) - MAX_FULL_PEL_VAL;
1234
194k
      int row_min = ((best_ref_mv->as_mv.row + 7) >> 3) - MAX_FULL_PEL_VAL;
1235
194k
      int col_max = (best_ref_mv->as_mv.col >> 3) + MAX_FULL_PEL_VAL;
1236
194k
      int row_max = (best_ref_mv->as_mv.row >> 3) + MAX_FULL_PEL_VAL;
1237
1238
194k
      int tmp_col_min = x->mv_col_min;
1239
194k
      int tmp_col_max = x->mv_col_max;
1240
194k
      int tmp_row_min = x->mv_row_min;
1241
194k
      int tmp_row_max = x->mv_row_max;
1242
1243
      /* Get intersection of UMV window and valid MV window to reduce # of
1244
       * checks in diamond search. */
1245
194k
      if (x->mv_col_min < col_min) x->mv_col_min = col_min;
1246
194k
      if (x->mv_col_max > col_max) x->mv_col_max = col_max;
1247
194k
      if (x->mv_row_min < row_min) x->mv_row_min = row_min;
1248
194k
      if (x->mv_row_max > row_max) x->mv_row_max = row_max;
1249
1250
      /* Get 8x8 result */
1251
194k
      bsi.sv_mvp[0].as_int = bsi.mvs[0].as_int;
1252
194k
      bsi.sv_mvp[1].as_int = bsi.mvs[2].as_int;
1253
194k
      bsi.sv_mvp[2].as_int = bsi.mvs[8].as_int;
1254
194k
      bsi.sv_mvp[3].as_int = bsi.mvs[10].as_int;
1255
1256
      /* Use 8x8 result as 16x8/8x16's predictor MV. Adjust search range
1257
       * according to the closeness of 2 MV. */
1258
      /* block 8X16 */
1259
194k
      {
1260
194k
        sr =
1261
194k
            MAXF((abs(bsi.sv_mvp[0].as_mv.row - bsi.sv_mvp[2].as_mv.row)) >> 3,
1262
194k
                 (abs(bsi.sv_mvp[0].as_mv.col - bsi.sv_mvp[2].as_mv.col)) >> 3);
1263
194k
        vp8_cal_step_param(sr, &bsi.sv_istep[0]);
1264
1265
194k
        sr =
1266
194k
            MAXF((abs(bsi.sv_mvp[1].as_mv.row - bsi.sv_mvp[3].as_mv.row)) >> 3,
1267
194k
                 (abs(bsi.sv_mvp[1].as_mv.col - bsi.sv_mvp[3].as_mv.col)) >> 3);
1268
194k
        vp8_cal_step_param(sr, &bsi.sv_istep[1]);
1269
1270
194k
        rd_check_segment(cpi, x, &bsi, BLOCK_8X16);
1271
194k
      }
1272
1273
      /* block 16X8 */
1274
194k
      {
1275
194k
        sr =
1276
194k
            MAXF((abs(bsi.sv_mvp[0].as_mv.row - bsi.sv_mvp[1].as_mv.row)) >> 3,
1277
194k
                 (abs(bsi.sv_mvp[0].as_mv.col - bsi.sv_mvp[1].as_mv.col)) >> 3);
1278
194k
        vp8_cal_step_param(sr, &bsi.sv_istep[0]);
1279
1280
194k
        sr =
1281
194k
            MAXF((abs(bsi.sv_mvp[2].as_mv.row - bsi.sv_mvp[3].as_mv.row)) >> 3,
1282
194k
                 (abs(bsi.sv_mvp[2].as_mv.col - bsi.sv_mvp[3].as_mv.col)) >> 3);
1283
194k
        vp8_cal_step_param(sr, &bsi.sv_istep[1]);
1284
1285
194k
        rd_check_segment(cpi, x, &bsi, BLOCK_16X8);
1286
194k
      }
1287
1288
      /* If 8x8 is better than 16x8/8x16, then do 4x4 search */
1289
      /* Not skip 4x4 if speed=0 (good quality) */
1290
194k
      if (cpi->sf.no_skip_block4x4_search || bsi.segment_num == BLOCK_8X8)
1291
      /* || (sv_segment_rd8x8-bsi.segment_rd) < sv_segment_rd8x8>>5) */
1292
194k
      {
1293
194k
        bsi.mvp.as_int = bsi.sv_mvp[0].as_int;
1294
194k
        rd_check_segment(cpi, x, &bsi, BLOCK_4X4);
1295
194k
      }
1296
1297
      /* restore UMV window */
1298
194k
      x->mv_col_min = tmp_col_min;
1299
194k
      x->mv_col_max = tmp_col_max;
1300
194k
      x->mv_row_min = tmp_row_min;
1301
194k
      x->mv_row_max = tmp_row_max;
1302
194k
    }
1303
628k
  }
1304
1305
  /* set it to the best */
1306
18.7M
  for (i = 0; i < 16; ++i) {
1307
17.6M
    BLOCKD *bd = &x->e_mbd.block[i];
1308
1309
17.6M
    bd->bmi.mv.as_int = bsi.mvs[i].as_int;
1310
17.6M
    *bd->eob = bsi.eobs[i];
1311
17.6M
  }
1312
1313
1.10M
  *returntotrate = bsi.r;
1314
1.10M
  *returndistortion = bsi.d;
1315
1.10M
  *returnyrate = bsi.segment_yrate;
1316
1317
  /* save partitions */
1318
1.10M
  x->e_mbd.mode_info_context->mbmi.partitioning = bsi.segment_num;
1319
1.10M
  x->partition_info->count = vp8_mbsplit_count[bsi.segment_num];
1320
1321
7.28M
  for (i = 0; i < x->partition_info->count; ++i) {
1322
6.17M
    int j;
1323
1324
6.17M
    j = vp8_mbsplit_offset[bsi.segment_num][i];
1325
1326
6.17M
    x->partition_info->bmi[i].mode = bsi.modes[j];
1327
6.17M
    x->partition_info->bmi[i].mv.as_mv = bsi.mvs[j].as_mv;
1328
6.17M
  }
1329
  /*
1330
   * used to set x->e_mbd.mode_info_context->mbmi.mv.as_int
1331
   */
1332
1.10M
  x->partition_info->bmi[15].mv.as_int = bsi.mvs[15].as_int;
1333
1334
1.10M
  return bsi.segment_rd;
1335
1.10M
}
1336
1337
/* The improved MV prediction */
1338
void vp8_mv_pred(VP8_COMP *cpi, MACROBLOCKD *xd, const MODE_INFO *here,
1339
                 int_mv *mvp, int refframe, int *ref_frame_sign_bias, int *sr,
1340
1.70M
                 int near_sadidx[]) {
1341
1.70M
  const MODE_INFO *above = here - xd->mode_info_stride;
1342
1.70M
  const MODE_INFO *left = here - 1;
1343
1.70M
  const MODE_INFO *aboveleft = above - 1;
1344
1.70M
  int_mv near_mvs[8];
1345
1.70M
  int near_ref[8];
1346
1.70M
  int_mv mv;
1347
1.70M
  int vcnt = 0;
1348
1.70M
  int find = 0;
1349
1.70M
  int mb_offset;
1350
1351
1.70M
  int mvx[8];
1352
1.70M
  int mvy[8];
1353
1.70M
  int i;
1354
1355
1.70M
  mv.as_int = 0;
1356
1357
1.70M
  if (here->mbmi.ref_frame != INTRA_FRAME) {
1358
1.70M
    near_mvs[0].as_int = near_mvs[1].as_int = near_mvs[2].as_int =
1359
1.70M
        near_mvs[3].as_int = near_mvs[4].as_int = near_mvs[5].as_int =
1360
1.70M
            near_mvs[6].as_int = near_mvs[7].as_int = 0;
1361
1.70M
    near_ref[0] = near_ref[1] = near_ref[2] = near_ref[3] = near_ref[4] =
1362
1.70M
        near_ref[5] = near_ref[6] = near_ref[7] = 0;
1363
1364
    /* read in 3 nearby block's MVs from current frame as prediction
1365
     * candidates.
1366
     */
1367
1.70M
    if (above->mbmi.ref_frame != INTRA_FRAME) {
1368
519k
      near_mvs[vcnt].as_int = above->mbmi.mv.as_int;
1369
519k
      mv_bias(ref_frame_sign_bias[above->mbmi.ref_frame], refframe,
1370
519k
              &near_mvs[vcnt], ref_frame_sign_bias);
1371
519k
      near_ref[vcnt] = above->mbmi.ref_frame;
1372
519k
    }
1373
1.70M
    vcnt++;
1374
1.70M
    if (left->mbmi.ref_frame != INTRA_FRAME) {
1375
588k
      near_mvs[vcnt].as_int = left->mbmi.mv.as_int;
1376
588k
      mv_bias(ref_frame_sign_bias[left->mbmi.ref_frame], refframe,
1377
588k
              &near_mvs[vcnt], ref_frame_sign_bias);
1378
588k
      near_ref[vcnt] = left->mbmi.ref_frame;
1379
588k
    }
1380
1.70M
    vcnt++;
1381
1.70M
    if (aboveleft->mbmi.ref_frame != INTRA_FRAME) {
1382
324k
      near_mvs[vcnt].as_int = aboveleft->mbmi.mv.as_int;
1383
324k
      mv_bias(ref_frame_sign_bias[aboveleft->mbmi.ref_frame], refframe,
1384
324k
              &near_mvs[vcnt], ref_frame_sign_bias);
1385
324k
      near_ref[vcnt] = aboveleft->mbmi.ref_frame;
1386
324k
    }
1387
1.70M
    vcnt++;
1388
1389
    /* read in 5 nearby block's MVs from last frame. */
1390
1.70M
    if (cpi->common.last_frame_type != KEY_FRAME) {
1391
1.47M
      mb_offset = (-xd->mb_to_top_edge / 128 + 1) * (xd->mode_info_stride + 1) +
1392
1.47M
                  (-xd->mb_to_left_edge / 128 + 1);
1393
1394
      /* current in last frame */
1395
1.47M
      if (cpi->lf_ref_frame[mb_offset] != INTRA_FRAME) {
1396
1.00M
        near_mvs[vcnt].as_int = cpi->lfmv[mb_offset].as_int;
1397
1.00M
        mv_bias(cpi->lf_ref_frame_sign_bias[mb_offset], refframe,
1398
1.00M
                &near_mvs[vcnt], ref_frame_sign_bias);
1399
1.00M
        near_ref[vcnt] = cpi->lf_ref_frame[mb_offset];
1400
1.00M
      }
1401
1.47M
      vcnt++;
1402
1403
      /* above in last frame */
1404
1.47M
      if (cpi->lf_ref_frame[mb_offset - xd->mode_info_stride - 1] !=
1405
1.47M
          INTRA_FRAME) {
1406
463k
        near_mvs[vcnt].as_int =
1407
463k
            cpi->lfmv[mb_offset - xd->mode_info_stride - 1].as_int;
1408
463k
        mv_bias(
1409
463k
            cpi->lf_ref_frame_sign_bias[mb_offset - xd->mode_info_stride - 1],
1410
463k
            refframe, &near_mvs[vcnt], ref_frame_sign_bias);
1411
463k
        near_ref[vcnt] =
1412
463k
            cpi->lf_ref_frame[mb_offset - xd->mode_info_stride - 1];
1413
463k
      }
1414
1.47M
      vcnt++;
1415
1416
      /* left in last frame */
1417
1.47M
      if (cpi->lf_ref_frame[mb_offset - 1] != INTRA_FRAME) {
1418
530k
        near_mvs[vcnt].as_int = cpi->lfmv[mb_offset - 1].as_int;
1419
530k
        mv_bias(cpi->lf_ref_frame_sign_bias[mb_offset - 1], refframe,
1420
530k
                &near_mvs[vcnt], ref_frame_sign_bias);
1421
530k
        near_ref[vcnt] = cpi->lf_ref_frame[mb_offset - 1];
1422
530k
      }
1423
1.47M
      vcnt++;
1424
1425
      /* right in last frame */
1426
1.47M
      if (cpi->lf_ref_frame[mb_offset + 1] != INTRA_FRAME) {
1427
567k
        near_mvs[vcnt].as_int = cpi->lfmv[mb_offset + 1].as_int;
1428
567k
        mv_bias(cpi->lf_ref_frame_sign_bias[mb_offset + 1], refframe,
1429
567k
                &near_mvs[vcnt], ref_frame_sign_bias);
1430
567k
        near_ref[vcnt] = cpi->lf_ref_frame[mb_offset + 1];
1431
567k
      }
1432
1.47M
      vcnt++;
1433
1434
      /* below in last frame */
1435
1.47M
      if (cpi->lf_ref_frame[mb_offset + xd->mode_info_stride + 1] !=
1436
1.47M
          INTRA_FRAME) {
1437
462k
        near_mvs[vcnt].as_int =
1438
462k
            cpi->lfmv[mb_offset + xd->mode_info_stride + 1].as_int;
1439
462k
        mv_bias(
1440
462k
            cpi->lf_ref_frame_sign_bias[mb_offset + xd->mode_info_stride + 1],
1441
462k
            refframe, &near_mvs[vcnt], ref_frame_sign_bias);
1442
462k
        near_ref[vcnt] =
1443
462k
            cpi->lf_ref_frame[mb_offset + xd->mode_info_stride + 1];
1444
462k
      }
1445
1.47M
      vcnt++;
1446
1.47M
    }
1447
1448
7.68M
    for (i = 0; i < vcnt; ++i) {
1449
6.92M
      if (near_ref[near_sadidx[i]] != INTRA_FRAME) {
1450
2.26M
        if (here->mbmi.ref_frame == near_ref[near_sadidx[i]]) {
1451
946k
          mv.as_int = near_mvs[near_sadidx[i]].as_int;
1452
946k
          find = 1;
1453
946k
          if (i < 3) {
1454
870k
            *sr = 3;
1455
870k
          } else {
1456
75.9k
            *sr = 2;
1457
75.9k
          }
1458
946k
          break;
1459
946k
        }
1460
2.26M
      }
1461
6.92M
    }
1462
1463
1.70M
    if (!find) {
1464
6.17M
      for (i = 0; i < vcnt; ++i) {
1465
5.41M
        mvx[i] = near_mvs[i].as_mv.row;
1466
5.41M
        mvy[i] = near_mvs[i].as_mv.col;
1467
5.41M
      }
1468
1469
761k
      insertsortmv(mvx, vcnt);
1470
761k
      insertsortmv(mvy, vcnt);
1471
761k
      mv.as_mv.row = mvx[vcnt / 2];
1472
761k
      mv.as_mv.col = mvy[vcnt / 2];
1473
1474
      /* sr is set to 0 to allow calling function to decide the search
1475
       * range.
1476
       */
1477
761k
      *sr = 0;
1478
761k
    }
1479
1.70M
  }
1480
1481
  /* Set up return values */
1482
1.70M
  mvp->as_int = mv.as_int;
1483
1.70M
  vp8_clamp_mv2(mvp, xd);
1484
1.70M
}
1485
1486
void vp8_cal_sad(VP8_COMP *cpi, MACROBLOCKD *xd, MACROBLOCK *x,
1487
1.11M
                 int recon_yoffset, int near_sadidx[]) {
1488
  /* near_sad indexes:
1489
   *   0-cf above, 1-cf left, 2-cf aboveleft,
1490
   *   3-lf current, 4-lf above, 5-lf left, 6-lf right, 7-lf below
1491
   */
1492
1.11M
  int near_sad[8] = { 0 };
1493
1.11M
  BLOCK *b = &x->block[0];
1494
1.11M
  unsigned char *src_y_ptr = *(b->base_src);
1495
1496
  /* calculate sad for current frame 3 nearby MBs. */
1497
1.11M
  if (xd->mb_to_top_edge == 0 && xd->mb_to_left_edge == 0) {
1498
276k
    near_sad[0] = near_sad[1] = near_sad[2] = INT_MAX;
1499
836k
  } else if (xd->mb_to_top_edge ==
1500
836k
             0) { /* only has left MB for sad calculation. */
1501
290k
    near_sad[0] = near_sad[2] = INT_MAX;
1502
290k
    near_sad[1] = cpi->fn_ptr[BLOCK_16X16].sdf(
1503
290k
        src_y_ptr, b->src_stride, xd->dst.y_buffer - 16, xd->dst.y_stride);
1504
545k
  } else if (xd->mb_to_left_edge ==
1505
545k
             0) { /* only has left MB for sad calculation. */
1506
185k
    near_sad[1] = near_sad[2] = INT_MAX;
1507
185k
    near_sad[0] = cpi->fn_ptr[BLOCK_16X16].sdf(
1508
185k
        src_y_ptr, b->src_stride, xd->dst.y_buffer - xd->dst.y_stride * 16,
1509
185k
        xd->dst.y_stride);
1510
359k
  } else {
1511
359k
    near_sad[0] = cpi->fn_ptr[BLOCK_16X16].sdf(
1512
359k
        src_y_ptr, b->src_stride, xd->dst.y_buffer - xd->dst.y_stride * 16,
1513
359k
        xd->dst.y_stride);
1514
359k
    near_sad[1] = cpi->fn_ptr[BLOCK_16X16].sdf(
1515
359k
        src_y_ptr, b->src_stride, xd->dst.y_buffer - 16, xd->dst.y_stride);
1516
359k
    near_sad[2] = cpi->fn_ptr[BLOCK_16X16].sdf(
1517
359k
        src_y_ptr, b->src_stride, xd->dst.y_buffer - xd->dst.y_stride * 16 - 16,
1518
359k
        xd->dst.y_stride);
1519
359k
  }
1520
1521
1.11M
  if (cpi->common.last_frame_type != KEY_FRAME) {
1522
    /* calculate sad for last frame 5 nearby MBs. */
1523
878k
    unsigned char *pre_y_buffer =
1524
878k
        cpi->common.yv12_fb[cpi->common.lst_fb_idx].y_buffer + recon_yoffset;
1525
878k
    int pre_y_stride = cpi->common.yv12_fb[cpi->common.lst_fb_idx].y_stride;
1526
1527
878k
    if (xd->mb_to_top_edge == 0) near_sad[4] = INT_MAX;
1528
878k
    if (xd->mb_to_left_edge == 0) near_sad[5] = INT_MAX;
1529
878k
    if (xd->mb_to_right_edge == 0) near_sad[6] = INT_MAX;
1530
878k
    if (xd->mb_to_bottom_edge == 0) near_sad[7] = INT_MAX;
1531
1532
878k
    if (near_sad[4] != INT_MAX) {
1533
427k
      near_sad[4] = cpi->fn_ptr[BLOCK_16X16].sdf(
1534
427k
          src_y_ptr, b->src_stride, pre_y_buffer - pre_y_stride * 16,
1535
427k
          pre_y_stride);
1536
427k
    }
1537
878k
    if (near_sad[5] != INT_MAX) {
1538
510k
      near_sad[5] = cpi->fn_ptr[BLOCK_16X16].sdf(
1539
510k
          src_y_ptr, b->src_stride, pre_y_buffer - 16, pre_y_stride);
1540
510k
    }
1541
878k
    near_sad[3] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride,
1542
878k
                                               pre_y_buffer, pre_y_stride);
1543
878k
    if (near_sad[6] != INT_MAX) {
1544
515k
      near_sad[6] = cpi->fn_ptr[BLOCK_16X16].sdf(
1545
515k
          src_y_ptr, b->src_stride, pre_y_buffer + 16, pre_y_stride);
1546
515k
    }
1547
878k
    if (near_sad[7] != INT_MAX) {
1548
436k
      near_sad[7] = cpi->fn_ptr[BLOCK_16X16].sdf(
1549
436k
          src_y_ptr, b->src_stride, pre_y_buffer + pre_y_stride * 16,
1550
436k
          pre_y_stride);
1551
436k
    }
1552
878k
  }
1553
1554
1.11M
  if (cpi->common.last_frame_type != KEY_FRAME) {
1555
878k
    insertsortsad(near_sad, near_sadidx, 8);
1556
878k
  } else {
1557
233k
    insertsortsad(near_sad, near_sadidx, 3);
1558
233k
  }
1559
1.11M
}
1560
1561
829k
static void rd_update_mvcount(MACROBLOCK *x, int_mv *best_ref_mv) {
1562
829k
  if (x->e_mbd.mode_info_context->mbmi.mode == SPLITMV) {
1563
210k
    int i;
1564
1565
2.75M
    for (i = 0; i < x->partition_info->count; ++i) {
1566
2.54M
      if (x->partition_info->bmi[i].mode == NEW4X4) {
1567
1.03M
        const int row_val = ((x->partition_info->bmi[i].mv.as_mv.row -
1568
1.03M
                              best_ref_mv->as_mv.row) >>
1569
1.03M
                             1);
1570
1.03M
        const int row_idx = mv_max + row_val;
1571
1.03M
        const int col_val = ((x->partition_info->bmi[i].mv.as_mv.col -
1572
1.03M
                              best_ref_mv->as_mv.col) >>
1573
1.03M
                             1);
1574
1.03M
        const int col_idx = mv_max + col_val;
1575
1.03M
        if (row_idx >= 0 && row_idx < MVvals && col_idx >= 0 &&
1576
1.03M
            col_idx < MVvals) {
1577
1.03M
          x->MVcount[0][row_idx]++;
1578
1.03M
          x->MVcount[1][col_idx]++;
1579
1.03M
        }
1580
1.03M
      }
1581
2.54M
    }
1582
619k
  } else if (x->e_mbd.mode_info_context->mbmi.mode == NEWMV) {
1583
122k
    const int row_val = ((x->e_mbd.mode_info_context->mbmi.mv.as_mv.row -
1584
122k
                          best_ref_mv->as_mv.row) >>
1585
122k
                         1);
1586
122k
    const int row_idx = mv_max + row_val;
1587
122k
    const int col_val = ((x->e_mbd.mode_info_context->mbmi.mv.as_mv.col -
1588
122k
                          best_ref_mv->as_mv.col) >>
1589
122k
                         1);
1590
122k
    const int col_idx = mv_max + col_val;
1591
122k
    if (row_idx >= 0 && row_idx < MVvals && col_idx >= 0 && col_idx < MVvals) {
1592
122k
      x->MVcount[0][row_idx]++;
1593
122k
      x->MVcount[1][col_idx]++;
1594
122k
    }
1595
122k
  }
1596
829k
}
1597
1598
static int evaluate_inter_mode_rd(int mdcounts[4], RATE_DISTORTION *rd,
1599
                                  int *disable_skip, VP8_COMP *cpi,
1600
3.28M
                                  MACROBLOCK *x) {
1601
3.28M
  MB_PREDICTION_MODE this_mode = x->e_mbd.mode_info_context->mbmi.mode;
1602
3.28M
  BLOCK *b = &x->block[0];
1603
3.28M
  MACROBLOCKD *xd = &x->e_mbd;
1604
3.28M
  int distortion;
1605
3.28M
  vp8_build_inter16x16_predictors_mby(&x->e_mbd, x->e_mbd.predictor, 16);
1606
1607
3.28M
  if (cpi->active_map_enabled && x->active_ptr[0] == 0) {
1608
0
    x->skip = 1;
1609
3.28M
  } else if (x->encode_breakout) {
1610
0
    unsigned int sse;
1611
0
    unsigned int var;
1612
0
    unsigned int threshold =
1613
0
        (xd->block[0].dequant[1] * xd->block[0].dequant[1] >> 4);
1614
1615
0
    if (threshold < x->encode_breakout) threshold = x->encode_breakout;
1616
1617
0
    var = vpx_variance16x16(*(b->base_src), b->src_stride, x->e_mbd.predictor,
1618
0
                            16, &sse);
1619
1620
0
    if (sse < threshold) {
1621
0
      unsigned int q2dc = xd->block[24].dequant[0];
1622
      /* If theres is no codeable 2nd order dc
1623
         or a very small uniform pixel change change */
1624
0
      if ((sse - var < q2dc * q2dc >> 4) || (sse / 2 > var && sse - var < 64)) {
1625
        /* Check u and v to make sure skip is ok */
1626
0
        unsigned int sse2 = VP8_UVSSE(x);
1627
0
        if (sse2 * 2 < threshold) {
1628
0
          x->skip = 1;
1629
0
          rd->distortion2 = sse + sse2;
1630
0
          rd->rate2 = 500;
1631
1632
          /* for best_yrd calculation */
1633
0
          rd->rate_uv = 0;
1634
0
          rd->distortion_uv = sse2;
1635
1636
0
          *disable_skip = 1;
1637
0
          return RDCOST(x->rdmult, x->rddiv, rd->rate2, rd->distortion2);
1638
0
        }
1639
0
      }
1640
0
    }
1641
0
  }
1642
1643
  /* Add in the Mv/mode cost */
1644
3.28M
  rd->rate2 += vp8_cost_mv_ref(this_mode, mdcounts);
1645
1646
  /* Y cost and distortion */
1647
3.28M
  macro_block_yrd(x, &rd->rate_y, &distortion);
1648
3.28M
  rd->rate2 += rd->rate_y;
1649
3.28M
  rd->distortion2 += distortion;
1650
1651
  /* UV cost and distortion */
1652
3.28M
  rd_inter16x16_uv(cpi, x, &rd->rate_uv, &rd->distortion_uv,
1653
3.28M
                   cpi->common.full_pixel);
1654
3.28M
  rd->rate2 += rd->rate_uv;
1655
3.28M
  rd->distortion2 += rd->distortion_uv;
1656
3.28M
  return INT_MAX;
1657
3.28M
}
1658
1659
static int calculate_final_rd_costs(int this_rd, RATE_DISTORTION *rd,
1660
                                    int *other_cost, int disable_skip,
1661
                                    int uv_intra_tteob, int intra_rd_penalty,
1662
7.97M
                                    VP8_COMP *cpi, MACROBLOCK *x) {
1663
7.97M
  MB_PREDICTION_MODE this_mode = x->e_mbd.mode_info_context->mbmi.mode;
1664
1665
  /* Where skip is allowable add in the default per mb cost for the no
1666
   * skip case. where we then decide to skip we have to delete this and
1667
   * replace it with the cost of signalling a skip
1668
   */
1669
7.97M
  if (cpi->common.mb_no_coeff_skip) {
1670
7.97M
    *other_cost += vp8_cost_bit(cpi->prob_skip_false, 0);
1671
7.97M
    rd->rate2 += *other_cost;
1672
7.97M
  }
1673
1674
  /* Estimate the reference frame signaling cost and add it
1675
   * to the rolling cost variable.
1676
   */
1677
7.97M
  rd->rate2 += x->ref_frame_cost[x->e_mbd.mode_info_context->mbmi.ref_frame];
1678
1679
7.97M
  if (!disable_skip) {
1680
    /* Test for the condition where skip block will be activated
1681
     * because there are no non zero coefficients and make any
1682
     * necessary adjustment for rate
1683
     */
1684
6.87M
    if (cpi->common.mb_no_coeff_skip) {
1685
6.87M
      int i;
1686
6.87M
      int tteob;
1687
6.87M
      int has_y2_block = (this_mode != SPLITMV && this_mode != B_PRED);
1688
1689
6.87M
      tteob = 0;
1690
6.87M
      if (has_y2_block) tteob += x->e_mbd.eobs[24];
1691
1692
116M
      for (i = 0; i < 16; ++i) tteob += (x->e_mbd.eobs[i] > has_y2_block);
1693
1694
6.87M
      if (x->e_mbd.mode_info_context->mbmi.ref_frame) {
1695
33.5M
        for (i = 16; i < 24; ++i) tteob += x->e_mbd.eobs[i];
1696
3.72M
      } else {
1697
3.14M
        tteob += uv_intra_tteob;
1698
3.14M
      }
1699
1700
6.87M
      if (tteob == 0) {
1701
275k
        rd->rate2 -= (rd->rate_y + rd->rate_uv);
1702
        /* for best_yrd calculation */
1703
275k
        rd->rate_uv = 0;
1704
1705
        /* Back out no skip flag costing and add in skip flag costing */
1706
275k
        if (cpi->prob_skip_false) {
1707
275k
          int prob_skip_cost;
1708
1709
275k
          prob_skip_cost = vp8_cost_bit(cpi->prob_skip_false, 1);
1710
275k
          prob_skip_cost -= (int)vp8_cost_bit(cpi->prob_skip_false, 0);
1711
275k
          rd->rate2 += prob_skip_cost;
1712
275k
          *other_cost += prob_skip_cost;
1713
275k
        }
1714
275k
      }
1715
6.87M
    }
1716
    /* Calculate the final RD estimate for this mode */
1717
6.87M
    this_rd = RDCOST(x->rdmult, x->rddiv, rd->rate2, rd->distortion2);
1718
6.87M
    if (this_rd < INT_MAX &&
1719
6.87M
        x->e_mbd.mode_info_context->mbmi.ref_frame == INTRA_FRAME) {
1720
3.14M
      this_rd += intra_rd_penalty;
1721
3.14M
    }
1722
6.87M
  }
1723
7.97M
  return this_rd;
1724
7.97M
}
1725
1726
static void update_best_mode(BEST_MODE *best_mode, int this_rd,
1727
                             RATE_DISTORTION *rd, int other_cost,
1728
2.52M
                             MACROBLOCK *x) {
1729
2.52M
  MB_PREDICTION_MODE this_mode = x->e_mbd.mode_info_context->mbmi.mode;
1730
1731
2.52M
  other_cost += x->ref_frame_cost[x->e_mbd.mode_info_context->mbmi.ref_frame];
1732
1733
  /* Calculate the final y RD estimate for this mode */
1734
2.52M
  best_mode->yrd =
1735
2.52M
      RDCOST(x->rdmult, x->rddiv, (rd->rate2 - rd->rate_uv - other_cost),
1736
2.52M
             (rd->distortion2 - rd->distortion_uv));
1737
1738
2.52M
  best_mode->rd = this_rd;
1739
2.52M
  best_mode->mbmode = x->e_mbd.mode_info_context->mbmi;
1740
2.52M
  best_mode->partition = *x->partition_info;
1741
1742
2.52M
  if ((this_mode == B_PRED) || (this_mode == SPLITMV)) {
1743
522k
    int i;
1744
8.87M
    for (i = 0; i < 16; ++i) {
1745
8.35M
      best_mode->bmodes[i] = x->e_mbd.block[i].bmi;
1746
8.35M
    }
1747
522k
  }
1748
2.52M
}
1749
1750
void vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset,
1751
                            int recon_uvoffset, int *returnrate,
1752
                            int *returndistortion, int *returnintra, int mb_row,
1753
829k
                            int mb_col) {
1754
829k
  BLOCK *b = &x->block[0];
1755
829k
  BLOCKD *d = &x->e_mbd.block[0];
1756
829k
  MACROBLOCKD *xd = &x->e_mbd;
1757
829k
  int_mv best_ref_mv_sb[2];
1758
829k
  int_mv mode_mv_sb[2][MB_MODE_COUNT];
1759
829k
  int_mv best_ref_mv;
1760
829k
  int_mv *mode_mv;
1761
829k
  MB_PREDICTION_MODE this_mode;
1762
829k
  int num00;
1763
829k
  int best_mode_index = 0;
1764
829k
  BEST_MODE best_mode;
1765
1766
829k
  int i;
1767
829k
  int mode_index;
1768
829k
  int mdcounts[4];
1769
829k
  int rate;
1770
829k
  RATE_DISTORTION rd;
1771
829k
  int uv_intra_rate, uv_intra_distortion, uv_intra_rate_tokenonly;
1772
829k
  int uv_intra_tteob = 0;
1773
829k
  int uv_intra_done = 0;
1774
1775
829k
  MB_PREDICTION_MODE uv_intra_mode = 0;
1776
829k
  int_mv mvp;
1777
829k
  int near_sadidx[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
1778
829k
  int saddone = 0;
1779
  /* search range got from mv_pred(). It uses step_param levels. (0-7) */
1780
829k
  int sr = 0;
1781
1782
829k
  unsigned char *plane[4][3] = { { 0, 0 } };
1783
829k
  int ref_frame_map[4];
1784
829k
  int sign_bias = 0;
1785
1786
829k
  int intra_rd_penalty =
1787
829k
      10 * vp8_dc_quant(cpi->common.base_qindex, cpi->common.y1dc_delta_q);
1788
1789
829k
#if CONFIG_TEMPORAL_DENOISING
1790
829k
  unsigned int zero_mv_sse = UINT_MAX, best_sse = UINT_MAX,
1791
829k
               best_rd_sse = UINT_MAX;
1792
829k
#endif
1793
1794
  // _uv variables are not set consistantly before calling update_best_mode.
1795
829k
  rd.rate_uv = 0;
1796
829k
  rd.distortion_uv = 0;
1797
1798
829k
  mode_mv = mode_mv_sb[sign_bias];
1799
829k
  best_ref_mv.as_int = 0;
1800
829k
  best_mode.rd = INT_MAX;
1801
829k
  best_mode.yrd = INT_MAX;
1802
829k
  best_mode.intra_rd = INT_MAX;
1803
829k
  memset(mode_mv_sb, 0, sizeof(mode_mv_sb));
1804
829k
  memset(&best_mode.mbmode, 0, sizeof(best_mode.mbmode));
1805
829k
  memset(&best_mode.bmodes, 0, sizeof(best_mode.bmodes));
1806
1807
  /* Setup search priorities */
1808
829k
  get_reference_search_order(cpi, ref_frame_map);
1809
1810
  /* Check to see if there is at least 1 valid reference frame that we need
1811
   * to calculate near_mvs.
1812
   */
1813
829k
  if (ref_frame_map[1] > 0) {
1814
829k
    sign_bias = vp8_find_near_mvs_bias(
1815
829k
        &x->e_mbd, x->e_mbd.mode_info_context, mode_mv_sb, best_ref_mv_sb,
1816
829k
        mdcounts, ref_frame_map[1], cpi->common.ref_frame_sign_bias);
1817
1818
829k
    mode_mv = mode_mv_sb[sign_bias];
1819
829k
    best_ref_mv.as_int = best_ref_mv_sb[sign_bias].as_int;
1820
829k
  }
1821
1822
829k
  get_predictor_pointers(cpi, plane, recon_yoffset, recon_uvoffset);
1823
1824
829k
  *returnintra = INT_MAX;
1825
  /* Count of the number of MBs tested so far this frame */
1826
829k
  x->mbs_tested_so_far++;
1827
1828
829k
  x->skip = 0;
1829
1830
17.4M
  for (mode_index = 0; mode_index < MAX_MODES; ++mode_index) {
1831
16.5M
    int this_rd = INT_MAX;
1832
16.5M
    int disable_skip = 0;
1833
16.5M
    int other_cost = 0;
1834
16.5M
    int this_ref_frame = ref_frame_map[vp8_ref_frame_order[mode_index]];
1835
1836
    /* Test best rd so far against threshold for trying this mode. */
1837
16.5M
    if (best_mode.rd <= x->rd_threshes[mode_index]) continue;
1838
1839
15.1M
    if (this_ref_frame < 0) continue;
1840
1841
    /* These variables hold are rolling total cost and distortion for
1842
     * this mode
1843
     */
1844
10.1M
    rd.rate2 = 0;
1845
10.1M
    rd.distortion2 = 0;
1846
1847
10.1M
    this_mode = vp8_mode_order[mode_index];
1848
1849
10.1M
    x->e_mbd.mode_info_context->mbmi.mode = this_mode;
1850
10.1M
    x->e_mbd.mode_info_context->mbmi.ref_frame = this_ref_frame;
1851
1852
    /* Only consider ZEROMV/ALTREF_FRAME for alt ref frame,
1853
     * unless ARNR filtering is enabled in which case we want
1854
     * an unfiltered alternative
1855
     */
1856
10.1M
    if (cpi->is_src_frame_alt_ref && (cpi->oxcf.arnr_max_frames == 0)) {
1857
0
      if (this_mode != ZEROMV ||
1858
0
          x->e_mbd.mode_info_context->mbmi.ref_frame != ALTREF_FRAME) {
1859
0
        continue;
1860
0
      }
1861
0
    }
1862
1863
    /* everything but intra */
1864
10.1M
    if (x->e_mbd.mode_info_context->mbmi.ref_frame) {
1865
6.60M
      assert(plane[this_ref_frame][0] != NULL &&
1866
6.60M
             plane[this_ref_frame][1] != NULL &&
1867
6.60M
             plane[this_ref_frame][2] != NULL);
1868
6.60M
      x->e_mbd.pre.y_buffer = plane[this_ref_frame][0];
1869
6.60M
      x->e_mbd.pre.u_buffer = plane[this_ref_frame][1];
1870
6.60M
      x->e_mbd.pre.v_buffer = plane[this_ref_frame][2];
1871
1872
6.60M
      if (sign_bias != cpi->common.ref_frame_sign_bias[this_ref_frame]) {
1873
0
        sign_bias = cpi->common.ref_frame_sign_bias[this_ref_frame];
1874
0
        mode_mv = mode_mv_sb[sign_bias];
1875
0
        best_ref_mv.as_int = best_ref_mv_sb[sign_bias].as_int;
1876
0
      }
1877
6.60M
    }
1878
1879
    /* Check to see if the testing frequency for this mode is at its
1880
     * max If so then prevent it from being tested and increase the
1881
     * threshold for its testing
1882
     */
1883
10.1M
    if (x->mode_test_hit_counts[mode_index] &&
1884
7.24M
        (cpi->mode_check_freq[mode_index] > 1)) {
1885
0
      if (x->mbs_tested_so_far <= cpi->mode_check_freq[mode_index] *
1886
0
                                      x->mode_test_hit_counts[mode_index]) {
1887
        /* Increase the threshold for coding this mode to make it
1888
         * less likely to be chosen
1889
         */
1890
0
        x->rd_thresh_mult[mode_index] += 4;
1891
1892
0
        if (x->rd_thresh_mult[mode_index] > MAX_THRESHMULT) {
1893
0
          x->rd_thresh_mult[mode_index] = MAX_THRESHMULT;
1894
0
        }
1895
1896
0
        x->rd_threshes[mode_index] =
1897
0
            (cpi->rd_baseline_thresh[mode_index] >> 7) *
1898
0
            x->rd_thresh_mult[mode_index];
1899
1900
0
        continue;
1901
0
      }
1902
0
    }
1903
1904
    /* We have now reached the point where we are going to test the
1905
     * current mode so increment the counter for the number of times
1906
     * it has been tested
1907
     */
1908
10.1M
    x->mode_test_hit_counts[mode_index]++;
1909
1910
    /* Experimental code. Special case for gf and arf zeromv modes.
1911
     * Increase zbin size to supress noise
1912
     */
1913
10.1M
    if (x->zbin_mode_boost_enabled) {
1914
10.1M
      if (this_ref_frame == INTRA_FRAME) {
1915
3.59M
        x->zbin_mode_boost = 0;
1916
6.60M
      } else {
1917
6.60M
        if (vp8_mode_order[mode_index] == ZEROMV) {
1918
1.42M
          if (this_ref_frame != LAST_FRAME) {
1919
595k
            x->zbin_mode_boost = GF_ZEROMV_ZBIN_BOOST;
1920
829k
          } else {
1921
829k
            x->zbin_mode_boost = LF_ZEROMV_ZBIN_BOOST;
1922
829k
          }
1923
5.17M
        } else if (vp8_mode_order[mode_index] == SPLITMV) {
1924
1.10M
          x->zbin_mode_boost = 0;
1925
4.07M
        } else {
1926
4.07M
          x->zbin_mode_boost = MV_ZBIN_BOOST;
1927
4.07M
        }
1928
6.60M
      }
1929
1930
10.1M
      vp8_update_zbin_extra(cpi, x);
1931
10.1M
    }
1932
1933
10.1M
    if (!uv_intra_done && this_ref_frame == INTRA_FRAME) {
1934
829k
      rd_pick_intra_mbuv_mode(x, &uv_intra_rate, &uv_intra_rate_tokenonly,
1935
829k
                              &uv_intra_distortion);
1936
829k
      uv_intra_mode = x->e_mbd.mode_info_context->mbmi.uv_mode;
1937
1938
      /*
1939
       * Total of the eobs is used later to further adjust rate2. Since uv
1940
       * block's intra eobs will be overwritten when we check inter modes,
1941
       * we need to save uv_intra_tteob here.
1942
       */
1943
7.46M
      for (i = 16; i < 24; ++i) uv_intra_tteob += x->e_mbd.eobs[i];
1944
1945
829k
      uv_intra_done = 1;
1946
829k
    }
1947
1948
10.1M
    switch (this_mode) {
1949
677k
      case B_PRED: {
1950
677k
        int tmp_rd;
1951
1952
        /* Note the rate value returned here includes the cost of
1953
         * coding the BPRED mode: x->mbmode_cost[x->e_mbd.frame_type][BPRED]
1954
         */
1955
677k
        int distortion;
1956
677k
        tmp_rd = rd_pick_intra4x4mby_modes(x, &rate, &rd.rate_y, &distortion,
1957
677k
                                           best_mode.yrd);
1958
677k
        rd.rate2 += rate;
1959
677k
        rd.distortion2 += distortion;
1960
1961
677k
        if (tmp_rd < best_mode.yrd) {
1962
231k
          assert(uv_intra_done);
1963
231k
          rd.rate2 += uv_intra_rate;
1964
231k
          rd.rate_uv = uv_intra_rate_tokenonly;
1965
231k
          rd.distortion2 += uv_intra_distortion;
1966
231k
          rd.distortion_uv = uv_intra_distortion;
1967
446k
        } else {
1968
446k
          this_rd = INT_MAX;
1969
446k
          disable_skip = 1;
1970
446k
        }
1971
677k
        break;
1972
677k
      }
1973
1974
1.10M
      case SPLITMV: {
1975
1.10M
        int tmp_rd;
1976
1.10M
        int this_rd_thresh;
1977
1.10M
        int distortion;
1978
1979
1.10M
        this_rd_thresh = (vp8_ref_frame_order[mode_index] == 1)
1980
1.10M
                             ? x->rd_threshes[THR_NEW1]
1981
1.10M
                             : x->rd_threshes[THR_NEW3];
1982
1.10M
        this_rd_thresh = (vp8_ref_frame_order[mode_index] == 2)
1983
1.10M
                             ? x->rd_threshes[THR_NEW2]
1984
1.10M
                             : this_rd_thresh;
1985
1986
1.10M
        tmp_rd = vp8_rd_pick_best_mbsegmentation(
1987
1.10M
            cpi, x, &best_ref_mv, best_mode.yrd, mdcounts, &rate, &rd.rate_y,
1988
1.10M
            &distortion, this_rd_thresh);
1989
1990
1.10M
        rd.rate2 += rate;
1991
1.10M
        rd.distortion2 += distortion;
1992
1993
        /* If even the 'Y' rd value of split is higher than best so far
1994
         * then don't bother looking at UV
1995
         */
1996
1.10M
        if (tmp_rd < best_mode.yrd) {
1997
          /* Now work out UV cost and add it in */
1998
447k
          rd_inter4x4_uv(cpi, x, &rd.rate_uv, &rd.distortion_uv,
1999
447k
                         cpi->common.full_pixel);
2000
447k
          rd.rate2 += rd.rate_uv;
2001
447k
          rd.distortion2 += rd.distortion_uv;
2002
654k
        } else {
2003
654k
          this_rd = INT_MAX;
2004
654k
          disable_skip = 1;
2005
654k
        }
2006
1.10M
        break;
2007
677k
      }
2008
829k
      case DC_PRED:
2009
1.52M
      case V_PRED:
2010
2.22M
      case H_PRED:
2011
2.91M
      case TM_PRED: {
2012
2.91M
        int distortion;
2013
2.91M
        x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME;
2014
2015
2.91M
        vp8_build_intra_predictors_mby_s(
2016
2.91M
            xd, xd->dst.y_buffer - xd->dst.y_stride, xd->dst.y_buffer - 1,
2017
2.91M
            xd->dst.y_stride, xd->predictor, 16);
2018
2.91M
        macro_block_yrd(x, &rd.rate_y, &distortion);
2019
2.91M
        rd.rate2 += rd.rate_y;
2020
2.91M
        rd.distortion2 += distortion;
2021
2.91M
        rd.rate2 += x->mbmode_cost[x->e_mbd.frame_type]
2022
2.91M
                                  [x->e_mbd.mode_info_context->mbmi.mode];
2023
2.91M
        assert(uv_intra_done);
2024
2.91M
        rd.rate2 += uv_intra_rate;
2025
2.91M
        rd.rate_uv = uv_intra_rate_tokenonly;
2026
2.91M
        rd.distortion2 += uv_intra_distortion;
2027
2.91M
        rd.distortion_uv = uv_intra_distortion;
2028
2.91M
        break;
2029
2.91M
      }
2030
2031
1.22M
      case NEWMV: {
2032
1.22M
        int thissme;
2033
1.22M
        int bestsme = INT_MAX;
2034
1.22M
        int step_param = cpi->sf.first_step;
2035
1.22M
        int further_steps;
2036
1.22M
        int n;
2037
        /* If last step (1-away) of n-step search doesn't pick the center point
2038
           as the best match, we will do a final 1-away diamond refining search
2039
        */
2040
1.22M
        int do_refine = 1;
2041
2042
1.22M
        int sadpb = x->sadperbit16;
2043
1.22M
        int_mv mvp_full;
2044
2045
1.22M
        int col_min = ((best_ref_mv.as_mv.col + 7) >> 3) - MAX_FULL_PEL_VAL;
2046
1.22M
        int row_min = ((best_ref_mv.as_mv.row + 7) >> 3) - MAX_FULL_PEL_VAL;
2047
1.22M
        int col_max = (best_ref_mv.as_mv.col >> 3) + MAX_FULL_PEL_VAL;
2048
1.22M
        int row_max = (best_ref_mv.as_mv.row >> 3) + MAX_FULL_PEL_VAL;
2049
2050
1.22M
        int tmp_col_min = x->mv_col_min;
2051
1.22M
        int tmp_col_max = x->mv_col_max;
2052
1.22M
        int tmp_row_min = x->mv_row_min;
2053
1.22M
        int tmp_row_max = x->mv_row_max;
2054
2055
1.22M
        if (!saddone) {
2056
726k
          vp8_cal_sad(cpi, xd, x, recon_yoffset, &near_sadidx[0]);
2057
726k
          saddone = 1;
2058
726k
        }
2059
2060
1.22M
        vp8_mv_pred(cpi, &x->e_mbd, x->e_mbd.mode_info_context, &mvp,
2061
1.22M
                    x->e_mbd.mode_info_context->mbmi.ref_frame,
2062
1.22M
                    cpi->common.ref_frame_sign_bias, &sr, &near_sadidx[0]);
2063
2064
1.22M
        mvp_full.as_mv.col = mvp.as_mv.col >> 3;
2065
1.22M
        mvp_full.as_mv.row = mvp.as_mv.row >> 3;
2066
2067
        /* Get intersection of UMV window and valid MV window to
2068
         * reduce # of checks in diamond search.
2069
         */
2070
1.22M
        if (x->mv_col_min < col_min) x->mv_col_min = col_min;
2071
1.22M
        if (x->mv_col_max > col_max) x->mv_col_max = col_max;
2072
1.22M
        if (x->mv_row_min < row_min) x->mv_row_min = row_min;
2073
1.22M
        if (x->mv_row_max > row_max) x->mv_row_max = row_max;
2074
2075
        /* adjust search range according to sr from mv prediction */
2076
1.22M
        if (sr > step_param) step_param = sr;
2077
2078
        /* Initial step/diamond search */
2079
1.22M
        {
2080
1.22M
          bestsme = cpi->diamond_search_sad(
2081
1.22M
              x, b, d, &mvp_full, &d->bmi.mv, step_param, sadpb, &num00,
2082
1.22M
              &cpi->fn_ptr[BLOCK_16X16], x->mvcost, &best_ref_mv);
2083
1.22M
          mode_mv[NEWMV].as_int = d->bmi.mv.as_int;
2084
2085
          /* Further step/diamond searches as necessary */
2086
1.22M
          further_steps = (cpi->sf.max_step_search_steps - 1) - step_param;
2087
2088
1.22M
          n = num00;
2089
1.22M
          num00 = 0;
2090
2091
          /* If there won't be more n-step search, check to see if refining
2092
           * search is needed. */
2093
1.22M
          if (n > further_steps) do_refine = 0;
2094
2095
4.72M
          while (n < further_steps) {
2096
3.50M
            n++;
2097
2098
3.50M
            if (num00) {
2099
387k
              num00--;
2100
3.11M
            } else {
2101
3.11M
              thissme = cpi->diamond_search_sad(
2102
3.11M
                  x, b, d, &mvp_full, &d->bmi.mv, step_param + n, sadpb, &num00,
2103
3.11M
                  &cpi->fn_ptr[BLOCK_16X16], x->mvcost, &best_ref_mv);
2104
2105
              /* check to see if refining search is needed. */
2106
3.11M
              if (num00 > (further_steps - n)) do_refine = 0;
2107
2108
3.11M
              if (thissme < bestsme) {
2109
442k
                bestsme = thissme;
2110
442k
                mode_mv[NEWMV].as_int = d->bmi.mv.as_int;
2111
2.67M
              } else {
2112
2.67M
                d->bmi.mv.as_int = mode_mv[NEWMV].as_int;
2113
2.67M
              }
2114
3.11M
            }
2115
3.50M
          }
2116
1.22M
        }
2117
2118
        /* final 1-away diamond refining search */
2119
1.22M
        if (do_refine == 1) {
2120
719k
          int search_range;
2121
2122
719k
          search_range = 8;
2123
2124
719k
          thissme = cpi->refining_search_sad(
2125
719k
              x, b, d, &d->bmi.mv, sadpb, search_range,
2126
719k
              &cpi->fn_ptr[BLOCK_16X16], x->mvcost, &best_ref_mv);
2127
2128
719k
          if (thissme < bestsme) {
2129
30.5k
            bestsme = thissme;
2130
30.5k
            mode_mv[NEWMV].as_int = d->bmi.mv.as_int;
2131
688k
          } else {
2132
688k
            d->bmi.mv.as_int = mode_mv[NEWMV].as_int;
2133
688k
          }
2134
719k
        }
2135
2136
1.22M
        x->mv_col_min = tmp_col_min;
2137
1.22M
        x->mv_col_max = tmp_col_max;
2138
1.22M
        x->mv_row_min = tmp_row_min;
2139
1.22M
        x->mv_row_max = tmp_row_max;
2140
2141
1.22M
        if (bestsme < INT_MAX) {
2142
1.22M
          int dis; /* TODO: use dis in distortion calculation later. */
2143
1.22M
          unsigned int sse;
2144
1.22M
          cpi->find_fractional_mv_step(
2145
1.22M
              x, b, d, &d->bmi.mv, &best_ref_mv, x->errorperbit,
2146
1.22M
              &cpi->fn_ptr[BLOCK_16X16], x->mvcost, &dis, &sse);
2147
1.22M
        }
2148
2149
1.22M
        mode_mv[NEWMV].as_int = d->bmi.mv.as_int;
2150
2151
        /* Add the new motion vector cost to our rolling cost variable */
2152
1.22M
        rd.rate2 +=
2153
1.22M
            vp8_mv_bit_cost(&mode_mv[NEWMV], &best_ref_mv, x->mvcost, 96);
2154
1.22M
      }
2155
        // fall through
2156
2157
2.64M
      case NEARESTMV:
2158
4.07M
      case NEARMV:
2159
        /* Clip "next_nearest" so that it does not extend to far out
2160
         * of image
2161
         */
2162
4.07M
        vp8_clamp_mv2(&mode_mv[this_mode], xd);
2163
2164
        /* Do not bother proceeding if the vector (from newmv, nearest
2165
         * or near) is 0,0 as this should then be coded using the zeromv
2166
         * mode.
2167
         */
2168
4.07M
        if (((this_mode == NEARMV) || (this_mode == NEARESTMV)) &&
2169
2.85M
            (mode_mv[this_mode].as_int == 0)) {
2170
2.21M
          continue;
2171
2.21M
        }
2172
        // fall through
2173
2174
3.28M
      case ZEROMV:
2175
2176
        /* Trap vectors that reach beyond the UMV borders
2177
         * Note that ALL New MV, Nearest MV Near MV and Zero MV code
2178
         * drops through to this point because of the lack of break
2179
         * statements in the previous two cases.
2180
         */
2181
3.28M
        if (((mode_mv[this_mode].as_mv.row >> 3) < x->mv_row_min) ||
2182
3.28M
            ((mode_mv[this_mode].as_mv.row >> 3) > x->mv_row_max) ||
2183
3.28M
            ((mode_mv[this_mode].as_mv.col >> 3) < x->mv_col_min) ||
2184
3.28M
            ((mode_mv[this_mode].as_mv.col >> 3) > x->mv_col_max)) {
2185
0
          continue;
2186
0
        }
2187
2188
3.28M
        vp8_set_mbmode_and_mvs(x, this_mode, &mode_mv[this_mode]);
2189
3.28M
        this_rd = evaluate_inter_mode_rd(mdcounts, &rd, &disable_skip, cpi, x);
2190
3.28M
        break;
2191
2192
0
      default: break;
2193
10.1M
    }
2194
2195
7.97M
    this_rd =
2196
7.97M
        calculate_final_rd_costs(this_rd, &rd, &other_cost, disable_skip,
2197
7.97M
                                 uv_intra_tteob, intra_rd_penalty, cpi, x);
2198
2199
    /* Keep record of best intra distortion */
2200
7.97M
    if ((x->e_mbd.mode_info_context->mbmi.ref_frame == INTRA_FRAME) &&
2201
3.59M
        (this_rd < best_mode.intra_rd)) {
2202
1.26M
      best_mode.intra_rd = this_rd;
2203
1.26M
      *returnintra = rd.distortion2;
2204
1.26M
    }
2205
7.97M
#if CONFIG_TEMPORAL_DENOISING
2206
7.97M
    if (cpi->oxcf.noise_sensitivity) {
2207
0
      unsigned int sse;
2208
0
      vp8_get_inter_mbpred_error(x, &cpi->fn_ptr[BLOCK_16X16], &sse,
2209
0
                                 mode_mv[this_mode]);
2210
2211
0
      if (sse < best_rd_sse) best_rd_sse = sse;
2212
2213
      /* Store for later use by denoiser. */
2214
0
      if (this_mode == ZEROMV && sse < zero_mv_sse) {
2215
0
        zero_mv_sse = sse;
2216
0
        x->best_zeromv_reference_frame =
2217
0
            x->e_mbd.mode_info_context->mbmi.ref_frame;
2218
0
      }
2219
2220
      /* Store the best NEWMV in x for later use in the denoiser. */
2221
0
      if (x->e_mbd.mode_info_context->mbmi.mode == NEWMV && sse < best_sse) {
2222
0
        best_sse = sse;
2223
0
        vp8_get_inter_mbpred_error(x, &cpi->fn_ptr[BLOCK_16X16], &best_sse,
2224
0
                                   mode_mv[this_mode]);
2225
0
        x->best_sse_inter_mode = NEWMV;
2226
0
        x->best_sse_mv = x->e_mbd.mode_info_context->mbmi.mv;
2227
0
        x->need_to_clamp_best_mvs =
2228
0
            x->e_mbd.mode_info_context->mbmi.need_to_clamp_mvs;
2229
0
        x->best_reference_frame = x->e_mbd.mode_info_context->mbmi.ref_frame;
2230
0
      }
2231
0
    }
2232
7.97M
#endif
2233
2234
    /* Did this mode help.. i.i is it the new best mode */
2235
7.97M
    if (this_rd < best_mode.rd || x->skip) {
2236
      /* Note index of best mode so far */
2237
2.52M
      best_mode_index = mode_index;
2238
2.52M
      *returnrate = rd.rate2;
2239
2.52M
      *returndistortion = rd.distortion2;
2240
2.52M
      if (this_mode <= B_PRED) {
2241
967k
        x->e_mbd.mode_info_context->mbmi.uv_mode = uv_intra_mode;
2242
        /* required for left and above block mv */
2243
967k
        x->e_mbd.mode_info_context->mbmi.mv.as_int = 0;
2244
967k
      }
2245
2.52M
      update_best_mode(&best_mode, this_rd, &rd, other_cost, x);
2246
2247
      /* Testing this mode gave rise to an improvement in best error
2248
       * score. Lower threshold a bit for next time
2249
       */
2250
2.52M
      x->rd_thresh_mult[mode_index] =
2251
2.52M
          (x->rd_thresh_mult[mode_index] >= (MIN_THRESHMULT + 2))
2252
2.52M
              ? x->rd_thresh_mult[mode_index] - 2
2253
2.52M
              : MIN_THRESHMULT;
2254
2.52M
    }
2255
2256
    /* If the mode did not help improve the best error case then raise
2257
     * the threshold for testing that mode next time around.
2258
     */
2259
5.44M
    else {
2260
5.44M
      x->rd_thresh_mult[mode_index] += 4;
2261
2262
5.44M
      if (x->rd_thresh_mult[mode_index] > MAX_THRESHMULT) {
2263
1.46M
        x->rd_thresh_mult[mode_index] = MAX_THRESHMULT;
2264
1.46M
      }
2265
5.44M
    }
2266
7.97M
    x->rd_threshes[mode_index] = (cpi->rd_baseline_thresh[mode_index] >> 7) *
2267
7.97M
                                 x->rd_thresh_mult[mode_index];
2268
2269
7.97M
    if (x->skip) break;
2270
7.97M
  }
2271
2272
  /* Reduce the activation RD thresholds for the best choice mode */
2273
829k
  if ((cpi->rd_baseline_thresh[best_mode_index] > 0) &&
2274
562k
      (cpi->rd_baseline_thresh[best_mode_index] < (INT_MAX >> 2))) {
2275
562k
    int best_adjustment = (x->rd_thresh_mult[best_mode_index] >> 2);
2276
2277
562k
    x->rd_thresh_mult[best_mode_index] =
2278
562k
        (x->rd_thresh_mult[best_mode_index] >=
2279
562k
         (MIN_THRESHMULT + best_adjustment))
2280
562k
            ? x->rd_thresh_mult[best_mode_index] - best_adjustment
2281
562k
            : MIN_THRESHMULT;
2282
562k
    x->rd_threshes[best_mode_index] =
2283
562k
        (cpi->rd_baseline_thresh[best_mode_index] >> 7) *
2284
562k
        x->rd_thresh_mult[best_mode_index];
2285
562k
  }
2286
2287
829k
#if CONFIG_TEMPORAL_DENOISING
2288
829k
  if (cpi->oxcf.noise_sensitivity) {
2289
0
    int block_index = mb_row * cpi->common.mb_cols + mb_col;
2290
0
    if (x->best_sse_inter_mode == DC_PRED) {
2291
      /* No best MV found. */
2292
0
      x->best_sse_inter_mode = best_mode.mbmode.mode;
2293
0
      x->best_sse_mv = best_mode.mbmode.mv;
2294
0
      x->need_to_clamp_best_mvs = best_mode.mbmode.need_to_clamp_mvs;
2295
0
      x->best_reference_frame = best_mode.mbmode.ref_frame;
2296
0
      best_sse = best_rd_sse;
2297
0
    }
2298
0
    vp8_denoiser_denoise_mb(&cpi->denoiser, x, best_sse, zero_mv_sse,
2299
0
                            recon_yoffset, recon_uvoffset, &cpi->common.lf_info,
2300
0
                            mb_row, mb_col, block_index, 0);
2301
2302
    /* Reevaluate ZEROMV after denoising. */
2303
0
    if (best_mode.mbmode.ref_frame == INTRA_FRAME &&
2304
0
        x->best_zeromv_reference_frame != INTRA_FRAME) {
2305
0
      int this_rd = INT_MAX;
2306
0
      int disable_skip = 0;
2307
0
      int other_cost = 0;
2308
0
      int this_ref_frame = x->best_zeromv_reference_frame;
2309
0
      rd.rate2 =
2310
0
          x->ref_frame_cost[this_ref_frame] + vp8_cost_mv_ref(ZEROMV, mdcounts);
2311
0
      rd.distortion2 = 0;
2312
2313
      /* set up the proper prediction buffers for the frame */
2314
0
      x->e_mbd.mode_info_context->mbmi.ref_frame = this_ref_frame;
2315
0
      x->e_mbd.pre.y_buffer = plane[this_ref_frame][0];
2316
0
      x->e_mbd.pre.u_buffer = plane[this_ref_frame][1];
2317
0
      x->e_mbd.pre.v_buffer = plane[this_ref_frame][2];
2318
2319
0
      x->e_mbd.mode_info_context->mbmi.mode = ZEROMV;
2320
0
      x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED;
2321
0
      x->e_mbd.mode_info_context->mbmi.mv.as_int = 0;
2322
2323
0
      this_rd = evaluate_inter_mode_rd(mdcounts, &rd, &disable_skip, cpi, x);
2324
0
      this_rd =
2325
0
          calculate_final_rd_costs(this_rd, &rd, &other_cost, disable_skip,
2326
0
                                   uv_intra_tteob, intra_rd_penalty, cpi, x);
2327
0
      if (this_rd < best_mode.rd || x->skip) {
2328
0
        *returnrate = rd.rate2;
2329
0
        *returndistortion = rd.distortion2;
2330
0
        update_best_mode(&best_mode, this_rd, &rd, other_cost, x);
2331
0
      }
2332
0
    }
2333
0
  }
2334
829k
#endif
2335
2336
829k
  if (cpi->is_src_frame_alt_ref &&
2337
0
      (best_mode.mbmode.mode != ZEROMV ||
2338
0
       best_mode.mbmode.ref_frame != ALTREF_FRAME)) {
2339
0
    x->e_mbd.mode_info_context->mbmi.mode = ZEROMV;
2340
0
    x->e_mbd.mode_info_context->mbmi.ref_frame = ALTREF_FRAME;
2341
0
    x->e_mbd.mode_info_context->mbmi.mv.as_int = 0;
2342
0
    x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED;
2343
0
    x->e_mbd.mode_info_context->mbmi.mb_skip_coeff =
2344
0
        (cpi->common.mb_no_coeff_skip);
2345
0
    x->e_mbd.mode_info_context->mbmi.partitioning = 0;
2346
0
    return;
2347
0
  }
2348
2349
  /* macroblock modes */
2350
829k
  x->e_mbd.mode_info_context->mbmi = best_mode.mbmode;
2351
2352
829k
  if (best_mode.mbmode.mode == B_PRED) {
2353
3.57M
    for (i = 0; i < 16; ++i) {
2354
3.36M
      xd->mode_info_context->bmi[i].as_mode = best_mode.bmodes[i].as_mode;
2355
3.36M
    }
2356
210k
  }
2357
2358
829k
  if (best_mode.mbmode.mode == SPLITMV) {
2359
3.57M
    for (i = 0; i < 16; ++i) {
2360
3.36M
      xd->mode_info_context->bmi[i].mv.as_int = best_mode.bmodes[i].mv.as_int;
2361
3.36M
    }
2362
2363
210k
    *x->partition_info = best_mode.partition;
2364
2365
210k
    x->e_mbd.mode_info_context->mbmi.mv.as_int =
2366
210k
        x->partition_info->bmi[15].mv.as_int;
2367
210k
  }
2368
2369
829k
  if (sign_bias !=
2370
829k
      cpi->common.ref_frame_sign_bias[xd->mode_info_context->mbmi.ref_frame]) {
2371
0
    best_ref_mv.as_int = best_ref_mv_sb[!sign_bias].as_int;
2372
0
  }
2373
2374
829k
  rd_update_mvcount(x, &best_ref_mv);
2375
829k
}
2376
2377
234k
void vp8_rd_pick_intra_mode(MACROBLOCK *x, int *rate) {
2378
234k
  int error4x4, error16x16;
2379
234k
  int rate4x4, rate16x16 = 0, rateuv;
2380
234k
  int dist4x4, dist16x16, distuv;
2381
234k
  int rate_;
2382
234k
  int rate4x4_tokenonly = 0;
2383
234k
  int rate16x16_tokenonly = 0;
2384
234k
  int rateuv_tokenonly = 0;
2385
2386
234k
  x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME;
2387
2388
234k
  rd_pick_intra_mbuv_mode(x, &rateuv, &rateuv_tokenonly, &distuv);
2389
234k
  rate_ = rateuv;
2390
2391
234k
  error16x16 = rd_pick_intra16x16mby_mode(x, &rate16x16, &rate16x16_tokenonly,
2392
234k
                                          &dist16x16);
2393
2394
234k
  error4x4 = rd_pick_intra4x4mby_modes(x, &rate4x4, &rate4x4_tokenonly,
2395
234k
                                       &dist4x4, error16x16);
2396
2397
234k
  if (error4x4 < error16x16) {
2398
174k
    x->e_mbd.mode_info_context->mbmi.mode = B_PRED;
2399
174k
    rate_ += rate4x4;
2400
174k
  } else {
2401
59.8k
    rate_ += rate16x16;
2402
59.8k
  }
2403
2404
234k
  *rate = rate_;
2405
234k
}