static int find_best_16x16_intra ( VP9_COMP *cpi, YV12_BUFFER_CONFIG *buf, int mb_y_offset, MB_PREDICTION_MODE *pbest_mode ) { MACROBLOCK *const x = &cpi->mb; MACROBLOCKD *const xd = &x->e_mbd; MB_PREDICTION_MODE best_mode = -1, mode; unsigned int best_err = INT_MAX; // calculate SATD for each intra prediction mode; // we're intentionally not doing 4x4, we just want a rough estimate for (mode = DC_PRED; mode <= TM_PRED; mode++) { unsigned int err; xd->mode_info_context->mbmi.mode = mode; vp9_build_intra_predictors_mby(xd); err = vp9_sad16x16(xd->predictor, 16, buf->y_buffer + mb_y_offset, buf->y_stride, best_err); // find best if (err < best_err) { best_err = err; best_mode = mode; } } if (pbest_mode) *pbest_mode = best_mode; return best_err; }
void vp9_encode_intra16x16mby(MACROBLOCK *x) { MACROBLOCKD *xd = &x->e_mbd; BLOCK *b = &x->block[0]; TX_SIZE tx_size = xd->mode_info_context->mbmi.txfm_size; #if CONFIG_COMP_INTRA_PRED if (xd->mode_info_context->mbmi.second_mode == (MB_PREDICTION_MODE)(DC_PRED - 1)) #endif vp9_build_intra_predictors_mby(xd); #if CONFIG_COMP_INTRA_PRED else vp9_build_comp_intra_predictors_mby(xd); #endif vp9_subtract_mby(x->src_diff, *(b->base_src), xd->predictor, b->src_stride); if (tx_size == TX_16X16) { vp9_transform_mby_16x16(x); vp9_quantize_mby_16x16(x); if (x->optimize) vp9_optimize_mby_16x16(x); vp9_inverse_transform_mby_16x16(xd); } else if (tx_size == TX_8X8) { vp9_transform_mby_8x8(x); vp9_quantize_mby_8x8(x); if (x->optimize) vp9_optimize_mby_8x8(x); vp9_inverse_transform_mby_8x8(xd); } else { vp9_transform_mby_4x4(x); vp9_quantize_mby_4x4(x); if (x->optimize) vp9_optimize_mby_4x4(x); vp9_inverse_transform_mby_4x4(xd); } vp9_recon_mby(xd); }