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
}