Merge "Remove copies of same functions"
[libvpx.git] / vp8 / encoder / rdopt.c
blobd1745bbcacca49653357b6038fe2a6a391fb7fec
1 /*
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
12 #include <stdio.h>
13 #include <math.h>
14 #include <limits.h>
15 #include <assert.h>
16 #include "pragmas.h"
18 #include "tokenize.h"
19 #include "treewriter.h"
20 #include "onyx_int.h"
21 #include "modecosts.h"
22 #include "encodeintra.h"
23 #include "entropymode.h"
24 #include "reconinter.h"
25 #include "reconintra.h"
26 #include "reconintra4x4.h"
27 #include "findnearmv.h"
28 #include "encodemb.h"
29 #include "quantize.h"
30 #include "idct.h"
31 #include "g_common.h"
32 #include "variance.h"
33 #include "mcomp.h"
35 #include "vpx_mem/vpx_mem.h"
36 #include "dct.h"
37 #include "systemdependent.h"
39 #if CONFIG_RUNTIME_CPU_DETECT
40 #define IF_RTCD(x) (x)
41 #else
42 #define IF_RTCD(x) NULL
43 #endif
46 extern void vp8cx_mb_init_quantizer(VP8_COMP *cpi, MACROBLOCK *x);
47 extern void vp8_update_zbin_extra(VP8_COMP *cpi, MACROBLOCK *x);
50 #define RDCOST(RM,DM,R,D) ( ((128+(R)*(RM)) >> 8) + (DM)*(D) )
52 #define MAXF(a,b) (((a) > (b)) ? (a) : (b))
56 const int vp8_auto_speed_thresh[17] =
58 1000,
59 200,
60 150,
61 130,
62 150,
63 125,
64 120,
65 115,
66 115,
67 115,
68 115,
69 115,
70 115,
71 115,
72 115,
73 115,
74 105
77 const MB_PREDICTION_MODE vp8_mode_order[MAX_MODES] =
79 ZEROMV,
80 DC_PRED,
82 NEARESTMV,
83 NEARMV,
85 ZEROMV,
86 NEARESTMV,
88 ZEROMV,
89 NEARESTMV,
91 NEARMV,
92 NEARMV,
94 V_PRED,
95 H_PRED,
96 TM_PRED,
98 NEWMV,
99 NEWMV,
100 NEWMV,
102 SPLITMV,
103 SPLITMV,
104 SPLITMV,
106 B_PRED,
109 const MV_REFERENCE_FRAME vp8_ref_frame_order[MAX_MODES] =
111 LAST_FRAME,
112 INTRA_FRAME,
114 LAST_FRAME,
115 LAST_FRAME,
117 GOLDEN_FRAME,
118 GOLDEN_FRAME,
120 ALTREF_FRAME,
121 ALTREF_FRAME,
123 GOLDEN_FRAME,
124 ALTREF_FRAME,
126 INTRA_FRAME,
127 INTRA_FRAME,
128 INTRA_FRAME,
130 LAST_FRAME,
131 GOLDEN_FRAME,
132 ALTREF_FRAME,
134 LAST_FRAME,
135 GOLDEN_FRAME,
136 ALTREF_FRAME,
138 INTRA_FRAME,
141 static void fill_token_costs(
142 unsigned int c [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [vp8_coef_tokens],
143 const vp8_prob p [BLOCK_TYPES] [COEF_BANDS] [PREV_COEF_CONTEXTS] [vp8_coef_tokens-1]
146 int i, j, k;
149 for (i = 0; i < BLOCK_TYPES; i++)
150 for (j = 0; j < COEF_BANDS; j++)
151 for (k = 0; k < PREV_COEF_CONTEXTS; k++)
153 vp8_cost_tokens((int *)(c [i][j][k]), p [i][j][k], vp8_coef_tree);
157 static int rd_iifactor [ 32 ] = { 4, 4, 3, 2, 1, 0, 0, 0,
158 0, 0, 0, 0, 0, 0, 0, 0,
159 0, 0, 0, 0, 0, 0, 0, 0,
160 0, 0, 0, 0, 0, 0, 0, 0,
164 /* values are now correlated to quantizer */
165 static int sad_per_bit16lut[QINDEX_RANGE] =
167 5, 5, 5, 5, 5, 5, 6, 6,
168 6, 6, 6, 6, 6, 7, 7, 7,
169 7, 7, 7, 7, 8, 8, 8, 8,
170 8, 8, 8, 8, 8, 8, 9, 9,
171 9, 9, 9, 9, 10, 10, 10, 10,
172 10, 10, 11, 11, 11, 11, 11, 11,
173 12, 12, 12, 12, 12, 12, 12, 13,
174 13, 13, 13, 13, 13, 14, 14, 14,
175 14, 14, 15, 15, 15, 15, 15, 15,
176 16, 16, 16, 16, 16, 16, 17, 17,
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
184 static int sad_per_bit4lut[QINDEX_RANGE] =
186 5, 5, 5, 5, 5, 5, 7, 7,
187 7, 7, 7, 7, 7, 8, 8, 8,
188 8, 8, 8, 8, 10, 10, 10, 10,
189 10, 10, 10, 10, 10, 10, 11, 11,
190 11, 11, 11, 11, 13, 13, 13, 13,
191 13, 13, 14, 14, 14, 14, 14, 14,
192 16, 16, 16, 16, 16, 16, 16, 17,
193 17, 17, 17, 17, 17, 19, 19, 19,
194 19, 19, 20, 20, 20, 20, 20, 20,
195 22, 22, 22, 22, 22, 22, 23, 23,
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,
204 void vp8cx_initialize_me_consts(VP8_COMP *cpi, int QIndex)
206 cpi->mb.sadperbit16 = sad_per_bit16lut[QIndex];
207 cpi->mb.sadperbit4 = sad_per_bit4lut[QIndex];
210 void vp8_initialize_rd_consts(VP8_COMP *cpi, int Qvalue)
212 int q;
213 int i;
214 double capped_q = (Qvalue < 160) ? (double)Qvalue : 160.0;
215 double rdconst = 3.00;
217 vp8_clear_system_state(); //__asm emms;
219 // Further tests required to see if optimum is different
220 // for key frames, golden frames and arf frames.
221 // if (cpi->common.refresh_golden_frame ||
222 // cpi->common.refresh_alt_ref_frame)
223 cpi->RDMULT = (int)(rdconst * (capped_q * capped_q));
225 // Extend rate multiplier along side quantizer zbin increases
226 if (cpi->zbin_over_quant > 0)
228 double oq_factor;
229 double modq;
231 // 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
233 oq_factor = 1.0 + ((double)0.0015625 * cpi->zbin_over_quant);
234 modq = (int)((double)capped_q * oq_factor);
235 cpi->RDMULT = (int)(rdconst * (modq * modq));
238 if (cpi->pass == 2 && (cpi->common.frame_type != KEY_FRAME))
240 if (cpi->next_iiratio > 31)
241 cpi->RDMULT += (cpi->RDMULT * rd_iifactor[31]) >> 4;
242 else
243 cpi->RDMULT += (cpi->RDMULT * rd_iifactor[cpi->next_iiratio]) >> 4;
246 cpi->mb.errorperbit = (cpi->RDMULT / 100);
247 cpi->mb.errorperbit += (cpi->mb.errorperbit==0);
249 vp8_set_speed_features(cpi);
251 if (cpi->common.simpler_lpf)
252 cpi->common.filter_type = SIMPLE_LOOPFILTER;
254 q = (int)pow(Qvalue, 1.25);
256 if (q < 8)
257 q = 8;
259 if (cpi->RDMULT > 1000)
261 cpi->RDDIV = 1;
262 cpi->RDMULT /= 100;
264 for (i = 0; i < MAX_MODES; i++)
266 if (cpi->sf.thresh_mult[i] < INT_MAX)
268 cpi->rd_threshes[i] = cpi->sf.thresh_mult[i] * q / 100;
270 else
272 cpi->rd_threshes[i] = INT_MAX;
275 cpi->rd_baseline_thresh[i] = cpi->rd_threshes[i];
278 else
280 cpi->RDDIV = 100;
282 for (i = 0; i < MAX_MODES; i++)
284 if (cpi->sf.thresh_mult[i] < (INT_MAX / q))
286 cpi->rd_threshes[i] = cpi->sf.thresh_mult[i] * q;
288 else
290 cpi->rd_threshes[i] = INT_MAX;
293 cpi->rd_baseline_thresh[i] = cpi->rd_threshes[i];
297 fill_token_costs(
298 cpi->mb.token_costs,
299 (const vp8_prob( *)[8][3][11]) cpi->common.fc.coef_probs
302 vp8_init_mode_costs(cpi);
306 void vp8_auto_select_speed(VP8_COMP *cpi)
308 int used = cpi->oxcf.cpu_used;
310 int milliseconds_for_compress = (int)(1000000 / cpi->oxcf.frame_rate);
312 milliseconds_for_compress = milliseconds_for_compress * (16 - cpi->oxcf.cpu_used) / 16;
314 #if 0
316 if (0)
318 FILE *f;
320 f = fopen("speed.stt", "a");
321 fprintf(f, " %8ld %10ld %10ld %10ld\n",
322 cpi->common.current_video_frame, cpi->Speed, milliseconds_for_compress, cpi->avg_pick_mode_time);
323 fclose(f);
326 #endif
329 // this is done during parameter valid check
330 if( used > 16)
331 used = 16;
332 if( used < -16)
333 used = -16;
336 if (cpi->avg_pick_mode_time < milliseconds_for_compress && (cpi->avg_encode_time - cpi->avg_pick_mode_time) < milliseconds_for_compress)
338 if (cpi->avg_pick_mode_time == 0)
340 cpi->Speed = 4;
342 else
344 if (milliseconds_for_compress * 100 < cpi->avg_encode_time * 95)
346 cpi->Speed += 2;
347 cpi->avg_pick_mode_time = 0;
348 cpi->avg_encode_time = 0;
350 if (cpi->Speed > 16)
352 cpi->Speed = 16;
356 if (milliseconds_for_compress * 100 > cpi->avg_encode_time * vp8_auto_speed_thresh[cpi->Speed])
358 cpi->Speed -= 1;
359 cpi->avg_pick_mode_time = 0;
360 cpi->avg_encode_time = 0;
362 // In real-time mode, cpi->speed is in [4, 16].
363 if (cpi->Speed < 4) //if ( cpi->Speed < 0 )
365 cpi->Speed = 4; //cpi->Speed = 0;
370 else
372 cpi->Speed += 4;
374 if (cpi->Speed > 16)
375 cpi->Speed = 16;
378 cpi->avg_pick_mode_time = 0;
379 cpi->avg_encode_time = 0;
383 int vp8_block_error_c(short *coeff, short *dqcoeff)
385 int i;
386 int error = 0;
388 for (i = 0; i < 16; i++)
390 int this_diff = coeff[i] - dqcoeff[i];
391 error += this_diff * this_diff;
394 return error;
397 int vp8_mbblock_error_c(MACROBLOCK *mb, int dc)
399 BLOCK *be;
400 BLOCKD *bd;
401 int i, j;
402 int berror, error = 0;
404 for (i = 0; i < 16; i++)
406 be = &mb->block[i];
407 bd = &mb->e_mbd.block[i];
409 berror = 0;
411 for (j = dc; j < 16; j++)
413 int this_diff = be->coeff[j] - bd->dqcoeff[j];
414 berror += this_diff * this_diff;
417 error += berror;
420 return error;
423 int vp8_mbuverror_c(MACROBLOCK *mb)
426 BLOCK *be;
427 BLOCKD *bd;
430 int i;
431 int error = 0;
433 for (i = 16; i < 24; i++)
435 be = &mb->block[i];
436 bd = &mb->e_mbd.block[i];
438 error += vp8_block_error_c(be->coeff, bd->dqcoeff);
441 return error;
444 int VP8_UVSSE(MACROBLOCK *x, const vp8_variance_rtcd_vtable_t *rtcd)
446 unsigned char *uptr, *vptr;
447 unsigned char *upred_ptr = (*(x->block[16].base_src) + x->block[16].src);
448 unsigned char *vpred_ptr = (*(x->block[20].base_src) + x->block[20].src);
449 int uv_stride = x->block[16].src_stride;
451 unsigned int sse1 = 0;
452 unsigned int sse2 = 0;
453 int mv_row;
454 int mv_col;
455 int offset;
456 int pre_stride = x->e_mbd.block[16].pre_stride;
458 vp8_build_uvmvs(&x->e_mbd, 0);
459 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;
462 offset = (mv_row >> 3) * pre_stride + (mv_col >> 3);
463 uptr = x->e_mbd.pre.u_buffer + offset;
464 vptr = x->e_mbd.pre.v_buffer + offset;
466 if ((mv_row | mv_col) & 7)
468 VARIANCE_INVOKE(rtcd, subpixvar8x8)(uptr, pre_stride, mv_col & 7, mv_row & 7, upred_ptr, uv_stride, &sse2);
469 VARIANCE_INVOKE(rtcd, subpixvar8x8)(vptr, pre_stride, mv_col & 7, mv_row & 7, vpred_ptr, uv_stride, &sse1);
470 sse2 += sse1;
472 else
474 VARIANCE_INVOKE(rtcd, subpixvar8x8)(uptr, pre_stride, mv_col & 7, mv_row & 7, upred_ptr, uv_stride, &sse2);
475 VARIANCE_INVOKE(rtcd, subpixvar8x8)(vptr, pre_stride, mv_col & 7, mv_row & 7, vpred_ptr, uv_stride, &sse1);
476 sse2 += sse1;
479 return sse2;
483 #if !(CONFIG_REALTIME_ONLY)
484 static int cost_coeffs(MACROBLOCK *mb, BLOCKD *b, int type, ENTROPY_CONTEXT *a, ENTROPY_CONTEXT *l)
486 int c = !type; /* start at coef 0, unless Y with Y2 */
487 int eob = b->eob;
488 int pt ; /* surrounding block/prev coef predictor */
489 int cost = 0;
490 short *qcoeff_ptr = b->qcoeff;
492 VP8_COMBINEENTROPYCONTEXTS(pt, *a, *l);
494 # define QC( I) ( qcoeff_ptr [vp8_default_zig_zag1d[I]] )
496 for (; c < eob; c++)
498 int v = QC(c);
499 int t = vp8_dct_value_tokens_ptr[v].Token;
500 cost += mb->token_costs [type] [vp8_coef_bands[c]] [pt] [t];
501 cost += vp8_dct_value_cost_ptr[v];
502 pt = vp8_prev_token_class[t];
505 # undef QC
507 if (c < 16)
508 cost += mb->token_costs [type] [vp8_coef_bands[c]] [pt] [DCT_EOB_TOKEN];
510 pt = (c != !type); // is eob first coefficient;
511 *a = *l = pt;
513 return cost;
516 static int vp8_rdcost_mby(MACROBLOCK *mb)
518 int cost = 0;
519 int b;
520 MACROBLOCKD *x = &mb->e_mbd;
521 ENTROPY_CONTEXT_PLANES t_above, t_left;
522 ENTROPY_CONTEXT *ta;
523 ENTROPY_CONTEXT *tl;
525 vpx_memcpy(&t_above, mb->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES));
526 vpx_memcpy(&t_left, mb->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES));
528 ta = (ENTROPY_CONTEXT *)&t_above;
529 tl = (ENTROPY_CONTEXT *)&t_left;
531 for (b = 0; b < 16; b++)
532 cost += cost_coeffs(mb, x->block + b, 0,
533 ta + vp8_block2above[b], tl + vp8_block2left[b]);
535 cost += cost_coeffs(mb, x->block + 24, 1,
536 ta + vp8_block2above[24], tl + vp8_block2left[24]);
538 return cost;
541 static void macro_block_yrd( MACROBLOCK *mb,
542 int *Rate,
543 int *Distortion,
544 const vp8_encodemb_rtcd_vtable_t *rtcd)
546 int b;
547 MACROBLOCKD *const x = &mb->e_mbd;
548 BLOCK *const mb_y2 = mb->block + 24;
549 BLOCKD *const x_y2 = x->block + 24;
550 short *Y2DCPtr = mb_y2->src_diff;
551 BLOCK *beptr;
552 int d;
554 ENCODEMB_INVOKE(rtcd, submby)( mb->src_diff, mb->src.y_buffer,
555 mb->e_mbd.predictor, mb->src.y_stride );
557 // Fdct and building the 2nd order block
558 for (beptr = mb->block; beptr < mb->block + 16; beptr += 2)
560 mb->vp8_short_fdct8x4(beptr->src_diff, beptr->coeff, 32);
561 *Y2DCPtr++ = beptr->coeff[0];
562 *Y2DCPtr++ = beptr->coeff[16];
565 // 2nd order fdct
566 mb->short_walsh4x4(mb_y2->src_diff, mb_y2->coeff, 8);
568 // Quantization
569 for (b = 0; b < 16; b++)
571 mb->quantize_b(&mb->block[b], &mb->e_mbd.block[b]);
574 // DC predication and Quantization of 2nd Order block
575 mb->quantize_b(mb_y2, x_y2);
577 // Distortion
578 d = ENCODEMB_INVOKE(rtcd, mberr)(mb, 1) << 2;
579 d += ENCODEMB_INVOKE(rtcd, berr)(mb_y2->coeff, x_y2->dqcoeff);
581 *Distortion = (d >> 4);
583 // rate
584 *Rate = vp8_rdcost_mby(mb);
587 static void rd_pick_intra4x4block(
588 VP8_COMP *cpi,
589 MACROBLOCK *x,
590 BLOCK *be,
591 BLOCKD *b,
592 B_PREDICTION_MODE *best_mode,
593 B_PREDICTION_MODE above,
594 B_PREDICTION_MODE left,
595 ENTROPY_CONTEXT *a,
596 ENTROPY_CONTEXT *l,
598 int *bestrate,
599 int *bestratey,
600 int *bestdistortion)
602 B_PREDICTION_MODE mode;
603 int best_rd = INT_MAX; // 1<<30
604 int rate = 0;
605 int distortion;
606 unsigned int *mode_costs;
608 ENTROPY_CONTEXT ta = *a, tempa = *a;
609 ENTROPY_CONTEXT tl = *l, templ = *l;
612 if (x->e_mbd.frame_type == KEY_FRAME)
614 mode_costs = x->bmode_costs[above][left];
616 else
618 mode_costs = x->inter_bmode_costs;
621 for (mode = B_DC_PRED; mode <= B_HU_PRED; mode++)
623 int this_rd;
624 int ratey;
626 rate = mode_costs[mode];
627 vp8_encode_intra4x4block_rd(IF_RTCD(&cpi->rtcd), x, be, b, mode);
629 tempa = ta;
630 templ = tl;
632 ratey = cost_coeffs(x, b, 3, &tempa, &templ);
633 rate += ratey;
634 distortion = ENCODEMB_INVOKE(IF_RTCD(&cpi->rtcd.encodemb), berr)(be->coeff, b->dqcoeff) >> 2;
636 this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion);
638 if (this_rd < best_rd)
640 *bestrate = rate;
641 *bestratey = ratey;
642 *bestdistortion = distortion;
643 best_rd = this_rd;
644 *best_mode = mode;
645 *a = tempa;
646 *l = templ;
650 b->bmi.mode = (B_PREDICTION_MODE)(*best_mode);
651 vp8_encode_intra4x4block_rd(IF_RTCD(&cpi->rtcd), x, be, b, b->bmi.mode);
656 int vp8_rd_pick_intra4x4mby_modes(VP8_COMP *cpi, MACROBLOCK *mb, int *Rate, int *rate_y, int *Distortion)
658 MACROBLOCKD *const xd = &mb->e_mbd;
659 int i;
660 int cost = mb->mbmode_cost [xd->frame_type] [B_PRED];
661 int distortion = 0;
662 int tot_rate_y = 0;
663 ENTROPY_CONTEXT_PLANES t_above, t_left;
664 ENTROPY_CONTEXT *ta;
665 ENTROPY_CONTEXT *tl;
667 vpx_memcpy(&t_above, mb->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES));
668 vpx_memcpy(&t_left, mb->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES));
670 ta = (ENTROPY_CONTEXT *)&t_above;
671 tl = (ENTROPY_CONTEXT *)&t_left;
673 vp8_intra_prediction_down_copy(xd);
675 for (i = 0; i < 16; i++)
677 MODE_INFO *const mic = xd->mode_info_context;
678 const int mis = xd->mode_info_stride;
679 const B_PREDICTION_MODE A = vp8_above_bmi(mic, i, mis)->mode;
680 const B_PREDICTION_MODE L = vp8_left_bmi(mic, i)->mode;
681 B_PREDICTION_MODE UNINITIALIZED_IS_SAFE(best_mode);
682 int UNINITIALIZED_IS_SAFE(r), UNINITIALIZED_IS_SAFE(ry), UNINITIALIZED_IS_SAFE(d);
684 rd_pick_intra4x4block(
685 cpi, mb, mb->block + i, xd->block + i, &best_mode, A, L,
686 ta + vp8_block2above[i],
687 tl + vp8_block2left[i], &r, &ry, &d);
689 cost += r;
690 distortion += d;
691 tot_rate_y += ry;
692 mic->bmi[i].mode = xd->block[i].bmi.mode = best_mode;
695 *Rate = cost;
696 *rate_y += tot_rate_y;
697 *Distortion = distortion;
699 return RDCOST(mb->rdmult, mb->rddiv, cost, distortion);
702 int vp8_rd_pick_intra16x16mby_mode(VP8_COMP *cpi,
703 MACROBLOCK *x,
704 int *Rate,
705 int *rate_y,
706 int *Distortion)
708 MB_PREDICTION_MODE mode;
709 MB_PREDICTION_MODE UNINITIALIZED_IS_SAFE(mode_selected);
710 int rate, ratey;
711 unsigned int distortion;
712 int best_rd = INT_MAX;
713 int this_rd;
714 int i;
716 //Y Search for 16x16 intra prediction mode
717 for (mode = DC_PRED; mode <= TM_PRED; mode++)
719 for (i = 0; i < 16; i++)
721 vpx_memset(&x->e_mbd.block[i].bmi, 0, sizeof(B_MODE_INFO));
724 x->e_mbd.mode_info_context->mbmi.mode = mode;
726 vp8_build_intra_predictors_mby_ptr(&x->e_mbd);
728 macro_block_yrd(x, &ratey, &distortion, IF_RTCD(&cpi->rtcd.encodemb));
729 rate = ratey + x->mbmode_cost[x->e_mbd.frame_type]
730 [x->e_mbd.mode_info_context->mbmi.mode];
732 this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion);
734 if (this_rd < best_rd)
736 mode_selected = mode;
737 best_rd = this_rd;
738 *Rate = rate;
739 *rate_y = ratey;
740 *Distortion = (int)distortion;
744 x->e_mbd.mode_info_context->mbmi.mode = mode_selected;
745 return best_rd;
748 static int rd_cost_mbuv(MACROBLOCK *mb)
750 int b;
751 int cost = 0;
752 MACROBLOCKD *x = &mb->e_mbd;
753 ENTROPY_CONTEXT_PLANES t_above, t_left;
754 ENTROPY_CONTEXT *ta;
755 ENTROPY_CONTEXT *tl;
757 vpx_memcpy(&t_above, mb->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES));
758 vpx_memcpy(&t_left, mb->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES));
760 ta = (ENTROPY_CONTEXT *)&t_above;
761 tl = (ENTROPY_CONTEXT *)&t_left;
763 for (b = 16; b < 20; b++)
764 cost += cost_coeffs(mb, x->block + b, vp8_block2type[b],
765 ta + vp8_block2above[b], tl + vp8_block2left[b]);
767 for (b = 20; b < 24; b++)
768 cost += cost_coeffs(mb, x->block + b, vp8_block2type[b],
769 ta + vp8_block2above[b], tl + vp8_block2left[b]);
771 return cost;
775 unsigned int vp8_get_mbuvrecon_error(const vp8_variance_rtcd_vtable_t *rtcd, const MACROBLOCK *x) // sum of squares
777 unsigned int sse0, sse1;
778 int sum0, sum1;
779 VARIANCE_INVOKE(rtcd, get8x8var)(x->src.u_buffer, x->src.uv_stride, x->e_mbd.dst.u_buffer, x->e_mbd.dst.uv_stride, &sse0, &sum0);
780 VARIANCE_INVOKE(rtcd, get8x8var)(x->src.v_buffer, x->src.uv_stride, x->e_mbd.dst.v_buffer, x->e_mbd.dst.uv_stride, &sse1, &sum1);
781 return (sse0 + sse1);
784 static int vp8_rd_inter_uv(VP8_COMP *cpi, MACROBLOCK *x, int *rate, int *distortion, int fullpixel)
786 vp8_build_uvmvs(&x->e_mbd, fullpixel);
787 vp8_encode_inter16x16uvrd(IF_RTCD(&cpi->rtcd), x);
790 *rate = rd_cost_mbuv(x);
791 *distortion = ENCODEMB_INVOKE(&cpi->rtcd.encodemb, mbuverr)(x) / 4;
793 return RDCOST(x->rdmult, x->rddiv, *rate, *distortion);
796 int vp8_rd_pick_intra_mbuv_mode(VP8_COMP *cpi, MACROBLOCK *x, int *rate, int *rate_tokenonly, int *distortion)
798 MB_PREDICTION_MODE mode;
799 MB_PREDICTION_MODE UNINITIALIZED_IS_SAFE(mode_selected);
800 int best_rd = INT_MAX;
801 int UNINITIALIZED_IS_SAFE(d), UNINITIALIZED_IS_SAFE(r);
802 int rate_to;
804 for (mode = DC_PRED; mode <= TM_PRED; mode++)
806 int rate;
807 int distortion;
808 int this_rd;
810 x->e_mbd.mode_info_context->mbmi.uv_mode = mode;
811 vp8_encode_intra16x16mbuvrd(IF_RTCD(&cpi->rtcd), x);
813 rate_to = rd_cost_mbuv(x);
814 rate = rate_to + x->intra_uv_mode_cost[x->e_mbd.frame_type][x->e_mbd.mode_info_context->mbmi.uv_mode];
816 distortion = vp8_get_mbuvrecon_error(IF_RTCD(&cpi->rtcd.variance), x);
818 this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion);
820 if (this_rd < best_rd)
822 best_rd = this_rd;
823 d = distortion;
824 r = rate;
825 *rate_tokenonly = rate_to;
826 mode_selected = mode;
830 *rate = r;
831 *distortion = d;
833 x->e_mbd.mode_info_context->mbmi.uv_mode = mode_selected;
834 return best_rd;
836 #endif
838 int vp8_cost_mv_ref(MB_PREDICTION_MODE m, const int near_mv_ref_ct[4])
840 vp8_prob p [VP8_MVREFS-1];
841 assert(NEARESTMV <= m && m <= SPLITMV);
842 vp8_mv_ref_probs(p, near_mv_ref_ct);
843 return vp8_cost_token(vp8_mv_ref_tree, p,
844 vp8_mv_ref_encoding_array - NEARESTMV + m);
847 void vp8_set_mbmode_and_mvs(MACROBLOCK *x, MB_PREDICTION_MODE mb, MV *mv)
849 int i;
851 x->e_mbd.mode_info_context->mbmi.mode = mb;
852 x->e_mbd.mode_info_context->mbmi.mv.as_mv.row = mv->row;
853 x->e_mbd.mode_info_context->mbmi.mv.as_mv.col = mv->col;
855 for (i = 0; i < 16; i++)
857 B_MODE_INFO *bmi = &x->e_mbd.block[i].bmi;
858 bmi->mode = (B_PREDICTION_MODE) mb;
859 bmi->mv.as_mv.row = mv->row;
860 bmi->mv.as_mv.col = mv->col;
864 #if !(CONFIG_REALTIME_ONLY)
865 static int labels2mode(
866 MACROBLOCK *x,
867 int const *labelings, int which_label,
868 B_PREDICTION_MODE this_mode,
869 MV *this_mv, MV *best_ref_mv,
870 int *mvcost[2]
873 MACROBLOCKD *const xd = & x->e_mbd;
874 MODE_INFO *const mic = xd->mode_info_context;
875 const int mis = xd->mode_info_stride;
877 int cost = 0;
878 int thismvcost = 0;
880 /* We have to be careful retrieving previously-encoded motion vectors.
881 Ones from this macroblock have to be pulled from the BLOCKD array
882 as they have not yet made it to the bmi array in our MB_MODE_INFO. */
884 int i = 0;
888 BLOCKD *const d = xd->block + i;
889 const int row = i >> 2, col = i & 3;
891 B_PREDICTION_MODE m;
893 if (labelings[i] != which_label)
894 continue;
896 if (col && labelings[i] == labelings[i-1])
897 m = LEFT4X4;
898 else if (row && labelings[i] == labelings[i-4])
899 m = ABOVE4X4;
900 else
902 // the only time we should do costing for new motion vector or mode
903 // is when we are on a new label (jbb May 08, 2007)
904 switch (m = this_mode)
906 case NEW4X4 :
907 thismvcost = vp8_mv_bit_cost(this_mv, best_ref_mv, mvcost, 102);
908 break;
909 case LEFT4X4:
910 *this_mv = col ? d[-1].bmi.mv.as_mv : vp8_left_bmi(mic, i)->mv.as_mv;
911 break;
912 case ABOVE4X4:
913 *this_mv = row ? d[-4].bmi.mv.as_mv : vp8_above_bmi(mic, i, mis)->mv.as_mv;
914 break;
915 case ZERO4X4:
916 this_mv->row = this_mv->col = 0;
917 break;
918 default:
919 break;
922 if (m == ABOVE4X4) // replace above with left if same
924 const MV mv = col ? d[-1].bmi.mv.as_mv : vp8_left_bmi(mic, i)->mv.as_mv;
926 if (mv.row == this_mv->row && mv.col == this_mv->col)
927 m = LEFT4X4;
930 cost = x->inter_bmode_costs[ m];
933 d->bmi.mode = m;
934 d->bmi.mv.as_mv = *this_mv;
937 while (++i < 16);
939 cost += thismvcost ;
940 return cost;
943 static int rdcost_mbsegment_y(MACROBLOCK *mb, const int *labels,
944 int which_label, ENTROPY_CONTEXT *ta,
945 ENTROPY_CONTEXT *tl)
947 int cost = 0;
948 int b;
949 MACROBLOCKD *x = &mb->e_mbd;
951 for (b = 0; b < 16; b++)
952 if (labels[ b] == which_label)
953 cost += cost_coeffs(mb, x->block + b, 3,
954 ta + vp8_block2above[b],
955 tl + vp8_block2left[b]);
957 return cost;
960 static unsigned int vp8_encode_inter_mb_segment(MACROBLOCK *x, int const *labels, int which_label, const vp8_encodemb_rtcd_vtable_t *rtcd)
962 int i;
963 unsigned int distortion = 0;
965 for (i = 0; i < 16; i++)
967 if (labels[i] == which_label)
969 BLOCKD *bd = &x->e_mbd.block[i];
970 BLOCK *be = &x->block[i];
973 vp8_build_inter_predictors_b(bd, 16, x->e_mbd.subpixel_predict);
974 ENCODEMB_INVOKE(rtcd, subb)(be, bd, 16);
975 x->vp8_short_fdct4x4(be->src_diff, be->coeff, 32);
977 // set to 0 no way to account for 2nd order DC so discount
978 //be->coeff[0] = 0;
979 x->quantize_b(be, bd);
981 distortion += ENCODEMB_INVOKE(rtcd, berr)(be->coeff, bd->dqcoeff);
985 return distortion;
988 unsigned char vp8_mbsplit_offset2[4][16] = {
989 { 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
990 { 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
991 { 0, 2, 8, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
992 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
996 static const unsigned int segmentation_to_sseshift[4] = {3, 3, 2, 0};
999 typedef struct
1001 MV *ref_mv;
1002 MV *mvp;
1004 int segment_rd;
1005 int segment_num;
1006 int r;
1007 int d;
1008 int segment_yrate;
1009 B_PREDICTION_MODE modes[16];
1010 int_mv mvs[16];
1011 unsigned char eobs[16];
1013 int mvthresh;
1014 int *mdcounts;
1016 MV sv_mvp[4]; // save 4 mvp from 8x8
1017 int sv_istep[2]; // save 2 initial step_param for 16x8/8x16
1019 } BEST_SEG_INFO;
1022 void vp8_rd_check_segment(VP8_COMP *cpi, MACROBLOCK *x, BEST_SEG_INFO *bsi,
1023 unsigned int segmentation)
1025 int i;
1026 int const *labels;
1027 int br = 0;
1028 int bd = 0;
1029 B_PREDICTION_MODE this_mode;
1032 int label_count;
1033 int this_segment_rd = 0;
1034 int label_mv_thresh;
1035 int rate = 0;
1036 int sbr = 0;
1037 int sbd = 0;
1038 int segmentyrate = 0;
1040 vp8_variance_fn_ptr_t *v_fn_ptr;
1042 ENTROPY_CONTEXT_PLANES t_above, t_left;
1043 ENTROPY_CONTEXT *ta;
1044 ENTROPY_CONTEXT *tl;
1045 ENTROPY_CONTEXT_PLANES t_above_b, t_left_b;
1046 ENTROPY_CONTEXT *ta_b;
1047 ENTROPY_CONTEXT *tl_b;
1049 vpx_memcpy(&t_above, x->e_mbd.above_context, sizeof(ENTROPY_CONTEXT_PLANES));
1050 vpx_memcpy(&t_left, x->e_mbd.left_context, sizeof(ENTROPY_CONTEXT_PLANES));
1052 ta = (ENTROPY_CONTEXT *)&t_above;
1053 tl = (ENTROPY_CONTEXT *)&t_left;
1054 ta_b = (ENTROPY_CONTEXT *)&t_above_b;
1055 tl_b = (ENTROPY_CONTEXT *)&t_left_b;
1057 br = 0;
1058 bd = 0;
1060 v_fn_ptr = &cpi->fn_ptr[segmentation];
1061 labels = vp8_mbsplits[segmentation];
1062 label_count = vp8_mbsplit_count[segmentation];
1064 // 64 makes this threshold really big effectively
1065 // making it so that we very rarely check mvs on
1066 // segments. setting this to 1 would make mv thresh
1067 // roughly equal to what it is for macroblocks
1068 label_mv_thresh = 1 * bsi->mvthresh / label_count ;
1070 // Segmentation method overheads
1071 rate = vp8_cost_token(vp8_mbsplit_tree, vp8_mbsplit_probs, vp8_mbsplit_encodings + segmentation);
1072 rate += vp8_cost_mv_ref(SPLITMV, bsi->mdcounts);
1073 this_segment_rd += RDCOST(x->rdmult, x->rddiv, rate, 0);
1074 br += rate;
1076 for (i = 0; i < label_count; i++)
1078 MV mode_mv[B_MODE_COUNT];
1079 int best_label_rd = INT_MAX;
1080 B_PREDICTION_MODE mode_selected = ZERO4X4;
1081 int bestlabelyrate = 0;
1083 // search for the best motion vector on this segment
1084 for (this_mode = LEFT4X4; this_mode <= NEW4X4 ; this_mode ++)
1086 int this_rd;
1087 int distortion;
1088 int labelyrate;
1089 ENTROPY_CONTEXT_PLANES t_above_s, t_left_s;
1090 ENTROPY_CONTEXT *ta_s;
1091 ENTROPY_CONTEXT *tl_s;
1093 vpx_memcpy(&t_above_s, &t_above, sizeof(ENTROPY_CONTEXT_PLANES));
1094 vpx_memcpy(&t_left_s, &t_left, sizeof(ENTROPY_CONTEXT_PLANES));
1096 ta_s = (ENTROPY_CONTEXT *)&t_above_s;
1097 tl_s = (ENTROPY_CONTEXT *)&t_left_s;
1099 if (this_mode == NEW4X4)
1101 int sseshift;
1102 int num00;
1103 int step_param = 0;
1104 int further_steps;
1105 int n;
1106 int thissme;
1107 int bestsme = INT_MAX;
1108 MV temp_mv;
1109 BLOCK *c;
1110 BLOCKD *e;
1112 // Is the best so far sufficiently good that we cant justify doing and new motion search.
1113 if (best_label_rd < label_mv_thresh)
1114 break;
1116 if(cpi->compressor_speed)
1118 if (segmentation == BLOCK_8X16 || segmentation == BLOCK_16X8)
1120 bsi->mvp = &bsi->sv_mvp[i];
1121 if (i==1 && segmentation == BLOCK_16X8) bsi->mvp = &bsi->sv_mvp[2];
1123 step_param = bsi->sv_istep[i];
1126 // use previous block's result as next block's MV predictor.
1127 if (segmentation == BLOCK_4X4 && i>0)
1129 bsi->mvp = &(x->e_mbd.block[i-1].bmi.mv.as_mv);
1130 if (i==4 || i==8 || i==12) bsi->mvp = &(x->e_mbd.block[i-4].bmi.mv.as_mv);
1131 step_param = 2;
1135 further_steps = (MAX_MVSEARCH_STEPS - 1) - step_param;
1138 int sadpb = x->sadperbit4;
1140 // find first label
1141 n = vp8_mbsplit_offset2[segmentation][i];
1143 c = &x->block[n];
1144 e = &x->e_mbd.block[n];
1146 if (cpi->sf.search_method == HEX)
1147 bestsme = vp8_hex_search(x, c, e, bsi->ref_mv,
1148 &mode_mv[NEW4X4], step_param, sadpb, &num00, v_fn_ptr, x->mvsadcost, x->mvcost);
1150 else
1152 bestsme = cpi->diamond_search_sad(x, c, e, bsi->mvp,
1153 &mode_mv[NEW4X4], step_param,
1154 sadpb / 2, &num00, v_fn_ptr, x->mvsadcost, x->mvcost, bsi->ref_mv);
1156 n = num00;
1157 num00 = 0;
1159 while (n < further_steps)
1161 n++;
1163 if (num00)
1164 num00--;
1165 else
1167 thissme = cpi->diamond_search_sad(x, c, e, bsi->mvp,
1168 &temp_mv, step_param + n,
1169 sadpb / 2, &num00, v_fn_ptr, x->mvsadcost, x->mvcost, bsi->ref_mv);
1171 if (thissme < bestsme)
1173 bestsme = thissme;
1174 mode_mv[NEW4X4].row = temp_mv.row;
1175 mode_mv[NEW4X4].col = temp_mv.col;
1181 sseshift = segmentation_to_sseshift[segmentation];
1183 // Should we do a full search (best quality only)
1184 if ((cpi->compressor_speed == 0) && (bestsme >> sseshift) > 4000)
1186 thissme = cpi->full_search_sad(x, c, e, bsi->mvp,
1187 sadpb / 4, 16, v_fn_ptr, x->mvcost, x->mvsadcost,bsi->ref_mv);
1189 if (thissme < bestsme)
1191 bestsme = thissme;
1192 mode_mv[NEW4X4] = e->bmi.mv.as_mv;
1194 else
1196 // The full search result is actually worse so re-instate the previous best vector
1197 e->bmi.mv.as_mv = mode_mv[NEW4X4];
1202 if (bestsme < INT_MAX)
1204 if (!cpi->common.full_pixel)
1205 cpi->find_fractional_mv_step(x, c, e, &mode_mv[NEW4X4],
1206 bsi->ref_mv, x->errorperbit / 2, v_fn_ptr, x->mvcost);
1207 else
1208 vp8_skip_fractional_mv_step(x, c, e, &mode_mv[NEW4X4],
1209 bsi->ref_mv, x->errorperbit, v_fn_ptr, x->mvcost);
1211 } /* NEW4X4 */
1213 rate = labels2mode(x, labels, i, this_mode, &mode_mv[this_mode],
1214 bsi->ref_mv, x->mvcost);
1216 // Trap vectors that reach beyond the UMV borders
1217 if (((mode_mv[this_mode].row >> 3) < x->mv_row_min) || ((mode_mv[this_mode].row >> 3) > x->mv_row_max) ||
1218 ((mode_mv[this_mode].col >> 3) < x->mv_col_min) || ((mode_mv[this_mode].col >> 3) > x->mv_col_max))
1220 continue;
1223 distortion = vp8_encode_inter_mb_segment(x, labels, i, IF_RTCD(&cpi->rtcd.encodemb)) / 4;
1225 labelyrate = rdcost_mbsegment_y(x, labels, i, ta_s, tl_s);
1226 rate += labelyrate;
1228 this_rd = RDCOST(x->rdmult, x->rddiv, rate, distortion);
1230 if (this_rd < best_label_rd)
1232 sbr = rate;
1233 sbd = distortion;
1234 bestlabelyrate = labelyrate;
1235 mode_selected = this_mode;
1236 best_label_rd = this_rd;
1238 vpx_memcpy(ta_b, ta_s, sizeof(ENTROPY_CONTEXT_PLANES));
1239 vpx_memcpy(tl_b, tl_s, sizeof(ENTROPY_CONTEXT_PLANES));
1242 } /*for each 4x4 mode*/
1244 vpx_memcpy(ta, ta_b, sizeof(ENTROPY_CONTEXT_PLANES));
1245 vpx_memcpy(tl, tl_b, sizeof(ENTROPY_CONTEXT_PLANES));
1247 labels2mode(x, labels, i, mode_selected, &mode_mv[mode_selected],
1248 bsi->ref_mv, x->mvcost);
1250 br += sbr;
1251 bd += sbd;
1252 segmentyrate += bestlabelyrate;
1253 this_segment_rd += best_label_rd;
1255 if (this_segment_rd >= bsi->segment_rd)
1256 break;
1258 } /* for each label */
1260 if (this_segment_rd < bsi->segment_rd)
1262 bsi->r = br;
1263 bsi->d = bd;
1264 bsi->segment_yrate = segmentyrate;
1265 bsi->segment_rd = this_segment_rd;
1266 bsi->segment_num = segmentation;
1268 // store everything needed to come back to this!!
1269 for (i = 0; i < 16; i++)
1271 BLOCKD *bd = &x->e_mbd.block[i];
1273 bsi->mvs[i].as_mv = bd->bmi.mv.as_mv;
1274 bsi->modes[i] = bd->bmi.mode;
1275 bsi->eobs[i] = bd->eob;
1280 static __inline
1281 void vp8_cal_step_param(int sr, int *sp)
1283 int step = 0;
1285 if (sr > MAX_FIRST_STEP) sr = MAX_FIRST_STEP;
1286 else if (sr < 1) sr = 1;
1288 while (sr>>=1)
1289 step++;
1291 *sp = MAX_MVSEARCH_STEPS - 1 - step;
1294 static int vp8_rd_pick_best_mbsegmentation(VP8_COMP *cpi, MACROBLOCK *x,
1295 MV *best_ref_mv, int best_rd,
1296 int *mdcounts, int *returntotrate,
1297 int *returnyrate, int *returndistortion,
1298 int mvthresh)
1300 int i;
1301 BEST_SEG_INFO bsi;
1303 vpx_memset(&bsi, 0, sizeof(bsi));
1305 bsi.segment_rd = best_rd;
1306 bsi.ref_mv = best_ref_mv;
1307 bsi.mvp = best_ref_mv;
1308 bsi.mvthresh = mvthresh;
1309 bsi.mdcounts = mdcounts;
1311 for(i = 0; i < 16; i++)
1313 bsi.modes[i] = ZERO4X4;
1316 if(cpi->compressor_speed == 0)
1318 /* for now, we will keep the original segmentation order
1319 when in best quality mode */
1320 vp8_rd_check_segment(cpi, x, &bsi, BLOCK_16X8);
1321 vp8_rd_check_segment(cpi, x, &bsi, BLOCK_8X16);
1322 vp8_rd_check_segment(cpi, x, &bsi, BLOCK_8X8);
1323 vp8_rd_check_segment(cpi, x, &bsi, BLOCK_4X4);
1325 else
1327 int sr;
1329 vp8_rd_check_segment(cpi, x, &bsi, BLOCK_8X8);
1331 if (bsi.segment_rd < best_rd)
1333 int col_min = (best_ref_mv->col - MAX_FULL_PEL_VAL) >>3;
1334 int col_max = (best_ref_mv->col + MAX_FULL_PEL_VAL) >>3;
1335 int row_min = (best_ref_mv->row - MAX_FULL_PEL_VAL) >>3;
1336 int row_max = (best_ref_mv->row + MAX_FULL_PEL_VAL) >>3;
1338 int tmp_col_min = x->mv_col_min;
1339 int tmp_col_max = x->mv_col_max;
1340 int tmp_row_min = x->mv_row_min;
1341 int tmp_row_max = x->mv_row_max;
1343 /* Get intersection of UMV window and valid MV window to reduce # of checks in diamond search. */
1344 if (x->mv_col_min < col_min )
1345 x->mv_col_min = col_min;
1346 if (x->mv_col_max > col_max )
1347 x->mv_col_max = col_max;
1348 if (x->mv_row_min < row_min )
1349 x->mv_row_min = row_min;
1350 if (x->mv_row_max > row_max )
1351 x->mv_row_max = row_max;
1353 /* Get 8x8 result */
1354 bsi.sv_mvp[0] = bsi.mvs[0].as_mv;
1355 bsi.sv_mvp[1] = bsi.mvs[2].as_mv;
1356 bsi.sv_mvp[2] = bsi.mvs[8].as_mv;
1357 bsi.sv_mvp[3] = bsi.mvs[10].as_mv;
1359 /* Use 8x8 result as 16x8/8x16's predictor MV. Adjust search range according to the closeness of 2 MV. */
1360 /* block 8X16 */
1362 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);
1363 vp8_cal_step_param(sr, &bsi.sv_istep[0]);
1365 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);
1366 vp8_cal_step_param(sr, &bsi.sv_istep[1]);
1368 vp8_rd_check_segment(cpi, x, &bsi, BLOCK_8X16);
1371 /* block 16X8 */
1373 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);
1374 vp8_cal_step_param(sr, &bsi.sv_istep[0]);
1376 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);
1377 vp8_cal_step_param(sr, &bsi.sv_istep[1]);
1379 vp8_rd_check_segment(cpi, x, &bsi, BLOCK_16X8);
1382 /* If 8x8 is better than 16x8/8x16, then do 4x4 search */
1383 /* Not skip 4x4 if speed=0 (good quality) */
1384 if (cpi->sf.no_skip_block4x4_search || bsi.segment_num == BLOCK_8X8) /* || (sv_segment_rd8x8-bsi.segment_rd) < sv_segment_rd8x8>>5) */
1386 bsi.mvp = &bsi.sv_mvp[0];
1387 vp8_rd_check_segment(cpi, x, &bsi, BLOCK_4X4);
1390 /* restore UMV window */
1391 x->mv_col_min = tmp_col_min;
1392 x->mv_col_max = tmp_col_max;
1393 x->mv_row_min = tmp_row_min;
1394 x->mv_row_max = tmp_row_max;
1398 /* set it to the best */
1399 for (i = 0; i < 16; i++)
1401 BLOCKD *bd = &x->e_mbd.block[i];
1403 bd->bmi.mv.as_mv = bsi.mvs[i].as_mv;
1404 bd->bmi.mode = bsi.modes[i];
1405 bd->eob = bsi.eobs[i];
1408 *returntotrate = bsi.r;
1409 *returndistortion = bsi.d;
1410 *returnyrate = bsi.segment_yrate;
1412 /* save partitions */
1413 x->e_mbd.mode_info_context->mbmi.partitioning = bsi.segment_num;
1414 x->partition_info->count = vp8_mbsplit_count[bsi.segment_num];
1416 for (i = 0; i < x->partition_info->count; i++)
1418 int j;
1420 j = vp8_mbsplit_offset2[bsi.segment_num][i];
1422 x->partition_info->bmi[i].mode = x->e_mbd.block[j].bmi.mode;
1423 x->partition_info->bmi[i].mv.as_mv = x->e_mbd.block[j].bmi.mv.as_mv;
1426 return bsi.segment_rd;
1429 static void swap(int *x,int *y)
1431 int tmp;
1433 tmp = *x;
1434 *x = *y;
1435 *y = tmp;
1438 static void quicksortmv(int arr[],int left, int right)
1440 int lidx,ridx,pivot;
1442 lidx = left;
1443 ridx = right;
1445 if( left < right)
1447 pivot = (left + right)/2;
1449 while(lidx <=pivot && ridx >=pivot)
1451 while(arr[lidx] < arr[pivot] && lidx <= pivot)
1452 lidx++;
1453 while(arr[ridx] > arr[pivot] && ridx >= pivot)
1454 ridx--;
1455 swap(&arr[lidx], &arr[ridx]);
1456 lidx++;
1457 ridx--;
1458 if(lidx-1 == pivot)
1460 ridx++;
1461 pivot = ridx;
1463 else if(ridx+1 == pivot)
1465 lidx--;
1466 pivot = lidx;
1469 quicksortmv(arr, left, pivot - 1);
1470 quicksortmv(arr, pivot + 1, right);
1474 static void quicksortsad(int arr[],int idx[], int left, int right)
1476 int lidx,ridx,pivot;
1478 lidx = left;
1479 ridx = right;
1481 if( left < right)
1483 pivot = (left + right)/2;
1485 while(lidx <=pivot && ridx >=pivot)
1487 while(arr[lidx] < arr[pivot] && lidx <= pivot)
1488 lidx++;
1489 while(arr[ridx] > arr[pivot] && ridx >= pivot)
1490 ridx--;
1491 swap(&arr[lidx], &arr[ridx]);
1492 swap(&idx[lidx], &idx[ridx]);
1493 lidx++;
1494 ridx--;
1495 if(lidx-1 == pivot)
1497 ridx++;
1498 pivot = ridx;
1500 else if(ridx+1 == pivot)
1502 lidx--;
1503 pivot = lidx;
1506 quicksortsad(arr, idx, left, pivot - 1);
1507 quicksortsad(arr, idx, pivot + 1, right);
1511 //The improved MV prediction
1512 void vp8_mv_pred
1514 VP8_COMP *cpi,
1515 MACROBLOCKD *xd,
1516 const MODE_INFO *here,
1517 MV *mvp,
1518 int refframe,
1519 int *ref_frame_sign_bias,
1520 int *sr,
1521 int near_sadidx[]
1524 const MODE_INFO *above = here - xd->mode_info_stride;
1525 const MODE_INFO *left = here - 1;
1526 const MODE_INFO *aboveleft = above - 1;
1527 int_mv near_mvs[8];
1528 int near_ref[8];
1529 int_mv mv;
1530 int vcnt=0;
1531 int find=0;
1532 int mb_offset;
1534 int mvx[8];
1535 int mvy[8];
1536 int i;
1538 mv.as_int = 0;
1540 if(here->mbmi.ref_frame != INTRA_FRAME)
1542 near_mvs[0].as_int = near_mvs[1].as_int = near_mvs[2].as_int = near_mvs[3].as_int = near_mvs[4].as_int = near_mvs[5].as_int = near_mvs[6].as_int = near_mvs[7].as_int = 0;
1543 near_ref[0] = near_ref[1] = near_ref[2] = near_ref[3] = near_ref[4] = near_ref[5] = near_ref[6] = near_ref[7] = 0;
1545 // read in 3 nearby block's MVs from current frame as prediction candidates.
1546 if (above->mbmi.ref_frame != INTRA_FRAME)
1548 near_mvs[vcnt].as_int = above->mbmi.mv.as_int;
1549 mv_bias(ref_frame_sign_bias[above->mbmi.ref_frame], refframe, &near_mvs[vcnt], ref_frame_sign_bias);
1550 near_ref[vcnt] = above->mbmi.ref_frame;
1552 vcnt++;
1553 if (left->mbmi.ref_frame != INTRA_FRAME)
1555 near_mvs[vcnt].as_int = left->mbmi.mv.as_int;
1556 mv_bias(ref_frame_sign_bias[left->mbmi.ref_frame], refframe, &near_mvs[vcnt], ref_frame_sign_bias);
1557 near_ref[vcnt] = left->mbmi.ref_frame;
1559 vcnt++;
1560 if (aboveleft->mbmi.ref_frame != INTRA_FRAME)
1562 near_mvs[vcnt].as_int = aboveleft->mbmi.mv.as_int;
1563 mv_bias(ref_frame_sign_bias[aboveleft->mbmi.ref_frame], refframe, &near_mvs[vcnt], ref_frame_sign_bias);
1564 near_ref[vcnt] = aboveleft->mbmi.ref_frame;
1566 vcnt++;
1568 // read in 5 nearby block's MVs from last frame.
1569 if(cpi->common.last_frame_type != KEY_FRAME)
1571 mb_offset = (-xd->mb_to_top_edge/128 + 1) * (xd->mode_info_stride +1) + (-xd->mb_to_left_edge/128 +1) ;
1573 // current in last frame
1574 if (cpi->lf_ref_frame[mb_offset] != INTRA_FRAME)
1576 near_mvs[vcnt].as_int = cpi->lfmv[mb_offset].as_int;
1577 mv_bias(cpi->lf_ref_frame_sign_bias[mb_offset], refframe, &near_mvs[vcnt], ref_frame_sign_bias);
1578 near_ref[vcnt] = cpi->lf_ref_frame[mb_offset];
1580 vcnt++;
1582 // above in last frame
1583 if (cpi->lf_ref_frame[mb_offset - xd->mode_info_stride-1] != INTRA_FRAME)
1585 near_mvs[vcnt].as_int = cpi->lfmv[mb_offset - xd->mode_info_stride-1].as_int;
1586 mv_bias(cpi->lf_ref_frame_sign_bias[mb_offset - xd->mode_info_stride-1], refframe, &near_mvs[vcnt], ref_frame_sign_bias);
1587 near_ref[vcnt] = cpi->lf_ref_frame[mb_offset - xd->mode_info_stride-1];
1589 vcnt++;
1591 // left in last frame
1592 if (cpi->lf_ref_frame[mb_offset-1] != INTRA_FRAME)
1594 near_mvs[vcnt].as_int = cpi->lfmv[mb_offset -1].as_int;
1595 mv_bias(cpi->lf_ref_frame_sign_bias[mb_offset -1], refframe, &near_mvs[vcnt], ref_frame_sign_bias);
1596 near_ref[vcnt] = cpi->lf_ref_frame[mb_offset - 1];
1598 vcnt++;
1600 // right in last frame
1601 if (cpi->lf_ref_frame[mb_offset +1] != INTRA_FRAME)
1603 near_mvs[vcnt].as_int = cpi->lfmv[mb_offset +1].as_int;
1604 mv_bias(cpi->lf_ref_frame_sign_bias[mb_offset +1], refframe, &near_mvs[vcnt], ref_frame_sign_bias);
1605 near_ref[vcnt] = cpi->lf_ref_frame[mb_offset +1];
1607 vcnt++;
1609 // below in last frame
1610 if (cpi->lf_ref_frame[mb_offset + xd->mode_info_stride +1] != INTRA_FRAME)
1612 near_mvs[vcnt].as_int = cpi->lfmv[mb_offset + xd->mode_info_stride +1].as_int;
1613 mv_bias(cpi->lf_ref_frame_sign_bias[mb_offset + xd->mode_info_stride +1], refframe, &near_mvs[vcnt], ref_frame_sign_bias);
1614 near_ref[vcnt] = cpi->lf_ref_frame[mb_offset + xd->mode_info_stride +1];
1616 vcnt++;
1619 for(i=0; i< vcnt; i++)
1621 if(near_ref[near_sadidx[i]] != INTRA_FRAME)
1623 if(here->mbmi.ref_frame == near_ref[near_sadidx[i]])
1625 mv.as_int = near_mvs[near_sadidx[i]].as_int;
1626 find = 1;
1627 if (i < 3)
1628 *sr = 3;
1629 else
1630 *sr = 2;
1631 break;
1636 if(!find)
1638 for(i=0; i<vcnt; i++)
1640 mvx[i] = near_mvs[i].as_mv.row;
1641 mvy[i] = near_mvs[i].as_mv.col;
1644 quicksortmv (mvx, 0, vcnt-1);
1645 quicksortmv (mvy, 0, vcnt-1);
1646 mv.as_mv.row = mvx[vcnt/2];
1647 mv.as_mv.col = mvy[vcnt/2];
1649 find = 1;
1650 //sr is set to 0 to allow calling function to decide the search range.
1651 *sr = 0;
1655 /* Set up return values */
1656 *mvp = mv.as_mv;
1657 vp8_clamp_mv(mvp, xd);
1660 int vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, int recon_uvoffset, int *returnrate, int *returndistortion, int *returnintra)
1662 BLOCK *b = &x->block[0];
1663 BLOCKD *d = &x->e_mbd.block[0];
1664 MACROBLOCKD *xd = &x->e_mbd;
1665 B_MODE_INFO best_bmodes[16];
1666 MB_MODE_INFO best_mbmode;
1667 PARTITION_INFO best_partition;
1668 MV best_ref_mv;
1669 MV mode_mv[MB_MODE_COUNT];
1670 MB_PREDICTION_MODE this_mode;
1671 int num00;
1672 int best_mode_index = 0;
1674 int i;
1675 int mode_index;
1676 int mdcounts[4];
1677 int rate;
1678 int distortion;
1679 int best_rd = INT_MAX; // 1 << 30;
1680 int ref_frame_cost[MAX_REF_FRAMES];
1681 int rate2, distortion2;
1682 int uv_intra_rate, uv_intra_distortion, uv_intra_rate_tokenonly;
1683 int rate_y, UNINITIALIZED_IS_SAFE(rate_uv);
1684 int distortion_uv;
1685 int best_yrd = INT_MAX;
1687 //int all_rds[MAX_MODES]; // Experimental debug code.
1688 //int all_rates[MAX_MODES];
1689 //int all_dist[MAX_MODES];
1690 //int intermodecost[MAX_MODES];
1692 MB_PREDICTION_MODE uv_intra_mode;
1694 int force_no_skip = 0;
1696 MV mvp;
1697 int near_sad[8] = {0}; // 0-cf above, 1-cf left, 2-cf aboveleft, 3-lf current, 4-lf above, 5-lf left, 6-lf right, 7-lf below
1698 int near_sadidx[8] = {0, 1, 2, 3, 4, 5, 6, 7};
1699 int saddone=0;
1700 int sr=0; //search range got from mv_pred(). It uses step_param levels. (0-7)
1702 MV frame_nearest_mv[4];
1703 MV frame_near_mv[4];
1704 MV frame_best_ref_mv[4];
1705 int frame_mdcounts[4][4];
1706 int frame_lf_or_gf[4];
1707 unsigned char *y_buffer[4];
1708 unsigned char *u_buffer[4];
1709 unsigned char *v_buffer[4];
1711 vpx_memset(&best_mbmode, 0, sizeof(best_mbmode));
1713 if (cpi->ref_frame_flags & VP8_LAST_FLAG)
1715 YV12_BUFFER_CONFIG *lst_yv12 = &cpi->common.yv12_fb[cpi->common.lst_fb_idx];
1717 vp8_find_near_mvs(&x->e_mbd, x->e_mbd.mode_info_context, &frame_nearest_mv[LAST_FRAME], &frame_near_mv[LAST_FRAME],
1718 &frame_best_ref_mv[LAST_FRAME], frame_mdcounts[LAST_FRAME], LAST_FRAME, cpi->common.ref_frame_sign_bias);
1720 y_buffer[LAST_FRAME] = lst_yv12->y_buffer + recon_yoffset;
1721 u_buffer[LAST_FRAME] = lst_yv12->u_buffer + recon_uvoffset;
1722 v_buffer[LAST_FRAME] = lst_yv12->v_buffer + recon_uvoffset;
1724 frame_lf_or_gf[LAST_FRAME] = 0;
1727 if (cpi->ref_frame_flags & VP8_GOLD_FLAG)
1729 YV12_BUFFER_CONFIG *gld_yv12 = &cpi->common.yv12_fb[cpi->common.gld_fb_idx];
1731 vp8_find_near_mvs(&x->e_mbd, x->e_mbd.mode_info_context, &frame_nearest_mv[GOLDEN_FRAME], &frame_near_mv[GOLDEN_FRAME],
1732 &frame_best_ref_mv[GOLDEN_FRAME], frame_mdcounts[GOLDEN_FRAME], GOLDEN_FRAME, cpi->common.ref_frame_sign_bias);
1734 y_buffer[GOLDEN_FRAME] = gld_yv12->y_buffer + recon_yoffset;
1735 u_buffer[GOLDEN_FRAME] = gld_yv12->u_buffer + recon_uvoffset;
1736 v_buffer[GOLDEN_FRAME] = gld_yv12->v_buffer + recon_uvoffset;
1738 frame_lf_or_gf[GOLDEN_FRAME] = 1;
1741 if (cpi->ref_frame_flags & VP8_ALT_FLAG)
1743 YV12_BUFFER_CONFIG *alt_yv12 = &cpi->common.yv12_fb[cpi->common.alt_fb_idx];
1745 vp8_find_near_mvs(&x->e_mbd, x->e_mbd.mode_info_context, &frame_nearest_mv[ALTREF_FRAME], &frame_near_mv[ALTREF_FRAME],
1746 &frame_best_ref_mv[ALTREF_FRAME], frame_mdcounts[ALTREF_FRAME], ALTREF_FRAME, cpi->common.ref_frame_sign_bias);
1748 y_buffer[ALTREF_FRAME] = alt_yv12->y_buffer + recon_yoffset;
1749 u_buffer[ALTREF_FRAME] = alt_yv12->u_buffer + recon_uvoffset;
1750 v_buffer[ALTREF_FRAME] = alt_yv12->v_buffer + recon_uvoffset;
1752 frame_lf_or_gf[ALTREF_FRAME] = 1;
1755 *returnintra = INT_MAX;
1756 cpi->mbs_tested_so_far++; // Count of the number of MBs tested so far this frame
1758 x->skip = 0;
1760 ref_frame_cost[INTRA_FRAME] = vp8_cost_zero(cpi->prob_intra_coded);
1762 // Special case treatment when GF and ARF are not sensible options for reference
1763 if (cpi->ref_frame_flags == VP8_LAST_FLAG)
1765 ref_frame_cost[LAST_FRAME] = vp8_cost_one(cpi->prob_intra_coded)
1766 + vp8_cost_zero(255);
1767 ref_frame_cost[GOLDEN_FRAME] = vp8_cost_one(cpi->prob_intra_coded)
1768 + vp8_cost_one(255)
1769 + vp8_cost_zero(128);
1770 ref_frame_cost[ALTREF_FRAME] = vp8_cost_one(cpi->prob_intra_coded)
1771 + vp8_cost_one(255)
1772 + vp8_cost_one(128);
1774 else
1776 ref_frame_cost[LAST_FRAME] = vp8_cost_one(cpi->prob_intra_coded)
1777 + vp8_cost_zero(cpi->prob_last_coded);
1778 ref_frame_cost[GOLDEN_FRAME] = vp8_cost_one(cpi->prob_intra_coded)
1779 + vp8_cost_one(cpi->prob_last_coded)
1780 + vp8_cost_zero(cpi->prob_gf_coded);
1781 ref_frame_cost[ALTREF_FRAME] = vp8_cost_one(cpi->prob_intra_coded)
1782 + vp8_cost_one(cpi->prob_last_coded)
1783 + vp8_cost_one(cpi->prob_gf_coded);
1786 vpx_memset(mode_mv, 0, sizeof(mode_mv));
1788 x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME;
1789 vp8_rd_pick_intra_mbuv_mode(cpi, x, &uv_intra_rate, &uv_intra_rate_tokenonly, &uv_intra_distortion);
1790 uv_intra_mode = x->e_mbd.mode_info_context->mbmi.uv_mode;
1792 for (mode_index = 0; mode_index < MAX_MODES; mode_index++)
1794 int this_rd = INT_MAX;
1795 int lf_or_gf = 0; // Lat Frame (01) or gf/arf (1)
1796 int disable_skip = 0;
1797 int other_cost = 0;
1799 force_no_skip = 0;
1801 // Experimental debug code.
1802 // Record of rd values recorded for this MB. -1 indicates not measured
1803 //all_rds[mode_index] = -1;
1804 //all_rates[mode_index] = -1;
1805 //all_dist[mode_index] = -1;
1806 //intermodecost[mode_index] = -1;
1808 // Test best rd so far against threshold for trying this mode.
1809 if (best_rd <= cpi->rd_threshes[mode_index])
1810 continue;
1812 // These variables hold are rolling total cost and distortion for this mode
1813 rate2 = 0;
1814 distortion2 = 0;
1816 this_mode = vp8_mode_order[mode_index];
1818 x->e_mbd.mode_info_context->mbmi.mode = this_mode;
1819 x->e_mbd.mode_info_context->mbmi.uv_mode = DC_PRED;
1820 x->e_mbd.mode_info_context->mbmi.ref_frame = vp8_ref_frame_order[mode_index];
1822 // Only consider ZEROMV/ALTREF_FRAME for alt ref frame,
1823 // unless ARNR filtering is enabled in which case we want
1824 // an unfiltered alternative
1825 if (cpi->is_src_frame_alt_ref && (cpi->oxcf.arnr_max_frames == 0))
1827 if (this_mode != ZEROMV || x->e_mbd.mode_info_context->mbmi.ref_frame != ALTREF_FRAME)
1828 continue;
1831 /* everything but intra */
1832 if (x->e_mbd.mode_info_context->mbmi.ref_frame)
1834 x->e_mbd.pre.y_buffer = y_buffer[x->e_mbd.mode_info_context->mbmi.ref_frame];
1835 x->e_mbd.pre.u_buffer = u_buffer[x->e_mbd.mode_info_context->mbmi.ref_frame];
1836 x->e_mbd.pre.v_buffer = v_buffer[x->e_mbd.mode_info_context->mbmi.ref_frame];
1837 mode_mv[NEARESTMV] = frame_nearest_mv[x->e_mbd.mode_info_context->mbmi.ref_frame];
1838 mode_mv[NEARMV] = frame_near_mv[x->e_mbd.mode_info_context->mbmi.ref_frame];
1839 best_ref_mv = frame_best_ref_mv[x->e_mbd.mode_info_context->mbmi.ref_frame];
1840 vpx_memcpy(mdcounts, frame_mdcounts[x->e_mbd.mode_info_context->mbmi.ref_frame], sizeof(mdcounts));
1841 lf_or_gf = frame_lf_or_gf[x->e_mbd.mode_info_context->mbmi.ref_frame];
1845 if(x->e_mbd.mode_info_context->mbmi.mode == NEWMV)
1847 if(!saddone)
1849 //calculate sad for current frame 3 nearby MBs.
1850 if( xd->mb_to_top_edge==0 && xd->mb_to_left_edge ==0)
1852 near_sad[0] = near_sad[1] = near_sad[2] = INT_MAX;
1853 }else if(xd->mb_to_top_edge==0)
1854 { //only has left MB for sad calculation.
1855 near_sad[0] = near_sad[2] = INT_MAX;
1856 near_sad[1] = cpi->fn_ptr[BLOCK_16X16].sdf(x->src.y_buffer, x->src.y_stride, xd->dst.y_buffer - 16,xd->dst.y_stride, 0x7fffffff);
1857 }else if(xd->mb_to_left_edge ==0)
1858 { //only has left MB for sad calculation.
1859 near_sad[1] = near_sad[2] = INT_MAX;
1860 near_sad[0] = cpi->fn_ptr[BLOCK_16X16].sdf(x->src.y_buffer, x->src.y_stride, xd->dst.y_buffer - xd->dst.y_stride *16,xd->dst.y_stride, 0x7fffffff);
1861 }else
1863 near_sad[0] = cpi->fn_ptr[BLOCK_16X16].sdf(x->src.y_buffer, x->src.y_stride, xd->dst.y_buffer - xd->dst.y_stride *16,xd->dst.y_stride, 0x7fffffff);
1864 near_sad[1] = cpi->fn_ptr[BLOCK_16X16].sdf(x->src.y_buffer, x->src.y_stride, xd->dst.y_buffer - 16,xd->dst.y_stride, 0x7fffffff);
1865 near_sad[2] = cpi->fn_ptr[BLOCK_16X16].sdf(x->src.y_buffer, x->src.y_stride, xd->dst.y_buffer - xd->dst.y_stride *16 -16,xd->dst.y_stride, 0x7fffffff);
1868 if(cpi->common.last_frame_type != KEY_FRAME)
1870 //calculate sad for last frame 5 nearby MBs.
1871 unsigned char *pre_y_buffer = cpi->common.yv12_fb[cpi->common.lst_fb_idx].y_buffer + recon_yoffset;
1872 int pre_y_stride = cpi->common.yv12_fb[cpi->common.lst_fb_idx].y_stride;
1874 if(xd->mb_to_top_edge==0) near_sad[4] = INT_MAX;
1875 if(xd->mb_to_left_edge ==0) near_sad[5] = INT_MAX;
1876 if(xd->mb_to_right_edge ==0) near_sad[6] = INT_MAX;
1877 if(xd->mb_to_bottom_edge==0) near_sad[7] = INT_MAX;
1879 if(near_sad[4] != INT_MAX)
1880 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);
1881 if(near_sad[5] != INT_MAX)
1882 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);
1883 near_sad[3] = cpi->fn_ptr[BLOCK_16X16].sdf(x->src.y_buffer, x->src.y_stride, pre_y_buffer, pre_y_stride, 0x7fffffff);
1884 if(near_sad[6] != INT_MAX)
1885 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);
1886 if(near_sad[7] != INT_MAX)
1887 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);
1890 if(cpi->common.last_frame_type != KEY_FRAME)
1892 quicksortsad(near_sad, near_sadidx, 0, 7);
1893 }else
1895 quicksortsad(near_sad, near_sadidx, 0, 2);
1898 saddone = 1;
1901 vp8_mv_pred(cpi, &x->e_mbd, x->e_mbd.mode_info_context, &mvp,
1902 x->e_mbd.mode_info_context->mbmi.ref_frame, cpi->common.ref_frame_sign_bias, &sr, &near_sadidx[0]);
1904 /* adjust mvp to make sure it is within MV range */
1905 if(mvp.row > best_ref_mv.row + MAX_FULL_PEL_VAL)
1906 mvp.row = best_ref_mv.row + MAX_FULL_PEL_VAL;
1907 else if(mvp.row < best_ref_mv.row - MAX_FULL_PEL_VAL)
1908 mvp.row = best_ref_mv.row - MAX_FULL_PEL_VAL;
1909 if(mvp.col > best_ref_mv.col + MAX_FULL_PEL_VAL)
1910 mvp.col = best_ref_mv.col + MAX_FULL_PEL_VAL;
1911 else if(mvp.col < best_ref_mv.col - MAX_FULL_PEL_VAL)
1912 mvp.col = best_ref_mv.col - MAX_FULL_PEL_VAL;
1915 // Check to see if the testing frequency for this mode is at its max
1916 // If so then prevent it from being tested and increase the threshold for its testing
1917 if (cpi->mode_test_hit_counts[mode_index] && (cpi->mode_check_freq[mode_index] > 1))
1919 if (cpi->mbs_tested_so_far <= cpi->mode_check_freq[mode_index] * cpi->mode_test_hit_counts[mode_index])
1921 // Increase the threshold for coding this mode to make it less likely to be chosen
1922 cpi->rd_thresh_mult[mode_index] += 4;
1924 if (cpi->rd_thresh_mult[mode_index] > MAX_THRESHMULT)
1925 cpi->rd_thresh_mult[mode_index] = MAX_THRESHMULT;
1927 cpi->rd_threshes[mode_index] = (cpi->rd_baseline_thresh[mode_index] >> 7) * cpi->rd_thresh_mult[mode_index];
1929 continue;
1933 // We have now reached the point where we are going to test the current mode so increment the counter for the number of times it has been tested
1934 cpi->mode_test_hit_counts[mode_index] ++;
1936 // Experimental code. Special case for gf and arf zeromv modes. Increase zbin size to supress noise
1937 if (cpi->zbin_mode_boost_enabled)
1939 if ( vp8_ref_frame_order[mode_index] == INTRA_FRAME )
1940 cpi->zbin_mode_boost = 0;
1941 else
1943 if (vp8_mode_order[mode_index] == ZEROMV)
1945 if (vp8_ref_frame_order[mode_index] != LAST_FRAME)
1946 cpi->zbin_mode_boost = GF_ZEROMV_ZBIN_BOOST;
1947 else
1948 cpi->zbin_mode_boost = LF_ZEROMV_ZBIN_BOOST;
1950 else if (vp8_ref_frame_order[mode_index] == SPLITMV)
1951 cpi->zbin_mode_boost = 0;
1952 else
1953 cpi->zbin_mode_boost = MV_ZBIN_BOOST;
1956 vp8_update_zbin_extra(cpi, x);
1959 switch (this_mode)
1961 case B_PRED:
1963 for (i = 0; i < 16; i++)
1965 vpx_memset(&x->e_mbd.block[i].bmi, 0, sizeof(B_MODE_INFO));
1967 // Note the rate value returned here includes the cost of coding the BPRED mode : x->mbmode_cost[x->e_mbd.frame_type][BPRED];
1968 vp8_rd_pick_intra4x4mby_modes(cpi, x, &rate, &rate_y, &distortion);
1969 rate2 += rate;
1971 distortion2 += distortion;
1972 rate2 += uv_intra_rate;
1973 rate_uv = uv_intra_rate_tokenonly;
1974 distortion2 += uv_intra_distortion;
1975 distortion_uv = uv_intra_distortion;
1976 break;
1978 case SPLITMV:
1980 int tmp_rd;
1981 int this_rd_thresh;
1983 this_rd_thresh = (x->e_mbd.mode_info_context->mbmi.ref_frame == LAST_FRAME) ? cpi->rd_threshes[THR_NEWMV] : cpi->rd_threshes[THR_NEWA];
1984 this_rd_thresh = (x->e_mbd.mode_info_context->mbmi.ref_frame == GOLDEN_FRAME) ? cpi->rd_threshes[THR_NEWG]: this_rd_thresh;
1986 tmp_rd = vp8_rd_pick_best_mbsegmentation(cpi, x, &best_ref_mv,
1987 best_yrd, mdcounts,
1988 &rate, &rate_y, &distortion, this_rd_thresh) ;
1990 rate2 += rate;
1991 distortion2 += distortion;
1993 // If even the 'Y' rd value of split is higher than best so far then dont bother looking at UV
1994 if (tmp_rd < best_yrd)
1996 // Now work out UV cost and add it in
1997 vp8_rd_inter_uv(cpi, x, &rate_uv, &distortion_uv, cpi->common.full_pixel);
1998 rate2 += rate_uv;
1999 distortion2 += distortion_uv;
2001 else
2003 this_rd = INT_MAX;
2004 disable_skip = 1;
2007 break;
2008 case DC_PRED:
2009 case V_PRED:
2010 case H_PRED:
2011 case TM_PRED:
2012 for (i = 0; i < 16; i++)
2014 vpx_memset(&x->e_mbd.block[i].bmi, 0, sizeof(B_MODE_INFO));
2016 x->e_mbd.mode_info_context->mbmi.ref_frame = INTRA_FRAME;
2017 vp8_build_intra_predictors_mby_ptr(&x->e_mbd);
2019 macro_block_yrd(x, &rate_y, &distortion, IF_RTCD(&cpi->rtcd.encodemb)) ;
2020 rate2 += rate_y;
2021 distortion2 += distortion;
2022 rate2 += x->mbmode_cost[x->e_mbd.frame_type][x->e_mbd.mode_info_context->mbmi.mode];
2023 rate2 += uv_intra_rate;
2024 rate_uv = uv_intra_rate_tokenonly;
2025 distortion2 += uv_intra_distortion;
2026 distortion_uv = uv_intra_distortion;
2028 break;
2030 case NEWMV:
2032 // Decrement full search counter
2033 if (cpi->check_freq[lf_or_gf] > 0)
2034 cpi->check_freq[lf_or_gf] --;
2037 int thissme;
2038 int bestsme = INT_MAX;
2039 int step_param = cpi->sf.first_step;
2040 int search_range;
2041 int further_steps;
2042 int n;
2044 int col_min = (best_ref_mv.col - MAX_FULL_PEL_VAL) >>3;
2045 int col_max = (best_ref_mv.col + MAX_FULL_PEL_VAL) >>3;
2046 int row_min = (best_ref_mv.row - MAX_FULL_PEL_VAL) >>3;
2047 int row_max = (best_ref_mv.row + MAX_FULL_PEL_VAL) >>3;
2049 int tmp_col_min = x->mv_col_min;
2050 int tmp_col_max = x->mv_col_max;
2051 int tmp_row_min = x->mv_row_min;
2052 int tmp_row_max = x->mv_row_max;
2054 // Get intersection of UMV window and valid MV window to reduce # of checks in diamond search.
2055 if (x->mv_col_min < col_min )
2056 x->mv_col_min = col_min;
2057 if (x->mv_col_max > col_max )
2058 x->mv_col_max = col_max;
2059 if (x->mv_row_min < row_min )
2060 x->mv_row_min = row_min;
2061 if (x->mv_row_max > row_max )
2062 x->mv_row_max = row_max;
2064 //adjust search range according to sr from mv prediction
2065 if(sr > step_param)
2066 step_param = sr;
2068 // Work out how long a search we should do
2069 search_range = MAXF(abs(best_ref_mv.col), abs(best_ref_mv.row)) >> 3;
2071 if (search_range >= x->vector_range)
2072 x->vector_range = search_range;
2073 else if (x->vector_range > cpi->sf.min_fs_radius)
2074 x->vector_range--;
2076 // Initial step/diamond search
2078 int sadpb = x->sadperbit16;
2080 if (cpi->sf.search_method == HEX)
2082 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);
2083 mode_mv[NEWMV].row = d->bmi.mv.as_mv.row;
2084 mode_mv[NEWMV].col = d->bmi.mv.as_mv.col;
2086 else
2088 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_16X16], x->mvsadcost, x->mvcost, &best_ref_mv); //sadpb < 9
2089 mode_mv[NEWMV].row = d->bmi.mv.as_mv.row;
2090 mode_mv[NEWMV].col = d->bmi.mv.as_mv.col;
2092 // Further step/diamond searches as necessary
2093 n = 0;
2094 further_steps = (cpi->sf.max_step_search_steps - 1) - step_param;
2096 n = num00;
2097 num00 = 0;
2099 while (n < further_steps)
2101 n++;
2103 if (num00)
2104 num00--;
2105 else
2107 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
2109 if (thissme < bestsme)
2111 bestsme = thissme;
2112 mode_mv[NEWMV].row = d->bmi.mv.as_mv.row;
2113 mode_mv[NEWMV].col = d->bmi.mv.as_mv.col;
2115 else
2117 d->bmi.mv.as_mv.row = mode_mv[NEWMV].row;
2118 d->bmi.mv.as_mv.col = mode_mv[NEWMV].col;
2126 // Should we do a full search
2127 if (!cpi->check_freq[lf_or_gf] || cpi->do_full[lf_or_gf])
2129 int thissme;
2130 int full_flag_thresh = 0;
2131 MV full_mvp;
2133 full_mvp.row = d->bmi.mv.as_mv.row <<3; // use diamond search result as full search staring point
2134 full_mvp.col = d->bmi.mv.as_mv.col <<3;
2136 // Update x->vector_range based on best vector found in step search
2137 search_range = MAXF(abs((mvp.row>>3) - d->bmi.mv.as_mv.row), abs((mvp.col>>3) - d->bmi.mv.as_mv.col));
2138 //search_range *= 1.4; //didn't improve PSNR
2140 if (search_range > x->vector_range)
2141 x->vector_range = search_range;
2142 else
2143 search_range = x->vector_range;
2145 // Apply limits
2146 search_range = (search_range > cpi->sf.max_fs_radius) ? cpi->sf.max_fs_radius : search_range;
2148 //add this to reduce full search range.
2149 if(sr<=3 && search_range > 8) search_range = 8;
2152 int sadpb = x->sadperbit16 >> 2;
2153 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);
2156 // Barrier threshold to initiating full search
2157 // full_flag_thresh = 10 + (thissme >> 7);
2158 if ((thissme + full_flag_thresh) < bestsme)
2160 cpi->do_full[lf_or_gf] ++;
2161 bestsme = thissme;
2163 else if (thissme < bestsme)
2164 bestsme = thissme;
2165 else
2167 cpi->do_full[lf_or_gf] = cpi->do_full[lf_or_gf] >> 1;
2168 cpi->check_freq[lf_or_gf] = cpi->sf.full_freq[lf_or_gf];
2170 // The full search result is actually worse so re-instate the previous best vector
2171 d->bmi.mv.as_mv.row = mode_mv[NEWMV].row;
2172 d->bmi.mv.as_mv.col = mode_mv[NEWMV].col;
2176 x->mv_col_min = tmp_col_min;
2177 x->mv_col_max = tmp_col_max;
2178 x->mv_row_min = tmp_row_min;
2179 x->mv_row_max = tmp_row_max;
2181 if (bestsme < INT_MAX)
2182 // 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 mvc=11
2183 cpi->find_fractional_mv_step(x, b, d, &d->bmi.mv.as_mv, &best_ref_mv, x->errorperbit / 4, &cpi->fn_ptr[BLOCK_16X16], x->mvcost);
2185 mode_mv[NEWMV].row = d->bmi.mv.as_mv.row;
2186 mode_mv[NEWMV].col = d->bmi.mv.as_mv.col;
2188 // Add the new motion vector cost to our rolling cost variable
2189 rate2 += vp8_mv_bit_cost(&mode_mv[NEWMV], &best_ref_mv, x->mvcost, 96);
2193 case NEARESTMV:
2194 case NEARMV:
2196 // Clip "next_nearest" so that it does not extend to far out of image
2197 if (mode_mv[this_mode].col < (xd->mb_to_left_edge - LEFT_TOP_MARGIN))
2198 mode_mv[this_mode].col = xd->mb_to_left_edge - LEFT_TOP_MARGIN;
2199 else if (mode_mv[this_mode].col > xd->mb_to_right_edge + RIGHT_BOTTOM_MARGIN)
2200 mode_mv[this_mode].col = xd->mb_to_right_edge + RIGHT_BOTTOM_MARGIN;
2202 if (mode_mv[this_mode].row < (xd->mb_to_top_edge - LEFT_TOP_MARGIN))
2203 mode_mv[this_mode].row = xd->mb_to_top_edge - LEFT_TOP_MARGIN;
2204 else if (mode_mv[this_mode].row > xd->mb_to_bottom_edge + RIGHT_BOTTOM_MARGIN)
2205 mode_mv[this_mode].row = xd->mb_to_bottom_edge + RIGHT_BOTTOM_MARGIN;
2207 // Do not bother proceeding if the vector (from newmv,nearest or near) is 0,0 as this should then be coded using the zeromv mode.
2208 if (((this_mode == NEARMV) || (this_mode == NEARESTMV)) &&
2209 ((mode_mv[this_mode].row == 0) && (mode_mv[this_mode].col == 0)))
2210 continue;
2212 case ZEROMV:
2214 mv_selected:
2216 // Trap vectors that reach beyond the UMV borders
2217 // Note that ALL New MV, Nearest MV Near MV and Zero MV code drops through to this point
2218 // because of the lack of break statements in the previous two cases.
2219 if (((mode_mv[this_mode].row >> 3) < x->mv_row_min) || ((mode_mv[this_mode].row >> 3) > x->mv_row_max) ||
2220 ((mode_mv[this_mode].col >> 3) < x->mv_col_min) || ((mode_mv[this_mode].col >> 3) > x->mv_col_max))
2221 continue;
2223 vp8_set_mbmode_and_mvs(x, this_mode, &mode_mv[this_mode]);
2224 vp8_build_inter_predictors_mby(&x->e_mbd);
2226 if (cpi->active_map_enabled && x->active_ptr[0] == 0) {
2227 x->skip = 1;
2229 else if (x->encode_breakout)
2231 int sum, sse;
2233 VARIANCE_INVOKE(&cpi->rtcd.variance, get16x16var)
2234 (x->src.y_buffer, x->src.y_stride,
2235 x->e_mbd.predictor, 16, (unsigned int *)(&sse), &sum);
2237 if (sse < x->encode_breakout)
2239 // Check u and v to make sure skip is ok
2240 int sse2 = 0;
2242 // add dc check
2243 if (abs(sum) < (cpi->common.Y2dequant[0][0] << 2))
2245 sse2 = VP8_UVSSE(x, IF_RTCD(&cpi->rtcd.variance));
2247 if (sse2 * 2 < x->encode_breakout)
2249 x->skip = 1;
2250 distortion2 = sse + sse2;
2251 rate2 = 500;
2253 /* for best_yrd calculation */
2254 rate_uv = 0;
2255 distortion_uv = sse2;
2257 disable_skip = 1;
2258 this_rd = RDCOST(x->rdmult, x->rddiv, rate2,
2259 distortion2);
2261 break;
2268 //intermodecost[mode_index] = vp8_cost_mv_ref(this_mode, mdcounts); // Experimental debug code
2270 // Add in the Mv/mode cost
2271 rate2 += vp8_cost_mv_ref(this_mode, mdcounts);
2273 // Y cost and distortion
2274 macro_block_yrd(x, &rate_y, &distortion, IF_RTCD(&cpi->rtcd.encodemb));
2275 rate2 += rate_y;
2276 distortion2 += distortion;
2278 // UV cost and distortion
2279 vp8_rd_inter_uv(cpi, x, &rate_uv, &distortion_uv, cpi->common.full_pixel);
2280 rate2 += rate_uv;
2281 distortion2 += distortion_uv;
2282 break;
2284 default:
2285 break;
2288 // Where skip is allowable add in the default per mb cost for the no skip case.
2289 // where we then decide to skip we have to delete this and replace it with the
2290 // cost of signallying a skip
2291 if (cpi->common.mb_no_coeff_skip)
2293 other_cost += vp8_cost_bit(cpi->prob_skip_false, 0);
2294 rate2 += other_cost;
2297 // Estimate the reference frame signaling cost and add it to the rolling cost variable.
2298 rate2 += ref_frame_cost[x->e_mbd.mode_info_context->mbmi.ref_frame];
2300 if (!disable_skip)
2302 // Test for the condition where skip block will be activated because there are no non zero coefficients and make any necessary adjustment for rate
2303 if (cpi->common.mb_no_coeff_skip)
2305 int tteob;
2307 tteob = 0;
2309 for (i = 0; i <= 24; i++)
2311 tteob += x->e_mbd.block[i].eob;
2314 if (tteob == 0)
2316 rate2 -= (rate_y + rate_uv);
2317 //for best_yrd calculation
2318 rate_uv = 0;
2320 // Back out no skip flag costing and add in skip flag costing
2321 if (cpi->prob_skip_false)
2323 int prob_skip_cost;
2325 prob_skip_cost = vp8_cost_bit(cpi->prob_skip_false, 1);
2326 prob_skip_cost -= vp8_cost_bit(cpi->prob_skip_false, 0);
2327 rate2 += prob_skip_cost;
2328 other_cost += prob_skip_cost;
2332 // Calculate the final RD estimate for this mode
2333 this_rd = RDCOST(x->rdmult, x->rddiv, rate2, distortion2);
2336 // Experimental debug code.
2337 //all_rds[mode_index] = this_rd;
2338 //all_rates[mode_index] = rate2;
2339 //all_dist[mode_index] = distortion2;
2341 if ((x->e_mbd.mode_info_context->mbmi.ref_frame == INTRA_FRAME) && (this_rd < *returnintra))
2343 *returnintra = this_rd ;
2346 // Did this mode help.. i.i is it the new best mode
2347 if (this_rd < best_rd || x->skip)
2349 // Note index of best mode so far
2350 best_mode_index = mode_index;
2351 x->e_mbd.mode_info_context->mbmi.force_no_skip = force_no_skip;
2353 if (this_mode <= B_PRED)
2355 x->e_mbd.mode_info_context->mbmi.uv_mode = uv_intra_mode;
2358 other_cost += ref_frame_cost[x->e_mbd.mode_info_context->mbmi.ref_frame];
2360 /* Calculate the final y RD estimate for this mode */
2361 best_yrd = RDCOST(x->rdmult, x->rddiv, (rate2-rate_uv-other_cost),
2362 (distortion2-distortion_uv));
2364 *returnrate = rate2;
2365 *returndistortion = distortion2;
2366 best_rd = this_rd;
2367 vpx_memcpy(&best_mbmode, &x->e_mbd.mode_info_context->mbmi, sizeof(MB_MODE_INFO));
2368 vpx_memcpy(&best_partition, x->partition_info, sizeof(PARTITION_INFO));
2370 for (i = 0; i < 16; i++)
2372 vpx_memcpy(&best_bmodes[i], &x->e_mbd.block[i].bmi, sizeof(B_MODE_INFO));
2375 // Testing this mode gave rise to an improvement in best error score. Lower threshold a bit for next time
2376 cpi->rd_thresh_mult[mode_index] = (cpi->rd_thresh_mult[mode_index] >= (MIN_THRESHMULT + 2)) ? cpi->rd_thresh_mult[mode_index] - 2 : MIN_THRESHMULT;
2377 cpi->rd_threshes[mode_index] = (cpi->rd_baseline_thresh[mode_index] >> 7) * cpi->rd_thresh_mult[mode_index];
2380 // If the mode did not help improve the best error case then raise the threshold for testing that mode next time around.
2381 else
2383 cpi->rd_thresh_mult[mode_index] += 4;
2385 if (cpi->rd_thresh_mult[mode_index] > MAX_THRESHMULT)
2386 cpi->rd_thresh_mult[mode_index] = MAX_THRESHMULT;
2388 cpi->rd_threshes[mode_index] = (cpi->rd_baseline_thresh[mode_index] >> 7) * cpi->rd_thresh_mult[mode_index];
2391 if (x->skip)
2392 break;
2395 // Reduce the activation RD thresholds for the best choice mode
2396 if ((cpi->rd_baseline_thresh[best_mode_index] > 0) && (cpi->rd_baseline_thresh[best_mode_index] < (INT_MAX >> 2)))
2398 int best_adjustment = (cpi->rd_thresh_mult[best_mode_index] >> 2);
2400 cpi->rd_thresh_mult[best_mode_index] = (cpi->rd_thresh_mult[best_mode_index] >= (MIN_THRESHMULT + best_adjustment)) ? cpi->rd_thresh_mult[best_mode_index] - best_adjustment : MIN_THRESHMULT;
2401 cpi->rd_threshes[best_mode_index] = (cpi->rd_baseline_thresh[best_mode_index] >> 7) * cpi->rd_thresh_mult[best_mode_index];
2403 // If we chose a split mode then reset the new MV thresholds as well
2404 /*if ( vp8_mode_order[best_mode_index] == SPLITMV )
2406 best_adjustment = 4; //(cpi->rd_thresh_mult[THR_NEWMV] >> 4);
2407 cpi->rd_thresh_mult[THR_NEWMV] = (cpi->rd_thresh_mult[THR_NEWMV] >= (MIN_THRESHMULT+best_adjustment)) ? cpi->rd_thresh_mult[THR_NEWMV]-best_adjustment: MIN_THRESHMULT;
2408 cpi->rd_threshes[THR_NEWMV] = (cpi->rd_baseline_thresh[THR_NEWMV] >> 7) * cpi->rd_thresh_mult[THR_NEWMV];
2410 best_adjustment = 4; //(cpi->rd_thresh_mult[THR_NEWG] >> 4);
2411 cpi->rd_thresh_mult[THR_NEWG] = (cpi->rd_thresh_mult[THR_NEWG] >= (MIN_THRESHMULT+best_adjustment)) ? cpi->rd_thresh_mult[THR_NEWG]-best_adjustment: MIN_THRESHMULT;
2412 cpi->rd_threshes[THR_NEWG] = (cpi->rd_baseline_thresh[THR_NEWG] >> 7) * cpi->rd_thresh_mult[THR_NEWG];
2414 best_adjustment = 4; //(cpi->rd_thresh_mult[THR_NEWA] >> 4);
2415 cpi->rd_thresh_mult[THR_NEWA] = (cpi->rd_thresh_mult[THR_NEWA] >= (MIN_THRESHMULT+best_adjustment)) ? cpi->rd_thresh_mult[THR_NEWA]-best_adjustment: MIN_THRESHMULT;
2416 cpi->rd_threshes[THR_NEWA] = (cpi->rd_baseline_thresh[THR_NEWA] >> 7) * cpi->rd_thresh_mult[THR_NEWA];
2421 // If we have chosen new mv or split then decay the full search check count more quickly.
2422 if ((vp8_mode_order[best_mode_index] == NEWMV) || (vp8_mode_order[best_mode_index] == SPLITMV))
2424 int lf_or_gf = (vp8_ref_frame_order[best_mode_index] == LAST_FRAME) ? 0 : 1;
2426 if (cpi->check_freq[lf_or_gf] && !cpi->do_full[lf_or_gf])
2428 cpi->check_freq[lf_or_gf] --;
2432 // Keep a record of best mode index that we chose
2433 cpi->last_best_mode_index = best_mode_index;
2435 // Note how often each mode chosen as best
2436 cpi->mode_chosen_counts[best_mode_index] ++;
2439 if (cpi->is_src_frame_alt_ref && (best_mbmode.mode != ZEROMV || best_mbmode.ref_frame != ALTREF_FRAME))
2441 best_mbmode.mode = ZEROMV;
2442 best_mbmode.ref_frame = ALTREF_FRAME;
2443 best_mbmode.mv.as_int = 0;
2444 best_mbmode.uv_mode = 0;
2445 best_mbmode.mb_skip_coeff = (cpi->common.mb_no_coeff_skip) ? 1 : 0;
2446 best_mbmode.partitioning = 0;
2447 best_mbmode.dc_diff = 0;
2449 vpx_memcpy(&x->e_mbd.mode_info_context->mbmi, &best_mbmode, sizeof(MB_MODE_INFO));
2450 vpx_memcpy(x->partition_info, &best_partition, sizeof(PARTITION_INFO));
2452 for (i = 0; i < 16; i++)
2454 vpx_memset(&x->e_mbd.block[i].bmi, 0, sizeof(B_MODE_INFO));
2457 x->e_mbd.mode_info_context->mbmi.mv.as_int = 0;
2459 return best_rd;
2463 // macroblock modes
2464 vpx_memcpy(&x->e_mbd.mode_info_context->mbmi, &best_mbmode, sizeof(MB_MODE_INFO));
2465 vpx_memcpy(x->partition_info, &best_partition, sizeof(PARTITION_INFO));
2467 for (i = 0; i < 16; i++)
2469 vpx_memcpy(&x->e_mbd.block[i].bmi, &best_bmodes[i], sizeof(B_MODE_INFO));
2472 x->e_mbd.mode_info_context->mbmi.mv.as_mv = x->e_mbd.block[15].bmi.mv.as_mv;
2474 return best_rd;
2476 #endif