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