const int bw = 4 * num_4x4_w;
const int bh = 4 * num_4x4_h;
-#if CONFIG_VP9_HIGHBITDEPTH
- // TODO(jingning): Implement the high bit-depth Hadamard transforms and
- // remove this check condition.
- // TODO(marpan): Use this path (model_rd) for 8bit under certain conditions
- // for now, as the vp9_quantize_fp below for highbitdepth build is slow.
- if (xd->bd != 8 ||
- (cpi->oxcf.speed > 5 && cpi->common.frame_type != KEY_FRAME &&
- bsize < BLOCK_32X32)) {
- unsigned int var_y, sse_y;
- (void)tx_size;
- if (!rd_computed)
- model_rd_for_sb_y(cpi, bsize, x, xd, &this_rdc->rate, &this_rdc->dist,
- &var_y, &sse_y);
- *sse = INT_MAX;
- *skippable = 0;
- return;
- }
-#endif
-
if (cpi->sf.use_simple_block_yrd && cpi->common.frame_type != KEY_FRAME &&
(bsize < BLOCK_32X32 ||
(cpi->use_svc &&
int mi_row, int mi_col, PRED_BUFFER *tmp,
BLOCK_SIZE bsize, int reuse_inter_pred,
PRED_BUFFER **this_mode_pred, unsigned int *var_y,
- unsigned int *sse_y) {
+ unsigned int *sse_y, int force_smooth_filter) {
MACROBLOCKD *const xd = &x->e_mbd;
MODE_INFO *const mi = xd->mi[0];
struct macroblockd_plane *const pd = &xd->plane[0];
INTERP_FILTER best_filter = SWITCHABLE, filter;
PRED_BUFFER *current_pred = *this_mode_pred;
uint8_t skip_txfm = SKIP_TXFM_NONE;
-
- for (filter = EIGHTTAP; filter <= EIGHTTAP_SMOOTH; ++filter) {
+ INTERP_FILTER filter_start = force_smooth_filter ? EIGHTTAP_SMOOTH : EIGHTTAP;
+ for (filter = filter_start; filter <= EIGHTTAP_SMOOTH; ++filter) {
int64_t cost;
mi->interp_filter = filter;
vp9_build_inter_predictors_sby(xd, mi_row, mi_col, bsize);
int no_scaling = 0;
unsigned int thresh_svc_skip_golden = 500;
unsigned int thresh_skip_golden = 500;
+ int force_smooth_filter =
+ (cpi->oxcf.speed >= 8 && cm->width * cm->height <= 320 * 240 &&
+ cm->base_qindex >= 200)
+ ? 1
+ : 0;
int scene_change_detected =
cpi->rc.high_source_sad ||
(cpi->use_svc && cpi->svc.high_source_sad_superframe);
if (!(cpi->ref_frame_flags & flag_list[ref_frame])) continue;
- // For screen content on flat blocks: skip non-zero motion check for
- // stationary blocks, only skip zero motion check for non-stationary blocks.
- if (cpi->oxcf.content == VP9E_CONTENT_SCREEN &&
- sf->short_circuit_flat_blocks && x->source_variance == 0 &&
- ((frame_mv[this_mode][ref_frame].as_int != 0 &&
- x->zero_temp_sad_source) ||
- (frame_mv[this_mode][ref_frame].as_int == 0 &&
- !x->zero_temp_sad_source))) {
- continue;
+ // For screen content. If zero_temp_sad source is computed: skip
+ // non-zero motion check for stationary blocks. If the superblock is
+ // non-stationary then for flat blocks skip the zero last check (keep golden
+ // as it may be inter-layer reference). Otherwise (if zero_temp_sad_source
+ // is not computed) skip non-zero motion check for flat blocks.
+ // TODO(marpan): Compute zero_temp_sad_source per coding block.
+ if (cpi->oxcf.content == VP9E_CONTENT_SCREEN) {
+ if (cpi->compute_source_sad_onepass && cpi->sf.use_source_sad) {
+ if ((frame_mv[this_mode][ref_frame].as_int != 0 &&
+ x->zero_temp_sad_source) ||
+ (frame_mv[this_mode][ref_frame].as_int == 0 &&
+ x->source_variance == 0 && ref_frame == LAST_FRAME &&
+ !x->zero_temp_sad_source))
+ continue;
+ } else if (frame_mv[this_mode][ref_frame].as_int != 0 &&
+ x->source_variance == 0) {
+ continue;
+ }
}
if (!(cpi->sf.inter_mode_mask[bsize] & (1 << this_mode))) continue;
(((mi->mv[0].as_mv.row | mi->mv[0].as_mv.col) & 0x07) != 0)) {
rd_computed = 1;
search_filter_ref(cpi, x, &this_rdc, mi_row, mi_col, tmp, bsize,
- reuse_inter_pred, &this_mode_pred, &var_y, &sse_y);
+ reuse_inter_pred, &this_mode_pred, &var_y, &sse_y,
+ force_smooth_filter);
} else {
// For low motion content use x->sb_is_skin in addition to VeryHighSad
// for setting large_block.