| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved. | 2  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved. | 
| 3  * | 3  * | 
| 4  *  Use of this source code is governed by a BSD-style license | 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 | 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 | 6  *  tree. An additional intellectual property rights grant can be found | 
| 7  *  in the file PATENTS.  All contributing project authors may | 7  *  in the file PATENTS.  All contributing project authors may | 
| 8  *  be found in the AUTHORS file in the root of the source tree. | 8  *  be found in the AUTHORS file in the root of the source tree. | 
| 9  */ | 9  */ | 
| 10 | 10 | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
| 24 #include "vp8/common/reconinter.h" | 24 #include "vp8/common/reconinter.h" | 
| 25 #include "vp8/common/reconintra.h" | 25 #include "vp8/common/reconintra.h" | 
| 26 #include "vp8/common/reconintra4x4.h" | 26 #include "vp8/common/reconintra4x4.h" | 
| 27 #include "vp8/common/findnearmv.h" | 27 #include "vp8/common/findnearmv.h" | 
| 28 #include "encodemb.h" | 28 #include "encodemb.h" | 
| 29 #include "quantize.h" | 29 #include "quantize.h" | 
| 30 #include "vp8/common/idct.h" | 30 #include "vp8/common/idct.h" | 
| 31 #include "vp8/common/g_common.h" | 31 #include "vp8/common/g_common.h" | 
| 32 #include "variance.h" | 32 #include "variance.h" | 
| 33 #include "mcomp.h" | 33 #include "mcomp.h" | 
| 34 | 34 #include "rdopt.h" | 
| 35 #include "vpx_mem/vpx_mem.h" | 35 #include "vpx_mem/vpx_mem.h" | 
| 36 #include "dct.h" | 36 #include "dct.h" | 
| 37 #include "vp8/common/systemdependent.h" | 37 #include "vp8/common/systemdependent.h" | 
| 38 | 38 | 
| 39 #if CONFIG_RUNTIME_CPU_DETECT | 39 #if CONFIG_RUNTIME_CPU_DETECT | 
| 40 #define IF_RTCD(x)  (x) | 40 #define IF_RTCD(x)  (x) | 
| 41 #else | 41 #else | 
| 42 #define IF_RTCD(x)  NULL | 42 #define IF_RTCD(x)  NULL | 
| 43 #endif | 43 #endif | 
| 44 | 44 | 
| 45 | 45 | 
| 46 extern void vp8cx_mb_init_quantizer(VP8_COMP *cpi, MACROBLOCK *x); | 46 extern void vp8cx_mb_init_quantizer(VP8_COMP *cpi, MACROBLOCK *x); | 
| 47 extern void vp8_update_zbin_extra(VP8_COMP *cpi, MACROBLOCK *x); | 47 extern void vp8_update_zbin_extra(VP8_COMP *cpi, MACROBLOCK *x); | 
| 48 | 48 | 
| 49 |  | 
| 50 #define RDCOST(RM,DM,R,D) ( ((128+(R)*(RM)) >> 8) + (DM)*(D) ) |  | 
| 51 |  | 
| 52 #define MAXF(a,b)            (((a) > (b)) ? (a) : (b)) | 49 #define MAXF(a,b)            (((a) > (b)) ? (a) : (b)) | 
| 53 | 50 | 
| 54 |  | 
| 55 |  | 
| 56 static const int auto_speed_thresh[17] = | 51 static const int auto_speed_thresh[17] = | 
| 57 { | 52 { | 
| 58     1000, | 53     1000, | 
| 59     200, | 54     200, | 
| 60     150, | 55     150, | 
| 61     130, | 56     130, | 
| 62     150, | 57     150, | 
| 63     125, | 58     125, | 
| 64     120, | 59     120, | 
| 65     115, | 60     115, | 
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 132     ALTREF_FRAME, | 127     ALTREF_FRAME, | 
| 133 | 128 | 
| 134     LAST_FRAME, | 129     LAST_FRAME, | 
| 135     GOLDEN_FRAME, | 130     GOLDEN_FRAME, | 
| 136     ALTREF_FRAME, | 131     ALTREF_FRAME, | 
| 137 | 132 | 
| 138     INTRA_FRAME, | 133     INTRA_FRAME, | 
| 139 }; | 134 }; | 
| 140 | 135 | 
| 141 static void fill_token_costs( | 136 static void fill_token_costs( | 
| 142     unsigned int c      [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [vp8_coe
      f_tokens], | 137     unsigned int c      [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [MAX_ENT
      ROPY_TOKENS], | 
| 143     const vp8_prob p    [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [vp8_coe
      f_tokens-1] | 138     const vp8_prob p    [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [ENTROPY
      _NODES] | 
| 144 ) | 139 ) | 
| 145 { | 140 { | 
| 146     int i, j, k; | 141     int i, j, k; | 
| 147 | 142 | 
| 148 | 143 | 
| 149     for (i = 0; i < BLOCK_TYPES; i++) | 144     for (i = 0; i < BLOCK_TYPES; i++) | 
| 150         for (j = 0; j < COEF_BANDS; j++) | 145         for (j = 0; j < COEF_BANDS; j++) | 
| 151             for (k = 0; k < PREV_COEF_CONTEXTS; k++) | 146             for (k = 0; k < PREV_COEF_CONTEXTS; k++) | 
| 152 | 147 | 
| 153                 vp8_cost_tokens((int *)(c [i][j][k]), p [i][j][k], vp8_coef_tree
      ); | 148                 vp8_cost_tokens((int *)(c [i][j][k]), p [i][j][k], vp8_coef_tree
      ); | 
| 154 | 149 | 
| 155 } | 150 } | 
| 156 | 151 | 
| 157 static int rd_iifactor [ 32 ] =  {    4,   4,   3,   2,   1,   0,   0,   0, | 152 static int rd_iifactor [ 32 ] =  {    4,   4,   3,   2,   1,   0,   0,   0, | 
| 158                                       0,   0,   0,   0,   0,   0,   0,   0, | 153                                       0,   0,   0,   0,   0,   0,   0,   0, | 
| 159                                       0,   0,   0,   0,   0,   0,   0,   0, | 154                                       0,   0,   0,   0,   0,   0,   0,   0, | 
| 160                                       0,   0,   0,   0,   0,   0,   0,   0, | 155                                       0,   0,   0,   0,   0,   0,   0,   0, | 
| 161                                  }; | 156                                  }; | 
| 162 | 157 | 
| 163 |  | 
| 164 /* values are now correlated to quantizer */ | 158 /* values are now correlated to quantizer */ | 
| 165 static int sad_per_bit16lut[QINDEX_RANGE] = | 159 static int sad_per_bit16lut[QINDEX_RANGE] = | 
| 166 { | 160 { | 
|  | 161     2,  2,  2,  2,  2,  2,  2,  2, | 
|  | 162     2,  2,  2,  2,  2,  2,  2,  2, | 
|  | 163     3,  3,  3,  3,  3,  3,  3,  3, | 
|  | 164     3,  3,  3,  3,  3,  3,  4,  4, | 
|  | 165     4,  4,  4,  4,  4,  4,  4,  4, | 
|  | 166     4,  4,  5,  5,  5,  5,  5,  5, | 
| 167     5,  5,  5,  5,  5,  5,  6,  6, | 167     5,  5,  5,  5,  5,  5,  6,  6, | 
| 168     6,  6,  6,  6,  6,  7,  7,  7, | 168     6,  6,  6,  6,  6,  6,  6,  6, | 
| 169     7,  7,  7,  7,  8,  8,  8,  8, | 169     6,  6,  7,  7,  7,  7,  7,  7, | 
| 170     8,  8,  8,  8,  8,  8,  9,  9, | 170     7,  7,  7,  7,  7,  7,  8,  8, | 
| 171     9,  9,  9,  9, 10, 10, 10, 10, | 171     8,  8,  8,  8,  8,  8,  8,  8, | 
| 172     10, 10, 11, 11, 11, 11, 11, 11, | 172     8,  8,  9,  9,  9,  9,  9,  9, | 
| 173     12, 12, 12, 12, 12, 12, 12, 13, | 173     9,  9,  9,  9,  9,  9,  10, 10, | 
| 174     13, 13, 13, 13, 13, 14, 14, 14, | 174     10, 10, 10, 10, 10, 10, 11, 11, | 
| 175     14, 14, 15, 15, 15, 15, 15, 15, | 175     11, 11, 11, 11, 12, 12, 12, 12, | 
| 176     16, 16, 16, 16, 16, 16, 17, 17, | 176     12, 12, 13, 13, 13, 13, 14, 14 | 
| 177     17, 17, 17, 17, 17, 18, 18, 18, |  | 
| 178     18, 18, 19, 19, 19, 19, 19, 19, |  | 
| 179     20, 20, 20, 21, 21, 21, 21, 22, |  | 
| 180     22, 22, 23, 23, 23, 24, 24, 24, |  | 
| 181     25, 25, 26, 26, 27, 27, 27, 28, |  | 
| 182     28, 28, 29, 29, 30, 30, 31, 31 |  | 
| 183 }; | 177 }; | 
| 184 static int sad_per_bit4lut[QINDEX_RANGE] = | 178 static int sad_per_bit4lut[QINDEX_RANGE] = | 
| 185 { | 179 { | 
| 186     5,  5,  5,  5,  5,  5,  7,  7, | 180     2,  2,  2,  2,  2,  2,  3,  3, | 
|  | 181     3,  3,  3,  3,  3,  3,  3,  3, | 
|  | 182     3,  3,  3,  3,  4,  4,  4,  4, | 
|  | 183     4,  4,  4,  4,  4,  4,  5,  5, | 
|  | 184     5,  5,  5,  5,  6,  6,  6,  6, | 
|  | 185     6,  6,  6,  6,  6,  6,  6,  6, | 
|  | 186     7,  7,  7,  7,  7,  7,  7,  7, | 
| 187     7,  7,  7,  7,  7,  8,  8,  8, | 187     7,  7,  7,  7,  7,  8,  8,  8, | 
| 188     8,  8,  8,  8,  10, 10, 10, 10, | 188     8,  8,  9,  9,  9,  9,  9,  9, | 
| 189     10, 10, 10, 10, 10, 10, 11, 11, | 189     10, 10, 10, 10, 10, 10, 10, 10, | 
| 190     11, 11, 11, 11, 13, 13, 13, 13, | 190     11, 11, 11, 11, 11, 11, 11, 11, | 
| 191     13, 13, 14, 14, 14, 14, 14, 14, | 191     12, 12, 12, 12, 12, 12, 12, 12, | 
| 192     16, 16, 16, 16, 16, 16, 16, 17, | 192     13, 13, 13, 13, 13, 13, 13, 14, | 
| 193     17, 17, 17, 17, 17, 19, 19, 19, | 193     14, 14, 14, 14, 15, 15, 15, 15, | 
| 194     19, 19, 20, 20, 20, 20, 20, 20, | 194     16, 16, 16, 16, 17, 17, 17, 18, | 
| 195     22, 22, 22, 22, 22, 22, 23, 23, | 195     18, 18, 19, 19, 19, 20, 20, 20, | 
| 196     23, 23, 23, 23, 23, 25, 25, 25, |  | 
| 197     25, 25, 26, 26, 26, 26, 26, 26, |  | 
| 198     28, 28, 28, 29, 29, 29, 29, 31, |  | 
| 199     31, 31, 32, 32, 32, 34, 34, 34, |  | 
| 200     35, 35, 37, 37, 38, 38, 38, 40, |  | 
| 201     40, 40, 41, 41, 43, 43, 44, 44, |  | 
| 202 }; | 196 }; | 
| 203 | 197 | 
| 204 void vp8cx_initialize_me_consts(VP8_COMP *cpi, int QIndex) | 198 void vp8cx_initialize_me_consts(VP8_COMP *cpi, int QIndex) | 
| 205 { | 199 { | 
| 206     cpi->mb.sadperbit16 =  sad_per_bit16lut[QIndex]; | 200     cpi->mb.sadperbit16 =  sad_per_bit16lut[QIndex]; | 
| 207     cpi->mb.sadperbit4  =  sad_per_bit4lut[QIndex]; | 201     cpi->mb.sadperbit4  =  sad_per_bit4lut[QIndex]; | 
| 208 } | 202 } | 
| 209 | 203 | 
| 210 void vp8_initialize_rd_consts(VP8_COMP *cpi, int Qvalue) | 204 void vp8_initialize_rd_consts(VP8_COMP *cpi, int Qvalue) | 
| 211 { | 205 { | 
| 212     int q; | 206     int q; | 
| 213     int i; | 207     int i; | 
| 214     double capped_q = (Qvalue < 160) ? (double)Qvalue : 160.0; | 208     double capped_q = (Qvalue < 160) ? (double)Qvalue : 160.0; | 
| 215     double rdconst = 3.00; | 209     double rdconst = 2.70; | 
| 216 | 210 | 
| 217     vp8_clear_system_state();  //__asm emms; | 211     vp8_clear_system_state();  //__asm emms; | 
| 218 | 212 | 
| 219     // Further tests required to see if optimum is different | 213     // Further tests required to see if optimum is different | 
| 220     // for key frames, golden frames and arf frames. | 214     // for key frames, golden frames and arf frames. | 
| 221     // if (cpi->common.refresh_golden_frame || | 215     // if (cpi->common.refresh_golden_frame || | 
| 222     //     cpi->common.refresh_alt_ref_frame) | 216     //     cpi->common.refresh_alt_ref_frame) | 
| 223     cpi->RDMULT = (int)(rdconst * (capped_q * capped_q)); | 217     cpi->RDMULT = (int)(rdconst * (capped_q * capped_q)); | 
| 224 | 218 | 
| 225     // Extend rate multiplier along side quantizer zbin increases | 219     // Extend rate multiplier along side quantizer zbin increases | 
| 226     if (cpi->zbin_over_quant  > 0) | 220     if (cpi->zbin_over_quant  > 0) | 
| 227     { | 221     { | 
| 228         double oq_factor; | 222         double oq_factor; | 
| 229         double modq; | 223         double modq; | 
| 230 | 224 | 
| 231         // Experimental code using the same basic equation as used for Q above | 225         // Experimental code using the same basic equation as used for Q above | 
| 232         // The units of cpi->zbin_over_quant are 1/128 of Q bin size | 226         // The units of cpi->zbin_over_quant are 1/128 of Q bin size | 
| 233         oq_factor = 1.0 + ((double)0.0015625 * cpi->zbin_over_quant); | 227         oq_factor = 1.0 + ((double)0.0015625 * cpi->zbin_over_quant); | 
| 234         modq = (int)((double)capped_q * oq_factor); | 228         modq = (int)((double)capped_q * oq_factor); | 
| 235         cpi->RDMULT = (int)(rdconst * (modq * modq)); | 229         cpi->RDMULT = (int)(rdconst * (modq * modq)); | 
| 236     } | 230     } | 
| 237 | 231 | 
| 238     if (cpi->pass == 2 && (cpi->common.frame_type != KEY_FRAME)) | 232     if (cpi->pass == 2 && (cpi->common.frame_type != KEY_FRAME)) | 
| 239     { | 233     { | 
| 240         if (cpi->next_iiratio > 31) | 234         if (cpi->twopass.next_iiratio > 31) | 
| 241             cpi->RDMULT += (cpi->RDMULT * rd_iifactor[31]) >> 4; | 235             cpi->RDMULT += (cpi->RDMULT * rd_iifactor[31]) >> 4; | 
| 242         else | 236         else | 
| 243             cpi->RDMULT += (cpi->RDMULT * rd_iifactor[cpi->next_iiratio]) >> 4; | 237             cpi->RDMULT += | 
|  | 238                 (cpi->RDMULT * rd_iifactor[cpi->twopass.next_iiratio]) >> 4; | 
| 244     } | 239     } | 
| 245 | 240 | 
| 246     cpi->mb.errorperbit = (cpi->RDMULT / 100); | 241     cpi->mb.errorperbit = (cpi->RDMULT / 110); | 
| 247     cpi->mb.errorperbit += (cpi->mb.errorperbit==0); | 242     cpi->mb.errorperbit += (cpi->mb.errorperbit==0); | 
| 248 | 243 | 
| 249     vp8_set_speed_features(cpi); | 244     vp8_set_speed_features(cpi); | 
| 250 | 245 | 
| 251     if (cpi->common.simpler_lpf) |  | 
| 252         cpi->common.filter_type = SIMPLE_LOOPFILTER; |  | 
| 253 |  | 
| 254     q = (int)pow(Qvalue, 1.25); | 246     q = (int)pow(Qvalue, 1.25); | 
| 255 | 247 | 
| 256     if (q < 8) | 248     if (q < 8) | 
| 257         q = 8; | 249         q = 8; | 
| 258 | 250 | 
| 259     if (cpi->RDMULT > 1000) | 251     if (cpi->RDMULT > 1000) | 
| 260     { | 252     { | 
| 261         cpi->RDDIV = 1; | 253         cpi->RDDIV = 1; | 
| 262         cpi->RDMULT /= 100; | 254         cpi->RDMULT /= 100; | 
| 263 | 255 | 
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 298         cpi->mb.token_costs, | 290         cpi->mb.token_costs, | 
| 299         (const vp8_prob( *)[8][3][11]) cpi->common.fc.coef_probs | 291         (const vp8_prob( *)[8][3][11]) cpi->common.fc.coef_probs | 
| 300     ); | 292     ); | 
| 301 | 293 | 
| 302     vp8_init_mode_costs(cpi); | 294     vp8_init_mode_costs(cpi); | 
| 303 | 295 | 
| 304 } | 296 } | 
| 305 | 297 | 
| 306 void vp8_auto_select_speed(VP8_COMP *cpi) | 298 void vp8_auto_select_speed(VP8_COMP *cpi) | 
| 307 { | 299 { | 
| 308     int used = cpi->oxcf.cpu_used; |  | 
| 309 |  | 
| 310     int milliseconds_for_compress = (int)(1000000 / cpi->oxcf.frame_rate); | 300     int milliseconds_for_compress = (int)(1000000 / cpi->oxcf.frame_rate); | 
| 311 | 301 | 
| 312     milliseconds_for_compress = milliseconds_for_compress * (16 - cpi->oxcf.cpu_
      used) / 16; | 302     milliseconds_for_compress = milliseconds_for_compress * (16 - cpi->oxcf.cpu_
      used) / 16; | 
| 313 | 303 | 
| 314 #if 0 | 304 #if 0 | 
| 315 | 305 | 
| 316     if (0) | 306     if (0) | 
| 317     { | 307     { | 
| 318         FILE *f; | 308         FILE *f; | 
| 319 | 309 | 
| 320         f = fopen("speed.stt", "a"); | 310         f = fopen("speed.stt", "a"); | 
| 321         fprintf(f, " %8ld %10ld %10ld %10ld\n", | 311         fprintf(f, " %8ld %10ld %10ld %10ld\n", | 
| 322                 cpi->common.current_video_frame, cpi->Speed, milliseconds_for_co
      mpress, cpi->avg_pick_mode_time); | 312                 cpi->common.current_video_frame, cpi->Speed, milliseconds_for_co
      mpress, cpi->avg_pick_mode_time); | 
| 323         fclose(f); | 313         fclose(f); | 
| 324     } | 314     } | 
| 325 | 315 | 
| 326 #endif | 316 #endif | 
| 327 | 317 | 
| 328     /* | 318     /* | 
| 329     // this is done during parameter valid check | 319     // this is done during parameter valid check | 
| 330     if( used > 16) | 320     if( cpi->oxcf.cpu_used > 16) | 
| 331         used = 16; | 321         cpi->oxcf.cpu_used = 16; | 
| 332     if( used < -16) | 322     if( cpi->oxcf.cpu_used < -16) | 
| 333         used = -16; | 323         cpi->oxcf.cpu_used = -16; | 
| 334     */ | 324     */ | 
| 335 | 325 | 
| 336     if (cpi->avg_pick_mode_time < milliseconds_for_compress && (cpi->avg_encode_
      time - cpi->avg_pick_mode_time) < milliseconds_for_compress) | 326     if (cpi->avg_pick_mode_time < milliseconds_for_compress && (cpi->avg_encode_
      time - cpi->avg_pick_mode_time) < milliseconds_for_compress) | 
| 337     { | 327     { | 
| 338         if (cpi->avg_pick_mode_time == 0) | 328         if (cpi->avg_pick_mode_time == 0) | 
| 339         { | 329         { | 
| 340             cpi->Speed = 4; | 330             cpi->Speed = 4; | 
| 341         } | 331         } | 
| 342         else | 332         else | 
| 343         { | 333         { | 
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 458     vp8_build_uvmvs(&x->e_mbd, 0); | 448     vp8_build_uvmvs(&x->e_mbd, 0); | 
| 459     mv_row = x->e_mbd.block[16].bmi.mv.as_mv.row; | 449     mv_row = x->e_mbd.block[16].bmi.mv.as_mv.row; | 
| 460     mv_col = x->e_mbd.block[16].bmi.mv.as_mv.col; | 450     mv_col = x->e_mbd.block[16].bmi.mv.as_mv.col; | 
| 461 | 451 | 
| 462     offset = (mv_row >> 3) * pre_stride + (mv_col >> 3); | 452     offset = (mv_row >> 3) * pre_stride + (mv_col >> 3); | 
| 463     uptr = x->e_mbd.pre.u_buffer + offset; | 453     uptr = x->e_mbd.pre.u_buffer + offset; | 
| 464     vptr = x->e_mbd.pre.v_buffer + offset; | 454     vptr = x->e_mbd.pre.v_buffer + offset; | 
| 465 | 455 | 
| 466     if ((mv_row | mv_col) & 7) | 456     if ((mv_row | mv_col) & 7) | 
| 467     { | 457     { | 
| 468         VARIANCE_INVOKE(rtcd, subpixvar8x8)(uptr, pre_stride, mv_col & 7, mv_row
       & 7, upred_ptr, uv_stride, &sse2); | 458         VARIANCE_INVOKE(rtcd, subpixvar8x8)(uptr, pre_stride, | 
| 469         VARIANCE_INVOKE(rtcd, subpixvar8x8)(vptr, pre_stride, mv_col & 7, mv_row
       & 7, vpred_ptr, uv_stride, &sse1); | 459             mv_col & 7, mv_row & 7, upred_ptr, uv_stride, &sse2); | 
|  | 460         VARIANCE_INVOKE(rtcd, subpixvar8x8)(vptr, pre_stride, | 
|  | 461             mv_col & 7, mv_row & 7, vpred_ptr, uv_stride, &sse1); | 
| 470         sse2 += sse1; | 462         sse2 += sse1; | 
| 471     } | 463     } | 
| 472     else | 464     else | 
| 473     { | 465     { | 
| 474         VARIANCE_INVOKE(rtcd, subpixvar8x8)(uptr, pre_stride, mv_col & 7, mv_row
       & 7, upred_ptr, uv_stride, &sse2); | 466         VARIANCE_INVOKE(rtcd, var8x8)(uptr, pre_stride, | 
| 475         VARIANCE_INVOKE(rtcd, subpixvar8x8)(vptr, pre_stride, mv_col & 7, mv_row
       & 7, vpred_ptr, uv_stride, &sse1); | 467             upred_ptr, uv_stride, &sse2); | 
|  | 468         VARIANCE_INVOKE(rtcd, var8x8)(vptr, pre_stride, | 
|  | 469             vpred_ptr, uv_stride, &sse1); | 
| 476         sse2 += sse1; | 470         sse2 += sse1; | 
| 477     } | 471     } | 
| 478 |  | 
| 479     return sse2; | 472     return sse2; | 
| 480 | 473 | 
| 481 } | 474 } | 
| 482 | 475 | 
| 483 #if !(CONFIG_REALTIME_ONLY) |  | 
| 484 static int cost_coeffs(MACROBLOCK *mb, BLOCKD *b, int type, ENTROPY_CONTEXT *a, 
      ENTROPY_CONTEXT *l) | 476 static int cost_coeffs(MACROBLOCK *mb, BLOCKD *b, int type, ENTROPY_CONTEXT *a, 
      ENTROPY_CONTEXT *l) | 
| 485 { | 477 { | 
| 486     int c = !type;              /* start at coef 0, unless Y with Y2 */ | 478     int c = !type;              /* start at coef 0, unless Y with Y2 */ | 
| 487     int eob = b->eob; | 479     int eob = b->eob; | 
| 488     int pt ;    /* surrounding block/prev coef predictor */ | 480     int pt ;    /* surrounding block/prev coef predictor */ | 
| 489     int cost = 0; | 481     int cost = 0; | 
| 490     short *qcoeff_ptr = b->qcoeff; | 482     short *qcoeff_ptr = b->qcoeff; | 
| 491 | 483 | 
| 492     VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); | 484     VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l); | 
| 493 | 485 | 
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 544                              const vp8_encodemb_rtcd_vtable_t *rtcd) | 536                              const vp8_encodemb_rtcd_vtable_t *rtcd) | 
| 545 { | 537 { | 
| 546     int b; | 538     int b; | 
| 547     MACROBLOCKD *const x = &mb->e_mbd; | 539     MACROBLOCKD *const x = &mb->e_mbd; | 
| 548     BLOCK   *const mb_y2 = mb->block + 24; | 540     BLOCK   *const mb_y2 = mb->block + 24; | 
| 549     BLOCKD *const x_y2  = x->block + 24; | 541     BLOCKD *const x_y2  = x->block + 24; | 
| 550     short *Y2DCPtr = mb_y2->src_diff; | 542     short *Y2DCPtr = mb_y2->src_diff; | 
| 551     BLOCK *beptr; | 543     BLOCK *beptr; | 
| 552     int d; | 544     int d; | 
| 553 | 545 | 
| 554     ENCODEMB_INVOKE(rtcd, submby)( mb->src_diff, mb->src.y_buffer, | 546     ENCODEMB_INVOKE(rtcd, submby)( mb->src_diff, *(mb->block[0].base_src), | 
| 555                                    mb->e_mbd.predictor, mb->src.y_stride ); | 547                                    mb->e_mbd.predictor, mb->block[0].src_stride 
      ); | 
| 556 | 548 | 
| 557     // Fdct and building the 2nd order block | 549     // Fdct and building the 2nd order block | 
| 558     for (beptr = mb->block; beptr < mb->block + 16; beptr += 2) | 550     for (beptr = mb->block; beptr < mb->block + 16; beptr += 2) | 
| 559     { | 551     { | 
| 560         mb->vp8_short_fdct8x4(beptr->src_diff, beptr->coeff, 32); | 552         mb->vp8_short_fdct8x4(beptr->src_diff, beptr->coeff, 32); | 
| 561         *Y2DCPtr++ = beptr->coeff[0]; | 553         *Y2DCPtr++ = beptr->coeff[0]; | 
| 562         *Y2DCPtr++ = beptr->coeff[16]; | 554         *Y2DCPtr++ = beptr->coeff[16]; | 
| 563     } | 555     } | 
| 564 | 556 | 
| 565     // 2nd order fdct | 557     // 2nd order fdct | 
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 622     DECLARE_ALIGNED_ARRAY(16, unsigned char,  best_predictor, 16*4); | 614     DECLARE_ALIGNED_ARRAY(16, unsigned char,  best_predictor, 16*4); | 
| 623     DECLARE_ALIGNED_ARRAY(16, short, best_dqcoeff, 16); | 615     DECLARE_ALIGNED_ARRAY(16, short, best_dqcoeff, 16); | 
| 624 | 616 | 
| 625     for (mode = B_DC_PRED; mode <= B_HU_PRED; mode++) | 617     for (mode = B_DC_PRED; mode <= B_HU_PRED; mode++) | 
| 626     { | 618     { | 
| 627         int this_rd; | 619         int this_rd; | 
| 628         int ratey; | 620         int ratey; | 
| 629 | 621 | 
| 630         rate = bmode_costs[mode]; | 622         rate = bmode_costs[mode]; | 
| 631 | 623 | 
| 632         vp8_predict_intra4x4(b, mode, b->predictor); | 624         RECON_INVOKE(&cpi->rtcd.common->recon, intra4x4_predict) | 
|  | 625                      (b, mode, b->predictor); | 
| 633         ENCODEMB_INVOKE(IF_RTCD(&cpi->rtcd.encodemb), subb)(be, b, 16); | 626         ENCODEMB_INVOKE(IF_RTCD(&cpi->rtcd.encodemb), subb)(be, b, 16); | 
| 634         x->vp8_short_fdct4x4(be->src_diff, be->coeff, 32); | 627         x->vp8_short_fdct4x4(be->src_diff, be->coeff, 32); | 
| 635         x->quantize_b(be, b); | 628         x->quantize_b(be, b); | 
| 636 | 629 | 
| 637         tempa = ta; | 630         tempa = ta; | 
| 638         templ = tl; | 631         templ = tl; | 
| 639 | 632 | 
| 640         ratey = cost_coeffs(x, b, PLANE_TYPE_Y_WITH_DC, &tempa, &templ); | 633         ratey = cost_coeffs(x, b, PLANE_TYPE_Y_WITH_DC, &tempa, &templ); | 
| 641         rate += ratey; | 634         rate += ratey; | 
| 642         distortion = ENCODEMB_INVOKE(IF_RTCD(&cpi->rtcd.encodemb), berr)(be->coe
      ff, b->dqcoeff) >> 2; | 635         distortion = ENCODEMB_INVOKE(IF_RTCD(&cpi->rtcd.encodemb), berr)(be->coe
      ff, b->dqcoeff) >> 2; | 
| 643 | 636 | 
| 644         this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion); | 637         this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion); | 
| 645 | 638 | 
| 646         if (this_rd < best_rd) | 639         if (this_rd < best_rd) | 
| 647         { | 640         { | 
| 648             *bestrate = rate; | 641             *bestrate = rate; | 
| 649             *bestratey = ratey; | 642             *bestratey = ratey; | 
| 650             *bestdistortion = distortion; | 643             *bestdistortion = distortion; | 
| 651             best_rd = this_rd; | 644             best_rd = this_rd; | 
| 652             *best_mode = mode; | 645             *best_mode = mode; | 
| 653             *a = tempa; | 646             *a = tempa; | 
| 654             *l = templ; | 647             *l = templ; | 
| 655             copy_predictor(best_predictor, b->predictor); | 648             copy_predictor(best_predictor, b->predictor); | 
| 656             vpx_memcpy(best_dqcoeff, b->dqcoeff, 32); | 649             vpx_memcpy(best_dqcoeff, b->dqcoeff, 32); | 
| 657         } | 650         } | 
| 658     } | 651     } | 
| 659 | 652     b->bmi.as_mode = (B_PREDICTION_MODE)(*best_mode); | 
| 660     b->bmi.mode = (B_PREDICTION_MODE)(*best_mode); |  | 
| 661 | 653 | 
| 662     IDCT_INVOKE(IF_RTCD(&cpi->rtcd.common->idct), idct16)(best_dqcoeff, b->diff,
       32); | 654     IDCT_INVOKE(IF_RTCD(&cpi->rtcd.common->idct), idct16)(best_dqcoeff, b->diff,
       32); | 
| 663     RECON_INVOKE(IF_RTCD(&cpi->rtcd.common->recon), recon)(best_predictor, b->di
      ff, *(b->base_dst) + b->dst, b->dst_stride); | 655     RECON_INVOKE(IF_RTCD(&cpi->rtcd.common->recon), recon)(best_predictor, b->di
      ff, *(b->base_dst) + b->dst, b->dst_stride); | 
| 664 | 656 | 
| 665     return best_rd; | 657     return best_rd; | 
| 666 } | 658 } | 
| 667 | 659 | 
| 668 int vp8_rd_pick_intra4x4mby_modes(VP8_COMP *cpi, MACROBLOCK *mb, int *Rate, | 660 static int rd_pick_intra4x4mby_modes(VP8_COMP *cpi, MACROBLOCK *mb, int *Rate, | 
| 669                                   int *rate_y, int *Distortion, int best_rd) | 661                                      int *rate_y, int *Distortion, int best_rd) | 
| 670 { | 662 { | 
| 671     MACROBLOCKD *const xd = &mb->e_mbd; | 663     MACROBLOCKD *const xd = &mb->e_mbd; | 
| 672     int i; | 664     int i; | 
| 673     int cost = mb->mbmode_cost [xd->frame_type] [B_PRED]; | 665     int cost = mb->mbmode_cost [xd->frame_type] [B_PRED]; | 
| 674     int distortion = 0; | 666     int distortion = 0; | 
| 675     int tot_rate_y = 0; | 667     int tot_rate_y = 0; | 
| 676     long long total_rd = 0; | 668     int64_t total_rd = 0; | 
| 677     ENTROPY_CONTEXT_PLANES t_above, t_left; | 669     ENTROPY_CONTEXT_PLANES t_above, t_left; | 
| 678     ENTROPY_CONTEXT *ta; | 670     ENTROPY_CONTEXT *ta; | 
| 679     ENTROPY_CONTEXT *tl; | 671     ENTROPY_CONTEXT *tl; | 
| 680     unsigned int *bmode_costs; | 672     unsigned int *bmode_costs; | 
| 681 | 673 | 
| 682     vpx_memcpy(&t_above, mb->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES)
      ); | 674     vpx_memcpy(&t_above, mb->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES)
      ); | 
| 683     vpx_memcpy(&t_left, mb->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES)); | 675     vpx_memcpy(&t_left, mb->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES)); | 
| 684 | 676 | 
| 685     ta = (ENTROPY_CONTEXT *)&t_above; | 677     ta = (ENTROPY_CONTEXT *)&t_above; | 
| 686     tl = (ENTROPY_CONTEXT *)&t_left; | 678     tl = (ENTROPY_CONTEXT *)&t_left; | 
| 687 | 679 | 
| 688     vp8_intra_prediction_down_copy(xd); | 680     vp8_intra_prediction_down_copy(xd); | 
| 689 | 681 | 
| 690     bmode_costs = mb->inter_bmode_costs; | 682     bmode_costs = mb->inter_bmode_costs; | 
| 691 | 683 | 
| 692     for (i = 0; i < 16; i++) | 684     for (i = 0; i < 16; i++) | 
| 693     { | 685     { | 
| 694         MODE_INFO *const mic = xd->mode_info_context; | 686         MODE_INFO *const mic = xd->mode_info_context; | 
| 695         const int mis = xd->mode_info_stride; | 687         const int mis = xd->mode_info_stride; | 
| 696         B_PREDICTION_MODE UNINITIALIZED_IS_SAFE(best_mode); | 688         B_PREDICTION_MODE UNINITIALIZED_IS_SAFE(best_mode); | 
| 697         int UNINITIALIZED_IS_SAFE(r), UNINITIALIZED_IS_SAFE(ry), UNINITIALIZED_I
      S_SAFE(d); | 689         int UNINITIALIZED_IS_SAFE(r), UNINITIALIZED_IS_SAFE(ry), UNINITIALIZED_I
      S_SAFE(d); | 
| 698 | 690 | 
| 699         if (mb->e_mbd.frame_type == KEY_FRAME) | 691         if (mb->e_mbd.frame_type == KEY_FRAME) | 
| 700         { | 692         { | 
| 701             const B_PREDICTION_MODE A = vp8_above_bmi(mic, i, mis)->mode; | 693             const B_PREDICTION_MODE A = above_block_mode(mic, i, mis); | 
| 702             const B_PREDICTION_MODE L = vp8_left_bmi(mic, i)->mode; | 694             const B_PREDICTION_MODE L = left_block_mode(mic, i); | 
| 703 | 695 | 
| 704             bmode_costs  = mb->bmode_costs[A][L]; | 696             bmode_costs  = mb->bmode_costs[A][L]; | 
| 705         } | 697         } | 
| 706 | 698 | 
| 707         total_rd += rd_pick_intra4x4block( | 699         total_rd += rd_pick_intra4x4block( | 
| 708             cpi, mb, mb->block + i, xd->block + i, &best_mode, bmode_costs, | 700             cpi, mb, mb->block + i, xd->block + i, &best_mode, bmode_costs, | 
| 709             ta + vp8_block2above[i], | 701             ta + vp8_block2above[i], | 
| 710             tl + vp8_block2left[i], &r, &ry, &d); | 702             tl + vp8_block2left[i], &r, &ry, &d); | 
| 711 | 703 | 
| 712         cost += r; | 704         cost += r; | 
| 713         distortion += d; | 705         distortion += d; | 
| 714         tot_rate_y += ry; | 706         tot_rate_y += ry; | 
| 715         mic->bmi[i].mode = xd->block[i].bmi.mode = best_mode; |  | 
| 716 | 707 | 
| 717         if(total_rd >= (long long)best_rd) | 708         mic->bmi[i].as_mode = best_mode; | 
|  | 709 | 
|  | 710         if(total_rd >= (int64_t)best_rd) | 
| 718             break; | 711             break; | 
| 719     } | 712     } | 
| 720 | 713 | 
| 721     if(total_rd >= (long long)best_rd) | 714     if(total_rd >= (int64_t)best_rd) | 
| 722         return INT_MAX; | 715         return INT_MAX; | 
| 723 | 716 | 
| 724     *Rate = cost; | 717     *Rate = cost; | 
| 725     *rate_y += tot_rate_y; | 718     *rate_y += tot_rate_y; | 
| 726     *Distortion = distortion; | 719     *Distortion = distortion; | 
| 727 | 720 | 
| 728     return RDCOST(mb->rdmult, mb->rddiv, cost, distortion); | 721     return RDCOST(mb->rdmult, mb->rddiv, cost, distortion); | 
| 729 } | 722 } | 
| 730 int vp8_rd_pick_intra16x16mby_mode(VP8_COMP *cpi, | 723 | 
| 731                                    MACROBLOCK *x, | 724 | 
| 732                                    int *Rate, | 725 static int rd_pick_intra16x16mby_mode(VP8_COMP *cpi, | 
| 733                                    int *rate_y, | 726                                       MACROBLOCK *x, | 
| 734                                    int *Distortion) | 727                                       int *Rate, | 
|  | 728                                       int *rate_y, | 
|  | 729                                       int *Distortion) | 
| 735 { | 730 { | 
| 736     MB_PREDICTION_MODE mode; | 731     MB_PREDICTION_MODE mode; | 
| 737     MB_PREDICTION_MODE UNINITIALIZED_IS_SAFE(mode_selected); | 732     MB_PREDICTION_MODE UNINITIALIZED_IS_SAFE(mode_selected); | 
| 738     int rate, ratey; | 733     int rate, ratey; | 
| 739     int distortion; | 734     int distortion; | 
| 740     int best_rd = INT_MAX; | 735     int best_rd = INT_MAX; | 
| 741     int this_rd; | 736     int this_rd; | 
| 742 | 737 | 
| 743     //Y Search for 16x16 intra prediction mode | 738     //Y Search for 16x16 intra prediction mode | 
| 744     for (mode = DC_PRED; mode <= TM_PRED; mode++) | 739     for (mode = DC_PRED; mode <= TM_PRED; mode++) | 
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 796     vp8_build_uvmvs(&x->e_mbd, fullpixel); | 791     vp8_build_uvmvs(&x->e_mbd, fullpixel); | 
| 797     vp8_encode_inter16x16uvrd(IF_RTCD(&cpi->rtcd), x); | 792     vp8_encode_inter16x16uvrd(IF_RTCD(&cpi->rtcd), x); | 
| 798 | 793 | 
| 799 | 794 | 
| 800     *rate       = rd_cost_mbuv(x); | 795     *rate       = rd_cost_mbuv(x); | 
| 801     *distortion = ENCODEMB_INVOKE(&cpi->rtcd.encodemb, mbuverr)(x) / 4; | 796     *distortion = ENCODEMB_INVOKE(&cpi->rtcd.encodemb, mbuverr)(x) / 4; | 
| 802 | 797 | 
| 803     return RDCOST(x->rdmult, x->rddiv, *rate, *distortion); | 798     return RDCOST(x->rdmult, x->rddiv, *rate, *distortion); | 
| 804 } | 799 } | 
| 805 | 800 | 
| 806 int vp8_rd_pick_intra_mbuv_mode(VP8_COMP *cpi, MACROBLOCK *x, int *rate, int *ra
      te_tokenonly, int *distortion) | 801 static void rd_pick_intra_mbuv_mode(VP8_COMP *cpi, MACROBLOCK *x, int *rate, int
       *rate_tokenonly, int *distortion) | 
| 807 { | 802 { | 
| 808     MB_PREDICTION_MODE mode; | 803     MB_PREDICTION_MODE mode; | 
| 809     MB_PREDICTION_MODE UNINITIALIZED_IS_SAFE(mode_selected); | 804     MB_PREDICTION_MODE UNINITIALIZED_IS_SAFE(mode_selected); | 
| 810     int best_rd = INT_MAX; | 805     int best_rd = INT_MAX; | 
| 811     int UNINITIALIZED_IS_SAFE(d), UNINITIALIZED_IS_SAFE(r); | 806     int UNINITIALIZED_IS_SAFE(d), UNINITIALIZED_IS_SAFE(r); | 
| 812     int rate_to; | 807     int rate_to; | 
| 813 | 808 | 
| 814     for (mode = DC_PRED; mode <= TM_PRED; mode++) | 809     for (mode = DC_PRED; mode <= TM_PRED; mode++) | 
| 815     { | 810     { | 
| 816         int rate; | 811         int rate; | 
| 817         int distortion; | 812         int distortion; | 
| 818         int this_rd; | 813         int this_rd; | 
| 819 | 814 | 
| 820         x->e_mbd.mode_info_context->mbmi.uv_mode = mode; | 815         x->e_mbd.mode_info_context->mbmi.uv_mode = mode; | 
| 821         vp8_build_intra_predictors_mbuv(&x->e_mbd); | 816         RECON_INVOKE(&cpi->rtcd.common->recon, build_intra_predictors_mbuv) | 
|  | 817                      (&x->e_mbd); | 
| 822         ENCODEMB_INVOKE(IF_RTCD(&cpi->rtcd.encodemb), submbuv)(x->src_diff, | 818         ENCODEMB_INVOKE(IF_RTCD(&cpi->rtcd.encodemb), submbuv)(x->src_diff, | 
| 823                       x->src.u_buffer, x->src.v_buffer, x->e_mbd.predictor, | 819                       x->src.u_buffer, x->src.v_buffer, x->e_mbd.predictor, | 
| 824                       x->src.uv_stride); | 820                       x->src.uv_stride); | 
| 825         vp8_transform_mbuv(x); | 821         vp8_transform_mbuv(x); | 
| 826         vp8_quantize_mbuv(x); | 822         vp8_quantize_mbuv(x); | 
| 827 | 823 | 
| 828         rate_to = rd_cost_mbuv(x); | 824         rate_to = rd_cost_mbuv(x); | 
| 829         rate = rate_to + x->intra_uv_mode_cost[x->e_mbd.frame_type][x->e_mbd.mod
      e_info_context->mbmi.uv_mode]; | 825         rate = rate_to + x->intra_uv_mode_cost[x->e_mbd.frame_type][x->e_mbd.mod
      e_info_context->mbmi.uv_mode]; | 
| 830 | 826 | 
| 831         distortion = ENCODEMB_INVOKE(&cpi->rtcd.encodemb, mbuverr)(x) / 4; | 827         distortion = ENCODEMB_INVOKE(&cpi->rtcd.encodemb, mbuverr)(x) / 4; | 
| 832 | 828 | 
| 833         this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion); | 829         this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion); | 
| 834 | 830 | 
| 835         if (this_rd < best_rd) | 831         if (this_rd < best_rd) | 
| 836         { | 832         { | 
| 837             best_rd = this_rd; | 833             best_rd = this_rd; | 
| 838             d = distortion; | 834             d = distortion; | 
| 839             r = rate; | 835             r = rate; | 
| 840             *rate_tokenonly = rate_to; | 836             *rate_tokenonly = rate_to; | 
| 841             mode_selected = mode; | 837             mode_selected = mode; | 
| 842         } | 838         } | 
| 843     } | 839     } | 
| 844 | 840 | 
| 845     *rate = r; | 841     *rate = r; | 
| 846     *distortion = d; | 842     *distortion = d; | 
| 847 | 843 | 
| 848     x->e_mbd.mode_info_context->mbmi.uv_mode = mode_selected; | 844     x->e_mbd.mode_info_context->mbmi.uv_mode = mode_selected; | 
| 849     return best_rd; |  | 
| 850 } | 845 } | 
| 851 #endif |  | 
| 852 | 846 | 
| 853 int vp8_cost_mv_ref(MB_PREDICTION_MODE m, const int near_mv_ref_ct[4]) | 847 int vp8_cost_mv_ref(MB_PREDICTION_MODE m, const int near_mv_ref_ct[4]) | 
| 854 { | 848 { | 
| 855     vp8_prob p [VP8_MVREFS-1]; | 849     vp8_prob p [VP8_MVREFS-1]; | 
| 856     assert(NEARESTMV <= m  &&  m <= SPLITMV); | 850     assert(NEARESTMV <= m  &&  m <= SPLITMV); | 
| 857     vp8_mv_ref_probs(p, near_mv_ref_ct); | 851     vp8_mv_ref_probs(p, near_mv_ref_ct); | 
| 858     return vp8_cost_token(vp8_mv_ref_tree, p, | 852     return vp8_cost_token(vp8_mv_ref_tree, p, | 
| 859                           vp8_mv_ref_encoding_array - NEARESTMV + m); | 853                           vp8_mv_ref_encoding_array - NEARESTMV + m); | 
| 860 } | 854 } | 
| 861 | 855 | 
| 862 void vp8_set_mbmode_and_mvs(MACROBLOCK *x, MB_PREDICTION_MODE mb, MV *mv) | 856 void vp8_set_mbmode_and_mvs(MACROBLOCK *x, MB_PREDICTION_MODE mb, int_mv *mv) | 
| 863 { | 857 { | 
| 864     int i; |  | 
| 865 |  | 
| 866     x->e_mbd.mode_info_context->mbmi.mode = mb; | 858     x->e_mbd.mode_info_context->mbmi.mode = mb; | 
| 867     x->e_mbd.mode_info_context->mbmi.mv.as_mv.row = mv->row; | 859     x->e_mbd.mode_info_context->mbmi.mv.as_int = mv->as_int; | 
| 868     x->e_mbd.mode_info_context->mbmi.mv.as_mv.col = mv->col; |  | 
| 869 |  | 
| 870     for (i = 0; i < 16; i++) |  | 
| 871     { |  | 
| 872         B_MODE_INFO *bmi = &x->e_mbd.block[i].bmi; |  | 
| 873         bmi->mode = (B_PREDICTION_MODE) mb; |  | 
| 874         bmi->mv.as_mv.row = mv->row; |  | 
| 875         bmi->mv.as_mv.col = mv->col; |  | 
| 876     } |  | 
| 877 } | 860 } | 
| 878 | 861 | 
| 879 #if !(CONFIG_REALTIME_ONLY) |  | 
| 880 static int labels2mode( | 862 static int labels2mode( | 
| 881     MACROBLOCK *x, | 863     MACROBLOCK *x, | 
| 882     int const *labelings, int which_label, | 864     int const *labelings, int which_label, | 
| 883     B_PREDICTION_MODE this_mode, | 865     B_PREDICTION_MODE this_mode, | 
| 884     MV *this_mv, MV *best_ref_mv, | 866     int_mv *this_mv, int_mv *best_ref_mv, | 
| 885     int *mvcost[2] | 867     int *mvcost[2] | 
| 886 ) | 868 ) | 
| 887 { | 869 { | 
| 888     MACROBLOCKD *const xd = & x->e_mbd; | 870     MACROBLOCKD *const xd = & x->e_mbd; | 
| 889     MODE_INFO *const mic = xd->mode_info_context; | 871     MODE_INFO *const mic = xd->mode_info_context; | 
| 890     const int mis = xd->mode_info_stride; | 872     const int mis = xd->mode_info_stride; | 
| 891 | 873 | 
| 892     int cost = 0; | 874     int cost = 0; | 
| 893     int thismvcost = 0; | 875     int thismvcost = 0; | 
| 894 | 876 | 
| (...skipping 20 matching lines...) Expand all  Loading... | 
| 915         else | 897         else | 
| 916         { | 898         { | 
| 917             // the only time we should do costing for new motion vector or mode | 899             // the only time we should do costing for new motion vector or mode | 
| 918             // is when we are on a new label  (jbb May 08, 2007) | 900             // is when we are on a new label  (jbb May 08, 2007) | 
| 919             switch (m = this_mode) | 901             switch (m = this_mode) | 
| 920             { | 902             { | 
| 921             case NEW4X4 : | 903             case NEW4X4 : | 
| 922                 thismvcost  = vp8_mv_bit_cost(this_mv, best_ref_mv, mvcost, 102)
      ; | 904                 thismvcost  = vp8_mv_bit_cost(this_mv, best_ref_mv, mvcost, 102)
      ; | 
| 923                 break; | 905                 break; | 
| 924             case LEFT4X4: | 906             case LEFT4X4: | 
| 925                 *this_mv = col ? d[-1].bmi.mv.as_mv : vp8_left_bmi(mic, i)->mv.a
      s_mv; | 907                 this_mv->as_int = col ? d[-1].bmi.mv.as_int : left_block_mv(mic,
       i); | 
| 926                 break; | 908                 break; | 
| 927             case ABOVE4X4: | 909             case ABOVE4X4: | 
| 928                 *this_mv = row ? d[-4].bmi.mv.as_mv : vp8_above_bmi(mic, i, mis)
      ->mv.as_mv; | 910                 this_mv->as_int = row ? d[-4].bmi.mv.as_int : above_block_mv(mic
      , i, mis); | 
| 929                 break; | 911                 break; | 
| 930             case ZERO4X4: | 912             case ZERO4X4: | 
| 931                 this_mv->row = this_mv->col = 0; | 913                 this_mv->as_int = 0; | 
| 932                 break; | 914                 break; | 
| 933             default: | 915             default: | 
| 934                 break; | 916                 break; | 
| 935             } | 917             } | 
| 936 | 918 | 
| 937             if (m == ABOVE4X4)  // replace above with left if same | 919             if (m == ABOVE4X4)  // replace above with left if same | 
| 938             { | 920             { | 
| 939                 const MV mv = col ? d[-1].bmi.mv.as_mv : vp8_left_bmi(mic, i)->m
      v.as_mv; | 921                 int_mv left_mv; | 
| 940 | 922 | 
| 941                 if (mv.row == this_mv->row  &&  mv.col == this_mv->col) | 923                 left_mv.as_int = col ? d[-1].bmi.mv.as_int : | 
|  | 924                                         left_block_mv(mic, i); | 
|  | 925 | 
|  | 926                 if (left_mv.as_int == this_mv->as_int) | 
| 942                     m = LEFT4X4; | 927                     m = LEFT4X4; | 
| 943             } | 928             } | 
| 944 | 929 | 
| 945             cost = x->inter_bmode_costs[ m]; | 930             cost = x->inter_bmode_costs[ m]; | 
| 946         } | 931         } | 
| 947 | 932 | 
| 948         d->bmi.mode = m; | 933         d->bmi.mv.as_int = this_mv->as_int; | 
| 949         d->bmi.mv.as_mv = *this_mv; | 934 | 
|  | 935         x->partition_info->bmi[i].mode = m; | 
|  | 936         x->partition_info->bmi[i].mv.as_int = this_mv->as_int; | 
| 950 | 937 | 
| 951     } | 938     } | 
| 952     while (++i < 16); | 939     while (++i < 16); | 
| 953 | 940 | 
| 954     cost += thismvcost ; | 941     cost += thismvcost ; | 
| 955     return cost; | 942     return cost; | 
| 956 } | 943 } | 
| 957 | 944 | 
| 958 static int rdcost_mbsegment_y(MACROBLOCK *mb, const int *labels, | 945 static int rdcost_mbsegment_y(MACROBLOCK *mb, const int *labels, | 
| 959                               int which_label, ENTROPY_CONTEXT *ta, | 946                               int which_label, ENTROPY_CONTEXT *ta, | 
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 999 | 986 | 
| 1000     return distortion; | 987     return distortion; | 
| 1001 } | 988 } | 
| 1002 | 989 | 
| 1003 | 990 | 
| 1004 static const unsigned int segmentation_to_sseshift[4] = {3, 3, 2, 0}; | 991 static const unsigned int segmentation_to_sseshift[4] = {3, 3, 2, 0}; | 
| 1005 | 992 | 
| 1006 | 993 | 
| 1007 typedef struct | 994 typedef struct | 
| 1008 { | 995 { | 
| 1009   MV *ref_mv; | 996   int_mv *ref_mv; | 
| 1010   MV *mvp; | 997   int_mv mvp; | 
| 1011 | 998 | 
| 1012   int segment_rd; | 999   int segment_rd; | 
| 1013   int segment_num; | 1000   int segment_num; | 
| 1014   int r; | 1001   int r; | 
| 1015   int d; | 1002   int d; | 
| 1016   int segment_yrate; | 1003   int segment_yrate; | 
| 1017   B_PREDICTION_MODE modes[16]; | 1004   B_PREDICTION_MODE modes[16]; | 
| 1018   int_mv mvs[16]; | 1005   int_mv mvs[16]; | 
| 1019   unsigned char eobs[16]; | 1006   unsigned char eobs[16]; | 
| 1020 | 1007 | 
| 1021   int mvthresh; | 1008   int mvthresh; | 
| 1022   int *mdcounts; | 1009   int *mdcounts; | 
| 1023 | 1010 | 
| 1024   MV sv_mvp[4];     // save 4 mvp from 8x8 | 1011   int_mv sv_mvp[4];     // save 4 mvp from 8x8 | 
| 1025   int sv_istep[2];  // save 2 initial step_param for 16x8/8x16 | 1012   int sv_istep[2];  // save 2 initial step_param for 16x8/8x16 | 
| 1026 | 1013 | 
| 1027 } BEST_SEG_INFO; | 1014 } BEST_SEG_INFO; | 
| 1028 | 1015 | 
| 1029 | 1016 | 
| 1030 static void rd_check_segment(VP8_COMP *cpi, MACROBLOCK *x, | 1017 static void rd_check_segment(VP8_COMP *cpi, MACROBLOCK *x, | 
| 1031                              BEST_SEG_INFO *bsi, unsigned int segmentation) | 1018                              BEST_SEG_INFO *bsi, unsigned int segmentation) | 
| 1032 { | 1019 { | 
| 1033     int i; | 1020     int i; | 
| 1034     int const *labels; | 1021     int const *labels; | 
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1076     label_mv_thresh = 1 * bsi->mvthresh / label_count ; | 1063     label_mv_thresh = 1 * bsi->mvthresh / label_count ; | 
| 1077 | 1064 | 
| 1078     // Segmentation method overheads | 1065     // Segmentation method overheads | 
| 1079     rate = vp8_cost_token(vp8_mbsplit_tree, vp8_mbsplit_probs, vp8_mbsplit_encod
      ings + segmentation); | 1066     rate = vp8_cost_token(vp8_mbsplit_tree, vp8_mbsplit_probs, vp8_mbsplit_encod
      ings + segmentation); | 
| 1080     rate += vp8_cost_mv_ref(SPLITMV, bsi->mdcounts); | 1067     rate += vp8_cost_mv_ref(SPLITMV, bsi->mdcounts); | 
| 1081     this_segment_rd += RDCOST(x->rdmult, x->rddiv, rate, 0); | 1068     this_segment_rd += RDCOST(x->rdmult, x->rddiv, rate, 0); | 
| 1082     br += rate; | 1069     br += rate; | 
| 1083 | 1070 | 
| 1084     for (i = 0; i < label_count; i++) | 1071     for (i = 0; i < label_count; i++) | 
| 1085     { | 1072     { | 
| 1086         MV mode_mv[B_MODE_COUNT]; | 1073         int_mv mode_mv[B_MODE_COUNT]; | 
| 1087         int best_label_rd = INT_MAX; | 1074         int best_label_rd = INT_MAX; | 
| 1088         B_PREDICTION_MODE mode_selected = ZERO4X4; | 1075         B_PREDICTION_MODE mode_selected = ZERO4X4; | 
| 1089         int bestlabelyrate = 0; | 1076         int bestlabelyrate = 0; | 
| 1090 | 1077 | 
| 1091         // search for the best motion vector on this segment | 1078         // search for the best motion vector on this segment | 
| 1092         for (this_mode = LEFT4X4; this_mode <= NEW4X4 ; this_mode ++) | 1079         for (this_mode = LEFT4X4; this_mode <= NEW4X4 ; this_mode ++) | 
| 1093         { | 1080         { | 
| 1094             int this_rd; | 1081             int this_rd; | 
| 1095             int distortion; | 1082             int distortion; | 
| 1096             int labelyrate; | 1083             int labelyrate; | 
| 1097             ENTROPY_CONTEXT_PLANES t_above_s, t_left_s; | 1084             ENTROPY_CONTEXT_PLANES t_above_s, t_left_s; | 
| 1098             ENTROPY_CONTEXT *ta_s; | 1085             ENTROPY_CONTEXT *ta_s; | 
| 1099             ENTROPY_CONTEXT *tl_s; | 1086             ENTROPY_CONTEXT *tl_s; | 
| 1100 | 1087 | 
| 1101             vpx_memcpy(&t_above_s, &t_above, sizeof(ENTROPY_CONTEXT_PLANES)); | 1088             vpx_memcpy(&t_above_s, &t_above, sizeof(ENTROPY_CONTEXT_PLANES)); | 
| 1102             vpx_memcpy(&t_left_s, &t_left, sizeof(ENTROPY_CONTEXT_PLANES)); | 1089             vpx_memcpy(&t_left_s, &t_left, sizeof(ENTROPY_CONTEXT_PLANES)); | 
| 1103 | 1090 | 
| 1104             ta_s = (ENTROPY_CONTEXT *)&t_above_s; | 1091             ta_s = (ENTROPY_CONTEXT *)&t_above_s; | 
| 1105             tl_s = (ENTROPY_CONTEXT *)&t_left_s; | 1092             tl_s = (ENTROPY_CONTEXT *)&t_left_s; | 
| 1106 | 1093 | 
| 1107             if (this_mode == NEW4X4) | 1094             if (this_mode == NEW4X4) | 
| 1108             { | 1095             { | 
| 1109                 int sseshift; | 1096                 int sseshift; | 
| 1110                 int num00; | 1097                 int num00; | 
| 1111                 int step_param = 0; | 1098                 int step_param = 0; | 
| 1112                 int further_steps; | 1099                 int further_steps; | 
| 1113                 int n; | 1100                 int n; | 
| 1114                 int thissme; | 1101                 int thissme; | 
| 1115                 int bestsme = INT_MAX; | 1102                 int bestsme = INT_MAX; | 
| 1116                 MV  temp_mv; | 1103                 int_mv  temp_mv; | 
| 1117                 BLOCK *c; | 1104                 BLOCK *c; | 
| 1118                 BLOCKD *e; | 1105                 BLOCKD *e; | 
| 1119 | 1106 | 
| 1120                 // Is the best so far sufficiently good that we cant justify doi
      ng and new motion search. | 1107                 // Is the best so far sufficiently good that we cant justify doi
      ng and new motion search. | 
| 1121                 if (best_label_rd < label_mv_thresh) | 1108                 if (best_label_rd < label_mv_thresh) | 
| 1122                     break; | 1109                     break; | 
| 1123 | 1110 | 
| 1124                 if(cpi->compressor_speed) | 1111                 if(cpi->compressor_speed) | 
| 1125                 { | 1112                 { | 
| 1126                     if (segmentation == BLOCK_8X16 || segmentation == BLOCK_16X8
      ) | 1113                     if (segmentation == BLOCK_8X16 || segmentation == BLOCK_16X8
      ) | 
| 1127                     { | 1114                     { | 
| 1128                         bsi->mvp = &bsi->sv_mvp[i]; | 1115                         bsi->mvp.as_int = bsi->sv_mvp[i].as_int; | 
| 1129                         if (i==1 && segmentation == BLOCK_16X8) bsi->mvp = &bsi-
      >sv_mvp[2]; | 1116                         if (i==1 && segmentation == BLOCK_16X8) | 
|  | 1117                           bsi->mvp.as_int = bsi->sv_mvp[2].as_int; | 
| 1130 | 1118 | 
| 1131                         step_param = bsi->sv_istep[i]; | 1119                         step_param = bsi->sv_istep[i]; | 
| 1132                     } | 1120                     } | 
| 1133 | 1121 | 
| 1134                     // use previous block's result as next block's MV predictor. | 1122                     // use previous block's result as next block's MV predictor. | 
| 1135                     if (segmentation == BLOCK_4X4 && i>0) | 1123                     if (segmentation == BLOCK_4X4 && i>0) | 
| 1136                     { | 1124                     { | 
| 1137                         bsi->mvp = &(x->e_mbd.block[i-1].bmi.mv.as_mv); | 1125                         bsi->mvp.as_int = x->e_mbd.block[i-1].bmi.mv.as_int; | 
| 1138                         if (i==4 || i==8 || i==12) bsi->mvp = &(x->e_mbd.block[i
      -4].bmi.mv.as_mv); | 1126                         if (i==4 || i==8 || i==12) | 
|  | 1127                             bsi->mvp.as_int = x->e_mbd.block[i-4].bmi.mv.as_int; | 
| 1139                         step_param = 2; | 1128                         step_param = 2; | 
| 1140                     } | 1129                     } | 
| 1141                 } | 1130                 } | 
| 1142 | 1131 | 
| 1143                 further_steps = (MAX_MVSEARCH_STEPS - 1) - step_param; | 1132                 further_steps = (MAX_MVSEARCH_STEPS - 1) - step_param; | 
| 1144 | 1133 | 
| 1145                 { | 1134                 { | 
| 1146                     int sadpb = x->sadperbit4; | 1135                     int sadpb = x->sadperbit4; | 
|  | 1136                     int_mv mvp_full; | 
|  | 1137 | 
|  | 1138                     mvp_full.as_mv.row = bsi->mvp.as_mv.row >>3; | 
|  | 1139                     mvp_full.as_mv.col = bsi->mvp.as_mv.col >>3; | 
| 1147 | 1140 | 
| 1148                     // find first label | 1141                     // find first label | 
| 1149                     n = vp8_mbsplit_offset[segmentation][i]; | 1142                     n = vp8_mbsplit_offset[segmentation][i]; | 
| 1150 | 1143 | 
| 1151                     c = &x->block[n]; | 1144                     c = &x->block[n]; | 
| 1152                     e = &x->e_mbd.block[n]; | 1145                     e = &x->e_mbd.block[n]; | 
| 1153 | 1146 | 
| 1154                     if (cpi->sf.search_method == HEX) |  | 
| 1155                         bestsme = vp8_hex_search(x, c, e, bsi->ref_mv, |  | 
| 1156                                                  &mode_mv[NEW4X4], step_param, s
      adpb, &num00, v_fn_ptr, x->mvsadcost, x->mvcost, bsi->ref_mv); |  | 
| 1157 |  | 
| 1158                     else |  | 
| 1159                     { | 1147                     { | 
| 1160                         bestsme = cpi->diamond_search_sad(x, c, e, bsi->mvp, | 1148                         bestsme = cpi->diamond_search_sad(x, c, e, &mvp_full, | 
| 1161                                                           &mode_mv[NEW4X4], step
      _param, | 1149                                                 &mode_mv[NEW4X4], step_param, | 
| 1162                                                           sadpb / 2, &num00, v_f
      n_ptr, x->mvsadcost, x->mvcost, bsi->ref_mv); | 1150                                                 sadpb, &num00, v_fn_ptr, | 
|  | 1151                                                 x->mvcost, bsi->ref_mv); | 
| 1163 | 1152 | 
| 1164                         n = num00; | 1153                         n = num00; | 
| 1165                         num00 = 0; | 1154                         num00 = 0; | 
| 1166 | 1155 | 
| 1167                         while (n < further_steps) | 1156                         while (n < further_steps) | 
| 1168                         { | 1157                         { | 
| 1169                             n++; | 1158                             n++; | 
| 1170 | 1159 | 
| 1171                             if (num00) | 1160                             if (num00) | 
| 1172                                 num00--; | 1161                                 num00--; | 
| 1173                             else | 1162                             else | 
| 1174                             { | 1163                             { | 
| 1175                                 thissme = cpi->diamond_search_sad(x, c, e, bsi->
      mvp, | 1164                                 thissme = cpi->diamond_search_sad(x, c, e, | 
| 1176                                                                   &temp_mv, step
      _param + n, | 1165                                                     &mvp_full, &temp_mv, | 
| 1177                                                                   sadpb / 2, &nu
      m00, v_fn_ptr, x->mvsadcost, x->mvcost, bsi->ref_mv); | 1166                                                     step_param + n, sadpb, | 
|  | 1167                                                     &num00, v_fn_ptr, | 
|  | 1168                                                     x->mvcost, bsi->ref_mv); | 
| 1178 | 1169 | 
| 1179                                 if (thissme < bestsme) | 1170                                 if (thissme < bestsme) | 
| 1180                                 { | 1171                                 { | 
| 1181                                     bestsme = thissme; | 1172                                     bestsme = thissme; | 
| 1182                                     mode_mv[NEW4X4].row = temp_mv.row; | 1173                                     mode_mv[NEW4X4].as_int = temp_mv.as_int; | 
| 1183                                     mode_mv[NEW4X4].col = temp_mv.col; |  | 
| 1184                                 } | 1174                                 } | 
| 1185                             } | 1175                             } | 
| 1186                         } | 1176                         } | 
| 1187                     } | 1177                     } | 
| 1188 | 1178 | 
| 1189                     sseshift = segmentation_to_sseshift[segmentation]; | 1179                     sseshift = segmentation_to_sseshift[segmentation]; | 
| 1190 | 1180 | 
| 1191                     // Should we do a full search (best quality only) | 1181                     // Should we do a full search (best quality only) | 
| 1192                     if ((cpi->compressor_speed == 0) && (bestsme >> sseshift) > 
      4000) | 1182                     if ((cpi->compressor_speed == 0) && (bestsme >> sseshift) > 
      4000) | 
| 1193                     { | 1183                     { | 
| 1194                         thissme = cpi->full_search_sad(x, c, e, bsi->mvp, | 1184                         /* Check if mvp_full is within the range. */ | 
| 1195                                                        sadpb / 4, 16, v_fn_ptr, 
      x->mvcost, x->mvsadcost,bsi->ref_mv); | 1185                         vp8_clamp_mv(&mvp_full, x->mv_col_min, x->mv_col_max, x-
      >mv_row_min, x->mv_row_max); | 
|  | 1186 | 
|  | 1187                         thissme = cpi->full_search_sad(x, c, e, &mvp_full, | 
|  | 1188                                                        sadpb, 16, v_fn_ptr, | 
|  | 1189                                                        x->mvcost, bsi->ref_mv); | 
| 1196 | 1190 | 
| 1197                         if (thissme < bestsme) | 1191                         if (thissme < bestsme) | 
| 1198                         { | 1192                         { | 
| 1199                             bestsme = thissme; | 1193                             bestsme = thissme; | 
| 1200                             mode_mv[NEW4X4] = e->bmi.mv.as_mv; | 1194                             mode_mv[NEW4X4].as_int = e->bmi.mv.as_int; | 
| 1201                         } | 1195                         } | 
| 1202                         else | 1196                         else | 
| 1203                         { | 1197                         { | 
| 1204                             // The full search result is actually worse so re-in
      state the previous best vector | 1198                             // The full search result is actually worse so re-in
      state the previous best vector | 
| 1205                             e->bmi.mv.as_mv = mode_mv[NEW4X4]; | 1199                             e->bmi.mv.as_int = mode_mv[NEW4X4].as_int; | 
| 1206                         } | 1200                         } | 
| 1207                     } | 1201                     } | 
| 1208                 } | 1202                 } | 
| 1209 | 1203 | 
| 1210                 if (bestsme < INT_MAX) | 1204                 if (bestsme < INT_MAX) | 
| 1211                 { | 1205                 { | 
| 1212                     if (!cpi->common.full_pixel) | 1206                     int distortion; | 
| 1213                         cpi->find_fractional_mv_step(x, c, e, &mode_mv[NEW4X4], | 1207                     unsigned int sse; | 
| 1214                                                      bsi->ref_mv, x->errorperbit
       / 2, v_fn_ptr, x->mvcost); | 1208                     cpi->find_fractional_mv_step(x, c, e, &mode_mv[NEW4X4], | 
| 1215                     else | 1209                         bsi->ref_mv, x->errorperbit, v_fn_ptr, x->mvcost, | 
| 1216                         vp8_skip_fractional_mv_step(x, c, e, &mode_mv[NEW4X4], | 1210                         &distortion, &sse); | 
| 1217                                                     bsi->ref_mv, x->errorperbit,
       v_fn_ptr, x->mvcost); | 1211 | 
| 1218                 } | 1212                 } | 
| 1219             } /* NEW4X4 */ | 1213             } /* NEW4X4 */ | 
| 1220 | 1214 | 
| 1221             rate = labels2mode(x, labels, i, this_mode, &mode_mv[this_mode], | 1215             rate = labels2mode(x, labels, i, this_mode, &mode_mv[this_mode], | 
| 1222                                bsi->ref_mv, x->mvcost); | 1216                                bsi->ref_mv, x->mvcost); | 
| 1223 | 1217 | 
| 1224             // Trap vectors that reach beyond the UMV borders | 1218             // Trap vectors that reach beyond the UMV borders | 
| 1225             if (((mode_mv[this_mode].row >> 3) < x->mv_row_min) || ((mode_mv[thi
      s_mode].row >> 3) > x->mv_row_max) || | 1219             if (((mode_mv[this_mode].as_mv.row >> 3) < x->mv_row_min) || ((mode_
      mv[this_mode].as_mv.row >> 3) > x->mv_row_max) || | 
| 1226                 ((mode_mv[this_mode].col >> 3) < x->mv_col_min) || ((mode_mv[thi
      s_mode].col >> 3) > x->mv_col_max)) | 1220                 ((mode_mv[this_mode].as_mv.col >> 3) < x->mv_col_min) || ((mode_
      mv[this_mode].as_mv.col >> 3) > x->mv_col_max)) | 
| 1227             { | 1221             { | 
| 1228                 continue; | 1222                 continue; | 
| 1229             } | 1223             } | 
| 1230 | 1224 | 
| 1231             distortion = vp8_encode_inter_mb_segment(x, labels, i, IF_RTCD(&cpi-
      >rtcd.encodemb)) / 4; | 1225             distortion = vp8_encode_inter_mb_segment(x, labels, i, IF_RTCD(&cpi-
      >rtcd.encodemb)) / 4; | 
| 1232 | 1226 | 
| 1233             labelyrate = rdcost_mbsegment_y(x, labels, i, ta_s, tl_s); | 1227             labelyrate = rdcost_mbsegment_y(x, labels, i, ta_s, tl_s); | 
| 1234             rate += labelyrate; | 1228             rate += labelyrate; | 
| 1235 | 1229 | 
| 1236             this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion); | 1230             this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion); | 
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1271         bsi->d = bd; | 1265         bsi->d = bd; | 
| 1272         bsi->segment_yrate = segmentyrate; | 1266         bsi->segment_yrate = segmentyrate; | 
| 1273         bsi->segment_rd = this_segment_rd; | 1267         bsi->segment_rd = this_segment_rd; | 
| 1274         bsi->segment_num = segmentation; | 1268         bsi->segment_num = segmentation; | 
| 1275 | 1269 | 
| 1276         // store everything needed to come back to this!! | 1270         // store everything needed to come back to this!! | 
| 1277         for (i = 0; i < 16; i++) | 1271         for (i = 0; i < 16; i++) | 
| 1278         { | 1272         { | 
| 1279             BLOCKD *bd = &x->e_mbd.block[i]; | 1273             BLOCKD *bd = &x->e_mbd.block[i]; | 
| 1280 | 1274 | 
| 1281             bsi->mvs[i].as_mv = bd->bmi.mv.as_mv; | 1275             bsi->mvs[i].as_mv = x->partition_info->bmi[i].mv.as_mv; | 
| 1282             bsi->modes[i] = bd->bmi.mode; | 1276             bsi->modes[i] = x->partition_info->bmi[i].mode; | 
| 1283             bsi->eobs[i] = bd->eob; | 1277             bsi->eobs[i] = bd->eob; | 
| 1284         } | 1278         } | 
| 1285     } | 1279     } | 
| 1286 } | 1280 } | 
| 1287 | 1281 | 
| 1288 static __inline | 1282 static __inline | 
| 1289 void vp8_cal_step_param(int sr, int *sp) | 1283 void vp8_cal_step_param(int sr, int *sp) | 
| 1290 { | 1284 { | 
| 1291     int step = 0; | 1285     int step = 0; | 
| 1292 | 1286 | 
| 1293     if (sr > MAX_FIRST_STEP) sr = MAX_FIRST_STEP; | 1287     if (sr > MAX_FIRST_STEP) sr = MAX_FIRST_STEP; | 
| 1294     else if (sr < 1) sr = 1; | 1288     else if (sr < 1) sr = 1; | 
| 1295 | 1289 | 
| 1296     while (sr>>=1) | 1290     while (sr>>=1) | 
| 1297         step++; | 1291         step++; | 
| 1298 | 1292 | 
| 1299     *sp = MAX_MVSEARCH_STEPS - 1 - step; | 1293     *sp = MAX_MVSEARCH_STEPS - 1 - step; | 
| 1300 } | 1294 } | 
| 1301 | 1295 | 
| 1302 static int vp8_rd_pick_best_mbsegmentation(VP8_COMP *cpi, MACROBLOCK *x, | 1296 static int vp8_rd_pick_best_mbsegmentation(VP8_COMP *cpi, MACROBLOCK *x, | 
| 1303                                            MV *best_ref_mv, int best_rd, | 1297                                            int_mv *best_ref_mv, int best_rd, | 
| 1304                                            int *mdcounts, int *returntotrate, | 1298                                            int *mdcounts, int *returntotrate, | 
| 1305                                            int *returnyrate, int *returndistorti
      on, | 1299                                            int *returnyrate, int *returndistorti
      on, | 
| 1306                                            int mvthresh) | 1300                                            int mvthresh) | 
| 1307 { | 1301 { | 
| 1308     int i; | 1302     int i; | 
| 1309     BEST_SEG_INFO bsi; | 1303     BEST_SEG_INFO bsi; | 
| 1310 | 1304 | 
| 1311     vpx_memset(&bsi, 0, sizeof(bsi)); | 1305     vpx_memset(&bsi, 0, sizeof(bsi)); | 
| 1312 | 1306 | 
| 1313     bsi.segment_rd = best_rd; | 1307     bsi.segment_rd = best_rd; | 
| 1314     bsi.ref_mv = best_ref_mv; | 1308     bsi.ref_mv = best_ref_mv; | 
| 1315     bsi.mvp = best_ref_mv; | 1309     bsi.mvp.as_int = best_ref_mv->as_int; | 
| 1316     bsi.mvthresh = mvthresh; | 1310     bsi.mvthresh = mvthresh; | 
| 1317     bsi.mdcounts = mdcounts; | 1311     bsi.mdcounts = mdcounts; | 
| 1318 | 1312 | 
| 1319     for(i = 0; i < 16; i++) | 1313     for(i = 0; i < 16; i++) | 
| 1320     { | 1314     { | 
| 1321         bsi.modes[i] = ZERO4X4; | 1315         bsi.modes[i] = ZERO4X4; | 
| 1322     } | 1316     } | 
| 1323 | 1317 | 
| 1324     if(cpi->compressor_speed == 0) | 1318     if(cpi->compressor_speed == 0) | 
| 1325     { | 1319     { | 
| 1326         /* for now, we will keep the original segmentation order | 1320         /* for now, we will keep the original segmentation order | 
| 1327            when in best quality mode */ | 1321            when in best quality mode */ | 
| 1328         rd_check_segment(cpi, x, &bsi, BLOCK_16X8); | 1322         rd_check_segment(cpi, x, &bsi, BLOCK_16X8); | 
| 1329         rd_check_segment(cpi, x, &bsi, BLOCK_8X16); | 1323         rd_check_segment(cpi, x, &bsi, BLOCK_8X16); | 
| 1330         rd_check_segment(cpi, x, &bsi, BLOCK_8X8); | 1324         rd_check_segment(cpi, x, &bsi, BLOCK_8X8); | 
| 1331         rd_check_segment(cpi, x, &bsi, BLOCK_4X4); | 1325         rd_check_segment(cpi, x, &bsi, BLOCK_4X4); | 
| 1332     } | 1326     } | 
| 1333     else | 1327     else | 
| 1334     { | 1328     { | 
| 1335         int sr; | 1329         int sr; | 
| 1336 | 1330 | 
| 1337         rd_check_segment(cpi, x, &bsi, BLOCK_8X8); | 1331         rd_check_segment(cpi, x, &bsi, BLOCK_8X8); | 
| 1338 | 1332 | 
| 1339         if (bsi.segment_rd < best_rd) | 1333         if (bsi.segment_rd < best_rd) | 
| 1340         { | 1334         { | 
| 1341             int col_min = (best_ref_mv->col - MAX_FULL_PEL_VAL) >>3; | 1335             int col_min = (best_ref_mv->as_mv.col>>3) - MAX_FULL_PEL_VAL + ((bes
      t_ref_mv->as_mv.col & 7)?1:0); | 
| 1342             int col_max = (best_ref_mv->col + MAX_FULL_PEL_VAL) >>3; | 1336             int row_min = (best_ref_mv->as_mv.row>>3) - MAX_FULL_PEL_VAL + ((bes
      t_ref_mv->as_mv.row & 7)?1:0); | 
| 1343             int row_min = (best_ref_mv->row - MAX_FULL_PEL_VAL) >>3; | 1337             int col_max = (best_ref_mv->as_mv.col>>3) + MAX_FULL_PEL_VAL; | 
| 1344             int row_max = (best_ref_mv->row + MAX_FULL_PEL_VAL) >>3; | 1338             int row_max = (best_ref_mv->as_mv.row>>3) + MAX_FULL_PEL_VAL; | 
| 1345 | 1339 | 
| 1346             int tmp_col_min = x->mv_col_min; | 1340             int tmp_col_min = x->mv_col_min; | 
| 1347             int tmp_col_max = x->mv_col_max; | 1341             int tmp_col_max = x->mv_col_max; | 
| 1348             int tmp_row_min = x->mv_row_min; | 1342             int tmp_row_min = x->mv_row_min; | 
| 1349             int tmp_row_max = x->mv_row_max; | 1343             int tmp_row_max = x->mv_row_max; | 
| 1350 | 1344 | 
| 1351             /* Get intersection of UMV window and valid MV window to reduce # of
       checks in diamond search. */ | 1345             /* Get intersection of UMV window and valid MV window to reduce # of
       checks in diamond search. */ | 
| 1352             if (x->mv_col_min < col_min ) | 1346             if (x->mv_col_min < col_min ) | 
| 1353                 x->mv_col_min = col_min; | 1347                 x->mv_col_min = col_min; | 
| 1354             if (x->mv_col_max > col_max ) | 1348             if (x->mv_col_max > col_max ) | 
| 1355                 x->mv_col_max = col_max; | 1349                 x->mv_col_max = col_max; | 
| 1356             if (x->mv_row_min < row_min ) | 1350             if (x->mv_row_min < row_min ) | 
| 1357                 x->mv_row_min = row_min; | 1351                 x->mv_row_min = row_min; | 
| 1358             if (x->mv_row_max > row_max ) | 1352             if (x->mv_row_max > row_max ) | 
| 1359                 x->mv_row_max = row_max; | 1353                 x->mv_row_max = row_max; | 
| 1360 | 1354 | 
| 1361             /* Get 8x8 result */ | 1355             /* Get 8x8 result */ | 
| 1362             bsi.sv_mvp[0] = bsi.mvs[0].as_mv; | 1356             bsi.sv_mvp[0].as_int = bsi.mvs[0].as_int; | 
| 1363             bsi.sv_mvp[1] = bsi.mvs[2].as_mv; | 1357             bsi.sv_mvp[1].as_int = bsi.mvs[2].as_int; | 
| 1364             bsi.sv_mvp[2] = bsi.mvs[8].as_mv; | 1358             bsi.sv_mvp[2].as_int = bsi.mvs[8].as_int; | 
| 1365             bsi.sv_mvp[3] = bsi.mvs[10].as_mv; | 1359             bsi.sv_mvp[3].as_int = bsi.mvs[10].as_int; | 
| 1366 | 1360 | 
| 1367             /* Use 8x8 result as 16x8/8x16's predictor MV. Adjust search range a
      ccording to the closeness of 2 MV. */ | 1361             /* Use 8x8 result as 16x8/8x16's predictor MV. Adjust search range a
      ccording to the closeness of 2 MV. */ | 
| 1368             /* block 8X16 */ | 1362             /* block 8X16 */ | 
| 1369             { | 1363             { | 
| 1370                 sr = MAXF((abs(bsi.sv_mvp[0].row - bsi.sv_mvp[2].row))>>3, (abs(
      bsi.sv_mvp[0].col - bsi.sv_mvp[2].col))>>3); | 1364                 sr = MAXF((abs(bsi.sv_mvp[0].as_mv.row - bsi.sv_mvp[2].as_mv.row
      ))>>3, (abs(bsi.sv_mvp[0].as_mv.col - bsi.sv_mvp[2].as_mv.col))>>3); | 
| 1371                 vp8_cal_step_param(sr, &bsi.sv_istep[0]); | 1365                 vp8_cal_step_param(sr, &bsi.sv_istep[0]); | 
| 1372 | 1366 | 
| 1373                 sr = MAXF((abs(bsi.sv_mvp[1].row - bsi.sv_mvp[3].row))>>3, (abs(
      bsi.sv_mvp[1].col - bsi.sv_mvp[3].col))>>3); | 1367                 sr = MAXF((abs(bsi.sv_mvp[1].as_mv.row - bsi.sv_mvp[3].as_mv.row
      ))>>3, (abs(bsi.sv_mvp[1].as_mv.col - bsi.sv_mvp[3].as_mv.col))>>3); | 
| 1374                 vp8_cal_step_param(sr, &bsi.sv_istep[1]); | 1368                 vp8_cal_step_param(sr, &bsi.sv_istep[1]); | 
| 1375 | 1369 | 
| 1376                 rd_check_segment(cpi, x, &bsi, BLOCK_8X16); | 1370                 rd_check_segment(cpi, x, &bsi, BLOCK_8X16); | 
| 1377             } | 1371             } | 
| 1378 | 1372 | 
| 1379             /* block 16X8 */ | 1373             /* block 16X8 */ | 
| 1380             { | 1374             { | 
| 1381                 sr = MAXF((abs(bsi.sv_mvp[0].row - bsi.sv_mvp[1].row))>>3, (abs(
      bsi.sv_mvp[0].col - bsi.sv_mvp[1].col))>>3); | 1375                 sr = MAXF((abs(bsi.sv_mvp[0].as_mv.row - bsi.sv_mvp[1].as_mv.row
      ))>>3, (abs(bsi.sv_mvp[0].as_mv.col - bsi.sv_mvp[1].as_mv.col))>>3); | 
| 1382                 vp8_cal_step_param(sr, &bsi.sv_istep[0]); | 1376                 vp8_cal_step_param(sr, &bsi.sv_istep[0]); | 
| 1383 | 1377 | 
| 1384                 sr = MAXF((abs(bsi.sv_mvp[2].row - bsi.sv_mvp[3].row))>>3, (abs(
      bsi.sv_mvp[2].col - bsi.sv_mvp[3].col))>>3); | 1378                 sr = MAXF((abs(bsi.sv_mvp[2].as_mv.row - bsi.sv_mvp[3].as_mv.row
      ))>>3, (abs(bsi.sv_mvp[2].as_mv.col - bsi.sv_mvp[3].as_mv.col))>>3); | 
| 1385                 vp8_cal_step_param(sr, &bsi.sv_istep[1]); | 1379                 vp8_cal_step_param(sr, &bsi.sv_istep[1]); | 
| 1386 | 1380 | 
| 1387                 rd_check_segment(cpi, x, &bsi, BLOCK_16X8); | 1381                 rd_check_segment(cpi, x, &bsi, BLOCK_16X8); | 
| 1388             } | 1382             } | 
| 1389 | 1383 | 
| 1390             /* If 8x8 is better than 16x8/8x16, then do 4x4 search */ | 1384             /* If 8x8 is better than 16x8/8x16, then do 4x4 search */ | 
| 1391             /* Not skip 4x4 if speed=0 (good quality) */ | 1385             /* Not skip 4x4 if speed=0 (good quality) */ | 
| 1392             if (cpi->sf.no_skip_block4x4_search || bsi.segment_num == BLOCK_8X8)
        /* || (sv_segment_rd8x8-bsi.segment_rd) < sv_segment_rd8x8>>5) */ | 1386             if (cpi->sf.no_skip_block4x4_search || bsi.segment_num == BLOCK_8X8)
        /* || (sv_segment_rd8x8-bsi.segment_rd) < sv_segment_rd8x8>>5) */ | 
| 1393             { | 1387             { | 
| 1394                 bsi.mvp = &bsi.sv_mvp[0]; | 1388                 bsi.mvp.as_int = bsi.sv_mvp[0].as_int; | 
| 1395                 rd_check_segment(cpi, x, &bsi, BLOCK_4X4); | 1389                 rd_check_segment(cpi, x, &bsi, BLOCK_4X4); | 
| 1396             } | 1390             } | 
| 1397 | 1391 | 
| 1398             /* restore UMV window */ | 1392             /* restore UMV window */ | 
| 1399             x->mv_col_min = tmp_col_min; | 1393             x->mv_col_min = tmp_col_min; | 
| 1400             x->mv_col_max = tmp_col_max; | 1394             x->mv_col_max = tmp_col_max; | 
| 1401             x->mv_row_min = tmp_row_min; | 1395             x->mv_row_min = tmp_row_min; | 
| 1402             x->mv_row_max = tmp_row_max; | 1396             x->mv_row_max = tmp_row_max; | 
| 1403         } | 1397         } | 
| 1404     } | 1398     } | 
| 1405 | 1399 | 
| 1406     /* set it to the best */ | 1400     /* set it to the best */ | 
| 1407     for (i = 0; i < 16; i++) | 1401     for (i = 0; i < 16; i++) | 
| 1408     { | 1402     { | 
| 1409         BLOCKD *bd = &x->e_mbd.block[i]; | 1403         BLOCKD *bd = &x->e_mbd.block[i]; | 
| 1410 | 1404 | 
| 1411         bd->bmi.mv.as_mv = bsi.mvs[i].as_mv; | 1405         bd->bmi.mv.as_int = bsi.mvs[i].as_int; | 
| 1412         bd->bmi.mode = bsi.modes[i]; |  | 
| 1413         bd->eob = bsi.eobs[i]; | 1406         bd->eob = bsi.eobs[i]; | 
| 1414     } | 1407     } | 
| 1415 | 1408 | 
| 1416     *returntotrate = bsi.r; | 1409     *returntotrate = bsi.r; | 
| 1417     *returndistortion = bsi.d; | 1410     *returndistortion = bsi.d; | 
| 1418     *returnyrate = bsi.segment_yrate; | 1411     *returnyrate = bsi.segment_yrate; | 
| 1419 | 1412 | 
| 1420     /* save partitions */ | 1413     /* save partitions */ | 
| 1421     x->e_mbd.mode_info_context->mbmi.partitioning = bsi.segment_num; | 1414     x->e_mbd.mode_info_context->mbmi.partitioning = bsi.segment_num; | 
| 1422     x->partition_info->count = vp8_mbsplit_count[bsi.segment_num]; | 1415     x->partition_info->count = vp8_mbsplit_count[bsi.segment_num]; | 
| 1423 | 1416 | 
| 1424     for (i = 0; i < x->partition_info->count; i++) | 1417     for (i = 0; i < x->partition_info->count; i++) | 
| 1425     { | 1418     { | 
| 1426         int j; | 1419         int j; | 
| 1427 | 1420 | 
| 1428         j = vp8_mbsplit_offset[bsi.segment_num][i]; | 1421         j = vp8_mbsplit_offset[bsi.segment_num][i]; | 
| 1429 | 1422 | 
| 1430         x->partition_info->bmi[i].mode = x->e_mbd.block[j].bmi.mode; | 1423         x->partition_info->bmi[i].mode = bsi.modes[j]; | 
| 1431         x->partition_info->bmi[i].mv.as_mv = x->e_mbd.block[j].bmi.mv.as_mv; | 1424         x->partition_info->bmi[i].mv.as_mv = bsi.mvs[j].as_mv; | 
| 1432     } | 1425     } | 
|  | 1426     /* | 
|  | 1427      * used to set x->e_mbd.mode_info_context->mbmi.mv.as_int | 
|  | 1428      */ | 
|  | 1429     x->partition_info->bmi[15].mv.as_int = bsi.mvs[15].as_int; | 
| 1433 | 1430 | 
| 1434     return bsi.segment_rd; | 1431     return bsi.segment_rd; | 
| 1435 } | 1432 } | 
| 1436 #endif |  | 
| 1437 | 1433 | 
| 1438 static void swap(int *x,int *y) | 1434 static void insertsortmv(int arr[], int len) | 
| 1439 { | 1435 { | 
| 1440    int tmp; | 1436     int i, j, k; | 
| 1441 | 1437 | 
| 1442    tmp = *x; | 1438     for ( i = 1 ; i <= len-1 ; i++ ) | 
| 1443    *x = *y; | 1439     { | 
| 1444    *y = tmp; | 1440         for ( j = 0 ; j < i ; j++ ) | 
|  | 1441         { | 
|  | 1442             if ( arr[j] > arr[i] ) | 
|  | 1443             { | 
|  | 1444                 int temp; | 
|  | 1445 | 
|  | 1446                 temp = arr[i]; | 
|  | 1447 | 
|  | 1448                 for ( k = i; k >j; k--) | 
|  | 1449                     arr[k] = arr[k - 1] ; | 
|  | 1450 | 
|  | 1451                 arr[j] = temp ; | 
|  | 1452             } | 
|  | 1453         } | 
|  | 1454     } | 
| 1445 } | 1455 } | 
| 1446 | 1456 | 
| 1447 static void quicksortmv(int arr[],int left, int right) | 1457 static void insertsortsad(int arr[],int idx[], int len) | 
| 1448 { | 1458 { | 
| 1449    int lidx,ridx,pivot; | 1459     int i, j, k; | 
| 1450 | 1460 | 
| 1451    lidx = left; | 1461     for ( i = 1 ; i <= len-1 ; i++ ) | 
| 1452    ridx = right; | 1462     { | 
|  | 1463         for ( j = 0 ; j < i ; j++ ) | 
|  | 1464         { | 
|  | 1465             if ( arr[j] > arr[i] ) | 
|  | 1466             { | 
|  | 1467                 int temp, tempi; | 
| 1453 | 1468 | 
| 1454    if( left < right) | 1469                 temp = arr[i]; | 
| 1455    { | 1470                 tempi = idx[i]; | 
| 1456       pivot = (left + right)/2; |  | 
| 1457 | 1471 | 
| 1458       while(lidx <=pivot && ridx >=pivot) | 1472                 for ( k = i; k >j; k--) | 
| 1459       { | 1473                 { | 
| 1460           while(arr[lidx] < arr[pivot] && lidx <= pivot) | 1474                     arr[k] = arr[k - 1] ; | 
| 1461               lidx++; | 1475                     idx[k] = idx[k - 1]; | 
| 1462           while(arr[ridx] > arr[pivot] && ridx >= pivot) | 1476                 } | 
| 1463               ridx--; |  | 
| 1464           swap(&arr[lidx], &arr[ridx]); |  | 
| 1465           lidx++; |  | 
| 1466           ridx--; |  | 
| 1467           if(lidx-1 == pivot) |  | 
| 1468           { |  | 
| 1469               ridx++; |  | 
| 1470               pivot = ridx; |  | 
| 1471           } |  | 
| 1472           else if(ridx+1 == pivot) |  | 
| 1473           { |  | 
| 1474               lidx--; |  | 
| 1475               pivot = lidx; |  | 
| 1476           } |  | 
| 1477       } |  | 
| 1478       quicksortmv(arr, left, pivot - 1); |  | 
| 1479       quicksortmv(arr, pivot + 1, right); |  | 
| 1480    } |  | 
| 1481 } |  | 
| 1482 | 1477 | 
| 1483 static void quicksortsad(int arr[],int idx[], int left, int right) | 1478                 arr[j] = temp ; | 
| 1484 { | 1479                 idx[j] = tempi; | 
| 1485    int lidx,ridx,pivot; | 1480             } | 
| 1486 | 1481         } | 
| 1487    lidx = left; | 1482     } | 
| 1488    ridx = right; |  | 
| 1489 |  | 
| 1490    if( left < right) |  | 
| 1491    { |  | 
| 1492       pivot = (left + right)/2; |  | 
| 1493 |  | 
| 1494       while(lidx <=pivot && ridx >=pivot) |  | 
| 1495       { |  | 
| 1496           while(arr[lidx] < arr[pivot] && lidx <= pivot) |  | 
| 1497               lidx++; |  | 
| 1498           while(arr[ridx] > arr[pivot] && ridx >= pivot) |  | 
| 1499               ridx--; |  | 
| 1500           swap(&arr[lidx], &arr[ridx]); |  | 
| 1501           swap(&idx[lidx], &idx[ridx]); |  | 
| 1502           lidx++; |  | 
| 1503           ridx--; |  | 
| 1504           if(lidx-1 == pivot) |  | 
| 1505           { |  | 
| 1506               ridx++; |  | 
| 1507               pivot = ridx; |  | 
| 1508           } |  | 
| 1509           else if(ridx+1 == pivot) |  | 
| 1510           { |  | 
| 1511               lidx--; |  | 
| 1512               pivot = lidx; |  | 
| 1513           } |  | 
| 1514       } |  | 
| 1515       quicksortsad(arr, idx, left, pivot - 1); |  | 
| 1516       quicksortsad(arr, idx, pivot + 1, right); |  | 
| 1517    } |  | 
| 1518 } | 1483 } | 
| 1519 | 1484 | 
| 1520 //The improved MV prediction | 1485 //The improved MV prediction | 
| 1521 void vp8_mv_pred | 1486 void vp8_mv_pred | 
| 1522 ( | 1487 ( | 
| 1523     VP8_COMP *cpi, | 1488     VP8_COMP *cpi, | 
| 1524     MACROBLOCKD *xd, | 1489     MACROBLOCKD *xd, | 
| 1525     const MODE_INFO *here, | 1490     const MODE_INFO *here, | 
| 1526     MV *mvp, | 1491     int_mv *mvp, | 
| 1527     int refframe, | 1492     int refframe, | 
| 1528     int *ref_frame_sign_bias, | 1493     int *ref_frame_sign_bias, | 
| 1529     int *sr, | 1494     int *sr, | 
| 1530     int near_sadidx[] | 1495     int near_sadidx[] | 
| 1531 ) | 1496 ) | 
| 1532 { | 1497 { | 
| 1533     const MODE_INFO *above = here - xd->mode_info_stride; | 1498     const MODE_INFO *above = here - xd->mode_info_stride; | 
| 1534     const MODE_INFO *left = here - 1; | 1499     const MODE_INFO *left = here - 1; | 
| 1535     const MODE_INFO *aboveleft = above - 1; | 1500     const MODE_INFO *aboveleft = above - 1; | 
| 1536     int_mv           near_mvs[8]; | 1501     int_mv           near_mvs[8]; | 
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1643         } | 1608         } | 
| 1644 | 1609 | 
| 1645         if(!find) | 1610         if(!find) | 
| 1646         { | 1611         { | 
| 1647             for(i=0; i<vcnt; i++) | 1612             for(i=0; i<vcnt; i++) | 
| 1648             { | 1613             { | 
| 1649                 mvx[i] = near_mvs[i].as_mv.row; | 1614                 mvx[i] = near_mvs[i].as_mv.row; | 
| 1650                 mvy[i] = near_mvs[i].as_mv.col; | 1615                 mvy[i] = near_mvs[i].as_mv.col; | 
| 1651             } | 1616             } | 
| 1652 | 1617 | 
| 1653             quicksortmv (mvx, 0, vcnt-1); | 1618             insertsortmv(mvx, vcnt); | 
| 1654             quicksortmv (mvy, 0, vcnt-1); | 1619             insertsortmv(mvy, vcnt); | 
| 1655             mv.as_mv.row = mvx[vcnt/2]; | 1620             mv.as_mv.row = mvx[vcnt/2]; | 
| 1656             mv.as_mv.col = mvy[vcnt/2]; | 1621             mv.as_mv.col = mvy[vcnt/2]; | 
| 1657 | 1622 | 
| 1658             find = 1; | 1623             find = 1; | 
| 1659             //sr is set to 0 to allow calling function to decide the search rang
      e. | 1624             //sr is set to 0 to allow calling function to decide the search rang
      e. | 
| 1660             *sr = 0; | 1625             *sr = 0; | 
| 1661         } | 1626         } | 
| 1662     } | 1627     } | 
| 1663 | 1628 | 
| 1664     /* Set up return values */ | 1629     /* Set up return values */ | 
| 1665     *mvp = mv.as_mv; | 1630     mvp->as_int = mv.as_int; | 
| 1666     vp8_clamp_mv(mvp, xd); | 1631     vp8_clamp_mv2(mvp, xd); | 
| 1667 } | 1632 } | 
| 1668 | 1633 | 
| 1669 void vp8_cal_sad(VP8_COMP *cpi, MACROBLOCKD *xd, MACROBLOCK *x, int recon_yoffse
      t, int near_sadidx[]) | 1634 void vp8_cal_sad(VP8_COMP *cpi, MACROBLOCKD *xd, MACROBLOCK *x, int recon_yoffse
      t, int near_sadidx[]) | 
| 1670 { | 1635 { | 
| 1671 | 1636 | 
| 1672     int near_sad[8] = {0}; // 0-cf above, 1-cf left, 2-cf aboveleft, 3-lf curren
      t, 4-lf above, 5-lf left, 6-lf right, 7-lf below | 1637     int near_sad[8] = {0}; // 0-cf above, 1-cf left, 2-cf aboveleft, 3-lf curren
      t, 4-lf above, 5-lf left, 6-lf right, 7-lf below | 
|  | 1638     BLOCK *b = &x->block[0]; | 
|  | 1639     unsigned char *src_y_ptr = *(b->base_src); | 
| 1673 | 1640 | 
| 1674     //calculate sad for current frame 3 nearby MBs. | 1641     //calculate sad for current frame 3 nearby MBs. | 
| 1675     if( xd->mb_to_top_edge==0 && xd->mb_to_left_edge ==0) | 1642     if( xd->mb_to_top_edge==0 && xd->mb_to_left_edge ==0) | 
| 1676     { | 1643     { | 
| 1677         near_sad[0] = near_sad[1] = near_sad[2] = INT_MAX; | 1644         near_sad[0] = near_sad[1] = near_sad[2] = INT_MAX; | 
| 1678     }else if(xd->mb_to_top_edge==0) | 1645     }else if(xd->mb_to_top_edge==0) | 
| 1679     {   //only has left MB for sad calculation. | 1646     {   //only has left MB for sad calculation. | 
| 1680         near_sad[0] = near_sad[2] = INT_MAX; | 1647         near_sad[0] = near_sad[2] = INT_MAX; | 
| 1681         near_sad[1] = cpi->fn_ptr[BLOCK_16X16].sdf(x->src.y_buffer, x->src.y_str
      ide, xd->dst.y_buffer - 16,xd->dst.y_stride, 0x7fffffff); | 1648         near_sad[1] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, xd-
      >dst.y_buffer - 16,xd->dst.y_stride, 0x7fffffff); | 
| 1682     }else if(xd->mb_to_left_edge ==0) | 1649     }else if(xd->mb_to_left_edge ==0) | 
| 1683     {   //only has left MB for sad calculation. | 1650     {   //only has left MB for sad calculation. | 
| 1684         near_sad[1] = near_sad[2] = INT_MAX; | 1651         near_sad[1] = near_sad[2] = INT_MAX; | 
| 1685         near_sad[0] = cpi->fn_ptr[BLOCK_16X16].sdf(x->src.y_buffer, x->src.y_str
      ide, xd->dst.y_buffer - xd->dst.y_stride *16,xd->dst.y_stride, 0x7fffffff); | 1652         near_sad[0] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, xd-
      >dst.y_buffer - xd->dst.y_stride *16,xd->dst.y_stride, 0x7fffffff); | 
| 1686     }else | 1653     }else | 
| 1687     { | 1654     { | 
| 1688         near_sad[0] = cpi->fn_ptr[BLOCK_16X16].sdf(x->src.y_buffer, x->src.y_str
      ide, xd->dst.y_buffer - xd->dst.y_stride *16,xd->dst.y_stride, 0x7fffffff); | 1655         near_sad[0] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, xd-
      >dst.y_buffer - xd->dst.y_stride *16,xd->dst.y_stride, 0x7fffffff); | 
| 1689         near_sad[1] = cpi->fn_ptr[BLOCK_16X16].sdf(x->src.y_buffer, x->src.y_str
      ide, xd->dst.y_buffer - 16,xd->dst.y_stride, 0x7fffffff); | 1656         near_sad[1] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, xd-
      >dst.y_buffer - 16,xd->dst.y_stride, 0x7fffffff); | 
| 1690         near_sad[2] = cpi->fn_ptr[BLOCK_16X16].sdf(x->src.y_buffer, x->src.y_str
      ide, xd->dst.y_buffer - xd->dst.y_stride *16 -16,xd->dst.y_stride, 0x7fffffff); | 1657         near_sad[2] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, xd-
      >dst.y_buffer - xd->dst.y_stride *16 -16,xd->dst.y_stride, 0x7fffffff); | 
| 1691     } | 1658     } | 
| 1692 | 1659 | 
| 1693     if(cpi->common.last_frame_type != KEY_FRAME) | 1660     if(cpi->common.last_frame_type != KEY_FRAME) | 
| 1694     { | 1661     { | 
| 1695         //calculate sad for last frame 5 nearby MBs. | 1662         //calculate sad for last frame 5 nearby MBs. | 
| 1696         unsigned char *pre_y_buffer = cpi->common.yv12_fb[cpi->common.lst_fb_idx
      ].y_buffer + recon_yoffset; | 1663         unsigned char *pre_y_buffer = cpi->common.yv12_fb[cpi->common.lst_fb_idx
      ].y_buffer + recon_yoffset; | 
| 1697         int pre_y_stride = cpi->common.yv12_fb[cpi->common.lst_fb_idx].y_stride; | 1664         int pre_y_stride = cpi->common.yv12_fb[cpi->common.lst_fb_idx].y_stride; | 
| 1698 | 1665 | 
| 1699         if(xd->mb_to_top_edge==0) near_sad[4] = INT_MAX; | 1666         if(xd->mb_to_top_edge==0) near_sad[4] = INT_MAX; | 
| 1700         if(xd->mb_to_left_edge ==0) near_sad[5] = INT_MAX; | 1667         if(xd->mb_to_left_edge ==0) near_sad[5] = INT_MAX; | 
| 1701         if(xd->mb_to_right_edge ==0) near_sad[6] = INT_MAX; | 1668         if(xd->mb_to_right_edge ==0) near_sad[6] = INT_MAX; | 
| 1702         if(xd->mb_to_bottom_edge==0) near_sad[7] = INT_MAX; | 1669         if(xd->mb_to_bottom_edge==0) near_sad[7] = INT_MAX; | 
| 1703 | 1670 | 
| 1704         if(near_sad[4] != INT_MAX) | 1671         if(near_sad[4] != INT_MAX) | 
| 1705             near_sad[4] = cpi->fn_ptr[BLOCK_16X16].sdf(x->src.y_buffer, x->src.y
      _stride, pre_y_buffer - pre_y_stride *16, pre_y_stride, 0x7fffffff); | 1672             near_sad[4] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride,
       pre_y_buffer - pre_y_stride *16, pre_y_stride, 0x7fffffff); | 
| 1706         if(near_sad[5] != INT_MAX) | 1673         if(near_sad[5] != INT_MAX) | 
| 1707             near_sad[5] = cpi->fn_ptr[BLOCK_16X16].sdf(x->src.y_buffer, x->src.y
      _stride, pre_y_buffer - 16, pre_y_stride, 0x7fffffff); | 1674             near_sad[5] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride,
       pre_y_buffer - 16, pre_y_stride, 0x7fffffff); | 
| 1708         near_sad[3] = cpi->fn_ptr[BLOCK_16X16].sdf(x->src.y_buffer, x->src.y_str
      ide, pre_y_buffer, pre_y_stride, 0x7fffffff); | 1675         near_sad[3] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride, pre
      _y_buffer, pre_y_stride, 0x7fffffff); | 
| 1709         if(near_sad[6] != INT_MAX) | 1676         if(near_sad[6] != INT_MAX) | 
| 1710             near_sad[6] = cpi->fn_ptr[BLOCK_16X16].sdf(x->src.y_buffer, x->src.y
      _stride, pre_y_buffer + 16, pre_y_stride, 0x7fffffff); | 1677             near_sad[6] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride,
       pre_y_buffer + 16, pre_y_stride, 0x7fffffff); | 
| 1711         if(near_sad[7] != INT_MAX) | 1678         if(near_sad[7] != INT_MAX) | 
| 1712             near_sad[7] = cpi->fn_ptr[BLOCK_16X16].sdf(x->src.y_buffer, x->src.y
      _stride, pre_y_buffer + pre_y_stride *16, pre_y_stride, 0x7fffffff); | 1679             near_sad[7] = cpi->fn_ptr[BLOCK_16X16].sdf(src_y_ptr, b->src_stride,
       pre_y_buffer + pre_y_stride *16, pre_y_stride, 0x7fffffff); | 
| 1713     } | 1680     } | 
| 1714 | 1681 | 
| 1715     if(cpi->common.last_frame_type != KEY_FRAME) | 1682     if(cpi->common.last_frame_type != KEY_FRAME) | 
| 1716     { | 1683     { | 
| 1717         quicksortsad(near_sad, near_sadidx, 0, 7); | 1684         insertsortsad(near_sad, near_sadidx, 8); | 
| 1718     }else | 1685     }else | 
| 1719     { | 1686     { | 
| 1720         quicksortsad(near_sad, near_sadidx, 0, 2); | 1687         insertsortsad(near_sad, near_sadidx, 3); | 
| 1721     } | 1688     } | 
| 1722 } | 1689 } | 
| 1723 | 1690 | 
| 1724 #if !(CONFIG_REALTIME_ONLY) | 1691 static void rd_update_mvcount(VP8_COMP *cpi, MACROBLOCK *x, int_mv *best_ref_mv) | 
| 1725 int vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int 
      recon_uvoffset, int *returnrate, int *returndistortion, int *returnintra) | 1692 { | 
|  | 1693     if (x->e_mbd.mode_info_context->mbmi.mode == SPLITMV) | 
|  | 1694     { | 
|  | 1695         int i; | 
|  | 1696 | 
|  | 1697         for (i = 0; i < x->partition_info->count; i++) | 
|  | 1698         { | 
|  | 1699             if (x->partition_info->bmi[i].mode == NEW4X4) | 
|  | 1700             { | 
|  | 1701                 cpi->MVcount[0][mv_max+((x->partition_info->bmi[i].mv.as_mv.row | 
|  | 1702                                           - best_ref_mv->as_mv.row) >> 1)]++; | 
|  | 1703                 cpi->MVcount[1][mv_max+((x->partition_info->bmi[i].mv.as_mv.col | 
|  | 1704                                           - best_ref_mv->as_mv.col) >> 1)]++; | 
|  | 1705             } | 
|  | 1706         } | 
|  | 1707     } | 
|  | 1708     else if (x->e_mbd.mode_info_context->mbmi.mode == NEWMV) | 
|  | 1709     { | 
|  | 1710         cpi->MVcount[0][mv_max+((x->e_mbd.mode_info_context->mbmi.mv.as_mv.row | 
|  | 1711                                           - best_ref_mv->as_mv.row) >> 1)]++; | 
|  | 1712         cpi->MVcount[1][mv_max+((x->e_mbd.mode_info_context->mbmi.mv.as_mv.col | 
|  | 1713                                           - best_ref_mv->as_mv.col) >> 1)]++; | 
|  | 1714     } | 
|  | 1715 } | 
|  | 1716 | 
|  | 1717 void vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int
       recon_uvoffset, int *returnrate, int *returndistortion, int *returnintra) | 
| 1726 { | 1718 { | 
| 1727     BLOCK *b = &x->block[0]; | 1719     BLOCK *b = &x->block[0]; | 
| 1728     BLOCKD *d = &x->e_mbd.block[0]; | 1720     BLOCKD *d = &x->e_mbd.block[0]; | 
| 1729     MACROBLOCKD *xd = &x->e_mbd; | 1721     MACROBLOCKD *xd = &x->e_mbd; | 
| 1730     B_MODE_INFO best_bmodes[16]; | 1722     union b_mode_info best_bmodes[16]; | 
| 1731     MB_MODE_INFO best_mbmode; | 1723     MB_MODE_INFO best_mbmode; | 
| 1732     PARTITION_INFO best_partition; | 1724     PARTITION_INFO best_partition; | 
| 1733     MV best_ref_mv; | 1725     int_mv best_ref_mv; | 
| 1734     MV mode_mv[MB_MODE_COUNT]; | 1726     int_mv mode_mv[MB_MODE_COUNT]; | 
| 1735     MB_PREDICTION_MODE this_mode; | 1727     MB_PREDICTION_MODE this_mode; | 
| 1736     int num00; | 1728     int num00; | 
| 1737     int best_mode_index = 0; | 1729     int best_mode_index = 0; | 
| 1738 | 1730 | 
| 1739     int i; | 1731     int i; | 
| 1740     int mode_index; | 1732     int mode_index; | 
| 1741     int mdcounts[4]; | 1733     int mdcounts[4]; | 
| 1742     int rate; | 1734     int rate; | 
| 1743     int distortion; | 1735     int distortion; | 
| 1744     int best_rd = INT_MAX; // 1 << 30; | 1736     int best_rd = INT_MAX; | 
| 1745     int ref_frame_cost[MAX_REF_FRAMES]; | 1737     int best_intra_rd = INT_MAX; | 
| 1746     int rate2, distortion2; | 1738     int rate2, distortion2; | 
| 1747     int uv_intra_rate, uv_intra_distortion, uv_intra_rate_tokenonly; | 1739     int uv_intra_rate, uv_intra_distortion, uv_intra_rate_tokenonly; | 
| 1748     int rate_y, UNINITIALIZED_IS_SAFE(rate_uv); | 1740     int rate_y, UNINITIALIZED_IS_SAFE(rate_uv); | 
| 1749     int distortion_uv; | 1741     int distortion_uv; | 
| 1750     int best_yrd = INT_MAX; | 1742     int best_yrd = INT_MAX; | 
| 1751 | 1743 | 
| 1752     //int all_rds[MAX_MODES];        // Experimental debug code. | 1744     //int all_rds[MAX_MODES];        // Experimental debug code. | 
| 1753     //int all_rates[MAX_MODES]; | 1745     //int all_rates[MAX_MODES]; | 
| 1754     //int all_dist[MAX_MODES]; | 1746     //int all_dist[MAX_MODES]; | 
| 1755     //int intermodecost[MAX_MODES]; | 1747     //int intermodecost[MAX_MODES]; | 
| 1756 | 1748 | 
| 1757     MB_PREDICTION_MODE uv_intra_mode; | 1749     MB_PREDICTION_MODE uv_intra_mode; | 
| 1758 | 1750     int_mv mvp; | 
| 1759     int force_no_skip = 0; |  | 
| 1760 |  | 
| 1761     MV mvp; |  | 
| 1762     int near_sadidx[8] = {0, 1, 2, 3, 4, 5, 6, 7}; | 1751     int near_sadidx[8] = {0, 1, 2, 3, 4, 5, 6, 7}; | 
| 1763     int saddone=0; | 1752     int saddone=0; | 
| 1764     int sr=0;    //search range got from mv_pred(). It uses step_param levels. (
      0-7) | 1753     int sr=0;    //search range got from mv_pred(). It uses step_param levels. (
      0-7) | 
| 1765 | 1754 | 
| 1766     MV frame_nearest_mv[4]; | 1755     int_mv frame_nearest_mv[4]; | 
| 1767     MV frame_near_mv[4]; | 1756     int_mv frame_near_mv[4]; | 
| 1768     MV frame_best_ref_mv[4]; | 1757     int_mv frame_best_ref_mv[4]; | 
| 1769     int frame_mdcounts[4][4]; | 1758     int frame_mdcounts[4][4]; | 
| 1770     int frame_lf_or_gf[4]; | 1759     int frame_lf_or_gf[4]; | 
| 1771     unsigned char *y_buffer[4]; | 1760     unsigned char *y_buffer[4]; | 
| 1772     unsigned char *u_buffer[4]; | 1761     unsigned char *u_buffer[4]; | 
| 1773     unsigned char *v_buffer[4]; | 1762     unsigned char *v_buffer[4]; | 
| 1774 | 1763 | 
| 1775     vpx_memset(&best_mbmode, 0, sizeof(best_mbmode)); | 1764     vpx_memset(&best_mbmode, 0, sizeof(best_mbmode)); | 
|  | 1765     vpx_memset(&best_bmodes, 0, sizeof(best_bmodes)); | 
| 1776 | 1766 | 
| 1777     if (cpi->ref_frame_flags & VP8_LAST_FLAG) | 1767     if (cpi->ref_frame_flags & VP8_LAST_FLAG) | 
| 1778     { | 1768     { | 
| 1779         YV12_BUFFER_CONFIG *lst_yv12 = &cpi->common.yv12_fb[cpi->common.lst_fb_i
      dx]; | 1769         YV12_BUFFER_CONFIG *lst_yv12 = &cpi->common.yv12_fb[cpi->common.lst_fb_i
      dx]; | 
| 1780 | 1770 | 
| 1781         vp8_find_near_mvs(&x->e_mbd, x->e_mbd.mode_info_context, &frame_nearest_
      mv[LAST_FRAME], &frame_near_mv[LAST_FRAME], | 1771         vp8_find_near_mvs(&x->e_mbd, x->e_mbd.mode_info_context, &frame_nearest_
      mv[LAST_FRAME], &frame_near_mv[LAST_FRAME], | 
| 1782                           &frame_best_ref_mv[LAST_FRAME], frame_mdcounts[LAST_FR
      AME], LAST_FRAME, cpi->common.ref_frame_sign_bias); | 1772                           &frame_best_ref_mv[LAST_FRAME], frame_mdcounts[LAST_FR
      AME], LAST_FRAME, cpi->common.ref_frame_sign_bias); | 
| 1783 | 1773 | 
| 1784         y_buffer[LAST_FRAME] = lst_yv12->y_buffer + recon_yoffset; | 1774         y_buffer[LAST_FRAME] = lst_yv12->y_buffer + recon_yoffset; | 
| 1785         u_buffer[LAST_FRAME] = lst_yv12->u_buffer + recon_uvoffset; | 1775         u_buffer[LAST_FRAME] = lst_yv12->u_buffer + recon_uvoffset; | 
| (...skipping 28 matching lines...) Expand all  Loading... | 
| 1814         v_buffer[ALTREF_FRAME] = alt_yv12->v_buffer + recon_uvoffset; | 1804         v_buffer[ALTREF_FRAME] = alt_yv12->v_buffer + recon_uvoffset; | 
| 1815 | 1805 | 
| 1816         frame_lf_or_gf[ALTREF_FRAME] = 1; | 1806         frame_lf_or_gf[ALTREF_FRAME] = 1; | 
| 1817     } | 1807     } | 
| 1818 | 1808 | 
| 1819     *returnintra = INT_MAX; | 1809     *returnintra = INT_MAX; | 
| 1820     cpi->mbs_tested_so_far++;          // Count of the number of MBs tested so f
      ar this frame | 1810     cpi->mbs_tested_so_far++;          // Count of the number of MBs tested so f
      ar this frame | 
| 1821 | 1811 | 
| 1822     x->skip = 0; | 1812     x->skip = 0; | 
| 1823 | 1813 | 
| 1824     ref_frame_cost[INTRA_FRAME]   = vp8_cost_zero(cpi->prob_intra_coded); |  | 
| 1825 |  | 
| 1826     // Special case treatment when GF and ARF are not sensible options for refer
      ence |  | 
| 1827     if (cpi->ref_frame_flags == VP8_LAST_FLAG) |  | 
| 1828     { |  | 
| 1829         ref_frame_cost[LAST_FRAME]    = vp8_cost_one(cpi->prob_intra_coded) |  | 
| 1830                                         + vp8_cost_zero(255); |  | 
| 1831         ref_frame_cost[GOLDEN_FRAME]  = vp8_cost_one(cpi->prob_intra_coded) |  | 
| 1832                                         + vp8_cost_one(255) |  | 
| 1833                                         + vp8_cost_zero(128); |  | 
| 1834         ref_frame_cost[ALTREF_FRAME]  = vp8_cost_one(cpi->prob_intra_coded) |  | 
| 1835                                         + vp8_cost_one(255) |  | 
| 1836                                         + vp8_cost_one(128); |  | 
| 1837     } |  | 
| 1838     else |  | 
| 1839     { |  | 
| 1840         ref_frame_cost[LAST_FRAME]    = vp8_cost_one(cpi->prob_intra_coded) |  | 
| 1841                                         + vp8_cost_zero(cpi->prob_last_coded); |  | 
| 1842         ref_frame_cost[GOLDEN_FRAME]  = vp8_cost_one(cpi->prob_intra_coded) |  | 
| 1843                                         + vp8_cost_one(cpi->prob_last_coded) |  | 
| 1844                                         + vp8_cost_zero(cpi->prob_gf_coded); |  | 
| 1845         ref_frame_cost[ALTREF_FRAME]  = vp8_cost_one(cpi->prob_intra_coded) |  | 
| 1846                                         + vp8_cost_one(cpi->prob_last_coded) |  | 
| 1847                                         + vp8_cost_one(cpi->prob_gf_coded); |  | 
| 1848     } |  | 
| 1849 |  | 
| 1850     vpx_memset(mode_mv, 0, sizeof(mode_mv)); | 1814     vpx_memset(mode_mv, 0, sizeof(mode_mv)); | 
| 1851 | 1815 | 
| 1852     x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME; | 1816     x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME; | 
| 1853     vp8_rd_pick_intra_mbuv_mode(cpi, x, &uv_intra_rate, &uv_intra_rate_tokenonly
      , &uv_intra_distortion); | 1817     rd_pick_intra_mbuv_mode(cpi, x, &uv_intra_rate, &uv_intra_rate_tokenonly, &u
      v_intra_distortion); | 
| 1854     uv_intra_mode = x->e_mbd.mode_info_context->mbmi.uv_mode; | 1818     uv_intra_mode = x->e_mbd.mode_info_context->mbmi.uv_mode; | 
| 1855 | 1819 | 
| 1856     for (mode_index = 0; mode_index < MAX_MODES; mode_index++) | 1820     for (mode_index = 0; mode_index < MAX_MODES; mode_index++) | 
| 1857     { | 1821     { | 
| 1858         int this_rd = INT_MAX; | 1822         int this_rd = INT_MAX; | 
| 1859         int lf_or_gf = 0;           // Lat Frame (01) or gf/arf (1) | 1823         int lf_or_gf = 0;           // Lat Frame (01) or gf/arf (1) | 
| 1860         int disable_skip = 0; | 1824         int disable_skip = 0; | 
| 1861         int other_cost = 0; | 1825         int other_cost = 0; | 
| 1862 | 1826 | 
| 1863         force_no_skip = 0; |  | 
| 1864 |  | 
| 1865         // Experimental debug code. | 1827         // Experimental debug code. | 
| 1866         // Record of rd values recorded for this MB. -1 indicates not measured | 1828         // Record of rd values recorded for this MB. -1 indicates not measured | 
| 1867         //all_rds[mode_index] = -1; | 1829         //all_rds[mode_index] = -1; | 
| 1868         //all_rates[mode_index] = -1; | 1830         //all_rates[mode_index] = -1; | 
| 1869         //all_dist[mode_index] = -1; | 1831         //all_dist[mode_index] = -1; | 
| 1870         //intermodecost[mode_index] = -1; | 1832         //intermodecost[mode_index] = -1; | 
| 1871 | 1833 | 
| 1872         // Test best rd so far against threshold for trying this mode. | 1834         // Test best rd so far against threshold for trying this mode. | 
| 1873         if (best_rd <= cpi->rd_threshes[mode_index]) | 1835         if (best_rd <= cpi->rd_threshes[mode_index]) | 
| 1874             continue; | 1836             continue; | 
| (...skipping 23 matching lines...) Expand all  Loading... | 
| 1898             x->e_mbd.pre.y_buffer = y_buffer[x->e_mbd.mode_info_context->mbmi.re
      f_frame]; | 1860             x->e_mbd.pre.y_buffer = y_buffer[x->e_mbd.mode_info_context->mbmi.re
      f_frame]; | 
| 1899             x->e_mbd.pre.u_buffer = u_buffer[x->e_mbd.mode_info_context->mbmi.re
      f_frame]; | 1861             x->e_mbd.pre.u_buffer = u_buffer[x->e_mbd.mode_info_context->mbmi.re
      f_frame]; | 
| 1900             x->e_mbd.pre.v_buffer = v_buffer[x->e_mbd.mode_info_context->mbmi.re
      f_frame]; | 1862             x->e_mbd.pre.v_buffer = v_buffer[x->e_mbd.mode_info_context->mbmi.re
      f_frame]; | 
| 1901             mode_mv[NEARESTMV] = frame_nearest_mv[x->e_mbd.mode_info_context->mb
      mi.ref_frame]; | 1863             mode_mv[NEARESTMV] = frame_nearest_mv[x->e_mbd.mode_info_context->mb
      mi.ref_frame]; | 
| 1902             mode_mv[NEARMV] = frame_near_mv[x->e_mbd.mode_info_context->mbmi.ref
      _frame]; | 1864             mode_mv[NEARMV] = frame_near_mv[x->e_mbd.mode_info_context->mbmi.ref
      _frame]; | 
| 1903             best_ref_mv = frame_best_ref_mv[x->e_mbd.mode_info_context->mbmi.ref
      _frame]; | 1865             best_ref_mv = frame_best_ref_mv[x->e_mbd.mode_info_context->mbmi.ref
      _frame]; | 
| 1904             vpx_memcpy(mdcounts, frame_mdcounts[x->e_mbd.mode_info_context->mbmi
      .ref_frame], sizeof(mdcounts)); | 1866             vpx_memcpy(mdcounts, frame_mdcounts[x->e_mbd.mode_info_context->mbmi
      .ref_frame], sizeof(mdcounts)); | 
| 1905             lf_or_gf = frame_lf_or_gf[x->e_mbd.mode_info_context->mbmi.ref_frame
      ]; | 1867             lf_or_gf = frame_lf_or_gf[x->e_mbd.mode_info_context->mbmi.ref_frame
      ]; | 
| 1906         } | 1868         } | 
| 1907 | 1869 | 
| 1908         if(x->e_mbd.mode_info_context->mbmi.mode == NEWMV) |  | 
| 1909         { |  | 
| 1910             if(!saddone) |  | 
| 1911             { |  | 
| 1912                 vp8_cal_sad(cpi,xd,x, recon_yoffset ,&near_sadidx[0] ); |  | 
| 1913                 saddone = 1; |  | 
| 1914             } |  | 
| 1915 |  | 
| 1916             vp8_mv_pred(cpi, &x->e_mbd, x->e_mbd.mode_info_context, &mvp, |  | 
| 1917                         x->e_mbd.mode_info_context->mbmi.ref_frame, cpi->common.
      ref_frame_sign_bias, &sr, &near_sadidx[0]); |  | 
| 1918 |  | 
| 1919             /* adjust mvp to make sure it is within MV range */ |  | 
| 1920             if(mvp.row > best_ref_mv.row + MAX_FULL_PEL_VAL) |  | 
| 1921                 mvp.row = best_ref_mv.row + MAX_FULL_PEL_VAL; |  | 
| 1922             else if(mvp.row < best_ref_mv.row - MAX_FULL_PEL_VAL) |  | 
| 1923                 mvp.row = best_ref_mv.row - MAX_FULL_PEL_VAL; |  | 
| 1924             if(mvp.col > best_ref_mv.col + MAX_FULL_PEL_VAL) |  | 
| 1925                 mvp.col = best_ref_mv.col + MAX_FULL_PEL_VAL; |  | 
| 1926             else if(mvp.col < best_ref_mv.col - MAX_FULL_PEL_VAL) |  | 
| 1927                 mvp.col = best_ref_mv.col - MAX_FULL_PEL_VAL; |  | 
| 1928         } |  | 
| 1929 |  | 
| 1930         // Check to see if the testing frequency for this mode is at its max | 1870         // Check to see if the testing frequency for this mode is at its max | 
| 1931         // If so then prevent it from being tested and increase the threshold fo
      r its testing | 1871         // If so then prevent it from being tested and increase the threshold fo
      r its testing | 
| 1932         if (cpi->mode_test_hit_counts[mode_index] && (cpi->mode_check_freq[mode_
      index] > 1)) | 1872         if (cpi->mode_test_hit_counts[mode_index] && (cpi->mode_check_freq[mode_
      index] > 1)) | 
| 1933         { | 1873         { | 
| 1934             if (cpi->mbs_tested_so_far  <= cpi->mode_check_freq[mode_index] * cp
      i->mode_test_hit_counts[mode_index]) | 1874             if (cpi->mbs_tested_so_far  <= cpi->mode_check_freq[mode_index] * cp
      i->mode_test_hit_counts[mode_index]) | 
| 1935             { | 1875             { | 
| 1936                 // Increase the threshold for coding this mode to make it less l
      ikely to be chosen | 1876                 // Increase the threshold for coding this mode to make it less l
      ikely to be chosen | 
| 1937                 cpi->rd_thresh_mult[mode_index] += 4; | 1877                 cpi->rd_thresh_mult[mode_index] += 4; | 
| 1938 | 1878 | 
| 1939                 if (cpi->rd_thresh_mult[mode_index] > MAX_THRESHMULT) | 1879                 if (cpi->rd_thresh_mult[mode_index] > MAX_THRESHMULT) | 
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1971             vp8_update_zbin_extra(cpi, x); | 1911             vp8_update_zbin_extra(cpi, x); | 
| 1972         } | 1912         } | 
| 1973 | 1913 | 
| 1974         switch (this_mode) | 1914         switch (this_mode) | 
| 1975         { | 1915         { | 
| 1976         case B_PRED: | 1916         case B_PRED: | 
| 1977         { | 1917         { | 
| 1978             int tmp_rd; | 1918             int tmp_rd; | 
| 1979 | 1919 | 
| 1980             // Note the rate value returned here includes the cost of coding the
       BPRED mode : x->mbmode_cost[x->e_mbd.frame_type][BPRED]; | 1920             // Note the rate value returned here includes the cost of coding the
       BPRED mode : x->mbmode_cost[x->e_mbd.frame_type][BPRED]; | 
| 1981             tmp_rd = vp8_rd_pick_intra4x4mby_modes(cpi, x, &rate, &rate_y, &dist
      ortion, best_yrd); | 1921             tmp_rd = rd_pick_intra4x4mby_modes(cpi, x, &rate, &rate_y, &distorti
      on, best_yrd); | 
| 1982             rate2 += rate; | 1922             rate2 += rate; | 
| 1983             distortion2 += distortion; | 1923             distortion2 += distortion; | 
| 1984 | 1924 | 
| 1985             if(tmp_rd < best_yrd) | 1925             if(tmp_rd < best_yrd) | 
| 1986             { | 1926             { | 
| 1987                 rate2 += uv_intra_rate; | 1927                 rate2 += uv_intra_rate; | 
| 1988                 rate_uv = uv_intra_rate_tokenonly; | 1928                 rate_uv = uv_intra_rate_tokenonly; | 
| 1989                 distortion2 += uv_intra_distortion; | 1929                 distortion2 += uv_intra_distortion; | 
| 1990                 distortion_uv = uv_intra_distortion; | 1930                 distortion_uv = uv_intra_distortion; | 
| 1991             } | 1931             } | 
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2038             rate2 += rate_y; | 1978             rate2 += rate_y; | 
| 2039             distortion2 += distortion; | 1979             distortion2 += distortion; | 
| 2040             rate2 += x->mbmode_cost[x->e_mbd.frame_type][x->e_mbd.mode_info_cont
      ext->mbmi.mode]; | 1980             rate2 += x->mbmode_cost[x->e_mbd.frame_type][x->e_mbd.mode_info_cont
      ext->mbmi.mode]; | 
| 2041             rate2 += uv_intra_rate; | 1981             rate2 += uv_intra_rate; | 
| 2042             rate_uv = uv_intra_rate_tokenonly; | 1982             rate_uv = uv_intra_rate_tokenonly; | 
| 2043             distortion2 += uv_intra_distortion; | 1983             distortion2 += uv_intra_distortion; | 
| 2044             distortion_uv = uv_intra_distortion; | 1984             distortion_uv = uv_intra_distortion; | 
| 2045             break; | 1985             break; | 
| 2046 | 1986 | 
| 2047         case NEWMV: | 1987         case NEWMV: | 
|  | 1988         { | 
|  | 1989             int thissme; | 
|  | 1990             int bestsme = INT_MAX; | 
|  | 1991             int step_param = cpi->sf.first_step; | 
|  | 1992             int further_steps; | 
|  | 1993             int n; | 
|  | 1994             int do_refine=1;   /* If last step (1-away) of n-step search doesn't
       pick the center point as the best match, | 
|  | 1995                                   we will do a final 1-away diamond refining sea
      rch  */ | 
| 2048 | 1996 | 
| 2049             // Decrement full search counter | 1997             int sadpb = x->sadperbit16; | 
| 2050             if (cpi->check_freq[lf_or_gf] > 0) | 1998             int_mv mvp_full; | 
| 2051                 cpi->check_freq[lf_or_gf] --; |  | 
| 2052 | 1999 | 
|  | 2000             int col_min = (best_ref_mv.as_mv.col>>3) - MAX_FULL_PEL_VAL + ((best
      _ref_mv.as_mv.col & 7)?1:0); | 
|  | 2001             int row_min = (best_ref_mv.as_mv.row>>3) - MAX_FULL_PEL_VAL + ((best
      _ref_mv.as_mv.row & 7)?1:0); | 
|  | 2002             int col_max = (best_ref_mv.as_mv.col>>3) + MAX_FULL_PEL_VAL; | 
|  | 2003             int row_max = (best_ref_mv.as_mv.row>>3) + MAX_FULL_PEL_VAL; | 
|  | 2004 | 
|  | 2005             int tmp_col_min = x->mv_col_min; | 
|  | 2006             int tmp_col_max = x->mv_col_max; | 
|  | 2007             int tmp_row_min = x->mv_row_min; | 
|  | 2008             int tmp_row_max = x->mv_row_max; | 
|  | 2009 | 
|  | 2010             if(!saddone) | 
| 2053             { | 2011             { | 
| 2054                 int thissme; | 2012                 vp8_cal_sad(cpi,xd,x, recon_yoffset ,&near_sadidx[0] ); | 
| 2055                 int bestsme = INT_MAX; | 2013                 saddone = 1; | 
| 2056                 int step_param = cpi->sf.first_step; | 2014             } | 
| 2057                 int search_range; |  | 
| 2058                 int further_steps; |  | 
| 2059                 int n; |  | 
| 2060 | 2015 | 
| 2061                 int col_min = (best_ref_mv.col - MAX_FULL_PEL_VAL) >>3; | 2016             vp8_mv_pred(cpi, &x->e_mbd, x->e_mbd.mode_info_context, &mvp, | 
| 2062                 int col_max = (best_ref_mv.col + MAX_FULL_PEL_VAL) >>3; | 2017                         x->e_mbd.mode_info_context->mbmi.ref_frame, cpi->common.
      ref_frame_sign_bias, &sr, &near_sadidx[0]); | 
| 2063                 int row_min = (best_ref_mv.row - MAX_FULL_PEL_VAL) >>3; |  | 
| 2064                 int row_max = (best_ref_mv.row + MAX_FULL_PEL_VAL) >>3; |  | 
| 2065 | 2018 | 
| 2066                 int tmp_col_min = x->mv_col_min; | 2019             mvp_full.as_mv.col = mvp.as_mv.col>>3; | 
| 2067                 int tmp_col_max = x->mv_col_max; | 2020             mvp_full.as_mv.row = mvp.as_mv.row>>3; | 
| 2068                 int tmp_row_min = x->mv_row_min; |  | 
| 2069                 int tmp_row_max = x->mv_row_max; |  | 
| 2070 | 2021 | 
| 2071                 // Get intersection of UMV window and valid MV window to reduce 
      # of checks in diamond search. | 2022             // Get intersection of UMV window and valid MV window to reduce # of
       checks in diamond search. | 
| 2072                 if (x->mv_col_min < col_min ) | 2023             if (x->mv_col_min < col_min ) | 
| 2073                     x->mv_col_min = col_min; | 2024                 x->mv_col_min = col_min; | 
| 2074                 if (x->mv_col_max > col_max ) | 2025             if (x->mv_col_max > col_max ) | 
| 2075                     x->mv_col_max = col_max; | 2026                 x->mv_col_max = col_max; | 
| 2076                 if (x->mv_row_min < row_min ) | 2027             if (x->mv_row_min < row_min ) | 
| 2077                     x->mv_row_min = row_min; | 2028                 x->mv_row_min = row_min; | 
| 2078                 if (x->mv_row_max > row_max ) | 2029             if (x->mv_row_max > row_max ) | 
| 2079                     x->mv_row_max = row_max; | 2030                 x->mv_row_max = row_max; | 
| 2080 | 2031 | 
| 2081                 //adjust search range according to sr from mv prediction | 2032             //adjust search range according to sr from mv prediction | 
| 2082                 if(sr > step_param) | 2033             if(sr > step_param) | 
| 2083                     step_param = sr; | 2034                 step_param = sr; | 
| 2084 | 2035 | 
| 2085                 // Work out how long a search we should do | 2036             // Initial step/diamond search | 
| 2086                 search_range = MAXF(abs(best_ref_mv.col), abs(best_ref_mv.row)) 
      >> 3; | 2037             { | 
|  | 2038                 bestsme = cpi->diamond_search_sad(x, b, d, &mvp_full, &d->bmi.mv
      , | 
|  | 2039                                         step_param, sadpb, &num00, | 
|  | 2040                                         &cpi->fn_ptr[BLOCK_16X16], | 
|  | 2041                                         x->mvcost, &best_ref_mv); | 
|  | 2042                 mode_mv[NEWMV].as_int = d->bmi.mv.as_int; | 
| 2087 | 2043 | 
| 2088                 if (search_range >= x->vector_range) | 2044                 // Further step/diamond searches as necessary | 
| 2089                     x->vector_range = search_range; | 2045                 n = 0; | 
| 2090                 else if (x->vector_range > cpi->sf.min_fs_radius) | 2046                 further_steps = (cpi->sf.max_step_search_steps - 1) - step_param
      ; | 
| 2091                     x->vector_range--; |  | 
| 2092 | 2047 | 
| 2093                 // Initial step/diamond search | 2048                 n = num00; | 
|  | 2049                 num00 = 0; | 
|  | 2050 | 
|  | 2051                 /* If there won't be more n-step search, check to see if refinin
      g search is needed. */ | 
|  | 2052                 if (n > further_steps) | 
|  | 2053                     do_refine = 0; | 
|  | 2054 | 
|  | 2055                 while (n < further_steps) | 
| 2094                 { | 2056                 { | 
| 2095                     int sadpb = x->sadperbit16; | 2057                     n++; | 
| 2096 | 2058 | 
| 2097                     if (cpi->sf.search_method == HEX) | 2059                     if (num00) | 
| 2098                     { | 2060                         num00--; | 
| 2099                         bestsme = vp8_hex_search(x, b, d, &best_ref_mv, &d->bmi.
      mv.as_mv, step_param, sadpb/*x->errorperbit*/, &num00, &cpi->fn_ptr[BLOCK_16X16]
      , x->mvsadcost, x->mvcost, &best_ref_mv); |  | 
| 2100                         mode_mv[NEWMV].row = d->bmi.mv.as_mv.row; |  | 
| 2101                         mode_mv[NEWMV].col = d->bmi.mv.as_mv.col; |  | 
| 2102                     } |  | 
| 2103                     else | 2061                     else | 
| 2104                     { | 2062                     { | 
| 2105                         bestsme = cpi->diamond_search_sad(x, b, d, &mvp, &d->bmi
      .mv.as_mv, step_param, sadpb / 2/*x->errorperbit*/, &num00, &cpi->fn_ptr[BLOCK_1
      6X16], x->mvsadcost, x->mvcost, &best_ref_mv); //sadpb < 9 | 2063                         thissme = cpi->diamond_search_sad(x, b, d, &mvp_full, | 
| 2106                         mode_mv[NEWMV].row = d->bmi.mv.as_mv.row; | 2064                                     &d->bmi.mv, step_param + n, sadpb, &num00, | 
| 2107                         mode_mv[NEWMV].col = d->bmi.mv.as_mv.col; | 2065                                     &cpi->fn_ptr[BLOCK_16X16], x->mvcost, | 
|  | 2066                                     &best_ref_mv); | 
| 2108 | 2067 | 
| 2109                         // Further step/diamond searches as necessary | 2068                         /* check to see if refining search is needed. */ | 
| 2110                         n = 0; | 2069                         if (num00 > (further_steps-n)) | 
| 2111                         further_steps = (cpi->sf.max_step_search_steps - 1) - st
      ep_param; | 2070                             do_refine = 0; | 
| 2112 | 2071 | 
| 2113                         n = num00; | 2072                         if (thissme < bestsme) | 
| 2114                         num00 = 0; |  | 
| 2115 |  | 
| 2116                         while (n < further_steps) |  | 
| 2117                         { | 2073                         { | 
| 2118                             n++; | 2074                             bestsme = thissme; | 
| 2119 | 2075                             mode_mv[NEWMV].as_int = d->bmi.mv.as_int; | 
| 2120                             if (num00) | 2076                         } | 
| 2121                                 num00--; | 2077                         else | 
| 2122                             else | 2078                         { | 
| 2123                             { | 2079                             d->bmi.mv.as_int = mode_mv[NEWMV].as_int; | 
| 2124                                 thissme = cpi->diamond_search_sad(x, b, d, &mvp,
       &d->bmi.mv.as_mv, step_param + n, sadpb / 4/*x->errorperbit*/, &num00, &cpi->fn
      _ptr[BLOCK_16X16], x->mvsadcost, x->mvcost, &best_ref_mv); //sadpb = 9 |  | 
| 2125 |  | 
| 2126                                 if (thissme < bestsme) |  | 
| 2127                                 { |  | 
| 2128                                     bestsme = thissme; |  | 
| 2129                                     mode_mv[NEWMV].row = d->bmi.mv.as_mv.row; |  | 
| 2130                                     mode_mv[NEWMV].col = d->bmi.mv.as_mv.col; |  | 
| 2131                                 } |  | 
| 2132                                 else |  | 
| 2133                                 { |  | 
| 2134                                     d->bmi.mv.as_mv.row = mode_mv[NEWMV].row; |  | 
| 2135                                     d->bmi.mv.as_mv.col = mode_mv[NEWMV].col; |  | 
| 2136                                 } |  | 
| 2137                             } |  | 
| 2138                         } | 2080                         } | 
| 2139                     } | 2081                     } | 
|  | 2082                 } | 
|  | 2083             } | 
| 2140 | 2084 | 
|  | 2085             /* final 1-away diamond refining search */ | 
|  | 2086             if (do_refine == 1) | 
|  | 2087             { | 
|  | 2088                 int search_range; | 
|  | 2089 | 
|  | 2090                 //It seems not a good way to set search_range. Need further inve
      stigation. | 
|  | 2091                 //search_range = MAXF(abs((mvp.row>>3) - d->bmi.mv.as_mv.row), a
      bs((mvp.col>>3) - d->bmi.mv.as_mv.col)); | 
|  | 2092                 search_range = 8; | 
|  | 2093 | 
|  | 2094                 //thissme = cpi->full_search_sad(x, b, d, &d->bmi.mv.as_mv, sadp
      b, search_range, &cpi->fn_ptr[BLOCK_16X16], x->mvcost, &best_ref_mv); | 
|  | 2095                 thissme = cpi->refining_search_sad(x, b, d, &d->bmi.mv, sadpb, | 
|  | 2096                                        search_range, &cpi->fn_ptr[BLOCK_16X16], | 
|  | 2097                                        x->mvcost, &best_ref_mv); | 
|  | 2098 | 
|  | 2099                 if (thissme < bestsme) | 
|  | 2100                 { | 
|  | 2101                     bestsme = thissme; | 
|  | 2102                     mode_mv[NEWMV].as_int = d->bmi.mv.as_int; | 
| 2141                 } | 2103                 } | 
|  | 2104                 else | 
|  | 2105                 { | 
|  | 2106                     d->bmi.mv.as_int = mode_mv[NEWMV].as_int; | 
|  | 2107                 } | 
|  | 2108             } | 
| 2142 | 2109 | 
| 2143                 // Should we do a full search | 2110             x->mv_col_min = tmp_col_min; | 
| 2144                 if (!cpi->check_freq[lf_or_gf] || cpi->do_full[lf_or_gf]) | 2111             x->mv_col_max = tmp_col_max; | 
| 2145                 { | 2112             x->mv_row_min = tmp_row_min; | 
| 2146                     int thissme; | 2113             x->mv_row_max = tmp_row_max; | 
| 2147                     int full_flag_thresh = 0; |  | 
| 2148                     MV full_mvp; |  | 
| 2149 | 2114 | 
| 2150                     full_mvp.row = d->bmi.mv.as_mv.row <<3;    // use diamond se
      arch result as full search staring point | 2115             if (bestsme < INT_MAX) | 
| 2151                     full_mvp.col = d->bmi.mv.as_mv.col <<3; | 2116             { | 
|  | 2117                 int dis; /* TODO: use dis in distortion calculation later. */ | 
|  | 2118                 unsigned int sse; | 
|  | 2119                 cpi->find_fractional_mv_step(x, b, d, &d->bmi.mv, &best_ref_mv, | 
|  | 2120                                              x->errorperbit, | 
|  | 2121                                              &cpi->fn_ptr[BLOCK_16X16], | 
|  | 2122                                              x->mvcost, &dis, &sse); | 
|  | 2123             } | 
| 2152 | 2124 | 
| 2153                     // Update x->vector_range based on best vector found in step
       search | 2125             mode_mv[NEWMV].as_int = d->bmi.mv.as_int; | 
| 2154                     search_range = MAXF(abs((mvp.row>>3) - d->bmi.mv.as_mv.row),
       abs((mvp.col>>3) - d->bmi.mv.as_mv.col)); |  | 
| 2155                     //search_range *= 1.4;  //didn't improve PSNR |  | 
| 2156 | 2126 | 
| 2157                     if (search_range > x->vector_range) | 2127             // Add the new motion vector cost to our rolling cost variable | 
| 2158                         x->vector_range = search_range; | 2128             rate2 += vp8_mv_bit_cost(&mode_mv[NEWMV], &best_ref_mv, x->mvcost, 9
      6); | 
| 2159                     else | 2129         } | 
| 2160                         search_range = x->vector_range; |  | 
| 2161 |  | 
| 2162                     // Apply limits |  | 
| 2163                     search_range = (search_range > cpi->sf.max_fs_radius) ? cpi-
      >sf.max_fs_radius : search_range; |  | 
| 2164 |  | 
| 2165                     //add this to reduce full search range. |  | 
| 2166                     if(sr<=3 && search_range > 8) search_range = 8; |  | 
| 2167 |  | 
| 2168                     { |  | 
| 2169                         int sadpb = x->sadperbit16 >> 2; |  | 
| 2170                         thissme = cpi->full_search_sad(x, b, d, &full_mvp, sadpb
      , search_range, &cpi->fn_ptr[BLOCK_16X16], x->mvcost, x->mvsadcost,&best_ref_mv)
      ; |  | 
| 2171                     } |  | 
| 2172 |  | 
| 2173                     // Barrier threshold to initiating full search |  | 
| 2174                     // full_flag_thresh = 10 + (thissme >> 7); |  | 
| 2175                     if ((thissme + full_flag_thresh) < bestsme) |  | 
| 2176                     { |  | 
| 2177                         cpi->do_full[lf_or_gf] ++; |  | 
| 2178                         bestsme = thissme; |  | 
| 2179                     } |  | 
| 2180                     else if (thissme < bestsme) |  | 
| 2181                         bestsme = thissme; |  | 
| 2182                     else |  | 
| 2183                     { |  | 
| 2184                         cpi->do_full[lf_or_gf] = cpi->do_full[lf_or_gf] >> 1; |  | 
| 2185                         cpi->check_freq[lf_or_gf] = cpi->sf.full_freq[lf_or_gf]; |  | 
| 2186 |  | 
| 2187                         // The full search result is actually worse so re-instat
      e the previous best vector |  | 
| 2188                         d->bmi.mv.as_mv.row = mode_mv[NEWMV].row; |  | 
| 2189                         d->bmi.mv.as_mv.col = mode_mv[NEWMV].col; |  | 
| 2190                     } |  | 
| 2191                 } |  | 
| 2192 |  | 
| 2193                 x->mv_col_min = tmp_col_min; |  | 
| 2194                 x->mv_col_max = tmp_col_max; |  | 
| 2195                 x->mv_row_min = tmp_row_min; |  | 
| 2196                 x->mv_row_max = tmp_row_max; |  | 
| 2197 |  | 
| 2198                 if (bestsme < INT_MAX) |  | 
| 2199                     // cpi->find_fractional_mv_step(x,b,d,&d->bmi.mv.as_mv,&best
      _ref_mv,x->errorperbit/2,cpi->fn_ptr.svf,cpi->fn_ptr.vf,x->mvcost);  // normal m
      vc=11 |  | 
| 2200                     cpi->find_fractional_mv_step(x, b, d, &d->bmi.mv.as_mv, &bes
      t_ref_mv, x->errorperbit / 4, &cpi->fn_ptr[BLOCK_16X16], x->mvcost); |  | 
| 2201 |  | 
| 2202                 mode_mv[NEWMV].row = d->bmi.mv.as_mv.row; |  | 
| 2203                 mode_mv[NEWMV].col = d->bmi.mv.as_mv.col; |  | 
| 2204 |  | 
| 2205                 // Add the new motion vector cost to our rolling cost variable |  | 
| 2206                 rate2 += vp8_mv_bit_cost(&mode_mv[NEWMV], &best_ref_mv, x->mvcos
      t, 96); |  | 
| 2207 |  | 
| 2208             } |  | 
| 2209 | 2130 | 
| 2210         case NEARESTMV: | 2131         case NEARESTMV: | 
| 2211         case NEARMV: | 2132         case NEARMV: | 
| 2212 |  | 
| 2213             // Clip "next_nearest" so that it does not extend to far out of imag
      e | 2133             // Clip "next_nearest" so that it does not extend to far out of imag
      e | 
| 2214             if (mode_mv[this_mode].col < (xd->mb_to_left_edge - LEFT_TOP_MARGIN)
      ) | 2134             vp8_clamp_mv2(&mode_mv[this_mode], xd); | 
| 2215                 mode_mv[this_mode].col = xd->mb_to_left_edge - LEFT_TOP_MARGIN; |  | 
| 2216             else if (mode_mv[this_mode].col > xd->mb_to_right_edge + RIGHT_BOTTO
      M_MARGIN) |  | 
| 2217                 mode_mv[this_mode].col = xd->mb_to_right_edge + RIGHT_BOTTOM_MAR
      GIN; |  | 
| 2218 |  | 
| 2219             if (mode_mv[this_mode].row < (xd->mb_to_top_edge - LEFT_TOP_MARGIN)) |  | 
| 2220                 mode_mv[this_mode].row = xd->mb_to_top_edge - LEFT_TOP_MARGIN; |  | 
| 2221             else if (mode_mv[this_mode].row > xd->mb_to_bottom_edge + RIGHT_BOTT
      OM_MARGIN) |  | 
| 2222                 mode_mv[this_mode].row = xd->mb_to_bottom_edge + RIGHT_BOTTOM_MA
      RGIN; |  | 
| 2223 | 2135 | 
| 2224             // Do not bother proceeding if the vector (from newmv,nearest or nea
      r) is 0,0 as this should then be coded using the zeromv mode. | 2136             // Do not bother proceeding if the vector (from newmv,nearest or nea
      r) is 0,0 as this should then be coded using the zeromv mode. | 
| 2225             if (((this_mode == NEARMV) || (this_mode == NEARESTMV)) && | 2137             if (((this_mode == NEARMV) || (this_mode == NEARESTMV)) && (mode_mv[
      this_mode].as_int == 0)) | 
| 2226                 ((mode_mv[this_mode].row == 0) && (mode_mv[this_mode].col == 0))
      ) |  | 
| 2227                 continue; | 2138                 continue; | 
| 2228 | 2139 | 
| 2229         case ZEROMV: | 2140         case ZEROMV: | 
| 2230 | 2141 | 
| 2231         mv_selected: |  | 
| 2232 |  | 
| 2233             // Trap vectors that reach beyond the UMV borders | 2142             // Trap vectors that reach beyond the UMV borders | 
| 2234             // Note that ALL New MV, Nearest MV Near MV and Zero MV code drops t
      hrough to this point | 2143             // Note that ALL New MV, Nearest MV Near MV and Zero MV code drops t
      hrough to this point | 
| 2235             // because of the lack of break statements in the previous two cases
      . | 2144             // because of the lack of break statements in the previous two cases
      . | 
| 2236             if (((mode_mv[this_mode].row >> 3) < x->mv_row_min) || ((mode_mv[thi
      s_mode].row >> 3) > x->mv_row_max) || | 2145             if (((mode_mv[this_mode].as_mv.row >> 3) < x->mv_row_min) || ((mode_
      mv[this_mode].as_mv.row >> 3) > x->mv_row_max) || | 
| 2237                 ((mode_mv[this_mode].col >> 3) < x->mv_col_min) || ((mode_mv[thi
      s_mode].col >> 3) > x->mv_col_max)) | 2146                 ((mode_mv[this_mode].as_mv.col >> 3) < x->mv_col_min) || ((mode_
      mv[this_mode].as_mv.col >> 3) > x->mv_col_max)) | 
| 2238                 continue; | 2147                 continue; | 
| 2239 | 2148 | 
| 2240             vp8_set_mbmode_and_mvs(x, this_mode, &mode_mv[this_mode]); | 2149             vp8_set_mbmode_and_mvs(x, this_mode, &mode_mv[this_mode]); | 
| 2241             vp8_build_inter_predictors_mby(&x->e_mbd); | 2150             vp8_build_inter16x16_predictors_mby(&x->e_mbd); | 
| 2242 | 2151 | 
| 2243             if (cpi->active_map_enabled && x->active_ptr[0] == 0) { | 2152             if (cpi->active_map_enabled && x->active_ptr[0] == 0) { | 
| 2244                 x->skip = 1; | 2153                 x->skip = 1; | 
| 2245             } | 2154             } | 
| 2246             else if (x->encode_breakout) | 2155             else if (x->encode_breakout) | 
| 2247             { | 2156             { | 
| 2248                 int sum, sse; | 2157                 unsigned int sse; | 
|  | 2158                 unsigned int var; | 
| 2249                 int threshold = (xd->block[0].dequant[1] | 2159                 int threshold = (xd->block[0].dequant[1] | 
| 2250                             * xd->block[0].dequant[1] >>4); | 2160                             * xd->block[0].dequant[1] >>4); | 
| 2251 | 2161 | 
| 2252                 if(threshold < x->encode_breakout) | 2162                 if(threshold < x->encode_breakout) | 
| 2253                     threshold = x->encode_breakout; | 2163                     threshold = x->encode_breakout; | 
| 2254 | 2164 | 
| 2255                 VARIANCE_INVOKE(&cpi->rtcd.variance, get16x16var) | 2165                 var = VARIANCE_INVOKE(&cpi->rtcd.variance, var16x16) | 
| 2256                     (x->src.y_buffer, x->src.y_stride, | 2166                         (*(b->base_src), b->src_stride, | 
| 2257                      x->e_mbd.predictor, 16, (unsigned int *)(&sse), &sum); | 2167                         x->e_mbd.predictor, 16, &sse); | 
| 2258 | 2168 | 
| 2259                 if (sse < threshold) | 2169                 if (sse < threshold) | 
| 2260                 { | 2170                 { | 
| 2261                     // Check u and v to make sure skip is ok | 2171                      unsigned int q2dc = xd->block[24].dequant[0]; | 
| 2262                     int sse2 = 0; |  | 
| 2263                     /* If theres is no codeable 2nd order dc | 2172                     /* If theres is no codeable 2nd order dc | 
| 2264                        or a very small uniform pixel change change */ | 2173                        or a very small uniform pixel change change */ | 
| 2265                     if (abs(sum) < (xd->block[24].dequant[0]<<2)|| | 2174                     if ((sse - var < q2dc * q2dc >>4) || | 
| 2266                         ((sum * sum>>8) > sse && abs(sum) <128)) | 2175                         (sse /2 > var && sse-var < 64)) | 
| 2267                     { | 2176                     { | 
| 2268                         sse2 = VP8_UVSSE(x, IF_RTCD(&cpi->rtcd.variance)); | 2177                         // Check u and v to make sure skip is ok | 
| 2269 | 2178                         int sse2=  VP8_UVSSE(x, IF_RTCD(&cpi->rtcd.variance)); | 
| 2270                         if (sse2 * 2 < threshold) | 2179                         if (sse2 * 2 < threshold) | 
| 2271                         { | 2180                         { | 
| 2272                             x->skip = 1; | 2181                             x->skip = 1; | 
| 2273                             distortion2 = sse + sse2; | 2182                             distortion2 = sse + sse2; | 
| 2274                             rate2 = 500; | 2183                             rate2 = 500; | 
| 2275 | 2184 | 
| 2276                             /* for best_yrd calculation */ | 2185                             /* for best_yrd calculation */ | 
| 2277                             rate_uv = 0; | 2186                             rate_uv = 0; | 
| 2278                             distortion_uv = sse2; | 2187                             distortion_uv = sse2; | 
| 2279 | 2188 | 
| 2280                             disable_skip = 1; | 2189                             disable_skip = 1; | 
| 2281                             this_rd = RDCOST(x->rdmult, x->rddiv, rate2, | 2190                             this_rd = RDCOST(x->rdmult, x->rddiv, rate2, distort
      ion2); | 
| 2282                                              distortion2); |  | 
| 2283 | 2191 | 
| 2284                             break; | 2192                             break; | 
| 2285                         } | 2193                         } | 
| 2286                     } | 2194                     } | 
| 2287                 } | 2195                 } | 
| 2288             } | 2196             } | 
| 2289 | 2197 | 
| 2290 | 2198 | 
| 2291             //intermodecost[mode_index] = vp8_cost_mv_ref(this_mode, mdcounts); 
        // Experimental debug code | 2199             //intermodecost[mode_index] = vp8_cost_mv_ref(this_mode, mdcounts); 
        // Experimental debug code | 
| 2292 | 2200 | 
| (...skipping 17 matching lines...) Expand all  Loading... | 
| 2310 | 2218 | 
| 2311         // Where skip is allowable add in the default per mb cost for the no ski
      p case. | 2219         // Where skip is allowable add in the default per mb cost for the no ski
      p case. | 
| 2312         // where we then decide to skip we have to delete this and replace it wi
      th the | 2220         // where we then decide to skip we have to delete this and replace it wi
      th the | 
| 2313         // cost of signallying a skip | 2221         // cost of signallying a skip | 
| 2314         if (cpi->common.mb_no_coeff_skip) | 2222         if (cpi->common.mb_no_coeff_skip) | 
| 2315         { | 2223         { | 
| 2316             other_cost += vp8_cost_bit(cpi->prob_skip_false, 0); | 2224             other_cost += vp8_cost_bit(cpi->prob_skip_false, 0); | 
| 2317             rate2 += other_cost; | 2225             rate2 += other_cost; | 
| 2318         } | 2226         } | 
| 2319 | 2227 | 
| 2320         // Estimate the reference frame signaling cost and add it to the rolling
       cost variable. | 2228         /* Estimate the reference frame signaling cost and add it | 
| 2321         rate2 += ref_frame_cost[x->e_mbd.mode_info_context->mbmi.ref_frame]; | 2229          * to the rolling cost variable. | 
|  | 2230          */ | 
|  | 2231         rate2 += | 
|  | 2232             x->e_mbd.ref_frame_cost[x->e_mbd.mode_info_context->mbmi.ref_frame]; | 
| 2322 | 2233 | 
| 2323         if (!disable_skip) | 2234         if (!disable_skip) | 
| 2324         { | 2235         { | 
| 2325             // Test for the condition where skip block will be activated because
       there are no non zero coefficients and make any necessary adjustment for rate | 2236             // Test for the condition where skip block will be activated because
       there are no non zero coefficients and make any necessary adjustment for rate | 
| 2326             if (cpi->common.mb_no_coeff_skip) | 2237             if (cpi->common.mb_no_coeff_skip) | 
| 2327             { | 2238             { | 
| 2328                 int tteob; | 2239                 int tteob; | 
| 2329 | 2240 | 
| 2330                 tteob = 0; | 2241                 tteob = 0; | 
| 2331 | 2242 | 
| (...skipping 22 matching lines...) Expand all  Loading... | 
| 2354             } | 2265             } | 
| 2355             // Calculate the final RD estimate for this mode | 2266             // Calculate the final RD estimate for this mode | 
| 2356             this_rd = RDCOST(x->rdmult, x->rddiv, rate2, distortion2); | 2267             this_rd = RDCOST(x->rdmult, x->rddiv, rate2, distortion2); | 
| 2357         } | 2268         } | 
| 2358 | 2269 | 
| 2359         // Experimental debug code. | 2270         // Experimental debug code. | 
| 2360         //all_rds[mode_index] = this_rd; | 2271         //all_rds[mode_index] = this_rd; | 
| 2361         //all_rates[mode_index] = rate2; | 2272         //all_rates[mode_index] = rate2; | 
| 2362         //all_dist[mode_index] = distortion2; | 2273         //all_dist[mode_index] = distortion2; | 
| 2363 | 2274 | 
| 2364         if ((x->e_mbd.mode_info_context->mbmi.ref_frame == INTRA_FRAME)  && (thi
      s_rd < *returnintra)) | 2275         // Keep record of best intra distortion | 
|  | 2276         if ((x->e_mbd.mode_info_context->mbmi.ref_frame == INTRA_FRAME) && | 
|  | 2277             (this_rd < best_intra_rd) ) | 
| 2365         { | 2278         { | 
| 2366             *returnintra = this_rd ; | 2279             best_intra_rd = this_rd; | 
|  | 2280             *returnintra = distortion2 ; | 
| 2367         } | 2281         } | 
| 2368 | 2282 | 
| 2369         // Did this mode help.. i.i is it the new best mode | 2283         // Did this mode help.. i.i is it the new best mode | 
| 2370         if (this_rd < best_rd || x->skip) | 2284         if (this_rd < best_rd || x->skip) | 
| 2371         { | 2285         { | 
| 2372             // Note index of best mode so far | 2286             // Note index of best mode so far | 
| 2373             best_mode_index = mode_index; | 2287             best_mode_index = mode_index; | 
| 2374             x->e_mbd.mode_info_context->mbmi.force_no_skip = force_no_skip; |  | 
| 2375 | 2288 | 
| 2376             if (this_mode <= B_PRED) | 2289             if (this_mode <= B_PRED) | 
| 2377             { | 2290             { | 
| 2378                 x->e_mbd.mode_info_context->mbmi.uv_mode = uv_intra_mode; | 2291                 x->e_mbd.mode_info_context->mbmi.uv_mode = uv_intra_mode; | 
|  | 2292                 /* required for left and above block mv */ | 
|  | 2293                 x->e_mbd.mode_info_context->mbmi.mv.as_int = 0; | 
| 2379             } | 2294             } | 
| 2380 | 2295 | 
| 2381             other_cost += ref_frame_cost[x->e_mbd.mode_info_context->mbmi.ref_fr
      ame]; | 2296             other_cost += | 
|  | 2297             x->e_mbd.ref_frame_cost[x->e_mbd.mode_info_context->mbmi.ref_frame]; | 
| 2382 | 2298 | 
| 2383             /* Calculate the final y RD estimate for this mode */ | 2299             /* Calculate the final y RD estimate for this mode */ | 
| 2384             best_yrd = RDCOST(x->rdmult, x->rddiv, (rate2-rate_uv-other_cost), | 2300             best_yrd = RDCOST(x->rdmult, x->rddiv, (rate2-rate_uv-other_cost), | 
| 2385                               (distortion2-distortion_uv)); | 2301                               (distortion2-distortion_uv)); | 
| 2386 | 2302 | 
| 2387             *returnrate = rate2; | 2303             *returnrate = rate2; | 
| 2388             *returndistortion = distortion2; | 2304             *returndistortion = distortion2; | 
| 2389             best_rd = this_rd; | 2305             best_rd = this_rd; | 
| 2390             vpx_memcpy(&best_mbmode, &x->e_mbd.mode_info_context->mbmi, sizeof(M
      B_MODE_INFO)); | 2306             vpx_memcpy(&best_mbmode, &x->e_mbd.mode_info_context->mbmi, sizeof(M
      B_MODE_INFO)); | 
| 2391             vpx_memcpy(&best_partition, x->partition_info, sizeof(PARTITION_INFO
      )); | 2307             vpx_memcpy(&best_partition, x->partition_info, sizeof(PARTITION_INFO
      )); | 
| 2392 | 2308 | 
| 2393             for (i = 0; i < 16; i++) | 2309             if ((this_mode == B_PRED) || (this_mode == SPLITMV)) | 
| 2394             { | 2310                 for (i = 0; i < 16; i++) | 
| 2395                 vpx_memcpy(&best_bmodes[i], &x->e_mbd.block[i].bmi, sizeof(B_MOD
      E_INFO)); | 2311                 { | 
| 2396             } | 2312                     best_bmodes[i] = x->e_mbd.block[i].bmi; | 
|  | 2313                 } | 
|  | 2314 | 
| 2397 | 2315 | 
| 2398             // Testing this mode gave rise to an improvement in best error score
      . Lower threshold a bit for next time | 2316             // Testing this mode gave rise to an improvement in best error score
      . Lower threshold a bit for next time | 
| 2399             cpi->rd_thresh_mult[mode_index] = (cpi->rd_thresh_mult[mode_index] >
      = (MIN_THRESHMULT + 2)) ? cpi->rd_thresh_mult[mode_index] - 2 : MIN_THRESHMULT; | 2317             cpi->rd_thresh_mult[mode_index] = (cpi->rd_thresh_mult[mode_index] >
      = (MIN_THRESHMULT + 2)) ? cpi->rd_thresh_mult[mode_index] - 2 : MIN_THRESHMULT; | 
| 2400             cpi->rd_threshes[mode_index] = (cpi->rd_baseline_thresh[mode_index] 
      >> 7) * cpi->rd_thresh_mult[mode_index]; | 2318             cpi->rd_threshes[mode_index] = (cpi->rd_baseline_thresh[mode_index] 
      >> 7) * cpi->rd_thresh_mult[mode_index]; | 
| 2401         } | 2319         } | 
| 2402 | 2320 | 
| 2403         // If the mode did not help improve the best error case then raise the t
      hreshold for testing that mode next time around. | 2321         // If the mode did not help improve the best error case then raise the t
      hreshold for testing that mode next time around. | 
| 2404         else | 2322         else | 
| 2405         { | 2323         { | 
| 2406             cpi->rd_thresh_mult[mode_index] += 4; | 2324             cpi->rd_thresh_mult[mode_index] += 4; | 
| (...skipping 28 matching lines...) Expand all  Loading... | 
| 2435             cpi->rd_thresh_mult[THR_NEWG] = (cpi->rd_thresh_mult[THR_NEWG] >= (M
      IN_THRESHMULT+best_adjustment)) ? cpi->rd_thresh_mult[THR_NEWG]-best_adjustment:
       MIN_THRESHMULT; | 2353             cpi->rd_thresh_mult[THR_NEWG] = (cpi->rd_thresh_mult[THR_NEWG] >= (M
      IN_THRESHMULT+best_adjustment)) ? cpi->rd_thresh_mult[THR_NEWG]-best_adjustment:
       MIN_THRESHMULT; | 
| 2436             cpi->rd_threshes[THR_NEWG] = (cpi->rd_baseline_thresh[THR_NEWG] >> 7
      ) * cpi->rd_thresh_mult[THR_NEWG]; | 2354             cpi->rd_threshes[THR_NEWG] = (cpi->rd_baseline_thresh[THR_NEWG] >> 7
      ) * cpi->rd_thresh_mult[THR_NEWG]; | 
| 2437 | 2355 | 
| 2438             best_adjustment = 4; //(cpi->rd_thresh_mult[THR_NEWA] >> 4); | 2356             best_adjustment = 4; //(cpi->rd_thresh_mult[THR_NEWA] >> 4); | 
| 2439             cpi->rd_thresh_mult[THR_NEWA] = (cpi->rd_thresh_mult[THR_NEWA] >= (M
      IN_THRESHMULT+best_adjustment)) ? cpi->rd_thresh_mult[THR_NEWA]-best_adjustment:
       MIN_THRESHMULT; | 2357             cpi->rd_thresh_mult[THR_NEWA] = (cpi->rd_thresh_mult[THR_NEWA] >= (M
      IN_THRESHMULT+best_adjustment)) ? cpi->rd_thresh_mult[THR_NEWA]-best_adjustment:
       MIN_THRESHMULT; | 
| 2440             cpi->rd_threshes[THR_NEWA] = (cpi->rd_baseline_thresh[THR_NEWA] >> 7
      ) * cpi->rd_thresh_mult[THR_NEWA]; | 2358             cpi->rd_threshes[THR_NEWA] = (cpi->rd_baseline_thresh[THR_NEWA] >> 7
      ) * cpi->rd_thresh_mult[THR_NEWA]; | 
| 2441         }*/ | 2359         }*/ | 
| 2442 | 2360 | 
| 2443     } | 2361     } | 
| 2444 | 2362 | 
| 2445     // If we have chosen new mv or split then decay the full search check count 
      more quickly. |  | 
| 2446     if ((vp8_mode_order[best_mode_index] == NEWMV) || (vp8_mode_order[best_mode_
      index] == SPLITMV)) |  | 
| 2447     { |  | 
| 2448         int lf_or_gf = (vp8_ref_frame_order[best_mode_index] == LAST_FRAME) ? 0 
      : 1; |  | 
| 2449 |  | 
| 2450         if (cpi->check_freq[lf_or_gf] && !cpi->do_full[lf_or_gf]) |  | 
| 2451         { |  | 
| 2452             cpi->check_freq[lf_or_gf] --; |  | 
| 2453         } |  | 
| 2454     } |  | 
| 2455 |  | 
| 2456     // Keep a record of best mode index that we chose |  | 
| 2457     cpi->last_best_mode_index = best_mode_index; |  | 
| 2458 |  | 
| 2459     // Note how often each mode chosen as best | 2363     // Note how often each mode chosen as best | 
| 2460     cpi->mode_chosen_counts[best_mode_index] ++; | 2364     cpi->mode_chosen_counts[best_mode_index] ++; | 
| 2461 | 2365 | 
| 2462 | 2366 | 
| 2463     if (cpi->is_src_frame_alt_ref && (best_mbmode.mode != ZEROMV || best_mbmode.
      ref_frame != ALTREF_FRAME)) | 2367     if (cpi->is_src_frame_alt_ref && | 
|  | 2368         (best_mbmode.mode != ZEROMV || best_mbmode.ref_frame != ALTREF_FRAME)) | 
| 2464     { | 2369     { | 
| 2465         best_mbmode.mode = ZEROMV; | 2370         x->e_mbd.mode_info_context->mbmi.mode = ZEROMV; | 
| 2466         best_mbmode.ref_frame = ALTREF_FRAME; | 2371         x->e_mbd.mode_info_context->mbmi.ref_frame = ALTREF_FRAME; | 
| 2467         best_mbmode.mv.as_int = 0; | 2372         x->e_mbd.mode_info_context->mbmi.mv.as_int = 0; | 
| 2468         best_mbmode.uv_mode = 0; | 2373         x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED; | 
| 2469         best_mbmode.mb_skip_coeff = (cpi->common.mb_no_coeff_skip) ? 1 : 0; | 2374         x->e_mbd.mode_info_context->mbmi.mb_skip_coeff = | 
| 2470         best_mbmode.partitioning = 0; | 2375                                         (cpi->common.mb_no_coeff_skip) ? 1 : 0; | 
| 2471         best_mbmode.dc_diff = 0; | 2376         x->e_mbd.mode_info_context->mbmi.partitioning = 0; | 
| 2472 | 2377 | 
| 2473         vpx_memcpy(&x->e_mbd.mode_info_context->mbmi, &best_mbmode, sizeof(MB_MO
      DE_INFO)); | 2378         return; | 
| 2474         vpx_memcpy(x->partition_info, &best_partition, sizeof(PARTITION_INFO)); |  | 
| 2475 |  | 
| 2476         for (i = 0; i < 16; i++) |  | 
| 2477         { |  | 
| 2478             vpx_memset(&x->e_mbd.block[i].bmi, 0, sizeof(B_MODE_INFO)); |  | 
| 2479         } |  | 
| 2480 |  | 
| 2481         x->e_mbd.mode_info_context->mbmi.mv.as_int = 0; |  | 
| 2482 |  | 
| 2483         return best_rd; |  | 
| 2484     } | 2379     } | 
| 2485 | 2380 | 
| 2486 | 2381 | 
| 2487     if(best_mbmode.mode <= B_PRED) | 2382     // macroblock modes | 
|  | 2383     vpx_memcpy(&x->e_mbd.mode_info_context->mbmi, &best_mbmode, sizeof(MB_MODE_I
      NFO)); | 
|  | 2384 | 
|  | 2385     if (best_mbmode.mode == B_PRED) | 
| 2488     { | 2386     { | 
| 2489         int i; |  | 
| 2490         for (i = 0; i < 16; i++) | 2387         for (i = 0; i < 16; i++) | 
| 2491         { | 2388           x->e_mbd.block[i].bmi.as_mode = best_bmodes[i].as_mode; | 
| 2492             best_bmodes[i].mv.as_int = 0; |  | 
| 2493         } |  | 
| 2494     } | 2389     } | 
| 2495 | 2390 | 
| 2496     // macroblock modes | 2391     if (best_mbmode.mode == SPLITMV) | 
| 2497     vpx_memcpy(&x->e_mbd.mode_info_context->mbmi, &best_mbmode, sizeof(MB_MODE_I
      NFO)); | 2392     { | 
| 2498     vpx_memcpy(x->partition_info, &best_partition, sizeof(PARTITION_INFO)); | 2393         for (i = 0; i < 16; i++) | 
|  | 2394             x->e_mbd.block[i].bmi.mv.as_int = best_bmodes[i].mv.as_int; | 
| 2499 | 2395 | 
| 2500     for (i = 0; i < 16; i++) | 2396         vpx_memcpy(x->partition_info, &best_partition, sizeof(PARTITION_INFO)); | 
| 2501     { | 2397 | 
| 2502         vpx_memcpy(&x->e_mbd.block[i].bmi, &best_bmodes[i], sizeof(B_MODE_INFO))
      ; | 2398         x->e_mbd.mode_info_context->mbmi.mv.as_int = | 
|  | 2399                                       x->partition_info->bmi[15].mv.as_int; | 
| 2503     } | 2400     } | 
| 2504 | 2401 | 
| 2505     x->e_mbd.mode_info_context->mbmi.mv.as_mv = x->e_mbd.block[15].bmi.mv.as_mv; | 2402     rd_update_mvcount(cpi, x, &frame_best_ref_mv[xd->mode_info_context->mbmi.ref
      _frame]); | 
| 2506 | 2403 | 
| 2507     return best_rd; |  | 
| 2508 } | 2404 } | 
| 2509 #endif | 2405 | 
|  | 2406 void vp8_rd_pick_intra_mode(VP8_COMP *cpi, MACROBLOCK *x, int *rate_) | 
|  | 2407 { | 
|  | 2408     int error4x4, error16x16; | 
|  | 2409     int rate4x4, rate16x16 = 0, rateuv; | 
|  | 2410     int dist4x4, dist16x16, distuv; | 
|  | 2411     int rate; | 
|  | 2412     int rate4x4_tokenonly = 0; | 
|  | 2413     int rate16x16_tokenonly = 0; | 
|  | 2414     int rateuv_tokenonly = 0; | 
|  | 2415 | 
|  | 2416     x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME; | 
|  | 2417 | 
|  | 2418     rd_pick_intra_mbuv_mode(cpi, x, &rateuv, &rateuv_tokenonly, &distuv); | 
|  | 2419     rate = rateuv; | 
|  | 2420 | 
|  | 2421     error16x16 = rd_pick_intra16x16mby_mode(cpi, x, | 
|  | 2422                                             &rate16x16, &rate16x16_tokenonly, | 
|  | 2423                                             &dist16x16); | 
|  | 2424 | 
|  | 2425     error4x4 = rd_pick_intra4x4mby_modes(cpi, x, | 
|  | 2426                                          &rate4x4, &rate4x4_tokenonly, | 
|  | 2427                                          &dist4x4, error16x16); | 
|  | 2428 | 
|  | 2429     if (error4x4 < error16x16) | 
|  | 2430     { | 
|  | 2431         x->e_mbd.mode_info_context->mbmi.mode = B_PRED; | 
|  | 2432         rate += rate4x4; | 
|  | 2433     } | 
|  | 2434     else | 
|  | 2435     { | 
|  | 2436         rate += rate16x16; | 
|  | 2437     } | 
|  | 2438 | 
|  | 2439     *rate_ = rate; | 
|  | 2440 } | 
| OLD | NEW | 
|---|