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