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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
                }
                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
                {
Scott LaVarnway's avatar
Scott LaVarnway committed
130
                    m->bmi[i].as_mode = (B_PREDICTION_MODE)BMode;
Scott LaVarnway's avatar
Scott LaVarnway committed
131
132
133
134
135
136
137
                }
                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
            do  /* for each subset j */
            {
Scott LaVarnway's avatar
Scott LaVarnway committed
357
                int_mv leftmv, abovemv;
Scott LaVarnway's avatar
Scott LaVarnway committed
358
                int_mv blockmv;
Scott LaVarnway's avatar
Scott LaVarnway committed
359
360
361
                int k;  /* first block in subset j */
                int mv_contz;
                k = vp8_mbsplit_offset[s][j];
John Koleszar's avatar
John Koleszar committed
362

Scott LaVarnway's avatar
Scott LaVarnway committed
363
364
                leftmv.as_int = left_block_mv(mi, k);
                abovemv.as_int = above_block_mv(mi, k, mis);
365
                mv_contz = vp8_mv_cont(&leftmv, &abovemv);
John Koleszar's avatar
John Koleszar committed
366

Scott LaVarnway's avatar
Scott LaVarnway committed
367
                switch ((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
368
                {
Scott LaVarnway's avatar
Scott LaVarnway committed
369
                case NEW4X4:
Scott LaVarnway's avatar
Scott LaVarnway committed
370
371
372
                    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
373
374
375
376
377
  #ifdef VPX_MODE_COUNT
                    vp8_mv_cont_count[mv_contz][3]++;
  #endif
                    break;
                case LEFT4X4:
Scott LaVarnway's avatar
Scott LaVarnway committed
378
                    blockmv.as_int = leftmv.as_int;
Scott LaVarnway's avatar
Scott LaVarnway committed
379
380
381
382
383
  #ifdef VPX_MODE_COUNT
                    vp8_mv_cont_count[mv_contz][0]++;
  #endif
                    break;
                case ABOVE4X4:
Scott LaVarnway's avatar
Scott LaVarnway committed
384
                    blockmv.as_int = abovemv.as_int;
Scott LaVarnway's avatar
Scott LaVarnway committed
385
386
387
388
389
  #ifdef VPX_MODE_COUNT
                    vp8_mv_cont_count[mv_contz][1]++;
  #endif
                    break;
                case ZERO4X4:
Scott LaVarnway's avatar
Scott LaVarnway committed
390
                    blockmv.as_int = 0;
Scott LaVarnway's avatar
Scott LaVarnway committed
391
392
393
394
395
396
  #ifdef VPX_MODE_COUNT
                    vp8_mv_cont_count[mv_contz][2]++;
  #endif
                    break;
                default:
                    break;
John Koleszar's avatar
John Koleszar committed
397
398
                }

Scott LaVarnway's avatar
Scott LaVarnway committed
399
                mbmi->need_to_clamp_mvs = vp8_check_mv_bounds(&blockmv,
Scott LaVarnway's avatar
Scott LaVarnway committed
400
401
402
403
                                                          mb_to_left_edge,
                                                          mb_to_right_edge,
                                                          mb_to_top_edge,
                                                          mb_to_bottom_edge);
John Koleszar's avatar
John Koleszar committed
404
405

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

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

Scott LaVarnway's avatar
Scott LaVarnway committed
414
                    do {
Scott LaVarnway's avatar
Scott LaVarnway committed
415
                        mi->bmi[ *fill_offset].mv.as_int = blockmv.as_int;
416
                        fill_offset++;
Scott LaVarnway's avatar
Scott LaVarnway committed
417
418
                    }while (--fill_count);
                }
John Koleszar's avatar
John Koleszar committed
419

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

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

        break;  /* done with SPLITMV */

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

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

        case ZEROMV:
Scott LaVarnway's avatar
Scott LaVarnway committed
443
            mv->as_int = 0;
444
            break;
Scott LaVarnway's avatar
Scott LaVarnway committed
445
446

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

            /* 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
456
457
458
459
460
            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
461
            break;
462

Scott LaVarnway's avatar
Scott LaVarnway committed
463
464
465
466
467
468
469
470
        default:;
  #if CONFIG_DEBUG
            assert(0);
  #endif
        }
    }
    else
    {
Scott LaVarnway's avatar
Scott LaVarnway committed
471
472
        /* required for left and above block mv */
        mbmi->mv.as_int = 0;
John Koleszar's avatar
John Koleszar committed
473

Scott LaVarnway's avatar
Scott LaVarnway committed
474
        /* MB is intra coded */
Scott LaVarnway's avatar
Scott LaVarnway committed
475
476
        if ((mbmi->mode = (MB_PREDICTION_MODE) vp8_read_ymode(bc, pbi->common.fc.ymode_prob)) == B_PRED)
        {
Scott LaVarnway's avatar
Scott LaVarnway committed
477
            int j = 0;
Scott LaVarnway's avatar
Scott LaVarnway committed
478
479
            do
            {
Scott LaVarnway's avatar
Scott LaVarnway committed
480
                mi->bmi[j].as_mode = (B_PREDICTION_MODE)vp8_read_bmode(bc, pbi->common.fc.bmode_prob);
Scott LaVarnway's avatar
Scott LaVarnway committed
481
482
483
            }
            while (++j < 16);
        }
John Koleszar's avatar
John Koleszar committed
484

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

Scott LaVarnway's avatar
Scott LaVarnway committed
488
}
John Koleszar's avatar
John Koleszar committed
489

Scott LaVarnway's avatar
Scott LaVarnway committed
490
491
492
493
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
494

495
    mb_mode_mv_init(pbi);
John Koleszar's avatar
John Koleszar committed
496

Scott LaVarnway's avatar
Scott LaVarnway committed
497
498
499
500
501
    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
502

Scott LaVarnway's avatar
Scott LaVarnway committed
503
504
505
        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
506

Scott LaVarnway's avatar
Scott LaVarnway committed
507
508
509
        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
510

Scott LaVarnway's avatar
Scott LaVarnway committed
511
512
        while (++mb_col < pbi->common.mb_cols)
        {
513
#if CONFIG_ERROR_CONCEALMENT
514
            int mb_num = mb_row * pbi->common.mb_cols + mb_col;
515
#endif
516
            /*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
517
518
            if(pbi->common.frame_type == KEY_FRAME)
                vp8_kfread_modes(pbi, mi, mb_row, mb_col);
John Koleszar's avatar
John Koleszar committed
519
            else
520
                read_mb_modes_mv(pbi, mi, &mi->mbmi, mb_row, mb_col);
John Koleszar's avatar
John Koleszar committed
521

522
523
524
525
526
527
528
529
530
531
532
533
534
#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

535
            mi++;       /* next macroblock */
John Koleszar's avatar
John Koleszar committed
536
537
        }

538
        mi++;           /* skip left predictor each row */
John Koleszar's avatar
John Koleszar committed
539
540
    }
}
Scott LaVarnway's avatar
Scott LaVarnway committed
541