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.
19 #include "treewriter.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"
35 #include "vpx_mem/vpx_mem.h"
37 #include "systemdependent.h"
39 #if CONFIG_RUNTIME_CPU_DETECT
40 #define IF_RTCD(x) (x)
42 #define IF_RTCD(x) NULL
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] =
77 const MB_PREDICTION_MODE vp8_mode_order
[MAX_MODES
] =
109 const MV_REFERENCE_FRAME vp8_ref_frame_order
[MAX_MODES
] =
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]
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
)
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)
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;
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);
259 if (cpi
->RDMULT
> 1000)
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;
272 cpi
->rd_threshes
[i
] = INT_MAX
;
275 cpi
->rd_baseline_thresh
[i
] = cpi
->rd_threshes
[i
];
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
;
290 cpi
->rd_threshes
[i
] = INT_MAX
;
293 cpi
->rd_baseline_thresh
[i
] = cpi
->rd_threshes
[i
];
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;
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
);
329 // this is done during parameter valid check
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)
344 if (milliseconds_for_compress
* 100 < cpi
->avg_encode_time
* 95)
347 cpi
->avg_pick_mode_time
= 0;
348 cpi
->avg_encode_time
= 0;
356 if (milliseconds_for_compress
* 100 > cpi
->avg_encode_time
* vp8_auto_speed_thresh
[cpi
->Speed
])
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;
378 cpi
->avg_pick_mode_time
= 0;
379 cpi
->avg_encode_time
= 0;
383 int vp8_block_error_c(short *coeff
, short *dqcoeff
)
388 for (i
= 0; i
< 16; i
++)
390 int this_diff
= coeff
[i
] - dqcoeff
[i
];
391 error
+= this_diff
* this_diff
;
397 int vp8_mbblock_error_c(MACROBLOCK
*mb
, int dc
)
402 int berror
, error
= 0;
404 for (i
= 0; i
< 16; i
++)
407 bd
= &mb
->e_mbd
.block
[i
];
411 for (j
= dc
; j
< 16; j
++)
413 int this_diff
= be
->coeff
[j
] - bd
->dqcoeff
[j
];
414 berror
+= this_diff
* this_diff
;
423 int vp8_mbuverror_c(MACROBLOCK
*mb
)
433 for (i
= 16; i
< 24; i
++)
436 bd
= &mb
->e_mbd
.block
[i
];
438 error
+= vp8_block_error_c(be
->coeff
, bd
->dqcoeff
);
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;
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
);
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
);
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 */
488 int pt
; /* surrounding block/prev coef predictor */
490 short *qcoeff_ptr
= b
->qcoeff
;
492 VP8_COMBINEENTROPYCONTEXTS(pt
, *a
, *l
);
494 # define QC( I) ( qcoeff_ptr [vp8_default_zig_zag1d[I]] )
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
];
508 cost
+= mb
->token_costs
[type
] [vp8_coef_bands
[c
]] [pt
] [DCT_EOB_TOKEN
];
510 pt
= (c
!= !type
); // is eob first coefficient;
516 static int vp8_rdcost_mby(MACROBLOCK
*mb
)
520 MACROBLOCKD
*x
= &mb
->e_mbd
;
521 ENTROPY_CONTEXT_PLANES t_above
, t_left
;
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]);
541 static void macro_block_yrd( MACROBLOCK
*mb
,
544 const vp8_encodemb_rtcd_vtable_t
*rtcd
)
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
;
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];
566 mb
->short_walsh4x4(mb_y2
->src_diff
, mb_y2
->coeff
, 8);
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
);
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);
584 *Rate
= vp8_rdcost_mby(mb
);
587 static void rd_pick_intra4x4block(
592 B_PREDICTION_MODE
*best_mode
,
593 B_PREDICTION_MODE above
,
594 B_PREDICTION_MODE left
,
602 B_PREDICTION_MODE mode
;
603 int best_rd
= INT_MAX
; // 1<<30
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
];
618 mode_costs
= x
->inter_bmode_costs
;
621 for (mode
= B_DC_PRED
; mode
<= B_HU_PRED
; mode
++)
626 rate
= mode_costs
[mode
];
627 vp8_encode_intra4x4block_rd(IF_RTCD(&cpi
->rtcd
), x
, be
, b
, mode
);
632 ratey
= cost_coeffs(x
, b
, 3, &tempa
, &templ
);
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
)
642 *bestdistortion
= distortion
;
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
;
660 int cost
= mb
->mbmode_cost
[xd
->frame_type
] [B_PRED
];
663 ENTROPY_CONTEXT_PLANES t_above
, t_left
;
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
);
692 mic
->bmi
[i
].mode
= xd
->block
[i
].bmi
.mode
= best_mode
;
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
,
708 MB_PREDICTION_MODE mode
;
709 MB_PREDICTION_MODE
UNINITIALIZED_IS_SAFE(mode_selected
);
711 unsigned int distortion
;
712 int best_rd
= INT_MAX
;
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
;
740 *Distortion
= (int)distortion
;
744 x
->e_mbd
.mode_info_context
->mbmi
.mode
= mode_selected
;
748 static int rd_cost_mbuv(MACROBLOCK
*mb
)
752 MACROBLOCKD
*x
= &mb
->e_mbd
;
753 ENTROPY_CONTEXT_PLANES t_above
, t_left
;
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
]);
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
;
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
);
804 for (mode
= DC_PRED
; mode
<= TM_PRED
; mode
++)
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
)
825 *rate_tokenonly
= rate_to
;
826 mode_selected
= mode
;
833 x
->e_mbd
.mode_info_context
->mbmi
.uv_mode
= mode_selected
;
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
)
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(
867 int const *labelings
, int which_label
,
868 B_PREDICTION_MODE this_mode
,
869 MV
*this_mv
, MV
*best_ref_mv
,
873 MACROBLOCKD
*const xd
= & x
->e_mbd
;
874 MODE_INFO
*const mic
= xd
->mode_info_context
;
875 const int mis
= xd
->mode_info_stride
;
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. */
888 BLOCKD
*const d
= xd
->block
+ i
;
889 const int row
= i
>> 2, col
= i
& 3;
893 if (labelings
[i
] != which_label
)
896 if (col
&& labelings
[i
] == labelings
[i
-1])
898 else if (row
&& labelings
[i
] == labelings
[i
-4])
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
)
907 thismvcost
= vp8_mv_bit_cost(this_mv
, best_ref_mv
, mvcost
, 102);
910 *this_mv
= col
? d
[-1].bmi
.mv
.as_mv
: vp8_left_bmi(mic
, i
)->mv
.as_mv
;
913 *this_mv
= row
? d
[-4].bmi
.mv
.as_mv
: vp8_above_bmi(mic
, i
, mis
)->mv
.as_mv
;
916 this_mv
->row
= this_mv
->col
= 0;
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
)
930 cost
= x
->inter_bmode_costs
[ m
];
934 d
->bmi
.mv
.as_mv
= *this_mv
;
943 static int rdcost_mbsegment_y(MACROBLOCK
*mb
, const int *labels
,
944 int which_label
, ENTROPY_CONTEXT
*ta
,
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
]);
960 static unsigned int vp8_encode_inter_mb_segment(MACROBLOCK
*x
, int const *labels
, int which_label
, const vp8_encodemb_rtcd_vtable_t
*rtcd
)
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
979 x
->quantize_b(be
, bd
);
981 distortion
+= ENCODEMB_INVOKE(rtcd
, berr
)(be
->coeff
, bd
->dqcoeff
);
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};
1009 B_PREDICTION_MODE modes
[16];
1011 unsigned char eobs
[16];
1016 MV sv_mvp
[4]; // save 4 mvp from 8x8
1017 int sv_istep
[2]; // save 2 initial step_param for 16x8/8x16
1022 void vp8_rd_check_segment(VP8_COMP
*cpi
, MACROBLOCK
*x
, BEST_SEG_INFO
*bsi
,
1023 unsigned int segmentation
)
1029 B_PREDICTION_MODE this_mode
;
1033 int this_segment_rd
= 0;
1034 int label_mv_thresh
;
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
;
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);
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
++)
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
)
1107 int bestsme
= INT_MAX
;
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
)
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
);
1135 further_steps
= (MAX_MVSEARCH_STEPS
- 1) - step_param
;
1138 int sadpb
= x
->sadperbit4
;
1141 n
= vp8_mbsplit_offset2
[segmentation
][i
];
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
);
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
);
1159 while (n
< further_steps
)
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
)
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
)
1192 mode_mv
[NEW4X4
] = e
->bmi
.mv
.as_mv
;
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
);
1208 vp8_skip_fractional_mv_step(x
, c
, e
, &mode_mv
[NEW4X4
],
1209 bsi
->ref_mv
, x
->errorperbit
, v_fn_ptr
, x
->mvcost
);
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
))
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
);
1228 this_rd
= RDCOST(x
->rdmult
, x
->rddiv
, rate
, distortion
);
1230 if (this_rd
< best_label_rd
)
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
);
1252 segmentyrate
+= bestlabelyrate
;
1253 this_segment_rd
+= best_label_rd
;
1255 if (this_segment_rd
>= bsi
->segment_rd
)
1258 } /* for each label */
1260 if (this_segment_rd
< bsi
->segment_rd
)
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
;
1281 void vp8_cal_step_param(int sr
, int *sp
)
1285 if (sr
> MAX_FIRST_STEP
) sr
= MAX_FIRST_STEP
;
1286 else if (sr
< 1) sr
= 1;
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
,
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
);
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. */
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
);
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
++)
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
)
1438 static void quicksortmv(int arr
[],int left
, int right
)
1440 int lidx
,ridx
,pivot
;
1447 pivot
= (left
+ right
)/2;
1449 while(lidx
<=pivot
&& ridx
>=pivot
)
1451 while(arr
[lidx
] < arr
[pivot
] && lidx
<= pivot
)
1453 while(arr
[ridx
] > arr
[pivot
] && ridx
>= pivot
)
1455 swap(&arr
[lidx
], &arr
[ridx
]);
1463 else if(ridx
+1 == pivot
)
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
;
1483 pivot
= (left
+ right
)/2;
1485 while(lidx
<=pivot
&& ridx
>=pivot
)
1487 while(arr
[lidx
] < arr
[pivot
] && lidx
<= pivot
)
1489 while(arr
[ridx
] > arr
[pivot
] && ridx
>= pivot
)
1491 swap(&arr
[lidx
], &arr
[ridx
]);
1492 swap(&idx
[lidx
], &idx
[ridx
]);
1500 else if(ridx
+1 == pivot
)
1506 quicksortsad(arr
, idx
, left
, pivot
- 1);
1507 quicksortsad(arr
, idx
, pivot
+ 1, right
);
1511 //The improved MV prediction
1516 const MODE_INFO
*here
,
1519 int *ref_frame_sign_bias
,
1524 const MODE_INFO
*above
= here
- xd
->mode_info_stride
;
1525 const MODE_INFO
*left
= here
- 1;
1526 const MODE_INFO
*aboveleft
= above
- 1;
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
;
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
;
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
;
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
];
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];
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];
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];
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];
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
;
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];
1650 //sr is set to 0 to allow calling function to decide the search range.
1655 /* Set up return values */
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
;
1669 MV mode_mv
[MB_MODE_COUNT
];
1670 MB_PREDICTION_MODE this_mode
;
1672 int best_mode_index
= 0;
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
);
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;
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};
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
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
)
1769 + vp8_cost_zero(128);
1770 ref_frame_cost
[ALTREF_FRAME
] = vp8_cost_one(cpi
->prob_intra_coded
)
1772 + vp8_cost_one(128);
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;
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
])
1812 // These variables hold are rolling total cost and distortion for this mode
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
)
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
)
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);
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);
1895 quicksortsad(near_sad
, near_sadidx
, 0, 2);
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
];
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;
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
;
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;
1953 cpi
->zbin_mode_boost
= MV_ZBIN_BOOST
;
1956 vp8_update_zbin_extra(cpi
, x
);
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
);
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
;
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
,
1988 &rate
, &rate_y
, &distortion
, this_rd_thresh
) ;
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
);
1999 distortion2
+= distortion_uv
;
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
)) ;
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
;
2032 // Decrement full search counter
2033 if (cpi
->check_freq
[lf_or_gf
] > 0)
2034 cpi
->check_freq
[lf_or_gf
] --;
2038 int bestsme
= INT_MAX
;
2039 int step_param
= cpi
->sf
.first_step
;
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
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
)
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
;
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
2094 further_steps
= (cpi
->sf
.max_step_search_steps
- 1) - step_param
;
2099 while (n
< further_steps
)
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
)
2112 mode_mv
[NEWMV
].row
= d
->bmi
.mv
.as_mv
.row
;
2113 mode_mv
[NEWMV
].col
= d
->bmi
.mv
.as_mv
.col
;
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
])
2130 int full_flag_thresh
= 0;
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
;
2143 search_range
= x
->vector_range
;
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
] ++;
2163 else if (thissme
< bestsme
)
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);
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)))
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
))
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) {
2229 else if (x
->encode_breakout
)
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
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
)
2250 distortion2
= sse
+ sse2
;
2253 /* for best_yrd calculation */
2255 distortion_uv
= sse2
;
2258 this_rd
= RDCOST(x
->rdmult
, x
->rddiv
, rate2
,
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
));
2276 distortion2
+= distortion
;
2278 // UV cost and distortion
2279 vp8_rd_inter_uv(cpi
, x
, &rate_uv
, &distortion_uv
, cpi
->common
.full_pixel
);
2281 distortion2
+= distortion_uv
;
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
];
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
)
2309 for (i
= 0; i
<= 24; i
++)
2311 tteob
+= x
->e_mbd
.block
[i
].eob
;
2316 rate2
-= (rate_y
+ rate_uv
);
2317 //for best_yrd calculation
2320 // Back out no skip flag costing and add in skip flag costing
2321 if (cpi
->prob_skip_false
)
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
;
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.
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
];
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;
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
;