decodemv.c 16.1 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
Scott LaVarnway's avatar
Scott LaVarnway committed
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
static int vp8_read_bmode(vp8_reader *bc, const vp8_prob *p)
{
    const int i = vp8_treed_read(bc, vp8_bmode_tree, p);

    return i;
}


static int vp8_read_ymode(vp8_reader *bc, const vp8_prob *p)
{
    const int i = vp8_treed_read(bc, vp8_ymode_tree, p);

    return i;
}

static int vp8_kfread_ymode(vp8_reader *bc, const vp8_prob *p)
{
    const int i = vp8_treed_read(bc, vp8_kf_ymode_tree, p);

    return i;
}



static int vp8_read_uv_mode(vp8_reader *bc, const vp8_prob *p)
{
    const int i = vp8_treed_read(bc, vp8_uv_mode_tree, p);

    return i;
}

static void vp8_read_mb_features(vp8_reader *r, MB_MODE_INFO *mi, MACROBLOCKD *x)
{
54
    /* Is segmentation enabled */
Scott LaVarnway's avatar
Scott LaVarnway committed
55
56
    if (x->segmentation_enabled && x->update_mb_segmentation_map)
    {
57
        /* If so then read the segment id. */
Scott LaVarnway's avatar
Scott LaVarnway committed
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
        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 vp8_kfread_modes(VP8D_COMP *pbi, MODE_INFO *m, int mb_row, int mb_col)
{
    vp8_reader *const bc = & pbi->bc;
    const int mis = pbi->common.mode_info_stride;

        {
            MB_PREDICTION_MODE y_mode;

73
74
75
            /* 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
             */
Scott LaVarnway's avatar
Scott LaVarnway committed
76
77
78
79
80
            m->mbmi.segment_id = 0;

            if (pbi->mb.update_mb_segmentation_map)
                vp8_read_mb_features(bc, &m->mbmi, &pbi->mb);

81
            /* Read the macroblock coeff skip flag if this feature is in use, else default to 0 */
Scott LaVarnway's avatar
Scott LaVarnway committed
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
            if (pbi->common.mb_no_coeff_skip)
                m->mbmi.mb_skip_coeff = vp8_read(bc, pbi->prob_skip_false);
            else
                m->mbmi.mb_skip_coeff = 0;

            y_mode = (MB_PREDICTION_MODE) vp8_kfread_ymode(bc, pbi->common.kf_ymode_prob);

            m->mbmi.ref_frame = INTRA_FRAME;

            if ((m->mbmi.mode = y_mode) == B_PRED)
            {
                int i = 0;

                do
                {
Scott LaVarnway's avatar
Scott LaVarnway committed
97
98
                    const B_PREDICTION_MODE A = above_block_mode(m, i, mis);
                    const B_PREDICTION_MODE L = left_block_mode(m, i);
Scott LaVarnway's avatar
Scott LaVarnway committed
99

Scott LaVarnway's avatar
Scott LaVarnway committed
100
                    m->bmi[i].as_mode = (B_PREDICTION_MODE) vp8_read_bmode(bc, pbi->common.kf_bmode_prob [A] [L]);
Scott LaVarnway's avatar
Scott LaVarnway committed
101
102
103
104
105
106
107
                }
                while (++i < 16);
            }

            m->mbmi.uv_mode = (MB_PREDICTION_MODE)vp8_read_uv_mode(bc, pbi->common.kf_uv_mode_prob);
        }
}
John Koleszar's avatar
John Koleszar committed
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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182

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;
}

183
static B_PREDICTION_MODE sub_mv_ref(vp8_reader *bc, const vp8_prob *p)
John Koleszar's avatar
John Koleszar committed
184
185
186
{
    const int i = vp8_treed_read(bc, vp8_sub_mv_ref_tree, p);

187
    return (B_PREDICTION_MODE)i;
John Koleszar's avatar
John Koleszar committed
188
}
Scott LaVarnway's avatar
Scott LaVarnway committed
189
190

#ifdef VPX_MODE_COUNT
John Koleszar's avatar
John Koleszar committed
191
192
193
194
195
196
197
198
unsigned int vp8_mv_cont_count[5][4] =
{
    { 0, 0, 0, 0 },
    { 0, 0, 0, 0 },
    { 0, 0, 0, 0 },
    { 0, 0, 0, 0 },
    { 0, 0, 0, 0 }
};
Scott LaVarnway's avatar
Scott LaVarnway committed
199
#endif
John Koleszar's avatar
John Koleszar committed
200

201
202
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
203
204
205
206
207
    { 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
208
209
210
211




212
static void mb_mode_mv_init(VP8D_COMP *pbi)
Scott LaVarnway's avatar
Scott LaVarnway committed
213
214
215
{
    vp8_reader *const bc = & pbi->bc;
    MV_CONTEXT *const mvc = pbi->common.fc.mvc;
John Koleszar's avatar
John Koleszar committed
216

217
218
219
220
221
222
#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
223
224
225
    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
226

Scott LaVarnway's avatar
Scott LaVarnway committed
227
228
229
230
231
    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
232

Scott LaVarnway's avatar
Scott LaVarnway committed
233
234
235
        if (vp8_read_bit(bc))
        {
            int i = 0;
John Koleszar's avatar
John Koleszar committed
236

Scott LaVarnway's avatar
Scott LaVarnway committed
237
238
239
240
241
242
            do
            {
                pbi->common.fc.ymode_prob[i] = (vp8_prob) vp8_read_literal(bc, 8);
            }
            while (++i < 4);
        }
John Koleszar's avatar
John Koleszar committed
243

Scott LaVarnway's avatar
Scott LaVarnway committed
244
        if (vp8_read_bit(bc))
John Koleszar's avatar
John Koleszar committed
245
        {
Scott LaVarnway's avatar
Scott LaVarnway committed
246
247
248
249
250
251
252
            int i = 0;

            do
            {
                pbi->common.fc.uv_mode_prob[i] = (vp8_prob) vp8_read_literal(bc, 8);
            }
            while (++i < 3);
John Koleszar's avatar
John Koleszar committed
253
        }
Scott LaVarnway's avatar
Scott LaVarnway committed
254
255

        read_mvcontexts(bc, mvc);
John Koleszar's avatar
John Koleszar committed
256
    }
Scott LaVarnway's avatar
Scott LaVarnway committed
257
}
John Koleszar's avatar
John Koleszar committed
258

259

260
static void read_mb_modes_mv(VP8D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi,
Scott LaVarnway's avatar
Scott LaVarnway committed
261
262
263
264
265
266
                            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
267
    int_mv *const mv = & mbmi->mv;
Scott LaVarnway's avatar
Scott LaVarnway committed
268
269
270
271
272
273
274
275
276
277
278
    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;
279
280
281
    /* Distance of Mb to the various image edges.
     * These specified to 8th pel as they are always compared to MV values that are in 1/8th pel units
     */
Scott LaVarnway's avatar
Scott LaVarnway committed
282
283
284
285
286
287
288
289
    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;

290
    /* If required read in new segmentation data for this MB */
Scott LaVarnway's avatar
Scott LaVarnway committed
291
292
293
    if (pbi->mb.update_mb_segmentation_map)
        vp8_read_mb_features(bc, mbmi, &pbi->mb);

294
    /* Read the macroblock coeff skip flag if this feature is in use, else default to 0 */
Scott LaVarnway's avatar
Scott LaVarnway committed
295
296
297
298
299
300
    if (pbi->common.mb_no_coeff_skip)
        mbmi->mb_skip_coeff = vp8_read(bc, pbi->prob_skip_false);
    else
        mbmi->mb_skip_coeff = 0;

    if ((mbmi->ref_frame = (MV_REFERENCE_FRAME) vp8_read(bc, pbi->prob_intra)))    /* inter MB */
John Koleszar's avatar
John Koleszar committed
301
    {
Scott LaVarnway's avatar
Scott LaVarnway committed
302
303
        int rct[4];
        vp8_prob mv_ref_p [VP8_MVREFS-1];
Scott LaVarnway's avatar
Scott LaVarnway committed
304
        int_mv nearest, nearby, best_mv;
John Koleszar's avatar
John Koleszar committed
305

Scott LaVarnway's avatar
Scott LaVarnway committed
306
        if (vp8_read(bc, pbi->prob_last))
John Koleszar's avatar
John Koleszar committed
307
        {
Scott LaVarnway's avatar
Scott LaVarnway committed
308
            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
309
310
        }

Scott LaVarnway's avatar
Scott LaVarnway committed
311
        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
312

Scott LaVarnway's avatar
Scott LaVarnway committed
313
        vp8_mv_ref_probs(mv_ref_p, rct);
John Koleszar's avatar
John Koleszar committed
314

Scott LaVarnway's avatar
Scott LaVarnway committed
315
316
        mbmi->uv_mode = DC_PRED;
        switch (mbmi->mode = read_mv_ref(bc, mv_ref_p))
John Koleszar's avatar
John Koleszar committed
317
        {
Scott LaVarnway's avatar
Scott LaVarnway committed
318
319
320
321
322
323
        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
324

Scott LaVarnway's avatar
Scott LaVarnway committed
325
326
            do  /* for each subset j */
            {
Scott LaVarnway's avatar
Scott LaVarnway committed
327
                int_mv leftmv, abovemv;
Scott LaVarnway's avatar
Scott LaVarnway committed
328
                int_mv blockmv;
Scott LaVarnway's avatar
Scott LaVarnway committed
329
330
331
                int k;  /* first block in subset j */
                int mv_contz;
                k = vp8_mbsplit_offset[s][j];
John Koleszar's avatar
John Koleszar committed
332

Scott LaVarnway's avatar
Scott LaVarnway committed
333
334
                leftmv.as_int = left_block_mv(mi, k);
                abovemv.as_int = above_block_mv(mi, k, mis);
335
                mv_contz = vp8_mv_cont(&leftmv, &abovemv);
John Koleszar's avatar
John Koleszar committed
336

337
                switch (sub_mv_ref(bc, vp8_sub_mv_ref_prob2 [mv_contz])) /*pc->fc.sub_mv_ref_prob))*/
John Koleszar's avatar
John Koleszar committed
338
                {
Scott LaVarnway's avatar
Scott LaVarnway committed
339
                case NEW4X4:
Scott LaVarnway's avatar
Scott LaVarnway committed
340
341
342
                    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
343
344
345
346
347
  #ifdef VPX_MODE_COUNT
                    vp8_mv_cont_count[mv_contz][3]++;
  #endif
                    break;
                case LEFT4X4:
Scott LaVarnway's avatar
Scott LaVarnway committed
348
                    blockmv.as_int = leftmv.as_int;
Scott LaVarnway's avatar
Scott LaVarnway committed
349
350
351
352
353
  #ifdef VPX_MODE_COUNT
                    vp8_mv_cont_count[mv_contz][0]++;
  #endif
                    break;
                case ABOVE4X4:
Scott LaVarnway's avatar
Scott LaVarnway committed
354
                    blockmv.as_int = abovemv.as_int;
Scott LaVarnway's avatar
Scott LaVarnway committed
355
356
357
358
359
  #ifdef VPX_MODE_COUNT
                    vp8_mv_cont_count[mv_contz][1]++;
  #endif
                    break;
                case ZERO4X4:
Scott LaVarnway's avatar
Scott LaVarnway committed
360
                    blockmv.as_int = 0;
Scott LaVarnway's avatar
Scott LaVarnway committed
361
362
363
364
365
366
  #ifdef VPX_MODE_COUNT
                    vp8_mv_cont_count[mv_contz][2]++;
  #endif
                    break;
                default:
                    break;
John Koleszar's avatar
John Koleszar committed
367
368
                }

Scott LaVarnway's avatar
Scott LaVarnway committed
369
                mbmi->need_to_clamp_mvs = vp8_check_mv_bounds(&blockmv,
Scott LaVarnway's avatar
Scott LaVarnway committed
370
371
372
373
                                                          mb_to_left_edge,
                                                          mb_to_right_edge,
                                                          mb_to_top_edge,
                                                          mb_to_bottom_edge);
John Koleszar's avatar
John Koleszar committed
374
375

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

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

Scott LaVarnway's avatar
Scott LaVarnway committed
384
                    do {
Scott LaVarnway's avatar
Scott LaVarnway committed
385
                        mi->bmi[ *fill_offset].mv.as_int = blockmv.as_int;
386
                        fill_offset++;
Scott LaVarnway's avatar
Scott LaVarnway committed
387
388
                    }while (--fill_count);
                }
John Koleszar's avatar
John Koleszar committed
389

Scott LaVarnway's avatar
Scott LaVarnway committed
390
391
392
            }
            while (++j < num_p);
        }
John Koleszar's avatar
John Koleszar committed
393

Scott LaVarnway's avatar
Scott LaVarnway committed
394
        mv->as_int = mi->bmi[15].mv.as_int;
Scott LaVarnway's avatar
Scott LaVarnway committed
395
396
397
398

        break;  /* done with SPLITMV */

        case NEARMV:
Scott LaVarnway's avatar
Scott LaVarnway committed
399
            mv->as_int = nearby.as_int;
400
            /* Clip "next_nearest" so that it does not extend to far out of image */
Scott LaVarnway's avatar
Scott LaVarnway committed
401
402
            vp8_clamp_mv(mv, mb_to_left_edge, mb_to_right_edge,
                         mb_to_top_edge, mb_to_bottom_edge);
403
            goto propagate_mv;
Scott LaVarnway's avatar
Scott LaVarnway committed
404
405

        case NEARESTMV:
Scott LaVarnway's avatar
Scott LaVarnway committed
406
            mv->as_int = nearest.as_int;
407
            /* Clip "next_nearest" so that it does not extend to far out of image */
Scott LaVarnway's avatar
Scott LaVarnway committed
408
409
            vp8_clamp_mv(mv, mb_to_left_edge, mb_to_right_edge,
                         mb_to_top_edge, mb_to_bottom_edge);
410
            goto propagate_mv;
Scott LaVarnway's avatar
Scott LaVarnway committed
411
412

        case ZEROMV:
Scott LaVarnway's avatar
Scott LaVarnway committed
413
            mv->as_int = 0;
414
            goto propagate_mv;
Scott LaVarnway's avatar
Scott LaVarnway committed
415
416

        case NEWMV:
Scott LaVarnway's avatar
Scott LaVarnway committed
417
418
419
            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
420
421
422
423
424
425

            /* 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
426
427
428
429
430
            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);
431

432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
        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;
Scott LaVarnway's avatar
Scott LaVarnway committed
455
456
457
458
459
460
461
462
        default:;
  #if CONFIG_DEBUG
            assert(0);
  #endif
        }
    }
    else
    {
Scott LaVarnway's avatar
Scott LaVarnway committed
463
464
        /* required for left and above block mv */
        mbmi->mv.as_int = 0;
John Koleszar's avatar
John Koleszar committed
465

Scott LaVarnway's avatar
Scott LaVarnway committed
466
        /* MB is intra coded */
Scott LaVarnway's avatar
Scott LaVarnway committed
467
468
        if ((mbmi->mode = (MB_PREDICTION_MODE) vp8_read_ymode(bc, pbi->common.fc.ymode_prob)) == B_PRED)
        {
Scott LaVarnway's avatar
Scott LaVarnway committed
469
            int j = 0;
Scott LaVarnway's avatar
Scott LaVarnway committed
470
471
            do
            {
Scott LaVarnway's avatar
Scott LaVarnway committed
472
                mi->bmi[j].as_mode = (B_PREDICTION_MODE)vp8_read_bmode(bc, pbi->common.fc.bmode_prob);
Scott LaVarnway's avatar
Scott LaVarnway committed
473
474
475
            }
            while (++j < 16);
        }
John Koleszar's avatar
John Koleszar committed
476

Scott LaVarnway's avatar
Scott LaVarnway committed
477
478
        mbmi->uv_mode = (MB_PREDICTION_MODE)vp8_read_uv_mode(bc, pbi->common.fc.uv_mode_prob);
    }
John Koleszar's avatar
John Koleszar committed
479

Scott LaVarnway's avatar
Scott LaVarnway committed
480
}
John Koleszar's avatar
John Koleszar committed
481

Scott LaVarnway's avatar
Scott LaVarnway committed
482
483
484
485
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
486

487
    mb_mode_mv_init(pbi);
John Koleszar's avatar
John Koleszar committed
488

Scott LaVarnway's avatar
Scott LaVarnway committed
489
490
491
492
493
    while (++mb_row < pbi->common.mb_rows)
    {
        int mb_col = -1;
        int mb_to_top_edge;
        int mb_to_bottom_edge;
John Koleszar's avatar
John Koleszar committed
494

Scott LaVarnway's avatar
Scott LaVarnway committed
495
496
497
        pbi->mb.mb_to_top_edge =
        mb_to_top_edge = -((mb_row * 16)) << 3;
        mb_to_top_edge -= LEFT_TOP_MARGIN;
John Koleszar's avatar
John Koleszar committed
498

Scott LaVarnway's avatar
Scott LaVarnway committed
499
500
501
        pbi->mb.mb_to_bottom_edge =
        mb_to_bottom_edge = ((pbi->common.mb_rows - 1 - mb_row) * 16) << 3;
        mb_to_bottom_edge += RIGHT_BOTTOM_MARGIN;
John Koleszar's avatar
John Koleszar committed
502

Scott LaVarnway's avatar
Scott LaVarnway committed
503
504
        while (++mb_col < pbi->common.mb_cols)
        {
505
#if CONFIG_ERROR_CONCEALMENT
506
            int mb_num = mb_row * pbi->common.mb_cols + mb_col;
507
#endif
508
            /*read_mb_modes_mv(pbi, xd->mode_info_context, &xd->mode_info_context->mbmi, mb_row, mb_col);*/
Scott LaVarnway's avatar
Scott LaVarnway committed
509
510
            if(pbi->common.frame_type == KEY_FRAME)
                vp8_kfread_modes(pbi, mi, mb_row, mb_col);
John Koleszar's avatar
John Koleszar committed
511
            else
512
                read_mb_modes_mv(pbi, mi, &mi->mbmi, mb_row, mb_col);
John Koleszar's avatar
John Koleszar committed
513

514
515
516
517
518
519
520
521
522
523
524
525
526
#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

527
            mi++;       /* next macroblock */
John Koleszar's avatar
John Koleszar committed
528
529
        }

530
        mi++;           /* skip left predictor each row */
John Koleszar's avatar
John Koleszar committed
531
532
    }
}
Scott LaVarnway's avatar
Scott LaVarnway committed
533