diff options
author | hkuang <hkuang@google.com> | 2014-10-27 16:19:04 -0700 |
---|---|---|
committer | hkuang <hkuang@google.com> | 2014-10-31 17:01:08 -0700 |
commit | 55577431ae364273dbaf2aa1e74f51b0cb893464 (patch) | |
tree | e28e42cdc88d2946fbd3aafe4c2ef364ab4be35d /vp9/common/vp9_mvref_common.c | |
parent | 1c84e73ebda82f0089f6ae71acfe1710f5bed2c2 (diff) | |
download | libvpx-55577431ae364273dbaf2aa1e74f51b0cb893464.tar libvpx-55577431ae364273dbaf2aa1e74f51b0cb893464.tar.gz libvpx-55577431ae364273dbaf2aa1e74f51b0cb893464.tar.bz2 libvpx-55577431ae364273dbaf2aa1e74f51b0cb893464.zip |
Bind motion vectors with frame buffer structure.
This will save a lot of memory for decoder due to removing of prev_mi,
but prev_mi is still needed in encoder. So this will increase a little bit
memory for encoder.
Change-Id: I24b2f1a423ebffa55a9bd2fcee1077dac995b2ed
Diffstat (limited to 'vp9/common/vp9_mvref_common.c')
-rw-r--r-- | vp9/common/vp9_mvref_common.c | 44 |
1 files changed, 32 insertions, 12 deletions
diff --git a/vp9/common/vp9_mvref_common.c b/vp9/common/vp9_mvref_common.c index b310eb44d..561201ffe 100644 --- a/vp9/common/vp9_mvref_common.c +++ b/vp9/common/vp9_mvref_common.c @@ -20,13 +20,11 @@ static void find_mv_refs_idx(const VP9_COMMON *cm, const MACROBLOCKD *xd, int block, int mi_row, int mi_col) { const int *ref_sign_bias = cm->ref_frame_sign_bias; int i, refmv_count = 0; - const MODE_INFO *prev_mi = !cm->error_resilient_mode && cm->prev_mi - ? cm->prev_mi[mi_row * xd->mi_stride + mi_col].src_mi - : NULL; - const MB_MODE_INFO *const prev_mbmi = prev_mi ? &prev_mi->src_mi->mbmi : NULL; const POSITION *const mv_ref_search = mv_ref_blocks[mi->mbmi.sb_type]; int different_ref_found = 0; int context_counter = 0; + const MV_REF *const prev_frame_mvs = cm->use_prev_frame_mvs ? + cm->prev_frame->mvs + mi_row * cm->mi_cols + mi_col : NULL; // Blank the reference vector list vpx_memset(mv_ref_list, 0, sizeof(*mv_ref_list) * MAX_MV_REF_CANDIDATES); @@ -71,11 +69,12 @@ static void find_mv_refs_idx(const VP9_COMMON *cm, const MACROBLOCKD *xd, } // Check the last frame's mode and mv info. - if (prev_mbmi) { - if (prev_mbmi->ref_frame[0] == ref_frame) - ADD_MV_REF_LIST(prev_mbmi->mv[0], refmv_count, mv_ref_list, Done); - else if (prev_mbmi->ref_frame[1] == ref_frame) - ADD_MV_REF_LIST(prev_mbmi->mv[1], refmv_count, mv_ref_list, Done); + if (cm->use_prev_frame_mvs) { + if (prev_frame_mvs->ref_frame[0] == ref_frame) { + ADD_MV_REF_LIST(prev_frame_mvs->mv[0], refmv_count, mv_ref_list, Done); + } else if (prev_frame_mvs->ref_frame[1] == ref_frame) { + ADD_MV_REF_LIST(prev_frame_mvs->mv[1], refmv_count, mv_ref_list, Done); + } } // Since we couldn't find 2 mvs from the same reference frame @@ -96,9 +95,30 @@ static void find_mv_refs_idx(const VP9_COMMON *cm, const MACROBLOCKD *xd, } // Since we still don't have a candidate we'll try the last frame. - if (prev_mbmi) - IF_DIFF_REF_FRAME_ADD_MV(prev_mbmi, ref_frame, ref_sign_bias, refmv_count, - mv_ref_list, Done); + if (cm->use_prev_frame_mvs) { + if (prev_frame_mvs->ref_frame[0] != ref_frame && + prev_frame_mvs->ref_frame[0] > INTRA_FRAME) { + int_mv mv = prev_frame_mvs->mv[0]; + if (ref_sign_bias[prev_frame_mvs->ref_frame[0]] != + ref_sign_bias[ref_frame]) { + mv.as_mv.row *= -1; + mv.as_mv.col *= -1; + } + ADD_MV_REF_LIST(mv, refmv_count, mv_ref_list, Done); + } + + if (prev_frame_mvs->ref_frame[1] > INTRA_FRAME && + prev_frame_mvs->ref_frame[1] != ref_frame && + prev_frame_mvs->mv[1].as_int != prev_frame_mvs->mv[0].as_int) { + int_mv mv = prev_frame_mvs->mv[1]; + if (ref_sign_bias[prev_frame_mvs->ref_frame[1]] != + ref_sign_bias[ref_frame]) { + mv.as_mv.row *= -1; + mv.as_mv.col *= -1; + } + ADD_MV_REF_LIST(mv, refmv_count, mv_ref_list, Done); + } + } Done: |