Coverage Report

Created: 2026-09-28 07:27

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/vlc/contrib/contrib-build/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
0
#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
0
                    [ENTROPY_NODES]) {
116
0
  int i, j, k;
117
118
0
  for (i = 0; i < BLOCK_TYPES; ++i) {
119
0
    for (j = 0; j < COEF_BANDS; ++j) {
120
0
      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
0
        if (k == 0 && j > (i == 0)) {
125
0
          vp8_cost_tokens2(c[i][j][k], p[i][j][k], vp8_coef_tree, 2);
126
0
        } else {
127
0
          vp8_cost_tokens(c[i][j][k], p[i][j][k], vp8_coef_tree);
128
0
        }
129
0
      }
130
0
    }
131
0
  }
132
0
}
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
0
void vp8cx_initialize_me_consts(VP8_COMP *cpi, int QIndex) {
159
0
  cpi->mb.sadperbit16 = sad_per_bit16lut[QIndex];
160
0
  cpi->mb.sadperbit4 = sad_per_bit4lut[QIndex];
161
0
}
162
163
0
void vp8_initialize_rd_consts(VP8_COMP *cpi, MACROBLOCK *x, int Qvalue) {
164
0
  int q;
165
0
  int i;
166
0
  double capped_q = (Qvalue < 160) ? (double)Qvalue : 160.0;
167
0
  double rdconst = 2.80;
168
169
0
  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
0
  cpi->RDMULT = (int)(rdconst * (capped_q * capped_q));
175
176
  /* Extend rate multiplier along side quantizer zbin increases */
177
0
  if (cpi->mb.zbin_over_quant > 0) {
178
0
    double oq_factor;
179
0
    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
0
    oq_factor = 1.0 + ((double)0.0015625 * cpi->mb.zbin_over_quant);
185
0
    modq = (int)((double)capped_q * oq_factor);
186
0
    cpi->RDMULT = (int)(rdconst * (modq * modq));
187
0
  }
188
189
0
  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
0
  cpi->mb.errorperbit = (cpi->RDMULT / 110);
199
0
  cpi->mb.errorperbit += (cpi->mb.errorperbit == 0);
200
201
0
  vp8_set_speed_features(cpi);
202
203
0
  for (i = 0; i < MAX_MODES; ++i) {
204
0
    x->mode_test_hit_counts[i] = 0;
205
0
  }
206
207
0
  q = (int)pow(Qvalue, 1.25);
208
209
0
  if (q < 8) q = 8;
210
211
0
  if (cpi->RDMULT > 1000) {
212
0
    cpi->RDDIV = 1;
213
0
    cpi->RDMULT /= 100;
214
215
0
    for (i = 0; i < MAX_MODES; ++i) {
216
0
      if (cpi->sf.thresh_mult[i] < INT_MAX) {
217
0
        x->rd_threshes[i] = cpi->sf.thresh_mult[i] * q / 100;
218
0
      } else {
219
0
        x->rd_threshes[i] = INT_MAX;
220
0
      }
221
222
0
      cpi->rd_baseline_thresh[i] = x->rd_threshes[i];
223
0
    }
224
0
  } else {
225
0
    cpi->RDDIV = 100;
226
227
0
    for (i = 0; i < MAX_MODES; ++i) {
228
0
      if (cpi->sf.thresh_mult[i] < (INT_MAX / q)) {
229
0
        x->rd_threshes[i] = cpi->sf.thresh_mult[i] * q;
230
0
      } else {
231
0
        x->rd_threshes[i] = INT_MAX;
232
0
      }
233
234
0
      cpi->rd_baseline_thresh[i] = x->rd_threshes[i];
235
0
    }
236
0
  }
237
238
0
  {
239
    /* build token cost array for the type of frame we have now */
240
0
    FRAME_CONTEXT *l = &cpi->lfc_n;
241
242
0
    if (cpi->common.refresh_alt_ref_frame) {
243
0
      l = &cpi->lfc_a;
244
0
    } else if (cpi->common.refresh_golden_frame) {
245
0
      l = &cpi->lfc_g;
246
0
    }
247
248
0
    fill_token_costs(cpi->mb.token_costs,
249
0
                     (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
0
    vp8_init_mode_costs(cpi);
258
0
  }
259
0
}
260
261
0
void vp8_auto_select_speed(VP8_COMP *cpi) {
262
0
  int milliseconds_for_compress = (int)(1000000 / cpi->framerate);
263
264
0
  milliseconds_for_compress =
265
0
      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
0
  if (cpi->avg_pick_mode_time < milliseconds_for_compress &&
282
0
      (cpi->avg_encode_time - cpi->avg_pick_mode_time) <
283
0
          milliseconds_for_compress) {
284
0
    if (cpi->avg_pick_mode_time == 0) {
285
0
      cpi->Speed = 4;
286
0
    } else {
287
0
      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
0
      if (milliseconds_for_compress * 100 >
298
0
          cpi->avg_encode_time * auto_speed_thresh[cpi->Speed]) {
299
0
        cpi->Speed -= 1;
300
0
        cpi->avg_pick_mode_time = 0;
301
0
        cpi->avg_encode_time = 0;
302
303
        /* In real-time mode, cpi->speed is in [4, 16]. */
304
0
        if (cpi->Speed < 4) {
305
0
          cpi->Speed = 4;
306
0
        }
307
0
      }
308
0
    }
309
0
  } 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
0
}
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
0
int VP8_UVSSE(MACROBLOCK *x) {
372
0
  unsigned char *uptr, *vptr;
373
0
  unsigned char *upred_ptr = (*(x->block[16].base_src) + x->block[16].src);
374
0
  unsigned char *vpred_ptr = (*(x->block[20].base_src) + x->block[20].src);
375
0
  int uv_stride = x->block[16].src_stride;
376
377
0
  unsigned int sse1 = 0;
378
0
  unsigned int sse2 = 0;
379
0
  int mv_row = x->e_mbd.mode_info_context->mbmi.mv.as_mv.row;
380
0
  int mv_col = x->e_mbd.mode_info_context->mbmi.mv.as_mv.col;
381
0
  int offset;
382
0
  int pre_stride = x->e_mbd.pre.uv_stride;
383
384
0
  if (mv_row < 0) {
385
0
    mv_row -= 1;
386
0
  } else {
387
0
    mv_row += 1;
388
0
  }
389
390
0
  if (mv_col < 0) {
391
0
    mv_col -= 1;
392
0
  } else {
393
0
    mv_col += 1;
394
0
  }
395
396
0
  mv_row /= 2;
397
0
  mv_col /= 2;
398
399
0
  offset = (mv_row >> 3) * pre_stride + (mv_col >> 3);
400
0
  uptr = x->e_mbd.pre.u_buffer + offset;
401
0
  vptr = x->e_mbd.pre.v_buffer + offset;
402
403
0
  if ((mv_row | mv_col) & 7) {
404
0
    vpx_sub_pixel_variance8x8(uptr, pre_stride, mv_col & 7, mv_row & 7,
405
0
                              upred_ptr, uv_stride, &sse2);
406
0
    vpx_sub_pixel_variance8x8(vptr, pre_stride, mv_col & 7, mv_row & 7,
407
0
                              vpred_ptr, uv_stride, &sse1);
408
0
    sse2 += sse1;
409
0
  } else {
410
0
    vpx_variance8x8(uptr, pre_stride, upred_ptr, uv_stride, &sse2);
411
0
    vpx_variance8x8(vptr, pre_stride, vpred_ptr, uv_stride, &sse1);
412
0
    sse2 += sse1;
413
0
  }
414
0
  return sse2;
415
0
}
416
417
static int cost_coeffs(MACROBLOCK *mb, BLOCKD *b, int type, ENTROPY_CONTEXT *a,
418
0
                       ENTROPY_CONTEXT *l) {
419
0
  int c = !type; /* start at coef 0, unless Y with Y2 */
420
0
  int eob = (int)(*b->eob);
421
0
  int pt; /* surrounding block/prev coef predictor */
422
0
  int cost = 0;
423
0
  short *qcoeff_ptr = b->qcoeff;
424
425
0
  VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
426
427
0
  assert(eob <= 16);
428
0
  for (; c < eob; ++c) {
429
0
    const int v = qcoeff_ptr[vp8_default_zig_zag1d[c]];
430
0
    const int t = vp8_dct_value_tokens_ptr[v].Token;
431
0
    cost += mb->token_costs[type][vp8_coef_bands[c]][pt][t];
432
0
    cost += vp8_dct_value_cost_ptr[v];
433
0
    pt = vp8_prev_token_class[t];
434
0
  }
435
436
0
  if (c < 16) {
437
0
    cost += mb->token_costs[type][vp8_coef_bands[c]][pt][DCT_EOB_TOKEN];
438
0
  }
439
440
0
  pt = (c != !type); /* is eob first coefficient; */
441
0
  *a = *l = pt;
442
443
0
  return cost;
444
0
}
445
446
0
static int vp8_rdcost_mby(MACROBLOCK *mb) {
447
0
  int cost = 0;
448
0
  int b;
449
0
  MACROBLOCKD *x = &mb->e_mbd;
450
0
  ENTROPY_CONTEXT_PLANES t_above, t_left;
451
0
  ENTROPY_CONTEXT *ta;
452
0
  ENTROPY_CONTEXT *tl;
453
454
0
  t_above = *mb->e_mbd.above_context;
455
0
  t_left = *mb->e_mbd.left_context;
456
457
0
  ta = (ENTROPY_CONTEXT *)&t_above;
458
0
  tl = (ENTROPY_CONTEXT *)&t_left;
459
460
0
  for (b = 0; b < 16; ++b) {
461
0
    cost += cost_coeffs(mb, x->block + b, PLANE_TYPE_Y_NO_DC,
462
0
                        ta + vp8_block2above[b], tl + vp8_block2left[b]);
463
0
  }
464
465
0
  cost += cost_coeffs(mb, x->block + 24, PLANE_TYPE_Y2,
466
0
                      ta + vp8_block2above[24], tl + vp8_block2left[24]);
467
468
0
  return cost;
469
0
}
470
471
0
static void macro_block_yrd(MACROBLOCK *mb, int *Rate, int *Distortion) {
472
0
  int b;
473
0
  MACROBLOCKD *const x = &mb->e_mbd;
474
0
  BLOCK *const mb_y2 = mb->block + 24;
475
0
  BLOCKD *const x_y2 = x->block + 24;
476
0
  short *Y2DCPtr = mb_y2->src_diff;
477
0
  BLOCK *beptr;
478
0
  int d;
479
480
0
  vp8_subtract_mby(mb->src_diff, *(mb->block[0].base_src),
481
0
                   mb->block[0].src_stride, mb->e_mbd.predictor, 16);
482
483
  /* Fdct and building the 2nd order block */
484
0
  for (beptr = mb->block; beptr < mb->block + 16; beptr += 2) {
485
0
    mb->short_fdct8x4(beptr->src_diff, beptr->coeff, 32);
486
0
    *Y2DCPtr++ = beptr->coeff[0];
487
0
    *Y2DCPtr++ = beptr->coeff[16];
488
0
  }
489
490
  /* 2nd order fdct */
491
0
  mb->short_walsh4x4(mb_y2->src_diff, mb_y2->coeff, 8);
492
493
  /* Quantization */
494
0
  for (b = 0; b < 16; ++b) {
495
0
    mb->quantize_b(&mb->block[b], &mb->e_mbd.block[b]);
496
0
  }
497
498
  /* DC predication and Quantization of 2nd Order block */
499
0
  mb->quantize_b(mb_y2, x_y2);
500
501
  /* Distortion */
502
0
  d = vp8_mbblock_error(mb, 1) << 2;
503
0
  d += vp8_block_error(mb_y2->coeff, x_y2->dqcoeff);
504
505
0
  *Distortion = (d >> 4);
506
507
  /* rate */
508
0
  *Rate = vp8_rdcost_mby(mb);
509
0
}
510
511
0
static void copy_predictor(unsigned char *dst, const unsigned char *predictor) {
512
0
  const unsigned int *p = (const unsigned int *)predictor;
513
0
  unsigned int *d = (unsigned int *)dst;
514
0
  d[0] = p[0];
515
0
  d[4] = p[4];
516
0
  d[8] = p[8];
517
0
  d[12] = p[12];
518
0
}
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
0
                                 int *bestdistortion) {
526
0
  B_PREDICTION_MODE mode;
527
0
  int best_rd = INT_MAX;
528
0
  int rate = 0;
529
0
  int distortion;
530
531
0
  ENTROPY_CONTEXT ta = *a, tempa = *a;
532
0
  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
0
  DECLARE_ALIGNED(16, unsigned char, best_predictor[16 * 4]);
539
0
  DECLARE_ALIGNED(16, short, best_dqcoeff[16]);
540
0
  int dst_stride = x->e_mbd.dst.y_stride;
541
0
  unsigned char *dst = x->e_mbd.dst.y_buffer + b->offset;
542
543
0
  unsigned char *Above = dst - dst_stride;
544
0
  unsigned char *yleft = dst - 1;
545
0
  unsigned char top_left = Above[-1];
546
547
0
  for (mode = B_DC_PRED; mode <= B_HU_PRED; ++mode) {
548
0
    int this_rd;
549
0
    int ratey;
550
551
0
    rate = bmode_costs[mode];
552
553
0
    vp8_intra4x4_predict(Above, yleft, dst_stride, mode, b->predictor, 16,
554
0
                         top_left);
555
0
    vp8_subtract_b(be, b, 16);
556
0
    x->short_fdct4x4(be->src_diff, be->coeff, 32);
557
0
    x->quantize_b(be, b);
558
559
0
    tempa = ta;
560
0
    templ = tl;
561
562
0
    ratey = cost_coeffs(x, b, PLANE_TYPE_Y_WITH_DC, &tempa, &templ);
563
0
    rate += ratey;
564
0
    distortion = vp8_block_error(be->coeff, b->dqcoeff) >> 2;
565
566
0
    this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion);
567
568
0
    if (this_rd < best_rd) {
569
0
      *bestrate = rate;
570
0
      *bestratey = ratey;
571
0
      *bestdistortion = distortion;
572
0
      best_rd = this_rd;
573
0
      *best_mode = mode;
574
0
      *a = tempa;
575
0
      *l = templ;
576
0
      copy_predictor(best_predictor, b->predictor);
577
0
      memcpy(best_dqcoeff, b->dqcoeff, 32);
578
0
    }
579
0
  }
580
0
  b->bmi.as_mode = *best_mode;
581
582
0
  vp8_short_idct4x4llm(best_dqcoeff, best_predictor, 16, dst, dst_stride);
583
584
0
  return best_rd;
585
0
}
586
587
static int rd_pick_intra4x4mby_modes(MACROBLOCK *mb, int *Rate, int *rate_y,
588
0
                                     int *Distortion, int best_rd) {
589
0
  MACROBLOCKD *const xd = &mb->e_mbd;
590
0
  int i;
591
0
  int cost = mb->mbmode_cost[xd->frame_type][B_PRED];
592
0
  int distortion = 0;
593
0
  int tot_rate_y = 0;
594
0
  int64_t total_rd = 0;
595
0
  ENTROPY_CONTEXT_PLANES t_above, t_left;
596
0
  ENTROPY_CONTEXT *ta;
597
0
  ENTROPY_CONTEXT *tl;
598
0
  const int *bmode_costs;
599
600
0
  t_above = *mb->e_mbd.above_context;
601
0
  t_left = *mb->e_mbd.left_context;
602
603
0
  ta = (ENTROPY_CONTEXT *)&t_above;
604
0
  tl = (ENTROPY_CONTEXT *)&t_left;
605
606
0
  intra_prediction_down_copy(xd, xd->dst.y_buffer - xd->dst.y_stride + 16);
607
608
0
  bmode_costs = mb->inter_bmode_costs;
609
610
0
  for (i = 0; i < 16; ++i) {
611
0
    MODE_INFO *const mic = xd->mode_info_context;
612
0
    const int mis = xd->mode_info_stride;
613
0
    B_PREDICTION_MODE best_mode = B_MODE_COUNT;
614
0
    int r = 0, ry = 0, d = 0;
615
616
0
    if (mb->e_mbd.frame_type == KEY_FRAME) {
617
0
      const B_PREDICTION_MODE A = above_block_mode(mic, i, mis);
618
0
      const B_PREDICTION_MODE L = left_block_mode(mic, i);
619
620
0
      bmode_costs = mb->bmode_costs[A][L];
621
0
    }
622
623
0
    total_rd += rd_pick_intra4x4block(
624
0
        mb, mb->block + i, xd->block + i, &best_mode, bmode_costs,
625
0
        ta + vp8_block2above[i], tl + vp8_block2left[i], &r, &ry, &d);
626
627
0
    cost += r;
628
0
    distortion += d;
629
0
    tot_rate_y += ry;
630
631
0
    assert(best_mode != B_MODE_COUNT);
632
0
    mic->bmi[i].as_mode = best_mode;
633
634
0
    if (total_rd >= (int64_t)best_rd) break;
635
0
  }
636
637
0
  if (total_rd >= (int64_t)best_rd) return INT_MAX;
638
639
0
  *Rate = cost;
640
0
  *rate_y = tot_rate_y;
641
0
  *Distortion = distortion;
642
643
0
  return RDCOST(mb->rdmult, mb->rddiv, cost, distortion);
644
0
}
645
646
static int rd_pick_intra16x16mby_mode(MACROBLOCK *x, int *Rate, int *rate_y,
647
0
                                      int *Distortion) {
648
0
  MB_PREDICTION_MODE mode;
649
0
  MB_PREDICTION_MODE mode_selected = MB_MODE_COUNT;
650
0
  int rate, ratey;
651
0
  int distortion;
652
0
  int best_rd = INT_MAX;
653
0
  int this_rd;
654
0
  MACROBLOCKD *xd = &x->e_mbd;
655
656
  /* Y Search for 16x16 intra prediction mode */
657
0
  for (mode = DC_PRED; mode <= TM_PRED; ++mode) {
658
0
    xd->mode_info_context->mbmi.mode = mode;
659
660
0
    vp8_build_intra_predictors_mby_s(xd, xd->dst.y_buffer - xd->dst.y_stride,
661
0
                                     xd->dst.y_buffer - 1, xd->dst.y_stride,
662
0
                                     xd->predictor, 16);
663
664
0
    macro_block_yrd(x, &ratey, &distortion);
665
0
    rate = ratey +
666
0
           x->mbmode_cost[xd->frame_type][xd->mode_info_context->mbmi.mode];
667
668
0
    this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion);
669
670
0
    if (this_rd < best_rd) {
671
0
      mode_selected = mode;
672
0
      best_rd = this_rd;
673
0
      *Rate = rate;
674
0
      *rate_y = ratey;
675
0
      *Distortion = distortion;
676
0
    }
677
0
  }
678
679
0
  assert(mode_selected != MB_MODE_COUNT);
680
0
  xd->mode_info_context->mbmi.mode = mode_selected;
681
0
  return best_rd;
682
0
}
683
684
0
static int rd_cost_mbuv(MACROBLOCK *mb) {
685
0
  int b;
686
0
  int cost = 0;
687
0
  MACROBLOCKD *x = &mb->e_mbd;
688
0
  ENTROPY_CONTEXT_PLANES t_above, t_left;
689
0
  ENTROPY_CONTEXT *ta;
690
0
  ENTROPY_CONTEXT *tl;
691
692
0
  t_above = *mb->e_mbd.above_context;
693
0
  t_left = *mb->e_mbd.left_context;
694
695
0
  ta = (ENTROPY_CONTEXT *)&t_above;
696
0
  tl = (ENTROPY_CONTEXT *)&t_left;
697
698
0
  for (b = 16; b < 24; ++b) {
699
0
    cost += cost_coeffs(mb, x->block + b, PLANE_TYPE_UV,
700
0
                        ta + vp8_block2above[b], tl + vp8_block2left[b]);
701
0
  }
702
703
0
  return cost;
704
0
}
705
706
static int rd_inter16x16_uv(VP8_COMP *cpi, MACROBLOCK *x, int *rate,
707
0
                            int *distortion, int fullpixel) {
708
0
  (void)cpi;
709
0
  (void)fullpixel;
710
711
0
  vp8_build_inter16x16_predictors_mbuv(&x->e_mbd);
712
0
  vp8_subtract_mbuv(x->src_diff, x->src.u_buffer, x->src.v_buffer,
713
0
                    x->src.uv_stride, &x->e_mbd.predictor[256],
714
0
                    &x->e_mbd.predictor[320], 8);
715
716
0
  vp8_transform_mbuv(x);
717
0
  vp8_quantize_mbuv(x);
718
719
0
  *rate = rd_cost_mbuv(x);
720
0
  *distortion = vp8_mbuverror(x) / 4;
721
722
0
  return RDCOST(x->rdmult, x->rddiv, *rate, *distortion);
723
0
}
724
725
static int rd_inter4x4_uv(VP8_COMP *cpi, MACROBLOCK *x, int *rate,
726
0
                          int *distortion, int fullpixel) {
727
0
  (void)cpi;
728
0
  (void)fullpixel;
729
730
0
  vp8_build_inter4x4_predictors_mbuv(&x->e_mbd);
731
0
  vp8_subtract_mbuv(x->src_diff, x->src.u_buffer, x->src.v_buffer,
732
0
                    x->src.uv_stride, &x->e_mbd.predictor[256],
733
0
                    &x->e_mbd.predictor[320], 8);
734
735
0
  vp8_transform_mbuv(x);
736
0
  vp8_quantize_mbuv(x);
737
738
0
  *rate = rd_cost_mbuv(x);
739
0
  *distortion = vp8_mbuverror(x) / 4;
740
741
0
  return RDCOST(x->rdmult, x->rddiv, *rate, *distortion);
742
0
}
743
744
static void rd_pick_intra_mbuv_mode(MACROBLOCK *x, int *rate,
745
0
                                    int *rate_tokenonly, int *distortion) {
746
0
  MB_PREDICTION_MODE mode;
747
0
  MB_PREDICTION_MODE mode_selected = MB_MODE_COUNT;
748
0
  int best_rd = INT_MAX;
749
0
  int d = 0, r = 0;
750
0
  int rate_to;
751
0
  MACROBLOCKD *xd = &x->e_mbd;
752
753
0
  for (mode = DC_PRED; mode <= TM_PRED; ++mode) {
754
0
    int this_rate;
755
0
    int this_distortion;
756
0
    int this_rd;
757
758
0
    xd->mode_info_context->mbmi.uv_mode = mode;
759
760
0
    vp8_build_intra_predictors_mbuv_s(
761
0
        xd, xd->dst.u_buffer - xd->dst.uv_stride,
762
0
        xd->dst.v_buffer - xd->dst.uv_stride, xd->dst.u_buffer - 1,
763
0
        xd->dst.v_buffer - 1, xd->dst.uv_stride, &xd->predictor[256],
764
0
        &xd->predictor[320], 8);
765
766
0
    vp8_subtract_mbuv(x->src_diff, x->src.u_buffer, x->src.v_buffer,
767
0
                      x->src.uv_stride, &xd->predictor[256],
768
0
                      &xd->predictor[320], 8);
769
0
    vp8_transform_mbuv(x);
770
0
    vp8_quantize_mbuv(x);
771
772
0
    rate_to = rd_cost_mbuv(x);
773
0
    this_rate =
774
0
        rate_to + x->intra_uv_mode_cost[xd->frame_type]
775
0
                                       [xd->mode_info_context->mbmi.uv_mode];
776
777
0
    this_distortion = vp8_mbuverror(x) / 4;
778
779
0
    this_rd = RDCOST(x->rdmult, x->rddiv, this_rate, this_distortion);
780
781
0
    if (this_rd < best_rd) {
782
0
      best_rd = this_rd;
783
0
      d = this_distortion;
784
0
      r = this_rate;
785
0
      *rate_tokenonly = rate_to;
786
0
      mode_selected = mode;
787
0
    }
788
0
  }
789
790
0
  *rate = r;
791
0
  *distortion = d;
792
793
0
  assert(mode_selected != MB_MODE_COUNT);
794
0
  xd->mode_info_context->mbmi.uv_mode = mode_selected;
795
0
}
796
797
0
int vp8_cost_mv_ref(MB_PREDICTION_MODE m, const int near_mv_ref_ct[4]) {
798
0
  vp8_prob p[VP8_MVREFS - 1];
799
0
  assert(NEARESTMV <= m && m <= SPLITMV);
800
0
  vp8_mv_ref_probs(p, near_mv_ref_ct);
801
0
  return vp8_cost_token(vp8_mv_ref_tree, p,
802
0
                        vp8_mv_ref_encoding_array + (m - NEARESTMV));
803
0
}
804
805
0
void vp8_set_mbmode_and_mvs(MACROBLOCK *x, MB_PREDICTION_MODE mb, int_mv *mv) {
806
0
  x->e_mbd.mode_info_context->mbmi.mode = mb;
807
0
  x->e_mbd.mode_info_context->mbmi.mv.as_int = mv->as_int;
808
0
}
809
810
static int labels2mode(MACROBLOCK *x, int const *labelings, int which_label,
811
                       B_PREDICTION_MODE this_mode, int_mv *this_mv,
812
0
                       int_mv *best_ref_mv, int *mvcost[2]) {
813
0
  MACROBLOCKD *const xd = &x->e_mbd;
814
0
  MODE_INFO *const mic = xd->mode_info_context;
815
0
  const int mis = xd->mode_info_stride;
816
817
0
  int cost = 0;
818
0
  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
0
  int i = 0;
825
826
0
  do {
827
0
    BLOCKD *const d = xd->block + i;
828
0
    const int row = i >> 2, col = i & 3;
829
830
0
    B_PREDICTION_MODE m;
831
832
0
    if (labelings[i] != which_label) continue;
833
834
0
    if (col && labelings[i] == labelings[i - 1]) {
835
0
      m = LEFT4X4;
836
0
    } else if (row && labelings[i] == labelings[i - 4]) {
837
0
      m = ABOVE4X4;
838
0
    } 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
0
      switch (m = this_mode) {
843
0
        case NEW4X4:
844
0
          thismvcost = vp8_mv_bit_cost(this_mv, best_ref_mv, mvcost, 102);
845
0
          break;
846
0
        case LEFT4X4:
847
0
          this_mv->as_int = col ? d[-1].bmi.mv.as_int : left_block_mv(mic, i);
848
0
          break;
849
0
        case ABOVE4X4:
850
0
          this_mv->as_int =
851
0
              row ? d[-4].bmi.mv.as_int : above_block_mv(mic, i, mis);
852
0
          break;
853
0
        case ZERO4X4: this_mv->as_int = 0; break;
854
0
        default: break;
855
0
      }
856
857
0
      if (m == ABOVE4X4) { /* replace above with left if same */
858
0
        int_mv left_mv;
859
860
0
        left_mv.as_int = col ? d[-1].bmi.mv.as_int : left_block_mv(mic, i);
861
862
0
        if (left_mv.as_int == this_mv->as_int) m = LEFT4X4;
863
0
      }
864
865
0
      cost = x->inter_bmode_costs[m];
866
0
    }
867
868
0
    d->bmi.mv.as_int = this_mv->as_int;
869
870
0
    x->partition_info->bmi[i].mode = m;
871
0
    x->partition_info->bmi[i].mv.as_int = this_mv->as_int;
872
873
0
  } while (++i < 16);
874
875
0
  cost += thismvcost;
876
0
  return cost;
877
0
}
878
879
static int rdcost_mbsegment_y(MACROBLOCK *mb, const int *labels,
880
                              int which_label, ENTROPY_CONTEXT *ta,
881
0
                              ENTROPY_CONTEXT *tl) {
882
0
  int cost = 0;
883
0
  int b;
884
0
  MACROBLOCKD *x = &mb->e_mbd;
885
886
0
  for (b = 0; b < 16; ++b) {
887
0
    if (labels[b] == which_label) {
888
0
      cost += cost_coeffs(mb, x->block + b, PLANE_TYPE_Y_WITH_DC,
889
0
                          ta + vp8_block2above[b], tl + vp8_block2left[b]);
890
0
    }
891
0
  }
892
893
0
  return cost;
894
0
}
895
static unsigned int vp8_encode_inter_mb_segment(MACROBLOCK *x,
896
                                                int const *labels,
897
0
                                                int which_label) {
898
0
  int i;
899
0
  unsigned int distortion = 0;
900
0
  int pre_stride = x->e_mbd.pre.y_stride;
901
0
  unsigned char *base_pre = x->e_mbd.pre.y_buffer;
902
903
0
  for (i = 0; i < 16; ++i) {
904
0
    if (labels[i] == which_label) {
905
0
      BLOCKD *bd = &x->e_mbd.block[i];
906
0
      BLOCK *be = &x->block[i];
907
908
0
      vp8_build_inter_predictors_b(bd, 16, base_pre, pre_stride,
909
0
                                   x->e_mbd.subpixel_predict);
910
0
      vp8_subtract_b(be, bd, 16);
911
0
      x->short_fdct4x4(be->src_diff, be->coeff, 32);
912
0
      x->quantize_b(be, bd);
913
914
0
      distortion += vp8_block_error(be->coeff, bd->dqcoeff);
915
0
    }
916
0
  }
917
918
0
  return distortion;
919
0
}
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
0
                             unsigned int segmentation) {
946
0
  int i;
947
0
  int const *labels;
948
0
  int br = 0;
949
0
  int bd = 0;
950
0
  B_PREDICTION_MODE this_mode;
951
952
0
  int label_count;
953
0
  int this_segment_rd = 0;
954
0
  int label_mv_thresh;
955
0
  int rate = 0;
956
0
  int sbr = 0;
957
0
  int sbd = 0;
958
0
  int segmentyrate = 0;
959
960
0
  vp8_variance_fn_ptr_t *v_fn_ptr;
961
962
0
  ENTROPY_CONTEXT_PLANES t_above, t_left;
963
0
  ENTROPY_CONTEXT_PLANES t_above_b, t_left_b;
964
965
0
  t_above = *x->e_mbd.above_context;
966
0
  t_left = *x->e_mbd.left_context;
967
968
0
  vp8_zero(t_above_b);
969
0
  vp8_zero(t_left_b);
970
971
0
  br = 0;
972
0
  bd = 0;
973
974
0
  v_fn_ptr = &cpi->fn_ptr[segmentation];
975
0
  labels = vp8_mbsplits[segmentation];
976
0
  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
0
  label_mv_thresh = 1 * bsi->mvthresh / label_count;
983
984
  /* Segmentation method overheads */
985
0
  rate = vp8_cost_token(vp8_mbsplit_tree, vp8_mbsplit_probs,
986
0
                        vp8_mbsplit_encodings + segmentation);
987
0
  rate += vp8_cost_mv_ref(SPLITMV, bsi->mdcounts);
988
0
  this_segment_rd += RDCOST(x->rdmult, x->rddiv, rate, 0);
989
0
  br += rate;
990
991
0
  for (i = 0; i < label_count; ++i) {
992
0
    int_mv mode_mv[B_MODE_COUNT] = { { 0 }, { 0 } };
993
0
    int best_label_rd = INT_MAX;
994
0
    B_PREDICTION_MODE mode_selected = ZERO4X4;
995
0
    int bestlabelyrate = 0;
996
997
    /* search for the best motion vector on this segment */
998
0
    for (this_mode = LEFT4X4; this_mode <= NEW4X4; ++this_mode) {
999
0
      int this_rd;
1000
0
      int distortion;
1001
0
      int labelyrate;
1002
0
      ENTROPY_CONTEXT_PLANES t_above_s, t_left_s;
1003
0
      ENTROPY_CONTEXT *ta_s;
1004
0
      ENTROPY_CONTEXT *tl_s;
1005
1006
0
      t_above_s = t_above;
1007
0
      t_left_s = t_left;
1008
1009
0
      ta_s = (ENTROPY_CONTEXT *)&t_above_s;
1010
0
      tl_s = (ENTROPY_CONTEXT *)&t_left_s;
1011
1012
0
      if (this_mode == NEW4X4) {
1013
0
        int sseshift;
1014
0
        int num00;
1015
0
        int step_param = 0;
1016
0
        int further_steps;
1017
0
        int n;
1018
0
        int thissme;
1019
0
        int bestsme = INT_MAX;
1020
0
        int_mv temp_mv;
1021
0
        BLOCK *c;
1022
0
        BLOCKD *e;
1023
1024
        /* Is the best so far sufficiently good that we can't justify
1025
         * doing a new motion search.
1026
         */
1027
0
        if (best_label_rd < label_mv_thresh) break;
1028
1029
0
        if (cpi->compressor_speed) {
1030
0
          if (segmentation == BLOCK_8X16 || segmentation == BLOCK_16X8) {
1031
0
            bsi->mvp.as_int = bsi->sv_mvp[i].as_int;
1032
0
            if (i == 1 && segmentation == BLOCK_16X8) {
1033
0
              bsi->mvp.as_int = bsi->sv_mvp[2].as_int;
1034
0
            }
1035
1036
0
            step_param = bsi->sv_istep[i];
1037
0
          }
1038
1039
          /* use previous block's result as next block's MV
1040
           * predictor.
1041
           */
1042
0
          if (segmentation == BLOCK_4X4 && i > 0) {
1043
0
            bsi->mvp.as_int = x->e_mbd.block[i - 1].bmi.mv.as_int;
1044
0
            if (i == 4 || i == 8 || i == 12) {
1045
0
              bsi->mvp.as_int = x->e_mbd.block[i - 4].bmi.mv.as_int;
1046
0
            }
1047
0
            step_param = 2;
1048
0
          }
1049
0
        }
1050
1051
0
        further_steps = (MAX_MVSEARCH_STEPS - 1) - step_param;
1052
1053
0
        {
1054
0
          int sadpb = x->sadperbit4;
1055
0
          int_mv mvp_full;
1056
1057
0
          mvp_full.as_mv.row = bsi->mvp.as_mv.row >> 3;
1058
0
          mvp_full.as_mv.col = bsi->mvp.as_mv.col >> 3;
1059
1060
          /* find first label */
1061
0
          n = vp8_mbsplit_offset[segmentation][i];
1062
1063
0
          c = &x->block[n];
1064
0
          e = &x->e_mbd.block[n];
1065
1066
0
          {
1067
0
            bestsme = cpi->diamond_search_sad(
1068
0
                x, c, e, &mvp_full, &mode_mv[NEW4X4], step_param, sadpb, &num00,
1069
0
                v_fn_ptr, x->mvcost, bsi->ref_mv);
1070
1071
0
            n = num00;
1072
0
            num00 = 0;
1073
1074
0
            while (n < further_steps) {
1075
0
              n++;
1076
1077
0
              if (num00) {
1078
0
                num00--;
1079
0
              } else {
1080
0
                thissme = cpi->diamond_search_sad(
1081
0
                    x, c, e, &mvp_full, &temp_mv, step_param + n, sadpb, &num00,
1082
0
                    v_fn_ptr, x->mvcost, bsi->ref_mv);
1083
1084
0
                if (thissme < bestsme) {
1085
0
                  bestsme = thissme;
1086
0
                  mode_mv[NEW4X4].as_int = temp_mv.as_int;
1087
0
                }
1088
0
              }
1089
0
            }
1090
0
          }
1091
1092
0
          sseshift = segmentation_to_sseshift[segmentation];
1093
1094
          /* Should we do a full search (best quality only) */
1095
0
          if ((cpi->compressor_speed == 0) && (bestsme >> sseshift) > 4000) {
1096
            /* Check if mvp_full is within the range. */
1097
0
            vp8_clamp_mv(&mvp_full, x->mv_col_min, x->mv_col_max, x->mv_row_min,
1098
0
                         x->mv_row_max);
1099
1100
0
            thissme = vp8_full_search_sad(x, c, e, &mvp_full, sadpb, 16,
1101
0
                                          v_fn_ptr, x->mvcost, bsi->ref_mv);
1102
1103
0
            if (thissme < bestsme) {
1104
0
              bestsme = thissme;
1105
0
              mode_mv[NEW4X4].as_int = e->bmi.mv.as_int;
1106
0
            } else {
1107
              /* The full search result is actually worse so
1108
               * re-instate the previous best vector
1109
               */
1110
0
              e->bmi.mv.as_int = mode_mv[NEW4X4].as_int;
1111
0
            }
1112
0
          }
1113
0
        }
1114
1115
0
        if (bestsme < INT_MAX) {
1116
0
          int disto;
1117
0
          unsigned int sse;
1118
0
          cpi->find_fractional_mv_step(x, c, e, &mode_mv[NEW4X4], bsi->ref_mv,
1119
0
                                       x->errorperbit, v_fn_ptr, x->mvcost,
1120
0
                                       &disto, &sse);
1121
0
        }
1122
0
      } /* NEW4X4 */
1123
1124
0
      rate = labels2mode(x, labels, i, this_mode, &mode_mv[this_mode],
1125
0
                         bsi->ref_mv, x->mvcost);
1126
1127
      /* Trap vectors that reach beyond the UMV borders */
1128
0
      if (((mode_mv[this_mode].as_mv.row >> 3) < x->mv_row_min) ||
1129
0
          ((mode_mv[this_mode].as_mv.row >> 3) > x->mv_row_max) ||
1130
0
          ((mode_mv[this_mode].as_mv.col >> 3) < x->mv_col_min) ||
1131
0
          ((mode_mv[this_mode].as_mv.col >> 3) > x->mv_col_max)) {
1132
0
        continue;
1133
0
      }
1134
1135
0
      distortion = vp8_encode_inter_mb_segment(x, labels, i) / 4;
1136
1137
0
      labelyrate = rdcost_mbsegment_y(x, labels, i, ta_s, tl_s);
1138
0
      rate += labelyrate;
1139
1140
0
      this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion);
1141
1142
0
      if (this_rd < best_label_rd) {
1143
0
        sbr = rate;
1144
0
        sbd = distortion;
1145
0
        bestlabelyrate = labelyrate;
1146
0
        mode_selected = this_mode;
1147
0
        best_label_rd = this_rd;
1148
1149
0
        t_above_b = t_above_s;
1150
0
        t_left_b = t_left_s;
1151
0
      }
1152
0
    } /*for each 4x4 mode*/
1153
1154
0
    t_above = t_above_b;
1155
0
    t_left = t_left_b;
1156
1157
0
    labels2mode(x, labels, i, mode_selected, &mode_mv[mode_selected],
1158
0
                bsi->ref_mv, x->mvcost);
1159
1160
0
    br += sbr;
1161
0
    bd += sbd;
1162
0
    segmentyrate += bestlabelyrate;
1163
0
    this_segment_rd += best_label_rd;
1164
1165
0
    if (this_segment_rd >= bsi->segment_rd) break;
1166
1167
0
  } /* for each label */
1168
1169
0
  if (this_segment_rd < bsi->segment_rd) {
1170
0
    bsi->r = br;
1171
0
    bsi->d = bd;
1172
0
    bsi->segment_yrate = segmentyrate;
1173
0
    bsi->segment_rd = this_segment_rd;
1174
0
    bsi->segment_num = segmentation;
1175
1176
    /* store everything needed to come back to this!! */
1177
0
    for (i = 0; i < 16; ++i) {
1178
0
      bsi->mvs[i].as_mv = x->partition_info->bmi[i].mv.as_mv;
1179
0
      bsi->modes[i] = x->partition_info->bmi[i].mode;
1180
0
      bsi->eobs[i] = x->e_mbd.eobs[i];
1181
0
    }
1182
0
  }
1183
0
}
1184
1185
0
static void vp8_cal_step_param(int sr, int *sp) {
1186
0
  int step = 0;
1187
1188
0
  if (sr > MAX_FIRST_STEP) {
1189
0
    sr = MAX_FIRST_STEP;
1190
0
  } else if (sr < 1) {
1191
0
    sr = 1;
1192
0
  }
1193
1194
0
  while (sr >>= 1) step++;
1195
1196
0
  *sp = MAX_MVSEARCH_STEPS - 1 - step;
1197
0
}
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
0
                                           int mvthresh) {
1205
0
  int i;
1206
0
  BEST_SEG_INFO bsi;
1207
1208
0
  memset(&bsi, 0, sizeof(bsi));
1209
1210
0
  bsi.segment_rd = best_rd;
1211
0
  bsi.ref_mv = best_ref_mv;
1212
0
  bsi.mvp.as_int = best_ref_mv->as_int;
1213
0
  bsi.mvthresh = mvthresh;
1214
0
  bsi.mdcounts = mdcounts;
1215
1216
0
  for (i = 0; i < 16; ++i) {
1217
0
    bsi.modes[i] = ZERO4X4;
1218
0
  }
1219
1220
0
  if (cpi->compressor_speed == 0) {
1221
    /* for now, we will keep the original segmentation order
1222
       when in best quality mode */
1223
0
    rd_check_segment(cpi, x, &bsi, BLOCK_16X8);
1224
0
    rd_check_segment(cpi, x, &bsi, BLOCK_8X16);
1225
0
    rd_check_segment(cpi, x, &bsi, BLOCK_8X8);
1226
0
    rd_check_segment(cpi, x, &bsi, BLOCK_4X4);
1227
0
  } else {
1228
0
    int sr;
1229
1230
0
    rd_check_segment(cpi, x, &bsi, BLOCK_8X8);
1231
1232
0
    if (bsi.segment_rd < best_rd) {
1233
0
      int col_min = ((best_ref_mv->as_mv.col + 7) >> 3) - MAX_FULL_PEL_VAL;
1234
0
      int row_min = ((best_ref_mv->as_mv.row + 7) >> 3) - MAX_FULL_PEL_VAL;
1235
0
      int col_max = (best_ref_mv->as_mv.col >> 3) + MAX_FULL_PEL_VAL;
1236
0
      int row_max = (best_ref_mv->as_mv.row >> 3) + MAX_FULL_PEL_VAL;
1237
1238
0
      int tmp_col_min = x->mv_col_min;
1239
0
      int tmp_col_max = x->mv_col_max;
1240
0
      int tmp_row_min = x->mv_row_min;
1241
0
      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
0
      if (x->mv_col_min < col_min) x->mv_col_min = col_min;
1246
0
      if (x->mv_col_max > col_max) x->mv_col_max = col_max;
1247
0
      if (x->mv_row_min < row_min) x->mv_row_min = row_min;
1248
0
      if (x->mv_row_max > row_max) x->mv_row_max = row_max;
1249
1250
      /* Get 8x8 result */
1251
0
      bsi.sv_mvp[0].as_int = bsi.mvs[0].as_int;
1252
0
      bsi.sv_mvp[1].as_int = bsi.mvs[2].as_int;
1253
0
      bsi.sv_mvp[2].as_int = bsi.mvs[8].as_int;
1254
0
      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
0
      {
1260
0
        sr =
1261
0
            MAXF((abs(bsi.sv_mvp[0].as_mv.row - bsi.sv_mvp[2].as_mv.row)) >> 3,
1262
0
                 (abs(bsi.sv_mvp[0].as_mv.col - bsi.sv_mvp[2].as_mv.col)) >> 3);
1263
0
        vp8_cal_step_param(sr, &bsi.sv_istep[0]);
1264
1265
0
        sr =
1266
0
            MAXF((abs(bsi.sv_mvp[1].as_mv.row - bsi.sv_mvp[3].as_mv.row)) >> 3,
1267
0
                 (abs(bsi.sv_mvp[1].as_mv.col - bsi.sv_mvp[3].as_mv.col)) >> 3);
1268
0
        vp8_cal_step_param(sr, &bsi.sv_istep[1]);
1269
1270
0
        rd_check_segment(cpi, x, &bsi, BLOCK_8X16);
1271
0
      }
1272
1273
      /* block 16X8 */
1274
0
      {
1275
0
        sr =
1276
0
            MAXF((abs(bsi.sv_mvp[0].as_mv.row - bsi.sv_mvp[1].as_mv.row)) >> 3,
1277
0
                 (abs(bsi.sv_mvp[0].as_mv.col - bsi.sv_mvp[1].as_mv.col)) >> 3);
1278
0
        vp8_cal_step_param(sr, &bsi.sv_istep[0]);
1279
1280
0
        sr =
1281
0
            MAXF((abs(bsi.sv_mvp[2].as_mv.row - bsi.sv_mvp[3].as_mv.row)) >> 3,
1282
0
                 (abs(bsi.sv_mvp[2].as_mv.col - bsi.sv_mvp[3].as_mv.col)) >> 3);
1283
0
        vp8_cal_step_param(sr, &bsi.sv_istep[1]);
1284
1285
0
        rd_check_segment(cpi, x, &bsi, BLOCK_16X8);
1286
0
      }
1287
1288
      /* If 8x8 is better than 16x8/8x16, then do 4x4 search */
1289
      /* Not skip 4x4 if speed=0 (good quality) */
1290
0
      if (cpi->sf.no_skip_block4x4_search || bsi.segment_num == BLOCK_8X8)
1291
      /* || (sv_segment_rd8x8-bsi.segment_rd) < sv_segment_rd8x8>>5) */
1292
0
      {
1293
0
        bsi.mvp.as_int = bsi.sv_mvp[0].as_int;
1294
0
        rd_check_segment(cpi, x, &bsi, BLOCK_4X4);
1295
0
      }
1296
1297
      /* restore UMV window */
1298
0
      x->mv_col_min = tmp_col_min;
1299
0
      x->mv_col_max = tmp_col_max;
1300
0
      x->mv_row_min = tmp_row_min;
1301
0
      x->mv_row_max = tmp_row_max;
1302
0
    }
1303
0
  }
1304
1305
  /* set it to the best */
1306
0
  for (i = 0; i < 16; ++i) {
1307
0
    BLOCKD *bd = &x->e_mbd.block[i];
1308
1309
0
    bd->bmi.mv.as_int = bsi.mvs[i].as_int;
1310
0
    *bd->eob = bsi.eobs[i];
1311
0
  }
1312
1313
0
  *returntotrate = bsi.r;
1314
0
  *returndistortion = bsi.d;
1315
0
  *returnyrate = bsi.segment_yrate;
1316
1317
  /* save partitions */
1318
0
  x->e_mbd.mode_info_context->mbmi.partitioning = bsi.segment_num;
1319
0
  x->partition_info->count = vp8_mbsplit_count[bsi.segment_num];
1320
1321
0
  for (i = 0; i < x->partition_info->count; ++i) {
1322
0
    int j;
1323
1324
0
    j = vp8_mbsplit_offset[bsi.segment_num][i];
1325
1326
0
    x->partition_info->bmi[i].mode = bsi.modes[j];
1327
0
    x->partition_info->bmi[i].mv.as_mv = bsi.mvs[j].as_mv;
1328
0
  }
1329
  /*
1330
   * used to set x->e_mbd.mode_info_context->mbmi.mv.as_int
1331
   */
1332
0
  x->partition_info->bmi[15].mv.as_int = bsi.mvs[15].as_int;
1333
1334
0
  return bsi.segment_rd;
1335
0
}
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
0
                 int near_sadidx[]) {
1341
0
  const MODE_INFO *above = here - xd->mode_info_stride;
1342
0
  const MODE_INFO *left = here - 1;
1343
0
  const MODE_INFO *aboveleft = above - 1;
1344
0
  int_mv near_mvs[8];
1345
0
  int near_ref[8];
1346
0
  int_mv mv;
1347
0
  int vcnt = 0;
1348
0
  int find = 0;
1349
0
  int mb_offset;
1350
1351
0
  int mvx[8];
1352
0
  int mvy[8];
1353
0
  int i;
1354
1355
0
  mv.as_int = 0;
1356
1357
0
  if (here->mbmi.ref_frame != INTRA_FRAME) {
1358
0
    near_mvs[0].as_int = near_mvs[1].as_int = near_mvs[2].as_int =
1359
0
        near_mvs[3].as_int = near_mvs[4].as_int = near_mvs[5].as_int =
1360
0
            near_mvs[6].as_int = near_mvs[7].as_int = 0;
1361
0
    near_ref[0] = near_ref[1] = near_ref[2] = near_ref[3] = near_ref[4] =
1362
0
        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
0
    if (above->mbmi.ref_frame != INTRA_FRAME) {
1368
0
      near_mvs[vcnt].as_int = above->mbmi.mv.as_int;
1369
0
      mv_bias(ref_frame_sign_bias[above->mbmi.ref_frame], refframe,
1370
0
              &near_mvs[vcnt], ref_frame_sign_bias);
1371
0
      near_ref[vcnt] = above->mbmi.ref_frame;
1372
0
    }
1373
0
    vcnt++;
1374
0
    if (left->mbmi.ref_frame != INTRA_FRAME) {
1375
0
      near_mvs[vcnt].as_int = left->mbmi.mv.as_int;
1376
0
      mv_bias(ref_frame_sign_bias[left->mbmi.ref_frame], refframe,
1377
0
              &near_mvs[vcnt], ref_frame_sign_bias);
1378
0
      near_ref[vcnt] = left->mbmi.ref_frame;
1379
0
    }
1380
0
    vcnt++;
1381
0
    if (aboveleft->mbmi.ref_frame != INTRA_FRAME) {
1382
0
      near_mvs[vcnt].as_int = aboveleft->mbmi.mv.as_int;
1383
0
      mv_bias(ref_frame_sign_bias[aboveleft->mbmi.ref_frame], refframe,
1384
0
              &near_mvs[vcnt], ref_frame_sign_bias);
1385
0
      near_ref[vcnt] = aboveleft->mbmi.ref_frame;
1386
0
    }
1387
0
    vcnt++;
1388
1389
    /* read in 5 nearby block's MVs from last frame. */
1390
0
    if (cpi->common.last_frame_type != KEY_FRAME) {
1391
0
      mb_offset = (-xd->mb_to_top_edge / 128 + 1) * (xd->mode_info_stride + 1) +
1392
0
                  (-xd->mb_to_left_edge / 128 + 1);
1393
1394
      /* current in last frame */
1395
0
      if (cpi->lf_ref_frame[mb_offset] != INTRA_FRAME) {
1396
0
        near_mvs[vcnt].as_int = cpi->lfmv[mb_offset].as_int;
1397
0
        mv_bias(cpi->lf_ref_frame_sign_bias[mb_offset], refframe,
1398
0
                &near_mvs[vcnt], ref_frame_sign_bias);
1399
0
        near_ref[vcnt] = cpi->lf_ref_frame[mb_offset];
1400
0
      }
1401
0
      vcnt++;
1402
1403
      /* above in last frame */
1404
0
      if (cpi->lf_ref_frame[mb_offset - xd->mode_info_stride - 1] !=
1405
0
          INTRA_FRAME) {
1406
0
        near_mvs[vcnt].as_int =
1407
0
            cpi->lfmv[mb_offset - xd->mode_info_stride - 1].as_int;
1408
0
        mv_bias(
1409
0
            cpi->lf_ref_frame_sign_bias[mb_offset - xd->mode_info_stride - 1],
1410
0
            refframe, &near_mvs[vcnt], ref_frame_sign_bias);
1411
0
        near_ref[vcnt] =
1412
0
            cpi->lf_ref_frame[mb_offset - xd->mode_info_stride - 1];
1413
0
      }
1414
0
      vcnt++;
1415
1416
      /* left in last frame */
1417
0
      if (cpi->lf_ref_frame[mb_offset - 1] != INTRA_FRAME) {
1418
0
        near_mvs[vcnt].as_int = cpi->lfmv[mb_offset - 1].as_int;
1419
0
        mv_bias(cpi->lf_ref_frame_sign_bias[mb_offset - 1], refframe,
1420
0
                &near_mvs[vcnt], ref_frame_sign_bias);
1421
0
        near_ref[vcnt] = cpi->lf_ref_frame[mb_offset - 1];
1422
0
      }
1423
0
      vcnt++;
1424
1425
      /* right in last frame */
1426
0
      if (cpi->lf_ref_frame[mb_offset + 1] != INTRA_FRAME) {
1427
0
        near_mvs[vcnt].as_int = cpi->lfmv[mb_offset + 1].as_int;
1428
0
        mv_bias(cpi->lf_ref_frame_sign_bias[mb_offset + 1], refframe,
1429
0
                &near_mvs[vcnt], ref_frame_sign_bias);
1430
0
        near_ref[vcnt] = cpi->lf_ref_frame[mb_offset + 1];
1431
0
      }
1432
0
      vcnt++;
1433
1434
      /* below in last frame */
1435
0
      if (cpi->lf_ref_frame[mb_offset + xd->mode_info_stride + 1] !=
1436
0
          INTRA_FRAME) {
1437
0
        near_mvs[vcnt].as_int =
1438
0
            cpi->lfmv[mb_offset + xd->mode_info_stride + 1].as_int;
1439
0
        mv_bias(
1440
0
            cpi->lf_ref_frame_sign_bias[mb_offset + xd->mode_info_stride + 1],
1441
0
            refframe, &near_mvs[vcnt], ref_frame_sign_bias);
1442
0
        near_ref[vcnt] =
1443
0
            cpi->lf_ref_frame[mb_offset + xd->mode_info_stride + 1];
1444
0
      }
1445
0
      vcnt++;
1446
0
    }
1447
1448
0
    for (i = 0; i < vcnt; ++i) {
1449
0
      if (near_ref[near_sadidx[i]] != INTRA_FRAME) {
1450
0
        if (here->mbmi.ref_frame == near_ref[near_sadidx[i]]) {
1451
0
          mv.as_int = near_mvs[near_sadidx[i]].as_int;
1452
0
          find = 1;
1453
0
          if (i < 3) {
1454
0
            *sr = 3;
1455
0
          } else {
1456
0
            *sr = 2;
1457
0
          }
1458
0
          break;
1459
0
        }
1460
0
      }
1461
0
    }
1462
1463
0
    if (!find) {
1464
0
      for (i = 0; i < vcnt; ++i) {
1465
0
        mvx[i] = near_mvs[i].as_mv.row;
1466
0
        mvy[i] = near_mvs[i].as_mv.col;
1467
0
      }
1468
1469
0
      insertsortmv(mvx, vcnt);
1470
0
      insertsortmv(mvy, vcnt);
1471
0
      mv.as_mv.row = mvx[vcnt / 2];
1472
0
      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
0
      *sr = 0;
1478
0
    }
1479
0
  }
1480
1481
  /* Set up return values */
1482
0
  mvp->as_int = mv.as_int;
1483
0
  vp8_clamp_mv2(mvp, xd);
1484
0
}
1485
1486
void vp8_cal_sad(VP8_COMP *cpi, MACROBLOCKD *xd, MACROBLOCK *x,
1487
0
                 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
0
  int near_sad[8] = { 0 };
1493
0
  BLOCK *b = &x->block[0];
1494
0
  unsigned char *src_y_ptr = *(b->base_src);
1495
1496
  /* calculate sad for current frame 3 nearby MBs. */
1497
0
  if (xd->mb_to_top_edge == 0 && xd->mb_to_left_edge == 0) {
1498
0
    near_sad[0] = near_sad[1] = near_sad[2] = INT_MAX;
1499
0
  } else if (xd->mb_to_top_edge ==
1500
0
             0) { /* only has left MB for sad calculation. */
1501
0
    near_sad[0] = near_sad[2] = INT_MAX;
1502
0
    near_sad[1] = cpi->fn_ptr[BLOCK_16X16].sdf(
1503
0
        src_y_ptr, b->src_stride, xd->dst.y_buffer - 16, xd->dst.y_stride);
1504
0
  } else if (xd->mb_to_left_edge ==
1505
0
             0) { /* only has left MB for sad calculation. */
1506
0
    near_sad[1] = near_sad[2] = INT_MAX;
1507
0
    near_sad[0] = cpi->fn_ptr[BLOCK_16X16].sdf(
1508
0
        src_y_ptr, b->src_stride, xd->dst.y_buffer - xd->dst.y_stride * 16,
1509
0
        xd->dst.y_stride);
1510
0
  } else {
1511
0
    near_sad[0] = cpi->fn_ptr[BLOCK_16X16].sdf(
1512
0
        src_y_ptr, b->src_stride, xd->dst.y_buffer - xd->dst.y_stride * 16,
1513
0
        xd->dst.y_stride);
1514
0
    near_sad[1] = cpi->fn_ptr[BLOCK_16X16].sdf(
1515
0
        src_y_ptr, b->src_stride, xd->dst.y_buffer - 16, xd->dst.y_stride);
1516
0
    near_sad[2] = cpi->fn_ptr[BLOCK_16X16].sdf(
1517
0
        src_y_ptr, b->src_stride, xd->dst.y_buffer - xd->dst.y_stride * 16 - 16,
1518
0
        xd->dst.y_stride);
1519
0
  }
1520
1521
0
  if (cpi->common.last_frame_type != KEY_FRAME) {
1522
    /* calculate sad for last frame 5 nearby MBs. */
1523
0
    unsigned char *pre_y_buffer =
1524
0
        cpi->common.yv12_fb[cpi->common.lst_fb_idx].y_buffer + recon_yoffset;
1525
0
    int pre_y_stride = cpi->common.yv12_fb[cpi->common.lst_fb_idx].y_stride;
1526
1527
0
    if (xd->mb_to_top_edge == 0) near_sad[4] = INT_MAX;
1528
0
    if (xd->mb_to_left_edge == 0) near_sad[5] = INT_MAX;
1529
0
    if (xd->mb_to_right_edge == 0) near_sad[6] = INT_MAX;
1530
0
    if (xd->mb_to_bottom_edge == 0) near_sad[7] = INT_MAX;
1531
1532
0
    if (near_sad[4] != INT_MAX) {
1533
0
      near_sad[4] = cpi->fn_ptr[BLOCK_16X16].sdf(
1534
0
          src_y_ptr, b->src_stride, pre_y_buffer - pre_y_stride * 16,
1535
0
          pre_y_stride);
1536
0
    }
1537
0
    if (near_sad[5] != INT_MAX) {
1538
0
      near_sad[5] = cpi->fn_ptr[BLOCK_16X16].sdf(
1539
0
          src_y_ptr, b->src_stride, pre_y_buffer - 16, pre_y_stride);
1540
0
    }
1541
0
    near_sad[3] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride,
1542
0
                                               pre_y_buffer, pre_y_stride);
1543
0
    if (near_sad[6] != INT_MAX) {
1544
0
      near_sad[6] = cpi->fn_ptr[BLOCK_16X16].sdf(
1545
0
          src_y_ptr, b->src_stride, pre_y_buffer + 16, pre_y_stride);
1546
0
    }
1547
0
    if (near_sad[7] != INT_MAX) {
1548
0
      near_sad[7] = cpi->fn_ptr[BLOCK_16X16].sdf(
1549
0
          src_y_ptr, b->src_stride, pre_y_buffer + pre_y_stride * 16,
1550
0
          pre_y_stride);
1551
0
    }
1552
0
  }
1553
1554
0
  if (cpi->common.last_frame_type != KEY_FRAME) {
1555
0
    insertsortsad(near_sad, near_sadidx, 8);
1556
0
  } else {
1557
0
    insertsortsad(near_sad, near_sadidx, 3);
1558
0
  }
1559
0
}
1560
1561
0
static void rd_update_mvcount(MACROBLOCK *x, int_mv *best_ref_mv) {
1562
0
  if (x->e_mbd.mode_info_context->mbmi.mode == SPLITMV) {
1563
0
    int i;
1564
1565
0
    for (i = 0; i < x->partition_info->count; ++i) {
1566
0
      if (x->partition_info->bmi[i].mode == NEW4X4) {
1567
0
        const int row_val = ((x->partition_info->bmi[i].mv.as_mv.row -
1568
0
                              best_ref_mv->as_mv.row) >>
1569
0
                             1);
1570
0
        const int row_idx = mv_max + row_val;
1571
0
        const int col_val = ((x->partition_info->bmi[i].mv.as_mv.col -
1572
0
                              best_ref_mv->as_mv.col) >>
1573
0
                             1);
1574
0
        const int col_idx = mv_max + col_val;
1575
0
        if (row_idx >= 0 && row_idx < MVvals && col_idx >= 0 &&
1576
0
            col_idx < MVvals) {
1577
0
          x->MVcount[0][row_idx]++;
1578
0
          x->MVcount[1][col_idx]++;
1579
0
        }
1580
0
      }
1581
0
    }
1582
0
  } else if (x->e_mbd.mode_info_context->mbmi.mode == NEWMV) {
1583
0
    const int row_val = ((x->e_mbd.mode_info_context->mbmi.mv.as_mv.row -
1584
0
                          best_ref_mv->as_mv.row) >>
1585
0
                         1);
1586
0
    const int row_idx = mv_max + row_val;
1587
0
    const int col_val = ((x->e_mbd.mode_info_context->mbmi.mv.as_mv.col -
1588
0
                          best_ref_mv->as_mv.col) >>
1589
0
                         1);
1590
0
    const int col_idx = mv_max + col_val;
1591
0
    if (row_idx >= 0 && row_idx < MVvals && col_idx >= 0 && col_idx < MVvals) {
1592
0
      x->MVcount[0][row_idx]++;
1593
0
      x->MVcount[1][col_idx]++;
1594
0
    }
1595
0
  }
1596
0
}
1597
1598
static int evaluate_inter_mode_rd(int mdcounts[4], RATE_DISTORTION *rd,
1599
                                  int *disable_skip, VP8_COMP *cpi,
1600
0
                                  MACROBLOCK *x) {
1601
0
  MB_PREDICTION_MODE this_mode = x->e_mbd.mode_info_context->mbmi.mode;
1602
0
  BLOCK *b = &x->block[0];
1603
0
  MACROBLOCKD *xd = &x->e_mbd;
1604
0
  int distortion;
1605
0
  vp8_build_inter16x16_predictors_mby(&x->e_mbd, x->e_mbd.predictor, 16);
1606
1607
0
  if (cpi->active_map_enabled && x->active_ptr[0] == 0) {
1608
0
    x->skip = 1;
1609
0
  } 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
0
  rd->rate2 += vp8_cost_mv_ref(this_mode, mdcounts);
1645
1646
  /* Y cost and distortion */
1647
0
  macro_block_yrd(x, &rd->rate_y, &distortion);
1648
0
  rd->rate2 += rd->rate_y;
1649
0
  rd->distortion2 += distortion;
1650
1651
  /* UV cost and distortion */
1652
0
  rd_inter16x16_uv(cpi, x, &rd->rate_uv, &rd->distortion_uv,
1653
0
                   cpi->common.full_pixel);
1654
0
  rd->rate2 += rd->rate_uv;
1655
0
  rd->distortion2 += rd->distortion_uv;
1656
0
  return INT_MAX;
1657
0
}
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
0
                                    VP8_COMP *cpi, MACROBLOCK *x) {
1663
0
  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
0
  if (cpi->common.mb_no_coeff_skip) {
1670
0
    *other_cost += vp8_cost_bit(cpi->prob_skip_false, 0);
1671
0
    rd->rate2 += *other_cost;
1672
0
  }
1673
1674
  /* Estimate the reference frame signaling cost and add it
1675
   * to the rolling cost variable.
1676
   */
1677
0
  rd->rate2 += x->ref_frame_cost[x->e_mbd.mode_info_context->mbmi.ref_frame];
1678
1679
0
  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
0
    if (cpi->common.mb_no_coeff_skip) {
1685
0
      int i;
1686
0
      int tteob;
1687
0
      int has_y2_block = (this_mode != SPLITMV && this_mode != B_PRED);
1688
1689
0
      tteob = 0;
1690
0
      if (has_y2_block) tteob += x->e_mbd.eobs[24];
1691
1692
0
      for (i = 0; i < 16; ++i) tteob += (x->e_mbd.eobs[i] > has_y2_block);
1693
1694
0
      if (x->e_mbd.mode_info_context->mbmi.ref_frame) {
1695
0
        for (i = 16; i < 24; ++i) tteob += x->e_mbd.eobs[i];
1696
0
      } else {
1697
0
        tteob += uv_intra_tteob;
1698
0
      }
1699
1700
0
      if (tteob == 0) {
1701
0
        rd->rate2 -= (rd->rate_y + rd->rate_uv);
1702
        /* for best_yrd calculation */
1703
0
        rd->rate_uv = 0;
1704
1705
        /* Back out no skip flag costing and add in skip flag costing */
1706
0
        if (cpi->prob_skip_false) {
1707
0
          int prob_skip_cost;
1708
1709
0
          prob_skip_cost = vp8_cost_bit(cpi->prob_skip_false, 1);
1710
0
          prob_skip_cost -= (int)vp8_cost_bit(cpi->prob_skip_false, 0);
1711
0
          rd->rate2 += prob_skip_cost;
1712
0
          *other_cost += prob_skip_cost;
1713
0
        }
1714
0
      }
1715
0
    }
1716
    /* Calculate the final RD estimate for this mode */
1717
0
    this_rd = RDCOST(x->rdmult, x->rddiv, rd->rate2, rd->distortion2);
1718
0
    if (this_rd < INT_MAX &&
1719
0
        x->e_mbd.mode_info_context->mbmi.ref_frame == INTRA_FRAME) {
1720
0
      this_rd += intra_rd_penalty;
1721
0
    }
1722
0
  }
1723
0
  return this_rd;
1724
0
}
1725
1726
static void update_best_mode(BEST_MODE *best_mode, int this_rd,
1727
                             RATE_DISTORTION *rd, int other_cost,
1728
0
                             MACROBLOCK *x) {
1729
0
  MB_PREDICTION_MODE this_mode = x->e_mbd.mode_info_context->mbmi.mode;
1730
1731
0
  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
0
  best_mode->yrd =
1735
0
      RDCOST(x->rdmult, x->rddiv, (rd->rate2 - rd->rate_uv - other_cost),
1736
0
             (rd->distortion2 - rd->distortion_uv));
1737
1738
0
  best_mode->rd = this_rd;
1739
0
  best_mode->mbmode = x->e_mbd.mode_info_context->mbmi;
1740
0
  best_mode->partition = *x->partition_info;
1741
1742
0
  if ((this_mode == B_PRED) || (this_mode == SPLITMV)) {
1743
0
    int i;
1744
0
    for (i = 0; i < 16; ++i) {
1745
0
      best_mode->bmodes[i] = x->e_mbd.block[i].bmi;
1746
0
    }
1747
0
  }
1748
0
}
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
0
                            int mb_col) {
1754
0
  BLOCK *b = &x->block[0];
1755
0
  BLOCKD *d = &x->e_mbd.block[0];
1756
0
  MACROBLOCKD *xd = &x->e_mbd;
1757
0
  int_mv best_ref_mv_sb[2];
1758
0
  int_mv mode_mv_sb[2][MB_MODE_COUNT];
1759
0
  int_mv best_ref_mv;
1760
0
  int_mv *mode_mv;
1761
0
  MB_PREDICTION_MODE this_mode;
1762
0
  int num00;
1763
0
  int best_mode_index = 0;
1764
0
  BEST_MODE best_mode;
1765
1766
0
  int i;
1767
0
  int mode_index;
1768
0
  int mdcounts[4];
1769
0
  int rate;
1770
0
  RATE_DISTORTION rd;
1771
0
  int uv_intra_rate, uv_intra_distortion, uv_intra_rate_tokenonly;
1772
0
  int uv_intra_tteob = 0;
1773
0
  int uv_intra_done = 0;
1774
1775
0
  MB_PREDICTION_MODE uv_intra_mode = 0;
1776
0
  int_mv mvp;
1777
0
  int near_sadidx[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
1778
0
  int saddone = 0;
1779
  /* search range got from mv_pred(). It uses step_param levels. (0-7) */
1780
0
  int sr = 0;
1781
1782
0
  unsigned char *plane[4][3] = { { 0, 0 } };
1783
0
  int ref_frame_map[4];
1784
0
  int sign_bias = 0;
1785
1786
0
  int intra_rd_penalty =
1787
0
      10 * vp8_dc_quant(cpi->common.base_qindex, cpi->common.y1dc_delta_q);
1788
1789
0
#if CONFIG_TEMPORAL_DENOISING
1790
0
  unsigned int zero_mv_sse = UINT_MAX, best_sse = UINT_MAX,
1791
0
               best_rd_sse = UINT_MAX;
1792
0
#endif
1793
1794
  // _uv variables are not set consistantly before calling update_best_mode.
1795
0
  rd.rate_uv = 0;
1796
0
  rd.distortion_uv = 0;
1797
1798
0
  mode_mv = mode_mv_sb[sign_bias];
1799
0
  best_ref_mv.as_int = 0;
1800
0
  best_mode.rd = INT_MAX;
1801
0
  best_mode.yrd = INT_MAX;
1802
0
  best_mode.intra_rd = INT_MAX;
1803
0
  memset(mode_mv_sb, 0, sizeof(mode_mv_sb));
1804
0
  memset(&best_mode.mbmode, 0, sizeof(best_mode.mbmode));
1805
0
  memset(&best_mode.bmodes, 0, sizeof(best_mode.bmodes));
1806
1807
  /* Setup search priorities */
1808
0
  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
0
  if (ref_frame_map[1] > 0) {
1814
0
    sign_bias = vp8_find_near_mvs_bias(
1815
0
        &x->e_mbd, x->e_mbd.mode_info_context, mode_mv_sb, best_ref_mv_sb,
1816
0
        mdcounts, ref_frame_map[1], cpi->common.ref_frame_sign_bias);
1817
1818
0
    mode_mv = mode_mv_sb[sign_bias];
1819
0
    best_ref_mv.as_int = best_ref_mv_sb[sign_bias].as_int;
1820
0
  }
1821
1822
0
  get_predictor_pointers(cpi, plane, recon_yoffset, recon_uvoffset);
1823
1824
0
  *returnintra = INT_MAX;
1825
  /* Count of the number of MBs tested so far this frame */
1826
0
  x->mbs_tested_so_far++;
1827
1828
0
  x->skip = 0;
1829
1830
0
  for (mode_index = 0; mode_index < MAX_MODES; ++mode_index) {
1831
0
    int this_rd = INT_MAX;
1832
0
    int disable_skip = 0;
1833
0
    int other_cost = 0;
1834
0
    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
0
    if (best_mode.rd <= x->rd_threshes[mode_index]) continue;
1838
1839
0
    if (this_ref_frame < 0) continue;
1840
1841
    /* These variables hold are rolling total cost and distortion for
1842
     * this mode
1843
     */
1844
0
    rd.rate2 = 0;
1845
0
    rd.distortion2 = 0;
1846
1847
0
    this_mode = vp8_mode_order[mode_index];
1848
1849
0
    x->e_mbd.mode_info_context->mbmi.mode = this_mode;
1850
0
    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
0
    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
0
    if (x->e_mbd.mode_info_context->mbmi.ref_frame) {
1865
0
      assert(plane[this_ref_frame][0] != NULL &&
1866
0
             plane[this_ref_frame][1] != NULL &&
1867
0
             plane[this_ref_frame][2] != NULL);
1868
0
      x->e_mbd.pre.y_buffer = plane[this_ref_frame][0];
1869
0
      x->e_mbd.pre.u_buffer = plane[this_ref_frame][1];
1870
0
      x->e_mbd.pre.v_buffer = plane[this_ref_frame][2];
1871
1872
0
      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
0
    }
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
0
    if (x->mode_test_hit_counts[mode_index] &&
1884
0
        (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
0
    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
0
    if (x->zbin_mode_boost_enabled) {
1914
0
      if (this_ref_frame == INTRA_FRAME) {
1915
0
        x->zbin_mode_boost = 0;
1916
0
      } else {
1917
0
        if (vp8_mode_order[mode_index] == ZEROMV) {
1918
0
          if (this_ref_frame != LAST_FRAME) {
1919
0
            x->zbin_mode_boost = GF_ZEROMV_ZBIN_BOOST;
1920
0
          } else {
1921
0
            x->zbin_mode_boost = LF_ZEROMV_ZBIN_BOOST;
1922
0
          }
1923
0
        } else if (vp8_mode_order[mode_index] == SPLITMV) {
1924
0
          x->zbin_mode_boost = 0;
1925
0
        } else {
1926
0
          x->zbin_mode_boost = MV_ZBIN_BOOST;
1927
0
        }
1928
0
      }
1929
1930
0
      vp8_update_zbin_extra(cpi, x);
1931
0
    }
1932
1933
0
    if (!uv_intra_done && this_ref_frame == INTRA_FRAME) {
1934
0
      rd_pick_intra_mbuv_mode(x, &uv_intra_rate, &uv_intra_rate_tokenonly,
1935
0
                              &uv_intra_distortion);
1936
0
      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
0
      for (i = 16; i < 24; ++i) uv_intra_tteob += x->e_mbd.eobs[i];
1944
1945
0
      uv_intra_done = 1;
1946
0
    }
1947
1948
0
    switch (this_mode) {
1949
0
      case B_PRED: {
1950
0
        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
0
        int distortion;
1956
0
        tmp_rd = rd_pick_intra4x4mby_modes(x, &rate, &rd.rate_y, &distortion,
1957
0
                                           best_mode.yrd);
1958
0
        rd.rate2 += rate;
1959
0
        rd.distortion2 += distortion;
1960
1961
0
        if (tmp_rd < best_mode.yrd) {
1962
0
          assert(uv_intra_done);
1963
0
          rd.rate2 += uv_intra_rate;
1964
0
          rd.rate_uv = uv_intra_rate_tokenonly;
1965
0
          rd.distortion2 += uv_intra_distortion;
1966
0
          rd.distortion_uv = uv_intra_distortion;
1967
0
        } else {
1968
0
          this_rd = INT_MAX;
1969
0
          disable_skip = 1;
1970
0
        }
1971
0
        break;
1972
0
      }
1973
1974
0
      case SPLITMV: {
1975
0
        int tmp_rd;
1976
0
        int this_rd_thresh;
1977
0
        int distortion;
1978
1979
0
        this_rd_thresh = (vp8_ref_frame_order[mode_index] == 1)
1980
0
                             ? x->rd_threshes[THR_NEW1]
1981
0
                             : x->rd_threshes[THR_NEW3];
1982
0
        this_rd_thresh = (vp8_ref_frame_order[mode_index] == 2)
1983
0
                             ? x->rd_threshes[THR_NEW2]
1984
0
                             : this_rd_thresh;
1985
1986
0
        tmp_rd = vp8_rd_pick_best_mbsegmentation(
1987
0
            cpi, x, &best_ref_mv, best_mode.yrd, mdcounts, &rate, &rd.rate_y,
1988
0
            &distortion, this_rd_thresh);
1989
1990
0
        rd.rate2 += rate;
1991
0
        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
0
        if (tmp_rd < best_mode.yrd) {
1997
          /* Now work out UV cost and add it in */
1998
0
          rd_inter4x4_uv(cpi, x, &rd.rate_uv, &rd.distortion_uv,
1999
0
                         cpi->common.full_pixel);
2000
0
          rd.rate2 += rd.rate_uv;
2001
0
          rd.distortion2 += rd.distortion_uv;
2002
0
        } else {
2003
0
          this_rd = INT_MAX;
2004
0
          disable_skip = 1;
2005
0
        }
2006
0
        break;
2007
0
      }
2008
0
      case DC_PRED:
2009
0
      case V_PRED:
2010
0
      case H_PRED:
2011
0
      case TM_PRED: {
2012
0
        int distortion;
2013
0
        x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME;
2014
2015
0
        vp8_build_intra_predictors_mby_s(
2016
0
            xd, xd->dst.y_buffer - xd->dst.y_stride, xd->dst.y_buffer - 1,
2017
0
            xd->dst.y_stride, xd->predictor, 16);
2018
0
        macro_block_yrd(x, &rd.rate_y, &distortion);
2019
0
        rd.rate2 += rd.rate_y;
2020
0
        rd.distortion2 += distortion;
2021
0
        rd.rate2 += x->mbmode_cost[x->e_mbd.frame_type]
2022
0
                                  [x->e_mbd.mode_info_context->mbmi.mode];
2023
0
        assert(uv_intra_done);
2024
0
        rd.rate2 += uv_intra_rate;
2025
0
        rd.rate_uv = uv_intra_rate_tokenonly;
2026
0
        rd.distortion2 += uv_intra_distortion;
2027
0
        rd.distortion_uv = uv_intra_distortion;
2028
0
        break;
2029
0
      }
2030
2031
0
      case NEWMV: {
2032
0
        int thissme;
2033
0
        int bestsme = INT_MAX;
2034
0
        int step_param = cpi->sf.first_step;
2035
0
        int further_steps;
2036
0
        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
0
        int do_refine = 1;
2041
2042
0
        int sadpb = x->sadperbit16;
2043
0
        int_mv mvp_full;
2044
2045
0
        int col_min = ((best_ref_mv.as_mv.col + 7) >> 3) - MAX_FULL_PEL_VAL;
2046
0
        int row_min = ((best_ref_mv.as_mv.row + 7) >> 3) - MAX_FULL_PEL_VAL;
2047
0
        int col_max = (best_ref_mv.as_mv.col >> 3) + MAX_FULL_PEL_VAL;
2048
0
        int row_max = (best_ref_mv.as_mv.row >> 3) + MAX_FULL_PEL_VAL;
2049
2050
0
        int tmp_col_min = x->mv_col_min;
2051
0
        int tmp_col_max = x->mv_col_max;
2052
0
        int tmp_row_min = x->mv_row_min;
2053
0
        int tmp_row_max = x->mv_row_max;
2054
2055
0
        if (!saddone) {
2056
0
          vp8_cal_sad(cpi, xd, x, recon_yoffset, &near_sadidx[0]);
2057
0
          saddone = 1;
2058
0
        }
2059
2060
0
        vp8_mv_pred(cpi, &x->e_mbd, x->e_mbd.mode_info_context, &mvp,
2061
0
                    x->e_mbd.mode_info_context->mbmi.ref_frame,
2062
0
                    cpi->common.ref_frame_sign_bias, &sr, &near_sadidx[0]);
2063
2064
0
        mvp_full.as_mv.col = mvp.as_mv.col >> 3;
2065
0
        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
0
        if (x->mv_col_min < col_min) x->mv_col_min = col_min;
2071
0
        if (x->mv_col_max > col_max) x->mv_col_max = col_max;
2072
0
        if (x->mv_row_min < row_min) x->mv_row_min = row_min;
2073
0
        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
0
        if (sr > step_param) step_param = sr;
2077
2078
        /* Initial step/diamond search */
2079
0
        {
2080
0
          bestsme = cpi->diamond_search_sad(
2081
0
              x, b, d, &mvp_full, &d->bmi.mv, step_param, sadpb, &num00,
2082
0
              &cpi->fn_ptr[BLOCK_16X16], x->mvcost, &best_ref_mv);
2083
0
          mode_mv[NEWMV].as_int = d->bmi.mv.as_int;
2084
2085
          /* Further step/diamond searches as necessary */
2086
0
          further_steps = (cpi->sf.max_step_search_steps - 1) - step_param;
2087
2088
0
          n = num00;
2089
0
          num00 = 0;
2090
2091
          /* If there won't be more n-step search, check to see if refining
2092
           * search is needed. */
2093
0
          if (n > further_steps) do_refine = 0;
2094
2095
0
          while (n < further_steps) {
2096
0
            n++;
2097
2098
0
            if (num00) {
2099
0
              num00--;
2100
0
            } else {
2101
0
              thissme = cpi->diamond_search_sad(
2102
0
                  x, b, d, &mvp_full, &d->bmi.mv, step_param + n, sadpb, &num00,
2103
0
                  &cpi->fn_ptr[BLOCK_16X16], x->mvcost, &best_ref_mv);
2104
2105
              /* check to see if refining search is needed. */
2106
0
              if (num00 > (further_steps - n)) do_refine = 0;
2107
2108
0
              if (thissme < bestsme) {
2109
0
                bestsme = thissme;
2110
0
                mode_mv[NEWMV].as_int = d->bmi.mv.as_int;
2111
0
              } else {
2112
0
                d->bmi.mv.as_int = mode_mv[NEWMV].as_int;
2113
0
              }
2114
0
            }
2115
0
          }
2116
0
        }
2117
2118
        /* final 1-away diamond refining search */
2119
0
        if (do_refine == 1) {
2120
0
          int search_range;
2121
2122
0
          search_range = 8;
2123
2124
0
          thissme = cpi->refining_search_sad(
2125
0
              x, b, d, &d->bmi.mv, sadpb, search_range,
2126
0
              &cpi->fn_ptr[BLOCK_16X16], x->mvcost, &best_ref_mv);
2127
2128
0
          if (thissme < bestsme) {
2129
0
            bestsme = thissme;
2130
0
            mode_mv[NEWMV].as_int = d->bmi.mv.as_int;
2131
0
          } else {
2132
0
            d->bmi.mv.as_int = mode_mv[NEWMV].as_int;
2133
0
          }
2134
0
        }
2135
2136
0
        x->mv_col_min = tmp_col_min;
2137
0
        x->mv_col_max = tmp_col_max;
2138
0
        x->mv_row_min = tmp_row_min;
2139
0
        x->mv_row_max = tmp_row_max;
2140
2141
0
        if (bestsme < INT_MAX) {
2142
0
          int dis; /* TODO: use dis in distortion calculation later. */
2143
0
          unsigned int sse;
2144
0
          cpi->find_fractional_mv_step(
2145
0
              x, b, d, &d->bmi.mv, &best_ref_mv, x->errorperbit,
2146
0
              &cpi->fn_ptr[BLOCK_16X16], x->mvcost, &dis, &sse);
2147
0
        }
2148
2149
0
        mode_mv[NEWMV].as_int = d->bmi.mv.as_int;
2150
2151
        /* Add the new motion vector cost to our rolling cost variable */
2152
0
        rd.rate2 +=
2153
0
            vp8_mv_bit_cost(&mode_mv[NEWMV], &best_ref_mv, x->mvcost, 96);
2154
0
      }
2155
        // fall through
2156
2157
0
      case NEARESTMV:
2158
0
      case NEARMV:
2159
        /* Clip "next_nearest" so that it does not extend to far out
2160
         * of image
2161
         */
2162
0
        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
0
        if (((this_mode == NEARMV) || (this_mode == NEARESTMV)) &&
2169
0
            (mode_mv[this_mode].as_int == 0)) {
2170
0
          continue;
2171
0
        }
2172
        // fall through
2173
2174
0
      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
0
        if (((mode_mv[this_mode].as_mv.row >> 3) < x->mv_row_min) ||
2182
0
            ((mode_mv[this_mode].as_mv.row >> 3) > x->mv_row_max) ||
2183
0
            ((mode_mv[this_mode].as_mv.col >> 3) < x->mv_col_min) ||
2184
0
            ((mode_mv[this_mode].as_mv.col >> 3) > x->mv_col_max)) {
2185
0
          continue;
2186
0
        }
2187
2188
0
        vp8_set_mbmode_and_mvs(x, this_mode, &mode_mv[this_mode]);
2189
0
        this_rd = evaluate_inter_mode_rd(mdcounts, &rd, &disable_skip, cpi, x);
2190
0
        break;
2191
2192
0
      default: break;
2193
0
    }
2194
2195
0
    this_rd =
2196
0
        calculate_final_rd_costs(this_rd, &rd, &other_cost, disable_skip,
2197
0
                                 uv_intra_tteob, intra_rd_penalty, cpi, x);
2198
2199
    /* Keep record of best intra distortion */
2200
0
    if ((x->e_mbd.mode_info_context->mbmi.ref_frame == INTRA_FRAME) &&
2201
0
        (this_rd < best_mode.intra_rd)) {
2202
0
      best_mode.intra_rd = this_rd;
2203
0
      *returnintra = rd.distortion2;
2204
0
    }
2205
0
#if CONFIG_TEMPORAL_DENOISING
2206
0
    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
0
#endif
2233
2234
    /* Did this mode help.. i.i is it the new best mode */
2235
0
    if (this_rd < best_mode.rd || x->skip) {
2236
      /* Note index of best mode so far */
2237
0
      best_mode_index = mode_index;
2238
0
      *returnrate = rd.rate2;
2239
0
      *returndistortion = rd.distortion2;
2240
0
      if (this_mode <= B_PRED) {
2241
0
        x->e_mbd.mode_info_context->mbmi.uv_mode = uv_intra_mode;
2242
        /* required for left and above block mv */
2243
0
        x->e_mbd.mode_info_context->mbmi.mv.as_int = 0;
2244
0
      }
2245
0
      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
0
      x->rd_thresh_mult[mode_index] =
2251
0
          (x->rd_thresh_mult[mode_index] >= (MIN_THRESHMULT + 2))
2252
0
              ? x->rd_thresh_mult[mode_index] - 2
2253
0
              : MIN_THRESHMULT;
2254
0
    }
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
0
    else {
2260
0
      x->rd_thresh_mult[mode_index] += 4;
2261
2262
0
      if (x->rd_thresh_mult[mode_index] > MAX_THRESHMULT) {
2263
0
        x->rd_thresh_mult[mode_index] = MAX_THRESHMULT;
2264
0
      }
2265
0
    }
2266
0
    x->rd_threshes[mode_index] = (cpi->rd_baseline_thresh[mode_index] >> 7) *
2267
0
                                 x->rd_thresh_mult[mode_index];
2268
2269
0
    if (x->skip) break;
2270
0
  }
2271
2272
  /* Reduce the activation RD thresholds for the best choice mode */
2273
0
  if ((cpi->rd_baseline_thresh[best_mode_index] > 0) &&
2274
0
      (cpi->rd_baseline_thresh[best_mode_index] < (INT_MAX >> 2))) {
2275
0
    int best_adjustment = (x->rd_thresh_mult[best_mode_index] >> 2);
2276
2277
0
    x->rd_thresh_mult[best_mode_index] =
2278
0
        (x->rd_thresh_mult[best_mode_index] >=
2279
0
         (MIN_THRESHMULT + best_adjustment))
2280
0
            ? x->rd_thresh_mult[best_mode_index] - best_adjustment
2281
0
            : MIN_THRESHMULT;
2282
0
    x->rd_threshes[best_mode_index] =
2283
0
        (cpi->rd_baseline_thresh[best_mode_index] >> 7) *
2284
0
        x->rd_thresh_mult[best_mode_index];
2285
0
  }
2286
2287
0
#if CONFIG_TEMPORAL_DENOISING
2288
0
  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
0
#endif
2335
2336
0
  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
0
  x->e_mbd.mode_info_context->mbmi = best_mode.mbmode;
2351
2352
0
  if (best_mode.mbmode.mode == B_PRED) {
2353
0
    for (i = 0; i < 16; ++i) {
2354
0
      xd->mode_info_context->bmi[i].as_mode = best_mode.bmodes[i].as_mode;
2355
0
    }
2356
0
  }
2357
2358
0
  if (best_mode.mbmode.mode == SPLITMV) {
2359
0
    for (i = 0; i < 16; ++i) {
2360
0
      xd->mode_info_context->bmi[i].mv.as_int = best_mode.bmodes[i].mv.as_int;
2361
0
    }
2362
2363
0
    *x->partition_info = best_mode.partition;
2364
2365
0
    x->e_mbd.mode_info_context->mbmi.mv.as_int =
2366
0
        x->partition_info->bmi[15].mv.as_int;
2367
0
  }
2368
2369
0
  if (sign_bias !=
2370
0
      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
0
  rd_update_mvcount(x, &best_ref_mv);
2375
0
}
2376
2377
0
void vp8_rd_pick_intra_mode(MACROBLOCK *x, int *rate) {
2378
0
  int error4x4, error16x16;
2379
0
  int rate4x4, rate16x16 = 0, rateuv;
2380
0
  int dist4x4, dist16x16, distuv;
2381
0
  int rate_;
2382
0
  int rate4x4_tokenonly = 0;
2383
0
  int rate16x16_tokenonly = 0;
2384
0
  int rateuv_tokenonly = 0;
2385
2386
0
  x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME;
2387
2388
0
  rd_pick_intra_mbuv_mode(x, &rateuv, &rateuv_tokenonly, &distuv);
2389
0
  rate_ = rateuv;
2390
2391
0
  error16x16 = rd_pick_intra16x16mby_mode(x, &rate16x16, &rate16x16_tokenonly,
2392
0
                                          &dist16x16);
2393
2394
0
  error4x4 = rd_pick_intra4x4mby_modes(x, &rate4x4, &rate4x4_tokenonly,
2395
0
                                       &dist4x4, error16x16);
2396
2397
0
  if (error4x4 < error16x16) {
2398
0
    x->e_mbd.mode_info_context->mbmi.mode = B_PRED;
2399
0
    rate_ += rate4x4;
2400
0
  } else {
2401
0
    rate_ += rate16x16;
2402
0
  }
2403
2404
0
  *rate = rate_;
2405
0
}