1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3*fb1b10abSAndroid Build Coastguard Worker *
4*fb1b10abSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license
5*fb1b10abSAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source
6*fb1b10abSAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found
7*fb1b10abSAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may
8*fb1b10abSAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree.
9*fb1b10abSAndroid Build Coastguard Worker */
10*fb1b10abSAndroid Build Coastguard Worker
11*fb1b10abSAndroid Build Coastguard Worker #include "vp8/common/common.h"
12*fb1b10abSAndroid Build Coastguard Worker #include "encodemv.h"
13*fb1b10abSAndroid Build Coastguard Worker #include "vp8/common/entropymode.h"
14*fb1b10abSAndroid Build Coastguard Worker #include "vp8/common/systemdependent.h"
15*fb1b10abSAndroid Build Coastguard Worker #include "vpx_ports/system_state.h"
16*fb1b10abSAndroid Build Coastguard Worker
17*fb1b10abSAndroid Build Coastguard Worker #include <math.h>
18*fb1b10abSAndroid Build Coastguard Worker
encode_mvcomponent(vp8_writer * const w,const int v,const struct mv_context * mvc)19*fb1b10abSAndroid Build Coastguard Worker static void encode_mvcomponent(vp8_writer *const w, const int v,
20*fb1b10abSAndroid Build Coastguard Worker const struct mv_context *mvc) {
21*fb1b10abSAndroid Build Coastguard Worker const vp8_prob *p = mvc->prob;
22*fb1b10abSAndroid Build Coastguard Worker const int x = v < 0 ? -v : v;
23*fb1b10abSAndroid Build Coastguard Worker
24*fb1b10abSAndroid Build Coastguard Worker if (x < mvnum_short) { /* Small */
25*fb1b10abSAndroid Build Coastguard Worker vp8_write(w, 0, p[mvpis_short]);
26*fb1b10abSAndroid Build Coastguard Worker vp8_treed_write(w, vp8_small_mvtree, p + MVPshort, x, 3);
27*fb1b10abSAndroid Build Coastguard Worker
28*fb1b10abSAndroid Build Coastguard Worker if (!x) return; /* no sign bit */
29*fb1b10abSAndroid Build Coastguard Worker } else { /* Large */
30*fb1b10abSAndroid Build Coastguard Worker int i = 0;
31*fb1b10abSAndroid Build Coastguard Worker
32*fb1b10abSAndroid Build Coastguard Worker vp8_write(w, 1, p[mvpis_short]);
33*fb1b10abSAndroid Build Coastguard Worker
34*fb1b10abSAndroid Build Coastguard Worker do {
35*fb1b10abSAndroid Build Coastguard Worker vp8_write(w, (x >> i) & 1, p[MVPbits + i]);
36*fb1b10abSAndroid Build Coastguard Worker } while (++i < 3);
37*fb1b10abSAndroid Build Coastguard Worker
38*fb1b10abSAndroid Build Coastguard Worker i = mvlong_width - 1; /* Skip bit 3, which is sometimes implicit */
39*fb1b10abSAndroid Build Coastguard Worker
40*fb1b10abSAndroid Build Coastguard Worker do {
41*fb1b10abSAndroid Build Coastguard Worker vp8_write(w, (x >> i) & 1, p[MVPbits + i]);
42*fb1b10abSAndroid Build Coastguard Worker } while (--i > 3);
43*fb1b10abSAndroid Build Coastguard Worker
44*fb1b10abSAndroid Build Coastguard Worker if (x & 0xFFF0) vp8_write(w, (x >> 3) & 1, p[MVPbits + 3]);
45*fb1b10abSAndroid Build Coastguard Worker }
46*fb1b10abSAndroid Build Coastguard Worker
47*fb1b10abSAndroid Build Coastguard Worker vp8_write(w, v < 0, p[MVPsign]);
48*fb1b10abSAndroid Build Coastguard Worker }
49*fb1b10abSAndroid Build Coastguard Worker #if 0
50*fb1b10abSAndroid Build Coastguard Worker static int max_mv_r = 0;
51*fb1b10abSAndroid Build Coastguard Worker static int max_mv_c = 0;
52*fb1b10abSAndroid Build Coastguard Worker #endif
vp8_encode_motion_vector(vp8_writer * w,const MV * mv,const MV_CONTEXT * mvc)53*fb1b10abSAndroid Build Coastguard Worker void vp8_encode_motion_vector(vp8_writer *w, const MV *mv,
54*fb1b10abSAndroid Build Coastguard Worker const MV_CONTEXT *mvc) {
55*fb1b10abSAndroid Build Coastguard Worker #if 0
56*fb1b10abSAndroid Build Coastguard Worker {
57*fb1b10abSAndroid Build Coastguard Worker if (abs(mv->row >> 1) > max_mv_r)
58*fb1b10abSAndroid Build Coastguard Worker {
59*fb1b10abSAndroid Build Coastguard Worker FILE *f = fopen("maxmv.stt", "a");
60*fb1b10abSAndroid Build Coastguard Worker max_mv_r = abs(mv->row >> 1);
61*fb1b10abSAndroid Build Coastguard Worker fprintf(f, "New Mv Row Max %6d\n", (mv->row >> 1));
62*fb1b10abSAndroid Build Coastguard Worker
63*fb1b10abSAndroid Build Coastguard Worker if ((abs(mv->row) / 2) != max_mv_r)
64*fb1b10abSAndroid Build Coastguard Worker fprintf(f, "MV Row conversion error %6d\n", abs(mv->row) / 2);
65*fb1b10abSAndroid Build Coastguard Worker
66*fb1b10abSAndroid Build Coastguard Worker fclose(f);
67*fb1b10abSAndroid Build Coastguard Worker }
68*fb1b10abSAndroid Build Coastguard Worker
69*fb1b10abSAndroid Build Coastguard Worker if (abs(mv->col >> 1) > max_mv_c)
70*fb1b10abSAndroid Build Coastguard Worker {
71*fb1b10abSAndroid Build Coastguard Worker FILE *f = fopen("maxmv.stt", "a");
72*fb1b10abSAndroid Build Coastguard Worker fprintf(f, "New Mv Col Max %6d\n", (mv->col >> 1));
73*fb1b10abSAndroid Build Coastguard Worker max_mv_c = abs(mv->col >> 1);
74*fb1b10abSAndroid Build Coastguard Worker fclose(f);
75*fb1b10abSAndroid Build Coastguard Worker }
76*fb1b10abSAndroid Build Coastguard Worker }
77*fb1b10abSAndroid Build Coastguard Worker #endif
78*fb1b10abSAndroid Build Coastguard Worker
79*fb1b10abSAndroid Build Coastguard Worker encode_mvcomponent(w, mv->row >> 1, &mvc[0]);
80*fb1b10abSAndroid Build Coastguard Worker encode_mvcomponent(w, mv->col >> 1, &mvc[1]);
81*fb1b10abSAndroid Build Coastguard Worker }
82*fb1b10abSAndroid Build Coastguard Worker
cost_mvcomponent(const int v,const struct mv_context * mvc)83*fb1b10abSAndroid Build Coastguard Worker static unsigned int cost_mvcomponent(const int v,
84*fb1b10abSAndroid Build Coastguard Worker const struct mv_context *mvc) {
85*fb1b10abSAndroid Build Coastguard Worker const vp8_prob *p = mvc->prob;
86*fb1b10abSAndroid Build Coastguard Worker const int x = v;
87*fb1b10abSAndroid Build Coastguard Worker unsigned int cost;
88*fb1b10abSAndroid Build Coastguard Worker
89*fb1b10abSAndroid Build Coastguard Worker if (x < mvnum_short) {
90*fb1b10abSAndroid Build Coastguard Worker cost = vp8_cost_zero(p[mvpis_short]) +
91*fb1b10abSAndroid Build Coastguard Worker vp8_treed_cost(vp8_small_mvtree, p + MVPshort, x, 3);
92*fb1b10abSAndroid Build Coastguard Worker
93*fb1b10abSAndroid Build Coastguard Worker if (!x) return cost;
94*fb1b10abSAndroid Build Coastguard Worker } else {
95*fb1b10abSAndroid Build Coastguard Worker int i = 0;
96*fb1b10abSAndroid Build Coastguard Worker cost = vp8_cost_one(p[mvpis_short]);
97*fb1b10abSAndroid Build Coastguard Worker
98*fb1b10abSAndroid Build Coastguard Worker do {
99*fb1b10abSAndroid Build Coastguard Worker cost += vp8_cost_bit(p[MVPbits + i], (x >> i) & 1);
100*fb1b10abSAndroid Build Coastguard Worker
101*fb1b10abSAndroid Build Coastguard Worker } while (++i < 3);
102*fb1b10abSAndroid Build Coastguard Worker
103*fb1b10abSAndroid Build Coastguard Worker i = mvlong_width - 1; /* Skip bit 3, which is sometimes implicit */
104*fb1b10abSAndroid Build Coastguard Worker
105*fb1b10abSAndroid Build Coastguard Worker do {
106*fb1b10abSAndroid Build Coastguard Worker cost += vp8_cost_bit(p[MVPbits + i], (x >> i) & 1);
107*fb1b10abSAndroid Build Coastguard Worker
108*fb1b10abSAndroid Build Coastguard Worker } while (--i > 3);
109*fb1b10abSAndroid Build Coastguard Worker
110*fb1b10abSAndroid Build Coastguard Worker if (x & 0xFFF0) cost += vp8_cost_bit(p[MVPbits + 3], (x >> 3) & 1);
111*fb1b10abSAndroid Build Coastguard Worker }
112*fb1b10abSAndroid Build Coastguard Worker
113*fb1b10abSAndroid Build Coastguard Worker return cost; /* + vp8_cost_bit( p [MVPsign], v < 0); */
114*fb1b10abSAndroid Build Coastguard Worker }
115*fb1b10abSAndroid Build Coastguard Worker
vp8_build_component_cost_table(int * mvcost[2],const MV_CONTEXT * mvc,int mvc_flag[2])116*fb1b10abSAndroid Build Coastguard Worker void vp8_build_component_cost_table(int *mvcost[2], const MV_CONTEXT *mvc,
117*fb1b10abSAndroid Build Coastguard Worker int mvc_flag[2]) {
118*fb1b10abSAndroid Build Coastguard Worker int i = 1;
119*fb1b10abSAndroid Build Coastguard Worker unsigned int cost0 = 0;
120*fb1b10abSAndroid Build Coastguard Worker unsigned int cost1 = 0;
121*fb1b10abSAndroid Build Coastguard Worker
122*fb1b10abSAndroid Build Coastguard Worker vpx_clear_system_state();
123*fb1b10abSAndroid Build Coastguard Worker
124*fb1b10abSAndroid Build Coastguard Worker i = 1;
125*fb1b10abSAndroid Build Coastguard Worker
126*fb1b10abSAndroid Build Coastguard Worker if (mvc_flag[0]) {
127*fb1b10abSAndroid Build Coastguard Worker mvcost[0][0] = cost_mvcomponent(0, &mvc[0]);
128*fb1b10abSAndroid Build Coastguard Worker
129*fb1b10abSAndroid Build Coastguard Worker do {
130*fb1b10abSAndroid Build Coastguard Worker cost0 = cost_mvcomponent(i, &mvc[0]);
131*fb1b10abSAndroid Build Coastguard Worker
132*fb1b10abSAndroid Build Coastguard Worker mvcost[0][i] = cost0 + vp8_cost_zero(mvc[0].prob[MVPsign]);
133*fb1b10abSAndroid Build Coastguard Worker mvcost[0][-i] = cost0 + vp8_cost_one(mvc[0].prob[MVPsign]);
134*fb1b10abSAndroid Build Coastguard Worker } while (++i <= mv_max);
135*fb1b10abSAndroid Build Coastguard Worker }
136*fb1b10abSAndroid Build Coastguard Worker
137*fb1b10abSAndroid Build Coastguard Worker i = 1;
138*fb1b10abSAndroid Build Coastguard Worker
139*fb1b10abSAndroid Build Coastguard Worker if (mvc_flag[1]) {
140*fb1b10abSAndroid Build Coastguard Worker mvcost[1][0] = cost_mvcomponent(0, &mvc[1]);
141*fb1b10abSAndroid Build Coastguard Worker
142*fb1b10abSAndroid Build Coastguard Worker do {
143*fb1b10abSAndroid Build Coastguard Worker cost1 = cost_mvcomponent(i, &mvc[1]);
144*fb1b10abSAndroid Build Coastguard Worker
145*fb1b10abSAndroid Build Coastguard Worker mvcost[1][i] = cost1 + vp8_cost_zero(mvc[1].prob[MVPsign]);
146*fb1b10abSAndroid Build Coastguard Worker mvcost[1][-i] = cost1 + vp8_cost_one(mvc[1].prob[MVPsign]);
147*fb1b10abSAndroid Build Coastguard Worker } while (++i <= mv_max);
148*fb1b10abSAndroid Build Coastguard Worker }
149*fb1b10abSAndroid Build Coastguard Worker }
150*fb1b10abSAndroid Build Coastguard Worker
151*fb1b10abSAndroid Build Coastguard Worker /* Motion vector probability table update depends on benefit.
152*fb1b10abSAndroid Build Coastguard Worker * Small correction allows for the fact that an update to an MV probability
153*fb1b10abSAndroid Build Coastguard Worker * may have benefit in subsequent frames as well as the current one.
154*fb1b10abSAndroid Build Coastguard Worker */
155*fb1b10abSAndroid Build Coastguard Worker #define MV_PROB_UPDATE_CORRECTION -1
156*fb1b10abSAndroid Build Coastguard Worker
calc_prob(vp8_prob * p,const unsigned int ct[2])157*fb1b10abSAndroid Build Coastguard Worker static void calc_prob(vp8_prob *p, const unsigned int ct[2]) {
158*fb1b10abSAndroid Build Coastguard Worker const unsigned int tot = ct[0] + ct[1];
159*fb1b10abSAndroid Build Coastguard Worker
160*fb1b10abSAndroid Build Coastguard Worker if (tot) {
161*fb1b10abSAndroid Build Coastguard Worker const vp8_prob x = ((ct[0] * 255) / tot) & ~1u;
162*fb1b10abSAndroid Build Coastguard Worker *p = x ? x : 1;
163*fb1b10abSAndroid Build Coastguard Worker }
164*fb1b10abSAndroid Build Coastguard Worker }
165*fb1b10abSAndroid Build Coastguard Worker
update(vp8_writer * const w,const unsigned int ct[2],vp8_prob * const cur_p,const vp8_prob new_p,const vp8_prob update_p,int * updated)166*fb1b10abSAndroid Build Coastguard Worker static void update(vp8_writer *const w, const unsigned int ct[2],
167*fb1b10abSAndroid Build Coastguard Worker vp8_prob *const cur_p, const vp8_prob new_p,
168*fb1b10abSAndroid Build Coastguard Worker const vp8_prob update_p, int *updated) {
169*fb1b10abSAndroid Build Coastguard Worker const int cur_b = vp8_cost_branch(ct, *cur_p);
170*fb1b10abSAndroid Build Coastguard Worker const int new_b = vp8_cost_branch(ct, new_p);
171*fb1b10abSAndroid Build Coastguard Worker const int cost =
172*fb1b10abSAndroid Build Coastguard Worker 7 + MV_PROB_UPDATE_CORRECTION +
173*fb1b10abSAndroid Build Coastguard Worker ((vp8_cost_one(update_p) - vp8_cost_zero(update_p) + 128) >> 8);
174*fb1b10abSAndroid Build Coastguard Worker
175*fb1b10abSAndroid Build Coastguard Worker if (cur_b - new_b > cost) {
176*fb1b10abSAndroid Build Coastguard Worker *cur_p = new_p;
177*fb1b10abSAndroid Build Coastguard Worker vp8_write(w, 1, update_p);
178*fb1b10abSAndroid Build Coastguard Worker vp8_write_literal(w, new_p >> 1, 7);
179*fb1b10abSAndroid Build Coastguard Worker *updated = 1;
180*fb1b10abSAndroid Build Coastguard Worker
181*fb1b10abSAndroid Build Coastguard Worker } else
182*fb1b10abSAndroid Build Coastguard Worker vp8_write(w, 0, update_p);
183*fb1b10abSAndroid Build Coastguard Worker }
184*fb1b10abSAndroid Build Coastguard Worker
write_component_probs(vp8_writer * const w,struct mv_context * cur_mvc,const struct mv_context * default_mvc_,const struct mv_context * update_mvc,const unsigned int events[MVvals],unsigned int rc,int * updated)185*fb1b10abSAndroid Build Coastguard Worker static void write_component_probs(vp8_writer *const w,
186*fb1b10abSAndroid Build Coastguard Worker struct mv_context *cur_mvc,
187*fb1b10abSAndroid Build Coastguard Worker const struct mv_context *default_mvc_,
188*fb1b10abSAndroid Build Coastguard Worker const struct mv_context *update_mvc,
189*fb1b10abSAndroid Build Coastguard Worker const unsigned int events[MVvals],
190*fb1b10abSAndroid Build Coastguard Worker unsigned int rc, int *updated) {
191*fb1b10abSAndroid Build Coastguard Worker vp8_prob *Pcur = cur_mvc->prob;
192*fb1b10abSAndroid Build Coastguard Worker const vp8_prob *default_mvc = default_mvc_->prob;
193*fb1b10abSAndroid Build Coastguard Worker const vp8_prob *Pupdate = update_mvc->prob;
194*fb1b10abSAndroid Build Coastguard Worker unsigned int is_short_ct[2], sign_ct[2];
195*fb1b10abSAndroid Build Coastguard Worker
196*fb1b10abSAndroid Build Coastguard Worker unsigned int bit_ct[mvlong_width][2];
197*fb1b10abSAndroid Build Coastguard Worker
198*fb1b10abSAndroid Build Coastguard Worker unsigned int short_ct[mvnum_short];
199*fb1b10abSAndroid Build Coastguard Worker unsigned int short_bct[mvnum_short - 1][2];
200*fb1b10abSAndroid Build Coastguard Worker
201*fb1b10abSAndroid Build Coastguard Worker vp8_prob Pnew[MVPcount];
202*fb1b10abSAndroid Build Coastguard Worker
203*fb1b10abSAndroid Build Coastguard Worker (void)rc;
204*fb1b10abSAndroid Build Coastguard Worker vp8_copy_array(Pnew, default_mvc, MVPcount);
205*fb1b10abSAndroid Build Coastguard Worker
206*fb1b10abSAndroid Build Coastguard Worker vp8_zero(is_short_ct);
207*fb1b10abSAndroid Build Coastguard Worker vp8_zero(sign_ct);
208*fb1b10abSAndroid Build Coastguard Worker vp8_zero(bit_ct);
209*fb1b10abSAndroid Build Coastguard Worker vp8_zero(short_ct);
210*fb1b10abSAndroid Build Coastguard Worker vp8_zero(short_bct);
211*fb1b10abSAndroid Build Coastguard Worker
212*fb1b10abSAndroid Build Coastguard Worker /* j=0 */
213*fb1b10abSAndroid Build Coastguard Worker {
214*fb1b10abSAndroid Build Coastguard Worker const int c = events[mv_max];
215*fb1b10abSAndroid Build Coastguard Worker
216*fb1b10abSAndroid Build Coastguard Worker is_short_ct[0] += c; /* Short vector */
217*fb1b10abSAndroid Build Coastguard Worker short_ct[0] += c; /* Magnitude distribution */
218*fb1b10abSAndroid Build Coastguard Worker }
219*fb1b10abSAndroid Build Coastguard Worker
220*fb1b10abSAndroid Build Coastguard Worker /* j: 1 ~ mv_max (1023) */
221*fb1b10abSAndroid Build Coastguard Worker {
222*fb1b10abSAndroid Build Coastguard Worker int j = 1;
223*fb1b10abSAndroid Build Coastguard Worker
224*fb1b10abSAndroid Build Coastguard Worker do {
225*fb1b10abSAndroid Build Coastguard Worker const int c1 = events[mv_max + j]; /* positive */
226*fb1b10abSAndroid Build Coastguard Worker const int c2 = events[mv_max - j]; /* negative */
227*fb1b10abSAndroid Build Coastguard Worker const int c = c1 + c2;
228*fb1b10abSAndroid Build Coastguard Worker int a = j;
229*fb1b10abSAndroid Build Coastguard Worker
230*fb1b10abSAndroid Build Coastguard Worker sign_ct[0] += c1;
231*fb1b10abSAndroid Build Coastguard Worker sign_ct[1] += c2;
232*fb1b10abSAndroid Build Coastguard Worker
233*fb1b10abSAndroid Build Coastguard Worker if (a < mvnum_short) {
234*fb1b10abSAndroid Build Coastguard Worker is_short_ct[0] += c; /* Short vector */
235*fb1b10abSAndroid Build Coastguard Worker short_ct[a] += c; /* Magnitude distribution */
236*fb1b10abSAndroid Build Coastguard Worker } else {
237*fb1b10abSAndroid Build Coastguard Worker int k = mvlong_width - 1;
238*fb1b10abSAndroid Build Coastguard Worker is_short_ct[1] += c; /* Long vector */
239*fb1b10abSAndroid Build Coastguard Worker
240*fb1b10abSAndroid Build Coastguard Worker /* bit 3 not always encoded. */
241*fb1b10abSAndroid Build Coastguard Worker do {
242*fb1b10abSAndroid Build Coastguard Worker bit_ct[k][(a >> k) & 1] += c;
243*fb1b10abSAndroid Build Coastguard Worker
244*fb1b10abSAndroid Build Coastguard Worker } while (--k >= 0);
245*fb1b10abSAndroid Build Coastguard Worker }
246*fb1b10abSAndroid Build Coastguard Worker } while (++j <= mv_max);
247*fb1b10abSAndroid Build Coastguard Worker }
248*fb1b10abSAndroid Build Coastguard Worker
249*fb1b10abSAndroid Build Coastguard Worker calc_prob(Pnew + mvpis_short, is_short_ct);
250*fb1b10abSAndroid Build Coastguard Worker
251*fb1b10abSAndroid Build Coastguard Worker calc_prob(Pnew + MVPsign, sign_ct);
252*fb1b10abSAndroid Build Coastguard Worker
253*fb1b10abSAndroid Build Coastguard Worker {
254*fb1b10abSAndroid Build Coastguard Worker vp8_prob p[mvnum_short - 1]; /* actually only need branch ct */
255*fb1b10abSAndroid Build Coastguard Worker int j = 0;
256*fb1b10abSAndroid Build Coastguard Worker
257*fb1b10abSAndroid Build Coastguard Worker vp8_tree_probs_from_distribution(8, vp8_small_mvencodings, vp8_small_mvtree,
258*fb1b10abSAndroid Build Coastguard Worker p, short_bct, short_ct, 256, 1);
259*fb1b10abSAndroid Build Coastguard Worker
260*fb1b10abSAndroid Build Coastguard Worker do {
261*fb1b10abSAndroid Build Coastguard Worker calc_prob(Pnew + MVPshort + j, short_bct[j]);
262*fb1b10abSAndroid Build Coastguard Worker
263*fb1b10abSAndroid Build Coastguard Worker } while (++j < mvnum_short - 1);
264*fb1b10abSAndroid Build Coastguard Worker }
265*fb1b10abSAndroid Build Coastguard Worker
266*fb1b10abSAndroid Build Coastguard Worker {
267*fb1b10abSAndroid Build Coastguard Worker int j = 0;
268*fb1b10abSAndroid Build Coastguard Worker
269*fb1b10abSAndroid Build Coastguard Worker do {
270*fb1b10abSAndroid Build Coastguard Worker calc_prob(Pnew + MVPbits + j, bit_ct[j]);
271*fb1b10abSAndroid Build Coastguard Worker
272*fb1b10abSAndroid Build Coastguard Worker } while (++j < mvlong_width);
273*fb1b10abSAndroid Build Coastguard Worker }
274*fb1b10abSAndroid Build Coastguard Worker
275*fb1b10abSAndroid Build Coastguard Worker update(w, is_short_ct, Pcur + mvpis_short, Pnew[mvpis_short], *Pupdate++,
276*fb1b10abSAndroid Build Coastguard Worker updated);
277*fb1b10abSAndroid Build Coastguard Worker
278*fb1b10abSAndroid Build Coastguard Worker update(w, sign_ct, Pcur + MVPsign, Pnew[MVPsign], *Pupdate++, updated);
279*fb1b10abSAndroid Build Coastguard Worker
280*fb1b10abSAndroid Build Coastguard Worker {
281*fb1b10abSAndroid Build Coastguard Worker const vp8_prob *const new_p = Pnew + MVPshort;
282*fb1b10abSAndroid Build Coastguard Worker vp8_prob *const cur_p = Pcur + MVPshort;
283*fb1b10abSAndroid Build Coastguard Worker
284*fb1b10abSAndroid Build Coastguard Worker int j = 0;
285*fb1b10abSAndroid Build Coastguard Worker
286*fb1b10abSAndroid Build Coastguard Worker do {
287*fb1b10abSAndroid Build Coastguard Worker update(w, short_bct[j], cur_p + j, new_p[j], *Pupdate++, updated);
288*fb1b10abSAndroid Build Coastguard Worker
289*fb1b10abSAndroid Build Coastguard Worker } while (++j < mvnum_short - 1);
290*fb1b10abSAndroid Build Coastguard Worker }
291*fb1b10abSAndroid Build Coastguard Worker
292*fb1b10abSAndroid Build Coastguard Worker {
293*fb1b10abSAndroid Build Coastguard Worker const vp8_prob *const new_p = Pnew + MVPbits;
294*fb1b10abSAndroid Build Coastguard Worker vp8_prob *const cur_p = Pcur + MVPbits;
295*fb1b10abSAndroid Build Coastguard Worker
296*fb1b10abSAndroid Build Coastguard Worker int j = 0;
297*fb1b10abSAndroid Build Coastguard Worker
298*fb1b10abSAndroid Build Coastguard Worker do {
299*fb1b10abSAndroid Build Coastguard Worker update(w, bit_ct[j], cur_p + j, new_p[j], *Pupdate++, updated);
300*fb1b10abSAndroid Build Coastguard Worker
301*fb1b10abSAndroid Build Coastguard Worker } while (++j < mvlong_width);
302*fb1b10abSAndroid Build Coastguard Worker }
303*fb1b10abSAndroid Build Coastguard Worker }
304*fb1b10abSAndroid Build Coastguard Worker
vp8_write_mvprobs(VP8_COMP * cpi)305*fb1b10abSAndroid Build Coastguard Worker void vp8_write_mvprobs(VP8_COMP *cpi) {
306*fb1b10abSAndroid Build Coastguard Worker vp8_writer *const w = cpi->bc;
307*fb1b10abSAndroid Build Coastguard Worker MV_CONTEXT *mvc = cpi->common.fc.mvc;
308*fb1b10abSAndroid Build Coastguard Worker int flags[2] = { 0, 0 };
309*fb1b10abSAndroid Build Coastguard Worker write_component_probs(w, &mvc[0], &vp8_default_mv_context[0],
310*fb1b10abSAndroid Build Coastguard Worker &vp8_mv_update_probs[0], cpi->mb.MVcount[0], 0,
311*fb1b10abSAndroid Build Coastguard Worker &flags[0]);
312*fb1b10abSAndroid Build Coastguard Worker write_component_probs(w, &mvc[1], &vp8_default_mv_context[1],
313*fb1b10abSAndroid Build Coastguard Worker &vp8_mv_update_probs[1], cpi->mb.MVcount[1], 1,
314*fb1b10abSAndroid Build Coastguard Worker &flags[1]);
315*fb1b10abSAndroid Build Coastguard Worker
316*fb1b10abSAndroid Build Coastguard Worker if (flags[0] || flags[1]) {
317*fb1b10abSAndroid Build Coastguard Worker vp8_build_component_cost_table(
318*fb1b10abSAndroid Build Coastguard Worker cpi->mb.mvcost, (const MV_CONTEXT *)cpi->common.fc.mvc, flags);
319*fb1b10abSAndroid Build Coastguard Worker }
320*fb1b10abSAndroid Build Coastguard Worker }
321