| 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 24 matching lines...) Expand all Loading... |
| 35 | 35 |
| 36 extern int VP8_UVSSE(MACROBLOCK *x, const vp8_variance_rtcd_vtable_t *rtcd); | 36 extern int VP8_UVSSE(MACROBLOCK *x, const vp8_variance_rtcd_vtable_t *rtcd); |
| 37 | 37 |
| 38 #ifdef SPEEDSTATS | 38 #ifdef SPEEDSTATS |
| 39 extern unsigned int cnt_pm; | 39 extern unsigned int cnt_pm; |
| 40 #endif | 40 #endif |
| 41 | 41 |
| 42 extern const MV_REFERENCE_FRAME vp8_ref_frame_order[MAX_MODES]; | 42 extern const MV_REFERENCE_FRAME vp8_ref_frame_order[MAX_MODES]; |
| 43 extern const MB_PREDICTION_MODE vp8_mode_order[MAX_MODES]; | 43 extern const MB_PREDICTION_MODE vp8_mode_order[MAX_MODES]; |
| 44 | 44 |
| 45 | |
| 46 extern unsigned int (*vp8_get16x16pred_error)(unsigned char *src_ptr, int src_st
ride, unsigned char *ref_ptr, int ref_stride); | |
| 47 extern unsigned int (*vp8_get4x4sse_cs)(unsigned char *src_ptr, int source_stri
de, unsigned char *ref_ptr, int recon_stride); | 45 extern unsigned int (*vp8_get4x4sse_cs)(unsigned char *src_ptr, int source_stri
de, unsigned char *ref_ptr, int recon_stride); |
| 48 extern int vp8_rd_pick_best_mbsegmentation(VP8_COMP *cpi, MACROBLOCK *x, MV *bes
t_ref_mv, int best_rd, int *, int *, int *, int, int *mvcost[2], int, int fullpi
xel); | |
| 49 extern int vp8_cost_mv_ref(MB_PREDICTION_MODE m, const int near_mv_ref_ct[4]); | 46 extern int vp8_cost_mv_ref(MB_PREDICTION_MODE m, const int near_mv_ref_ct[4]); |
| 50 extern void vp8_set_mbmode_and_mvs(MACROBLOCK *x, MB_PREDICTION_MODE mb, MV *mv)
; | |
| 51 | 47 |
| 52 | 48 |
| 53 int vp8_skip_fractional_mv_step(MACROBLOCK *mb, BLOCK *b, BLOCKD *d, MV *bestmv,
MV *ref_mv, int error_per_bit, const vp8_variance_fn_ptr_t *vfp, int *mvcost[2]
) | 49 int vp8_skip_fractional_mv_step(MACROBLOCK *mb, BLOCK *b, BLOCKD *d, |
| 50 int_mv *bestmv, int_mv *ref_mv, |
| 51 int error_per_bit, |
| 52 const vp8_variance_fn_ptr_t *vfp, |
| 53 int *mvcost[2], int *distortion, |
| 54 unsigned int *sse) |
| 54 { | 55 { |
| 55 (void) b; | 56 (void) b; |
| 56 (void) d; | 57 (void) d; |
| 57 (void) ref_mv; | 58 (void) ref_mv; |
| 58 (void) error_per_bit; | 59 (void) error_per_bit; |
| 59 (void) vfp; | 60 (void) vfp; |
| 60 (void) mvcost; | 61 (void) mvcost; |
| 61 bestmv->row <<= 3; | 62 (void) distortion; |
| 62 bestmv->col <<= 3; | 63 (void) sse; |
| 64 bestmv->as_mv.row <<= 3; |
| 65 bestmv->as_mv.col <<= 3; |
| 63 return 0; | 66 return 0; |
| 64 } | 67 } |
| 65 | 68 |
| 66 | 69 |
| 67 static int get_inter_mbpred_error(MACROBLOCK *mb, const vp8_variance_fn_ptr_t *v
fp, unsigned int *sse) | 70 static int get_inter_mbpred_error(MACROBLOCK *mb, |
| 71 const vp8_variance_fn_ptr_t *vfp, |
| 72 unsigned int *sse, |
| 73 int_mv this_mv) |
| 68 { | 74 { |
| 69 | 75 |
| 70 BLOCK *b = &mb->block[0]; | 76 BLOCK *b = &mb->block[0]; |
| 71 BLOCKD *d = &mb->e_mbd.block[0]; | 77 BLOCKD *d = &mb->e_mbd.block[0]; |
| 72 unsigned char *what = (*(b->base_src) + b->src); | 78 unsigned char *what = (*(b->base_src) + b->src); |
| 73 int what_stride = b->src_stride; | 79 int what_stride = b->src_stride; |
| 74 unsigned char *in_what = *(d->base_pre) + d->pre ; | 80 unsigned char *in_what = *(d->base_pre) + d->pre ; |
| 75 int in_what_stride = d->pre_stride; | 81 int in_what_stride = d->pre_stride; |
| 76 int xoffset = d->bmi.mv.as_mv.col & 7; | 82 int xoffset = this_mv.as_mv.col & 7; |
| 77 int yoffset = d->bmi.mv.as_mv.row & 7; | 83 int yoffset = this_mv.as_mv.row & 7; |
| 78 | 84 |
| 79 in_what += (d->bmi.mv.as_mv.row >> 3) * d->pre_stride + (d->bmi.mv.as_mv.col
>> 3); | 85 in_what += (this_mv.as_mv.row >> 3) * d->pre_stride + (this_mv.as_mv.col >>
3); |
| 80 | 86 |
| 81 if (xoffset | yoffset) | 87 if (xoffset | yoffset) |
| 82 { | 88 { |
| 83 return vfp->svf(in_what, in_what_stride, xoffset, yoffset, what, what_st
ride, sse); | 89 return vfp->svf(in_what, in_what_stride, xoffset, yoffset, what, what_st
ride, sse); |
| 84 } | 90 } |
| 85 else | 91 else |
| 86 { | 92 { |
| 87 return vfp->vf(what, what_stride, in_what, in_what_stride, sse); | 93 return vfp->vf(what, what_stride, in_what, in_what_stride, sse); |
| 88 } | 94 } |
| 89 | 95 |
| 90 } | 96 } |
| 91 | 97 |
| 92 unsigned int vp8_get16x16pred_error_c | |
| 93 ( | |
| 94 const unsigned char *src_ptr, | |
| 95 int src_stride, | |
| 96 const unsigned char *ref_ptr, | |
| 97 int ref_stride, | |
| 98 int max_sad | |
| 99 ) | |
| 100 { | |
| 101 unsigned pred_error = 0; | |
| 102 int i, j; | |
| 103 int sum = 0; | |
| 104 | |
| 105 for (i = 0; i < 16; i++) | |
| 106 { | |
| 107 int diff; | |
| 108 | |
| 109 for (j = 0; j < 16; j++) | |
| 110 { | |
| 111 diff = src_ptr[j] - ref_ptr[j]; | |
| 112 sum += diff; | |
| 113 pred_error += diff * diff; | |
| 114 } | |
| 115 | |
| 116 src_ptr += src_stride; | |
| 117 ref_ptr += ref_stride; | |
| 118 } | |
| 119 | |
| 120 pred_error -= sum * sum / 256; | |
| 121 return pred_error; | |
| 122 } | |
| 123 | |
| 124 | 98 |
| 125 unsigned int vp8_get4x4sse_cs_c | 99 unsigned int vp8_get4x4sse_cs_c |
| 126 ( | 100 ( |
| 127 const unsigned char *src_ptr, | 101 const unsigned char *src_ptr, |
| 128 int source_stride, | 102 int source_stride, |
| 129 const unsigned char *ref_ptr, | 103 const unsigned char *ref_ptr, |
| 130 int recon_stride, | 104 int recon_stride |
| 131 int max_sad | |
| 132 ) | 105 ) |
| 133 { | 106 { |
| 134 int distortion = 0; | 107 int distortion = 0; |
| 135 int r, c; | 108 int r, c; |
| 136 | 109 |
| 137 for (r = 0; r < 4; r++) | 110 for (r = 0; r < 4; r++) |
| 138 { | 111 { |
| 139 for (c = 0; c < 4; c++) | 112 for (c = 0; c < 4; c++) |
| 140 { | 113 { |
| 141 int diff = src_ptr[c] - ref_ptr[c]; | 114 int diff = src_ptr[c] - ref_ptr[c]; |
| 142 distortion += diff * diff; | 115 distortion += diff * diff; |
| 143 } | 116 } |
| 144 | 117 |
| 145 src_ptr += source_stride; | 118 src_ptr += source_stride; |
| 146 ref_ptr += recon_stride; | 119 ref_ptr += recon_stride; |
| 147 } | 120 } |
| 148 | 121 |
| 149 return distortion; | 122 return distortion; |
| 150 } | 123 } |
| 151 | 124 |
| 152 static int get_prediction_error(BLOCK *be, BLOCKD *b, const vp8_variance_rtcd_vt
able_t *rtcd) | 125 static int get_prediction_error(BLOCK *be, BLOCKD *b, const vp8_variance_rtcd_vt
able_t *rtcd) |
| 153 { | 126 { |
| 154 unsigned char *sptr; | 127 unsigned char *sptr; |
| 155 unsigned char *dptr; | 128 unsigned char *dptr; |
| 156 sptr = (*(be->base_src) + be->src); | 129 sptr = (*(be->base_src) + be->src); |
| 157 dptr = b->predictor; | 130 dptr = b->predictor; |
| 158 | 131 |
| 159 return VARIANCE_INVOKE(rtcd, get4x4sse_cs)(sptr, be->src_stride, dptr, 16, 0
x7fffffff); | 132 return VARIANCE_INVOKE(rtcd, get4x4sse_cs)(sptr, be->src_stride, dptr, 16); |
| 160 | 133 |
| 161 } | 134 } |
| 162 | 135 |
| 163 static int pick_intra4x4block( | 136 static int pick_intra4x4block( |
| 164 const VP8_ENCODER_RTCD *rtcd, | 137 const VP8_ENCODER_RTCD *rtcd, |
| 165 MACROBLOCK *x, | 138 MACROBLOCK *x, |
| 166 BLOCK *be, | 139 int ib, |
| 167 BLOCKD *b, | |
| 168 B_PREDICTION_MODE *best_mode, | 140 B_PREDICTION_MODE *best_mode, |
| 169 B_PREDICTION_MODE above, | 141 unsigned int *mode_costs, |
| 170 B_PREDICTION_MODE left, | |
| 171 | 142 |
| 172 int *bestrate, | 143 int *bestrate, |
| 173 int *bestdistortion) | 144 int *bestdistortion) |
| 174 { | 145 { |
| 146 |
| 147 BLOCKD *b = &x->e_mbd.block[ib]; |
| 148 BLOCK *be = &x->block[ib]; |
| 175 B_PREDICTION_MODE mode; | 149 B_PREDICTION_MODE mode; |
| 176 int best_rd = INT_MAX; // 1<<30 | 150 int best_rd = INT_MAX; // 1<<30 |
| 177 int rate; | 151 int rate; |
| 178 int distortion; | 152 int distortion; |
| 179 unsigned int *mode_costs; | |
| 180 | |
| 181 if (x->e_mbd.frame_type == KEY_FRAME) | |
| 182 { | |
| 183 mode_costs = x->bmode_costs[above][left]; | |
| 184 } | |
| 185 else | |
| 186 { | |
| 187 mode_costs = x->inter_bmode_costs; | |
| 188 } | |
| 189 | 153 |
| 190 for (mode = B_DC_PRED; mode <= B_HE_PRED /*B_HU_PRED*/; mode++) | 154 for (mode = B_DC_PRED; mode <= B_HE_PRED /*B_HU_PRED*/; mode++) |
| 191 { | 155 { |
| 192 int this_rd; | 156 int this_rd; |
| 193 | 157 |
| 194 rate = mode_costs[mode]; | 158 rate = mode_costs[mode]; |
| 195 vp8_predict_intra4x4(b, mode, b->predictor); | 159 RECON_INVOKE(&rtcd->common->recon, intra4x4_predict) |
| 160 (b, mode, b->predictor); |
| 196 distortion = get_prediction_error(be, b, &rtcd->variance); | 161 distortion = get_prediction_error(be, b, &rtcd->variance); |
| 197 this_rd = RD_ESTIMATE(x->rdmult, x->rddiv, rate, distortion); | 162 this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion); |
| 198 | 163 |
| 199 if (this_rd < best_rd) | 164 if (this_rd < best_rd) |
| 200 { | 165 { |
| 201 *bestrate = rate; | 166 *bestrate = rate; |
| 202 *bestdistortion = distortion; | 167 *bestdistortion = distortion; |
| 203 best_rd = this_rd; | 168 best_rd = this_rd; |
| 204 *best_mode = mode; | 169 *best_mode = mode; |
| 205 } | 170 } |
| 206 } | 171 } |
| 207 | 172 |
| 208 b->bmi.mode = (B_PREDICTION_MODE)(*best_mode); | 173 b->bmi.as_mode = (B_PREDICTION_MODE)(*best_mode); |
| 209 vp8_encode_intra4x4block(rtcd, x, be, b, b->bmi.mode); | 174 vp8_encode_intra4x4block(rtcd, x, ib); |
| 210 | |
| 211 return best_rd; | 175 return best_rd; |
| 212 } | 176 } |
| 213 | 177 |
| 214 | 178 |
| 215 int vp8_pick_intra4x4mby_modes(const VP8_ENCODER_RTCD *rtcd, MACROBLOCK *mb, int
*Rate, int *best_dist) | 179 static int pick_intra4x4mby_modes |
| 180 ( |
| 181 const VP8_ENCODER_RTCD *rtcd, |
| 182 MACROBLOCK *mb, |
| 183 int *Rate, |
| 184 int *best_dist |
| 185 ) |
| 216 { | 186 { |
| 217 MACROBLOCKD *const xd = &mb->e_mbd; | 187 MACROBLOCKD *const xd = &mb->e_mbd; |
| 218 int i; | 188 int i; |
| 219 int cost = mb->mbmode_cost [xd->frame_type] [B_PRED]; | 189 int cost = mb->mbmode_cost [xd->frame_type] [B_PRED]; |
| 220 int error; | 190 int error; |
| 221 int distortion = 0; | 191 int distortion = 0; |
| 192 unsigned int *bmode_costs; |
| 222 | 193 |
| 223 vp8_intra_prediction_down_copy(xd); | 194 vp8_intra_prediction_down_copy(xd); |
| 224 | 195 |
| 196 bmode_costs = mb->inter_bmode_costs; |
| 197 |
| 225 for (i = 0; i < 16; i++) | 198 for (i = 0; i < 16; i++) |
| 226 { | 199 { |
| 227 MODE_INFO *const mic = xd->mode_info_context; | 200 MODE_INFO *const mic = xd->mode_info_context; |
| 228 const int mis = xd->mode_info_stride; | 201 const int mis = xd->mode_info_stride; |
| 229 const B_PREDICTION_MODE A = vp8_above_bmi(mic, i, mis)->mode; | 202 |
| 230 const B_PREDICTION_MODE L = vp8_left_bmi(mic, i)->mode; | |
| 231 B_PREDICTION_MODE UNINITIALIZED_IS_SAFE(best_mode); | 203 B_PREDICTION_MODE UNINITIALIZED_IS_SAFE(best_mode); |
| 232 int UNINITIALIZED_IS_SAFE(r), UNINITIALIZED_IS_SAFE(d); | 204 int UNINITIALIZED_IS_SAFE(r), UNINITIALIZED_IS_SAFE(d); |
| 233 | 205 |
| 234 pick_intra4x4block(rtcd, mb, mb->block + i, xd->block + i, | 206 if (mb->e_mbd.frame_type == KEY_FRAME) |
| 235 &best_mode, A, L, &r, &d); | 207 { |
| 208 const B_PREDICTION_MODE A = above_block_mode(mic, i, mis); |
| 209 const B_PREDICTION_MODE L = left_block_mode(mic, i); |
| 210 |
| 211 bmode_costs = mb->bmode_costs[A][L]; |
| 212 } |
| 213 |
| 214 |
| 215 pick_intra4x4block(rtcd, mb, i, &best_mode, bmode_costs, &r, &d); |
| 236 | 216 |
| 237 cost += r; | 217 cost += r; |
| 238 distortion += d; | 218 distortion += d; |
| 219 mic->bmi[i].as_mode = best_mode; |
| 239 | 220 |
| 240 mic->bmi[i].mode = xd->block[i].bmi.mode = best_mode; | 221 // Break out case where we have already exceeded best so far value |
| 241 | 222 // that was passed in |
| 242 // Break out case where we have already exceeded best so far value that
was bassed in | |
| 243 if (distortion > *best_dist) | 223 if (distortion > *best_dist) |
| 244 break; | 224 break; |
| 245 } | 225 } |
| 246 | 226 |
| 247 for (i = 0; i < 16; i++) | |
| 248 xd->block[i].bmi.mv.as_int = 0; | |
| 249 | |
| 250 *Rate = cost; | 227 *Rate = cost; |
| 251 | 228 |
| 252 if (i == 16) | 229 if (i == 16) |
| 253 { | 230 { |
| 254 *best_dist = distortion; | 231 *best_dist = distortion; |
| 255 error = RD_ESTIMATE(mb->rdmult, mb->rddiv, cost, distortion); | 232 error = RDCOST(mb->rdmult, mb->rddiv, cost, distortion); |
| 256 } | 233 } |
| 257 else | 234 else |
| 258 { | 235 { |
| 259 *best_dist = INT_MAX; | 236 *best_dist = INT_MAX; |
| 260 error = INT_MAX; | 237 error = INT_MAX; |
| 261 } | 238 } |
| 262 | 239 |
| 263 return error; | 240 return error; |
| 264 } | 241 } |
| 265 | 242 |
| 266 int vp8_pick_intra_mbuv_mode(MACROBLOCK *mb) | 243 static void pick_intra_mbuv_mode(MACROBLOCK *mb) |
| 267 { | 244 { |
| 268 | 245 |
| 269 MACROBLOCKD *x = &mb->e_mbd; | 246 MACROBLOCKD *x = &mb->e_mbd; |
| 270 unsigned char *uabove_row = x->dst.u_buffer - x->dst.uv_stride; | 247 unsigned char *uabove_row = x->dst.u_buffer - x->dst.uv_stride; |
| 271 unsigned char *vabove_row = x->dst.v_buffer - x->dst.uv_stride; | 248 unsigned char *vabove_row = x->dst.v_buffer - x->dst.uv_stride; |
| 272 unsigned char *usrc_ptr = (mb->block[16].src + *mb->block[16].base_src); | 249 unsigned char *usrc_ptr = (mb->block[16].src + *mb->block[16].base_src); |
| 273 unsigned char *vsrc_ptr = (mb->block[20].src + *mb->block[20].base_src); | 250 unsigned char *vsrc_ptr = (mb->block[20].src + *mb->block[20].base_src); |
| 274 int uvsrc_stride = mb->block[16].src_stride; | 251 int uvsrc_stride = mb->block[16].src_stride; |
| 275 unsigned char uleft_col[8]; | 252 unsigned char uleft_col[8]; |
| 276 unsigned char vleft_col[8]; | 253 unsigned char vleft_col[8]; |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 401 { | 378 { |
| 402 if (best_error > pred_error[i]) | 379 if (best_error > pred_error[i]) |
| 403 { | 380 { |
| 404 best_error = pred_error[i]; | 381 best_error = pred_error[i]; |
| 405 best_mode = (MB_PREDICTION_MODE)i; | 382 best_mode = (MB_PREDICTION_MODE)i; |
| 406 } | 383 } |
| 407 } | 384 } |
| 408 | 385 |
| 409 | 386 |
| 410 mb->e_mbd.mode_info_context->mbmi.uv_mode = best_mode; | 387 mb->e_mbd.mode_info_context->mbmi.uv_mode = best_mode; |
| 411 return best_error; | |
| 412 | 388 |
| 413 } | 389 } |
| 414 | 390 |
| 415 int vp8_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int rec
on_uvoffset, int *returnrate, int *returndistortion, int *returnintra) | 391 static void update_mvcount(VP8_COMP *cpi, MACROBLOCKD *xd, int_mv *best_ref_mv) |
| 392 { |
| 393 /* Split MV modes currently not supported when RD is nopt enabled, |
| 394 * therefore, only need to modify MVcount in NEWMV mode. */ |
| 395 if (xd->mode_info_context->mbmi.mode == NEWMV) |
| 396 { |
| 397 cpi->MVcount[0][mv_max+((xd->mode_info_context->mbmi.mv.as_mv.row - |
| 398 best_ref_mv->as_mv.row) >> 1)]++; |
| 399 cpi->MVcount[1][mv_max+((xd->mode_info_context->mbmi.mv.as_mv.col - |
| 400 best_ref_mv->as_mv.col) >> 1)]++; |
| 401 } |
| 402 } |
| 403 |
| 404 void vp8_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, |
| 405 int recon_uvoffset, int *returnrate, |
| 406 int *returndistortion, int *returnintra) |
| 416 { | 407 { |
| 417 BLOCK *b = &x->block[0]; | 408 BLOCK *b = &x->block[0]; |
| 418 BLOCKD *d = &x->e_mbd.block[0]; | 409 BLOCKD *d = &x->e_mbd.block[0]; |
| 419 MACROBLOCKD *xd = &x->e_mbd; | 410 MACROBLOCKD *xd = &x->e_mbd; |
| 420 B_MODE_INFO best_bmodes[16]; | |
| 421 MB_MODE_INFO best_mbmode; | 411 MB_MODE_INFO best_mbmode; |
| 422 PARTITION_INFO best_partition; | 412 |
| 423 MV best_ref_mv; | 413 int_mv best_ref_mv; |
| 424 MV mode_mv[MB_MODE_COUNT]; | 414 int_mv mode_mv[MB_MODE_COUNT]; |
| 425 MB_PREDICTION_MODE this_mode; | 415 MB_PREDICTION_MODE this_mode; |
| 426 int num00; | 416 int num00; |
| 427 int i; | |
| 428 int mdcounts[4]; | 417 int mdcounts[4]; |
| 429 int best_rd = INT_MAX; // 1 << 30; | 418 int best_rd = INT_MAX; // 1 << 30; |
| 430 int best_intra_rd = INT_MAX; | 419 int best_intra_rd = INT_MAX; |
| 431 int mode_index; | 420 int mode_index; |
| 432 int ref_frame_cost[MAX_REF_FRAMES]; | |
| 433 int rate; | 421 int rate; |
| 434 int rate2; | 422 int rate2; |
| 435 int distortion2; | 423 int distortion2; |
| 436 int bestsme; | 424 int bestsme; |
| 437 //int all_rds[MAX_MODES]; // Experimental debug code. | 425 //int all_rds[MAX_MODES]; // Experimental debug code. |
| 438 int best_mode_index = 0; | 426 int best_mode_index = 0; |
| 439 int sse = INT_MAX; | 427 unsigned int sse = INT_MAX, best_sse = INT_MAX; |
| 440 | 428 |
| 441 MV mvp; | 429 int_mv mvp; |
| 442 int near_sadidx[8] = {0, 1, 2, 3, 4, 5, 6, 7}; | 430 int near_sadidx[8] = {0, 1, 2, 3, 4, 5, 6, 7}; |
| 443 int saddone=0; | 431 int saddone=0; |
| 444 int sr=0; //search range got from mv_pred(). It uses step_param levels. (
0-7) | 432 int sr=0; //search range got from mv_pred(). It uses step_param levels. (
0-7) |
| 445 | 433 |
| 446 MV nearest_mv[4]; | 434 int_mv nearest_mv[4]; |
| 447 MV near_mv[4]; | 435 int_mv near_mv[4]; |
| 448 MV frame_best_ref_mv[4]; | 436 int_mv frame_best_ref_mv[4]; |
| 449 int MDCounts[4][4]; | 437 int MDCounts[4][4]; |
| 450 unsigned char *y_buffer[4]; | 438 unsigned char *y_buffer[4]; |
| 451 unsigned char *u_buffer[4]; | 439 unsigned char *u_buffer[4]; |
| 452 unsigned char *v_buffer[4]; | 440 unsigned char *v_buffer[4]; |
| 453 | 441 |
| 454 int skip_mode[4] = {0, 0, 0, 0}; | 442 int skip_mode[4] = {0, 0, 0, 0}; |
| 455 | 443 |
| 444 int have_subp_search = cpi->sf.half_pixel_search; /* In real-time mode, whe
n Speed >= 15, no sub-pixel search. */ |
| 445 |
| 456 vpx_memset(mode_mv, 0, sizeof(mode_mv)); | 446 vpx_memset(mode_mv, 0, sizeof(mode_mv)); |
| 457 vpx_memset(nearest_mv, 0, sizeof(nearest_mv)); | 447 vpx_memset(nearest_mv, 0, sizeof(nearest_mv)); |
| 458 vpx_memset(near_mv, 0, sizeof(near_mv)); | 448 vpx_memset(near_mv, 0, sizeof(near_mv)); |
| 459 vpx_memset(&best_mbmode, 0, sizeof(best_mbmode)); | 449 vpx_memset(&best_mbmode, 0, sizeof(best_mbmode)); |
| 460 | 450 |
| 461 | 451 |
| 462 // set up all the refframe dependent pointers. | 452 // set up all the refframe dependent pointers. |
| 463 if (cpi->ref_frame_flags & VP8_LAST_FLAG) | 453 if (cpi->ref_frame_flags & VP8_LAST_FLAG) |
| 464 { | 454 { |
| 465 YV12_BUFFER_CONFIG *lst_yv12 = &cpi->common.yv12_fb[cpi->common.lst_fb_i
dx]; | 455 YV12_BUFFER_CONFIG *lst_yv12 = &cpi->common.yv12_fb[cpi->common.lst_fb_i
dx]; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 497 | 487 |
| 498 y_buffer[ALTREF_FRAME] = alt_yv12->y_buffer + recon_yoffset; | 488 y_buffer[ALTREF_FRAME] = alt_yv12->y_buffer + recon_yoffset; |
| 499 u_buffer[ALTREF_FRAME] = alt_yv12->u_buffer + recon_uvoffset; | 489 u_buffer[ALTREF_FRAME] = alt_yv12->u_buffer + recon_uvoffset; |
| 500 v_buffer[ALTREF_FRAME] = alt_yv12->v_buffer + recon_uvoffset; | 490 v_buffer[ALTREF_FRAME] = alt_yv12->v_buffer + recon_uvoffset; |
| 501 } | 491 } |
| 502 else | 492 else |
| 503 skip_mode[ALTREF_FRAME] = 1; | 493 skip_mode[ALTREF_FRAME] = 1; |
| 504 | 494 |
| 505 cpi->mbs_tested_so_far++; // Count of the number of MBs tested so f
ar this frame | 495 cpi->mbs_tested_so_far++; // Count of the number of MBs tested so f
ar this frame |
| 506 | 496 |
| 507 *returnintra = best_intra_rd; | 497 *returnintra = INT_MAX; |
| 508 x->skip = 0; | 498 x->skip = 0; |
| 509 | 499 |
| 510 ref_frame_cost[INTRA_FRAME] = vp8_cost_zero(cpi->prob_intra_coded); | |
| 511 | |
| 512 // Special case treatment when GF and ARF are not sensible options for refer
ence | |
| 513 if (cpi->ref_frame_flags == VP8_LAST_FLAG) | |
| 514 { | |
| 515 ref_frame_cost[LAST_FRAME] = vp8_cost_one(cpi->prob_intra_coded) | |
| 516 + vp8_cost_zero(255); | |
| 517 ref_frame_cost[GOLDEN_FRAME] = vp8_cost_one(cpi->prob_intra_coded) | |
| 518 + vp8_cost_one(255) | |
| 519 + vp8_cost_zero(128); | |
| 520 ref_frame_cost[ALTREF_FRAME] = vp8_cost_one(cpi->prob_intra_coded) | |
| 521 + vp8_cost_one(255) | |
| 522 + vp8_cost_one(128); | |
| 523 } | |
| 524 else | |
| 525 { | |
| 526 ref_frame_cost[LAST_FRAME] = vp8_cost_one(cpi->prob_intra_coded) | |
| 527 + vp8_cost_zero(cpi->prob_last_coded); | |
| 528 ref_frame_cost[GOLDEN_FRAME] = vp8_cost_one(cpi->prob_intra_coded) | |
| 529 + vp8_cost_one(cpi->prob_last_coded) | |
| 530 + vp8_cost_zero(cpi->prob_gf_coded); | |
| 531 ref_frame_cost[ALTREF_FRAME] = vp8_cost_one(cpi->prob_intra_coded) | |
| 532 + vp8_cost_one(cpi->prob_last_coded) | |
| 533 + vp8_cost_one(cpi->prob_gf_coded); | |
| 534 } | |
| 535 | |
| 536 x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME; | 500 x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME; |
| 537 | 501 |
| 538 // if we encode a new mv this is important | 502 // if we encode a new mv this is important |
| 539 // find the best new motion vector | 503 // find the best new motion vector |
| 540 for (mode_index = 0; mode_index < MAX_MODES; mode_index++) | 504 for (mode_index = 0; mode_index < MAX_MODES; mode_index++) |
| 541 { | 505 { |
| 542 int frame_cost; | 506 int frame_cost; |
| 543 int this_rd = INT_MAX; | 507 int this_rd = INT_MAX; |
| 544 | 508 |
| 545 if (best_rd <= cpi->rd_threshes[mode_index]) | 509 if (best_rd <= cpi->rd_threshes[mode_index]) |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 577 | 541 |
| 578 this_mode = vp8_mode_order[mode_index]; | 542 this_mode = vp8_mode_order[mode_index]; |
| 579 | 543 |
| 580 // Experimental debug code. | 544 // Experimental debug code. |
| 581 //all_rds[mode_index] = -1; | 545 //all_rds[mode_index] = -1; |
| 582 | 546 |
| 583 x->e_mbd.mode_info_context->mbmi.mode = this_mode; | 547 x->e_mbd.mode_info_context->mbmi.mode = this_mode; |
| 584 x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED; | 548 x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED; |
| 585 | 549 |
| 586 // Work out the cost assosciated with selecting the reference frame | 550 // Work out the cost assosciated with selecting the reference frame |
| 587 frame_cost = ref_frame_cost[x->e_mbd.mode_info_context->mbmi.ref_frame]; | 551 frame_cost = |
| 552 x->e_mbd.ref_frame_cost[x->e_mbd.mode_info_context->mbmi.ref_frame]; |
| 588 rate2 += frame_cost; | 553 rate2 += frame_cost; |
| 589 | 554 |
| 590 // everything but intra | 555 // everything but intra |
| 591 if (x->e_mbd.mode_info_context->mbmi.ref_frame) | 556 if (x->e_mbd.mode_info_context->mbmi.ref_frame) |
| 592 { | 557 { |
| 593 x->e_mbd.pre.y_buffer = y_buffer[x->e_mbd.mode_info_context->mbmi.re
f_frame]; | 558 x->e_mbd.pre.y_buffer = y_buffer[x->e_mbd.mode_info_context->mbmi.re
f_frame]; |
| 594 x->e_mbd.pre.u_buffer = u_buffer[x->e_mbd.mode_info_context->mbmi.re
f_frame]; | 559 x->e_mbd.pre.u_buffer = u_buffer[x->e_mbd.mode_info_context->mbmi.re
f_frame]; |
| 595 x->e_mbd.pre.v_buffer = v_buffer[x->e_mbd.mode_info_context->mbmi.re
f_frame]; | 560 x->e_mbd.pre.v_buffer = v_buffer[x->e_mbd.mode_info_context->mbmi.re
f_frame]; |
| 596 mode_mv[NEARESTMV] = nearest_mv[x->e_mbd.mode_info_context->mbmi.ref
_frame]; | 561 mode_mv[NEARESTMV] = nearest_mv[x->e_mbd.mode_info_context->mbmi.ref
_frame]; |
| 597 mode_mv[NEARMV] = near_mv[x->e_mbd.mode_info_context->mbmi.ref_frame
]; | 562 mode_mv[NEARMV] = near_mv[x->e_mbd.mode_info_context->mbmi.ref_frame
]; |
| 598 best_ref_mv = frame_best_ref_mv[x->e_mbd.mode_info_context->mbmi.ref
_frame]; | 563 best_ref_mv = frame_best_ref_mv[x->e_mbd.mode_info_context->mbmi.ref
_frame]; |
| 599 memcpy(mdcounts, MDCounts[x->e_mbd.mode_info_context->mbmi.ref_frame
], sizeof(mdcounts)); | 564 memcpy(mdcounts, MDCounts[x->e_mbd.mode_info_context->mbmi.ref_frame
], sizeof(mdcounts)); |
| 600 } | 565 } |
| 601 | 566 |
| 602 // Only consider ZEROMV/ALTREF_FRAME for alt ref frame, | 567 // Only consider ZEROMV/ALTREF_FRAME for alt ref frame, |
| 603 // unless ARNR filtering is enabled in which case we want | 568 // unless ARNR filtering is enabled in which case we want |
| 604 // an unfiltered alternative | 569 // an unfiltered alternative |
| 605 if (cpi->is_src_frame_alt_ref && (cpi->oxcf.arnr_max_frames == 0)) | 570 if (cpi->is_src_frame_alt_ref && (cpi->oxcf.arnr_max_frames == 0)) |
| 606 { | 571 { |
| 607 if (this_mode != ZEROMV || x->e_mbd.mode_info_context->mbmi.ref_fram
e != ALTREF_FRAME) | 572 if (this_mode != ZEROMV || x->e_mbd.mode_info_context->mbmi.ref_fram
e != ALTREF_FRAME) |
| 608 continue; | 573 continue; |
| 609 } | 574 } |
| 610 | 575 |
| 611 if(cpi->sf.improved_mv_pred && x->e_mbd.mode_info_context->mbmi.mode ==
NEWMV) | |
| 612 { | |
| 613 if(!saddone) | |
| 614 { | |
| 615 vp8_cal_sad(cpi,xd,x, recon_yoffset ,&near_sadidx[0] ); | |
| 616 saddone = 1; | |
| 617 } | |
| 618 | |
| 619 vp8_mv_pred(cpi, &x->e_mbd, x->e_mbd.mode_info_context, &mvp, | |
| 620 x->e_mbd.mode_info_context->mbmi.ref_frame, cpi->common.
ref_frame_sign_bias, &sr, &near_sadidx[0]); | |
| 621 | |
| 622 /* adjust mvp to make sure it is within MV range */ | |
| 623 if(mvp.row > best_ref_mv.row + MAX_FULL_PEL_VAL) | |
| 624 mvp.row = best_ref_mv.row + MAX_FULL_PEL_VAL; | |
| 625 else if(mvp.row < best_ref_mv.row - MAX_FULL_PEL_VAL) | |
| 626 mvp.row = best_ref_mv.row - MAX_FULL_PEL_VAL; | |
| 627 if(mvp.col > best_ref_mv.col + MAX_FULL_PEL_VAL) | |
| 628 mvp.col = best_ref_mv.col + MAX_FULL_PEL_VAL; | |
| 629 else if(mvp.col < best_ref_mv.col - MAX_FULL_PEL_VAL) | |
| 630 mvp.col = best_ref_mv.col - MAX_FULL_PEL_VAL; | |
| 631 } | |
| 632 | |
| 633 switch (this_mode) | 576 switch (this_mode) |
| 634 { | 577 { |
| 635 case B_PRED: | 578 case B_PRED: |
| 636 distortion2 = *returndistortion; // Best so far p
assed in as breakout value to vp8_pick_intra4x4mby_modes | 579 // Pass best so far to pick_intra4x4mby_modes to use as breakout |
| 637 vp8_pick_intra4x4mby_modes(IF_RTCD(&cpi->rtcd), x, &rate, &distortio
n2); | 580 distortion2 = best_sse; |
| 638 rate2 += rate; | 581 pick_intra4x4mby_modes(IF_RTCD(&cpi->rtcd), x, &rate, &distortion2); |
| 639 distortion2 = VARIANCE_INVOKE(&cpi->rtcd.variance, get16x16prederror
)(x->src.y_buffer, x->src.y_stride, x->e_mbd.predictor, 16, 0x7fffffff); | |
| 640 | 582 |
| 641 if (distortion2 == INT_MAX) | 583 if (distortion2 == INT_MAX) |
| 642 { | 584 { |
| 643 this_rd = INT_MAX; | 585 this_rd = INT_MAX; |
| 644 } | 586 } |
| 645 else | 587 else |
| 646 { | 588 { |
| 647 this_rd = RD_ESTIMATE(x->rdmult, x->rddiv, rate2, distortion2); | 589 rate2 += rate; |
| 590 distortion2 = VARIANCE_INVOKE |
| 591 (&cpi->rtcd.variance, var16x16)( |
| 592 *(b->base_src), b->src_stride, |
| 593 x->e_mbd.predictor, 16, &sse); |
| 594 this_rd = RDCOST(x->rdmult, x->rddiv, rate2, distortion2); |
| 648 | 595 |
| 649 if (this_rd < best_intra_rd) | 596 if (this_rd < best_intra_rd) |
| 650 { | 597 { |
| 651 best_intra_rd = this_rd; | 598 best_intra_rd = this_rd; |
| 652 *returnintra = best_intra_rd ; | 599 *returnintra = distortion2; |
| 653 } | 600 } |
| 654 } | 601 } |
| 655 | 602 |
| 656 break; | 603 break; |
| 657 | 604 |
| 658 case SPLITMV: | 605 case SPLITMV: |
| 659 | 606 |
| 660 // Split MV modes currently not supported when RD is nopt enabled. | 607 // Split MV modes currently not supported when RD is nopt enabled. |
| 661 break; | 608 break; |
| 662 | 609 |
| 663 case DC_PRED: | 610 case DC_PRED: |
| 664 case V_PRED: | 611 case V_PRED: |
| 665 case H_PRED: | 612 case H_PRED: |
| 666 case TM_PRED: | 613 case TM_PRED: |
| 667 RECON_INVOKE(&cpi->common.rtcd.recon, build_intra_predictors_mby) | 614 RECON_INVOKE(&cpi->common.rtcd.recon, build_intra_predictors_mby) |
| 668 (&x->e_mbd); | 615 (&x->e_mbd); |
| 669 distortion2 = VARIANCE_INVOKE(&cpi->rtcd.variance, get16x16prederror
)(x->src.y_buffer, x->src.y_stride, x->e_mbd.predictor, 16, 0x7fffffff); | 616 distortion2 = VARIANCE_INVOKE(&cpi->rtcd.variance, var16x16) |
| 617 (*(b->base_src), b->src_stride, |
| 618 x->e_mbd.predictor, 16, &sse); |
| 670 rate2 += x->mbmode_cost[x->e_mbd.frame_type][x->e_mbd.mode_info_cont
ext->mbmi.mode]; | 619 rate2 += x->mbmode_cost[x->e_mbd.frame_type][x->e_mbd.mode_info_cont
ext->mbmi.mode]; |
| 671 this_rd = RD_ESTIMATE(x->rdmult, x->rddiv, rate2, distortion2); | 620 this_rd = RDCOST(x->rdmult, x->rddiv, rate2, distortion2); |
| 672 | 621 |
| 673 if (this_rd < best_intra_rd) | 622 if (this_rd < best_intra_rd) |
| 674 { | 623 { |
| 675 best_intra_rd = this_rd; | 624 best_intra_rd = this_rd; |
| 676 *returnintra = best_intra_rd ; | 625 *returnintra = distortion2; |
| 677 } | 626 } |
| 678 | |
| 679 break; | 627 break; |
| 680 | 628 |
| 681 case NEWMV: | 629 case NEWMV: |
| 682 { | 630 { |
| 683 int thissme; | 631 int thissme; |
| 684 int step_param; | 632 int step_param; |
| 685 int further_steps; | 633 int further_steps; |
| 686 int n = 0; | 634 int n = 0; |
| 687 int sadpb = x->sadperbit16; | 635 int sadpb = x->sadperbit16; |
| 636 int_mv mvp_full; |
| 688 | 637 |
| 689 int col_min; | 638 int col_min = (best_ref_mv.as_mv.col>>3) - MAX_FULL_PEL_VAL + ((best
_ref_mv.as_mv.col & 7)?1:0); |
| 690 int col_max; | 639 int row_min = (best_ref_mv.as_mv.row>>3) - MAX_FULL_PEL_VAL + ((best
_ref_mv.as_mv.row & 7)?1:0); |
| 691 int row_min; | 640 int col_max = (best_ref_mv.as_mv.col>>3) + MAX_FULL_PEL_VAL; |
| 692 int row_max; | 641 int row_max = (best_ref_mv.as_mv.row>>3) + MAX_FULL_PEL_VAL; |
| 693 | 642 |
| 694 int tmp_col_min = x->mv_col_min; | 643 int tmp_col_min = x->mv_col_min; |
| 695 int tmp_col_max = x->mv_col_max; | 644 int tmp_col_max = x->mv_col_max; |
| 696 int tmp_row_min = x->mv_row_min; | 645 int tmp_row_min = x->mv_row_min; |
| 697 int tmp_row_max = x->mv_row_max; | 646 int tmp_row_max = x->mv_row_max; |
| 698 | 647 |
| 699 int speed_adjust = (cpi->Speed > 5) ? ((cpi->Speed >= 8)? 3 : 2) : 1
; | 648 int speed_adjust = (cpi->Speed > 5) ? ((cpi->Speed >= 8)? 3 : 2) : 1
; |
| 700 | 649 |
| 701 // Further step/diamond searches as necessary | 650 // Further step/diamond searches as necessary |
| 702 step_param = cpi->sf.first_step + speed_adjust; | 651 step_param = cpi->sf.first_step + speed_adjust; |
| 703 | 652 |
| 704 if(cpi->sf.improved_mv_pred) | 653 if(cpi->sf.improved_mv_pred) |
| 705 { | 654 { |
| 655 if(!saddone) |
| 656 { |
| 657 vp8_cal_sad(cpi,xd,x, recon_yoffset ,&near_sadidx[0] ); |
| 658 saddone = 1; |
| 659 } |
| 660 |
| 661 vp8_mv_pred(cpi, &x->e_mbd, x->e_mbd.mode_info_context, &mvp, |
| 662 x->e_mbd.mode_info_context->mbmi.ref_frame, cpi->com
mon.ref_frame_sign_bias, &sr, &near_sadidx[0]); |
| 663 |
| 706 sr += speed_adjust; | 664 sr += speed_adjust; |
| 707 //adjust search range according to sr from mv prediction | 665 //adjust search range according to sr from mv prediction |
| 708 if(sr > step_param) | 666 if(sr > step_param) |
| 709 step_param = sr; | 667 step_param = sr; |
| 710 | 668 |
| 711 col_min = (best_ref_mv.col - MAX_FULL_PEL_VAL) >>3; | 669 mvp_full.as_mv.col = mvp.as_mv.col>>3; |
| 712 col_max = (best_ref_mv.col + MAX_FULL_PEL_VAL) >>3; | 670 mvp_full.as_mv.row = mvp.as_mv.row>>3; |
| 713 row_min = (best_ref_mv.row - MAX_FULL_PEL_VAL) >>3; | |
| 714 row_max = (best_ref_mv.row + MAX_FULL_PEL_VAL) >>3; | |
| 715 | 671 |
| 716 // Get intersection of UMV window and valid MV window to reduce
# of checks in diamond search. | |
| 717 if (x->mv_col_min < col_min ) | |
| 718 x->mv_col_min = col_min; | |
| 719 if (x->mv_col_max > col_max ) | |
| 720 x->mv_col_max = col_max; | |
| 721 if (x->mv_row_min < row_min ) | |
| 722 x->mv_row_min = row_min; | |
| 723 if (x->mv_row_max > row_max ) | |
| 724 x->mv_row_max = row_max; | |
| 725 }else | 672 }else |
| 726 { | 673 { |
| 727 mvp.row = best_ref_mv.row; | 674 mvp.as_int = best_ref_mv.as_int; |
| 728 mvp.col = best_ref_mv.col; | 675 mvp_full.as_mv.col = best_ref_mv.as_mv.col>>3; |
| 676 mvp_full.as_mv.row = best_ref_mv.as_mv.row>>3; |
| 729 } | 677 } |
| 730 | 678 |
| 679 // Get intersection of UMV window and valid MV window to reduce # of
checks in diamond search. |
| 680 if (x->mv_col_min < col_min ) |
| 681 x->mv_col_min = col_min; |
| 682 if (x->mv_col_max > col_max ) |
| 683 x->mv_col_max = col_max; |
| 684 if (x->mv_row_min < row_min ) |
| 685 x->mv_row_min = row_min; |
| 686 if (x->mv_row_max > row_max ) |
| 687 x->mv_row_max = row_max; |
| 688 |
| 731 further_steps = (cpi->Speed >= 8)? 0: (cpi->sf.max_step_search_steps
- 1 - step_param); | 689 further_steps = (cpi->Speed >= 8)? 0: (cpi->sf.max_step_search_steps
- 1 - step_param); |
| 732 | 690 |
| 733 if (cpi->sf.search_method == HEX) | 691 if (cpi->sf.search_method == HEX) |
| 734 { | 692 { |
| 735 bestsme = vp8_hex_search(x, b, d, &mvp, &d->bmi.mv.as_mv, step_p
aram, sadpb/*x->errorperbit*/, &num00, &cpi->fn_ptr[BLOCK_16X16], x->mvsadcost,
x->mvcost, &best_ref_mv); | 693 bestsme = vp8_hex_search(x, b, d, &mvp_full, &d->bmi.mv, step_pa
ram, |
| 736 mode_mv[NEWMV].row = d->bmi.mv.as_mv.row; | 694 sadpb, &cpi->fn_ptr[BLOCK_16X16], |
| 737 mode_mv[NEWMV].col = d->bmi.mv.as_mv.col; | 695 x->mvsadcost, x->mvcost, &best_ref_mv); |
| 696 mode_mv[NEWMV].as_int = d->bmi.mv.as_int; |
| 738 } | 697 } |
| 739 else | 698 else |
| 740 { | 699 { |
| 741 bestsme = cpi->diamond_search_sad(x, b, d, &mvp, &d->bmi.mv.as_m
v, step_param, sadpb / 2/*x->errorperbit*/, &num00, &cpi->fn_ptr[BLOCK_16X16], x
->mvsadcost, x->mvcost, &best_ref_mv); //sadpb < 9 | 700 bestsme = cpi->diamond_search_sad(x, b, d, &mvp_full, &d->bmi.mv
, |
| 742 mode_mv[NEWMV].row = d->bmi.mv.as_mv.row; | 701 step_param, sadpb, &num00, |
| 743 mode_mv[NEWMV].col = d->bmi.mv.as_mv.col; | 702 &cpi->fn_ptr[BLOCK_16X16], |
| 703 x->mvcost, &best_ref_mv); |
| 704 mode_mv[NEWMV].as_int = d->bmi.mv.as_int; |
| 744 | 705 |
| 745 // Further step/diamond searches as necessary | 706 // Further step/diamond searches as necessary |
| 746 n = 0; | 707 n = 0; |
| 747 //further_steps = (cpi->sf.max_step_search_steps - 1) - step_par
am; | 708 //further_steps = (cpi->sf.max_step_search_steps - 1) - step_par
am; |
| 748 | 709 |
| 749 n = num00; | 710 n = num00; |
| 750 num00 = 0; | 711 num00 = 0; |
| 751 | 712 |
| 752 while (n < further_steps) | 713 while (n < further_steps) |
| 753 { | 714 { |
| 754 n++; | 715 n++; |
| 755 | 716 |
| 756 if (num00) | 717 if (num00) |
| 757 num00--; | 718 num00--; |
| 758 else | 719 else |
| 759 { | 720 { |
| 760 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[BLO
CK_16X16], x->mvsadcost, x->mvcost, &best_ref_mv); //sadpb = 9 | 721 thissme = |
| 761 | 722 cpi->diamond_search_sad(x, b, d, &mvp_full, |
| 723 &d->bmi.mv, |
| 724 step_param + n, |
| 725 sadpb, &num00, |
| 726 &cpi->fn_ptr[BLOCK_16X16], |
| 727 x->mvcost, &best_ref_mv); |
| 762 if (thissme < bestsme) | 728 if (thissme < bestsme) |
| 763 { | 729 { |
| 764 bestsme = thissme; | 730 bestsme = thissme; |
| 765 mode_mv[NEWMV].row = d->bmi.mv.as_mv.row; | 731 mode_mv[NEWMV].as_int = d->bmi.mv.as_int; |
| 766 mode_mv[NEWMV].col = d->bmi.mv.as_mv.col; | |
| 767 } | 732 } |
| 768 else | 733 else |
| 769 { | 734 { |
| 770 d->bmi.mv.as_mv.row = mode_mv[NEWMV].row; | 735 d->bmi.mv.as_int = mode_mv[NEWMV].as_int; |
| 771 d->bmi.mv.as_mv.col = mode_mv[NEWMV].col; | |
| 772 } | 736 } |
| 773 } | 737 } |
| 774 } | 738 } |
| 775 } | 739 } |
| 776 | 740 |
| 777 if(cpi->sf.improved_mv_pred) | 741 x->mv_col_min = tmp_col_min; |
| 778 { | 742 x->mv_col_max = tmp_col_max; |
| 779 x->mv_col_min = tmp_col_min; | 743 x->mv_row_min = tmp_row_min; |
| 780 x->mv_col_max = tmp_col_max; | 744 x->mv_row_max = tmp_row_max; |
| 781 x->mv_row_min = tmp_row_min; | |
| 782 x->mv_row_max = tmp_row_max; | |
| 783 } | |
| 784 | 745 |
| 785 if (bestsme < INT_MAX) | 746 if (bestsme < INT_MAX) |
| 786 cpi->find_fractional_mv_step(x, b, d, &d->bmi.mv.as_mv, &best_re
f_mv, x->errorperbit, &cpi->fn_ptr[BLOCK_16X16], cpi->mb.mvcost); | 747 cpi->find_fractional_mv_step(x, b, d, &d->bmi.mv, &best_ref_mv, |
| 748 x->errorperbit, |
| 749 &cpi->fn_ptr[BLOCK_16X16], |
| 750 cpi->mb.mvcost, |
| 751 &distortion2,&sse); |
| 787 | 752 |
| 788 mode_mv[NEWMV].row = d->bmi.mv.as_mv.row; | 753 mode_mv[NEWMV].as_int = d->bmi.mv.as_int; |
| 789 mode_mv[NEWMV].col = d->bmi.mv.as_mv.col; | |
| 790 | 754 |
| 791 // mv cost; | 755 // mv cost; |
| 792 rate2 += vp8_mv_bit_cost(&mode_mv[NEWMV], &best_ref_mv, cpi->mb.mvco
st, 128); | 756 rate2 += vp8_mv_bit_cost(&mode_mv[NEWMV], &best_ref_mv, cpi->mb.mvco
st, 128); |
| 793 } | 757 } |
| 794 | 758 |
| 795 case NEARESTMV: | 759 case NEARESTMV: |
| 796 case NEARMV: | 760 case NEARMV: |
| 797 | 761 |
| 798 if (mode_mv[this_mode].row == 0 && mode_mv[this_mode].col == 0) | 762 if (mode_mv[this_mode].as_int == 0) |
| 799 continue; | 763 continue; |
| 800 | 764 |
| 801 case ZEROMV: | 765 case ZEROMV: |
| 802 | 766 |
| 803 // Trap vectors that reach beyond the UMV borders | 767 // Trap vectors that reach beyond the UMV borders |
| 804 // Note that ALL New MV, Nearest MV Near MV and Zero MV code drops t
hrough to this point | 768 // Note that ALL New MV, Nearest MV Near MV and Zero MV code drops t
hrough to this point |
| 805 // because of the lack of break statements in the previous two cases
. | 769 // because of the lack of break statements in the previous two cases
. |
| 806 if (((mode_mv[this_mode].row >> 3) < x->mv_row_min) || ((mode_mv[thi
s_mode].row >> 3) > x->mv_row_max) || | 770 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) || |
| 807 ((mode_mv[this_mode].col >> 3) < x->mv_col_min) || ((mode_mv[thi
s_mode].col >> 3) > x->mv_col_max)) | 771 ((mode_mv[this_mode].as_mv.col >> 3) < x->mv_col_min) || ((mode_
mv[this_mode].as_mv.col >> 3) > x->mv_col_max)) |
| 808 continue; | 772 continue; |
| 809 | 773 |
| 810 rate2 += vp8_cost_mv_ref(this_mode, mdcounts); | 774 rate2 += vp8_cost_mv_ref(this_mode, mdcounts); |
| 811 x->e_mbd.mode_info_context->mbmi.mode = this_mode; | 775 x->e_mbd.mode_info_context->mbmi.mv.as_int = |
| 812 x->e_mbd.mode_info_context->mbmi.mv.as_mv = mode_mv[this_mode]; | 776 mode_mv[this_mode].as_int; |
| 813 x->e_mbd.block[0].bmi.mode = this_mode; | |
| 814 x->e_mbd.block[0].bmi.mv.as_int = x->e_mbd.mode_info_context->mbmi.m
v.as_int; | |
| 815 | 777 |
| 816 distortion2 = get_inter_mbpred_error(x, &cpi->fn_ptr[BLOCK_16X16], (
unsigned int *)(&sse)); | 778 if((this_mode != NEWMV) || |
| 779 !(have_subp_search) || cpi->common.full_pixel==1) |
| 780 distortion2 = get_inter_mbpred_error(x, |
| 781 &cpi->fn_ptr[BLOCK_16X16], |
| 782 &sse, mode_mv[this_mode]); |
| 817 | 783 |
| 818 this_rd = RD_ESTIMATE(x->rdmult, x->rddiv, rate2, distortion2); | 784 this_rd = RDCOST(x->rdmult, x->rddiv, rate2, distortion2); |
| 819 | 785 |
| 820 if (cpi->active_map_enabled && x->active_ptr[0] == 0) | 786 if (cpi->active_map_enabled && x->active_ptr[0] == 0) |
| 821 { | 787 { |
| 822 x->skip = 1; | 788 x->skip = 1; |
| 823 } | 789 } |
| 824 else if (sse < x->encode_breakout) | 790 else if (sse < x->encode_breakout) |
| 825 { | 791 { |
| 826 // Check u and v to make sure skip is ok | 792 // Check u and v to make sure skip is ok |
| 827 int sse2 = 0; | 793 int sse2 = 0; |
| 828 | 794 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 842 // Experimental debug code. | 808 // Experimental debug code. |
| 843 //all_rds[mode_index] = this_rd; | 809 //all_rds[mode_index] = this_rd; |
| 844 | 810 |
| 845 if (this_rd < best_rd || x->skip) | 811 if (this_rd < best_rd || x->skip) |
| 846 { | 812 { |
| 847 // Note index of best mode | 813 // Note index of best mode |
| 848 best_mode_index = mode_index; | 814 best_mode_index = mode_index; |
| 849 | 815 |
| 850 *returnrate = rate2; | 816 *returnrate = rate2; |
| 851 *returndistortion = distortion2; | 817 *returndistortion = distortion2; |
| 818 best_sse = sse; |
| 852 best_rd = this_rd; | 819 best_rd = this_rd; |
| 853 vpx_memcpy(&best_mbmode, &x->e_mbd.mode_info_context->mbmi, sizeof(M
B_MODE_INFO)); | 820 vpx_memcpy(&best_mbmode, &x->e_mbd.mode_info_context->mbmi, sizeof(M
B_MODE_INFO)); |
| 854 vpx_memcpy(&best_partition, x->partition_info, sizeof(PARTITION_INFO
)); | |
| 855 | |
| 856 if (this_mode == B_PRED || this_mode == SPLITMV) | |
| 857 for (i = 0; i < 16; i++) | |
| 858 { | |
| 859 vpx_memcpy(&best_bmodes[i], &x->e_mbd.block[i].bmi, sizeof(B
_MODE_INFO)); | |
| 860 } | |
| 861 else | |
| 862 { | |
| 863 best_bmodes[0].mv = x->e_mbd.block[0].bmi.mv; | |
| 864 } | |
| 865 | 821 |
| 866 // Testing this mode gave rise to an improvement in best error score
. Lower threshold a bit for next time | 822 // Testing this mode gave rise to an improvement in best error score
. Lower threshold a bit for next time |
| 867 cpi->rd_thresh_mult[mode_index] = (cpi->rd_thresh_mult[mode_index] >
= (MIN_THRESHMULT + 2)) ? cpi->rd_thresh_mult[mode_index] - 2 : MIN_THRESHMULT; | 823 cpi->rd_thresh_mult[mode_index] = (cpi->rd_thresh_mult[mode_index] >
= (MIN_THRESHMULT + 2)) ? cpi->rd_thresh_mult[mode_index] - 2 : MIN_THRESHMULT; |
| 868 cpi->rd_threshes[mode_index] = (cpi->rd_baseline_thresh[mode_index]
>> 7) * cpi->rd_thresh_mult[mode_index]; | 824 cpi->rd_threshes[mode_index] = (cpi->rd_baseline_thresh[mode_index]
>> 7) * cpi->rd_thresh_mult[mode_index]; |
| 869 } | 825 } |
| 870 | 826 |
| 871 // If the mode did not help improve the best error case then raise the t
hreshold for testing that mode next time around. | 827 // If the mode did not help improve the best error case then raise the t
hreshold for testing that mode next time around. |
| 872 else | 828 else |
| 873 { | 829 { |
| 874 cpi->rd_thresh_mult[mode_index] += 4; | 830 cpi->rd_thresh_mult[mode_index] += 4; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 885 | 841 |
| 886 // Reduce the activation RD thresholds for the best choice mode | 842 // Reduce the activation RD thresholds for the best choice mode |
| 887 if ((cpi->rd_baseline_thresh[best_mode_index] > 0) && (cpi->rd_baseline_thre
sh[best_mode_index] < (INT_MAX >> 2))) | 843 if ((cpi->rd_baseline_thresh[best_mode_index] > 0) && (cpi->rd_baseline_thre
sh[best_mode_index] < (INT_MAX >> 2))) |
| 888 { | 844 { |
| 889 int best_adjustment = (cpi->rd_thresh_mult[best_mode_index] >> 3); | 845 int best_adjustment = (cpi->rd_thresh_mult[best_mode_index] >> 3); |
| 890 | 846 |
| 891 cpi->rd_thresh_mult[best_mode_index] = (cpi->rd_thresh_mult[best_mode_in
dex] >= (MIN_THRESHMULT + best_adjustment)) ? cpi->rd_thresh_mult[best_mode_inde
x] - best_adjustment : MIN_THRESHMULT; | 847 cpi->rd_thresh_mult[best_mode_index] = (cpi->rd_thresh_mult[best_mode_in
dex] >= (MIN_THRESHMULT + best_adjustment)) ? cpi->rd_thresh_mult[best_mode_inde
x] - best_adjustment : MIN_THRESHMULT; |
| 892 cpi->rd_threshes[best_mode_index] = (cpi->rd_baseline_thresh[best_mode_i
ndex] >> 7) * cpi->rd_thresh_mult[best_mode_index]; | 848 cpi->rd_threshes[best_mode_index] = (cpi->rd_baseline_thresh[best_mode_i
ndex] >> 7) * cpi->rd_thresh_mult[best_mode_index]; |
| 893 } | 849 } |
| 894 | 850 |
| 895 // Keep a record of best mode index for use in next loop | |
| 896 cpi->last_best_mode_index = best_mode_index; | |
| 897 | |
| 898 if (best_mbmode.mode <= B_PRED) | |
| 899 { | |
| 900 x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME; | |
| 901 vp8_pick_intra_mbuv_mode(x); | |
| 902 best_mbmode.uv_mode = x->e_mbd.mode_info_context->mbmi.uv_mode; | |
| 903 } | |
| 904 | |
| 905 | 851 |
| 906 { | 852 { |
| 907 int this_rdbin = (*returndistortion >> 7); | 853 int this_rdbin = (*returndistortion >> 7); |
| 908 | 854 |
| 909 if (this_rdbin >= 1024) | 855 if (this_rdbin >= 1024) |
| 910 { | 856 { |
| 911 this_rdbin = 1023; | 857 this_rdbin = 1023; |
| 912 } | 858 } |
| 913 | 859 |
| 914 cpi->error_bins[this_rdbin] ++; | 860 cpi->error_bins[this_rdbin] ++; |
| 915 } | 861 } |
| 916 | 862 |
| 863 if (cpi->is_src_frame_alt_ref && |
| 864 (best_mbmode.mode != ZEROMV || best_mbmode.ref_frame != ALTREF_FRAME)) |
| 865 { |
| 866 x->e_mbd.mode_info_context->mbmi.mode = ZEROMV; |
| 867 x->e_mbd.mode_info_context->mbmi.ref_frame = ALTREF_FRAME; |
| 868 x->e_mbd.mode_info_context->mbmi.mv.as_int = 0; |
| 869 x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED; |
| 870 x->e_mbd.mode_info_context->mbmi.mb_skip_coeff = |
| 871 (cpi->common.mb_no_coeff_skip) ? 1 : 0; |
| 872 x->e_mbd.mode_info_context->mbmi.partitioning = 0; |
| 917 | 873 |
| 918 if (cpi->is_src_frame_alt_ref && (best_mbmode.mode != ZEROMV || best_mbmode.
ref_frame != ALTREF_FRAME)) | 874 return; |
| 919 { | |
| 920 best_mbmode.mode = ZEROMV; | |
| 921 best_mbmode.ref_frame = ALTREF_FRAME; | |
| 922 best_mbmode.mv.as_int = 0; | |
| 923 best_mbmode.uv_mode = 0; | |
| 924 best_mbmode.mb_skip_coeff = (cpi->common.mb_no_coeff_skip) ? 1 : 0; | |
| 925 best_mbmode.partitioning = 0; | |
| 926 best_mbmode.dc_diff = 0; | |
| 927 | |
| 928 vpx_memcpy(&x->e_mbd.mode_info_context->mbmi, &best_mbmode, sizeof(MB_MO
DE_INFO)); | |
| 929 vpx_memcpy(x->partition_info, &best_partition, sizeof(PARTITION_INFO)); | |
| 930 | |
| 931 for (i = 0; i < 16; i++) | |
| 932 { | |
| 933 vpx_memset(&x->e_mbd.block[i].bmi, 0, sizeof(B_MODE_INFO)); | |
| 934 } | |
| 935 | |
| 936 x->e_mbd.mode_info_context->mbmi.mv.as_int = 0; | |
| 937 | |
| 938 return best_rd; | |
| 939 } | 875 } |
| 940 | 876 |
| 877 /* set to the best mb mode */ |
| 878 vpx_memcpy(&x->e_mbd.mode_info_context->mbmi, &best_mbmode, sizeof(MB_MODE_I
NFO)); |
| 941 | 879 |
| 942 // macroblock modes | 880 if (best_mbmode.mode <= B_PRED) |
| 943 vpx_memcpy(&x->e_mbd.mode_info_context->mbmi, &best_mbmode, sizeof(MB_MODE_I
NFO)); | |
| 944 vpx_memcpy(x->partition_info, &best_partition, sizeof(PARTITION_INFO)); | |
| 945 | |
| 946 if (x->e_mbd.mode_info_context->mbmi.mode == B_PRED || x->e_mbd.mode_info_co
ntext->mbmi.mode == SPLITMV) | |
| 947 for (i = 0; i < 16; i++) | |
| 948 { | |
| 949 vpx_memcpy(&x->e_mbd.block[i].bmi, &best_bmodes[i], sizeof(B_MODE_IN
FO)); | |
| 950 | |
| 951 } | |
| 952 else | |
| 953 { | 881 { |
| 954 vp8_set_mbmode_and_mvs(x, x->e_mbd.mode_info_context->mbmi.mode, &best_b
modes[0].mv.as_mv); | 882 /* set mode_info_context->mbmi.uv_mode */ |
| 883 pick_intra_mbuv_mode(x); |
| 955 } | 884 } |
| 956 | 885 |
| 957 x->e_mbd.mode_info_context->mbmi.mv.as_mv = x->e_mbd.block[15].bmi.mv.as_mv; | 886 update_mvcount(cpi, &x->e_mbd, &frame_best_ref_mv[xd->mode_info_context->mbm
i.ref_frame]); |
| 887 } |
| 958 | 888 |
| 959 return best_rd; | 889 |
| 890 void vp8_pick_intra_mode(VP8_COMP *cpi, MACROBLOCK *x, int *rate_) |
| 891 { |
| 892 int error4x4, error16x16 = INT_MAX; |
| 893 int rate, best_rate = 0, distortion, best_sse; |
| 894 MB_PREDICTION_MODE mode, best_mode = DC_PRED; |
| 895 int this_rd; |
| 896 unsigned int sse; |
| 897 BLOCK *b = &x->block[0]; |
| 898 |
| 899 x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME; |
| 900 |
| 901 pick_intra_mbuv_mode(x); |
| 902 |
| 903 for (mode = DC_PRED; mode <= TM_PRED; mode ++) |
| 904 { |
| 905 x->e_mbd.mode_info_context->mbmi.mode = mode; |
| 906 RECON_INVOKE(&cpi->common.rtcd.recon, build_intra_predictors_mby) |
| 907 (&x->e_mbd); |
| 908 distortion = VARIANCE_INVOKE(&cpi->rtcd.variance, var16x16) |
| 909 (*(b->base_src), b->src_stride, x->e_mbd.predictor, 16, &sse); |
| 910 rate = x->mbmode_cost[x->e_mbd.frame_type][mode]; |
| 911 this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion); |
| 912 |
| 913 if (error16x16 > this_rd) |
| 914 { |
| 915 error16x16 = this_rd; |
| 916 best_mode = mode; |
| 917 best_sse = sse; |
| 918 best_rate = rate; |
| 919 } |
| 920 } |
| 921 x->e_mbd.mode_info_context->mbmi.mode = best_mode; |
| 922 |
| 923 error4x4 = pick_intra4x4mby_modes(IF_RTCD(&cpi->rtcd), x, &rate, |
| 924 &best_sse); |
| 925 if (error4x4 < error16x16) |
| 926 { |
| 927 x->e_mbd.mode_info_context->mbmi.mode = B_PRED; |
| 928 best_rate = rate; |
| 929 } |
| 930 |
| 931 *rate_ = best_rate; |
| 960 } | 932 } |
| OLD | NEW |