decodemv.c 16 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

Scott LaVarnway's avatar
Scott LaVarnway committed
247
248
249
    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
250

Scott LaVarnway's avatar
Scott LaVarnway committed
251
252
253
254
255
    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
256

Scott LaVarnway's avatar
Scott LaVarnway committed
257
258
259
        if (vp8_read_bit(bc))
        {
            int i = 0;
John Koleszar's avatar
John Koleszar committed
260

Scott LaVarnway's avatar
Scott LaVarnway committed
261
262
263
264
265
266
            do
            {
                pbi->common.fc.ymode_prob[i] = (vp8_prob) vp8_read_literal(bc, 8);
            }
            while (++i < 4);
        }
John Koleszar's avatar
John Koleszar committed
267

Scott LaVarnway's avatar
Scott LaVarnway committed
268
        if (vp8_read_bit(bc))
John Koleszar's avatar
John Koleszar committed
269
        {
Scott LaVarnway's avatar
Scott LaVarnway committed
270
271
272
273
274
275
276
            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
277
        }
Scott LaVarnway's avatar
Scott LaVarnway committed
278
279

        read_mvcontexts(bc, mvc);
John Koleszar's avatar
John Koleszar committed
280
    }
Scott LaVarnway's avatar
Scott LaVarnway committed
281
}
John Koleszar's avatar
John Koleszar committed
282

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

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

317
    /* Read the macroblock coeff skip flag if this feature is in use, else default to 0 */
Scott LaVarnway's avatar
Scott LaVarnway committed
318
319
320
321
322
323
    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
324
    {
Scott LaVarnway's avatar
Scott LaVarnway committed
325
326
        int rct[4];
        vp8_prob mv_ref_p [VP8_MVREFS-1];
Scott LaVarnway's avatar
Scott LaVarnway committed
327
        int_mv nearest, nearby, best_mv;
John Koleszar's avatar
John Koleszar committed
328

Scott LaVarnway's avatar
Scott LaVarnway committed
329
        if (vp8_read(bc, pbi->prob_last))
John Koleszar's avatar
John Koleszar committed
330
        {
Scott LaVarnway's avatar
Scott LaVarnway committed
331
            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
332
333
        }

Scott LaVarnway's avatar
Scott LaVarnway committed
334
        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
335

Scott LaVarnway's avatar
Scott LaVarnway committed
336
        vp8_mv_ref_probs(mv_ref_p, rct);
John Koleszar's avatar
John Koleszar committed
337

Scott LaVarnway's avatar
Scott LaVarnway committed
338
339
        mbmi->uv_mode = DC_PRED;
        switch (mbmi->mode = read_mv_ref(bc, mv_ref_p))
John Koleszar's avatar
John Koleszar committed
340
        {
Scott LaVarnway's avatar
Scott LaVarnway committed
341
342
343
344
345
346
        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
347

Scott LaVarnway's avatar
Scott LaVarnway committed
348
349
350
351
352
353
            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
354

Scott LaVarnway's avatar
Scott LaVarnway committed
355
                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
356

357
                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
358
                {
Scott LaVarnway's avatar
Scott LaVarnway committed
359
                case NEW4X4:
Scott LaVarnway's avatar
Scott LaVarnway committed
360
361
362
                    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
363
364
365
366
367
  #ifdef VPX_MODE_COUNT
                    vp8_mv_cont_count[mv_contz][3]++;
  #endif
                    break;
                case LEFT4X4:
Scott LaVarnway's avatar
Scott LaVarnway committed
368
                    bmi.mv.as_int = vp8_left_bmi(mi, k)->mv.as_int;
Scott LaVarnway's avatar
Scott LaVarnway committed
369
370
371
372
373
  #ifdef VPX_MODE_COUNT
                    vp8_mv_cont_count[mv_contz][0]++;
  #endif
                    break;
                case ABOVE4X4:
Scott LaVarnway's avatar
Scott LaVarnway committed
374
                    bmi.mv.as_int = vp8_above_bmi(mi, k, mis)->mv.as_int;
Scott LaVarnway's avatar
Scott LaVarnway committed
375
376
377
378
379
  #ifdef VPX_MODE_COUNT
                    vp8_mv_cont_count[mv_contz][1]++;
  #endif
                    break;
                case ZERO4X4:
Scott LaVarnway's avatar
Scott LaVarnway committed
380
                    bmi.mv.as_int = 0;
Scott LaVarnway's avatar
Scott LaVarnway committed
381
382
383
384
385
386
  #ifdef VPX_MODE_COUNT
                    vp8_mv_cont_count[mv_contz][2]++;
  #endif
                    break;
                default:
                    break;
John Koleszar's avatar
John Koleszar committed
387
388
                }

Scott LaVarnway's avatar
Scott LaVarnway committed
389
390
391
392
393
                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
394
395

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

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

Scott LaVarnway's avatar
Scott LaVarnway committed
404
405
406
                    do {
                        mi->bmi[ *fill_offset] = bmi;
                      fill_offset++;
John Koleszar's avatar
John Koleszar committed
407

Scott LaVarnway's avatar
Scott LaVarnway committed
408
409
                    }while (--fill_count);
                }
John Koleszar's avatar
John Koleszar committed
410

Scott LaVarnway's avatar
Scott LaVarnway committed
411
412
413
            }
            while (++j < num_p);
        }
John Koleszar's avatar
John Koleszar committed
414

Scott LaVarnway's avatar
Scott LaVarnway committed
415
        mv->as_int = mi->bmi[15].mv.as_int;
Scott LaVarnway's avatar
Scott LaVarnway committed
416
417
418
419

        break;  /* done with SPLITMV */

        case NEARMV:
Scott LaVarnway's avatar
Scott LaVarnway committed
420
            mv->as_int = nearby.as_int;
421
            /* Clip "next_nearest" so that it does not extend to far out of image */
Scott LaVarnway's avatar
Scott LaVarnway committed
422
423
            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
424
425
426
            goto propagate_mv;

        case NEARESTMV:
Scott LaVarnway's avatar
Scott LaVarnway committed
427
            mv->as_int = nearest.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 ZEROMV:
Scott LaVarnway's avatar
Scott LaVarnway committed
434
            mv->as_int = 0;
Scott LaVarnway's avatar
Scott LaVarnway committed
435
436
437
            goto propagate_mv;

        case NEWMV:
Scott LaVarnway's avatar
Scott LaVarnway committed
438
439
440
            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
441
442
443
444
445
446

            /* 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
447
448
449
450
451
            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
452
453
454

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

Scott LaVarnway's avatar
Scott LaVarnway committed
489
490
491
492
493
494
495
496
497
        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
498

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

Scott LaVarnway's avatar
Scott LaVarnway committed
502
}
John Koleszar's avatar
John Koleszar committed
503

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

509
    mb_mode_mv_init(pbi);
John Koleszar's avatar
John Koleszar committed
510

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

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

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

Scott LaVarnway's avatar
Scott LaVarnway committed
525
526
        while (++mb_col < pbi->common.mb_cols)
        {
527
            /*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
528
529
            if(pbi->common.frame_type == KEY_FRAME)
                vp8_kfread_modes(pbi, mi, mb_row, mb_col);
John Koleszar's avatar
John Koleszar committed
530
            else
531
                read_mb_modes_mv(pbi, mi, &mi->mbmi, mb_row, mb_col);
John Koleszar's avatar
John Koleszar committed
532

533
            mi++;       /* next macroblock */
John Koleszar's avatar
John Koleszar committed
534
535
        }

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