media/libvpx/vp8/encoder/pickinter.c

Thu, 15 Jan 2015 15:59:08 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 15 Jan 2015 15:59:08 +0100
branch
TOR_BUG_9701
changeset 10
ac0c01689b40
permissions
-rw-r--r--

Implement a real Private Browsing Mode condition by changing the API/ABI;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.

     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  */
    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
    31 extern int VP8_UVSSE(MACROBLOCK *x);
    33 #ifdef SPEEDSTATS
    34 extern unsigned int cnt_pm;
    35 #endif
    37 extern const int vp8_ref_frame_order[MAX_MODES];
    38 extern const MB_PREDICTION_MODE vp8_mode_order[MAX_MODES];
    40 extern int vp8_cost_mv_ref(MB_PREDICTION_MODE m, const int near_mv_ref_ct[4]);
    43 int 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 }
    64 int 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 {
    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;
    80     in_what += (this_mv.as_mv.row >> 3) * pre_stride + (this_mv.as_mv.col >> 3);
    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     }
    91 }
    94 unsigned 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;
   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         }
   113         src_ptr += source_stride;
   114         ref_ptr += recon_stride;
   115     }
   117     return distortion;
   118 }
   120 static 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;
   127     return vp8_get4x4sse_cs(sptr, be->src_stride, dptr, 16);
   129 }
   131 static int pick_intra4x4block(
   132     MACROBLOCK *x,
   133     int ib,
   134     B_PREDICTION_MODE *best_mode,
   135     const int *mode_costs,
   137     int *bestrate,
   138     int *bestdistortion)
   139 {
   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;
   150     unsigned char *Above = dst - dst_stride;
   151     unsigned char *yleft = dst - 1;
   152     unsigned char top_left = Above[-1];
   154     for (mode = B_DC_PRED; mode <= B_HE_PRED; mode++)
   155     {
   156         int this_rd;
   158         rate = mode_costs[mode];
   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);
   165         if (this_rd < best_rd)
   166         {
   167             *bestrate = rate;
   168             *bestdistortion = distortion;
   169             best_rd = this_rd;
   170             *best_mode = mode;
   171         }
   172     }
   174     b->bmi.as_mode = *best_mode;
   175     vp8_encode_intra4x4block(x, ib);
   176     return best_rd;
   177 }
   180 static 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;
   194     intra_prediction_down_copy(xd, xd->dst.y_buffer - xd->dst.y_stride + 16);
   196     bmode_costs = mb->inter_bmode_costs;
   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;
   203         B_PREDICTION_MODE UNINITIALIZED_IS_SAFE(best_mode);
   204         int UNINITIALIZED_IS_SAFE(r), UNINITIALIZED_IS_SAFE(d);
   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);
   211             bmode_costs  = mb->bmode_costs[A][L];
   212         }
   215         pick_intra4x4block(mb, i, &best_mode, bmode_costs, &r, &d);
   217         cost += r;
   218         distortion += d;
   219         mic->bmi[i].as_mode = best_mode;
   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     }
   228     *Rate = cost;
   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     }
   241     return error;
   242 }
   244 static void pick_intra_mbuv_mode(MACROBLOCK *mb)
   245 {
   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);
   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     }
   274     if (!x->up_available && !x->left_available)
   275     {
   276         expected_udc = 128;
   277         expected_vdc = 128;
   278     }
   279     else
   280     {
   281         shift = 2;
   283         if (x->up_available)
   284         {
   286             for (i = 0; i < 8; i++)
   287             {
   288                 Uaverage += uabove_row[i];
   289                 Vaverage += vabove_row[i];
   290             }
   292             shift ++;
   294         }
   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             }
   304             shift ++;
   306         }
   308         expected_udc = (Uaverage + (1 << (shift - 1))) >> shift;
   309         expected_vdc = (Vaverage + (1 << (shift - 1))) >> shift;
   310     }
   313     for (i = 0; i < 8; i++)
   314     {
   315         for (j = 0; j < 8; j++)
   316         {
   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;
   322             u_p = usrc_ptr[j];
   323             v_p = vsrc_ptr[j];
   325             if (predu < 0)
   326                 predu = 0;
   328             if (predu > 255)
   329                 predu = 255;
   331             if (predv < 0)
   332                 predv = 0;
   334             if (predv > 255)
   335                 predv = 255;
   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;
   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;
   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;
   356             diff = u_p - predu;
   357             pred_error[TM_PRED] += diff * diff;
   358             diff = v_p - predv;
   359             pred_error[TM_PRED] += diff * diff;
   362         }
   364         usrc_ptr += uvsrc_stride;
   365         vsrc_ptr += uvsrc_stride;
   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         }
   375     }
   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     }
   388     mb->e_mbd.mode_info_context->mbmi.uv_mode = best_mode;
   390 }
   392 static 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 }
   407 #if CONFIG_MULTI_RES_ENCODING
   408 static
   409 void 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;
   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;
   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     }
   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;
   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;
   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;
   455         vp8_clamp_mv2(parent_ref_mv, xd);
   456     }
   457 }
   458 #endif
   460 static void check_for_encode_breakout(unsigned int sse, MACROBLOCK* x)
   461 {
   462     MACROBLOCKD *xd = &x->e_mbd;
   464     unsigned int threshold = (xd->block[0].dequant[1]
   465         * xd->block[0].dequant[1] >>4);
   467     if(threshold < x->encode_breakout)
   468         threshold = x->encode_breakout;
   470     if (sse < threshold )
   471     {
   472         /* Check u and v to make sure skip is ok */
   473         unsigned int sse2 = 0;
   475         sse2 = VP8_UVSSE(x);
   477         if (sse2 * 2 < x->encode_breakout)
   478             x->skip = 1;
   479         else
   480             x->skip = 0;
   481     }
   482 }
   484 static 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     }
   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);
   506     this_rd = RDCOST(x->rdmult, x->rddiv, rate2, *distortion2);
   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;
   517         // rd_adj <= 100
   518         this_rd = ((int64_t)this_rd) * rd_adj / 100;
   519     }
   521     check_for_encode_breakout(*sse, x);
   522     return this_rd;
   523 }
   525 static 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;
   532     if (cpi->lf_zeromv_pct > 40)
   533     {
   534         /* left mb */
   535         mic -= 1;
   536         mv_l = mic->mbmi.mv;
   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++;
   542         /* above-left mb */
   543         mic -= x->e_mbd.mode_info_stride;
   544         mv_al = mic->mbmi.mv;
   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++;
   550         /* above mb */
   551         mic += 1;
   552         mv_a = mic->mbmi.mv;
   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++;
   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 }
   566 void 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;
   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
   597     int sf_improved_mv_pred = cpi->sf.improved_mv_pred;
   598     int_mv mvp;
   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;
   605     unsigned char *plane[4][3];
   606     int ref_frame_map[4];
   607     int sign_bias = 0;
   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;
   616     if (parent_ref_valid)
   617     {
   618         int parent_ref_flag;
   620         get_lower_res_motion_info(cpi, xd, &dissim, &parent_ref_frame,
   621                                   &parent_mode, &parent_ref_mv, mb_row, mb_col);
   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);
   641         //assert(!parent_ref_frame || parent_ref_flag);
   642         if (parent_ref_frame && !parent_ref_flag)
   643             parent_ref_valid = 0;
   644     }
   645 #endif
   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));
   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);
   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);
   677         mode_mv = mode_mv_sb[sign_bias];
   678         best_ref_mv.as_int = best_ref_mv_sb[sign_bias].as_int;
   679     }
   681     get_predictor_pointers(cpi, plane, recon_yoffset, recon_uvoffset);
   683     /* Count of the number of MBs tested so far this frame */
   684     x->mbs_tested_so_far++;
   686     *returnintra = INT_MAX;
   687     x->skip = 0;
   689     x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME;
   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);
   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]];
   705         if (best_rd <= x->rd_threshes[mode_index])
   706             continue;
   708         if (this_ref_frame < 0)
   709             continue;
   711         x->e_mbd.mode_info_context->mbmi.ref_frame = this_ref_frame;
   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];
   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             }
   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;
   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         }
   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;
   760                 if (x->rd_thresh_mult[mode_index] > MAX_THRESHMULT)
   761                     x->rd_thresh_mult[mode_index] = MAX_THRESHMULT;
   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         }
   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] ++;
   775         rate2 = 0;
   776         distortion2 = 0;
   778         this_mode = vp8_mode_order[mode_index];
   780         x->e_mbd.mode_info_context->mbmi.mode = this_mode;
   781         x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED;
   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;
   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         }
   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);
   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);
   817                 if (this_rd < best_intra_rd)
   818                 {
   819                     best_intra_rd = this_rd;
   820                     *returnintra = distortion2;
   821                 }
   822             }
   824             break;
   826         case SPLITMV:
   828             /* Split MV modes currently not supported when RD is not enabled. */
   829             break;
   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);
   847             if (this_rd < best_intra_rd)
   848             {
   849                 best_intra_rd = this_rd;
   850                 *returnintra = distortion2;
   851             }
   852             break;
   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;
   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;
   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;
   875             int speed_adjust = (cpi->Speed > 5) ? ((cpi->Speed >= 8)? 3 : 2) : 1;
   877             /* Further step/diamond searches as necessary */
   878             step_param = cpi->sf.first_step + speed_adjust;
   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;
   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;
   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                     }
   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]);
   916                     sr += speed_adjust;
   917                     /* adjust search range according to sr from mv prediction */
   918                     if(sr > step_param)
   919                         step_param = sr;
   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             }
   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;
   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;
   958                 further_steps = (cpi->Speed >= 8)?
   959                            0: (cpi->sf.max_step_search_steps - 1 - step_param);
   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;
   989                     /* Further step/diamond searches as necessary */
   990                     n = num00;
   991                     num00 = 0;
   993                     while (n < further_steps)
   994                     {
   995                         n++;
   997                         if (num00)
   998                             num00--;
   999                         else
  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)
  1010                                 bestsme = thissme;
  1011                                 mode_mv[NEWMV].as_int = d->bmi.mv.as_int;
  1013                             else
  1015                                 d->bmi.mv.as_int = mode_mv[NEWMV].as_int;
  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;
  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);
  1034             mode_mv[NEWMV].as_int = d->bmi.mv.as_int;
  1036             /* mv cost; */
  1037             rate2 += vp8_mv_bit_cost(&mode_mv[NEWMV], &best_ref_mv,
  1038                                      cpi->mb.mvcost, 128);
  1041         case NEARESTMV:
  1042         case NEARMV:
  1044             if (mode_mv[this_mode].as_int == 0)
  1045                 continue;
  1047         case ZEROMV:
  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;
  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);
  1066             break;
  1067         default:
  1068             break;
  1071 #if CONFIG_TEMPORAL_DENOISING
  1072         if (cpi->oxcf.noise_sensitivity)
  1075             /* Store for later use by denoiser. */
  1076             if (this_mode == ZEROMV && sse < zero_mv_sse )
  1078                 zero_mv_sse = sse;
  1079                 x->best_zeromv_reference_frame =
  1080                         x->e_mbd.mode_info_context->mbmi.ref_frame;
  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)
  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;
  1096 #endif
  1098         if (this_rd < best_rd || x->skip)
  1100             /* Note index of best mode */
  1101             best_mode_index = mode_index;
  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));
  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];
  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
  1126             x->rd_thresh_mult[mode_index] += 4;
  1128             if (x->rd_thresh_mult[mode_index] > MAX_THRESHMULT)
  1129                 x->rd_thresh_mult[mode_index] = MAX_THRESHMULT;
  1131             x->rd_threshes[mode_index] =
  1132                          (cpi->rd_baseline_thresh[mode_index] >> 7) *
  1133                          x->rd_thresh_mult[mode_index];
  1136         if (x->skip)
  1137             break;
  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)))
  1143         int best_adjustment = (x->rd_thresh_mult[best_mode_index] >> 3);
  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];
  1157         int this_rdbin = (*returndistortion >> 7);
  1159         if (this_rdbin >= 1024)
  1161             this_rdbin = 1023;
  1164         x->error_bins[this_rdbin] ++;
  1167 #if CONFIG_TEMPORAL_DENOISING
  1168     if (cpi->oxcf.noise_sensitivity)
  1170         if (x->best_sse_inter_mode == DC_PRED)
  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;
  1179         vp8_denoiser_denoise_mb(&cpi->denoiser, x, best_sse, zero_mv_sse,
  1180                                 recon_yoffset, recon_uvoffset);
  1183         /* Reevaluate ZEROMV after denoising. */
  1184         if (best_mbmode.ref_frame == INTRA_FRAME &&
  1185             x->best_zeromv_reference_frame != INTRA_FRAME)
  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;
  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];
  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);
  1205             if (this_rd < best_rd)
  1207                 vpx_memcpy(&best_mbmode, &x->e_mbd.mode_info_context->mbmi,
  1208                            sizeof(MB_MODE_INFO));
  1213 #endif
  1215     if (cpi->is_src_frame_alt_ref &&
  1216         (best_mbmode.mode != ZEROMV || best_mbmode.ref_frame != ALTREF_FRAME))
  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;
  1226         return;
  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));
  1235     if (best_mbmode.mode <= B_PRED)
  1237         /* set mode_info_context->mbmi.uv_mode */
  1238         pick_intra_mbuv_mode(x);
  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;
  1245     update_mvcount(x, &best_ref_mv);
  1249 void vp8_pick_intra_mode(MACROBLOCK *x, int *rate_)
  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;
  1259     xd->mode_info_context->mbmi.ref_frame = INTRA_FRAME;
  1261     pick_intra_mbuv_mode(x);
  1263     for (mode = DC_PRED; mode <= TM_PRED; mode ++)
  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);
  1277         if (error16x16 > this_rd)
  1279             error16x16 = this_rd;
  1280             best_mode = mode;
  1281             best_sse = sse;
  1282             best_rate = rate;
  1285     xd->mode_info_context->mbmi.mode = best_mode;
  1287     error4x4 = pick_intra4x4mby_modes(x, &rate,
  1288                                       &best_sse);
  1289     if (error4x4 < error16x16)
  1291         xd->mode_info_context->mbmi.mode = B_PRED;
  1292         best_rate = rate;
  1295     *rate_ = best_rate;

mercurial