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 <limits.h>
13 #include "vpx_config.h"
14 #include "./vpx_dsp_rtcd.h"
15 #include "onyx_int.h"
16 #include "modecosts.h"
17 #include "encodeintra.h"
18 #include "vp8/common/common.h"
19 #include "vp8/common/entropymode.h"
20 #include "pickinter.h"
21 #include "vp8/common/findnearmv.h"
22 #include "encodemb.h"
23 #include "vp8/common/reconinter.h"
24 #include "vp8/common/reconintra.h"
25 #include "vp8/common/reconintra4x4.h"
26 #include "vpx_dsp/variance.h"
27 #include "mcomp.h"
28 #include "vp8/common/vp8_skin_detection.h"
29 #include "rdopt.h"
30 #include "vpx_dsp/vpx_dsp_common.h"
31 #include "vpx_mem/vpx_mem.h"
32 #if CONFIG_TEMPORAL_DENOISING
33 #include "denoising.h"
34 #endif
35 
36 #ifdef SPEEDSTATS
37 extern unsigned int cnt_pm;
38 #endif
39 
40 extern const int vp8_ref_frame_order[MAX_MODES];
41 extern const MB_PREDICTION_MODE vp8_mode_order[MAX_MODES];
42 
macroblock_corner_grad(unsigned char * signal,int stride,int offsetx,int offsety,int sgnx,int sgny)43 static int macroblock_corner_grad(unsigned char *signal, int stride,
44                                   int offsetx, int offsety, int sgnx,
45                                   int sgny) {
46   int y1 = signal[offsetx * stride + offsety];
47   int y2 = signal[offsetx * stride + offsety + sgny];
48   int y3 = signal[(offsetx + sgnx) * stride + offsety];
49   int y4 = signal[(offsetx + sgnx) * stride + offsety + sgny];
50   return VPXMAX(VPXMAX(abs(y1 - y2), abs(y1 - y3)), abs(y1 - y4));
51 }
52 
check_dot_artifact_candidate(VP8_COMP * cpi,MACROBLOCK * x,unsigned char * target_last,int stride,unsigned char * last_ref,int mb_row,int mb_col,int channel)53 static int check_dot_artifact_candidate(VP8_COMP *cpi, MACROBLOCK *x,
54                                         unsigned char *target_last, int stride,
55                                         unsigned char *last_ref, int mb_row,
56                                         int mb_col, int channel) {
57   int threshold1 = 6;
58   int threshold2 = 3;
59   unsigned int max_num = (cpi->common.MBs) / 10;
60   int grad_last = 0;
61   int grad_source = 0;
62   int index = mb_row * cpi->common.mb_cols + mb_col;
63   // Threshold for #consecutive (base layer) frames using zero_last mode.
64   int num_frames = 30;
65   int shift = 15;
66   if (channel > 0) {
67     shift = 7;
68   }
69   if (cpi->oxcf.number_of_layers > 1) {
70     num_frames = 20;
71   }
72   x->zero_last_dot_suppress = 0;
73   // Blocks on base layer frames that have been using ZEROMV_LAST repeatedly
74   // (i.e, at least |x| consecutive frames are candidates for increasing the
75   // rd adjustment for zero_last mode.
76   // Only allow this for at most |max_num| blocks per frame.
77   // Don't allow this for screen content input.
78   if (cpi->current_layer == 0 &&
79       cpi->consec_zero_last_mvbias[index] > num_frames &&
80       x->mbs_zero_last_dot_suppress < max_num &&
81       !cpi->oxcf.screen_content_mode) {
82     // If this block is checked here, label it so we don't check it again until
83     // ~|x| framaes later.
84     x->zero_last_dot_suppress = 1;
85     // Dot artifact is noticeable as strong gradient at corners of macroblock,
86     // for flat areas. As a simple detector for now, we look for a high
87     // corner gradient on last ref, and a smaller gradient on source.
88     // Check 4 corners, return if any satisfy condition.
89     // Top-left:
90     grad_last = macroblock_corner_grad(last_ref, stride, 0, 0, 1, 1);
91     grad_source = macroblock_corner_grad(target_last, stride, 0, 0, 1, 1);
92     if (grad_last >= threshold1 && grad_source <= threshold2) {
93       x->mbs_zero_last_dot_suppress++;
94       return 1;
95     }
96     // Top-right:
97     grad_last = macroblock_corner_grad(last_ref, stride, 0, shift, 1, -1);
98     grad_source = macroblock_corner_grad(target_last, stride, 0, shift, 1, -1);
99     if (grad_last >= threshold1 && grad_source <= threshold2) {
100       x->mbs_zero_last_dot_suppress++;
101       return 1;
102     }
103     // Bottom-left:
104     grad_last = macroblock_corner_grad(last_ref, stride, shift, 0, -1, 1);
105     grad_source = macroblock_corner_grad(target_last, stride, shift, 0, -1, 1);
106     if (grad_last >= threshold1 && grad_source <= threshold2) {
107       x->mbs_zero_last_dot_suppress++;
108       return 1;
109     }
110     // Bottom-right:
111     grad_last = macroblock_corner_grad(last_ref, stride, shift, shift, -1, -1);
112     grad_source =
113         macroblock_corner_grad(target_last, stride, shift, shift, -1, -1);
114     if (grad_last >= threshold1 && grad_source <= threshold2) {
115       x->mbs_zero_last_dot_suppress++;
116       return 1;
117     }
118     return 0;
119   }
120   return 0;
121 }
122 
vp8_skip_fractional_mv_step(MACROBLOCK * mb,BLOCK * b,BLOCKD * d,int_mv * bestmv,int_mv * ref_mv,int error_per_bit,const vp8_variance_fn_ptr_t * vfp,int * mvcost[2],int * distortion,unsigned int * sse)123 int vp8_skip_fractional_mv_step(MACROBLOCK *mb, BLOCK *b, BLOCKD *d,
124                                 int_mv *bestmv, int_mv *ref_mv,
125                                 int error_per_bit,
126                                 const vp8_variance_fn_ptr_t *vfp,
127                                 int *mvcost[2], int *distortion,
128                                 unsigned int *sse) {
129   (void)b;
130   (void)d;
131   (void)ref_mv;
132   (void)error_per_bit;
133   (void)vfp;
134   (void)mb;
135   (void)mvcost;
136   (void)distortion;
137   (void)sse;
138   bestmv->as_mv.row *= 8;
139   bestmv->as_mv.col *= 8;
140   return 0;
141 }
142 
vp8_get_inter_mbpred_error(MACROBLOCK * mb,const vp8_variance_fn_ptr_t * vfp,unsigned int * sse,int_mv this_mv)143 int vp8_get_inter_mbpred_error(MACROBLOCK *mb, const vp8_variance_fn_ptr_t *vfp,
144                                unsigned int *sse, int_mv this_mv) {
145   BLOCK *b = &mb->block[0];
146   BLOCKD *d = &mb->e_mbd.block[0];
147   unsigned char *what = (*(b->base_src) + b->src);
148   int what_stride = b->src_stride;
149   int pre_stride = mb->e_mbd.pre.y_stride;
150   unsigned char *in_what = mb->e_mbd.pre.y_buffer + d->offset;
151   int in_what_stride = pre_stride;
152   int xoffset = this_mv.as_mv.col & 7;
153   int yoffset = this_mv.as_mv.row & 7;
154 
155   in_what += (this_mv.as_mv.row >> 3) * pre_stride + (this_mv.as_mv.col >> 3);
156 
157   if (xoffset | yoffset) {
158     return vfp->svf(in_what, in_what_stride, xoffset, yoffset, what,
159                     what_stride, sse);
160   } else {
161     return vfp->vf(what, what_stride, in_what, in_what_stride, sse);
162   }
163 }
164 
get_prediction_error(BLOCK * be,BLOCKD * b)165 static int get_prediction_error(BLOCK *be, BLOCKD *b) {
166   unsigned char *sptr;
167   unsigned char *dptr;
168   sptr = (*(be->base_src) + be->src);
169   dptr = b->predictor;
170 
171   return vpx_get4x4sse_cs(sptr, be->src_stride, dptr, 16);
172 }
173 
pick_intra4x4block(MACROBLOCK * x,int ib,B_PREDICTION_MODE * best_mode,const int * mode_costs,int * bestrate,int * bestdistortion)174 static int pick_intra4x4block(MACROBLOCK *x, int ib,
175                               B_PREDICTION_MODE *best_mode,
176                               const int *mode_costs, int *bestrate,
177                               int *bestdistortion) {
178   BLOCKD *b = &x->e_mbd.block[ib];
179   BLOCK *be = &x->block[ib];
180   int dst_stride = x->e_mbd.dst.y_stride;
181   unsigned char *dst = x->e_mbd.dst.y_buffer + b->offset;
182   B_PREDICTION_MODE mode;
183   int best_rd = INT_MAX;
184   int rate;
185   int distortion;
186 
187   unsigned char *Above = dst - dst_stride;
188   unsigned char *yleft = dst - 1;
189   unsigned char top_left = Above[-1];
190 
191   for (mode = B_DC_PRED; mode <= B_HE_PRED; ++mode) {
192     int this_rd;
193 
194     rate = mode_costs[mode];
195 
196     vp8_intra4x4_predict(Above, yleft, dst_stride, mode, b->predictor, 16,
197                          top_left);
198     distortion = get_prediction_error(be, b);
199     this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion);
200 
201     if (this_rd < best_rd) {
202       *bestrate = rate;
203       *bestdistortion = distortion;
204       best_rd = this_rd;
205       *best_mode = mode;
206     }
207   }
208 
209   b->bmi.as_mode = *best_mode;
210   vp8_encode_intra4x4block(x, ib);
211   return best_rd;
212 }
213 
pick_intra4x4mby_modes(MACROBLOCK * mb,int * Rate,int * best_dist)214 static int pick_intra4x4mby_modes(MACROBLOCK *mb, int *Rate, int *best_dist) {
215   MACROBLOCKD *const xd = &mb->e_mbd;
216   int i;
217   int cost = mb->mbmode_cost[xd->frame_type][B_PRED];
218   int error;
219   int distortion = 0;
220   const int *bmode_costs;
221 
222   intra_prediction_down_copy(xd, xd->dst.y_buffer - xd->dst.y_stride + 16);
223 
224   bmode_costs = mb->inter_bmode_costs;
225 
226   for (i = 0; i < 16; ++i) {
227     MODE_INFO *const mic = xd->mode_info_context;
228     const int mis = xd->mode_info_stride;
229 
230     B_PREDICTION_MODE best_mode = B_MODE_COUNT;
231     int r = 0, d = 0;
232 
233     if (mb->e_mbd.frame_type == KEY_FRAME) {
234       const B_PREDICTION_MODE A = above_block_mode(mic, i, mis);
235       const B_PREDICTION_MODE L = left_block_mode(mic, i);
236 
237       bmode_costs = mb->bmode_costs[A][L];
238     }
239 
240     pick_intra4x4block(mb, i, &best_mode, bmode_costs, &r, &d);
241 
242     cost += r;
243     distortion += d;
244     assert(best_mode != B_MODE_COUNT);
245     mic->bmi[i].as_mode = best_mode;
246 
247     /* Break out case where we have already exceeded best so far value
248      * that was passed in
249      */
250     if (distortion > *best_dist) break;
251   }
252 
253   *Rate = cost;
254 
255   if (i == 16) {
256     *best_dist = distortion;
257     error = RDCOST(mb->rdmult, mb->rddiv, cost, distortion);
258   } else {
259     *best_dist = INT_MAX;
260     error = INT_MAX;
261   }
262 
263   return error;
264 }
265 
pick_intra_mbuv_mode(MACROBLOCK * mb)266 static void pick_intra_mbuv_mode(MACROBLOCK *mb) {
267   MACROBLOCKD *x = &mb->e_mbd;
268   unsigned char *uabove_row = x->dst.u_buffer - x->dst.uv_stride;
269   unsigned char *vabove_row = x->dst.v_buffer - x->dst.uv_stride;
270   unsigned char *usrc_ptr = (mb->block[16].src + *mb->block[16].base_src);
271   unsigned char *vsrc_ptr = (mb->block[20].src + *mb->block[20].base_src);
272   int uvsrc_stride = mb->block[16].src_stride;
273   unsigned char uleft_col[8];
274   unsigned char vleft_col[8];
275   unsigned char utop_left = uabove_row[-1];
276   unsigned char vtop_left = vabove_row[-1];
277   int i, j;
278   int expected_udc;
279   int expected_vdc;
280   int shift;
281   int Uaverage = 0;
282   int Vaverage = 0;
283   int diff;
284   int pred_error[4] = { 0, 0, 0, 0 }, best_error = INT_MAX;
285   MB_PREDICTION_MODE best_mode = MB_MODE_COUNT;
286 
287   for (i = 0; i < 8; ++i) {
288     uleft_col[i] = x->dst.u_buffer[i * x->dst.uv_stride - 1];
289     vleft_col[i] = x->dst.v_buffer[i * x->dst.uv_stride - 1];
290   }
291 
292   if (!x->up_available && !x->left_available) {
293     expected_udc = 128;
294     expected_vdc = 128;
295   } else {
296     shift = 2;
297 
298     if (x->up_available) {
299       for (i = 0; i < 8; ++i) {
300         Uaverage += uabove_row[i];
301         Vaverage += vabove_row[i];
302       }
303 
304       shift++;
305     }
306 
307     if (x->left_available) {
308       for (i = 0; i < 8; ++i) {
309         Uaverage += uleft_col[i];
310         Vaverage += vleft_col[i];
311       }
312 
313       shift++;
314     }
315 
316     expected_udc = (Uaverage + (1 << (shift - 1))) >> shift;
317     expected_vdc = (Vaverage + (1 << (shift - 1))) >> shift;
318   }
319 
320   for (i = 0; i < 8; ++i) {
321     for (j = 0; j < 8; ++j) {
322       int predu = uleft_col[i] + uabove_row[j] - utop_left;
323       int predv = vleft_col[i] + vabove_row[j] - vtop_left;
324       int u_p, v_p;
325 
326       u_p = usrc_ptr[j];
327       v_p = vsrc_ptr[j];
328 
329       if (predu < 0) predu = 0;
330 
331       if (predu > 255) predu = 255;
332 
333       if (predv < 0) predv = 0;
334 
335       if (predv > 255) predv = 255;
336 
337       diff = u_p - expected_udc;
338       pred_error[DC_PRED] += diff * diff;
339       diff = v_p - expected_vdc;
340       pred_error[DC_PRED] += diff * diff;
341 
342       diff = u_p - uabove_row[j];
343       pred_error[V_PRED] += diff * diff;
344       diff = v_p - vabove_row[j];
345       pred_error[V_PRED] += diff * diff;
346 
347       diff = u_p - uleft_col[i];
348       pred_error[H_PRED] += diff * diff;
349       diff = v_p - vleft_col[i];
350       pred_error[H_PRED] += diff * diff;
351 
352       diff = u_p - predu;
353       pred_error[TM_PRED] += diff * diff;
354       diff = v_p - predv;
355       pred_error[TM_PRED] += diff * diff;
356     }
357 
358     usrc_ptr += uvsrc_stride;
359     vsrc_ptr += uvsrc_stride;
360 
361     if (i == 3) {
362       usrc_ptr = (mb->block[18].src + *mb->block[18].base_src);
363       vsrc_ptr = (mb->block[22].src + *mb->block[22].base_src);
364     }
365   }
366 
367   for (i = DC_PRED; i <= TM_PRED; ++i) {
368     if (best_error > pred_error[i]) {
369       best_error = pred_error[i];
370       best_mode = (MB_PREDICTION_MODE)i;
371     }
372   }
373 
374   assert(best_mode != MB_MODE_COUNT);
375   mb->e_mbd.mode_info_context->mbmi.uv_mode = best_mode;
376 }
377 
update_mvcount(MACROBLOCK * x,int_mv * best_ref_mv)378 static void update_mvcount(MACROBLOCK *x, int_mv *best_ref_mv) {
379   MACROBLOCKD *xd = &x->e_mbd;
380   /* Split MV modes currently not supported when RD is nopt enabled,
381    * therefore, only need to modify MVcount in NEWMV mode. */
382   if (xd->mode_info_context->mbmi.mode == NEWMV) {
383     x->MVcount[0][mv_max + ((xd->mode_info_context->mbmi.mv.as_mv.row -
384                              best_ref_mv->as_mv.row) >>
385                             1)]++;
386     x->MVcount[1][mv_max + ((xd->mode_info_context->mbmi.mv.as_mv.col -
387                              best_ref_mv->as_mv.col) >>
388                             1)]++;
389   }
390 }
391 
392 #if CONFIG_MULTI_RES_ENCODING
get_lower_res_motion_info(VP8_COMP * cpi,MACROBLOCKD * xd,int * dissim,int * parent_ref_frame,MB_PREDICTION_MODE * parent_mode,int_mv * parent_ref_mv,int mb_row,int mb_col)393 static void get_lower_res_motion_info(VP8_COMP *cpi, MACROBLOCKD *xd,
394                                       int *dissim, int *parent_ref_frame,
395                                       MB_PREDICTION_MODE *parent_mode,
396                                       int_mv *parent_ref_mv, int mb_row,
397                                       int mb_col) {
398   LOWER_RES_MB_INFO *store_mode_info =
399       ((LOWER_RES_FRAME_INFO *)cpi->oxcf.mr_low_res_mode_info)->mb_info;
400   unsigned int parent_mb_index;
401 
402   /* Consider different down_sampling_factor.  */
403   {
404     /* TODO: Removed the loop that supports special down_sampling_factor
405      * such as 2, 4, 8. Will revisit it if needed.
406      * Should also try using a look-up table to see if it helps
407      * performance. */
408     int parent_mb_row, parent_mb_col;
409 
410     parent_mb_row = mb_row * cpi->oxcf.mr_down_sampling_factor.den /
411                     cpi->oxcf.mr_down_sampling_factor.num;
412     parent_mb_col = mb_col * cpi->oxcf.mr_down_sampling_factor.den /
413                     cpi->oxcf.mr_down_sampling_factor.num;
414     parent_mb_index = parent_mb_row * cpi->mr_low_res_mb_cols + parent_mb_col;
415   }
416 
417   /* Read lower-resolution mode & motion result from memory.*/
418   *parent_ref_frame = store_mode_info[parent_mb_index].ref_frame;
419   *parent_mode = store_mode_info[parent_mb_index].mode;
420   *dissim = store_mode_info[parent_mb_index].dissim;
421 
422   /* For highest-resolution encoder, adjust dissim value. Lower its quality
423    * for good performance. */
424   if (cpi->oxcf.mr_encoder_id == (cpi->oxcf.mr_total_resolutions - 1))
425     *dissim >>= 1;
426 
427   if (*parent_ref_frame != INTRA_FRAME) {
428     /* Consider different down_sampling_factor.
429      * The result can be rounded to be more precise, but it takes more time.
430      */
431     (*parent_ref_mv).as_mv.row = store_mode_info[parent_mb_index].mv.as_mv.row *
432                                  cpi->oxcf.mr_down_sampling_factor.num /
433                                  cpi->oxcf.mr_down_sampling_factor.den;
434     (*parent_ref_mv).as_mv.col = store_mode_info[parent_mb_index].mv.as_mv.col *
435                                  cpi->oxcf.mr_down_sampling_factor.num /
436                                  cpi->oxcf.mr_down_sampling_factor.den;
437 
438     vp8_clamp_mv2(parent_ref_mv, xd);
439   }
440 }
441 #endif
442 
check_for_encode_breakout(unsigned int sse,MACROBLOCK * x)443 static void check_for_encode_breakout(unsigned int sse, MACROBLOCK *x) {
444   MACROBLOCKD *xd = &x->e_mbd;
445 
446   unsigned int threshold =
447       (xd->block[0].dequant[1] * xd->block[0].dequant[1] >> 4);
448 
449   if (threshold < x->encode_breakout) threshold = x->encode_breakout;
450 
451   if (sse < threshold) {
452     /* Check u and v to make sure skip is ok */
453     unsigned int sse2 = 0;
454 
455     sse2 = VP8_UVSSE(x);
456 
457     if (sse2 * 2 < x->encode_breakout) {
458       x->skip = 1;
459     } else {
460       x->skip = 0;
461     }
462   }
463 }
464 
evaluate_inter_mode(unsigned int * sse,int rate2,int * distortion2,VP8_COMP * cpi,MACROBLOCK * x,int rd_adj)465 static int evaluate_inter_mode(unsigned int *sse, int rate2, int *distortion2,
466                                VP8_COMP *cpi, MACROBLOCK *x, int rd_adj) {
467   MB_PREDICTION_MODE this_mode = x->e_mbd.mode_info_context->mbmi.mode;
468   int_mv mv = x->e_mbd.mode_info_context->mbmi.mv;
469   int this_rd;
470   int denoise_aggressive = 0;
471   /* Exit early and don't compute the distortion if this macroblock
472    * is marked inactive. */
473   if (cpi->active_map_enabled && x->active_ptr[0] == 0) {
474     *sse = 0;
475     *distortion2 = 0;
476     x->skip = 1;
477     return INT_MAX;
478   }
479 
480   if ((this_mode != NEWMV) || !(cpi->sf.half_pixel_search) ||
481       cpi->common.full_pixel == 1) {
482     *distortion2 =
483         vp8_get_inter_mbpred_error(x, &cpi->fn_ptr[BLOCK_16X16], sse, mv);
484   }
485 
486   this_rd = RDCOST(x->rdmult, x->rddiv, rate2, *distortion2);
487 
488 #if CONFIG_TEMPORAL_DENOISING
489   if (cpi->oxcf.noise_sensitivity > 0) {
490     denoise_aggressive =
491         (cpi->denoiser.denoiser_mode == kDenoiserOnYUVAggressive) ? 1 : 0;
492   }
493 #endif
494 
495   // Adjust rd for ZEROMV and LAST, if LAST is the closest reference frame.
496   // TODO: We should also add condition on distance of closest to current.
497   if (!cpi->oxcf.screen_content_mode && this_mode == ZEROMV &&
498       x->e_mbd.mode_info_context->mbmi.ref_frame == LAST_FRAME &&
499       (denoise_aggressive || (cpi->closest_reference_frame == LAST_FRAME))) {
500     // No adjustment if block is considered to be skin area.
501     if (x->is_skin) rd_adj = 100;
502 
503     this_rd = (int)(((int64_t)this_rd) * rd_adj / 100);
504   }
505 
506   check_for_encode_breakout(*sse, x);
507   return this_rd;
508 }
509 
calculate_zeromv_rd_adjustment(VP8_COMP * cpi,MACROBLOCK * x,int * rd_adjustment)510 static void calculate_zeromv_rd_adjustment(VP8_COMP *cpi, MACROBLOCK *x,
511                                            int *rd_adjustment) {
512   MODE_INFO *mic = x->e_mbd.mode_info_context;
513   int_mv mv_l, mv_a, mv_al;
514   int local_motion_check = 0;
515 
516   if (cpi->lf_zeromv_pct > 40) {
517     /* left mb */
518     mic -= 1;
519     mv_l = mic->mbmi.mv;
520 
521     if (mic->mbmi.ref_frame != INTRA_FRAME) {
522       if (abs(mv_l.as_mv.row) < 8 && abs(mv_l.as_mv.col) < 8) {
523         local_motion_check++;
524       }
525     }
526 
527     /* above-left mb */
528     mic -= x->e_mbd.mode_info_stride;
529     mv_al = mic->mbmi.mv;
530 
531     if (mic->mbmi.ref_frame != INTRA_FRAME) {
532       if (abs(mv_al.as_mv.row) < 8 && abs(mv_al.as_mv.col) < 8) {
533         local_motion_check++;
534       }
535     }
536 
537     /* above mb */
538     mic += 1;
539     mv_a = mic->mbmi.mv;
540 
541     if (mic->mbmi.ref_frame != INTRA_FRAME) {
542       if (abs(mv_a.as_mv.row) < 8 && abs(mv_a.as_mv.col) < 8) {
543         local_motion_check++;
544       }
545     }
546 
547     if (((!x->e_mbd.mb_to_top_edge || !x->e_mbd.mb_to_left_edge) &&
548          local_motion_check > 0) ||
549         local_motion_check > 2) {
550       *rd_adjustment = 80;
551     } else if (local_motion_check > 0) {
552       *rd_adjustment = 90;
553     }
554   }
555 }
556 
vp8_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)557 void vp8_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset,
558                          int recon_uvoffset, int *returnrate,
559                          int *returndistortion, int *returnintra, int mb_row,
560                          int mb_col) {
561   BLOCK *b = &x->block[0];
562   BLOCKD *d = &x->e_mbd.block[0];
563   MACROBLOCKD *xd = &x->e_mbd;
564   MB_MODE_INFO best_mbmode;
565 
566   int_mv best_ref_mv_sb[2] = { { 0 }, { 0 } };
567   int_mv mode_mv_sb[2][MB_MODE_COUNT];
568   int_mv best_ref_mv;
569   int_mv *mode_mv;
570   MB_PREDICTION_MODE this_mode;
571   int num00;
572   int mdcounts[4];
573   int best_rd = INT_MAX;
574   int rd_adjustment = 100;
575   int best_intra_rd = INT_MAX;
576   int mode_index;
577   int rate;
578   int rate2;
579   int distortion2;
580   int bestsme = INT_MAX;
581   int best_mode_index = 0;
582   unsigned int sse = UINT_MAX, best_rd_sse = UINT_MAX;
583 #if CONFIG_TEMPORAL_DENOISING
584   unsigned int zero_mv_sse = UINT_MAX, best_sse = UINT_MAX;
585 #endif
586 
587   int sf_improved_mv_pred = cpi->sf.improved_mv_pred;
588 
589 #if CONFIG_MULTI_RES_ENCODING
590   int dissim = INT_MAX;
591   int parent_ref_frame = 0;
592   int_mv parent_ref_mv;
593   MB_PREDICTION_MODE parent_mode = 0;
594   int parent_ref_valid = 0;
595 #endif
596 
597   int_mv mvp;
598 
599   int near_sadidx[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
600   int saddone = 0;
601   /* search range got from mv_pred(). It uses step_param levels. (0-7) */
602   int sr = 0;
603 
604   unsigned char *plane[4][3] = { { 0, 0 } };
605   int ref_frame_map[4];
606   int sign_bias = 0;
607   int dot_artifact_candidate = 0;
608   get_predictor_pointers(cpi, plane, recon_yoffset, recon_uvoffset);
609 
610   // If the current frame is using LAST as a reference, check for
611   // biasing the mode selection for dot artifacts.
612   if (cpi->ref_frame_flags & VP8_LAST_FRAME) {
613     unsigned char *target_y = x->src.y_buffer;
614     unsigned char *target_u = x->block[16].src + *x->block[16].base_src;
615     unsigned char *target_v = x->block[20].src + *x->block[20].base_src;
616     int stride = x->src.y_stride;
617     int stride_uv = x->block[16].src_stride;
618 #if CONFIG_TEMPORAL_DENOISING
619     if (cpi->oxcf.noise_sensitivity) {
620       const int uv_denoise = (cpi->oxcf.noise_sensitivity >= 2) ? 1 : 0;
621       target_y =
622           cpi->denoiser.yv12_running_avg[LAST_FRAME].y_buffer + recon_yoffset;
623       stride = cpi->denoiser.yv12_running_avg[LAST_FRAME].y_stride;
624       if (uv_denoise) {
625         target_u = cpi->denoiser.yv12_running_avg[LAST_FRAME].u_buffer +
626                    recon_uvoffset;
627         target_v = cpi->denoiser.yv12_running_avg[LAST_FRAME].v_buffer +
628                    recon_uvoffset;
629         stride_uv = cpi->denoiser.yv12_running_avg[LAST_FRAME].uv_stride;
630       }
631     }
632 #endif
633     assert(plane[LAST_FRAME][0] != NULL);
634     dot_artifact_candidate = check_dot_artifact_candidate(
635         cpi, x, target_y, stride, plane[LAST_FRAME][0], mb_row, mb_col, 0);
636     // If not found in Y channel, check UV channel.
637     if (!dot_artifact_candidate) {
638       assert(plane[LAST_FRAME][1] != NULL);
639       dot_artifact_candidate = check_dot_artifact_candidate(
640           cpi, x, target_u, stride_uv, plane[LAST_FRAME][1], mb_row, mb_col, 1);
641       if (!dot_artifact_candidate) {
642         assert(plane[LAST_FRAME][2] != NULL);
643         dot_artifact_candidate = check_dot_artifact_candidate(
644             cpi, x, target_v, stride_uv, plane[LAST_FRAME][2], mb_row, mb_col,
645             2);
646       }
647     }
648   }
649 
650 #if CONFIG_MULTI_RES_ENCODING
651   // |parent_ref_valid| will be set here if potentially we can do mv resue for
652   // this higher resol (|cpi->oxcf.mr_encoder_id| > 0) frame.
653   // |parent_ref_valid| may be reset depending on |parent_ref_frame| for
654   // the current macroblock below.
655   parent_ref_valid = cpi->oxcf.mr_encoder_id && cpi->mr_low_res_mv_avail;
656   if (parent_ref_valid) {
657     int parent_ref_flag;
658 
659     get_lower_res_motion_info(cpi, xd, &dissim, &parent_ref_frame, &parent_mode,
660                               &parent_ref_mv, mb_row, mb_col);
661 
662     /* TODO(jkoleszar): The references available (ref_frame_flags) to the
663      * lower res encoder should match those available to this encoder, but
664      * there seems to be a situation where this mismatch can happen in the
665      * case of frame dropping and temporal layers. For example,
666      * GOLD being disallowed in ref_frame_flags, but being returned as
667      * parent_ref_frame.
668      *
669      * In this event, take the conservative approach of disabling the
670      * lower res info for this MB.
671      */
672 
673     parent_ref_flag = 0;
674     // Note availability for mv reuse is only based on last and golden.
675     if (parent_ref_frame == LAST_FRAME)
676       parent_ref_flag = (cpi->ref_frame_flags & VP8_LAST_FRAME);
677     else if (parent_ref_frame == GOLDEN_FRAME)
678       parent_ref_flag = (cpi->ref_frame_flags & VP8_GOLD_FRAME);
679 
680     // assert(!parent_ref_frame || parent_ref_flag);
681 
682     // If |parent_ref_frame| did not match either last or golden then
683     // shut off mv reuse.
684     if (parent_ref_frame && !parent_ref_flag) parent_ref_valid = 0;
685 
686     // Don't do mv reuse since we want to allow for another mode besides
687     // ZEROMV_LAST to remove dot artifact.
688     if (dot_artifact_candidate) parent_ref_valid = 0;
689   }
690 #endif
691 
692   // Check if current macroblock is in skin area.
693   x->is_skin = 0;
694   if (!cpi->oxcf.screen_content_mode) {
695     int block_index = mb_row * cpi->common.mb_cols + mb_col;
696     x->is_skin = cpi->skin_map[block_index];
697   }
698 #if CONFIG_TEMPORAL_DENOISING
699   if (cpi->oxcf.noise_sensitivity) {
700     // Under aggressive denoising mode, should we use skin map to reduce
701     // denoiser
702     // and ZEROMV bias? Will need to revisit the accuracy of this detection for
703     // very noisy input. For now keep this as is (i.e., don't turn it off).
704     // if (cpi->denoiser.denoiser_mode == kDenoiserOnYUVAggressive)
705     //   x->is_skin = 0;
706   }
707 #endif
708 
709   mode_mv = mode_mv_sb[sign_bias];
710   best_ref_mv.as_int = 0;
711   memset(mode_mv_sb, 0, sizeof(mode_mv_sb));
712   memset(&best_mbmode, 0, sizeof(best_mbmode));
713 
714 /* Setup search priorities */
715 #if CONFIG_MULTI_RES_ENCODING
716   if (parent_ref_valid && parent_ref_frame && dissim < 8) {
717     ref_frame_map[0] = -1;
718     ref_frame_map[1] = parent_ref_frame;
719     ref_frame_map[2] = -1;
720     ref_frame_map[3] = -1;
721   } else
722 #endif
723     get_reference_search_order(cpi, ref_frame_map);
724 
725   /* Check to see if there is at least 1 valid reference frame that we need
726    * to calculate near_mvs.
727    */
728   if (ref_frame_map[1] > 0) {
729     sign_bias = vp8_find_near_mvs_bias(
730         &x->e_mbd, x->e_mbd.mode_info_context, mode_mv_sb, best_ref_mv_sb,
731         mdcounts, ref_frame_map[1], cpi->common.ref_frame_sign_bias);
732 
733     mode_mv = mode_mv_sb[sign_bias];
734     best_ref_mv.as_int = best_ref_mv_sb[sign_bias].as_int;
735   }
736 
737   /* Count of the number of MBs tested so far this frame */
738   x->mbs_tested_so_far++;
739 
740   *returnintra = INT_MAX;
741   x->skip = 0;
742 
743   x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME;
744 
745   /* If the frame has big static background and current MB is in low
746    *  motion area, its mode decision is biased to ZEROMV mode.
747    *  No adjustment if cpu_used is <= -12 (i.e., cpi->Speed >= 12).
748    *  At such speed settings, ZEROMV is already heavily favored.
749    */
750   if (cpi->Speed < 12) {
751     calculate_zeromv_rd_adjustment(cpi, x, &rd_adjustment);
752   }
753 
754 #if CONFIG_TEMPORAL_DENOISING
755   if (cpi->oxcf.noise_sensitivity) {
756     rd_adjustment = (int)(rd_adjustment *
757                           cpi->denoiser.denoise_pars.pickmode_mv_bias / 100);
758   }
759 #endif
760 
761   if (dot_artifact_candidate) {
762     // Bias against ZEROMV_LAST mode.
763     rd_adjustment = 150;
764   }
765 
766   /* if we encode a new mv this is important
767    * find the best new motion vector
768    */
769   for (mode_index = 0; mode_index < MAX_MODES; ++mode_index) {
770     int frame_cost;
771     int this_rd = INT_MAX;
772     int this_ref_frame = ref_frame_map[vp8_ref_frame_order[mode_index]];
773 
774     if (best_rd <= x->rd_threshes[mode_index]) continue;
775 
776     if (this_ref_frame < 0) continue;
777 
778     x->e_mbd.mode_info_context->mbmi.ref_frame = this_ref_frame;
779 
780     /* everything but intra */
781     if (x->e_mbd.mode_info_context->mbmi.ref_frame) {
782       x->e_mbd.pre.y_buffer = plane[this_ref_frame][0];
783       x->e_mbd.pre.u_buffer = plane[this_ref_frame][1];
784       x->e_mbd.pre.v_buffer = plane[this_ref_frame][2];
785 
786       if (sign_bias != cpi->common.ref_frame_sign_bias[this_ref_frame]) {
787         sign_bias = cpi->common.ref_frame_sign_bias[this_ref_frame];
788         mode_mv = mode_mv_sb[sign_bias];
789         best_ref_mv.as_int = best_ref_mv_sb[sign_bias].as_int;
790       }
791 
792 #if CONFIG_MULTI_RES_ENCODING
793       if (parent_ref_valid) {
794         if (vp8_mode_order[mode_index] == NEARESTMV &&
795             mode_mv[NEARESTMV].as_int == 0)
796           continue;
797         if (vp8_mode_order[mode_index] == NEARMV && mode_mv[NEARMV].as_int == 0)
798           continue;
799 
800         if (vp8_mode_order[mode_index] == NEWMV && parent_mode == ZEROMV &&
801             best_ref_mv.as_int == 0)
802           continue;
803         else if (vp8_mode_order[mode_index] == NEWMV && dissim == 0 &&
804                  best_ref_mv.as_int == parent_ref_mv.as_int)
805           continue;
806       }
807 #endif
808     }
809 
810     /* Check to see if the testing frequency for this mode is at its max
811      * If so then prevent it from being tested and increase the threshold
812      * for its testing */
813     if (x->mode_test_hit_counts[mode_index] &&
814         (cpi->mode_check_freq[mode_index] > 1)) {
815       if (x->mbs_tested_so_far <= (cpi->mode_check_freq[mode_index] *
816                                    x->mode_test_hit_counts[mode_index])) {
817         /* Increase the threshold for coding this mode to make it less
818          * likely to be chosen */
819         x->rd_thresh_mult[mode_index] += 4;
820 
821         if (x->rd_thresh_mult[mode_index] > MAX_THRESHMULT) {
822           x->rd_thresh_mult[mode_index] = MAX_THRESHMULT;
823         }
824 
825         x->rd_threshes[mode_index] =
826             (cpi->rd_baseline_thresh[mode_index] >> 7) *
827             x->rd_thresh_mult[mode_index];
828         continue;
829       }
830     }
831 
832     /* We have now reached the point where we are going to test the current
833      * mode so increment the counter for the number of times it has been
834      * tested */
835     x->mode_test_hit_counts[mode_index]++;
836 
837     rate2 = 0;
838     distortion2 = 0;
839 
840     this_mode = vp8_mode_order[mode_index];
841 
842     x->e_mbd.mode_info_context->mbmi.mode = this_mode;
843     x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED;
844 
845     /* Work out the cost assosciated with selecting the reference frame */
846     frame_cost = x->ref_frame_cost[x->e_mbd.mode_info_context->mbmi.ref_frame];
847     rate2 += frame_cost;
848 
849     /* Only consider ZEROMV/ALTREF_FRAME for alt ref frame,
850      * unless ARNR filtering is enabled in which case we want
851      * an unfiltered alternative */
852     if (cpi->is_src_frame_alt_ref && (cpi->oxcf.arnr_max_frames == 0)) {
853       if (this_mode != ZEROMV ||
854           x->e_mbd.mode_info_context->mbmi.ref_frame != ALTREF_FRAME) {
855         continue;
856       }
857     }
858 
859     switch (this_mode) {
860       case B_PRED:
861         /* Pass best so far to pick_intra4x4mby_modes to use as breakout */
862         distortion2 = best_rd_sse;
863         pick_intra4x4mby_modes(x, &rate, &distortion2);
864 
865         if (distortion2 == INT_MAX) {
866           this_rd = INT_MAX;
867         } else {
868           rate2 += rate;
869           distortion2 = vpx_variance16x16(*(b->base_src), b->src_stride,
870                                           x->e_mbd.predictor, 16, &sse);
871           this_rd = RDCOST(x->rdmult, x->rddiv, rate2, distortion2);
872 
873           if (this_rd < best_intra_rd) {
874             best_intra_rd = this_rd;
875             *returnintra = distortion2;
876           }
877         }
878 
879         break;
880 
881       case SPLITMV:
882 
883         /* Split MV modes currently not supported when RD is not enabled. */
884         break;
885 
886       case DC_PRED:
887       case V_PRED:
888       case H_PRED:
889       case TM_PRED:
890         vp8_build_intra_predictors_mby_s(
891             xd, xd->dst.y_buffer - xd->dst.y_stride, xd->dst.y_buffer - 1,
892             xd->dst.y_stride, xd->predictor, 16);
893         distortion2 = vpx_variance16x16(*(b->base_src), b->src_stride,
894                                         x->e_mbd.predictor, 16, &sse);
895         rate2 += x->mbmode_cost[x->e_mbd.frame_type]
896                                [x->e_mbd.mode_info_context->mbmi.mode];
897         this_rd = RDCOST(x->rdmult, x->rddiv, rate2, distortion2);
898 
899         if (this_rd < best_intra_rd) {
900           best_intra_rd = this_rd;
901           *returnintra = distortion2;
902         }
903         break;
904 
905       case NEWMV: {
906         int thissme;
907         int step_param;
908         int further_steps;
909         int n = 0;
910         int sadpb = x->sadperbit16;
911         int_mv mvp_full;
912 
913         int col_min = ((best_ref_mv.as_mv.col + 7) >> 3) - MAX_FULL_PEL_VAL;
914         int row_min = ((best_ref_mv.as_mv.row + 7) >> 3) - MAX_FULL_PEL_VAL;
915         int col_max = (best_ref_mv.as_mv.col >> 3) + MAX_FULL_PEL_VAL;
916         int row_max = (best_ref_mv.as_mv.row >> 3) + MAX_FULL_PEL_VAL;
917 
918         int tmp_col_min = x->mv_col_min;
919         int tmp_col_max = x->mv_col_max;
920         int tmp_row_min = x->mv_row_min;
921         int tmp_row_max = x->mv_row_max;
922 
923         int speed_adjust = (cpi->Speed > 5) ? ((cpi->Speed >= 8) ? 3 : 2) : 1;
924 
925         /* Further step/diamond searches as necessary */
926         step_param = cpi->sf.first_step + speed_adjust;
927 
928 #if CONFIG_MULTI_RES_ENCODING
929         /* If lower-res frame is not available for mv reuse (because of
930            frame dropping or different temporal layer pattern), then higher
931            resol encoder does motion search without any previous knowledge.
932            Also, since last frame motion info is not stored, then we can not
933            use improved_mv_pred. */
934         if (cpi->oxcf.mr_encoder_id) sf_improved_mv_pred = 0;
935 
936         // Only use parent MV as predictor if this candidate reference frame
937         // (|this_ref_frame|) is equal to |parent_ref_frame|.
938         if (parent_ref_valid && (parent_ref_frame == this_ref_frame)) {
939           /* Use parent MV as predictor. Adjust search range
940            * accordingly.
941            */
942           mvp.as_int = parent_ref_mv.as_int;
943           mvp_full.as_mv.col = parent_ref_mv.as_mv.col >> 3;
944           mvp_full.as_mv.row = parent_ref_mv.as_mv.row >> 3;
945 
946           if (dissim <= 32)
947             step_param += 3;
948           else if (dissim <= 128)
949             step_param += 2;
950           else
951             step_param += 1;
952         } else
953 #endif
954         {
955           if (sf_improved_mv_pred) {
956             if (!saddone) {
957               vp8_cal_sad(cpi, xd, x, recon_yoffset, &near_sadidx[0]);
958               saddone = 1;
959             }
960 
961             vp8_mv_pred(cpi, &x->e_mbd, x->e_mbd.mode_info_context, &mvp,
962                         x->e_mbd.mode_info_context->mbmi.ref_frame,
963                         cpi->common.ref_frame_sign_bias, &sr, &near_sadidx[0]);
964 
965             sr += speed_adjust;
966             /* adjust search range according to sr from mv prediction */
967             if (sr > step_param) step_param = sr;
968 
969             mvp_full.as_mv.col = mvp.as_mv.col >> 3;
970             mvp_full.as_mv.row = mvp.as_mv.row >> 3;
971           } else {
972             mvp.as_int = best_ref_mv.as_int;
973             mvp_full.as_mv.col = best_ref_mv.as_mv.col >> 3;
974             mvp_full.as_mv.row = best_ref_mv.as_mv.row >> 3;
975           }
976         }
977 
978 #if CONFIG_MULTI_RES_ENCODING
979         if (parent_ref_valid && (parent_ref_frame == this_ref_frame) &&
980             dissim <= 2 &&
981             VPXMAX(abs(best_ref_mv.as_mv.row - parent_ref_mv.as_mv.row),
982                    abs(best_ref_mv.as_mv.col - parent_ref_mv.as_mv.col)) <= 4) {
983           d->bmi.mv.as_int = mvp_full.as_int;
984           mode_mv[NEWMV].as_int = mvp_full.as_int;
985 
986           cpi->find_fractional_mv_step(
987               x, b, d, &d->bmi.mv, &best_ref_mv, x->errorperbit,
988               &cpi->fn_ptr[BLOCK_16X16], cpi->mb.mvcost, &distortion2, &sse);
989         } else
990 #endif
991         {
992           /* Get intersection of UMV window and valid MV window to
993            * reduce # of checks in diamond search. */
994           if (x->mv_col_min < col_min) x->mv_col_min = col_min;
995           if (x->mv_col_max > col_max) x->mv_col_max = col_max;
996           if (x->mv_row_min < row_min) x->mv_row_min = row_min;
997           if (x->mv_row_max > row_max) x->mv_row_max = row_max;
998 
999           further_steps =
1000               (cpi->Speed >= 8)
1001                   ? 0
1002                   : (cpi->sf.max_step_search_steps - 1 - step_param);
1003 
1004           if (cpi->sf.search_method == HEX) {
1005 #if CONFIG_MULTI_RES_ENCODING
1006             /* TODO: In higher-res pick_inter_mode, step_param is used to
1007              * modify hex search range. Here, set step_param to 0 not to
1008              * change the behavior in lowest-resolution encoder.
1009              * Will improve it later.
1010              */
1011             /* Set step_param to 0 to ensure large-range motion search
1012              * when mv reuse if not valid (i.e. |parent_ref_valid| = 0),
1013              * or if this candidate reference frame (|this_ref_frame|) is
1014              * not equal to |parent_ref_frame|.
1015              */
1016             if (!parent_ref_valid || (parent_ref_frame != this_ref_frame))
1017               step_param = 0;
1018 #endif
1019             bestsme = vp8_hex_search(x, b, d, &mvp_full, &d->bmi.mv, step_param,
1020                                      sadpb, &cpi->fn_ptr[BLOCK_16X16],
1021                                      x->mvsadcost, x->mvcost, &best_ref_mv);
1022             mode_mv[NEWMV].as_int = d->bmi.mv.as_int;
1023           } else {
1024             bestsme = cpi->diamond_search_sad(
1025                 x, b, d, &mvp_full, &d->bmi.mv, step_param, sadpb, &num00,
1026                 &cpi->fn_ptr[BLOCK_16X16], x->mvcost, &best_ref_mv);
1027             mode_mv[NEWMV].as_int = d->bmi.mv.as_int;
1028 
1029             /* Further step/diamond searches as necessary */
1030             n = num00;
1031             num00 = 0;
1032 
1033             while (n < further_steps) {
1034               n++;
1035 
1036               if (num00) {
1037                 num00--;
1038               } else {
1039                 thissme = cpi->diamond_search_sad(
1040                     x, b, d, &mvp_full, &d->bmi.mv, step_param + n, sadpb,
1041                     &num00, &cpi->fn_ptr[BLOCK_16X16], x->mvcost, &best_ref_mv);
1042                 if (thissme < bestsme) {
1043                   bestsme = thissme;
1044                   mode_mv[NEWMV].as_int = d->bmi.mv.as_int;
1045                 } else {
1046                   d->bmi.mv.as_int = mode_mv[NEWMV].as_int;
1047                 }
1048               }
1049             }
1050           }
1051 
1052           x->mv_col_min = tmp_col_min;
1053           x->mv_col_max = tmp_col_max;
1054           x->mv_row_min = tmp_row_min;
1055           x->mv_row_max = tmp_row_max;
1056 
1057           if (bestsme < INT_MAX) {
1058             cpi->find_fractional_mv_step(
1059                 x, b, d, &d->bmi.mv, &best_ref_mv, x->errorperbit,
1060                 &cpi->fn_ptr[BLOCK_16X16], cpi->mb.mvcost, &distortion2, &sse);
1061           }
1062         }
1063 
1064         mode_mv[NEWMV].as_int = d->bmi.mv.as_int;
1065         // The clamp below is not necessary from the perspective
1066         // of VP8 bitstream, but is added to improve ChromeCast
1067         // mirroring's robustness. Please do not remove.
1068         vp8_clamp_mv2(&mode_mv[this_mode], xd);
1069         /* mv cost; */
1070         rate2 +=
1071             vp8_mv_bit_cost(&mode_mv[NEWMV], &best_ref_mv, cpi->mb.mvcost, 128);
1072       }
1073         // fall through
1074 
1075       case NEARESTMV:
1076       case NEARMV:
1077         if (mode_mv[this_mode].as_int == 0) continue;
1078         // fall through
1079 
1080       case ZEROMV:
1081 
1082         /* Trap vectors that reach beyond the UMV borders
1083          * Note that ALL New MV, Nearest MV Near MV and Zero MV code drops
1084          * through to this point because of the lack of break statements
1085          * in the previous two cases.
1086          */
1087         if (((mode_mv[this_mode].as_mv.row >> 3) < x->mv_row_min) ||
1088             ((mode_mv[this_mode].as_mv.row >> 3) > x->mv_row_max) ||
1089             ((mode_mv[this_mode].as_mv.col >> 3) < x->mv_col_min) ||
1090             ((mode_mv[this_mode].as_mv.col >> 3) > x->mv_col_max)) {
1091           continue;
1092         }
1093 
1094         rate2 += vp8_cost_mv_ref(this_mode, mdcounts);
1095         x->e_mbd.mode_info_context->mbmi.mv.as_int = mode_mv[this_mode].as_int;
1096         this_rd = evaluate_inter_mode(&sse, rate2, &distortion2, cpi, x,
1097                                       rd_adjustment);
1098 
1099         break;
1100       default: break;
1101     }
1102 
1103 #if CONFIG_TEMPORAL_DENOISING
1104     if (cpi->oxcf.noise_sensitivity) {
1105       /* Store for later use by denoiser. */
1106       // Dont' denoise with GOLDEN OR ALTREF is they are old reference
1107       // frames (greater than MAX_GF_ARF_DENOISE_RANGE frames in past).
1108       int skip_old_reference = ((this_ref_frame != LAST_FRAME) &&
1109                                 (cpi->common.current_video_frame -
1110                                      cpi->current_ref_frames[this_ref_frame] >
1111                                  MAX_GF_ARF_DENOISE_RANGE))
1112                                    ? 1
1113                                    : 0;
1114       if (this_mode == ZEROMV && sse < zero_mv_sse && !skip_old_reference) {
1115         zero_mv_sse = sse;
1116         x->best_zeromv_reference_frame =
1117             x->e_mbd.mode_info_context->mbmi.ref_frame;
1118       }
1119 
1120       // Store the best NEWMV in x for later use in the denoiser.
1121       if (x->e_mbd.mode_info_context->mbmi.mode == NEWMV && sse < best_sse &&
1122           !skip_old_reference) {
1123         best_sse = sse;
1124         x->best_sse_inter_mode = NEWMV;
1125         x->best_sse_mv = x->e_mbd.mode_info_context->mbmi.mv;
1126         x->need_to_clamp_best_mvs =
1127             x->e_mbd.mode_info_context->mbmi.need_to_clamp_mvs;
1128         x->best_reference_frame = x->e_mbd.mode_info_context->mbmi.ref_frame;
1129       }
1130     }
1131 #endif
1132 
1133     if (this_rd < best_rd || x->skip) {
1134       /* Note index of best mode */
1135       best_mode_index = mode_index;
1136 
1137       *returnrate = rate2;
1138       *returndistortion = distortion2;
1139       best_rd_sse = sse;
1140       best_rd = this_rd;
1141       memcpy(&best_mbmode, &x->e_mbd.mode_info_context->mbmi,
1142              sizeof(MB_MODE_INFO));
1143 
1144       /* Testing this mode gave rise to an improvement in best error
1145        * score. Lower threshold a bit for next time
1146        */
1147       x->rd_thresh_mult[mode_index] =
1148           (x->rd_thresh_mult[mode_index] >= (MIN_THRESHMULT + 2))
1149               ? x->rd_thresh_mult[mode_index] - 2
1150               : MIN_THRESHMULT;
1151       x->rd_threshes[mode_index] = (cpi->rd_baseline_thresh[mode_index] >> 7) *
1152                                    x->rd_thresh_mult[mode_index];
1153     }
1154 
1155     /* If the mode did not help improve the best error case then raise the
1156      * threshold for testing that mode next time around.
1157      */
1158     else {
1159       x->rd_thresh_mult[mode_index] += 4;
1160 
1161       if (x->rd_thresh_mult[mode_index] > MAX_THRESHMULT) {
1162         x->rd_thresh_mult[mode_index] = MAX_THRESHMULT;
1163       }
1164 
1165       x->rd_threshes[mode_index] = (cpi->rd_baseline_thresh[mode_index] >> 7) *
1166                                    x->rd_thresh_mult[mode_index];
1167     }
1168 
1169     if (x->skip) break;
1170   }
1171 
1172   /* Reduce the activation RD thresholds for the best choice mode */
1173   if ((cpi->rd_baseline_thresh[best_mode_index] > 0) &&
1174       (cpi->rd_baseline_thresh[best_mode_index] < (INT_MAX >> 2))) {
1175     int best_adjustment = (x->rd_thresh_mult[best_mode_index] >> 3);
1176 
1177     x->rd_thresh_mult[best_mode_index] =
1178         (x->rd_thresh_mult[best_mode_index] >=
1179          (MIN_THRESHMULT + best_adjustment))
1180             ? x->rd_thresh_mult[best_mode_index] - best_adjustment
1181             : MIN_THRESHMULT;
1182     x->rd_threshes[best_mode_index] =
1183         (cpi->rd_baseline_thresh[best_mode_index] >> 7) *
1184         x->rd_thresh_mult[best_mode_index];
1185   }
1186 
1187   {
1188     int this_rdbin = (*returndistortion >> 7);
1189 
1190     if (this_rdbin >= 1024) {
1191       this_rdbin = 1023;
1192     }
1193 
1194     x->error_bins[this_rdbin]++;
1195   }
1196 
1197 #if CONFIG_TEMPORAL_DENOISING
1198   if (cpi->oxcf.noise_sensitivity) {
1199     int block_index = mb_row * cpi->common.mb_cols + mb_col;
1200     int reevaluate = 0;
1201     int is_noisy = 0;
1202     if (x->best_sse_inter_mode == DC_PRED) {
1203       /* No best MV found. */
1204       x->best_sse_inter_mode = best_mbmode.mode;
1205       x->best_sse_mv = best_mbmode.mv;
1206       x->need_to_clamp_best_mvs = best_mbmode.need_to_clamp_mvs;
1207       x->best_reference_frame = best_mbmode.ref_frame;
1208       best_sse = best_rd_sse;
1209     }
1210     // For non-skin blocks that have selected ZEROMV for this current frame,
1211     // and have been selecting ZEROMV_LAST (on the base layer frame) at
1212     // least |x~20| consecutive past frames in a row, label the block for
1213     // possible increase in denoising strength. We also condition this
1214     // labeling on there being significant denoising in the scene
1215     if (cpi->oxcf.noise_sensitivity == 4) {
1216       if (cpi->denoiser.nmse_source_diff >
1217           70 * cpi->denoiser.threshold_aggressive_mode / 100) {
1218         is_noisy = 1;
1219       }
1220     } else {
1221       if (cpi->mse_source_denoised > 1000) is_noisy = 1;
1222     }
1223     x->increase_denoising = 0;
1224     if (!x->is_skin && x->best_sse_inter_mode == ZEROMV &&
1225         (x->best_reference_frame == LAST_FRAME ||
1226          x->best_reference_frame == cpi->closest_reference_frame) &&
1227         cpi->consec_zero_last[block_index] >= 20 && is_noisy) {
1228       x->increase_denoising = 1;
1229     }
1230     x->denoise_zeromv = 0;
1231     vp8_denoiser_denoise_mb(&cpi->denoiser, x, best_sse, zero_mv_sse,
1232                             recon_yoffset, recon_uvoffset, &cpi->common.lf_info,
1233                             mb_row, mb_col, block_index,
1234                             cpi->consec_zero_last_mvbias[block_index]);
1235 
1236     // Reevaluate ZEROMV after denoising: for large noise content
1237     // (i.e., cpi->mse_source_denoised is above threshold), do this for all
1238     // blocks that did not pick ZEROMV as best mode but are using ZEROMV
1239     // for denoising. Otherwise, always re-evaluate for blocks that picked
1240     // INTRA mode as best mode.
1241     // Avoid blocks that have been biased against ZERO_LAST
1242     // (i.e., dot artifact candidate blocks).
1243     reevaluate = (best_mbmode.ref_frame == INTRA_FRAME) ||
1244                  (best_mbmode.mode != ZEROMV && x->denoise_zeromv &&
1245                   cpi->mse_source_denoised > 2000);
1246     if (!dot_artifact_candidate && reevaluate &&
1247         x->best_zeromv_reference_frame != INTRA_FRAME) {
1248       int this_rd = 0;
1249       int this_ref_frame = x->best_zeromv_reference_frame;
1250       rd_adjustment = 100;
1251       rate2 =
1252           x->ref_frame_cost[this_ref_frame] + vp8_cost_mv_ref(ZEROMV, mdcounts);
1253       distortion2 = 0;
1254 
1255       /* set up the proper prediction buffers for the frame */
1256       x->e_mbd.mode_info_context->mbmi.ref_frame = this_ref_frame;
1257       x->e_mbd.pre.y_buffer = plane[this_ref_frame][0];
1258       x->e_mbd.pre.u_buffer = plane[this_ref_frame][1];
1259       x->e_mbd.pre.v_buffer = plane[this_ref_frame][2];
1260 
1261       x->e_mbd.mode_info_context->mbmi.mode = ZEROMV;
1262       x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED;
1263       x->e_mbd.mode_info_context->mbmi.mv.as_int = 0;
1264       this_rd =
1265           evaluate_inter_mode(&sse, rate2, &distortion2, cpi, x, rd_adjustment);
1266 
1267       if (this_rd < best_rd) {
1268         memcpy(&best_mbmode, &x->e_mbd.mode_info_context->mbmi,
1269                sizeof(MB_MODE_INFO));
1270       }
1271     }
1272   }
1273 #endif
1274 
1275   if (cpi->is_src_frame_alt_ref &&
1276       (best_mbmode.mode != ZEROMV || best_mbmode.ref_frame != ALTREF_FRAME)) {
1277     x->e_mbd.mode_info_context->mbmi.mode = ZEROMV;
1278     x->e_mbd.mode_info_context->mbmi.ref_frame = ALTREF_FRAME;
1279     x->e_mbd.mode_info_context->mbmi.mv.as_int = 0;
1280     x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED;
1281     x->e_mbd.mode_info_context->mbmi.mb_skip_coeff =
1282         (cpi->common.mb_no_coeff_skip);
1283     x->e_mbd.mode_info_context->mbmi.partitioning = 0;
1284 
1285     return;
1286   }
1287 
1288   /* set to the best mb mode, this copy can be skip if x->skip since it
1289    * already has the right content */
1290   if (!x->skip) {
1291     memcpy(&x->e_mbd.mode_info_context->mbmi, &best_mbmode,
1292            sizeof(MB_MODE_INFO));
1293   }
1294 
1295   if (best_mbmode.mode <= B_PRED) {
1296     /* set mode_info_context->mbmi.uv_mode */
1297     pick_intra_mbuv_mode(x);
1298   }
1299 
1300   if (sign_bias !=
1301       cpi->common.ref_frame_sign_bias[xd->mode_info_context->mbmi.ref_frame]) {
1302     best_ref_mv.as_int = best_ref_mv_sb[!sign_bias].as_int;
1303   }
1304 
1305   update_mvcount(x, &best_ref_mv);
1306 }
1307 
vp8_pick_intra_mode(MACROBLOCK * x,int * rate)1308 void vp8_pick_intra_mode(MACROBLOCK *x, int *rate) {
1309   int error4x4, error16x16 = INT_MAX;
1310   int rate_, best_rate = 0, distortion, best_sse;
1311   MB_PREDICTION_MODE mode, best_mode = DC_PRED;
1312   int this_rd;
1313   unsigned int sse;
1314   BLOCK *b = &x->block[0];
1315   MACROBLOCKD *xd = &x->e_mbd;
1316 
1317   xd->mode_info_context->mbmi.ref_frame = INTRA_FRAME;
1318 
1319   pick_intra_mbuv_mode(x);
1320 
1321   for (mode = DC_PRED; mode <= TM_PRED; ++mode) {
1322     xd->mode_info_context->mbmi.mode = mode;
1323     vp8_build_intra_predictors_mby_s(xd, xd->dst.y_buffer - xd->dst.y_stride,
1324                                      xd->dst.y_buffer - 1, xd->dst.y_stride,
1325                                      xd->predictor, 16);
1326     distortion = vpx_variance16x16(*(b->base_src), b->src_stride, xd->predictor,
1327                                    16, &sse);
1328     rate_ = x->mbmode_cost[xd->frame_type][mode];
1329     this_rd = RDCOST(x->rdmult, x->rddiv, rate_, distortion);
1330 
1331     if (error16x16 > this_rd) {
1332       error16x16 = this_rd;
1333       best_mode = mode;
1334       best_sse = sse;
1335       best_rate = rate_;
1336     }
1337   }
1338   xd->mode_info_context->mbmi.mode = best_mode;
1339 
1340   error4x4 = pick_intra4x4mby_modes(x, &rate_, &best_sse);
1341   if (error4x4 < error16x16) {
1342     xd->mode_info_context->mbmi.mode = B_PRED;
1343     best_rate = rate_;
1344   }
1345 
1346   *rate = best_rate;
1347 }
1348