decodemv.c 16.8 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
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
            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
                {
                    const B_PREDICTION_MODE A = vp8_above_bmi(m, i, mis)->mode;
                    const B_PREDICTION_MODE L = vp8_left_bmi(m, i)->mode;

                    m->bmi[i].mode = (B_PREDICTION_MODE) vp8_read_bmode(bc, pbi->common.kf_bmode_prob [A] [L]);
                }
                while (++i < 16);
            }
            else
            {
                int BMode;
                int i = 0;

                switch (y_mode)
                {
                case DC_PRED:
                    BMode = B_DC_PRED;
                    break;
                case V_PRED:
                    BMode = B_VE_PRED;
                    break;
                case H_PRED:
                    BMode = B_HE_PRED;
                    break;
                case TM_PRED:
                    BMode = B_TM_PRED;
                    break;
                default:
                    BMode = B_DC_PRED;
                    break;
                }

                do
                {
                    m->bmi[i].mode = (B_PREDICTION_MODE)BMode;
                }
                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
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
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218

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

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

    return (MB_PREDICTION_MODE)i;
}
Scott LaVarnway's avatar
Scott LaVarnway committed
219
220

#ifdef VPX_MODE_COUNT
John Koleszar's avatar
John Koleszar committed
221
222
223
224
225
226
227
228
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
229
#endif
John Koleszar's avatar
John Koleszar committed
230

231
232
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
233
234
235
236
237
    { 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
238
239
240
241




242
static void mb_mode_mv_init(VP8D_COMP *pbi)
Scott LaVarnway's avatar
Scott LaVarnway committed
243
244
245
{
    vp8_reader *const bc = & pbi->bc;
    MV_CONTEXT *const mvc = pbi->common.fc.mvc;
John Koleszar's avatar
John Koleszar committed
246

247
248
249
250
251
252
#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
253
254
255
    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
256

Scott LaVarnway's avatar
Scott LaVarnway committed
257
258
259
260
261
    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
262

Scott LaVarnway's avatar
Scott LaVarnway committed
263
264
265
        if (vp8_read_bit(bc))
        {
            int i = 0;
John Koleszar's avatar
John Koleszar committed
266

Scott LaVarnway's avatar
Scott LaVarnway committed
267
268
269
270
271
272
            do
            {
                pbi->common.fc.ymode_prob[i] = (vp8_prob) vp8_read_literal(bc, 8);
            }
            while (++i < 4);
        }
John Koleszar's avatar
John Koleszar committed
273

Scott LaVarnway's avatar
Scott LaVarnway committed
274
        if (vp8_read_bit(bc))
John Koleszar's avatar
John Koleszar committed
275
        {
Scott LaVarnway's avatar
Scott LaVarnway committed
276
277
278
279
280
281
282
            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
283
        }
Scott LaVarnway's avatar
Scott LaVarnway committed
284
285

        read_mvcontexts(bc, mvc);
John Koleszar's avatar
John Koleszar committed
286
    }
Scott LaVarnway's avatar
Scott LaVarnway committed
287
}
John Koleszar's avatar
John Koleszar committed
288

289

290
static void read_mb_modes_mv(VP8D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi,
Scott LaVarnway's avatar
Scott LaVarnway committed
291
292
293
294
295
296
                            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
297
    int_mv *const mv = & mbmi->mv;
Scott LaVarnway's avatar
Scott LaVarnway committed
298
299
300
301
302
303
304
305
306
307
308
    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;
309
310
311
    /* 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
312
313
314
315
316
317
318
319
    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;

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

324
    /* Read the macroblock coeff skip flag if this feature is in use, else default to 0 */
Scott LaVarnway's avatar
Scott LaVarnway committed
325
326
327
328
329
330
    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
331
    {
Scott LaVarnway's avatar
Scott LaVarnway committed
332
333
        int rct[4];
        vp8_prob mv_ref_p [VP8_MVREFS-1];
Scott LaVarnway's avatar
Scott LaVarnway committed
334
        int_mv nearest, nearby, best_mv;
John Koleszar's avatar
John Koleszar committed
335

Scott LaVarnway's avatar
Scott LaVarnway committed
336
        if (vp8_read(bc, pbi->prob_last))
John Koleszar's avatar
John Koleszar committed
337
        {
Scott LaVarnway's avatar
Scott LaVarnway committed
338
            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
339
340
        }

Scott LaVarnway's avatar
Scott LaVarnway committed
341
        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
342

Scott LaVarnway's avatar
Scott LaVarnway committed
343
        vp8_mv_ref_probs(mv_ref_p, rct);
John Koleszar's avatar
John Koleszar committed
344

Scott LaVarnway's avatar
Scott LaVarnway committed
345
346
        mbmi->uv_mode = DC_PRED;
        switch (mbmi->mode = read_mv_ref(bc, mv_ref_p))
John Koleszar's avatar
John Koleszar committed
347
        {
Scott LaVarnway's avatar
Scott LaVarnway committed
348
349
350
351
352
353
        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
354

Scott LaVarnway's avatar
Scott LaVarnway committed
355
356
357
358
359
360
            do  /* for each subset j */
            {
                B_MODE_INFO bmi;
                int k;  /* first block in subset j */
                int mv_contz;
                k = vp8_mbsplit_offset[s][j];
John Koleszar's avatar
John Koleszar committed
361

Scott LaVarnway's avatar
Scott LaVarnway committed
362
                mv_contz = vp8_mv_cont(&(vp8_left_bmi(mi, k)->mv.as_mv), &(vp8_above_bmi(mi, k, mis)->mv.as_mv));
John Koleszar's avatar
John Koleszar committed
363

364
                switch (bmi.mode = (B_PREDICTION_MODE) sub_mv_ref(bc, vp8_sub_mv_ref_prob2 [mv_contz])) /*pc->fc.sub_mv_ref_prob))*/
John Koleszar's avatar
John Koleszar committed
365
                {
Scott LaVarnway's avatar
Scott LaVarnway committed
366
                case NEW4X4:
Scott LaVarnway's avatar
Scott LaVarnway committed
367
368
369
                    read_mv(bc, &bmi.mv.as_mv, (const MV_CONTEXT *) mvc);
                    bmi.mv.as_mv.row += best_mv.as_mv.row;
                    bmi.mv.as_mv.col += best_mv.as_mv.col;
Scott LaVarnway's avatar
Scott LaVarnway committed
370
371
372
373
374
  #ifdef VPX_MODE_COUNT
                    vp8_mv_cont_count[mv_contz][3]++;
  #endif
                    break;
                case LEFT4X4:
Scott LaVarnway's avatar
Scott LaVarnway committed
375
                    bmi.mv.as_int = vp8_left_bmi(mi, k)->mv.as_int;
Scott LaVarnway's avatar
Scott LaVarnway committed
376
377
378
379
380
  #ifdef VPX_MODE_COUNT
                    vp8_mv_cont_count[mv_contz][0]++;
  #endif
                    break;
                case ABOVE4X4:
Scott LaVarnway's avatar
Scott LaVarnway committed
381
                    bmi.mv.as_int = vp8_above_bmi(mi, k, mis)->mv.as_int;
Scott LaVarnway's avatar
Scott LaVarnway committed
382
383
384
385
386
  #ifdef VPX_MODE_COUNT
                    vp8_mv_cont_count[mv_contz][1]++;
  #endif
                    break;
                case ZERO4X4:
Scott LaVarnway's avatar
Scott LaVarnway committed
387
                    bmi.mv.as_int = 0;
Scott LaVarnway's avatar
Scott LaVarnway committed
388
389
390
391
392
393
  #ifdef VPX_MODE_COUNT
                    vp8_mv_cont_count[mv_contz][2]++;
  #endif
                    break;
                default:
                    break;
John Koleszar's avatar
John Koleszar committed
394
395
                }

Scott LaVarnway's avatar
Scott LaVarnway committed
396
397
398
399
400
                mbmi->need_to_clamp_mvs = vp8_check_mv_bounds(&bmi.mv,
                                                          mb_to_left_edge,
                                                          mb_to_right_edge,
                                                          mb_to_top_edge,
                                                          mb_to_bottom_edge);
John Koleszar's avatar
John Koleszar committed
401
402

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

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

Scott LaVarnway's avatar
Scott LaVarnway committed
411
412
                    do {
                        mi->bmi[ *fill_offset] = bmi;
413
                        fill_offset++;
John Koleszar's avatar
John Koleszar committed
414

Scott LaVarnway's avatar
Scott LaVarnway committed
415
416
                    }while (--fill_count);
                }
John Koleszar's avatar
John Koleszar committed
417

Scott LaVarnway's avatar
Scott LaVarnway committed
418
419
420
            }
            while (++j < num_p);
        }
John Koleszar's avatar
John Koleszar committed
421

Scott LaVarnway's avatar
Scott LaVarnway committed
422
        mv->as_int = mi->bmi[15].mv.as_int;
Scott LaVarnway's avatar
Scott LaVarnway committed
423
424
425
426

        break;  /* done with SPLITMV */

        case NEARMV:
Scott LaVarnway's avatar
Scott LaVarnway committed
427
            mv->as_int = nearby.as_int;
428
            /* Clip "next_nearest" so that it does not extend to far out of image */
Scott LaVarnway's avatar
Scott LaVarnway committed
429
430
            vp8_clamp_mv(mv, mb_to_left_edge, mb_to_right_edge,
                         mb_to_top_edge, mb_to_bottom_edge);
Scott LaVarnway's avatar
Scott LaVarnway committed
431
432
433
            goto propagate_mv;

        case NEARESTMV:
Scott LaVarnway's avatar
Scott LaVarnway committed
434
            mv->as_int = nearest.as_int;
435
            /* Clip "next_nearest" so that it does not extend to far out of image */
Scott LaVarnway's avatar
Scott LaVarnway committed
436
437
            vp8_clamp_mv(mv, mb_to_left_edge, mb_to_right_edge,
                         mb_to_top_edge, mb_to_bottom_edge);
Scott LaVarnway's avatar
Scott LaVarnway committed
438
439
440
            goto propagate_mv;

        case ZEROMV:
Scott LaVarnway's avatar
Scott LaVarnway committed
441
            mv->as_int = 0;
Scott LaVarnway's avatar
Scott LaVarnway committed
442
443
444
            goto propagate_mv;

        case NEWMV:
Scott LaVarnway's avatar
Scott LaVarnway committed
445
446
447
            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
448
449
450
451
452
453

            /* 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
454
455
456
457
458
            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);
Scott LaVarnway's avatar
Scott LaVarnway committed
459
460
461

        propagate_mv:  /* same MV throughout */
            {
Scott LaVarnway's avatar
Scott LaVarnway committed
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
                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;
Scott LaVarnway's avatar
Scott LaVarnway committed
478
479
480
481
482
483
484
485
486
487
488
489
490
491
            }
            break;
        default:;
  #if CONFIG_DEBUG
            assert(0);
  #endif
        }
    }
    else
    {
        /* MB is intra coded */
        int j = 0;
        do
        {
Scott LaVarnway's avatar
Scott LaVarnway committed
492
            mi->bmi[j].mv.as_int = 0;
Scott LaVarnway's avatar
Scott LaVarnway committed
493
494
        }
        while (++j < 16);
John Koleszar's avatar
John Koleszar committed
495

Scott LaVarnway's avatar
Scott LaVarnway committed
496
497
498
499
500
501
502
503
504
        if ((mbmi->mode = (MB_PREDICTION_MODE) vp8_read_ymode(bc, pbi->common.fc.ymode_prob)) == B_PRED)
        {
            j = 0;
            do
            {
                mi->bmi[j].mode = (B_PREDICTION_MODE)vp8_read_bmode(bc, pbi->common.fc.bmode_prob);
            }
            while (++j < 16);
        }
John Koleszar's avatar
John Koleszar committed
505

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

Scott LaVarnway's avatar
Scott LaVarnway committed
509
}
John Koleszar's avatar
John Koleszar committed
510

Scott LaVarnway's avatar
Scott LaVarnway committed
511
512
513
514
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
515

516
    mb_mode_mv_init(pbi);
John Koleszar's avatar
John Koleszar committed
517

Scott LaVarnway's avatar
Scott LaVarnway committed
518
519
520
521
522
    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
523

Scott LaVarnway's avatar
Scott LaVarnway committed
524
525
526
        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
527

Scott LaVarnway's avatar
Scott LaVarnway committed
528
529
530
        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
531

Scott LaVarnway's avatar
Scott LaVarnway committed
532
533
        while (++mb_col < pbi->common.mb_cols)
        {
534
            int mb_num = mb_row * pbi->common.mb_cols + mb_col;
535
            /*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
536
537
            if(pbi->common.frame_type == KEY_FRAME)
                vp8_kfread_modes(pbi, mi, mb_row, mb_col);
John Koleszar's avatar
John Koleszar committed
538
            else
539
                read_mb_modes_mv(pbi, mi, &mi->mbmi, mb_row, mb_col);
John Koleszar's avatar
John Koleszar committed
540

541
542
543
544
545
546
547
548
549
550
551
552
553
#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

554
            mi++;       /* next macroblock */
John Koleszar's avatar
John Koleszar committed
555
556
        }

557
        mi++;           /* skip left predictor each row */
John Koleszar's avatar
John Koleszar committed
558
559
    }
}
Scott LaVarnway's avatar
Scott LaVarnway committed
560