1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/*
2233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3233d2500723e5594f3e7c70896ffeeef32b9c950ywan *
4233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  Use of this source code is governed by a BSD-style license
5233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  that can be found in the LICENSE file in the root of the source
6233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  tree. An additional intellectual property rights grant can be found
7233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  in the file PATENTS.  All contributing project authors may
8233d2500723e5594f3e7c70896ffeeef32b9c950ywan *  be found in the AUTHORS file in the root of the source tree.
9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */
10233d2500723e5594f3e7c70896ffeeef32b9c950ywan
11233d2500723e5594f3e7c70896ffeeef32b9c950ywan
12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include "findnearmv.h"
13233d2500723e5594f3e7c70896ffeeef32b9c950ywan
14233d2500723e5594f3e7c70896ffeeef32b9c950ywanconst unsigned char vp8_mbsplit_offset[4][16] = {
15233d2500723e5594f3e7c70896ffeeef32b9c950ywan    { 0,  8,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0},
16233d2500723e5594f3e7c70896ffeeef32b9c950ywan    { 0,  2,  0,  0,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0},
17233d2500723e5594f3e7c70896ffeeef32b9c950ywan    { 0,  2,  8, 10,  0,  0,  0,  0,  0,  0,   0,  0,  0,  0,  0,  0},
18233d2500723e5594f3e7c70896ffeeef32b9c950ywan    { 0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14, 15}
19233d2500723e5594f3e7c70896ffeeef32b9c950ywan};
20233d2500723e5594f3e7c70896ffeeef32b9c950ywan
21233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* Predict motion vectors using those from already-decoded nearby blocks.
22233d2500723e5594f3e7c70896ffeeef32b9c950ywan   Note that we only consider one 4x4 subblock from each candidate 16x16
23233d2500723e5594f3e7c70896ffeeef32b9c950ywan   macroblock.   */
24233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_find_near_mvs
25233d2500723e5594f3e7c70896ffeeef32b9c950ywan(
26233d2500723e5594f3e7c70896ffeeef32b9c950ywan    MACROBLOCKD *xd,
27233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const MODE_INFO *here,
28233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int_mv *nearest,
29233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int_mv *nearby,
30233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int_mv *best_mv,
31233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int cnt[4],
32233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int refframe,
33233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int *ref_frame_sign_bias
34233d2500723e5594f3e7c70896ffeeef32b9c950ywan)
35233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
36233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const MODE_INFO *above = here - xd->mode_info_stride;
37233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const MODE_INFO *left = here - 1;
38233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const MODE_INFO *aboveleft = above - 1;
39233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int_mv            near_mvs[4];
40233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int_mv           *mv = near_mvs;
41233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int             *cntx = cnt;
42233d2500723e5594f3e7c70896ffeeef32b9c950ywan    enum {CNT_INTRA, CNT_NEAREST, CNT_NEAR, CNT_SPLITMV};
43233d2500723e5594f3e7c70896ffeeef32b9c950ywan
44233d2500723e5594f3e7c70896ffeeef32b9c950ywan    /* Zero accumulators */
45233d2500723e5594f3e7c70896ffeeef32b9c950ywan    mv[0].as_int = mv[1].as_int = mv[2].as_int = 0;
46233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cnt[0] = cnt[1] = cnt[2] = cnt[3] = 0;
47233d2500723e5594f3e7c70896ffeeef32b9c950ywan
48233d2500723e5594f3e7c70896ffeeef32b9c950ywan    /* Process above */
49233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (above->mbmi.ref_frame != INTRA_FRAME)
50233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
51233d2500723e5594f3e7c70896ffeeef32b9c950ywan        if (above->mbmi.mv.as_int)
52233d2500723e5594f3e7c70896ffeeef32b9c950ywan        {
53233d2500723e5594f3e7c70896ffeeef32b9c950ywan            (++mv)->as_int = above->mbmi.mv.as_int;
54233d2500723e5594f3e7c70896ffeeef32b9c950ywan            mv_bias(ref_frame_sign_bias[above->mbmi.ref_frame], refframe, mv, ref_frame_sign_bias);
55233d2500723e5594f3e7c70896ffeeef32b9c950ywan            ++cntx;
56233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
57233d2500723e5594f3e7c70896ffeeef32b9c950ywan
58233d2500723e5594f3e7c70896ffeeef32b9c950ywan        *cntx += 2;
59233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
60233d2500723e5594f3e7c70896ffeeef32b9c950ywan
61233d2500723e5594f3e7c70896ffeeef32b9c950ywan    /* Process left */
62233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (left->mbmi.ref_frame != INTRA_FRAME)
63233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
64233d2500723e5594f3e7c70896ffeeef32b9c950ywan        if (left->mbmi.mv.as_int)
65233d2500723e5594f3e7c70896ffeeef32b9c950ywan        {
66233d2500723e5594f3e7c70896ffeeef32b9c950ywan            int_mv this_mv;
67233d2500723e5594f3e7c70896ffeeef32b9c950ywan
68233d2500723e5594f3e7c70896ffeeef32b9c950ywan            this_mv.as_int = left->mbmi.mv.as_int;
69233d2500723e5594f3e7c70896ffeeef32b9c950ywan            mv_bias(ref_frame_sign_bias[left->mbmi.ref_frame], refframe, &this_mv, ref_frame_sign_bias);
70233d2500723e5594f3e7c70896ffeeef32b9c950ywan
71233d2500723e5594f3e7c70896ffeeef32b9c950ywan            if (this_mv.as_int != mv->as_int)
72233d2500723e5594f3e7c70896ffeeef32b9c950ywan            {
73233d2500723e5594f3e7c70896ffeeef32b9c950ywan                (++mv)->as_int = this_mv.as_int;
74233d2500723e5594f3e7c70896ffeeef32b9c950ywan                ++cntx;
75233d2500723e5594f3e7c70896ffeeef32b9c950ywan            }
76233d2500723e5594f3e7c70896ffeeef32b9c950ywan
77233d2500723e5594f3e7c70896ffeeef32b9c950ywan            *cntx += 2;
78233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
79233d2500723e5594f3e7c70896ffeeef32b9c950ywan        else
80233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cnt[CNT_INTRA] += 2;
81233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
82233d2500723e5594f3e7c70896ffeeef32b9c950ywan
83233d2500723e5594f3e7c70896ffeeef32b9c950ywan    /* Process above left */
84233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (aboveleft->mbmi.ref_frame != INTRA_FRAME)
85233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
86233d2500723e5594f3e7c70896ffeeef32b9c950ywan        if (aboveleft->mbmi.mv.as_int)
87233d2500723e5594f3e7c70896ffeeef32b9c950ywan        {
88233d2500723e5594f3e7c70896ffeeef32b9c950ywan            int_mv this_mv;
89233d2500723e5594f3e7c70896ffeeef32b9c950ywan
90233d2500723e5594f3e7c70896ffeeef32b9c950ywan            this_mv.as_int = aboveleft->mbmi.mv.as_int;
91233d2500723e5594f3e7c70896ffeeef32b9c950ywan            mv_bias(ref_frame_sign_bias[aboveleft->mbmi.ref_frame], refframe, &this_mv, ref_frame_sign_bias);
92233d2500723e5594f3e7c70896ffeeef32b9c950ywan
93233d2500723e5594f3e7c70896ffeeef32b9c950ywan            if (this_mv.as_int != mv->as_int)
94233d2500723e5594f3e7c70896ffeeef32b9c950ywan            {
95233d2500723e5594f3e7c70896ffeeef32b9c950ywan                (++mv)->as_int = this_mv.as_int;
96233d2500723e5594f3e7c70896ffeeef32b9c950ywan                ++cntx;
97233d2500723e5594f3e7c70896ffeeef32b9c950ywan            }
98233d2500723e5594f3e7c70896ffeeef32b9c950ywan
99233d2500723e5594f3e7c70896ffeeef32b9c950ywan            *cntx += 1;
100233d2500723e5594f3e7c70896ffeeef32b9c950ywan        }
101233d2500723e5594f3e7c70896ffeeef32b9c950ywan        else
102233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cnt[CNT_INTRA] += 1;
103233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
104233d2500723e5594f3e7c70896ffeeef32b9c950ywan
105233d2500723e5594f3e7c70896ffeeef32b9c950ywan    /* If we have three distinct MV's ... */
106233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (cnt[CNT_SPLITMV])
107233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
108233d2500723e5594f3e7c70896ffeeef32b9c950ywan        /* See if above-left MV can be merged with NEAREST */
109233d2500723e5594f3e7c70896ffeeef32b9c950ywan        if (mv->as_int == near_mvs[CNT_NEAREST].as_int)
110233d2500723e5594f3e7c70896ffeeef32b9c950ywan            cnt[CNT_NEAREST] += 1;
111233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
112233d2500723e5594f3e7c70896ffeeef32b9c950ywan
113233d2500723e5594f3e7c70896ffeeef32b9c950ywan    cnt[CNT_SPLITMV] = ((above->mbmi.mode == SPLITMV)
114233d2500723e5594f3e7c70896ffeeef32b9c950ywan                        + (left->mbmi.mode == SPLITMV)) * 2
115233d2500723e5594f3e7c70896ffeeef32b9c950ywan                       + (aboveleft->mbmi.mode == SPLITMV);
116233d2500723e5594f3e7c70896ffeeef32b9c950ywan
117233d2500723e5594f3e7c70896ffeeef32b9c950ywan    /* Swap near and nearest if necessary */
118233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (cnt[CNT_NEAR] > cnt[CNT_NEAREST])
119233d2500723e5594f3e7c70896ffeeef32b9c950ywan    {
120233d2500723e5594f3e7c70896ffeeef32b9c950ywan        int tmp;
121233d2500723e5594f3e7c70896ffeeef32b9c950ywan        tmp = cnt[CNT_NEAREST];
122233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cnt[CNT_NEAREST] = cnt[CNT_NEAR];
123233d2500723e5594f3e7c70896ffeeef32b9c950ywan        cnt[CNT_NEAR] = tmp;
124233d2500723e5594f3e7c70896ffeeef32b9c950ywan        tmp = near_mvs[CNT_NEAREST].as_int;
125233d2500723e5594f3e7c70896ffeeef32b9c950ywan        near_mvs[CNT_NEAREST].as_int = near_mvs[CNT_NEAR].as_int;
126233d2500723e5594f3e7c70896ffeeef32b9c950ywan        near_mvs[CNT_NEAR].as_int = tmp;
127233d2500723e5594f3e7c70896ffeeef32b9c950ywan    }
128233d2500723e5594f3e7c70896ffeeef32b9c950ywan
129233d2500723e5594f3e7c70896ffeeef32b9c950ywan    /* Use near_mvs[0] to store the "best" MV */
130233d2500723e5594f3e7c70896ffeeef32b9c950ywan    if (cnt[CNT_NEAREST] >= cnt[CNT_INTRA])
131233d2500723e5594f3e7c70896ffeeef32b9c950ywan        near_mvs[CNT_INTRA] = near_mvs[CNT_NEAREST];
132233d2500723e5594f3e7c70896ffeeef32b9c950ywan
133233d2500723e5594f3e7c70896ffeeef32b9c950ywan    /* Set up return values */
134233d2500723e5594f3e7c70896ffeeef32b9c950ywan    best_mv->as_int = near_mvs[0].as_int;
135233d2500723e5594f3e7c70896ffeeef32b9c950ywan    nearest->as_int = near_mvs[CNT_NEAREST].as_int;
136233d2500723e5594f3e7c70896ffeeef32b9c950ywan    nearby->as_int = near_mvs[CNT_NEAR].as_int;
137233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
138233d2500723e5594f3e7c70896ffeeef32b9c950ywan
139233d2500723e5594f3e7c70896ffeeef32b9c950ywan
140233d2500723e5594f3e7c70896ffeeef32b9c950ywanstatic void invert_and_clamp_mvs(int_mv *inv, int_mv *src, MACROBLOCKD *xd)
141233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
142233d2500723e5594f3e7c70896ffeeef32b9c950ywan    inv->as_mv.row = src->as_mv.row * -1;
143233d2500723e5594f3e7c70896ffeeef32b9c950ywan    inv->as_mv.col = src->as_mv.col * -1;
144233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp8_clamp_mv2(inv, xd);
145233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp8_clamp_mv2(src, xd);
146233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
147233d2500723e5594f3e7c70896ffeeef32b9c950ywan
148233d2500723e5594f3e7c70896ffeeef32b9c950ywan
149233d2500723e5594f3e7c70896ffeeef32b9c950ywanint vp8_find_near_mvs_bias
150233d2500723e5594f3e7c70896ffeeef32b9c950ywan(
151233d2500723e5594f3e7c70896ffeeef32b9c950ywan    MACROBLOCKD *xd,
152233d2500723e5594f3e7c70896ffeeef32b9c950ywan    const MODE_INFO *here,
153233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int_mv mode_mv_sb[2][MB_MODE_COUNT],
154233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int_mv best_mv_sb[2],
155233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int cnt[4],
156233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int refframe,
157233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int *ref_frame_sign_bias
158233d2500723e5594f3e7c70896ffeeef32b9c950ywan)
159233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
160233d2500723e5594f3e7c70896ffeeef32b9c950ywan    int sign_bias = ref_frame_sign_bias[refframe];
161233d2500723e5594f3e7c70896ffeeef32b9c950ywan
162233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp8_find_near_mvs(xd,
163233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      here,
164233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      &mode_mv_sb[sign_bias][NEARESTMV],
165233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      &mode_mv_sb[sign_bias][NEARMV],
166233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      &best_mv_sb[sign_bias],
167233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      cnt,
168233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      refframe,
169233d2500723e5594f3e7c70896ffeeef32b9c950ywan                      ref_frame_sign_bias);
170233d2500723e5594f3e7c70896ffeeef32b9c950ywan
171233d2500723e5594f3e7c70896ffeeef32b9c950ywan    invert_and_clamp_mvs(&mode_mv_sb[!sign_bias][NEARESTMV],
172233d2500723e5594f3e7c70896ffeeef32b9c950ywan                         &mode_mv_sb[sign_bias][NEARESTMV], xd);
173233d2500723e5594f3e7c70896ffeeef32b9c950ywan    invert_and_clamp_mvs(&mode_mv_sb[!sign_bias][NEARMV],
174233d2500723e5594f3e7c70896ffeeef32b9c950ywan                         &mode_mv_sb[sign_bias][NEARMV], xd);
175233d2500723e5594f3e7c70896ffeeef32b9c950ywan    invert_and_clamp_mvs(&best_mv_sb[!sign_bias],
176233d2500723e5594f3e7c70896ffeeef32b9c950ywan                         &best_mv_sb[sign_bias], xd);
177233d2500723e5594f3e7c70896ffeeef32b9c950ywan
178233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return sign_bias;
179233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
180233d2500723e5594f3e7c70896ffeeef32b9c950ywan
181233d2500723e5594f3e7c70896ffeeef32b9c950ywan
182233d2500723e5594f3e7c70896ffeeef32b9c950ywanvp8_prob *vp8_mv_ref_probs(
183233d2500723e5594f3e7c70896ffeeef32b9c950ywan    vp8_prob p[VP8_MVREFS-1], const int near_mv_ref_ct[4]
184233d2500723e5594f3e7c70896ffeeef32b9c950ywan)
185233d2500723e5594f3e7c70896ffeeef32b9c950ywan{
186233d2500723e5594f3e7c70896ffeeef32b9c950ywan    p[0] = vp8_mode_contexts [near_mv_ref_ct[0]] [0];
187233d2500723e5594f3e7c70896ffeeef32b9c950ywan    p[1] = vp8_mode_contexts [near_mv_ref_ct[1]] [1];
188233d2500723e5594f3e7c70896ffeeef32b9c950ywan    p[2] = vp8_mode_contexts [near_mv_ref_ct[2]] [2];
189233d2500723e5594f3e7c70896ffeeef32b9c950ywan    p[3] = vp8_mode_contexts [near_mv_ref_ct[3]] [3];
190233d2500723e5594f3e7c70896ffeeef32b9c950ywan    /*p[3] = vp8_mode_contexts [near_mv_ref_ct[1] + near_mv_ref_ct[2] + near_mv_ref_ct[3]] [3];*/
191233d2500723e5594f3e7c70896ffeeef32b9c950ywan    return p;
192233d2500723e5594f3e7c70896ffeeef32b9c950ywan}
193233d2500723e5594f3e7c70896ffeeef32b9c950ywan
194