11b362b15af34006e6a11974088a46d42b903418eJohann/*
21b362b15af34006e6a11974088a46d42b903418eJohann *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
31b362b15af34006e6a11974088a46d42b903418eJohann *
41b362b15af34006e6a11974088a46d42b903418eJohann *  Use of this source code is governed by a BSD-style license
51b362b15af34006e6a11974088a46d42b903418eJohann *  that can be found in the LICENSE file in the root of the source
61b362b15af34006e6a11974088a46d42b903418eJohann *  tree. An additional intellectual property rights grant can be found
71b362b15af34006e6a11974088a46d42b903418eJohann *  in the file PATENTS.  All contributing project authors may
81b362b15af34006e6a11974088a46d42b903418eJohann *  be found in the AUTHORS file in the root of the source tree.
91b362b15af34006e6a11974088a46d42b903418eJohann */
101b362b15af34006e6a11974088a46d42b903418eJohann
111b362b15af34006e6a11974088a46d42b903418eJohann
12b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifndef VP8_COMMON_FINDNEARMV_H_
13b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#define VP8_COMMON_FINDNEARMV_H_
141b362b15af34006e6a11974088a46d42b903418eJohann
151b362b15af34006e6a11974088a46d42b903418eJohann#include "mv.h"
161b362b15af34006e6a11974088a46d42b903418eJohann#include "blockd.h"
171b362b15af34006e6a11974088a46d42b903418eJohann#include "modecont.h"
181b362b15af34006e6a11974088a46d42b903418eJohann#include "treecoder.h"
191b362b15af34006e6a11974088a46d42b903418eJohann
20b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifdef __cplusplus
21b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianextern "C" {
22b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif
23b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
241b362b15af34006e6a11974088a46d42b903418eJohann
251b362b15af34006e6a11974088a46d42b903418eJohannstatic void mv_bias(int refmb_ref_frame_sign_bias, int refframe, int_mv *mvp,
261b362b15af34006e6a11974088a46d42b903418eJohann                    const int *ref_frame_sign_bias)
271b362b15af34006e6a11974088a46d42b903418eJohann{
281b362b15af34006e6a11974088a46d42b903418eJohann    if (refmb_ref_frame_sign_bias != ref_frame_sign_bias[refframe])
291b362b15af34006e6a11974088a46d42b903418eJohann    {
301b362b15af34006e6a11974088a46d42b903418eJohann        mvp->as_mv.row *= -1;
311b362b15af34006e6a11974088a46d42b903418eJohann        mvp->as_mv.col *= -1;
321b362b15af34006e6a11974088a46d42b903418eJohann    }
331b362b15af34006e6a11974088a46d42b903418eJohann}
341b362b15af34006e6a11974088a46d42b903418eJohann
351b362b15af34006e6a11974088a46d42b903418eJohann#define LEFT_TOP_MARGIN (16 << 3)
361b362b15af34006e6a11974088a46d42b903418eJohann#define RIGHT_BOTTOM_MARGIN (16 << 3)
371b362b15af34006e6a11974088a46d42b903418eJohannstatic void vp8_clamp_mv2(int_mv *mv, const MACROBLOCKD *xd)
381b362b15af34006e6a11974088a46d42b903418eJohann{
391b362b15af34006e6a11974088a46d42b903418eJohann    if (mv->as_mv.col < (xd->mb_to_left_edge - LEFT_TOP_MARGIN))
401b362b15af34006e6a11974088a46d42b903418eJohann        mv->as_mv.col = xd->mb_to_left_edge - LEFT_TOP_MARGIN;
411b362b15af34006e6a11974088a46d42b903418eJohann    else if (mv->as_mv.col > xd->mb_to_right_edge + RIGHT_BOTTOM_MARGIN)
421b362b15af34006e6a11974088a46d42b903418eJohann        mv->as_mv.col = xd->mb_to_right_edge + RIGHT_BOTTOM_MARGIN;
431b362b15af34006e6a11974088a46d42b903418eJohann
441b362b15af34006e6a11974088a46d42b903418eJohann    if (mv->as_mv.row < (xd->mb_to_top_edge - LEFT_TOP_MARGIN))
451b362b15af34006e6a11974088a46d42b903418eJohann        mv->as_mv.row = xd->mb_to_top_edge - LEFT_TOP_MARGIN;
461b362b15af34006e6a11974088a46d42b903418eJohann    else if (mv->as_mv.row > xd->mb_to_bottom_edge + RIGHT_BOTTOM_MARGIN)
471b362b15af34006e6a11974088a46d42b903418eJohann        mv->as_mv.row = xd->mb_to_bottom_edge + RIGHT_BOTTOM_MARGIN;
481b362b15af34006e6a11974088a46d42b903418eJohann}
491b362b15af34006e6a11974088a46d42b903418eJohann
501b362b15af34006e6a11974088a46d42b903418eJohannstatic void vp8_clamp_mv(int_mv *mv, int mb_to_left_edge, int mb_to_right_edge,
511b362b15af34006e6a11974088a46d42b903418eJohann                         int mb_to_top_edge, int mb_to_bottom_edge)
521b362b15af34006e6a11974088a46d42b903418eJohann{
531b362b15af34006e6a11974088a46d42b903418eJohann    mv->as_mv.col = (mv->as_mv.col < mb_to_left_edge) ?
541b362b15af34006e6a11974088a46d42b903418eJohann        mb_to_left_edge : mv->as_mv.col;
551b362b15af34006e6a11974088a46d42b903418eJohann    mv->as_mv.col = (mv->as_mv.col > mb_to_right_edge) ?
561b362b15af34006e6a11974088a46d42b903418eJohann        mb_to_right_edge : mv->as_mv.col;
571b362b15af34006e6a11974088a46d42b903418eJohann    mv->as_mv.row = (mv->as_mv.row < mb_to_top_edge) ?
581b362b15af34006e6a11974088a46d42b903418eJohann        mb_to_top_edge : mv->as_mv.row;
591b362b15af34006e6a11974088a46d42b903418eJohann    mv->as_mv.row = (mv->as_mv.row > mb_to_bottom_edge) ?
601b362b15af34006e6a11974088a46d42b903418eJohann        mb_to_bottom_edge : mv->as_mv.row;
611b362b15af34006e6a11974088a46d42b903418eJohann}
621b362b15af34006e6a11974088a46d42b903418eJohannstatic unsigned int vp8_check_mv_bounds(int_mv *mv, int mb_to_left_edge,
631b362b15af34006e6a11974088a46d42b903418eJohann                                int mb_to_right_edge, int mb_to_top_edge,
641b362b15af34006e6a11974088a46d42b903418eJohann                                int mb_to_bottom_edge)
651b362b15af34006e6a11974088a46d42b903418eJohann{
661b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int need_to_clamp;
671b362b15af34006e6a11974088a46d42b903418eJohann    need_to_clamp = (mv->as_mv.col < mb_to_left_edge);
681b362b15af34006e6a11974088a46d42b903418eJohann    need_to_clamp |= (mv->as_mv.col > mb_to_right_edge);
691b362b15af34006e6a11974088a46d42b903418eJohann    need_to_clamp |= (mv->as_mv.row < mb_to_top_edge);
701b362b15af34006e6a11974088a46d42b903418eJohann    need_to_clamp |= (mv->as_mv.row > mb_to_bottom_edge);
711b362b15af34006e6a11974088a46d42b903418eJohann    return need_to_clamp;
721b362b15af34006e6a11974088a46d42b903418eJohann}
731b362b15af34006e6a11974088a46d42b903418eJohann
741b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_find_near_mvs
751b362b15af34006e6a11974088a46d42b903418eJohann(
761b362b15af34006e6a11974088a46d42b903418eJohann    MACROBLOCKD *xd,
771b362b15af34006e6a11974088a46d42b903418eJohann    const MODE_INFO *here,
781b362b15af34006e6a11974088a46d42b903418eJohann    int_mv *nearest, int_mv *nearby, int_mv *best,
791b362b15af34006e6a11974088a46d42b903418eJohann    int near_mv_ref_cts[4],
801b362b15af34006e6a11974088a46d42b903418eJohann    int refframe,
811b362b15af34006e6a11974088a46d42b903418eJohann    int *ref_frame_sign_bias
821b362b15af34006e6a11974088a46d42b903418eJohann);
831b362b15af34006e6a11974088a46d42b903418eJohann
841b362b15af34006e6a11974088a46d42b903418eJohann
851b362b15af34006e6a11974088a46d42b903418eJohannint vp8_find_near_mvs_bias
861b362b15af34006e6a11974088a46d42b903418eJohann(
871b362b15af34006e6a11974088a46d42b903418eJohann    MACROBLOCKD *xd,
881b362b15af34006e6a11974088a46d42b903418eJohann    const MODE_INFO *here,
891b362b15af34006e6a11974088a46d42b903418eJohann    int_mv mode_mv_sb[2][MB_MODE_COUNT],
901b362b15af34006e6a11974088a46d42b903418eJohann    int_mv best_mv_sb[2],
911b362b15af34006e6a11974088a46d42b903418eJohann    int cnt[4],
921b362b15af34006e6a11974088a46d42b903418eJohann    int refframe,
931b362b15af34006e6a11974088a46d42b903418eJohann    int *ref_frame_sign_bias
941b362b15af34006e6a11974088a46d42b903418eJohann);
951b362b15af34006e6a11974088a46d42b903418eJohann
961b362b15af34006e6a11974088a46d42b903418eJohann
971b362b15af34006e6a11974088a46d42b903418eJohannvp8_prob *vp8_mv_ref_probs(
981b362b15af34006e6a11974088a46d42b903418eJohann    vp8_prob p[VP8_MVREFS-1], const int near_mv_ref_ct[4]
991b362b15af34006e6a11974088a46d42b903418eJohann);
1001b362b15af34006e6a11974088a46d42b903418eJohann
1011b362b15af34006e6a11974088a46d42b903418eJohannextern const unsigned char vp8_mbsplit_offset[4][16];
1021b362b15af34006e6a11974088a46d42b903418eJohann
1031b362b15af34006e6a11974088a46d42b903418eJohann
1041b362b15af34006e6a11974088a46d42b903418eJohannstatic int left_block_mv(const MODE_INFO *cur_mb, int b)
1051b362b15af34006e6a11974088a46d42b903418eJohann{
1061b362b15af34006e6a11974088a46d42b903418eJohann    if (!(b & 3))
1071b362b15af34006e6a11974088a46d42b903418eJohann    {
1081b362b15af34006e6a11974088a46d42b903418eJohann        /* On L edge, get from MB to left of us */
1091b362b15af34006e6a11974088a46d42b903418eJohann        --cur_mb;
1101b362b15af34006e6a11974088a46d42b903418eJohann
1111b362b15af34006e6a11974088a46d42b903418eJohann        if(cur_mb->mbmi.mode != SPLITMV)
1121b362b15af34006e6a11974088a46d42b903418eJohann            return cur_mb->mbmi.mv.as_int;
1131b362b15af34006e6a11974088a46d42b903418eJohann        b += 4;
1141b362b15af34006e6a11974088a46d42b903418eJohann    }
1151b362b15af34006e6a11974088a46d42b903418eJohann
1161b362b15af34006e6a11974088a46d42b903418eJohann    return (cur_mb->bmi + b - 1)->mv.as_int;
1171b362b15af34006e6a11974088a46d42b903418eJohann}
1181b362b15af34006e6a11974088a46d42b903418eJohann
1191b362b15af34006e6a11974088a46d42b903418eJohannstatic int above_block_mv(const MODE_INFO *cur_mb, int b, int mi_stride)
1201b362b15af34006e6a11974088a46d42b903418eJohann{
1211b362b15af34006e6a11974088a46d42b903418eJohann    if (!(b >> 2))
1221b362b15af34006e6a11974088a46d42b903418eJohann    {
1231b362b15af34006e6a11974088a46d42b903418eJohann        /* On top edge, get from MB above us */
1241b362b15af34006e6a11974088a46d42b903418eJohann        cur_mb -= mi_stride;
1251b362b15af34006e6a11974088a46d42b903418eJohann
1261b362b15af34006e6a11974088a46d42b903418eJohann        if(cur_mb->mbmi.mode != SPLITMV)
1271b362b15af34006e6a11974088a46d42b903418eJohann            return cur_mb->mbmi.mv.as_int;
1281b362b15af34006e6a11974088a46d42b903418eJohann        b += 16;
1291b362b15af34006e6a11974088a46d42b903418eJohann    }
1301b362b15af34006e6a11974088a46d42b903418eJohann
1315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang    return (cur_mb->bmi + (b - 4))->mv.as_int;
1321b362b15af34006e6a11974088a46d42b903418eJohann}
1331b362b15af34006e6a11974088a46d42b903418eJohannstatic B_PREDICTION_MODE left_block_mode(const MODE_INFO *cur_mb, int b)
1341b362b15af34006e6a11974088a46d42b903418eJohann{
1351b362b15af34006e6a11974088a46d42b903418eJohann    if (!(b & 3))
1361b362b15af34006e6a11974088a46d42b903418eJohann    {
1371b362b15af34006e6a11974088a46d42b903418eJohann        /* On L edge, get from MB to left of us */
1381b362b15af34006e6a11974088a46d42b903418eJohann        --cur_mb;
1391b362b15af34006e6a11974088a46d42b903418eJohann        switch (cur_mb->mbmi.mode)
1401b362b15af34006e6a11974088a46d42b903418eJohann        {
1411b362b15af34006e6a11974088a46d42b903418eJohann            case B_PRED:
1421b362b15af34006e6a11974088a46d42b903418eJohann              return (cur_mb->bmi + b + 3)->as_mode;
1431b362b15af34006e6a11974088a46d42b903418eJohann            case DC_PRED:
1441b362b15af34006e6a11974088a46d42b903418eJohann                return B_DC_PRED;
1451b362b15af34006e6a11974088a46d42b903418eJohann            case V_PRED:
1461b362b15af34006e6a11974088a46d42b903418eJohann                return B_VE_PRED;
1471b362b15af34006e6a11974088a46d42b903418eJohann            case H_PRED:
1481b362b15af34006e6a11974088a46d42b903418eJohann                return B_HE_PRED;
1491b362b15af34006e6a11974088a46d42b903418eJohann            case TM_PRED:
1501b362b15af34006e6a11974088a46d42b903418eJohann                return B_TM_PRED;
1511b362b15af34006e6a11974088a46d42b903418eJohann            default:
1521b362b15af34006e6a11974088a46d42b903418eJohann                return B_DC_PRED;
1531b362b15af34006e6a11974088a46d42b903418eJohann        }
1541b362b15af34006e6a11974088a46d42b903418eJohann    }
1551b362b15af34006e6a11974088a46d42b903418eJohann
1561b362b15af34006e6a11974088a46d42b903418eJohann    return (cur_mb->bmi + b - 1)->as_mode;
1571b362b15af34006e6a11974088a46d42b903418eJohann}
1581b362b15af34006e6a11974088a46d42b903418eJohann
1591b362b15af34006e6a11974088a46d42b903418eJohannstatic B_PREDICTION_MODE above_block_mode(const MODE_INFO *cur_mb, int b, int mi_stride)
1601b362b15af34006e6a11974088a46d42b903418eJohann{
1611b362b15af34006e6a11974088a46d42b903418eJohann    if (!(b >> 2))
1621b362b15af34006e6a11974088a46d42b903418eJohann    {
1631b362b15af34006e6a11974088a46d42b903418eJohann        /* On top edge, get from MB above us */
1641b362b15af34006e6a11974088a46d42b903418eJohann        cur_mb -= mi_stride;
1651b362b15af34006e6a11974088a46d42b903418eJohann
1661b362b15af34006e6a11974088a46d42b903418eJohann        switch (cur_mb->mbmi.mode)
1671b362b15af34006e6a11974088a46d42b903418eJohann        {
1681b362b15af34006e6a11974088a46d42b903418eJohann            case B_PRED:
1691b362b15af34006e6a11974088a46d42b903418eJohann              return (cur_mb->bmi + b + 12)->as_mode;
1701b362b15af34006e6a11974088a46d42b903418eJohann            case DC_PRED:
1711b362b15af34006e6a11974088a46d42b903418eJohann                return B_DC_PRED;
1721b362b15af34006e6a11974088a46d42b903418eJohann            case V_PRED:
1731b362b15af34006e6a11974088a46d42b903418eJohann                return B_VE_PRED;
1741b362b15af34006e6a11974088a46d42b903418eJohann            case H_PRED:
1751b362b15af34006e6a11974088a46d42b903418eJohann                return B_HE_PRED;
1761b362b15af34006e6a11974088a46d42b903418eJohann            case TM_PRED:
1771b362b15af34006e6a11974088a46d42b903418eJohann                return B_TM_PRED;
1781b362b15af34006e6a11974088a46d42b903418eJohann            default:
1791b362b15af34006e6a11974088a46d42b903418eJohann                return B_DC_PRED;
1801b362b15af34006e6a11974088a46d42b903418eJohann        }
1811b362b15af34006e6a11974088a46d42b903418eJohann    }
1821b362b15af34006e6a11974088a46d42b903418eJohann
1831b362b15af34006e6a11974088a46d42b903418eJohann    return (cur_mb->bmi + b - 4)->as_mode;
1841b362b15af34006e6a11974088a46d42b903418eJohann}
1851b362b15af34006e6a11974088a46d42b903418eJohann
186b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#ifdef __cplusplus
187b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}  // extern "C"
1881b362b15af34006e6a11974088a46d42b903418eJohann#endif
189b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian
190b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#endif  // VP8_COMMON_FINDNEARMV_H_
191