decodemv.c 14.6 KB
Newer Older
John Koleszar's avatar
John Koleszar committed
1
/*
2
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
John Koleszar's avatar
John Koleszar committed
3
 *
4
 *  Use of this source code is governed by a BSD-style license
5
6
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
7
 *  in the file PATENTS.  All contributing project authors may
8
 *  be found in the AUTHORS file in the root of the source tree.
John Koleszar's avatar
John Koleszar committed
9
10
11
12
 */


#include "treereader.h"
John Koleszar's avatar
John Koleszar committed
13
14
#include "vp8/common/entropymv.h"
#include "vp8/common/entropymode.h"
John Koleszar's avatar
John Koleszar committed
15
#include "onyxd_int.h"
John Koleszar's avatar
John Koleszar committed
16
#include "vp8/common/findnearmv.h"
Scott LaVarnway's avatar
Scott LaVarnway committed
17

John Koleszar's avatar
John Koleszar committed
18
19
20
#if CONFIG_DEBUG
#include <assert.h>
#endif
21
static B_PREDICTION_MODE read_bmode(vp8_reader *bc, const vp8_prob *p)
Scott LaVarnway's avatar
Scott LaVarnway committed
22
23
24
{
    const int i = vp8_treed_read(bc, vp8_bmode_tree, p);

25
    return (B_PREDICTION_MODE)i;
Scott LaVarnway's avatar
Scott LaVarnway committed
26
27
}

28
static MB_PREDICTION_MODE read_ymode(vp8_reader *bc, const vp8_prob *p)
Scott LaVarnway's avatar
Scott LaVarnway committed
29
30
31
{
    const int i = vp8_treed_read(bc, vp8_ymode_tree, p);

32
    return (MB_PREDICTION_MODE)i;
Scott LaVarnway's avatar
Scott LaVarnway committed
33
34
}

35
static MB_PREDICTION_MODE read_kf_ymode(vp8_reader *bc, const vp8_prob *p)
Scott LaVarnway's avatar
Scott LaVarnway committed
36
37
38
{
    const int i = vp8_treed_read(bc, vp8_kf_ymode_tree, p);

39
    return (MB_PREDICTION_MODE)i;
Scott LaVarnway's avatar
Scott LaVarnway committed
40
41
}

42
static MB_PREDICTION_MODE read_uv_mode(vp8_reader *bc, const vp8_prob *p)
Scott LaVarnway's avatar
Scott LaVarnway committed
43
44
45
{
    const int i = vp8_treed_read(bc, vp8_uv_mode_tree, p);

46
    return (MB_PREDICTION_MODE)i;
Scott LaVarnway's avatar
Scott LaVarnway committed
47
48
}

49
static void read_kf_modes(VP8D_COMP *pbi, MODE_INFO *mi)
Scott LaVarnway's avatar
Scott LaVarnway committed
50
51
52
53
{
    vp8_reader *const bc = & pbi->bc;
    const int mis = pbi->common.mode_info_stride;

54
55
    mi->mbmi.ref_frame = INTRA_FRAME;
    mi->mbmi.mode = read_kf_ymode(bc, pbi->common.kf_ymode_prob);
Scott LaVarnway's avatar
Scott LaVarnway committed
56

57
58
59
    if (mi->mbmi.mode == B_PRED)
    {
        int i = 0;
Scott LaVarnway's avatar
Scott LaVarnway committed
60

61
62
63
64
        do
        {
            const B_PREDICTION_MODE A = above_block_mode(mi, i, mis);
            const B_PREDICTION_MODE L = left_block_mode(mi, i);
Scott LaVarnway's avatar
Scott LaVarnway committed
65

66
67
            mi->bmi[i].as_mode =
                read_bmode(bc, pbi->common.kf_bmode_prob [A] [L]);
Scott LaVarnway's avatar
Scott LaVarnway committed
68
        }
69
70
71
72
        while (++i < 16);
    }

    mi->mbmi.uv_mode = read_uv_mode(bc, pbi->common.kf_uv_mode_prob);
Scott LaVarnway's avatar
Scott LaVarnway committed
73
}
John Koleszar's avatar
John Koleszar committed
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148

static int read_mvcomponent(vp8_reader *r, const MV_CONTEXT *mvc)
{
    const vp8_prob *const p = (const vp8_prob *) mvc;
    int x = 0;

    if (vp8_read(r, p [mvpis_short]))  /* Large */
    {
        int i = 0;

        do
        {
            x += vp8_read(r, p [MVPbits + i]) << i;
        }
        while (++i < 3);

        i = mvlong_width - 1;  /* Skip bit 3, which is sometimes implicit */

        do
        {
            x += vp8_read(r, p [MVPbits + i]) << i;
        }
        while (--i > 3);

        if (!(x & 0xFFF0)  ||  vp8_read(r, p [MVPbits + 3]))
            x += 8;
    }
    else   /* small */
        x = vp8_treed_read(r, vp8_small_mvtree, p + MVPshort);

    if (x  &&  vp8_read(r, p [MVPsign]))
        x = -x;

    return x;
}

static void read_mv(vp8_reader *r, MV *mv, const MV_CONTEXT *mvc)
{
    mv->row = (short)(read_mvcomponent(r,   mvc) << 1);
    mv->col = (short)(read_mvcomponent(r, ++mvc) << 1);
}


static void read_mvcontexts(vp8_reader *bc, MV_CONTEXT *mvc)
{
    int i = 0;

    do
    {
        const vp8_prob *up = vp8_mv_update_probs[i].prob;
        vp8_prob *p = (vp8_prob *)(mvc + i);
        vp8_prob *const pstop = p + MVPcount;

        do
        {
            if (vp8_read(bc, *up++))
            {
                const vp8_prob x = (vp8_prob)vp8_read_literal(bc, 7);

                *p = x ? x << 1 : 1;
            }
        }
        while (++p < pstop);
    }
    while (++i < 2);
}


static MB_PREDICTION_MODE read_mv_ref(vp8_reader *bc, const vp8_prob *p)
{
    const int i = vp8_treed_read(bc, vp8_mv_ref_tree, p);

    return (MB_PREDICTION_MODE)i;
}

149
static B_PREDICTION_MODE sub_mv_ref(vp8_reader *bc, const vp8_prob *p)
John Koleszar's avatar
John Koleszar committed
150
151
152
{
    const int i = vp8_treed_read(bc, vp8_sub_mv_ref_tree, p);

153
    return (B_PREDICTION_MODE)i;
John Koleszar's avatar
John Koleszar committed
154
}
Scott LaVarnway's avatar
Scott LaVarnway committed
155

156
157
static const unsigned char mbsplit_fill_count[4] = {8, 8, 4, 1};
static const unsigned char mbsplit_fill_offset[4][16] = {
Scott LaVarnway's avatar
Scott LaVarnway committed
158
159
160
161
162
    { 0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14, 15},
    { 0,  1,  4,  5,  8,  9, 12, 13,  2,  3,   6,  7, 10, 11, 14, 15},
    { 0,  1,  4,  5,  2,  3,  6,  7,  8,  9,  12, 13, 10, 11, 14, 15},
    { 0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14, 15}
};
John Koleszar's avatar
John Koleszar committed
163
164
165
166




167
static void mb_mode_mv_init(VP8D_COMP *pbi)
Scott LaVarnway's avatar
Scott LaVarnway committed
168
169
170
{
    vp8_reader *const bc = & pbi->bc;
    MV_CONTEXT *const mvc = pbi->common.fc.mvc;
John Koleszar's avatar
John Koleszar committed
171

172
173
174
175
176
177
#if CONFIG_ERROR_CONCEALMENT
    /* Default is that no macroblock is corrupt, therefore we initialize
     * mvs_corrupt_from_mb to something very big, which we can be sure is
     * outside the frame. */
    pbi->mvs_corrupt_from_mb = UINT_MAX;
#endif
Scott LaVarnway's avatar
Scott LaVarnway committed
178
179
180
    pbi->prob_skip_false = 0;
    if (pbi->common.mb_no_coeff_skip)
        pbi->prob_skip_false = (vp8_prob)vp8_read_literal(bc, 8);
John Koleszar's avatar
John Koleszar committed
181

Scott LaVarnway's avatar
Scott LaVarnway committed
182
183
184
185
186
    if(pbi->common.frame_type != KEY_FRAME)
    {
        pbi->prob_intra = (vp8_prob)vp8_read_literal(bc, 8);
        pbi->prob_last  = (vp8_prob)vp8_read_literal(bc, 8);
        pbi->prob_gf    = (vp8_prob)vp8_read_literal(bc, 8);
John Koleszar's avatar
John Koleszar committed
187

Scott LaVarnway's avatar
Scott LaVarnway committed
188
189
190
        if (vp8_read_bit(bc))
        {
            int i = 0;
John Koleszar's avatar
John Koleszar committed
191

Scott LaVarnway's avatar
Scott LaVarnway committed
192
193
            do
            {
194
195
                pbi->common.fc.ymode_prob[i] =
                    (vp8_prob) vp8_read_literal(bc, 8);
Scott LaVarnway's avatar
Scott LaVarnway committed
196
197
198
            }
            while (++i < 4);
        }
John Koleszar's avatar
John Koleszar committed
199

Scott LaVarnway's avatar
Scott LaVarnway committed
200
        if (vp8_read_bit(bc))
John Koleszar's avatar
John Koleszar committed
201
        {
Scott LaVarnway's avatar
Scott LaVarnway committed
202
203
204
205
            int i = 0;

            do
            {
206
207
                pbi->common.fc.uv_mode_prob[i] =
                    (vp8_prob) vp8_read_literal(bc, 8);
Scott LaVarnway's avatar
Scott LaVarnway committed
208
209
            }
            while (++i < 3);
John Koleszar's avatar
John Koleszar committed
210
        }
Scott LaVarnway's avatar
Scott LaVarnway committed
211
212

        read_mvcontexts(bc, mvc);
John Koleszar's avatar
John Koleszar committed
213
    }
Scott LaVarnway's avatar
Scott LaVarnway committed
214
}
John Koleszar's avatar
John Koleszar committed
215

216

217
static void read_mb_modes_mv(VP8D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi,
Scott LaVarnway's avatar
Scott LaVarnway committed
218
219
220
221
222
223
                            int mb_row, int mb_col)
{
    vp8_reader *const bc = & pbi->bc;
    MV_CONTEXT *const mvc = pbi->common.fc.mvc;
    const int mis = pbi->common.mode_info_stride;

Scott LaVarnway's avatar
Scott LaVarnway committed
224
    int_mv *const mv = & mbmi->mv;
Scott LaVarnway's avatar
Scott LaVarnway committed
225
226
227
228
229
230
231
232
233
234
235
    int mb_to_left_edge;
    int mb_to_right_edge;
    int mb_to_top_edge;
    int mb_to_bottom_edge;

    mb_to_top_edge = pbi->mb.mb_to_top_edge;
    mb_to_bottom_edge = pbi->mb.mb_to_bottom_edge;
    mb_to_top_edge -= LEFT_TOP_MARGIN;
    mb_to_bottom_edge += RIGHT_BOTTOM_MARGIN;

    mbmi->need_to_clamp_mvs = 0;
236
    /* Distance of Mb to the various image edges.
237
238
     * These specified to 8th pel as they are always compared to MV values
     * that are in 1/8th pel units
239
     */
Scott LaVarnway's avatar
Scott LaVarnway committed
240
241
242
243
244
245
246
247
248
    pbi->mb.mb_to_left_edge =
    mb_to_left_edge = -((mb_col * 16) << 3);
    mb_to_left_edge -= LEFT_TOP_MARGIN;

    pbi->mb.mb_to_right_edge =
    mb_to_right_edge = ((pbi->common.mb_cols - 1 - mb_col) * 16) << 3;
    mb_to_right_edge += RIGHT_BOTTOM_MARGIN;


249
    if ((mbmi->ref_frame = (MV_REFERENCE_FRAME) vp8_read(bc, pbi->prob_intra)))
John Koleszar's avatar
John Koleszar committed
250
    {
251
        /* inter MB */
Scott LaVarnway's avatar
Scott LaVarnway committed
252
253
        int rct[4];
        vp8_prob mv_ref_p [VP8_MVREFS-1];
Scott LaVarnway's avatar
Scott LaVarnway committed
254
        int_mv nearest, nearby, best_mv;
John Koleszar's avatar
John Koleszar committed
255

Scott LaVarnway's avatar
Scott LaVarnway committed
256
        if (vp8_read(bc, pbi->prob_last))
John Koleszar's avatar
John Koleszar committed
257
        {
258
259
            mbmi->ref_frame = (MV_REFERENCE_FRAME)((int)mbmi->ref_frame +
                (int)(1 + vp8_read(bc, pbi->prob_gf)));
John Koleszar's avatar
John Koleszar committed
260
261
        }

262
263
        vp8_find_near_mvs(&pbi->mb, mi, &nearest, &nearby, &best_mv, rct,
                          mbmi->ref_frame, pbi->common.ref_frame_sign_bias);
John Koleszar's avatar
John Koleszar committed
264

Scott LaVarnway's avatar
Scott LaVarnway committed
265
        vp8_mv_ref_probs(mv_ref_p, rct);
John Koleszar's avatar
John Koleszar committed
266

Scott LaVarnway's avatar
Scott LaVarnway committed
267
268
        mbmi->uv_mode = DC_PRED;
        switch (mbmi->mode = read_mv_ref(bc, mv_ref_p))
John Koleszar's avatar
John Koleszar committed
269
        {
Scott LaVarnway's avatar
Scott LaVarnway committed
270
271
272
273
274
275
        case SPLITMV:
        {
            const int s = mbmi->partitioning =
                      vp8_treed_read(bc, vp8_mbsplit_tree, vp8_mbsplit_probs);
            const int num_p = vp8_mbsplit_count [s];
            int j = 0;
John Koleszar's avatar
John Koleszar committed
276

Scott LaVarnway's avatar
Scott LaVarnway committed
277
278
            do  /* for each subset j */
            {
Scott LaVarnway's avatar
Scott LaVarnway committed
279
                int_mv leftmv, abovemv;
Scott LaVarnway's avatar
Scott LaVarnway committed
280
                int_mv blockmv;
Scott LaVarnway's avatar
Scott LaVarnway committed
281
282
283
                int k;  /* first block in subset j */
                int mv_contz;
                k = vp8_mbsplit_offset[s][j];
John Koleszar's avatar
John Koleszar committed
284

Scott LaVarnway's avatar
Scott LaVarnway committed
285
286
                leftmv.as_int = left_block_mv(mi, k);
                abovemv.as_int = above_block_mv(mi, k, mis);
287
                mv_contz = vp8_mv_cont(&leftmv, &abovemv);
John Koleszar's avatar
John Koleszar committed
288

289
                switch (sub_mv_ref(bc, vp8_sub_mv_ref_prob2 [mv_contz]))
John Koleszar's avatar
John Koleszar committed
290
                {
Scott LaVarnway's avatar
Scott LaVarnway committed
291
                case NEW4X4:
Scott LaVarnway's avatar
Scott LaVarnway committed
292
293
294
                    read_mv(bc, &blockmv.as_mv, (const MV_CONTEXT *) mvc);
                    blockmv.as_mv.row += best_mv.as_mv.row;
                    blockmv.as_mv.col += best_mv.as_mv.col;
Scott LaVarnway's avatar
Scott LaVarnway committed
295
296
                    break;
                case LEFT4X4:
Scott LaVarnway's avatar
Scott LaVarnway committed
297
                    blockmv.as_int = leftmv.as_int;
Scott LaVarnway's avatar
Scott LaVarnway committed
298
299
                    break;
                case ABOVE4X4:
Scott LaVarnway's avatar
Scott LaVarnway committed
300
                    blockmv.as_int = abovemv.as_int;
Scott LaVarnway's avatar
Scott LaVarnway committed
301
302
                    break;
                case ZERO4X4:
Scott LaVarnway's avatar
Scott LaVarnway committed
303
                    blockmv.as_int = 0;
Scott LaVarnway's avatar
Scott LaVarnway committed
304
305
306
                    break;
                default:
                    break;
John Koleszar's avatar
John Koleszar committed
307
308
                }

Scott LaVarnway's avatar
Scott LaVarnway committed
309
                mbmi->need_to_clamp_mvs = vp8_check_mv_bounds(&blockmv,
Scott LaVarnway's avatar
Scott LaVarnway committed
310
311
312
313
                                                          mb_to_left_edge,
                                                          mb_to_right_edge,
                                                          mb_to_top_edge,
                                                          mb_to_bottom_edge);
John Koleszar's avatar
John Koleszar committed
314
315

                {
Scott LaVarnway's avatar
Scott LaVarnway committed
316
317
318
                    /* Fill (uniform) modes, mvs of jth subset.
                     Must do it here because ensuing subsets can
                     refer back to us via "left" or "above". */
319
320
                    const unsigned char *fill_offset;
                    unsigned int fill_count = mbsplit_fill_count[s];
John Koleszar's avatar
John Koleszar committed
321

322
323
                    fill_offset = &mbsplit_fill_offset[s]
                                     [(unsigned char)j * mbsplit_fill_count[s]];
John Koleszar's avatar
John Koleszar committed
324

Scott LaVarnway's avatar
Scott LaVarnway committed
325
                    do {
Scott LaVarnway's avatar
Scott LaVarnway committed
326
                        mi->bmi[ *fill_offset].mv.as_int = blockmv.as_int;
327
                        fill_offset++;
Scott LaVarnway's avatar
Scott LaVarnway committed
328
329
                    }while (--fill_count);
                }
John Koleszar's avatar
John Koleszar committed
330

Scott LaVarnway's avatar
Scott LaVarnway committed
331
332
333
            }
            while (++j < num_p);
        }
John Koleszar's avatar
John Koleszar committed
334

Scott LaVarnway's avatar
Scott LaVarnway committed
335
        mv->as_int = mi->bmi[15].mv.as_int;
Scott LaVarnway's avatar
Scott LaVarnway committed
336
337
338
339

        break;  /* done with SPLITMV */

        case NEARMV:
Scott LaVarnway's avatar
Scott LaVarnway committed
340
            mv->as_int = nearby.as_int;
341
            goto propagate_mv;
Scott LaVarnway's avatar
Scott LaVarnway committed
342
343

        case NEARESTMV:
Scott LaVarnway's avatar
Scott LaVarnway committed
344
            mv->as_int = nearest.as_int;
345
            goto propagate_mv;
Scott LaVarnway's avatar
Scott LaVarnway committed
346
347

        case ZEROMV:
Scott LaVarnway's avatar
Scott LaVarnway committed
348
            mv->as_int = 0;
349
            goto propagate_mv;
Scott LaVarnway's avatar
Scott LaVarnway committed
350
351

        case NEWMV:
Scott LaVarnway's avatar
Scott LaVarnway committed
352
353
354
            read_mv(bc, &mv->as_mv, (const MV_CONTEXT *) mvc);
            mv->as_mv.row += best_mv.as_mv.row;
            mv->as_mv.col += best_mv.as_mv.col;
Scott LaVarnway's avatar
Scott LaVarnway committed
355
356
357
358
359
360

            /* Don't need to check this on NEARMV and NEARESTMV modes
             * since those modes clamp the MV. The NEWMV mode does not,
             * so signal to the prediction stage whether special
             * handling may be required.
             */
Scott LaVarnway's avatar
Scott LaVarnway committed
361
362
363
364
365
            mbmi->need_to_clamp_mvs = vp8_check_mv_bounds(mv,
                                                      mb_to_left_edge,
                                                      mb_to_right_edge,
                                                      mb_to_top_edge,
                                                      mb_to_bottom_edge);
366

367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
        propagate_mv:  /* same MV throughout */
#if CONFIG_ERROR_CONCEALMENT
            if(pbi->ec_enabled)
            {
                mi->bmi[ 0].mv.as_int =
                mi->bmi[ 1].mv.as_int =
                mi->bmi[ 2].mv.as_int =
                mi->bmi[ 3].mv.as_int =
                mi->bmi[ 4].mv.as_int =
                mi->bmi[ 5].mv.as_int =
                mi->bmi[ 6].mv.as_int =
                mi->bmi[ 7].mv.as_int =
                mi->bmi[ 8].mv.as_int =
                mi->bmi[ 9].mv.as_int =
                mi->bmi[10].mv.as_int =
                mi->bmi[11].mv.as_int =
                mi->bmi[12].mv.as_int =
                mi->bmi[13].mv.as_int =
                mi->bmi[14].mv.as_int =
                mi->bmi[15].mv.as_int = mv->as_int;
            }
#endif
            break;
390
        default:
Scott LaVarnway's avatar
Scott LaVarnway committed
391
392
393
  #if CONFIG_DEBUG
            assert(0);
  #endif
394
            break;
Scott LaVarnway's avatar
Scott LaVarnway committed
395
396
397
398
        }
    }
    else
    {
Scott LaVarnway's avatar
Scott LaVarnway committed
399
400
        /* required for left and above block mv */
        mbmi->mv.as_int = 0;
John Koleszar's avatar
John Koleszar committed
401

Scott LaVarnway's avatar
Scott LaVarnway committed
402
        /* MB is intra coded */
403
        if ((mbmi->mode = read_ymode(bc, pbi->common.fc.ymode_prob)) == B_PRED)
Scott LaVarnway's avatar
Scott LaVarnway committed
404
        {
Scott LaVarnway's avatar
Scott LaVarnway committed
405
            int j = 0;
Scott LaVarnway's avatar
Scott LaVarnway committed
406
407
            do
            {
408
                mi->bmi[j].as_mode = read_bmode(bc, pbi->common.fc.bmode_prob);
Scott LaVarnway's avatar
Scott LaVarnway committed
409
410
411
            }
            while (++j < 16);
        }
John Koleszar's avatar
John Koleszar committed
412

413
        mbmi->uv_mode = read_uv_mode(bc, pbi->common.fc.uv_mode_prob);
Scott LaVarnway's avatar
Scott LaVarnway committed
414
    }
John Koleszar's avatar
John Koleszar committed
415

Scott LaVarnway's avatar
Scott LaVarnway committed
416
}
John Koleszar's avatar
John Koleszar committed
417

418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
static void read_mb_features(vp8_reader *r, MB_MODE_INFO *mi, MACROBLOCKD *x)
{
    /* Is segmentation enabled */
    if (x->segmentation_enabled && x->update_mb_segmentation_map)
    {
        /* If so then read the segment id. */
        if (vp8_read(r, x->mb_segment_tree_probs[0]))
            mi->segment_id =
                (unsigned char)(2 + vp8_read(r, x->mb_segment_tree_probs[2]));
        else
            mi->segment_id =
                (unsigned char)(vp8_read(r, x->mb_segment_tree_probs[1]));
    }
}

static void decode_mb_mode_mvs(VP8D_COMP *pbi, MODE_INFO *mi,
                               MB_MODE_INFO *mbmi, int mb_row, int mb_col)
{
    /* Read the Macroblock segmentation map if it is being updated explicitly
     * this frame (reset to 0 above by default)
     * By default on a key frame reset all MBs to segment 0
     */
    if (pbi->mb.update_mb_segmentation_map)
        read_mb_features(&pbi->bc, &mi->mbmi, &pbi->mb);
    else if(pbi->common.frame_type == KEY_FRAME)
        mi->mbmi.segment_id = 0;

    /* Read the macroblock coeff skip flag if this feature is in use,
     * else default to 0 */
    if (pbi->common.mb_no_coeff_skip)
        mi->mbmi.mb_skip_coeff = vp8_read(&pbi->bc, pbi->prob_skip_false);
    else
        mi->mbmi.mb_skip_coeff = 0;

    if(pbi->common.frame_type == KEY_FRAME)
        read_kf_modes(pbi, mi);
    else
        read_mb_modes_mv(pbi, mi, &mi->mbmi, mb_row, mb_col);

}

Scott LaVarnway's avatar
Scott LaVarnway committed
459
460
461
462
void vp8_decode_mode_mvs(VP8D_COMP *pbi)
{
    MODE_INFO *mi = pbi->common.mi;
    int mb_row = -1;
John Koleszar's avatar
John Koleszar committed
463

464
    mb_mode_mv_init(pbi);
John Koleszar's avatar
John Koleszar committed
465

Scott LaVarnway's avatar
Scott LaVarnway committed
466
467
468
    while (++mb_row < pbi->common.mb_rows)
    {
        int mb_col = -1;
John Koleszar's avatar
John Koleszar committed
469

470
        pbi->mb.mb_to_top_edge =  -((mb_row * 16)) << 3;
Scott LaVarnway's avatar
Scott LaVarnway committed
471
        pbi->mb.mb_to_bottom_edge =
472
            ((pbi->common.mb_rows - 1 - mb_row) * 16) << 3;
John Koleszar's avatar
John Koleszar committed
473

Scott LaVarnway's avatar
Scott LaVarnway committed
474
475
        while (++mb_col < pbi->common.mb_cols)
        {
476
#if CONFIG_ERROR_CONCEALMENT
477
            int mb_num = mb_row * pbi->common.mb_cols + mb_col;
478
#endif
479
480

            decode_mb_mode_mvs(pbi, mi, &mi->mbmi, mb_row, mb_col);
John Koleszar's avatar
John Koleszar committed
481

482
483
484
485
486
487
488
489
490
491
492
493
494
#if CONFIG_ERROR_CONCEALMENT
            /* look for corruption. set mvs_corrupt_from_mb to the current
             * mb_num if the frame is corrupt from this macroblock. */
            if (vp8dx_bool_error(&pbi->bc) && mb_num < pbi->mvs_corrupt_from_mb)
            {
                pbi->mvs_corrupt_from_mb = mb_num;
                /* no need to continue since the partition is corrupt from
                 * here on.
                 */
                return;
            }
#endif

495
            mi++;       /* next macroblock */
John Koleszar's avatar
John Koleszar committed
496
497
        }

498
        mi++;           /* skip left predictor each row */
John Koleszar's avatar
John Koleszar committed
499
500
    }
}
Scott LaVarnway's avatar
Scott LaVarnway committed
501