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


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

18
19
20
21
22
23
24
25
#if CONFIG_SEGFEATURES
#include "vp8/common/seg_common.h"
#endif

#if CONFIG_SEGMENTATION
#include "vp8/common/seg_common.h"
#endif

John Koleszar's avatar
John Koleszar committed
26
27
28
#if CONFIG_DEBUG
#include <assert.h>
#endif
Scott LaVarnway's avatar
Scott LaVarnway committed
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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;
}
Yaowu Xu's avatar
Yaowu Xu committed
50
51
52
53
#if CONFIG_I8X8
static int vp8_read_i8x8_mode(vp8_reader *bc, const vp8_prob *p)
{
    const int i = vp8_treed_read(bc, vp8_i8x8_mode_tree, p);
Scott LaVarnway's avatar
Scott LaVarnway committed
54

Yaowu Xu's avatar
Yaowu Xu committed
55
56
57
    return i;
}
#endif
Scott LaVarnway's avatar
Scott LaVarnway committed
58
59
60
61
62
63
64
65
66
67
68


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)
{
69
    /* Is segmentation enabled */
Scott LaVarnway's avatar
Scott LaVarnway committed
70
71
    if (x->segmentation_enabled && x->update_mb_segmentation_map)
    {
72
        /* If so then read the segment id. */
Scott LaVarnway's avatar
Scott LaVarnway committed
73
74
75
76
77
78
        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]));
    }
}
Yaowu Xu's avatar
Yaowu Xu committed
79
extern const int vp8_i8x8_block[4];
Scott LaVarnway's avatar
Scott LaVarnway committed
80
81
82
83
84
85
86
87
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;

88
89
90
            /* 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
91
92
93
94
95
            m->mbmi.segment_id = 0;

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

96
97
98
99
100
101
102
103
104
#if CONFIG_SEGFEATURES
            if ( pbi->common.mb_no_coeff_skip &&
                 ( !segfeature_active( &pbi->mb,
                                       m->mbmi.segment_id, SEG_LVL_EOB ) ||
                   (pbi->mb.segment_feature_data[m->mbmi.segment_id]
                                                [SEG_LVL_EOB] != 0) ) )
#else
            // Read the macroblock coeff skip flag if this feature is in use,
            // else default to 0
Scott LaVarnway's avatar
Scott LaVarnway committed
105
            if (pbi->common.mb_no_coeff_skip)
106
#endif
Scott LaVarnway's avatar
Scott LaVarnway committed
107
108
                m->mbmi.mb_skip_coeff = vp8_read(bc, pbi->prob_skip_false);
            else
109
110
111
112
113
114
115
116
117
118
119
120
121
122
            {
#if CONFIG_SEGFEATURES
                if ( segfeature_active( &pbi->mb,
                                        m->mbmi.segment_id, SEG_LVL_EOB ) &&
                     (pbi->mb.segment_feature_data[m->mbmi.segment_id]
                                                  [SEG_LVL_EOB] == 0) )
                {
                    m->mbmi.mb_skip_coeff = 1;
                }
                else
#endif
                    m->mbmi.mb_skip_coeff = 0;
            }

123
124
#if CONFIG_QIMODE
            y_mode = (MB_PREDICTION_MODE) vp8_kfread_ymode(bc,
125
                pbi->common.kf_ymode_prob[pbi->common.kf_ymode_probs_index]);
126
#else
Scott LaVarnway's avatar
Scott LaVarnway committed
127
            y_mode = (MB_PREDICTION_MODE) vp8_kfread_ymode(bc, pbi->common.kf_ymode_prob);
128
#endif
Scott LaVarnway's avatar
Scott LaVarnway committed
129
130
131
132
133
134
135
            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
136
137
                    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
138

Scott LaVarnway's avatar
Scott LaVarnway committed
139
                    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
140
141
142
                }
                while (++i < 16);
            }
Yaowu Xu's avatar
Yaowu Xu committed
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#if CONFIG_I8X8
            if((m->mbmi.mode = y_mode) == I8X8_PRED)
            {
                int i;
                int mode8x8;
                //printf("F%3d:%d:%d:", pbi->common.current_video_frame, mb_row, mb_col);
                for(i=0;i<4;i++)
                 {
                     int ib = vp8_i8x8_block[i];
                     mode8x8 = vp8_read_i8x8_mode(bc, pbi->common.i8x8_mode_prob);
                     m->bmi[ib+0].as_mode= mode8x8;
                     m->bmi[ib+1].as_mode= mode8x8;
                     m->bmi[ib+4].as_mode= mode8x8;
                     m->bmi[ib+5].as_mode= mode8x8;
                 }
                //printf("%2d%2d%2d%2d\n", m->bmi[0].as_mode,m->bmi[2].as_mode,
                //                       m->bmi[8].as_mode,m->bmi[10].as_mode);
           }
            else
#endif
Scott LaVarnway's avatar
Scott LaVarnway committed
163
164
165
            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
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
219
220
221
222
223
224
225
226
227
228
229
230
231
232

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

233
234
235
236
237
238
239
240
241
242
// Read the referncence frame
static MV_REFERENCE_FRAME read_ref_frame( VP8D_COMP *pbi,
                                          unsigned char segment_id )
{
    MV_REFERENCE_FRAME ref_frame;

#if CONFIG_SEGFEATURES
    MACROBLOCKD *const xd = &pbi->mb;

    // Is the segment level refernce frame feature enabled for this segment
243
    if ( segfeature_active( xd, segment_id, SEG_LVL_REF_FRAME ) )
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
    {
        ref_frame =
            xd->segment_feature_data[segment_id][SEG_LVL_REF_FRAME];
    }
    else
#endif

    // Per MB read of the reference frame
    {
        vp8_reader *const bc = &pbi->bc;

        ref_frame =
            (MV_REFERENCE_FRAME) vp8_read(bc, pbi->prob_intra);

        if (ref_frame)
        {
            if (vp8_read(bc, pbi->prob_last))
            {
                ref_frame = (MV_REFERENCE_FRAME)((int)ref_frame +
                            (int)(1 + vp8_read(bc, pbi->prob_gf)));
            }
        }
    }

    return (MV_REFERENCE_FRAME)ref_frame;
}
John Koleszar's avatar
John Koleszar committed
270
271
272
273
274
275
276
277

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

278
static B_PREDICTION_MODE sub_mv_ref(vp8_reader *bc, const vp8_prob *p)
John Koleszar's avatar
John Koleszar committed
279
280
281
{
    const int i = vp8_treed_read(bc, vp8_sub_mv_ref_tree, p);

282
    return (B_PREDICTION_MODE)i;
John Koleszar's avatar
John Koleszar committed
283
}
Scott LaVarnway's avatar
Scott LaVarnway committed
284
285

#ifdef VPX_MODE_COUNT
John Koleszar's avatar
John Koleszar committed
286
287
288
289
290
291
292
293
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
294
#endif
John Koleszar's avatar
John Koleszar committed
295

296
297
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
298
299
300
301
302
    { 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
303
304
305



306
static void mb_mode_mv_init(VP8D_COMP *pbi)
Scott LaVarnway's avatar
Scott LaVarnway committed
307
308
309
{
    vp8_reader *const bc = & pbi->bc;
    MV_CONTEXT *const mvc = pbi->common.fc.mvc;
310
#if CONFIG_SEGMENTATION
311
    MACROBLOCKD *const xd  = & pbi->mb;
312
#endif
John Koleszar's avatar
John Koleszar committed
313

314
315
316
317
318
319
#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
320
321
322
    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
323

Scott LaVarnway's avatar
Scott LaVarnway committed
324
    if(pbi->common.frame_type != KEY_FRAME)
John Koleszar's avatar
John Koleszar committed
325
    {
Scott LaVarnway's avatar
Scott LaVarnway committed
326
327
328
        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
329

Scott LaVarnway's avatar
Scott LaVarnway committed
330
        if (vp8_read_bit(bc))
John Koleszar's avatar
John Koleszar committed
331
        {
Scott LaVarnway's avatar
Scott LaVarnway committed
332
            int i = 0;
John Koleszar's avatar
John Koleszar committed
333

Scott LaVarnway's avatar
Scott LaVarnway committed
334
335
336
337
338
339
            do
            {
                pbi->common.fc.ymode_prob[i] = (vp8_prob) vp8_read_literal(bc, 8);
            }
            while (++i < 4);
        }
John Koleszar's avatar
John Koleszar committed
340

Scott LaVarnway's avatar
Scott LaVarnway committed
341
        if (vp8_read_bit(bc))
John Koleszar's avatar
John Koleszar committed
342
        {
Scott LaVarnway's avatar
Scott LaVarnway committed
343
344
345
346
347
348
349
            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
350
351
        }

Scott LaVarnway's avatar
Scott LaVarnway committed
352
        read_mvcontexts(bc, mvc);
353
354
355
#if CONFIG_SEGMENTATION
    xd->temporal_update = vp8_read_bit(bc);
#endif
John Koleszar's avatar
John Koleszar committed
356
    }
Scott LaVarnway's avatar
Scott LaVarnway committed
357
}
John Koleszar's avatar
John Koleszar committed
358

359

360
static void read_mb_modes_mv(VP8D_COMP *pbi, MODE_INFO *mi, MB_MODE_INFO *mbmi,
Scott LaVarnway's avatar
Scott LaVarnway committed
361
362
363
364
365
                            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;
366
    MACROBLOCKD *const xd  = & pbi->mb;
367
368

#if CONFIG_SEGMENTATION
369
370
371
    int sum;
    int index = mb_row * pbi->common.mb_cols + mb_col;
#endif
Scott LaVarnway's avatar
Scott LaVarnway committed
372
    int_mv *const mv = & mbmi->mv;
Scott LaVarnway's avatar
Scott LaVarnway committed
373
374
375
376
377
    int mb_to_left_edge;
    int mb_to_right_edge;
    int mb_to_top_edge;
    int mb_to_bottom_edge;

378
379
    mb_to_top_edge = xd->mb_to_top_edge;
    mb_to_bottom_edge = xd->mb_to_bottom_edge;
Scott LaVarnway's avatar
Scott LaVarnway committed
380
381
382
    mb_to_top_edge -= LEFT_TOP_MARGIN;
    mb_to_bottom_edge += RIGHT_BOTTOM_MARGIN;
    mbmi->need_to_clamp_mvs = 0;
383
384
385
    /* 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
     */
386
    xd->mb_to_left_edge =
Scott LaVarnway's avatar
Scott LaVarnway committed
387
388
389
    mb_to_left_edge = -((mb_col * 16) << 3);
    mb_to_left_edge -= LEFT_TOP_MARGIN;

390
    xd->mb_to_right_edge =
Scott LaVarnway's avatar
Scott LaVarnway committed
391
392
393
    mb_to_right_edge = ((pbi->common.mb_cols - 1 - mb_col) * 16) << 3;
    mb_to_right_edge += RIGHT_BOTTOM_MARGIN;

394
    /* If required read in new segmentation data for this MB */
395
    if (xd->update_mb_segmentation_map)
396
397
            {
#if CONFIG_SEGMENTATION
398
399
400
                if (xd->temporal_update)
                {
                    sum = 0;
401

402
403
404
                    if (mb_col != 0)
                        sum += (mi-1)->mbmi.segment_flag;
                    if (mb_row != 0)
405
                        sum += (mi-pbi->common.mb_cols)->mbmi.segment_flag;
406

407
                    if (vp8_read(bc, xd->mb_segment_tree_probs[3+sum]) == 0)
408
                    {
409
410
                        mbmi->segment_id = pbi->segmentation_map[index];
                        mbmi->segment_flag = 0;
411
                    }
412
413
                    else
                    {
414
                        vp8_read_mb_features(bc, &mi->mbmi, xd);
415
416
417
418
                        mbmi->segment_flag = 1;
                        pbi->segmentation_map[index] = mbmi->segment_id;
                    }

419
420
421
                }
                else
                {
422
                    vp8_read_mb_features(bc, &mi->mbmi, xd);
423
                    pbi->segmentation_map[index] = mbmi->segment_id;
424
                }
425
                index++;
426
#else
427
                vp8_read_mb_features(bc, &mi->mbmi, xd);
428
429
#endif
            }
John Koleszar's avatar
John Koleszar committed
430

431
432
433
434
435
436
437
#if CONFIG_SEGFEATURES
    if ( pbi->common.mb_no_coeff_skip &&
         ( !segfeature_active( xd,
                               mbmi->segment_id, SEG_LVL_EOB ) ||
           (xd->segment_feature_data[mbmi->segment_id]
                                    [SEG_LVL_EOB] != 0) ) )
#else
Scott LaVarnway's avatar
Scott LaVarnway committed
438
    if (pbi->common.mb_no_coeff_skip)
439
440
441
442
#endif
    {
        // Read the macroblock coeff skip flag if this feature is in use,
        // else default to 0
Scott LaVarnway's avatar
Scott LaVarnway committed
443
        mbmi->mb_skip_coeff = vp8_read(bc, pbi->prob_skip_false);
444
    }
Scott LaVarnway's avatar
Scott LaVarnway committed
445
    else
446
447
448
449
450
451
452
453
454
455
456
457
458
    {
#if CONFIG_SEGFEATURES
        if ( segfeature_active( xd,
                                mbmi->segment_id, SEG_LVL_EOB ) &&
             (xd->segment_feature_data[mbmi->segment_id]
                                      [SEG_LVL_EOB] == 0) )
        {
            mbmi->mb_skip_coeff = 1;
        }
        else
#endif
            mbmi->mb_skip_coeff = 0;
    }
John Koleszar's avatar
John Koleszar committed
459

460
461
462
463
464
    // Read the reference frame
    mbmi->ref_frame = read_ref_frame( pbi, mbmi->segment_id );

    // If reference frame is an Inter frame
    if (mbmi->ref_frame)
John Koleszar's avatar
John Koleszar committed
465
    {
Scott LaVarnway's avatar
Scott LaVarnway committed
466
        int rct[4];
Scott LaVarnway's avatar
Scott LaVarnway committed
467
        int_mv nearest, nearby, best_mv;
468
        vp8_prob mv_ref_p [VP8_MVREFS-1];
John Koleszar's avatar
John Koleszar committed
469

470
471
472
473
474
475
        vp8_find_near_mvs(xd, mi, &nearest, &nearby, &best_mv, rct,
                          mbmi->ref_frame, pbi->common.ref_frame_sign_bias);
        vp8_mv_ref_probs(mv_ref_p, rct);

#if CONFIG_SEGFEATURES
        // Is the segment level mode feature enabled for this segment
476
        if ( segfeature_active( xd, mbmi->segment_id, SEG_LVL_MODE ) )
John Koleszar's avatar
John Koleszar committed
477
        {
478
479
            mbmi->mode =
                xd->segment_feature_data[mbmi->segment_id][SEG_LVL_MODE];
John Koleszar's avatar
John Koleszar committed
480
        }
481
482
483
484
485
486
487
        else
        {
            mbmi->mode = read_mv_ref(bc, mv_ref_p);
        }
#else
        mbmi->mode = read_mv_ref(bc, mv_ref_p);
#endif
John Koleszar's avatar
John Koleszar committed
488

Scott LaVarnway's avatar
Scott LaVarnway committed
489
        mbmi->uv_mode = DC_PRED;
490
        switch (mbmi->mode)
John Koleszar's avatar
John Koleszar committed
491
        {
Scott LaVarnway's avatar
Scott LaVarnway committed
492
493
494
495
496
497
        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
498

Scott LaVarnway's avatar
Scott LaVarnway committed
499
500
            do  /* for each subset j */
            {
Scott LaVarnway's avatar
Scott LaVarnway committed
501
                int_mv leftmv, abovemv;
Scott LaVarnway's avatar
Scott LaVarnway committed
502
                int_mv blockmv;
Scott LaVarnway's avatar
Scott LaVarnway committed
503
504
505
                int k;  /* first block in subset j */
                int mv_contz;
                k = vp8_mbsplit_offset[s][j];
John Koleszar's avatar
John Koleszar committed
506

Scott LaVarnway's avatar
Scott LaVarnway committed
507
508
                leftmv.as_int = left_block_mv(mi, k);
                abovemv.as_int = above_block_mv(mi, k, mis);
509
                mv_contz = vp8_mv_cont(&leftmv, &abovemv);
John Koleszar's avatar
John Koleszar committed
510

511
                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
512
                {
Scott LaVarnway's avatar
Scott LaVarnway committed
513
                case NEW4X4:
Scott LaVarnway's avatar
Scott LaVarnway committed
514
515
516
                    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
517
518
519
520
521
  #ifdef VPX_MODE_COUNT
                    vp8_mv_cont_count[mv_contz][3]++;
  #endif
                    break;
                case LEFT4X4:
Scott LaVarnway's avatar
Scott LaVarnway committed
522
                    blockmv.as_int = leftmv.as_int;
Scott LaVarnway's avatar
Scott LaVarnway committed
523
524
525
526
527
  #ifdef VPX_MODE_COUNT
                    vp8_mv_cont_count[mv_contz][0]++;
  #endif
                    break;
                case ABOVE4X4:
Scott LaVarnway's avatar
Scott LaVarnway committed
528
                    blockmv.as_int = abovemv.as_int;
Scott LaVarnway's avatar
Scott LaVarnway committed
529
530
531
532
533
  #ifdef VPX_MODE_COUNT
                    vp8_mv_cont_count[mv_contz][1]++;
  #endif
                    break;
                case ZERO4X4:
Scott LaVarnway's avatar
Scott LaVarnway committed
534
                    blockmv.as_int = 0;
Scott LaVarnway's avatar
Scott LaVarnway committed
535
536
537
538
539
540
  #ifdef VPX_MODE_COUNT
                    vp8_mv_cont_count[mv_contz][2]++;
  #endif
                    break;
                default:
                    break;
John Koleszar's avatar
John Koleszar committed
541
542
                }

Scott LaVarnway's avatar
Scott LaVarnway committed
543
                mbmi->need_to_clamp_mvs = vp8_check_mv_bounds(&blockmv,
Scott LaVarnway's avatar
Scott LaVarnway committed
544
545
546
547
                                                          mb_to_left_edge,
                                                          mb_to_right_edge,
                                                          mb_to_top_edge,
                                                          mb_to_bottom_edge);
John Koleszar's avatar
John Koleszar committed
548
549

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

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

Scott LaVarnway's avatar
Scott LaVarnway committed
558
                    do {
Scott LaVarnway's avatar
Scott LaVarnway committed
559
                        mi->bmi[ *fill_offset].mv.as_int = blockmv.as_int;
560
                        fill_offset++;
Scott LaVarnway's avatar
Scott LaVarnway committed
561
                    }while (--fill_count);
John Koleszar's avatar
John Koleszar committed
562
563
564
                }

            }
Scott LaVarnway's avatar
Scott LaVarnway committed
565
566
            while (++j < num_p);
        }
John Koleszar's avatar
John Koleszar committed
567

Scott LaVarnway's avatar
Scott LaVarnway committed
568
        mv->as_int = mi->bmi[15].mv.as_int;
Scott LaVarnway's avatar
Scott LaVarnway committed
569
570
571
572

        break;  /* done with SPLITMV */

        case NEARMV:
Scott LaVarnway's avatar
Scott LaVarnway committed
573
            mv->as_int = nearby.as_int;
574
            /* Clip "next_nearest" so that it does not extend to far out of image */
Scott LaVarnway's avatar
Scott LaVarnway committed
575
576
            vp8_clamp_mv(mv, mb_to_left_edge, mb_to_right_edge,
                         mb_to_top_edge, mb_to_bottom_edge);
577
            goto propagate_mv;
Scott LaVarnway's avatar
Scott LaVarnway committed
578
579

        case NEARESTMV:
Scott LaVarnway's avatar
Scott LaVarnway committed
580
            mv->as_int = nearest.as_int;
581
            /* Clip "next_nearest" so that it does not extend to far out of image */
Scott LaVarnway's avatar
Scott LaVarnway committed
582
583
            vp8_clamp_mv(mv, mb_to_left_edge, mb_to_right_edge,
                         mb_to_top_edge, mb_to_bottom_edge);
584
            goto propagate_mv;
Scott LaVarnway's avatar
Scott LaVarnway committed
585
586

        case ZEROMV:
Scott LaVarnway's avatar
Scott LaVarnway committed
587
            mv->as_int = 0;
588
            goto propagate_mv;
Scott LaVarnway's avatar
Scott LaVarnway committed
589
590

        case NEWMV:
Scott LaVarnway's avatar
Scott LaVarnway committed
591
592
593
            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
594
595
596
597
598
599

            /* 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
600
601
602
603
604
            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);
605

606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
        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
629
630
631
632
633
634
635
636
        default:;
  #if CONFIG_DEBUG
            assert(0);
  #endif
        }
    }
    else
    {
637
638
639
640
#if CONFIG_SEGFEATURES
        // TBD HANDLE INTRA MODE CASE
#endif

Scott LaVarnway's avatar
Scott LaVarnway committed
641
642
        /* required for left and above block mv */
        mbmi->mv.as_int = 0;
John Koleszar's avatar
John Koleszar committed
643

Scott LaVarnway's avatar
Scott LaVarnway committed
644
        /* MB is intra coded */
Scott LaVarnway's avatar
Scott LaVarnway committed
645
646
        if ((mbmi->mode = (MB_PREDICTION_MODE) vp8_read_ymode(bc, pbi->common.fc.ymode_prob)) == B_PRED)
        {
Scott LaVarnway's avatar
Scott LaVarnway committed
647
            int j = 0;
Scott LaVarnway's avatar
Scott LaVarnway committed
648
649
            do
            {
Scott LaVarnway's avatar
Scott LaVarnway committed
650
                mi->bmi[j].as_mode = (B_PREDICTION_MODE)vp8_read_bmode(bc, pbi->common.fc.bmode_prob);
Scott LaVarnway's avatar
Scott LaVarnway committed
651
652
653
            }
            while (++j < 16);
        }
John Koleszar's avatar
John Koleszar committed
654

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

Scott LaVarnway's avatar
Scott LaVarnway committed
658
}
John Koleszar's avatar
John Koleszar committed
659

Scott LaVarnway's avatar
Scott LaVarnway committed
660
661
662
663
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
664

665
666
667
668
669
670
671
672
#if CONFIG_SEGFEATURES
#if 0
    FILE *statsfile;
    statsfile = fopen("decsegmap.stt", "a");
    fprintf(statsfile, "\n" );
#endif
#endif

673
    mb_mode_mv_init(pbi);
John Koleszar's avatar
John Koleszar committed
674

675
676
677
678
679
680
681
#if CONFIG_QIMODE
    if(pbi->common.frame_type==KEY_FRAME && !pbi->common.kf_ymode_probs_update)
    {
        pbi->common.kf_ymode_probs_index = vp8_read_literal(&pbi->bc, 3);
    }
#endif

Scott LaVarnway's avatar
Scott LaVarnway committed
682
683
684
685
686
    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
687

Scott LaVarnway's avatar
Scott LaVarnway committed
688
689
690
        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
691

Scott LaVarnway's avatar
Scott LaVarnway committed
692
693
694
        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
695

696
697
698
699
700
701
#if CONFIG_SEGFEATURES
#if 0
        fprintf(statsfile, "\n" );
#endif
#endif

Scott LaVarnway's avatar
Scott LaVarnway committed
702
703
        while (++mb_col < pbi->common.mb_cols)
        {
704
#if CONFIG_ERROR_CONCEALMENT
705
            int mb_num = mb_row * pbi->common.mb_cols + mb_col;
706
#endif
707
            /*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
708
709
            if(pbi->common.frame_type == KEY_FRAME)
                vp8_kfread_modes(pbi, mi, mb_row, mb_col);
John Koleszar's avatar
John Koleszar committed
710
            else
711
                read_mb_modes_mv(pbi, mi, &mi->mbmi, mb_row, mb_col);
John Koleszar's avatar
John Koleszar committed
712

Yaowu Xu's avatar
Yaowu Xu committed
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
            //printf("%3d", mi->mbmi.mode);

            /*
            if(pbi->common.current_video_frame==7)
            {
                FILE *fmode=fopen("kfmode.txt", "a");
                fprintf(fmode, "%3d:%3d:%d\n",mb_row, mb_col, mi->mbmi.mode);
                fclose(fmode);

            }*/
            /*
            if(mi->mbmi.mode==I8X8_PRED)
            {
                printf("F%3d:%d:%d\n", pbi->common.current_video_frame, mb_row, mb_col);
            }
            */
729
730
731
732
733
734
735
736
737
738
739
740
741
#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

742
743
744
745
746
747
748
#if CONFIG_SEGFEATURES
#if 0
            fprintf(statsfile, "%2d%2d%2d   ",
                mi->mbmi.segment_id, mi->mbmi.ref_frame, mi->mbmi.mode );
#endif
#endif

749
            mi++;       /* next macroblock */
John Koleszar's avatar
John Koleszar committed
750
        }
Yaowu Xu's avatar
Yaowu Xu committed
751
       // printf("\n");
752
        mi++;           /* skip left predictor each row */
John Koleszar's avatar
John Koleszar committed
753
    }
754
755
756
757
758
759
760

#if CONFIG_SEGFEATURES
#if 0
    fclose(statsfile);
#endif
#endif

John Koleszar's avatar
John Koleszar committed
761
}