static int do_16x16_motion_search ( VP9_COMP *cpi, int_mv *ref_mv, int_mv *dst_mv, YV12_BUFFER_CONFIG *buf, int buf_mb_y_offset, YV12_BUFFER_CONFIG *ref, int mb_y_offset ) { MACROBLOCK *const x = &cpi->mb; MACROBLOCKD *const xd = &x->e_mbd; unsigned int err, tmp_err; int_mv tmp_mv; int n; for (n = 0; n < 16; n++) { BLOCKD *d = &xd->block[n]; BLOCK *b = &x->block[n]; b->base_src = &buf->y_buffer; b->src_stride = buf->y_stride; b->src = buf->y_stride * (n & 12) + (n & 3) * 4 + buf_mb_y_offset; d->base_pre = &ref->y_buffer; d->pre_stride = ref->y_stride; d->pre = ref->y_stride * (n & 12) + (n & 3) * 4 + mb_y_offset; } // Try zero MV first // FIXME should really use something like near/nearest MV and/or MV prediction xd->pre.y_buffer = ref->y_buffer + mb_y_offset; xd->pre.y_stride = ref->y_stride; err = vp9_sad16x16(ref->y_buffer + mb_y_offset, ref->y_stride, xd->dst.y_buffer, xd->dst.y_stride, INT_MAX); dst_mv->as_int = 0; // Test last reference frame using the previous best mv as the // starting point (best reference) for the search tmp_err = do_16x16_motion_iteration(cpi, ref_mv, &tmp_mv); if (tmp_err < err) { err = tmp_err; dst_mv->as_int = tmp_mv.as_int; } // If the current best reference mv is not centred on 0,0 then do a 0,0 based search as well if (ref_mv->as_int) { unsigned int tmp_err; int_mv zero_ref_mv, tmp_mv; zero_ref_mv.as_int = 0; tmp_err = do_16x16_motion_iteration(cpi, &zero_ref_mv, &tmp_mv); if (tmp_err < err) { dst_mv->as_int = tmp_mv.as_int; err = tmp_err; } } return err; }
static int do_16x16_motion_search(VP9_COMP *cpi, const int_mv *ref_mv, int_mv *dst_mv, int mb_row, int mb_col) { MACROBLOCK *const x = &cpi->mb; MACROBLOCKD *const xd = &x->e_mbd; unsigned int err, tmp_err; int_mv tmp_mv; // Try zero MV first // FIXME should really use something like near/nearest MV and/or MV prediction err = vp9_sad16x16(x->plane[0].src.buf, x->plane[0].src.stride, xd->plane[0].pre[0].buf, xd->plane[0].pre[0].stride, INT_MAX); dst_mv->as_int = 0; // Test last reference frame using the previous best mv as the // starting point (best reference) for the search tmp_err = do_16x16_motion_iteration(cpi, &ref_mv->as_mv, &tmp_mv.as_mv, mb_row, mb_col); if (tmp_err < err) { err = tmp_err; dst_mv->as_int = tmp_mv.as_int; } // If the current best reference mv is not centered on 0,0 then do a 0,0 // based search as well. if (ref_mv->as_int) { unsigned int tmp_err; int_mv zero_ref_mv, tmp_mv; zero_ref_mv.as_int = 0; tmp_err = do_16x16_motion_iteration(cpi, &zero_ref_mv.as_mv, &tmp_mv.as_mv, mb_row, mb_col); if (tmp_err < err) { dst_mv->as_int = tmp_mv.as_int; err = tmp_err; } } return err; }