vc1.c 152.8 KB
Newer Older
1
/*
2
 * VC-1 and WMV3 decoder
3
 * Copyright (c) 2006-2007 Konstantin Shishkov
4
 * Partly based on vc9.c (c) 2005 Anonymous, Alex Beregszaszi, Michael Niedermayer
5
 *
6 7 8
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
9 10
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
11
 * version 2.1 of the License, or (at your option) any later version.
12
 *
13
 * FFmpeg is distributed in the hope that it will be useful,
14 15 16 17 18
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
19
 * License along with FFmpeg; if not, write to the Free Software
20
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 22 23
 */

/**
24 25
 * @file vc1.c
 * VC-1 and WMV3 decoder
26 27 28 29 30
 *
 */
#include "dsputil.h"
#include "avcodec.h"
#include "mpegvideo.h"
K
Kostya Shishkov 已提交
31
#include "vc1.h"
32
#include "vc1data.h"
33
#include "vc1acdata.h"
34
#include "msmpeg4data.h"
35
#include "unary.h"
K
Kostya Shishkov 已提交
36
#include "simple_idct.h"
A
anonymous 已提交
37

38 39 40
#undef NDEBUG
#include <assert.h>

A
anonymous 已提交
41 42
#define MB_INTRA_VLC_BITS 9
#define DC_VLC_BITS 9
43
#define AC_VLC_BITS 9
A
anonymous 已提交
44
static const uint16_t table_mb_intra[64][2];
45 46


A
anonymous 已提交
47
/**
48 49
 * Init VC-1 specific tables and VC1Context members
 * @param v The VC1Context to initialize
A
anonymous 已提交
50 51
 * @return Status
 */
52
static int vc1_init_common(VC1Context *v)
53 54
{
    static int done = 0;
55
    int i = 0;
56 57

    v->hrd_rate = v->hrd_buffer = NULL;
A
Fixes:  
anonymous 已提交
58 59

    /* VLC tables */
60 61 62
    if(!done)
    {
        done = 1;
63 64 65 66 67 68 69 70 71 72 73 74
        init_vlc(&ff_vc1_bfraction_vlc, VC1_BFRACTION_VLC_BITS, 23,
                 ff_vc1_bfraction_bits, 1, 1,
                 ff_vc1_bfraction_codes, 1, 1, 1);
        init_vlc(&ff_vc1_norm2_vlc, VC1_NORM2_VLC_BITS, 4,
                 ff_vc1_norm2_bits, 1, 1,
                 ff_vc1_norm2_codes, 1, 1, 1);
        init_vlc(&ff_vc1_norm6_vlc, VC1_NORM6_VLC_BITS, 64,
                 ff_vc1_norm6_bits, 1, 1,
                 ff_vc1_norm6_codes, 2, 2, 1);
        init_vlc(&ff_vc1_imode_vlc, VC1_IMODE_VLC_BITS, 7,
                 ff_vc1_imode_bits, 1, 1,
                 ff_vc1_imode_codes, 1, 1, 1);
A
Fixes:  
anonymous 已提交
75 76
        for (i=0; i<3; i++)
        {
77 78 79 80 81 82 83 84 85
            init_vlc(&ff_vc1_ttmb_vlc[i], VC1_TTMB_VLC_BITS, 16,
                     ff_vc1_ttmb_bits[i], 1, 1,
                     ff_vc1_ttmb_codes[i], 2, 2, 1);
            init_vlc(&ff_vc1_ttblk_vlc[i], VC1_TTBLK_VLC_BITS, 8,
                     ff_vc1_ttblk_bits[i], 1, 1,
                     ff_vc1_ttblk_codes[i], 1, 1, 1);
            init_vlc(&ff_vc1_subblkpat_vlc[i], VC1_SUBBLKPAT_VLC_BITS, 15,
                     ff_vc1_subblkpat_bits[i], 1, 1,
                     ff_vc1_subblkpat_codes[i], 1, 1, 1);
A
Fixes:  
anonymous 已提交
86 87
        }
        for(i=0; i<4; i++)
88
        {
89 90 91 92 93 94 95 96 97
            init_vlc(&ff_vc1_4mv_block_pattern_vlc[i], VC1_4MV_BLOCK_PATTERN_VLC_BITS, 16,
                     ff_vc1_4mv_block_pattern_bits[i], 1, 1,
                     ff_vc1_4mv_block_pattern_codes[i], 1, 1, 1);
            init_vlc(&ff_vc1_cbpcy_p_vlc[i], VC1_CBPCY_P_VLC_BITS, 64,
                     ff_vc1_cbpcy_p_bits[i], 1, 1,
                     ff_vc1_cbpcy_p_codes[i], 2, 2, 1);
            init_vlc(&ff_vc1_mv_diff_vlc[i], VC1_MV_DIFF_VLC_BITS, 73,
                     ff_vc1_mv_diff_bits[i], 1, 1,
                     ff_vc1_mv_diff_codes[i], 2, 2, 1);
98
        }
99
        for(i=0; i<8; i++)
100
            init_vlc(&ff_vc1_ac_coeff_table[i], AC_VLC_BITS, vc1_ac_sizes[i],
101 102 103 104 105
                     &vc1_ac_tables[i][0][1], 8, 4,
                     &vc1_ac_tables[i][0][0], 8, 4, 1);
        init_vlc(&ff_msmp4_mb_i_vlc, MB_INTRA_VLC_BITS, 64,
                 &ff_msmp4_mb_i_table[0][1], 4, 2,
                 &ff_msmp4_mb_i_table[0][0], 4, 2, 1);
106 107
    }

A
Fixes:  
anonymous 已提交
108 109 110 111
    /* Other defaults */
    v->pq = -1;
    v->mvrange = 0; /* 7.1.1.18, p80 */

112 113 114
    return 0;
}

115
/***********************************************************************/
A
anonymous 已提交
116
/**
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
 * @defgroup bitplane VC9 Bitplane decoding
 * @see 8.7, p56
 * @{
 */

/** @addtogroup bitplane
 * Imode types
 * @{
 */
enum Imode {
    IMODE_RAW,
    IMODE_NORM2,
    IMODE_DIFF2,
    IMODE_NORM6,
    IMODE_DIFF6,
    IMODE_ROWSKIP,
    IMODE_COLSKIP
};
/** @} */ //imode defines

/** Decode rows by checking if they are skipped
 * @param plane Buffer to store decoded bits
 * @param[in] width Width of this buffer
 * @param[in] height Height of this buffer
 * @param[in] stride of this buffer
 */
static void decode_rowskip(uint8_t* plane, int width, int height, int stride, GetBitContext *gb){
    int x, y;
145

146
    for (y=0; y<height; y++){
147
        if (!get_bits1(gb)) //rowskip
148 149 150
            memset(plane, 0, width);
        else
            for (x=0; x<width; x++)
151
                plane[x] = get_bits1(gb);
152
        plane += stride;
153
    }
154
}
155

156 157 158 159 160
/** Decode columns by checking if they are skipped
 * @param plane Buffer to store decoded bits
 * @param[in] width Width of this buffer
 * @param[in] height Height of this buffer
 * @param[in] stride of this buffer
161
 * @todo FIXME: Optimize
162 163 164
 */
static void decode_colskip(uint8_t* plane, int width, int height, int stride, GetBitContext *gb){
    int x, y;
165

166
    for (x=0; x<width; x++){
167
        if (!get_bits1(gb)) //colskip
168 169 170 171
            for (y=0; y<height; y++)
                plane[y*stride] = 0;
        else
            for (y=0; y<height; y++)
172
                plane[y*stride] = get_bits1(gb);
173
        plane ++;
174 175 176
    }
}

177 178 179
/** Decode a bitplane's bits
 * @param bp Bitplane where to store the decode bits
 * @param v VC-1 context for bit reading and logging
A
anonymous 已提交
180
 * @return Status
181
 * @todo FIXME: Optimize
A
anonymous 已提交
182
 */
183
static int bitplane_decoding(uint8_t* data, int *raw_flag, VC1Context *v)
184
{
185
    GetBitContext *gb = &v->s.gb;
186

187
    int imode, x, y, code, offset;
188 189
    uint8_t invert, *planep = data;
    int width, height, stride;
190

191 192 193
    width = v->s.mb_width;
    height = v->s.mb_height;
    stride = v->s.mb_stride;
194
    invert = get_bits1(gb);
195
    imode = get_vlc2(gb, ff_vc1_imode_vlc.table, VC1_IMODE_VLC_BITS, 1);
196

197
    *raw_flag = 0;
198
    switch (imode)
199
    {
200 201
    case IMODE_RAW:
        //Data is actually read in the MB layer (same for all tests == "raw")
202
        *raw_flag = 1; //invert ignored
203 204 205
        return invert;
    case IMODE_DIFF2:
    case IMODE_NORM2:
206
        if ((height * width) & 1)
207
        {
208
            *planep++ = get_bits1(gb);
209
            offset = 1;
210
        }
211 212
        else offset = 0;
        // decode bitplane as one long line
213
        for (y = offset; y < height * width; y += 2) {
214
            code = get_vlc2(gb, ff_vc1_norm2_vlc.table, VC1_NORM2_VLC_BITS, 1);
215 216
            *planep++ = code & 1;
            offset++;
217
            if(offset == width) {
218
                offset = 0;
219
                planep += stride - width;
220
            }
221 222
            *planep++ = code >> 1;
            offset++;
223
            if(offset == width) {
224
                offset = 0;
225
                planep += stride - width;
226
            }
227 228 229 230
        }
        break;
    case IMODE_DIFF6:
    case IMODE_NORM6:
231 232 233
        if(!(height % 3) && (width % 3)) { // use 2x3 decoding
            for(y = 0; y < height; y+= 3) {
                for(x = width & 1; x < width; x += 2) {
234
                    code = get_vlc2(gb, ff_vc1_norm6_vlc.table, VC1_NORM6_VLC_BITS, 2);
235 236 237 238 239 240
                    if(code < 0){
                        av_log(v->s.avctx, AV_LOG_DEBUG, "invalid NORM-6 VLC\n");
                        return -1;
                    }
                    planep[x + 0] = (code >> 0) & 1;
                    planep[x + 1] = (code >> 1) & 1;
241 242 243 244
                    planep[x + 0 + stride] = (code >> 2) & 1;
                    planep[x + 1 + stride] = (code >> 3) & 1;
                    planep[x + 0 + stride * 2] = (code >> 4) & 1;
                    planep[x + 1 + stride * 2] = (code >> 5) & 1;
245
                }
246
                planep += stride * 3;
247
            }
248
            if(width & 1) decode_colskip(data, 1, height, stride, &v->s.gb);
249
        } else { // 3x2
250
            planep += (height & 1) * stride;
251 252
            for(y = height & 1; y < height; y += 2) {
                for(x = width % 3; x < width; x += 3) {
253
                    code = get_vlc2(gb, ff_vc1_norm6_vlc.table, VC1_NORM6_VLC_BITS, 2);
254 255 256 257 258 259 260
                    if(code < 0){
                        av_log(v->s.avctx, AV_LOG_DEBUG, "invalid NORM-6 VLC\n");
                        return -1;
                    }
                    planep[x + 0] = (code >> 0) & 1;
                    planep[x + 1] = (code >> 1) & 1;
                    planep[x + 2] = (code >> 2) & 1;
261 262 263
                    planep[x + 0 + stride] = (code >> 3) & 1;
                    planep[x + 1 + stride] = (code >> 4) & 1;
                    planep[x + 2 + stride] = (code >> 5) & 1;
264
                }
265
                planep += stride * 2;
266
            }
267 268 269
            x = width % 3;
            if(x) decode_colskip(data  ,             x, height    , stride, &v->s.gb);
            if(height & 1) decode_rowskip(data+x, width - x, 1, stride, &v->s.gb);
270 271 272
        }
        break;
    case IMODE_ROWSKIP:
273
        decode_rowskip(data, width, height, stride, &v->s.gb);
274 275
        break;
    case IMODE_COLSKIP:
276
        decode_colskip(data, width, height, stride, &v->s.gb);
277 278 279 280 281 282 283
        break;
    default: break;
    }

    /* Applying diff operator */
    if (imode == IMODE_DIFF2 || imode == IMODE_DIFF6)
    {
284
        planep = data;
285
        planep[0] ^= invert;
286
        for (x=1; x<width; x++)
287
            planep[x] ^= planep[x-1];
288
        for (y=1; y<height; y++)
289
        {
290 291 292
            planep += stride;
            planep[0] ^= planep[-stride];
            for (x=1; x<width; x++)
293
            {
294 295
                if (planep[x-1] != planep[x-stride]) planep[x] ^= invert;
                else                                 planep[x] ^= planep[x-1];
296 297 298
            }
        }
    }
299
    else if (invert)
300
    {
301 302
        planep = data;
        for (x=0; x<stride*height; x++) planep[x] = !planep[x]; //FIXME stride
303
    }
304 305
    return (imode<<1) + invert;
}
306

307
/** @} */ //Bitplane group
308

309 310 311 312 313 314 315 316
#define FILTSIGN(a) ((a) >= 0 ? 1 : -1)
/**
 * VC-1 in-loop deblocking filter for one line
 * @param src source block type
 * @param pq block quantizer
 * @return whether other 3 pairs should be filtered or not
 * @see 8.6
 */
317
static int av_always_inline vc1_filter_line(uint8_t* src, int stride, int pq){
318 319
    uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;

320 321 322 323 324 325 326 327 328 329
    int a0 = (2*(src[-2*stride] - src[ 1*stride]) - 5*(src[-1*stride] - src[ 0*stride]) + 4) >> 3;
    int a0_sign = a0 >> 31;        /* Store sign */
    a0 = (a0 ^ a0_sign) - a0_sign; /* a0 = FFABS(a0); */
    if(a0 < pq){
        int a1 = FFABS((2*(src[-4*stride] - src[-1*stride]) - 5*(src[-3*stride] - src[-2*stride]) + 4) >> 3);
        int a2 = FFABS((2*(src[ 0*stride] - src[ 3*stride]) - 5*(src[ 1*stride] - src[ 2*stride]) + 4) >> 3);
        if(a1 < a0 || a2 < a0){
            int clip = src[-1*stride] - src[ 0*stride];
            int clip_sign = clip >> 31;
            clip = ((clip ^ clip_sign) - clip_sign)>>1;
330
            if(clip){
331 332 333 334 335 336
                int a3 = FFMIN(a1, a2);
                int d = 5 * (a3 - a0);
                int d_sign = (d >> 31);
                d = ((d ^ d_sign) - d_sign) >> 3;
                d_sign ^= a0_sign;

337
                if( d_sign ^ clip_sign )
338 339 340 341 342 343 344 345
                    d = 0;
                else{
                    d = FFMIN(d, clip);
                    d = (d ^ d_sign) - d_sign;          /* Restore sign */
                    src[-1*stride] = cm[src[-1*stride] - d];
                    src[ 0*stride] = cm[src[ 0*stride] + d];
                }
                return 1;
346 347 348
            }
        }
    }
349
    return 0;
350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390
}

/**
 * VC-1 in-loop deblocking filter
 * @param src source block type
 * @param len edge length to filter (4 or 8 pixels)
 * @param pq block quantizer
 * @see 8.6
 */
static void vc1_loop_filter(uint8_t* src, int step, int stride, int len, int pq)
{
    int i;
    int filt3;

    for(i = 0; i < len; i += 4){
        filt3 = vc1_filter_line(src + 2*step, stride, pq);
        if(filt3){
            vc1_filter_line(src + 0*step, stride, pq);
            vc1_filter_line(src + 1*step, stride, pq);
            vc1_filter_line(src + 3*step, stride, pq);
        }
        src += step * 4;
    }
}

static void vc1_loop_filter_iblk(MpegEncContext *s, int pq)
{
    int i, j;
    if(!s->first_slice_line)
        vc1_loop_filter(s->dest[0], 1, s->linesize, 16, pq);
    vc1_loop_filter(s->dest[0] + 8*s->linesize, 1, s->linesize, 16, pq);
    for(i = !s->mb_x*8; i < 16; i += 8)
        vc1_loop_filter(s->dest[0] + i, s->linesize, 1, 16, pq);
    for(j = 0; j < 2; j++){
        if(!s->first_slice_line)
            vc1_loop_filter(s->dest[j+1], 1, s->uvlinesize, 8, pq);
        if(s->mb_x)
            vc1_loop_filter(s->dest[j+1], s->uvlinesize, 1, 8, pq);
    }
}

391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407
/***********************************************************************/
/** VOP Dquant decoding
 * @param v VC-1 Context
 */
static int vop_dquant_decoding(VC1Context *v)
{
    GetBitContext *gb = &v->s.gb;
    int pqdiff;

    //variable size
    if (v->dquant == 2)
    {
        pqdiff = get_bits(gb, 3);
        if (pqdiff == 7) v->altpq = get_bits(gb, 5);
        else v->altpq = v->pq + pqdiff + 1;
    }
    else
408
    {
409
        v->dquantfrm = get_bits1(gb);
410
        if ( v->dquantfrm )
411
        {
412 413
            v->dqprofile = get_bits(gb, 2);
            switch (v->dqprofile)
414
            {
415 416 417 418 419
            case DQPROFILE_SINGLE_EDGE:
            case DQPROFILE_DOUBLE_EDGES:
                v->dqsbedge = get_bits(gb, 2);
                break;
            case DQPROFILE_ALL_MBS:
420
                v->dqbilevel = get_bits1(gb);
421 422
                if(!v->dqbilevel)
                    v->halfpq = 0;
423
            default: break; //Forbidden ?
I
Ivan Kalvachev 已提交
424
            }
425
            if (v->dqbilevel || v->dqprofile != DQPROFILE_ALL_MBS)
426
            {
427 428 429
                pqdiff = get_bits(gb, 3);
                if (pqdiff == 7) v->altpq = get_bits(gb, 5);
                else v->altpq = v->pq + pqdiff + 1;
430 431 432
            }
        }
    }
433 434
    return 0;
}
435

436 437 438 439 440 441 442 443
/** Put block onto picture
 */
static void vc1_put_block(VC1Context *v, DCTELEM block[6][64])
{
    uint8_t *Y;
    int ys, us, vs;
    DSPContext *dsp = &v->s.dsp;

K
Kostya Shishkov 已提交
444 445 446 447 448 449 450 451
    if(v->rangeredfrm) {
        int i, j, k;
        for(k = 0; k < 6; k++)
            for(j = 0; j < 8; j++)
                for(i = 0; i < 8; i++)
                    block[k][i + j*8] = ((block[k][i + j*8] - 128) << 1) + 128;

    }
452 453 454 455 456 457 458 459 460 461 462
    ys = v->s.current_picture.linesize[0];
    us = v->s.current_picture.linesize[1];
    vs = v->s.current_picture.linesize[2];
    Y = v->s.dest[0];

    dsp->put_pixels_clamped(block[0], Y, ys);
    dsp->put_pixels_clamped(block[1], Y + 8, ys);
    Y += ys * 8;
    dsp->put_pixels_clamped(block[2], Y, ys);
    dsp->put_pixels_clamped(block[3], Y + 8, ys);

K
Kostya Shishkov 已提交
463 464 465 466
    if(!(v->s.flags & CODEC_FLAG_GRAY)) {
        dsp->put_pixels_clamped(block[4], v->s.dest[1], us);
        dsp->put_pixels_clamped(block[5], v->s.dest[2], vs);
    }
467 468 469 470 471
}

/** Do motion compensation over 1 macroblock
 * Mostly adapted hpel_motion and qpel_motion from mpegvideo.c
 */
472
static void vc1_mc_1mv(VC1Context *v, int dir)
473 474 475 476
{
    MpegEncContext *s = &v->s;
    DSPContext *dsp = &v->s.dsp;
    uint8_t *srcY, *srcU, *srcV;
477
    int dxy, uvdxy, mx, my, uvmx, uvmy, src_x, src_y, uvsrc_x, uvsrc_y;
478 479 480

    if(!v->s.last_picture.data[0])return;

K
Kostya Shishkov 已提交
481 482 483 484
    mx = s->mv[dir][0][0];
    my = s->mv[dir][0][1];

    // store motion vectors for further use in B frames
485
    if(s->pict_type == FF_P_TYPE) {
K
Kostya Shishkov 已提交
486 487 488
        s->current_picture.motion_val[1][s->block_index[0]][0] = mx;
        s->current_picture.motion_val[1][s->block_index[0]][1] = my;
    }
489 490
    uvmx = (mx + ((mx & 3) == 3)) >> 1;
    uvmy = (my + ((my & 3) == 3)) >> 1;
491 492 493 494
    if(v->fastuvmc) {
        uvmx = uvmx + ((uvmx<0)?(uvmx&1):-(uvmx&1));
        uvmy = uvmy + ((uvmy<0)?(uvmy&1):-(uvmy&1));
    }
495 496 497 498 499 500 501 502 503
    if(!dir) {
        srcY = s->last_picture.data[0];
        srcU = s->last_picture.data[1];
        srcV = s->last_picture.data[2];
    } else {
        srcY = s->next_picture.data[0];
        srcU = s->next_picture.data[1];
        srcV = s->next_picture.data[2];
    }
504

505 506 507 508 509
    src_x = s->mb_x * 16 + (mx >> 2);
    src_y = s->mb_y * 16 + (my >> 2);
    uvsrc_x = s->mb_x * 8 + (uvmx >> 2);
    uvsrc_y = s->mb_y * 8 + (uvmy >> 2);

K
Kostya Shishkov 已提交
510 511 512 513 514 515 516 517 518 519 520
    if(v->profile != PROFILE_ADVANCED){
        src_x   = av_clip(  src_x, -16, s->mb_width  * 16);
        src_y   = av_clip(  src_y, -16, s->mb_height * 16);
        uvsrc_x = av_clip(uvsrc_x,  -8, s->mb_width  *  8);
        uvsrc_y = av_clip(uvsrc_y,  -8, s->mb_height *  8);
    }else{
        src_x   = av_clip(  src_x, -17, s->avctx->coded_width);
        src_y   = av_clip(  src_y, -18, s->avctx->coded_height + 1);
        uvsrc_x = av_clip(uvsrc_x,  -8, s->avctx->coded_width  >> 1);
        uvsrc_y = av_clip(uvsrc_y,  -8, s->avctx->coded_height >> 1);
    }
521 522 523 524 525

    srcY += src_y * s->linesize + src_x;
    srcU += uvsrc_y * s->uvlinesize + uvsrc_x;
    srcV += uvsrc_y * s->uvlinesize + uvsrc_x;

K
Kostya Shishkov 已提交
526 527 528 529 530 531
    /* for grayscale we should not try to read from unknown area */
    if(s->flags & CODEC_FLAG_GRAY) {
        srcU = s->edge_emu_buffer + 18 * s->linesize;
        srcV = s->edge_emu_buffer + 18 * s->linesize;
    }

K
Kostya Shishkov 已提交
532
    if(v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
533 534 535
       || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 16 - s->mspel*3
       || (unsigned)(src_y - s->mspel) > s->v_edge_pos - (my&3) - 16 - s->mspel*3){
        uint8_t *uvbuf= s->edge_emu_buffer + 19 * s->linesize;
536

537 538 539
        srcY -= s->mspel * (1 + s->linesize);
        ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 17+s->mspel*2, 17+s->mspel*2,
                            src_x - s->mspel, src_y - s->mspel, s->h_edge_pos, s->v_edge_pos);
540 541 542 543 544 545 546
        srcY = s->edge_emu_buffer;
        ff_emulated_edge_mc(uvbuf     , srcU, s->uvlinesize, 8+1, 8+1,
                            uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
        ff_emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, 8+1, 8+1,
                            uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
        srcU = uvbuf;
        srcV = uvbuf + 16;
K
Kostya Shishkov 已提交
547 548 549 550 551 552
        /* if we deal with range reduction we need to scale source blocks */
        if(v->rangeredfrm) {
            int i, j;
            uint8_t *src, *src2;

            src = srcY;
553 554
            for(j = 0; j < 17 + s->mspel*2; j++) {
                for(i = 0; i < 17 + s->mspel*2; i++) src[i] = ((src[i] - 128) >> 1) + 128;
K
Kostya Shishkov 已提交
555 556 557 558 559 560 561 562 563 564 565 566
                src += s->linesize;
            }
            src = srcU; src2 = srcV;
            for(j = 0; j < 9; j++) {
                for(i = 0; i < 9; i++) {
                    src[i] = ((src[i] - 128) >> 1) + 128;
                    src2[i] = ((src2[i] - 128) >> 1) + 128;
                }
                src += s->uvlinesize;
                src2 += s->uvlinesize;
            }
        }
567 568 569 570 571 572
        /* if we deal with intensity compensation we need to scale source blocks */
        if(v->mv_mode == MV_PMODE_INTENSITY_COMP) {
            int i, j;
            uint8_t *src, *src2;

            src = srcY;
573 574
            for(j = 0; j < 17 + s->mspel*2; j++) {
                for(i = 0; i < 17 + s->mspel*2; i++) src[i] = v->luty[src[i]];
575 576 577 578 579 580 581 582 583 584 585 586
                src += s->linesize;
            }
            src = srcU; src2 = srcV;
            for(j = 0; j < 9; j++) {
                for(i = 0; i < 9; i++) {
                    src[i] = v->lutuv[src[i]];
                    src2[i] = v->lutuv[src2[i]];
                }
                src += s->uvlinesize;
                src2 += s->uvlinesize;
            }
        }
587
        srcY += s->mspel * (1 + s->linesize);
588 589
    }

590 591 592 593 594 595 596
    if(s->mspel) {
        dxy = ((my & 3) << 2) | (mx & 3);
        dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0]    , srcY    , s->linesize, v->rnd);
        dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8, srcY + 8, s->linesize, v->rnd);
        srcY += s->linesize * 8;
        dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize    , srcY    , s->linesize, v->rnd);
        dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + 8 * s->linesize + 8, srcY + 8, s->linesize, v->rnd);
597 598
    } else { // hpel mc - always used for luma
        dxy = (my & 2) | ((mx & 2) >> 1);
599

600 601 602 603 604
        if(!v->rnd)
            dsp->put_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16);
        else
            dsp->put_no_rnd_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16);
    }
K
Kostya Shishkov 已提交
605 606

    if(s->flags & CODEC_FLAG_GRAY) return;
K
Kostya Shishkov 已提交
607
    /* Chroma MC always uses qpel bilinear */
608
    uvdxy = ((uvmy & 3) << 2) | (uvmx & 3);
609 610 611 612 613 614 615 616 617
    uvmx = (uvmx&3)<<1;
    uvmy = (uvmy&3)<<1;
    if(!v->rnd){
        dsp->put_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
        dsp->put_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
    }else{
        dsp->put_no_rnd_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
        dsp->put_no_rnd_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
    }
618 619
}

K
Kostya Shishkov 已提交
620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639
/** Do motion compensation for 4-MV macroblock - luminance block
 */
static void vc1_mc_4mv_luma(VC1Context *v, int n)
{
    MpegEncContext *s = &v->s;
    DSPContext *dsp = &v->s.dsp;
    uint8_t *srcY;
    int dxy, mx, my, src_x, src_y;
    int off;

    if(!v->s.last_picture.data[0])return;
    mx = s->mv[0][n][0];
    my = s->mv[0][n][1];
    srcY = s->last_picture.data[0];

    off = s->linesize * 4 * (n&2) + (n&1) * 8;

    src_x = s->mb_x * 16 + (n&1) * 8 + (mx >> 2);
    src_y = s->mb_y * 16 + (n&2) * 4 + (my >> 2);

K
Kostya Shishkov 已提交
640 641 642 643 644 645 646
    if(v->profile != PROFILE_ADVANCED){
        src_x   = av_clip(  src_x, -16, s->mb_width  * 16);
        src_y   = av_clip(  src_y, -16, s->mb_height * 16);
    }else{
        src_x   = av_clip(  src_x, -17, s->avctx->coded_width);
        src_y   = av_clip(  src_y, -18, s->avctx->coded_height + 1);
    }
K
Kostya Shishkov 已提交
647 648 649

    srcY += src_y * s->linesize + src_x;

650
    if(v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
651 652
       || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx&3) - 8 - s->mspel*2
       || (unsigned)(src_y - s->mspel) > s->v_edge_pos - (my&3) - 8 - s->mspel*2){
653 654 655
        srcY -= s->mspel * (1 + s->linesize);
        ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 9+s->mspel*2, 9+s->mspel*2,
                            src_x - s->mspel, src_y - s->mspel, s->h_edge_pos, s->v_edge_pos);
K
Kostya Shishkov 已提交
656
        srcY = s->edge_emu_buffer;
K
Kostya Shishkov 已提交
657 658 659 660 661 662
        /* if we deal with range reduction we need to scale source blocks */
        if(v->rangeredfrm) {
            int i, j;
            uint8_t *src;

            src = srcY;
663 664
            for(j = 0; j < 9 + s->mspel*2; j++) {
                for(i = 0; i < 9 + s->mspel*2; i++) src[i] = ((src[i] - 128) >> 1) + 128;
K
Kostya Shishkov 已提交
665 666 667
                src += s->linesize;
            }
        }
668 669 670 671 672 673 674 675 676 677 678
        /* if we deal with intensity compensation we need to scale source blocks */
        if(v->mv_mode == MV_PMODE_INTENSITY_COMP) {
            int i, j;
            uint8_t *src;

            src = srcY;
            for(j = 0; j < 9 + s->mspel*2; j++) {
                for(i = 0; i < 9 + s->mspel*2; i++) src[i] = v->luty[src[i]];
                src += s->linesize;
            }
        }
679
        srcY += s->mspel * (1 + s->linesize);
K
Kostya Shishkov 已提交
680 681
    }

682 683 684
    if(s->mspel) {
        dxy = ((my & 3) << 2) | (mx & 3);
        dsp->put_vc1_mspel_pixels_tab[dxy](s->dest[0] + off, srcY, s->linesize, v->rnd);
685 686
    } else { // hpel mc - always used for luma
        dxy = (my & 2) | ((mx & 2) >> 1);
687 688 689 690
        if(!v->rnd)
            dsp->put_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize, 8);
        else
            dsp->put_no_rnd_pixels_tab[1][dxy](s->dest[0] + off, srcY, s->linesize, 8);
K
Kostya Shishkov 已提交
691 692 693 694 695
    }
}

static inline int median4(int a, int b, int c, int d)
{
696
    if(a < b) {
697 698
        if(c < d) return (FFMIN(b, d) + FFMAX(a, c)) / 2;
        else      return (FFMIN(b, c) + FFMAX(a, d)) / 2;
699
    } else {
700 701
        if(c < d) return (FFMIN(a, d) + FFMAX(b, c)) / 2;
        else      return (FFMIN(a, c) + FFMAX(b, d)) / 2;
702
    }
K
Kostya Shishkov 已提交
703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718
}


/** Do motion compensation for 4-MV macroblock - both chroma blocks
 */
static void vc1_mc_4mv_chroma(VC1Context *v)
{
    MpegEncContext *s = &v->s;
    DSPContext *dsp = &v->s.dsp;
    uint8_t *srcU, *srcV;
    int uvdxy, uvmx, uvmy, uvsrc_x, uvsrc_y;
    int i, idx, tx = 0, ty = 0;
    int mvx[4], mvy[4], intra[4];
    static const int count[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};

    if(!v->s.last_picture.data[0])return;
K
Kostya Shishkov 已提交
719
    if(s->flags & CODEC_FLAG_GRAY) return;
K
Kostya Shishkov 已提交
720 721 722 723 724 725 726 727

    for(i = 0; i < 4; i++) {
        mvx[i] = s->mv[0][i][0];
        mvy[i] = s->mv[0][i][1];
        intra[i] = v->mb_type[0][s->block_index[i]];
    }

    /* calculate chroma MV vector from four luma MVs */
728
    idx = (intra[3] << 3) | (intra[2] << 2) | (intra[1] << 1) | intra[0];
K
Kostya Shishkov 已提交
729 730 731 732 733 734 735
    if(!idx) { // all blocks are inter
        tx = median4(mvx[0], mvx[1], mvx[2], mvx[3]);
        ty = median4(mvy[0], mvy[1], mvy[2], mvy[3]);
    } else if(count[idx] == 1) { // 3 inter blocks
        switch(idx) {
        case 0x1:
            tx = mid_pred(mvx[1], mvx[2], mvx[3]);
736
            ty = mid_pred(mvy[1], mvy[2], mvy[3]);
K
Kostya Shishkov 已提交
737 738 739
            break;
        case 0x2:
            tx = mid_pred(mvx[0], mvx[2], mvx[3]);
740
            ty = mid_pred(mvy[0], mvy[2], mvy[3]);
K
Kostya Shishkov 已提交
741 742 743
            break;
        case 0x4:
            tx = mid_pred(mvx[0], mvx[1], mvx[3]);
744
            ty = mid_pred(mvy[0], mvy[1], mvy[3]);
K
Kostya Shishkov 已提交
745 746 747
            break;
        case 0x8:
            tx = mid_pred(mvx[0], mvx[1], mvx[2]);
748
            ty = mid_pred(mvy[0], mvy[1], mvy[2]);
K
Kostya Shishkov 已提交
749 750 751 752 753 754
            break;
        }
    } else if(count[idx] == 2) {
        int t1 = 0, t2 = 0;
        for(i=0; i<3;i++) if(!intra[i]) {t1 = i; break;}
        for(i= t1+1; i<4; i++)if(!intra[i]) {t2 = i; break;}
755 756
        tx = (mvx[t1] + mvx[t2]) / 2;
        ty = (mvy[t1] + mvy[t2]) / 2;
757 758 759
    } else {
        s->current_picture.motion_val[1][s->block_index[0]][0] = 0;
        s->current_picture.motion_val[1][s->block_index[0]][1] = 0;
K
Kostya Shishkov 已提交
760
        return; //no need to do MC for inter blocks
761
    }
K
Kostya Shishkov 已提交
762

K
Kostya Shishkov 已提交
763 764
    s->current_picture.motion_val[1][s->block_index[0]][0] = tx;
    s->current_picture.motion_val[1][s->block_index[0]][1] = ty;
K
Kostya Shishkov 已提交
765 766
    uvmx = (tx + ((tx&3) == 3)) >> 1;
    uvmy = (ty + ((ty&3) == 3)) >> 1;
767 768 769 770
    if(v->fastuvmc) {
        uvmx = uvmx + ((uvmx<0)?(uvmx&1):-(uvmx&1));
        uvmy = uvmy + ((uvmy<0)?(uvmy&1):-(uvmy&1));
    }
K
Kostya Shishkov 已提交
771 772 773 774

    uvsrc_x = s->mb_x * 8 + (uvmx >> 2);
    uvsrc_y = s->mb_y * 8 + (uvmy >> 2);

K
Kostya Shishkov 已提交
775 776 777 778 779 780 781
    if(v->profile != PROFILE_ADVANCED){
        uvsrc_x = av_clip(uvsrc_x,  -8, s->mb_width  *  8);
        uvsrc_y = av_clip(uvsrc_y,  -8, s->mb_height *  8);
    }else{
        uvsrc_x = av_clip(uvsrc_x,  -8, s->avctx->coded_width  >> 1);
        uvsrc_y = av_clip(uvsrc_y,  -8, s->avctx->coded_height >> 1);
    }
782

K
Kostya Shishkov 已提交
783 784
    srcU = s->last_picture.data[1] + uvsrc_y * s->uvlinesize + uvsrc_x;
    srcV = s->last_picture.data[2] + uvsrc_y * s->uvlinesize + uvsrc_x;
785 786
    if(v->rangeredfrm || (v->mv_mode == MV_PMODE_INTENSITY_COMP)
       || (unsigned)uvsrc_x > (s->h_edge_pos >> 1) - 9
K
Kostya Shishkov 已提交
787
       || (unsigned)uvsrc_y > (s->v_edge_pos >> 1) - 9){
K
Kostya Shishkov 已提交
788 789 790 791 792 793
        ff_emulated_edge_mc(s->edge_emu_buffer     , srcU, s->uvlinesize, 8+1, 8+1,
                            uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
        ff_emulated_edge_mc(s->edge_emu_buffer + 16, srcV, s->uvlinesize, 8+1, 8+1,
                            uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
        srcU = s->edge_emu_buffer;
        srcV = s->edge_emu_buffer + 16;
K
Kostya Shishkov 已提交
794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809

        /* if we deal with range reduction we need to scale source blocks */
        if(v->rangeredfrm) {
            int i, j;
            uint8_t *src, *src2;

            src = srcU; src2 = srcV;
            for(j = 0; j < 9; j++) {
                for(i = 0; i < 9; i++) {
                    src[i] = ((src[i] - 128) >> 1) + 128;
                    src2[i] = ((src2[i] - 128) >> 1) + 128;
                }
                src += s->uvlinesize;
                src2 += s->uvlinesize;
            }
        }
810 811 812 813 814 815 816 817 818 819 820 821 822 823 824
        /* if we deal with intensity compensation we need to scale source blocks */
        if(v->mv_mode == MV_PMODE_INTENSITY_COMP) {
            int i, j;
            uint8_t *src, *src2;

            src = srcU; src2 = srcV;
            for(j = 0; j < 9; j++) {
                for(i = 0; i < 9; i++) {
                    src[i] = v->lutuv[src[i]];
                    src2[i] = v->lutuv[src2[i]];
                }
                src += s->uvlinesize;
                src2 += s->uvlinesize;
            }
        }
K
Kostya Shishkov 已提交
825 826
    }

K
Kostya Shishkov 已提交
827
    /* Chroma MC always uses qpel bilinear */
828
    uvdxy = ((uvmy & 3) << 2) | (uvmx & 3);
829 830 831 832 833 834 835 836 837
    uvmx = (uvmx&3)<<1;
    uvmy = (uvmy&3)<<1;
    if(!v->rnd){
        dsp->put_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
        dsp->put_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
    }else{
        dsp->put_no_rnd_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
        dsp->put_no_rnd_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
    }
K
Kostya Shishkov 已提交
838 839
}

840 841
static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb);

842
/**
A
anonymous 已提交
843 844 845 846 847 848
 * Decode Simple/Main Profiles sequence header
 * @see Figure 7-8, p16-17
 * @param avctx Codec context
 * @param gb GetBit context initialized from Codec context extra_data
 * @return Status
 */
849 850
static int decode_sequence_header(AVCodecContext *avctx, GetBitContext *gb)
{
851
    VC1Context *v = avctx->priv_data;
852

853
    av_log(avctx, AV_LOG_DEBUG, "Header: %0X\n", show_bits(gb, 32));
854
    v->profile = get_bits(gb, 2);
855
    if (v->profile == PROFILE_COMPLEX)
856
    {
857
        av_log(avctx, AV_LOG_ERROR, "WMV3 Complex Profile is not fully supported\n");
858
    }
859

860
    if (v->profile == PROFILE_ADVANCED)
861
    {
862 863
        v->zz_8x4 = ff_vc1_adv_progressive_8x4_zz;
        v->zz_4x8 = ff_vc1_adv_progressive_4x8_zz;
864
        return decode_sequence_header_adv(v, gb);
865 866 867
    }
    else
    {
S
Stefan Gehrer 已提交
868 869
        v->zz_8x4 = wmv2_scantableA;
        v->zz_4x8 = wmv2_scantableB;
870 871 872 873 874
        v->res_sm = get_bits(gb, 2); //reserved
        if (v->res_sm)
        {
            av_log(avctx, AV_LOG_ERROR,
                   "Reserved RES_SM=%i is forbidden\n", v->res_sm);
875
            return -1;
876 877 878 879 880 881 882
        }
    }

    // (fps-2)/4 (->30)
    v->frmrtq_postproc = get_bits(gb, 3); //common
    // (bitrate-32kbps)/64kbps
    v->bitrtq_postproc = get_bits(gb, 5); //common
883
    v->s.loop_filter = get_bits1(gb); //common
884 885 886 887 888
    if(v->s.loop_filter == 1 && v->profile == PROFILE_SIMPLE)
    {
        av_log(avctx, AV_LOG_ERROR,
               "LOOPFILTER shell not be enabled in simple profile\n");
    }
889 890
    if(v->s.avctx->skip_loop_filter >= AVDISCARD_ALL)
        v->s.loop_filter = 0;
891

892 893 894
    v->res_x8 = get_bits1(gb); //reserved
    v->multires = get_bits1(gb);
    v->res_fasttx = get_bits1(gb);
895 896
    if (!v->res_fasttx)
    {
897 898 899
        v->s.dsp.vc1_inv_trans_8x8 = ff_simple_idct;
        v->s.dsp.vc1_inv_trans_8x4 = ff_simple_idct84_add;
        v->s.dsp.vc1_inv_trans_4x8 = ff_simple_idct48_add;
900
        v->s.dsp.vc1_inv_trans_4x4 = ff_simple_idct44_add;
901 902
    }

903
    v->fastuvmc =  get_bits1(gb); //common
904 905 906 907 908 909
    if (!v->profile && !v->fastuvmc)
    {
        av_log(avctx, AV_LOG_ERROR,
               "FASTUVMC unavailable in Simple Profile\n");
        return -1;
    }
910
    v->extended_mv =  get_bits1(gb); //common
911 912 913 914 915 916 917
    if (!v->profile && v->extended_mv)
    {
        av_log(avctx, AV_LOG_ERROR,
               "Extended MVs unavailable in Simple Profile\n");
        return -1;
    }
    v->dquant =  get_bits(gb, 2); //common
918
    v->vstransform =  get_bits1(gb); //common
I
Ivan Kalvachev 已提交
919

920
    v->res_transtab = get_bits1(gb);
921
    if (v->res_transtab)
922
    {
923 924 925
        av_log(avctx, AV_LOG_ERROR,
               "1 for reserved RES_TRANSTAB is forbidden\n");
        return -1;
926 927
    }

928
    v->overlap = get_bits1(gb); //common
929

930 931
    v->s.resync_marker = get_bits1(gb);
    v->rangered = get_bits1(gb);
932
    if (v->rangered && v->profile == PROFILE_SIMPLE)
933
    {
934 935
        av_log(avctx, AV_LOG_INFO,
               "RANGERED should be set to 0 in simple profile\n");
936 937
    }

A
anonymous 已提交
938
    v->s.max_b_frames = avctx->max_b_frames = get_bits(gb, 3); //common
939 940
    v->quantizer_mode = get_bits(gb, 2); //common

941 942
    v->finterpflag = get_bits1(gb); //common
    v->res_rtm_flag = get_bits1(gb); //reserved
943
    if (!v->res_rtm_flag)
944
    {
945 946
//            av_log(avctx, AV_LOG_ERROR,
//                   "0 for reserved RES_RTM_FLAG is forbidden\n");
947 948 949 950
        av_log(avctx, AV_LOG_ERROR,
               "Old WMV3 version detected, only I-frames will be decoded\n");
        //return -1;
    }
951 952
    //TODO: figure out what they mean (always 0x402F)
    if(!v->res_fasttx) skip_bits(gb, 16);
953
    av_log(avctx, AV_LOG_DEBUG,
954
               "Profile %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n"
955
               "LoopFilter=%i, MultiRes=%i, FastUVMC=%i, Extended MV=%i\n"
956 957 958
               "Rangered=%i, VSTransform=%i, Overlap=%i, SyncMarker=%i\n"
               "DQuant=%i, Quantizer mode=%i, Max B frames=%i\n",
               v->profile, v->frmrtq_postproc, v->bitrtq_postproc,
A
anonymous 已提交
959
               v->s.loop_filter, v->multires, v->fastuvmc, v->extended_mv,
A
anonymous 已提交
960
               v->rangered, v->vstransform, v->overlap, v->s.resync_marker,
961 962
               v->dquant, v->quantizer_mode, avctx->max_b_frames
               );
963
    return 0;
964 965
}

966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985
static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb)
{
    v->res_rtm_flag = 1;
    v->level = get_bits(gb, 3);
    if(v->level >= 5)
    {
        av_log(v->s.avctx, AV_LOG_ERROR, "Reserved LEVEL %i\n",v->level);
    }
    v->chromaformat = get_bits(gb, 2);
    if (v->chromaformat != 1)
    {
        av_log(v->s.avctx, AV_LOG_ERROR,
               "Only 4:2:0 chroma format supported\n");
        return -1;
    }

    // (fps-2)/4 (->30)
    v->frmrtq_postproc = get_bits(gb, 3); //common
    // (bitrate-32kbps)/64kbps
    v->bitrtq_postproc = get_bits(gb, 5); //common
986
    v->postprocflag = get_bits1(gb); //common
987 988 989

    v->s.avctx->coded_width = (get_bits(gb, 12) + 1) << 1;
    v->s.avctx->coded_height = (get_bits(gb, 12) + 1) << 1;
990 991
    v->s.avctx->width = v->s.avctx->coded_width;
    v->s.avctx->height = v->s.avctx->coded_height;
992 993 994 995
    v->broadcast = get_bits1(gb);
    v->interlace = get_bits1(gb);
    v->tfcntrflag = get_bits1(gb);
    v->finterpflag = get_bits1(gb);
996
    skip_bits1(gb); // reserved
997

998 999 1000
    v->s.h_edge_pos = v->s.avctx->coded_width;
    v->s.v_edge_pos = v->s.avctx->coded_height;

1001 1002 1003 1004 1005 1006 1007 1008 1009
    av_log(v->s.avctx, AV_LOG_DEBUG,
               "Advanced Profile level %i:\nfrmrtq_postproc=%i, bitrtq_postproc=%i\n"
               "LoopFilter=%i, ChromaFormat=%i, Pulldown=%i, Interlace: %i\n"
               "TFCTRflag=%i, FINTERPflag=%i\n",
               v->level, v->frmrtq_postproc, v->bitrtq_postproc,
               v->s.loop_filter, v->chromaformat, v->broadcast, v->interlace,
               v->tfcntrflag, v->finterpflag
               );

1010 1011 1012 1013 1014
    v->psf = get_bits1(gb);
    if(v->psf) { //PsF, 6.1.13
        av_log(v->s.avctx, AV_LOG_ERROR, "Progressive Segmented Frame mode: not supported (yet)\n");
        return -1;
    }
1015
    v->s.max_b_frames = v->s.avctx->max_b_frames = 7;
1016 1017
    if(get_bits1(gb)) { //Display Info - decoding is not affected by it
        int w, h, ar = 0;
1018
        av_log(v->s.avctx, AV_LOG_DEBUG, "Display extended info:\n");
1019 1020
        v->s.avctx->coded_width  = w = get_bits(gb, 14) + 1;
        v->s.avctx->coded_height = h = get_bits(gb, 14) + 1;
1021
        av_log(v->s.avctx, AV_LOG_DEBUG, "Display dimensions: %ix%i\n", w, h);
1022 1023
        if(get_bits1(gb))
            ar = get_bits(gb, 4);
1024
        if(ar && ar < 14){
1025
            v->s.avctx->sample_aspect_ratio = ff_vc1_pixel_aspect[ar];
1026
        }else if(ar == 15){
1027 1028
            w = get_bits(gb, 8);
            h = get_bits(gb, 8);
1029
            v->s.avctx->sample_aspect_ratio = (AVRational){w, h};
1030
        }
1031
        av_log(v->s.avctx, AV_LOG_DEBUG, "Aspect: %i:%i\n", v->s.avctx->sample_aspect_ratio.num, v->s.avctx->sample_aspect_ratio.den);
1032 1033 1034

        if(get_bits1(gb)){ //framerate stuff
            if(get_bits1(gb)) {
K
Kostya Shishkov 已提交
1035 1036
                v->s.avctx->time_base.num = 32;
                v->s.avctx->time_base.den = get_bits(gb, 16) + 1;
1037
            } else {
K
Kostya Shishkov 已提交
1038 1039 1040 1041
                int nr, dr;
                nr = get_bits(gb, 8);
                dr = get_bits(gb, 4);
                if(nr && nr < 8 && dr && dr < 3){
1042 1043
                    v->s.avctx->time_base.num = ff_vc1_fps_dr[dr - 1];
                    v->s.avctx->time_base.den = ff_vc1_fps_nr[nr - 1] * 1000;
K
Kostya Shishkov 已提交
1044
                }
1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058
            }
        }

        if(get_bits1(gb)){
            v->color_prim = get_bits(gb, 8);
            v->transfer_char = get_bits(gb, 8);
            v->matrix_coef = get_bits(gb, 8);
        }
    }

    v->hrd_param_flag = get_bits1(gb);
    if(v->hrd_param_flag) {
        int i;
        v->hrd_num_leaky_buckets = get_bits(gb, 5);
1059 1060
        skip_bits(gb, 4); //bitrate exponent
        skip_bits(gb, 4); //buffer size exponent
1061
        for(i = 0; i < v->hrd_num_leaky_buckets; i++) {
1062 1063
            skip_bits(gb, 16); //hrd_rate[n]
            skip_bits(gb, 16); //hrd_buffer[n]
1064 1065 1066 1067 1068 1069 1070 1071
        }
    }
    return 0;
}

static int decode_entry_point(AVCodecContext *avctx, GetBitContext *gb)
{
    VC1Context *v = avctx->priv_data;
1072
    int i, blink, clentry;
1073 1074

    av_log(avctx, AV_LOG_DEBUG, "Entry point: %08X\n", show_bits_long(gb, 32));
1075
    blink = get_bits1(gb); // broken link
1076
    clentry = get_bits1(gb); // closed entry
1077
    v->panscanflag = get_bits1(gb);
1078
    v->refdist_flag = get_bits1(gb);
1079 1080 1081 1082 1083 1084 1085 1086 1087 1088
    v->s.loop_filter = get_bits1(gb);
    v->fastuvmc = get_bits1(gb);
    v->extended_mv = get_bits1(gb);
    v->dquant = get_bits(gb, 2);
    v->vstransform = get_bits1(gb);
    v->overlap = get_bits1(gb);
    v->quantizer_mode = get_bits(gb, 2);

    if(v->hrd_param_flag){
        for(i = 0; i < v->hrd_num_leaky_buckets; i++) {
1089
            skip_bits(gb, 8); //hrd_full[n]
1090 1091 1092 1093 1094 1095 1096 1097 1098
        }
    }

    if(get_bits1(gb)){
        avctx->coded_width = (get_bits(gb, 12)+1)<<1;
        avctx->coded_height = (get_bits(gb, 12)+1)<<1;
    }
    if(v->extended_mv)
        v->extended_dmv = get_bits1(gb);
1099
    if((v->range_mapy_flag = get_bits1(gb))) {
1100
        av_log(avctx, AV_LOG_ERROR, "Luma scaling is not supported, expect wrong picture\n");
1101
        v->range_mapy = get_bits(gb, 3);
1102
    }
1103
    if((v->range_mapuv_flag = get_bits1(gb))) {
1104
        av_log(avctx, AV_LOG_ERROR, "Chroma scaling is not supported, expect wrong picture\n");
1105
        v->range_mapuv = get_bits(gb, 3);
1106 1107
    }

1108 1109 1110 1111
    av_log(avctx, AV_LOG_DEBUG, "Entry point info:\n"
        "BrokenLink=%i, ClosedEntry=%i, PanscanFlag=%i\n"
        "RefDist=%i, Postproc=%i, FastUVMC=%i, ExtMV=%i\n"
        "DQuant=%i, VSTransform=%i, Overlap=%i, Qmode=%i\n",
1112
        blink, clentry, v->panscanflag, v->refdist_flag, v->s.loop_filter,
1113 1114
        v->fastuvmc, v->extended_mv, v->dquant, v->vstransform, v->overlap, v->quantizer_mode);

1115 1116
    return 0;
}
1117

1118
static int vc1_parse_frame_header(VC1Context *v, GetBitContext* gb)
1119
{
1120 1121
    int pqindex, lowquant, status;

1122
    if(v->finterpflag) v->interpfrm = get_bits1(gb);
1123 1124
    skip_bits(gb, 2); //framecnt unused
    v->rangeredfrm = 0;
1125 1126
    if (v->rangered) v->rangeredfrm = get_bits1(gb);
    v->s.pict_type = get_bits1(gb);
1127 1128
    if (v->s.avctx->max_b_frames) {
        if (!v->s.pict_type) {
1129 1130 1131 1132
            if (get_bits1(gb)) v->s.pict_type = FF_I_TYPE;
            else v->s.pict_type = FF_B_TYPE;
        } else v->s.pict_type = FF_P_TYPE;
    } else v->s.pict_type = v->s.pict_type ? FF_P_TYPE : FF_I_TYPE;
1133

K
Kostya Shishkov 已提交
1134
    v->bi_type = 0;
1135
    if(v->s.pict_type == FF_B_TYPE) {
1136 1137
        v->bfraction = get_vlc2(gb, ff_vc1_bfraction_vlc.table, VC1_BFRACTION_VLC_BITS, 1);
        v->bfraction = ff_vc1_bfraction_lut[v->bfraction];
K
Kostya Shishkov 已提交
1138
        if(v->bfraction == 0) {
1139
            v->s.pict_type = FF_BI_TYPE;
1140 1141
        }
    }
1142
    if(v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_BI_TYPE)
1143
        skip_bits(gb, 7); // skip buffer fullness
1144

1145
    /* calculate RND */
1146
    if(v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_BI_TYPE)
1147
        v->rnd = 1;
1148
    if(v->s.pict_type == FF_P_TYPE)
1149 1150
        v->rnd ^= 1;

1151 1152
    /* Quantizer stuff */
    pqindex = get_bits(gb, 5);
K
Kostya Shishkov 已提交
1153
    if(!pqindex) return -1;
1154
    if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
1155
        v->pq = ff_vc1_pquant_table[0][pqindex];
1156
    else
1157
        v->pq = ff_vc1_pquant_table[1][pqindex];
1158

1159
    v->pquantizer = 1;
1160 1161
    if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
        v->pquantizer = pqindex < 9;
1162 1163
    if (v->quantizer_mode == QUANT_NON_UNIFORM)
        v->pquantizer = 0;
1164
    v->pqindex = pqindex;
1165
    if (pqindex < 9) v->halfpq = get_bits1(gb);
1166 1167
    else v->halfpq = 0;
    if (v->quantizer_mode == QUANT_FRAME_EXPLICIT)
1168
        v->pquantizer = get_bits1(gb);
1169
    v->dquantfrm = 0;
1170
    if (v->extended_mv == 1) v->mvrange = get_unary(gb, 0, 3);
1171 1172 1173 1174 1175 1176
    v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13
    v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11
    v->range_x = 1 << (v->k_x - 1);
    v->range_y = 1 << (v->k_y - 1);
    if (v->profile == PROFILE_ADVANCED)
    {
1177
        if (v->postprocflag) v->postproc = get_bits1(gb);
1178 1179
    }
    else
1180
        if (v->multires && v->s.pict_type != FF_B_TYPE) v->respic = get_bits(gb, 2);
1181

1182
    if(v->res_x8 && (v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_BI_TYPE)){
1183 1184
        v->x8_type = get_bits1(gb);
    }else v->x8_type = 0;
1185
//av_log(v->s.avctx, AV_LOG_INFO, "%c Frame: QP=[%i]%i (+%i/2) %i\n",
1186
//        (v->s.pict_type == FF_P_TYPE) ? 'P' : ((v->s.pict_type == FF_I_TYPE) ? 'I' : 'B'), pqindex, v->pq, v->halfpq, v->rangeredfrm);
1187

1188
    if(v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_P_TYPE) v->use_ic = 0;
1189

1190
    switch(v->s.pict_type) {
1191
    case FF_P_TYPE:
1192 1193 1194 1195 1196
        if (v->pq < 5) v->tt_index = 0;
        else if(v->pq < 13) v->tt_index = 1;
        else v->tt_index = 2;

        lowquant = (v->pq > 12) ? 0 : 1;
1197
        v->mv_mode = ff_vc1_mv_pmode_table[lowquant][get_unary(gb, 1, 4)];
1198 1199
        if (v->mv_mode == MV_PMODE_INTENSITY_COMP)
        {
1200
            int scale, shift, i;
1201
            v->mv_mode2 = ff_vc1_mv_pmode_table2[lowquant][get_unary(gb, 1, 3)];
1202 1203
            v->lumscale = get_bits(gb, 6);
            v->lumshift = get_bits(gb, 6);
1204
            v->use_ic = 1;
1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218
            /* fill lookup tables for intensity compensation */
            if(!v->lumscale) {
                scale = -64;
                shift = (255 - v->lumshift * 2) << 6;
                if(v->lumshift > 31)
                    shift += 128 << 6;
            } else {
                scale = v->lumscale + 32;
                if(v->lumshift > 31)
                    shift = (v->lumshift - 64) << 6;
                else
                    shift = v->lumshift << 6;
            }
            for(i = 0; i < 256; i++) {
1219 1220
                v->luty[i] = av_clip_uint8((scale * i + shift + 32) >> 6);
                v->lutuv[i] = av_clip_uint8((scale * (i - 128) + 128*64 + 32) >> 6);
1221
            }
1222 1223
        }
        if(v->mv_mode == MV_PMODE_1MV_HPEL || v->mv_mode == MV_PMODE_1MV_HPEL_BILIN)
1224
            v->s.quarter_sample = 0;
1225 1226 1227 1228 1229 1230
        else if(v->mv_mode == MV_PMODE_INTENSITY_COMP) {
            if(v->mv_mode2 == MV_PMODE_1MV_HPEL || v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN)
                v->s.quarter_sample = 0;
            else
                v->s.quarter_sample = 1;
        } else
1231
            v->s.quarter_sample = 1;
1232
        v->s.mspel = !(v->mv_mode == MV_PMODE_1MV_HPEL_BILIN || (v->mv_mode == MV_PMODE_INTENSITY_COMP && v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN));
1233 1234 1235 1236 1237

        if ((v->mv_mode == MV_PMODE_INTENSITY_COMP &&
                 v->mv_mode2 == MV_PMODE_MIXED_MV)
                || v->mv_mode == MV_PMODE_MIXED_MV)
        {
1238
            status = bitplane_decoding(v->mv_type_mb_plane, &v->mv_type_is_raw, v);
1239 1240 1241
            if (status < 0) return -1;
            av_log(v->s.avctx, AV_LOG_DEBUG, "MB MV Type plane encoding: "
                   "Imode: %i, Invert: %i\n", status>>1, status&1);
1242 1243 1244
        } else {
            v->mv_type_is_raw = 0;
            memset(v->mv_type_mb_plane, 0, v->s.mb_stride * v->s.mb_height);
1245
        }
1246
        status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
1247 1248 1249 1250 1251
        if (status < 0) return -1;
        av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
               "Imode: %i, Invert: %i\n", status>>1, status&1);

        /* Hopefully this is correct for P frames */
1252 1253
        v->s.mv_table_index = get_bits(gb, 2); //but using ff_vc1_ tables
        v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[get_bits(gb, 2)];
1254 1255 1256 1257 1258 1259 1260 1261 1262 1263

        if (v->dquant)
        {
            av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
            vop_dquant_decoding(v);
        }

        v->ttfrm = 0; //FIXME Is that so ?
        if (v->vstransform)
        {
1264
            v->ttmbf = get_bits1(gb);
1265 1266
            if (v->ttmbf)
            {
1267
                v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)];
1268
            }
1269 1270 1271
        } else {
            v->ttmbf = 1;
            v->ttfrm = TT_8X8;
1272 1273
        }
        break;
1274
    case FF_B_TYPE:
1275 1276 1277 1278 1279 1280 1281
        if (v->pq < 5) v->tt_index = 0;
        else if(v->pq < 13) v->tt_index = 1;
        else v->tt_index = 2;

        lowquant = (v->pq > 12) ? 0 : 1;
        v->mv_mode = get_bits1(gb) ? MV_PMODE_1MV : MV_PMODE_1MV_HPEL_BILIN;
        v->s.quarter_sample = (v->mv_mode == MV_PMODE_1MV);
1282
        v->s.mspel = v->s.quarter_sample;
1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293

        status = bitplane_decoding(v->direct_mb_plane, &v->dmb_is_raw, v);
        if (status < 0) return -1;
        av_log(v->s.avctx, AV_LOG_DEBUG, "MB Direct Type plane encoding: "
               "Imode: %i, Invert: %i\n", status>>1, status&1);
        status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
        if (status < 0) return -1;
        av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
               "Imode: %i, Invert: %i\n", status>>1, status&1);

        v->s.mv_table_index = get_bits(gb, 2);
1294
        v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[get_bits(gb, 2)];
1295 1296 1297 1298 1299 1300 1301 1302 1303 1304

        if (v->dquant)
        {
            av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
            vop_dquant_decoding(v);
        }

        v->ttfrm = 0;
        if (v->vstransform)
        {
1305
            v->ttmbf = get_bits1(gb);
1306 1307
            if (v->ttmbf)
            {
1308
                v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)];
1309 1310 1311 1312 1313
            }
        } else {
            v->ttmbf = 1;
            v->ttfrm = TT_8X8;
        }
1314
        break;
1315
    }
1316

M
Michael Niedermayer 已提交
1317
    if(!v->x8_type)
1318
    {
M
Michael Niedermayer 已提交
1319 1320
        /* AC Syntax */
        v->c_ac_table_index = decode012(gb);
1321
        if (v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_BI_TYPE)
M
Michael Niedermayer 已提交
1322 1323 1324 1325 1326
        {
            v->y_ac_table_index = decode012(gb);
        }
        /* DC Syntax */
        v->s.dc_table_index = get_bits1(gb);
1327
    }
1328

1329 1330
    if(v->s.pict_type == FF_BI_TYPE) {
        v->s.pict_type = FF_B_TYPE;
K
Kostya Shishkov 已提交
1331 1332
        v->bi_type = 1;
    }
1333 1334 1335
    return 0;
}

1336 1337 1338 1339 1340 1341 1342
static int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
{
    int pqindex, lowquant;
    int status;

    v->p_frame_skipped = 0;

1343
    if(v->interlace){
1344
        v->fcm = decode012(gb);
1345 1346
        if(v->fcm) return -1; // interlaced frames/fields are not implemented
    }
1347
    switch(get_unary(gb, 0, 4)) {
1348
    case 0:
1349
        v->s.pict_type = FF_P_TYPE;
1350 1351
        break;
    case 1:
1352
        v->s.pict_type = FF_B_TYPE;
1353
        break;
1354
    case 2:
1355
        v->s.pict_type = FF_I_TYPE;
1356 1357
        break;
    case 3:
1358
        v->s.pict_type = FF_BI_TYPE;
1359
        break;
1360
    case 4:
1361
        v->s.pict_type = FF_P_TYPE; // skipped pic
1362 1363 1364 1365
        v->p_frame_skipped = 1;
        return 0;
    }
    if(v->tfcntrflag)
1366
        skip_bits(gb, 8);
1367
    if(v->broadcast) {
K
Kostya Shishkov 已提交
1368
        if(!v->interlace || v->psf) {
1369
            v->rptfrm = get_bits(gb, 2);
1370
        } else {
1371 1372
            v->tff = get_bits1(gb);
            v->rptfrm = get_bits1(gb);
1373 1374 1375 1376 1377 1378 1379 1380
        }
    }
    if(v->panscanflag) {
        //...
    }
    v->rnd = get_bits1(gb);
    if(v->interlace)
        v->uvsamp = get_bits1(gb);
1381
    if(v->finterpflag) v->interpfrm = get_bits1(gb);
1382
    if(v->s.pict_type == FF_B_TYPE) {
1383 1384
        v->bfraction = get_vlc2(gb, ff_vc1_bfraction_vlc.table, VC1_BFRACTION_VLC_BITS, 1);
        v->bfraction = ff_vc1_bfraction_lut[v->bfraction];
1385
        if(v->bfraction == 0) {
1386
            v->s.pict_type = FF_BI_TYPE; /* XXX: should not happen here */
1387 1388
        }
    }
1389
    pqindex = get_bits(gb, 5);
K
Kostya Shishkov 已提交
1390
    if(!pqindex) return -1;
1391 1392
    v->pqindex = pqindex;
    if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
1393
        v->pq = ff_vc1_pquant_table[0][pqindex];
1394
    else
1395
        v->pq = ff_vc1_pquant_table[1][pqindex];
1396 1397 1398 1399 1400 1401 1402

    v->pquantizer = 1;
    if (v->quantizer_mode == QUANT_FRAME_IMPLICIT)
        v->pquantizer = pqindex < 9;
    if (v->quantizer_mode == QUANT_NON_UNIFORM)
        v->pquantizer = 0;
    v->pqindex = pqindex;
1403
    if (pqindex < 9) v->halfpq = get_bits1(gb);
1404 1405
    else v->halfpq = 0;
    if (v->quantizer_mode == QUANT_FRAME_EXPLICIT)
1406
        v->pquantizer = get_bits1(gb);
1407 1408
    if(v->postprocflag)
        v->postproc = get_bits1(gb);
1409

1410
    if(v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_P_TYPE) v->use_ic = 0;
1411

1412
    switch(v->s.pict_type) {
1413 1414
    case FF_I_TYPE:
    case FF_BI_TYPE:
1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429
        status = bitplane_decoding(v->acpred_plane, &v->acpred_is_raw, v);
        if (status < 0) return -1;
        av_log(v->s.avctx, AV_LOG_DEBUG, "ACPRED plane encoding: "
                "Imode: %i, Invert: %i\n", status>>1, status&1);
        v->condover = CONDOVER_NONE;
        if(v->overlap && v->pq <= 8) {
            v->condover = decode012(gb);
            if(v->condover == CONDOVER_SELECT) {
                status = bitplane_decoding(v->over_flags_plane, &v->overflg_is_raw, v);
                if (status < 0) return -1;
                av_log(v->s.avctx, AV_LOG_DEBUG, "CONDOVER plane encoding: "
                        "Imode: %i, Invert: %i\n", status>>1, status&1);
            }
        }
        break;
1430
    case FF_P_TYPE:
1431
        if (v->extended_mv) v->mvrange = get_unary(gb, 0, 3);
1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442
        else v->mvrange = 0;
        v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13
        v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11
        v->range_x = 1 << (v->k_x - 1);
        v->range_y = 1 << (v->k_y - 1);

        if (v->pq < 5) v->tt_index = 0;
        else if(v->pq < 13) v->tt_index = 1;
        else v->tt_index = 2;

        lowquant = (v->pq > 12) ? 0 : 1;
1443
        v->mv_mode = ff_vc1_mv_pmode_table[lowquant][get_unary(gb, 1, 4)];
1444 1445 1446
        if (v->mv_mode == MV_PMODE_INTENSITY_COMP)
        {
            int scale, shift, i;
1447
            v->mv_mode2 = ff_vc1_mv_pmode_table2[lowquant][get_unary(gb, 1, 3)];
1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463
            v->lumscale = get_bits(gb, 6);
            v->lumshift = get_bits(gb, 6);
            /* fill lookup tables for intensity compensation */
            if(!v->lumscale) {
                scale = -64;
                shift = (255 - v->lumshift * 2) << 6;
                if(v->lumshift > 31)
                    shift += 128 << 6;
            } else {
                scale = v->lumscale + 32;
                if(v->lumshift > 31)
                    shift = (v->lumshift - 64) << 6;
                else
                    shift = v->lumshift << 6;
            }
            for(i = 0; i < 256; i++) {
1464 1465
                v->luty[i] = av_clip_uint8((scale * i + shift + 32) >> 6);
                v->lutuv[i] = av_clip_uint8((scale * (i - 128) + 128*64 + 32) >> 6);
1466
            }
1467
            v->use_ic = 1;
1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497
        }
        if(v->mv_mode == MV_PMODE_1MV_HPEL || v->mv_mode == MV_PMODE_1MV_HPEL_BILIN)
            v->s.quarter_sample = 0;
        else if(v->mv_mode == MV_PMODE_INTENSITY_COMP) {
            if(v->mv_mode2 == MV_PMODE_1MV_HPEL || v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN)
                v->s.quarter_sample = 0;
            else
                v->s.quarter_sample = 1;
        } else
            v->s.quarter_sample = 1;
        v->s.mspel = !(v->mv_mode == MV_PMODE_1MV_HPEL_BILIN || (v->mv_mode == MV_PMODE_INTENSITY_COMP && v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN));

        if ((v->mv_mode == MV_PMODE_INTENSITY_COMP &&
                 v->mv_mode2 == MV_PMODE_MIXED_MV)
                || v->mv_mode == MV_PMODE_MIXED_MV)
        {
            status = bitplane_decoding(v->mv_type_mb_plane, &v->mv_type_is_raw, v);
            if (status < 0) return -1;
            av_log(v->s.avctx, AV_LOG_DEBUG, "MB MV Type plane encoding: "
                   "Imode: %i, Invert: %i\n", status>>1, status&1);
        } else {
            v->mv_type_is_raw = 0;
            memset(v->mv_type_mb_plane, 0, v->s.mb_stride * v->s.mb_height);
        }
        status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
        if (status < 0) return -1;
        av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
               "Imode: %i, Invert: %i\n", status>>1, status&1);

        /* Hopefully this is correct for P frames */
1498 1499
        v->s.mv_table_index = get_bits(gb, 2); //but using ff_vc1_ tables
        v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[get_bits(gb, 2)];
1500 1501 1502 1503 1504 1505 1506 1507 1508
        if (v->dquant)
        {
            av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
            vop_dquant_decoding(v);
        }

        v->ttfrm = 0; //FIXME Is that so ?
        if (v->vstransform)
        {
1509
            v->ttmbf = get_bits1(gb);
1510 1511
            if (v->ttmbf)
            {
1512
                v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)];
1513 1514 1515 1516 1517 1518
            }
        } else {
            v->ttmbf = 1;
            v->ttfrm = TT_8X8;
        }
        break;
1519
    case FF_B_TYPE:
1520
        if (v->extended_mv) v->mvrange = get_unary(gb, 0, 3);
1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545
        else v->mvrange = 0;
        v->k_x = v->mvrange + 9 + (v->mvrange >> 1); //k_x can be 9 10 12 13
        v->k_y = v->mvrange + 8; //k_y can be 8 9 10 11
        v->range_x = 1 << (v->k_x - 1);
        v->range_y = 1 << (v->k_y - 1);

        if (v->pq < 5) v->tt_index = 0;
        else if(v->pq < 13) v->tt_index = 1;
        else v->tt_index = 2;

        lowquant = (v->pq > 12) ? 0 : 1;
        v->mv_mode = get_bits1(gb) ? MV_PMODE_1MV : MV_PMODE_1MV_HPEL_BILIN;
        v->s.quarter_sample = (v->mv_mode == MV_PMODE_1MV);
        v->s.mspel = v->s.quarter_sample;

        status = bitplane_decoding(v->direct_mb_plane, &v->dmb_is_raw, v);
        if (status < 0) return -1;
        av_log(v->s.avctx, AV_LOG_DEBUG, "MB Direct Type plane encoding: "
               "Imode: %i, Invert: %i\n", status>>1, status&1);
        status = bitplane_decoding(v->s.mbskip_table, &v->skip_is_raw, v);
        if (status < 0) return -1;
        av_log(v->s.avctx, AV_LOG_DEBUG, "MB Skip plane encoding: "
               "Imode: %i, Invert: %i\n", status>>1, status&1);

        v->s.mv_table_index = get_bits(gb, 2);
1546
        v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[get_bits(gb, 2)];
1547 1548 1549 1550 1551 1552 1553 1554 1555 1556

        if (v->dquant)
        {
            av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
            vop_dquant_decoding(v);
        }

        v->ttfrm = 0;
        if (v->vstransform)
        {
1557
            v->ttmbf = get_bits1(gb);
1558 1559
            if (v->ttmbf)
            {
1560
                v->ttfrm = ff_vc1_ttfrm_to_tt[get_bits(gb, 2)];
1561 1562 1563 1564 1565 1566
            }
        } else {
            v->ttmbf = 1;
            v->ttfrm = TT_8X8;
        }
        break;
1567 1568 1569 1570
    }

    /* AC Syntax */
    v->c_ac_table_index = decode012(gb);
1571
    if (v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_BI_TYPE)
1572 1573 1574 1575
    {
        v->y_ac_table_index = decode012(gb);
    }
    /* DC Syntax */
1576
    v->s.dc_table_index = get_bits1(gb);
1577
    if ((v->s.pict_type == FF_I_TYPE || v->s.pict_type == FF_BI_TYPE) && v->dquant) {
1578 1579 1580 1581
        av_log(v->s.avctx, AV_LOG_DEBUG, "VOP DQuant info\n");
        vop_dquant_decoding(v);
    }

1582
    v->bi_type = 0;
1583 1584
    if(v->s.pict_type == FF_BI_TYPE) {
        v->s.pict_type = FF_B_TYPE;
1585 1586
        v->bi_type = 1;
    }
1587 1588 1589
    return 0;
}

A
anonymous 已提交
1590 1591
/***********************************************************************/
/**
1592 1593
 * @defgroup block VC-1 Block-level functions
 * @see 7.1.4, p91 and 8.1.1.7, p(1)04
A
anonymous 已提交
1594 1595 1596
 * @{
 */

1597 1598 1599
/**
 * @def GET_MQUANT
 * @brief Get macroblock-level quantizer scale
A
anonymous 已提交
1600
 */
1601 1602 1603
#define GET_MQUANT()                                           \
  if (v->dquantfrm)                                            \
  {                                                            \
1604
    int edges = 0;                                             \
1605 1606 1607 1608
    if (v->dqprofile == DQPROFILE_ALL_MBS)                     \
    {                                                          \
      if (v->dqbilevel)                                        \
      {                                                        \
1609
        mquant = (get_bits1(gb)) ? v->altpq : v->pq;           \
1610 1611 1612 1613 1614 1615 1616 1617
      }                                                        \
      else                                                     \
      {                                                        \
        mqdiff = get_bits(gb, 3);                              \
        if (mqdiff != 7) mquant = v->pq + mqdiff;              \
        else mquant = get_bits(gb, 5);                         \
      }                                                        \
    }                                                          \
1618 1619
    if(v->dqprofile == DQPROFILE_SINGLE_EDGE)                  \
        edges = 1 << v->dqsbedge;                              \
K
Kostya Shishkov 已提交
1620
    else if(v->dqprofile == DQPROFILE_DOUBLE_EDGES)            \
1621
        edges = (3 << v->dqsbedge) % 15;                       \
K
Kostya Shishkov 已提交
1622
    else if(v->dqprofile == DQPROFILE_FOUR_EDGES)              \
1623 1624 1625
        edges = 15;                                            \
    if((edges&1) && !s->mb_x)                                  \
        mquant = v->altpq;                                     \
1626
    if((edges&2) && s->first_slice_line)                       \
1627 1628 1629 1630 1631
        mquant = v->altpq;                                     \
    if((edges&4) && s->mb_x == (s->mb_width - 1))              \
        mquant = v->altpq;                                     \
    if((edges&8) && s->mb_y == (s->mb_height - 1))             \
        mquant = v->altpq;                                     \
1632
  }
A
anonymous 已提交
1633

1634 1635 1636 1637 1638 1639
/**
 * @def GET_MVDATA(_dmv_x, _dmv_y)
 * @brief Get MV differentials
 * @see MVDATA decoding from 8.3.5.2, p(1)20
 * @param _dmv_x Horizontal differential for decoded MV
 * @param _dmv_y Vertical differential for decoded MV
A
anonymous 已提交
1640
 */
1641
#define GET_MVDATA(_dmv_x, _dmv_y)                                  \
1642
  index = 1 + get_vlc2(gb, ff_vc1_mv_diff_vlc[s->mv_table_index].table,\
1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653
                       VC1_MV_DIFF_VLC_BITS, 2);                    \
  if (index > 36)                                                   \
  {                                                                 \
    mb_has_coeffs = 1;                                              \
    index -= 37;                                                    \
  }                                                                 \
  else mb_has_coeffs = 0;                                           \
  s->mb_intra = 0;                                                  \
  if (!index) { _dmv_x = _dmv_y = 0; }                              \
  else if (index == 35)                                             \
  {                                                                 \
1654 1655
    _dmv_x = get_bits(gb, v->k_x - 1 + s->quarter_sample);          \
    _dmv_y = get_bits(gb, v->k_y - 1 + s->quarter_sample);          \
1656 1657 1658 1659 1660 1661 1662 1663 1664 1665
  }                                                                 \
  else if (index == 36)                                             \
  {                                                                 \
    _dmv_x = 0;                                                     \
    _dmv_y = 0;                                                     \
    s->mb_intra = 1;                                                \
  }                                                                 \
  else                                                              \
  {                                                                 \
    index1 = index%6;                                               \
1666 1667
    if (!s->quarter_sample && index1 == 5) val = 1;                 \
    else                                   val = 0;                 \
1668 1669 1670
    if(size_table[index1] - val > 0)                                \
        val = get_bits(gb, size_table[index1] - val);               \
    else                                   val = 0;                 \
1671 1672 1673 1674
    sign = 0 - (val&1);                                             \
    _dmv_x = (sign ^ ((val>>1) + offset_table[index1])) - sign;     \
                                                                    \
    index1 = index/6;                                               \
1675 1676
    if (!s->quarter_sample && index1 == 5) val = 1;                 \
    else                                   val = 0;                 \
1677 1678 1679
    if(size_table[index1] - val > 0)                                \
        val = get_bits(gb, size_table[index1] - val);               \
    else                                   val = 0;                 \
1680 1681 1682
    sign = 0 - (val&1);                                             \
    _dmv_y = (sign ^ ((val>>1) + offset_table[index1])) - sign;     \
  }
1683

1684
/** Predict and set motion vector
A
anonymous 已提交
1685
 */
K
Kostya Shishkov 已提交
1686
static inline void vc1_pred_mv(MpegEncContext *s, int n, int dmv_x, int dmv_y, int mv1, int r_x, int r_y, uint8_t* is_intra)
A
anonymous 已提交
1687
{
K
Kostya Shishkov 已提交
1688
    int xy, wrap, off = 0;
1689 1690 1691
    int16_t *A, *B, *C;
    int px, py;
    int sum;
A
anonymous 已提交
1692

1693
    /* scale MV difference to be quad-pel */
1694 1695
    dmv_x <<= 1 - s->quarter_sample;
    dmv_y <<= 1 - s->quarter_sample;
1696

1697
    wrap = s->b8_stride;
K
Kostya Shishkov 已提交
1698
    xy = s->block_index[n];
1699

K
Kostya Shishkov 已提交
1700 1701 1702
    if(s->mb_intra){
        s->mv[0][n][0] = s->current_picture.motion_val[0][xy][0] = 0;
        s->mv[0][n][1] = s->current_picture.motion_val[0][xy][1] = 0;
1703 1704
        s->current_picture.motion_val[1][xy][0] = 0;
        s->current_picture.motion_val[1][xy][1] = 0;
K
Kostya Shishkov 已提交
1705 1706 1707 1708 1709 1710 1711
        if(mv1) { /* duplicate motion data for 1-MV block */
            s->current_picture.motion_val[0][xy + 1][0] = 0;
            s->current_picture.motion_val[0][xy + 1][1] = 0;
            s->current_picture.motion_val[0][xy + wrap][0] = 0;
            s->current_picture.motion_val[0][xy + wrap][1] = 0;
            s->current_picture.motion_val[0][xy + wrap + 1][0] = 0;
            s->current_picture.motion_val[0][xy + wrap + 1][1] = 0;
1712 1713 1714 1715 1716 1717
            s->current_picture.motion_val[1][xy + 1][0] = 0;
            s->current_picture.motion_val[1][xy + 1][1] = 0;
            s->current_picture.motion_val[1][xy + wrap][0] = 0;
            s->current_picture.motion_val[1][xy + wrap][1] = 0;
            s->current_picture.motion_val[1][xy + wrap + 1][0] = 0;
            s->current_picture.motion_val[1][xy + wrap + 1][1] = 0;
K
Kostya Shishkov 已提交
1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742
        }
        return;
    }

    C = s->current_picture.motion_val[0][xy - 1];
    A = s->current_picture.motion_val[0][xy - wrap];
    if(mv1)
        off = (s->mb_x == (s->mb_width - 1)) ? -1 : 2;
    else {
        //in 4-MV mode different blocks have different B predictor position
        switch(n){
        case 0:
            off = (s->mb_x > 0) ? -1 : 1;
            break;
        case 1:
            off = (s->mb_x == (s->mb_width - 1)) ? -1 : 1;
            break;
        case 2:
            off = 1;
            break;
        case 3:
            off = -1;
        }
    }
    B = s->current_picture.motion_val[0][xy - wrap + off];
1743

K
Kostya Shishkov 已提交
1744
    if(!s->first_slice_line || (n==2 || n==3)) { // predictor A is not out of bounds
1745 1746 1747 1748 1749 1750 1751
        if(s->mb_width == 1) {
            px = A[0];
            py = A[1];
        } else {
            px = mid_pred(A[0], B[0], C[0]);
            py = mid_pred(A[1], B[1], C[1]);
        }
K
Kostya Shishkov 已提交
1752
    } else if(s->mb_x || (n==1 || n==3)) { // predictor C is not out of bounds
1753 1754 1755 1756 1757 1758 1759 1760
        px = C[0];
        py = C[1];
    } else {
        px = py = 0;
    }
    /* Pullback MV as specified in 8.3.5.3.4 */
    {
        int qx, qy, X, Y;
1761 1762
        qx = (s->mb_x << 6) + ((n==1 || n==3) ? 32 : 0);
        qy = (s->mb_y << 6) + ((n==2 || n==3) ? 32 : 0);
1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775
        X = (s->mb_width << 6) - 4;
        Y = (s->mb_height << 6) - 4;
        if(mv1) {
            if(qx + px < -60) px = -60 - qx;
            if(qy + py < -60) py = -60 - qy;
        } else {
            if(qx + px < -28) px = -28 - qx;
            if(qy + py < -28) py = -28 - qy;
        }
        if(qx + px > X) px = X - qx;
        if(qy + py > Y) py = Y - qy;
    }
    /* Calculate hybrid prediction as specified in 8.3.5.3.5 */
K
Kostya Shishkov 已提交
1776 1777
    if((!s->first_slice_line || (n==2 || n==3)) && (s->mb_x || (n==1 || n==3))) {
        if(is_intra[xy - wrap])
D
Diego Biurrun 已提交
1778
            sum = FFABS(px) + FFABS(py);
1779
        else
D
Diego Biurrun 已提交
1780
            sum = FFABS(px - A[0]) + FFABS(py - A[1]);
1781 1782 1783 1784 1785 1786 1787 1788 1789
        if(sum > 32) {
            if(get_bits1(&s->gb)) {
                px = A[0];
                py = A[1];
            } else {
                px = C[0];
                py = C[1];
            }
        } else {
K
Kostya Shishkov 已提交
1790
            if(is_intra[xy - 1])
D
Diego Biurrun 已提交
1791
                sum = FFABS(px) + FFABS(py);
1792
            else
D
Diego Biurrun 已提交
1793
                sum = FFABS(px - C[0]) + FFABS(py - C[1]);
1794 1795 1796 1797 1798 1799 1800 1801 1802 1803
            if(sum > 32) {
                if(get_bits1(&s->gb)) {
                    px = A[0];
                    py = A[1];
                } else {
                    px = C[0];
                    py = C[1];
                }
            }
        }
1804
    }
1805
    /* store MV using signed modulus of MV range defined in 4.11 */
K
Kostya Shishkov 已提交
1806 1807 1808 1809 1810 1811 1812 1813 1814 1815
    s->mv[0][n][0] = s->current_picture.motion_val[0][xy][0] = ((px + dmv_x + r_x) & ((r_x << 1) - 1)) - r_x;
    s->mv[0][n][1] = s->current_picture.motion_val[0][xy][1] = ((py + dmv_y + r_y) & ((r_y << 1) - 1)) - r_y;
    if(mv1) { /* duplicate motion data for 1-MV block */
        s->current_picture.motion_val[0][xy + 1][0] = s->current_picture.motion_val[0][xy][0];
        s->current_picture.motion_val[0][xy + 1][1] = s->current_picture.motion_val[0][xy][1];
        s->current_picture.motion_val[0][xy + wrap][0] = s->current_picture.motion_val[0][xy][0];
        s->current_picture.motion_val[0][xy + wrap][1] = s->current_picture.motion_val[0][xy][1];
        s->current_picture.motion_val[0][xy + wrap + 1][0] = s->current_picture.motion_val[0][xy][0];
        s->current_picture.motion_val[0][xy + wrap + 1][1] = s->current_picture.motion_val[0][xy][1];
    }
1816 1817
}

1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832
/** Motion compensation for direct or interpolated blocks in B-frames
 */
static void vc1_interp_mc(VC1Context *v)
{
    MpegEncContext *s = &v->s;
    DSPContext *dsp = &v->s.dsp;
    uint8_t *srcY, *srcU, *srcV;
    int dxy, uvdxy, mx, my, uvmx, uvmy, src_x, src_y, uvsrc_x, uvsrc_y;

    if(!v->s.next_picture.data[0])return;

    mx = s->mv[1][0][0];
    my = s->mv[1][0][1];
    uvmx = (mx + ((mx & 3) == 3)) >> 1;
    uvmy = (my + ((my & 3) == 3)) >> 1;
1833 1834 1835 1836
    if(v->fastuvmc) {
        uvmx = uvmx + ((uvmx<0)?-(uvmx&1):(uvmx&1));
        uvmy = uvmy + ((uvmy<0)?-(uvmy&1):(uvmy&1));
    }
1837 1838 1839 1840 1841 1842 1843 1844 1845
    srcY = s->next_picture.data[0];
    srcU = s->next_picture.data[1];
    srcV = s->next_picture.data[2];

    src_x = s->mb_x * 16 + (mx >> 2);
    src_y = s->mb_y * 16 + (my >> 2);
    uvsrc_x = s->mb_x * 8 + (uvmx >> 2);
    uvsrc_y = s->mb_y * 8 + (uvmy >> 2);

K
Kostya Shishkov 已提交
1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856
    if(v->profile != PROFILE_ADVANCED){
        src_x   = av_clip(  src_x, -16, s->mb_width  * 16);
        src_y   = av_clip(  src_y, -16, s->mb_height * 16);
        uvsrc_x = av_clip(uvsrc_x,  -8, s->mb_width  *  8);
        uvsrc_y = av_clip(uvsrc_y,  -8, s->mb_height *  8);
    }else{
        src_x   = av_clip(  src_x, -17, s->avctx->coded_width);
        src_y   = av_clip(  src_y, -18, s->avctx->coded_height + 1);
        uvsrc_x = av_clip(uvsrc_x,  -8, s->avctx->coded_width  >> 1);
        uvsrc_y = av_clip(uvsrc_y,  -8, s->avctx->coded_height >> 1);
    }
1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872

    srcY += src_y * s->linesize + src_x;
    srcU += uvsrc_y * s->uvlinesize + uvsrc_x;
    srcV += uvsrc_y * s->uvlinesize + uvsrc_x;

    /* for grayscale we should not try to read from unknown area */
    if(s->flags & CODEC_FLAG_GRAY) {
        srcU = s->edge_emu_buffer + 18 * s->linesize;
        srcV = s->edge_emu_buffer + 18 * s->linesize;
    }

    if(v->rangeredfrm
       || (unsigned)src_x > s->h_edge_pos - (mx&3) - 16
       || (unsigned)src_y > s->v_edge_pos - (my&3) - 16){
        uint8_t *uvbuf= s->edge_emu_buffer + 19 * s->linesize;

1873 1874
        srcY -= s->mspel * (1 + s->linesize);
        ff_emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, 17+s->mspel*2, 17+s->mspel*2,
1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888
                            src_x - s->mspel, src_y - s->mspel, s->h_edge_pos, s->v_edge_pos);
        srcY = s->edge_emu_buffer;
        ff_emulated_edge_mc(uvbuf     , srcU, s->uvlinesize, 8+1, 8+1,
                            uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
        ff_emulated_edge_mc(uvbuf + 16, srcV, s->uvlinesize, 8+1, 8+1,
                            uvsrc_x, uvsrc_y, s->h_edge_pos >> 1, s->v_edge_pos >> 1);
        srcU = uvbuf;
        srcV = uvbuf + 16;
        /* if we deal with range reduction we need to scale source blocks */
        if(v->rangeredfrm) {
            int i, j;
            uint8_t *src, *src2;

            src = srcY;
1889 1890
            for(j = 0; j < 17 + s->mspel*2; j++) {
                for(i = 0; i < 17 + s->mspel*2; i++) src[i] = ((src[i] - 128) >> 1) + 128;
1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902
                src += s->linesize;
            }
            src = srcU; src2 = srcV;
            for(j = 0; j < 9; j++) {
                for(i = 0; i < 9; i++) {
                    src[i] = ((src[i] - 128) >> 1) + 128;
                    src2[i] = ((src2[i] - 128) >> 1) + 128;
                }
                src += s->uvlinesize;
                src2 += s->uvlinesize;
            }
        }
1903
        srcY += s->mspel * (1 + s->linesize);
1904 1905
    }

1906 1907 1908
    mx >>= 1;
    my >>= 1;
    dxy = ((my & 1) << 1) | (mx & 1);
1909

1910
    dsp->avg_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16);
1911 1912 1913 1914

    if(s->flags & CODEC_FLAG_GRAY) return;
    /* Chroma MC always uses qpel blilinear */
    uvdxy = ((uvmy & 3) << 2) | (uvmx & 3);
1915 1916 1917 1918
    uvmx = (uvmx&3)<<1;
    uvmy = (uvmy&3)<<1;
    dsp->avg_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy);
    dsp->avg_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy);
1919 1920
}

1921
static av_always_inline int scale_mv(int value, int bfrac, int inv, int qs)
K
Kostya Shishkov 已提交
1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939
{
    int n = bfrac;

#if B_FRACTION_DEN==256
    if(inv)
        n -= 256;
    if(!qs)
        return 2 * ((value * n + 255) >> 9);
    return (value * n + 128) >> 8;
#else
    if(inv)
        n -= B_FRACTION_DEN;
    if(!qs)
        return 2 * ((value * n + B_FRACTION_DEN - 1) / (2 * B_FRACTION_DEN));
    return (value * n + B_FRACTION_DEN/2) / B_FRACTION_DEN;
#endif
}

1940 1941 1942
/** Reconstruct motion vector for B-frame and do motion compensation
 */
static inline void vc1_b_mc(VC1Context *v, int dmv_x[2], int dmv_y[2], int direct, int mode)
K
Kostya Shishkov 已提交
1943
{
1944 1945 1946 1947
    if(v->use_ic) {
        v->mv_mode2 = v->mv_mode;
        v->mv_mode = MV_PMODE_INTENSITY_COMP;
    }
K
Kostya Shishkov 已提交
1948 1949 1950
    if(direct) {
        vc1_mc_1mv(v, 0);
        vc1_interp_mc(v);
1951
        if(v->use_ic) v->mv_mode = v->mv_mode2;
K
Kostya Shishkov 已提交
1952 1953 1954 1955 1956
        return;
    }
    if(mode == BMV_TYPE_INTERPOLATED) {
        vc1_mc_1mv(v, 0);
        vc1_interp_mc(v);
1957
        if(v->use_ic) v->mv_mode = v->mv_mode2;
K
Kostya Shishkov 已提交
1958 1959 1960
        return;
    }

1961
    if(v->use_ic && (mode == BMV_TYPE_BACKWARD)) v->mv_mode = v->mv_mode2;
1962
    vc1_mc_1mv(v, (mode == BMV_TYPE_BACKWARD));
1963
    if(v->use_ic) v->mv_mode = v->mv_mode2;
K
Kostya Shishkov 已提交
1964 1965 1966
}

static inline void vc1_pred_b_mv(VC1Context *v, int dmv_x[2], int dmv_y[2], int direct, int mvtype)
1967 1968
{
    MpegEncContext *s = &v->s;
K
Kostya Shishkov 已提交
1969 1970 1971 1972 1973 1974
    int xy, wrap, off = 0;
    int16_t *A, *B, *C;
    int px, py;
    int sum;
    int r_x, r_y;
    const uint8_t *is_intra = v->mb_type[0];
1975

K
Kostya Shishkov 已提交
1976 1977
    r_x = v->range_x;
    r_y = v->range_y;
1978 1979 1980 1981 1982 1983
    /* scale MV difference to be quad-pel */
    dmv_x[0] <<= 1 - s->quarter_sample;
    dmv_y[0] <<= 1 - s->quarter_sample;
    dmv_x[1] <<= 1 - s->quarter_sample;
    dmv_y[1] <<= 1 - s->quarter_sample;

K
Kostya Shishkov 已提交
1984 1985
    wrap = s->b8_stride;
    xy = s->block_index[0];
1986

K
Kostya Shishkov 已提交
1987 1988 1989 1990 1991
    if(s->mb_intra) {
        s->current_picture.motion_val[0][xy][0] =
        s->current_picture.motion_val[0][xy][1] =
        s->current_picture.motion_val[1][xy][0] =
        s->current_picture.motion_val[1][xy][1] = 0;
1992 1993
        return;
    }
1994 1995 1996 1997
    s->mv[0][0][0] = scale_mv(s->next_picture.motion_val[1][xy][0], v->bfraction, 0, s->quarter_sample);
    s->mv[0][0][1] = scale_mv(s->next_picture.motion_val[1][xy][1], v->bfraction, 0, s->quarter_sample);
    s->mv[1][0][0] = scale_mv(s->next_picture.motion_val[1][xy][0], v->bfraction, 1, s->quarter_sample);
    s->mv[1][0][1] = scale_mv(s->next_picture.motion_val[1][xy][1], v->bfraction, 1, s->quarter_sample);
1998 1999 2000 2001 2002 2003

    /* Pullback predicted motion vectors as specified in 8.4.5.4 */
    s->mv[0][0][0] = av_clip(s->mv[0][0][0], -60 - (s->mb_x << 6), (s->mb_width  << 6) - 4 - (s->mb_x << 6));
    s->mv[0][0][1] = av_clip(s->mv[0][0][1], -60 - (s->mb_y << 6), (s->mb_height << 6) - 4 - (s->mb_y << 6));
    s->mv[1][0][0] = av_clip(s->mv[1][0][0], -60 - (s->mb_x << 6), (s->mb_width  << 6) - 4 - (s->mb_x << 6));
    s->mv[1][0][1] = av_clip(s->mv[1][0][1], -60 - (s->mb_y << 6), (s->mb_height << 6) - 4 - (s->mb_y << 6));
K
Kostya Shishkov 已提交
2004 2005 2006 2007 2008
    if(direct) {
        s->current_picture.motion_val[0][xy][0] = s->mv[0][0][0];
        s->current_picture.motion_val[0][xy][1] = s->mv[0][0][1];
        s->current_picture.motion_val[1][xy][0] = s->mv[1][0][0];
        s->current_picture.motion_val[1][xy][1] = s->mv[1][0][1];
2009 2010 2011
        return;
    }

2012
    if((mvtype == BMV_TYPE_FORWARD) || (mvtype == BMV_TYPE_INTERPOLATED)) {
K
Kostya Shishkov 已提交
2013 2014 2015 2016 2017
        C = s->current_picture.motion_val[0][xy - 2];
        A = s->current_picture.motion_val[0][xy - wrap*2];
        off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2;
        B = s->current_picture.motion_val[0][xy - wrap*2 + off];

2018
        if(!s->mb_x) C[0] = C[1] = 0;
K
Kostya Shishkov 已提交
2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031
        if(!s->first_slice_line) { // predictor A is not out of bounds
            if(s->mb_width == 1) {
                px = A[0];
                py = A[1];
            } else {
                px = mid_pred(A[0], B[0], C[0]);
                py = mid_pred(A[1], B[1], C[1]);
            }
        } else if(s->mb_x) { // predictor C is not out of bounds
            px = C[0];
            py = C[1];
        } else {
            px = py = 0;
2032
        }
K
Kostya Shishkov 已提交
2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058
        /* Pullback MV as specified in 8.3.5.3.4 */
        {
            int qx, qy, X, Y;
            if(v->profile < PROFILE_ADVANCED) {
                qx = (s->mb_x << 5);
                qy = (s->mb_y << 5);
                X = (s->mb_width << 5) - 4;
                Y = (s->mb_height << 5) - 4;
                if(qx + px < -28) px = -28 - qx;
                if(qy + py < -28) py = -28 - qy;
                if(qx + px > X) px = X - qx;
                if(qy + py > Y) py = Y - qy;
            } else {
                qx = (s->mb_x << 6);
                qy = (s->mb_y << 6);
                X = (s->mb_width << 6) - 4;
                Y = (s->mb_height << 6) - 4;
                if(qx + px < -60) px = -60 - qx;
                if(qy + py < -60) py = -60 - qy;
                if(qx + px > X) px = X - qx;
                if(qy + py > Y) py = Y - qy;
            }
        }
        /* Calculate hybrid prediction as specified in 8.3.5.3.5 */
        if(0 && !s->first_slice_line && s->mb_x) {
            if(is_intra[xy - wrap])
D
Diego Biurrun 已提交
2059
                sum = FFABS(px) + FFABS(py);
K
Kostya Shishkov 已提交
2060
            else
D
Diego Biurrun 已提交
2061
                sum = FFABS(px - A[0]) + FFABS(py - A[1]);
K
Kostya Shishkov 已提交
2062 2063 2064 2065 2066 2067 2068 2069 2070 2071
            if(sum > 32) {
                if(get_bits1(&s->gb)) {
                    px = A[0];
                    py = A[1];
                } else {
                    px = C[0];
                    py = C[1];
                }
            } else {
                if(is_intra[xy - 2])
D
Diego Biurrun 已提交
2072
                    sum = FFABS(px) + FFABS(py);
K
Kostya Shishkov 已提交
2073
                else
D
Diego Biurrun 已提交
2074
                    sum = FFABS(px - C[0]) + FFABS(py - C[1]);
K
Kostya Shishkov 已提交
2075 2076 2077 2078 2079 2080 2081 2082 2083 2084
                if(sum > 32) {
                    if(get_bits1(&s->gb)) {
                        px = A[0];
                        py = A[1];
                    } else {
                        px = C[0];
                        py = C[1];
                    }
                }
            }
2085
        }
K
Kostya Shishkov 已提交
2086 2087 2088
        /* store MV using signed modulus of MV range defined in 4.11 */
        s->mv[0][0][0] = ((px + dmv_x[0] + r_x) & ((r_x << 1) - 1)) - r_x;
        s->mv[0][0][1] = ((py + dmv_y[0] + r_y) & ((r_y << 1) - 1)) - r_y;
2089
    }
2090
    if((mvtype == BMV_TYPE_BACKWARD) || (mvtype == BMV_TYPE_INTERPOLATED)) {
K
Kostya Shishkov 已提交
2091 2092 2093 2094
        C = s->current_picture.motion_val[1][xy - 2];
        A = s->current_picture.motion_val[1][xy - wrap*2];
        off = (s->mb_x == (s->mb_width - 1)) ? -2 : 2;
        B = s->current_picture.motion_val[1][xy - wrap*2 + off];
2095

2096
        if(!s->mb_x) C[0] = C[1] = 0;
K
Kostya Shishkov 已提交
2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136
        if(!s->first_slice_line) { // predictor A is not out of bounds
            if(s->mb_width == 1) {
                px = A[0];
                py = A[1];
            } else {
                px = mid_pred(A[0], B[0], C[0]);
                py = mid_pred(A[1], B[1], C[1]);
            }
        } else if(s->mb_x) { // predictor C is not out of bounds
            px = C[0];
            py = C[1];
        } else {
            px = py = 0;
        }
        /* Pullback MV as specified in 8.3.5.3.4 */
        {
            int qx, qy, X, Y;
            if(v->profile < PROFILE_ADVANCED) {
                qx = (s->mb_x << 5);
                qy = (s->mb_y << 5);
                X = (s->mb_width << 5) - 4;
                Y = (s->mb_height << 5) - 4;
                if(qx + px < -28) px = -28 - qx;
                if(qy + py < -28) py = -28 - qy;
                if(qx + px > X) px = X - qx;
                if(qy + py > Y) py = Y - qy;
            } else {
                qx = (s->mb_x << 6);
                qy = (s->mb_y << 6);
                X = (s->mb_width << 6) - 4;
                Y = (s->mb_height << 6) - 4;
                if(qx + px < -60) px = -60 - qx;
                if(qy + py < -60) py = -60 - qy;
                if(qx + px > X) px = X - qx;
                if(qy + py > Y) py = Y - qy;
            }
        }
        /* Calculate hybrid prediction as specified in 8.3.5.3.5 */
        if(0 && !s->first_slice_line && s->mb_x) {
            if(is_intra[xy - wrap])
D
Diego Biurrun 已提交
2137
                sum = FFABS(px) + FFABS(py);
K
Kostya Shishkov 已提交
2138
            else
D
Diego Biurrun 已提交
2139
                sum = FFABS(px - A[0]) + FFABS(py - A[1]);
K
Kostya Shishkov 已提交
2140 2141 2142 2143 2144 2145 2146 2147 2148 2149
            if(sum > 32) {
                if(get_bits1(&s->gb)) {
                    px = A[0];
                    py = A[1];
                } else {
                    px = C[0];
                    py = C[1];
                }
            } else {
                if(is_intra[xy - 2])
D
Diego Biurrun 已提交
2150
                    sum = FFABS(px) + FFABS(py);
K
Kostya Shishkov 已提交
2151
                else
D
Diego Biurrun 已提交
2152
                    sum = FFABS(px - C[0]) + FFABS(py - C[1]);
K
Kostya Shishkov 已提交
2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164
                if(sum > 32) {
                    if(get_bits1(&s->gb)) {
                        px = A[0];
                        py = A[1];
                    } else {
                        px = C[0];
                        py = C[1];
                    }
                }
            }
        }
        /* store MV using signed modulus of MV range defined in 4.11 */
2165

K
Kostya Shishkov 已提交
2166 2167 2168 2169 2170 2171 2172
        s->mv[1][0][0] = ((px + dmv_x[1] + r_x) & ((r_x << 1) - 1)) - r_x;
        s->mv[1][0][1] = ((py + dmv_y[1] + r_y) & ((r_y << 1) - 1)) - r_y;
    }
    s->current_picture.motion_val[0][xy][0] = s->mv[0][0][0];
    s->current_picture.motion_val[0][xy][1] = s->mv[0][0][1];
    s->current_picture.motion_val[1][xy][0] = s->mv[1][0][0];
    s->current_picture.motion_val[1][xy][1] = s->mv[1][0][1];
2173 2174
}

2175 2176 2177 2178 2179 2180
/** Get predicted DC value for I-frames only
 * prediction dir: left=0, top=1
 * @param s MpegEncContext
 * @param[in] n block index in the current MB
 * @param dc_val_ptr Pointer to DC predictor
 * @param dir_ptr Prediction direction for use in AC prediction
A
anonymous 已提交
2181
 */
2182
static inline int vc1_i_pred_dc(MpegEncContext *s, int overlap, int pq, int n,
M
Måns Rullgård 已提交
2183
                              int16_t **dc_val_ptr, int *dir_ptr)
2184
{
2185
    int a, b, c, wrap, pred, scale;
M
Måns Rullgård 已提交
2186
    int16_t *dc_val;
2187 2188 2189 2190 2191 2192
    static const uint16_t dcpred[32] = {
    -1, 1024,  512,  341,  256,  205,  171,  146,  128,
         114,  102,   93,   85,   79,   73,   68,   64,
          60,   57,   54,   51,   49,   47,   45,   43,
          41,   39,   38,   37,   35,   34,   33
    };
A
anonymous 已提交
2193

2194 2195 2196
    /* find prediction - wmv3_dc_scale always used here in fact */
    if (n < 4)     scale = s->y_dc_scale;
    else           scale = s->c_dc_scale;
2197

2198 2199
    wrap = s->block_wrap[n];
    dc_val= s->dc_val[0] + s->block_index[n];
2200

2201 2202 2203 2204 2205 2206
    /* B A
     * C X
     */
    c = dc_val[ - 1];
    b = dc_val[ - 1 - wrap];
    a = dc_val[ - wrap];
2207

2208
    if (pq < 9 || !overlap)
2209
    {
2210
        /* Set outer values */
2211
        if (s->first_slice_line && (n!=2 && n!=3)) b=a=dcpred[scale];
2212
        if (s->mb_x == 0 && (n!=1 && n!=3)) b=c=dcpred[scale];
2213 2214 2215
    }
    else
    {
2216
        /* Set outer values */
2217
        if (s->first_slice_line && (n!=2 && n!=3)) b=a=0;
2218
        if (s->mb_x == 0 && (n!=1 && n!=3)) b=c=0;
2219 2220
    }

2221 2222 2223 2224 2225 2226
    if (abs(a - b) <= abs(b - c)) {
        pred = c;
        *dir_ptr = 1;//left
    } else {
        pred = a;
        *dir_ptr = 0;//top
2227 2228
    }

2229 2230 2231
    /* update predictor */
    *dc_val_ptr = &dc_val[0];
    return pred;
2232 2233
}

2234

2235 2236 2237 2238 2239 2240
/** Get predicted DC value
 * prediction dir: left=0, top=1
 * @param s MpegEncContext
 * @param[in] n block index in the current MB
 * @param dc_val_ptr Pointer to DC predictor
 * @param dir_ptr Prediction direction for use in AC prediction
A
anonymous 已提交
2241
 */
2242 2243
static inline int vc1_pred_dc(MpegEncContext *s, int overlap, int pq, int n,
                              int a_avail, int c_avail,
M
Måns Rullgård 已提交
2244
                              int16_t **dc_val_ptr, int *dir_ptr)
2245
{
2246
    int a, b, c, wrap, pred, scale;
M
Måns Rullgård 已提交
2247
    int16_t *dc_val;
2248
    int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
K
Kostya Shishkov 已提交
2249
    int q1, q2 = 0;
2250

2251 2252 2253
    /* find prediction - wmv3_dc_scale always used here in fact */
    if (n < 4)     scale = s->y_dc_scale;
    else           scale = s->c_dc_scale;
2254

2255 2256
    wrap = s->block_wrap[n];
    dc_val= s->dc_val[0] + s->block_index[n];
2257

2258 2259 2260 2261 2262 2263
    /* B A
     * C X
     */
    c = dc_val[ - 1];
    b = dc_val[ - 1 - wrap];
    a = dc_val[ - wrap];
2264 2265 2266 2267 2268
    /* scale predictors if needed */
    q1 = s->current_picture.qscale_table[mb_pos];
    if(c_avail && (n!= 1 && n!=3)) {
        q2 = s->current_picture.qscale_table[mb_pos - 1];
        if(q2 && q2 != q1)
2269
            c = (c * s->y_dc_scale_table[q2] * ff_vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18;
2270 2271 2272 2273
    }
    if(a_avail && (n!= 2 && n!=3)) {
        q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride];
        if(q2 && q2 != q1)
2274
            a = (a * s->y_dc_scale_table[q2] * ff_vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18;
2275 2276 2277 2278 2279 2280 2281
    }
    if(a_avail && c_avail && (n!=3)) {
        int off = mb_pos;
        if(n != 1) off--;
        if(n != 2) off -= s->mb_stride;
        q2 = s->current_picture.qscale_table[off];
        if(q2 && q2 != q1)
2282
            b = (b * s->y_dc_scale_table[q2] * ff_vc1_dqscale[s->y_dc_scale_table[q1] - 1] + 0x20000) >> 18;
2283
    }
2284

2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301
    if(a_avail && c_avail) {
        if(abs(a - b) <= abs(b - c)) {
            pred = c;
            *dir_ptr = 1;//left
        } else {
            pred = a;
            *dir_ptr = 0;//top
        }
    } else if(a_avail) {
        pred = a;
        *dir_ptr = 0;//top
    } else if(c_avail) {
        pred = c;
        *dir_ptr = 1;//left
    } else {
        pred = 0;
        *dir_ptr = 1;//left
2302 2303
    }

2304 2305 2306
    /* update predictor */
    *dc_val_ptr = &dc_val[0];
    return pred;
2307
}
A
anonymous 已提交
2308

2309

2310
/**
2311 2312
 * @defgroup std_mb VC1 Macroblock-level functions in Simple/Main Profiles
 * @see 7.1.4, p91 and 8.1.1.7, p(1)04
A
anonymous 已提交
2313 2314
 * @{
 */
2315

2316
static inline int vc1_coded_block_pred(MpegEncContext * s, int n, uint8_t **coded_block_ptr)
2317
{
2318
    int xy, wrap, pred, a, b, c;
2319

2320 2321
    xy = s->block_index[n];
    wrap = s->b8_stride;
2322

2323 2324 2325 2326 2327 2328
    /* B C
     * A X
     */
    a = s->coded_block[xy - 1       ];
    b = s->coded_block[xy - 1 - wrap];
    c = s->coded_block[xy     - wrap];
2329

2330 2331 2332 2333
    if (b == c) {
        pred = a;
    } else {
        pred = c;
2334
    }
2335 2336 2337 2338 2339

    /* store value */
    *coded_block_ptr = &s->coded_block[xy];

    return pred;
A
anonymous 已提交
2340 2341
}

2342 2343 2344 2345 2346 2347 2348
/**
 * Decode one AC coefficient
 * @param v The VC1 context
 * @param last Last coefficient
 * @param skip How much zero coefficients to skip
 * @param value Decoded AC coefficient value
 * @see 8.1.3.4
A
anonymous 已提交
2349
 */
2350
static void vc1_decode_ac_coeff(VC1Context *v, int *last, int *skip, int *value, int codingset)
A
anonymous 已提交
2351 2352
{
    GetBitContext *gb = &v->s.gb;
2353 2354
    int index, escape, run = 0, level = 0, lst = 0;

2355
    index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3);
2356 2357 2358 2359
    if (index != vc1_ac_sizes[codingset] - 1) {
        run = vc1_index_decode_table[codingset][index][0];
        level = vc1_index_decode_table[codingset][index][1];
        lst = index >= vc1_last_decode_table[codingset];
2360
        if(get_bits1(gb))
2361 2362 2363
            level = -level;
    } else {
        escape = decode210(gb);
2364
        if (escape != 2) {
2365
            index = get_vlc2(gb, ff_vc1_ac_coeff_table[codingset].table, AC_VLC_BITS, 3);
2366 2367 2368
            run = vc1_index_decode_table[codingset][index][0];
            level = vc1_index_decode_table[codingset][index][1];
            lst = index >= vc1_last_decode_table[codingset];
2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379
            if(escape == 0) {
                if(lst)
                    level += vc1_last_delta_level_table[codingset][run];
                else
                    level += vc1_delta_level_table[codingset][run];
            } else {
                if(lst)
                    run += vc1_last_delta_run_table[codingset][level] + 1;
                else
                    run += vc1_delta_run_table[codingset][level] + 1;
            }
2380
            if(get_bits1(gb))
2381 2382 2383
                level = -level;
        } else {
            int sign;
2384
            lst = get_bits1(gb);
2385 2386 2387 2388 2389 2390
            if(v->s.esc3_level_length == 0) {
                if(v->pq < 8 || v->dquantfrm) { // table 59
                    v->s.esc3_level_length = get_bits(gb, 3);
                    if(!v->s.esc3_level_length)
                        v->s.esc3_level_length = get_bits(gb, 2) + 8;
                } else { //table 60
2391
                    v->s.esc3_level_length = get_unary(gb, 1, 6) + 2;
2392 2393 2394 2395
                }
                v->s.esc3_run_length = 3 + get_bits(gb, 2);
            }
            run = get_bits(gb, v->s.esc3_run_length);
2396
            sign = get_bits1(gb);
2397 2398 2399 2400
            level = get_bits(gb, v->s.esc3_level_length);
            if(sign)
                level = -level;
        }
2401
    }
2402

2403 2404 2405
    *last = lst;
    *skip = run;
    *value = level;
2406 2407
}

2408 2409 2410 2411 2412
/** Decode intra block in intra frames - should be faster than decode_intra_block
 * @param v VC1Context
 * @param block block to decode
 * @param coded are AC coeffs present or not
 * @param codingset set of VLC to decode data
A
anonymous 已提交
2413
 */
2414
static int vc1_decode_i_block(VC1Context *v, DCTELEM block[64], int n, int coded, int codingset)
2415
{
A
anonymous 已提交
2416
    GetBitContext *gb = &v->s.gb;
2417 2418 2419
    MpegEncContext *s = &v->s;
    int dc_pred_dir = 0; /* Direction of the DC prediction used */
    int run_diff, i;
M
Måns Rullgård 已提交
2420
    int16_t *dc_val;
2421 2422
    int16_t *ac_val, *ac_val2;
    int dcdiff;
2423

2424 2425 2426 2427 2428
    /* Get DC differential */
    if (n < 4) {
        dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
    } else {
        dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
2429
    }
2430 2431 2432 2433 2434
    if (dcdiff < 0){
        av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
        return -1;
    }
    if (dcdiff)
2435
    {
2436
        if (dcdiff == 119 /* ESC index value */)
2437
        {
2438 2439 2440 2441
            /* TODO: Optimize */
            if (v->pq == 1) dcdiff = get_bits(gb, 10);
            else if (v->pq == 2) dcdiff = get_bits(gb, 9);
            else dcdiff = get_bits(gb, 8);
2442
        }
2443
        else
2444
        {
2445 2446 2447
            if (v->pq == 1)
                dcdiff = (dcdiff<<2) + get_bits(gb, 2) - 3;
            else if (v->pq == 2)
2448
                dcdiff = (dcdiff<<1) + get_bits1(gb)   - 1;
2449
        }
2450
        if (get_bits1(gb))
2451
            dcdiff = -dcdiff;
2452 2453
    }

2454 2455 2456
    /* Prediction */
    dcdiff += vc1_i_pred_dc(&v->s, v->overlap, v->pq, n, &dc_val, &dc_pred_dir);
    *dc_val = dcdiff;
A
anonymous 已提交
2457

2458 2459 2460 2461 2462
    /* Store the quantized DC coeff, used for prediction */
    if (n < 4) {
        block[0] = dcdiff * s->y_dc_scale;
    } else {
        block[0] = dcdiff * s->c_dc_scale;
2463
    }
2464 2465 2466 2467 2468
    /* Skip ? */
    run_diff = 0;
    i = 0;
    if (!coded) {
        goto not_coded;
2469
    }
2470

2471 2472
    //AC Decoding
    i = 1;
2473

2474 2475 2476 2477 2478
    {
        int last = 0, skip, value;
        const int8_t *zz_table;
        int scale;
        int k;
2479

2480
        scale = v->pq * 2 + v->halfpq;
I
Ivan Kalvachev 已提交
2481

2482 2483
        if(v->s.ac_pred) {
            if(!dc_pred_dir)
S
Stefan Gehrer 已提交
2484
                zz_table = wmv1_scantable[2];
2485
            else
S
Stefan Gehrer 已提交
2486
                zz_table = wmv1_scantable[3];
2487
        } else
S
Stefan Gehrer 已提交
2488
            zz_table = wmv1_scantable[1];
2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503

        ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
        ac_val2 = ac_val;
        if(dc_pred_dir) //left
            ac_val -= 16;
        else //top
            ac_val -= 16 * s->block_wrap[n];

        while (!last) {
            vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
            i += skip;
            if(i > 63)
                break;
            block[zz_table[i++]] = value;
        }
2504

2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519
        /* apply AC prediction if needed */
        if(s->ac_pred) {
            if(dc_pred_dir) { //left
                for(k = 1; k < 8; k++)
                    block[k << 3] += ac_val[k];
            } else { //top
                for(k = 1; k < 8; k++)
                    block[k] += ac_val[k + 8];
            }
        }
        /* save AC coeffs for further prediction */
        for(k = 1; k < 8; k++) {
            ac_val2[k] = block[k << 3];
            ac_val2[k + 8] = block[k];
        }
I
Ivan Kalvachev 已提交
2520

2521 2522 2523 2524 2525 2526 2527
        /* scale AC coeffs */
        for(k = 1; k < 64; k++)
            if(block[k]) {
                block[k] *= scale;
                if(!v->pquantizer)
                    block[k] += (block[k] < 0) ? -v->pq : v->pq;
            }
2528

2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547
        if(s->ac_pred) i = 63;
    }

not_coded:
    if(!coded) {
        int k, scale;
        ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
        ac_val2 = ac_val;

        scale = v->pq * 2 + v->halfpq;
        memset(ac_val2, 0, 16 * 2);
        if(dc_pred_dir) {//left
            ac_val -= 16;
            if(s->ac_pred)
                memcpy(ac_val2, ac_val, 8 * 2);
        } else {//top
            ac_val -= 16 * s->block_wrap[n];
            if(s->ac_pred)
                memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
2548
        }
2549

2550 2551 2552 2553 2554
        /* apply AC prediction if needed */
        if(s->ac_pred) {
            if(dc_pred_dir) { //left
                for(k = 1; k < 8; k++) {
                    block[k << 3] = ac_val[k] * scale;
2555
                    if(!v->pquantizer && block[k << 3])
2556 2557 2558 2559 2560
                        block[k << 3] += (block[k << 3] < 0) ? -v->pq : v->pq;
                }
            } else { //top
                for(k = 1; k < 8; k++) {
                    block[k] = ac_val[k + 8] * scale;
2561
                    if(!v->pquantizer && block[k])
2562 2563 2564 2565 2566
                        block[k] += (block[k] < 0) ? -v->pq : v->pq;
                }
            }
            i = 63;
        }
2567
    }
2568
    s->block_last_index[n] = i;
2569

2570
    return 0;
2571 2572
}

2573
/** Decode intra block in intra frames - should be faster than decode_intra_block
2574 2575 2576 2577
 * @param v VC1Context
 * @param block block to decode
 * @param coded are AC coeffs present or not
 * @param codingset set of VLC to decode data
2578
 */
2579
static int vc1_decode_i_block_adv(VC1Context *v, DCTELEM block[64], int n, int coded, int codingset, int mquant)
A
Fixes:  
anonymous 已提交
2580
{
A
anonymous 已提交
2581
    GetBitContext *gb = &v->s.gb;
2582
    MpegEncContext *s = &v->s;
2583
    int dc_pred_dir = 0; /* Direction of the DC prediction used */
2584
    int run_diff, i;
M
Måns Rullgård 已提交
2585
    int16_t *dc_val;
2586 2587
    int16_t *ac_val, *ac_val2;
    int dcdiff;
2588
    int a_avail = v->a_avail, c_avail = v->c_avail;
2589 2590
    int use_pred = s->ac_pred;
    int scale;
K
Kostya Shishkov 已提交
2591
    int q1, q2 = 0;
2592
    int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617

    /* Get DC differential */
    if (n < 4) {
        dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
    } else {
        dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
    }
    if (dcdiff < 0){
        av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
        return -1;
    }
    if (dcdiff)
    {
        if (dcdiff == 119 /* ESC index value */)
        {
            /* TODO: Optimize */
            if (mquant == 1) dcdiff = get_bits(gb, 10);
            else if (mquant == 2) dcdiff = get_bits(gb, 9);
            else dcdiff = get_bits(gb, 8);
        }
        else
        {
            if (mquant == 1)
                dcdiff = (dcdiff<<2) + get_bits(gb, 2) - 3;
            else if (mquant == 2)
2618
                dcdiff = (dcdiff<<1) + get_bits1(gb)   - 1;
2619
        }
2620
        if (get_bits1(gb))
2621 2622 2623 2624
            dcdiff = -dcdiff;
    }

    /* Prediction */
2625
    dcdiff += vc1_pred_dc(&v->s, v->overlap, mquant, n, v->a_avail, v->c_avail, &dc_val, &dc_pred_dir);
2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639
    *dc_val = dcdiff;

    /* Store the quantized DC coeff, used for prediction */
    if (n < 4) {
        block[0] = dcdiff * s->y_dc_scale;
    } else {
        block[0] = dcdiff * s->c_dc_scale;
    }
    /* Skip ? */
    run_diff = 0;
    i = 0;

    //AC Decoding
    i = 1;
2640

2641
    /* check if AC is needed at all */
2642 2643 2644 2645
    if(!a_avail && !c_avail) use_pred = 0;
    ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
    ac_val2 = ac_val;

2646
    scale = mquant * 2 + ((mquant == v->pq) ? v->halfpq : 0);
2647 2648 2649 2650 2651 2652

    if(dc_pred_dir) //left
        ac_val -= 16;
    else //top
        ac_val -= 16 * s->block_wrap[n];

K
Kostya Shishkov 已提交
2653
    q1 = s->current_picture.qscale_table[mb_pos];
K
Kostya Shishkov 已提交
2654 2655
    if(dc_pred_dir && c_avail && mb_pos) q2 = s->current_picture.qscale_table[mb_pos - 1];
    if(!dc_pred_dir && a_avail && mb_pos >= s->mb_stride) q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride];
2656 2657 2658
    if(dc_pred_dir && n==1) q2 = q1;
    if(!dc_pred_dir && n==2) q2 = q1;
    if(n==3) q2 = q1;
K
Kostya Shishkov 已提交
2659

2660
    if(coded) {
2661 2662 2663 2664
        int last = 0, skip, value;
        const int8_t *zz_table;
        int k;

2665 2666
        if(v->s.ac_pred) {
            if(!dc_pred_dir)
S
Stefan Gehrer 已提交
2667
                zz_table = wmv1_scantable[2];
2668
            else
S
Stefan Gehrer 已提交
2669
                zz_table = wmv1_scantable[3];
2670
        } else
S
Stefan Gehrer 已提交
2671
            zz_table = wmv1_scantable[1];
2672 2673 2674 2675 2676 2677 2678

        while (!last) {
            vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
            i += skip;
            if(i > 63)
                break;
            block[zz_table[i++]] = value;
A
Fixes:  
anonymous 已提交
2679
        }
2680

2681
        /* apply AC prediction if needed */
2682
        if(use_pred) {
2683
            /* scale predictors if needed*/
K
Kostya Shishkov 已提交
2684
            if(q2 && q1!=q2) {
2685 2686
                q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
                q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
2687 2688 2689

                if(dc_pred_dir) { //left
                    for(k = 1; k < 8; k++)
2690
                        block[k << 3] += (ac_val[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
2691 2692
                } else { //top
                    for(k = 1; k < 8; k++)
2693
                        block[k] += (ac_val[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
2694 2695 2696 2697 2698 2699 2700 2701 2702 2703
                }
            } else {
                if(dc_pred_dir) { //left
                    for(k = 1; k < 8; k++)
                        block[k << 3] += ac_val[k];
                } else { //top
                    for(k = 1; k < 8; k++)
                        block[k] += ac_val[k + 8];
                }
            }
2704
        }
2705 2706 2707 2708
        /* save AC coeffs for further prediction */
        for(k = 1; k < 8; k++) {
            ac_val2[k] = block[k << 3];
            ac_val2[k + 8] = block[k];
A
Fixes:  
anonymous 已提交
2709
        }
2710

2711 2712 2713 2714 2715 2716 2717
        /* scale AC coeffs */
        for(k = 1; k < 64; k++)
            if(block[k]) {
                block[k] *= scale;
                if(!v->pquantizer)
                    block[k] += (block[k] < 0) ? -mquant : mquant;
            }
2718

2719
        if(use_pred) i = 63;
2720 2721
    } else { // no AC coeffs
        int k;
2722

2723 2724
        memset(ac_val2, 0, 16 * 2);
        if(dc_pred_dir) {//left
K
Kostya Shishkov 已提交
2725
            if(use_pred) {
2726
                memcpy(ac_val2, ac_val, 8 * 2);
K
Kostya Shishkov 已提交
2727
                if(q2 && q1!=q2) {
2728 2729
                    q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
                    q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
K
Kostya Shishkov 已提交
2730
                    for(k = 1; k < 8; k++)
2731
                        ac_val2[k] = (ac_val2[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
K
Kostya Shishkov 已提交
2732 2733
                }
            }
2734
        } else {//top
K
Kostya Shishkov 已提交
2735
            if(use_pred) {
2736
                memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
K
Kostya Shishkov 已提交
2737
                if(q2 && q1!=q2) {
2738 2739
                    q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
                    q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
K
Kostya Shishkov 已提交
2740
                    for(k = 1; k < 8; k++)
2741
                        ac_val2[k + 8] = (ac_val2[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
K
Kostya Shishkov 已提交
2742 2743
                }
            }
2744
        }
2745

2746
        /* apply AC prediction if needed */
2747
        if(use_pred) {
2748 2749
            if(dc_pred_dir) { //left
                for(k = 1; k < 8; k++) {
K
Kostya Shishkov 已提交
2750
                    block[k << 3] = ac_val2[k] * scale;
2751
                    if(!v->pquantizer && block[k << 3])
2752 2753 2754 2755
                        block[k << 3] += (block[k << 3] < 0) ? -mquant : mquant;
                }
            } else { //top
                for(k = 1; k < 8; k++) {
K
Kostya Shishkov 已提交
2756
                    block[k] = ac_val2[k + 8] * scale;
2757
                    if(!v->pquantizer && block[k])
2758 2759 2760 2761
                        block[k] += (block[k] < 0) ? -mquant : mquant;
                }
            }
            i = 63;
2762 2763 2764
        }
    }
    s->block_last_index[n] = i;
2765

A
Fixes:  
anonymous 已提交
2766 2767
    return 0;
}
2768

2769 2770 2771 2772 2773 2774
/** Decode intra block in inter frames - more generic version than vc1_decode_i_block
 * @param v VC1Context
 * @param block block to decode
 * @param coded are AC coeffs present or not
 * @param mquant block quantizer
 * @param codingset set of VLC to decode data
A
anonymous 已提交
2775
 */
2776
static int vc1_decode_intra_block(VC1Context *v, DCTELEM block[64], int n, int coded, int mquant, int codingset)
2777
{
2778
    GetBitContext *gb = &v->s.gb;
2779
    MpegEncContext *s = &v->s;
2780 2781
    int dc_pred_dir = 0; /* Direction of the DC prediction used */
    int run_diff, i;
M
Måns Rullgård 已提交
2782
    int16_t *dc_val;
2783 2784 2785 2786 2787 2788 2789
    int16_t *ac_val, *ac_val2;
    int dcdiff;
    int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
    int a_avail = v->a_avail, c_avail = v->c_avail;
    int use_pred = s->ac_pred;
    int scale;
    int q1, q2 = 0;
I
Ivan Kalvachev 已提交
2790

2791 2792
    /* XXX: Guard against dumb values of mquant */
    mquant = (mquant < 1) ? 0 : ( (mquant>31) ? 31 : mquant );
I
Ivan Kalvachev 已提交
2793

2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821
    /* Set DC scale - y and c use the same */
    s->y_dc_scale = s->y_dc_scale_table[mquant];
    s->c_dc_scale = s->c_dc_scale_table[mquant];

    /* Get DC differential */
    if (n < 4) {
        dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_luma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
    } else {
        dcdiff = get_vlc2(&s->gb, ff_msmp4_dc_chroma_vlc[s->dc_table_index].table, DC_VLC_BITS, 3);
    }
    if (dcdiff < 0){
        av_log(s->avctx, AV_LOG_ERROR, "Illegal DC VLC\n");
        return -1;
    }
    if (dcdiff)
    {
        if (dcdiff == 119 /* ESC index value */)
        {
            /* TODO: Optimize */
            if (mquant == 1) dcdiff = get_bits(gb, 10);
            else if (mquant == 2) dcdiff = get_bits(gb, 9);
            else dcdiff = get_bits(gb, 8);
        }
        else
        {
            if (mquant == 1)
                dcdiff = (dcdiff<<2) + get_bits(gb, 2) - 3;
            else if (mquant == 2)
2822
                dcdiff = (dcdiff<<1) + get_bits1(gb)   - 1;
2823
        }
2824
        if (get_bits1(gb))
2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860
            dcdiff = -dcdiff;
    }

    /* Prediction */
    dcdiff += vc1_pred_dc(&v->s, v->overlap, mquant, n, a_avail, c_avail, &dc_val, &dc_pred_dir);
    *dc_val = dcdiff;

    /* Store the quantized DC coeff, used for prediction */

    if (n < 4) {
        block[0] = dcdiff * s->y_dc_scale;
    } else {
        block[0] = dcdiff * s->c_dc_scale;
    }
    /* Skip ? */
    run_diff = 0;
    i = 0;

    //AC Decoding
    i = 1;

    /* check if AC is needed at all and adjust direction if needed */
    if(!a_avail) dc_pred_dir = 1;
    if(!c_avail) dc_pred_dir = 0;
    if(!a_avail && !c_avail) use_pred = 0;
    ac_val = s->ac_val[0][0] + s->block_index[n] * 16;
    ac_val2 = ac_val;

    scale = mquant * 2 + v->halfpq;

    if(dc_pred_dir) //left
        ac_val -= 16;
    else //top
        ac_val -= 16 * s->block_wrap[n];

    q1 = s->current_picture.qscale_table[mb_pos];
2861 2862
    if(dc_pred_dir && c_avail && mb_pos) q2 = s->current_picture.qscale_table[mb_pos - 1];
    if(!dc_pred_dir && a_avail && mb_pos >= s->mb_stride) q2 = s->current_picture.qscale_table[mb_pos - s->mb_stride];
2863 2864 2865
    if(dc_pred_dir && n==1) q2 = q1;
    if(!dc_pred_dir && n==2) q2 = q1;
    if(n==3) q2 = q1;
2866 2867 2868 2869 2870 2871

    if(coded) {
        int last = 0, skip, value;
        const int8_t *zz_table;
        int k;

S
Stefan Gehrer 已提交
2872
        zz_table = wmv1_scantable[0];
2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885

        while (!last) {
            vc1_decode_ac_coeff(v, &last, &skip, &value, codingset);
            i += skip;
            if(i > 63)
                break;
            block[zz_table[i++]] = value;
        }

        /* apply AC prediction if needed */
        if(use_pred) {
            /* scale predictors if needed*/
            if(q2 && q1!=q2) {
2886 2887
                q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
                q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
2888 2889 2890

                if(dc_pred_dir) { //left
                    for(k = 1; k < 8; k++)
2891
                        block[k << 3] += (ac_val[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
2892 2893
                } else { //top
                    for(k = 1; k < 8; k++)
2894
                        block[k] += (ac_val[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928
                }
            } else {
                if(dc_pred_dir) { //left
                    for(k = 1; k < 8; k++)
                        block[k << 3] += ac_val[k];
                } else { //top
                    for(k = 1; k < 8; k++)
                        block[k] += ac_val[k + 8];
                }
            }
        }
        /* save AC coeffs for further prediction */
        for(k = 1; k < 8; k++) {
            ac_val2[k] = block[k << 3];
            ac_val2[k + 8] = block[k];
        }

        /* scale AC coeffs */
        for(k = 1; k < 64; k++)
            if(block[k]) {
                block[k] *= scale;
                if(!v->pquantizer)
                    block[k] += (block[k] < 0) ? -mquant : mquant;
            }

        if(use_pred) i = 63;
    } else { // no AC coeffs
        int k;

        memset(ac_val2, 0, 16 * 2);
        if(dc_pred_dir) {//left
            if(use_pred) {
                memcpy(ac_val2, ac_val, 8 * 2);
                if(q2 && q1!=q2) {
2929 2930
                    q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
                    q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
2931
                    for(k = 1; k < 8; k++)
2932
                        ac_val2[k] = (ac_val2[k] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
2933 2934 2935 2936 2937 2938
                }
            }
        } else {//top
            if(use_pred) {
                memcpy(ac_val2 + 8, ac_val + 8, 8 * 2);
                if(q2 && q1!=q2) {
2939 2940
                    q1 = q1 * 2 + ((q1 == v->pq) ? v->halfpq : 0) - 1;
                    q2 = q2 * 2 + ((q2 == v->pq) ? v->halfpq : 0) - 1;
2941
                    for(k = 1; k < 8; k++)
2942
                        ac_val2[k + 8] = (ac_val2[k + 8] * q2 * ff_vc1_dqscale[q1 - 1] + 0x20000) >> 18;
2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971
                }
            }
        }

        /* apply AC prediction if needed */
        if(use_pred) {
            if(dc_pred_dir) { //left
                for(k = 1; k < 8; k++) {
                    block[k << 3] = ac_val2[k] * scale;
                    if(!v->pquantizer && block[k << 3])
                        block[k << 3] += (block[k << 3] < 0) ? -mquant : mquant;
                }
            } else { //top
                for(k = 1; k < 8; k++) {
                    block[k] = ac_val2[k + 8] * scale;
                    if(!v->pquantizer && block[k])
                        block[k] += (block[k] < 0) ? -mquant : mquant;
                }
            }
            i = 63;
        }
    }
    s->block_last_index[n] = i;

    return 0;
}

/** Decode P block
 */
2972
static int vc1_decode_p_block(VC1Context *v, DCTELEM block[64], int n, int mquant, int ttmb, int first_block,
2973
                              uint8_t *dst, int linesize, int skip_block, int apply_filter, int cbp_top, int cbp_left)
2974 2975 2976 2977 2978 2979 2980
{
    MpegEncContext *s = &v->s;
    GetBitContext *gb = &s->gb;
    int i, j;
    int subblkpat = 0;
    int scale, off, idx, last, skip, value;
    int ttblk = ttmb & 7;
2981
    int pat = 0;
2982 2983

    if(ttmb == -1) {
2984
        ttblk = ff_vc1_ttblk_to_tt[v->tt_index][get_vlc2(gb, ff_vc1_ttblk_vlc[v->tt_index].table, VC1_TTBLK_VLC_BITS, 1)];
2985 2986
    }
    if(ttblk == TT_4X4) {
2987
        subblkpat = ~(get_vlc2(gb, ff_vc1_subblkpat_vlc[v->tt_index].table, VC1_SUBBLKPAT_VLC_BITS, 1) + 1);
2988 2989 2990 2991 2992 2993 2994
    }
    if((ttblk != TT_8X8 && ttblk != TT_4X4) && (v->ttmbf || (ttmb != -1 && (ttmb & 8) && !first_block))) {
        subblkpat = decode012(gb);
        if(subblkpat) subblkpat ^= 3; //swap decoded pattern bits
        if(ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM) ttblk = TT_8X4;
        if(ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT) ttblk = TT_4X8;
    }
K
Kostya Shishkov 已提交
2995
    scale = 2 * mquant + ((v->pq == mquant) ? v->halfpq : 0);
2996 2997

    // convert transforms like 8X4_TOP to generic TT and SUBBLKPAT
2998 2999
    if(ttblk == TT_8X4_TOP || ttblk == TT_8X4_BOTTOM) {
        subblkpat = 2 - (ttblk == TT_8X4_TOP);
3000
        ttblk = TT_8X4;
3001 3002 3003
    }
    if(ttblk == TT_4X8_RIGHT || ttblk == TT_4X8_LEFT) {
        subblkpat = 2 - (ttblk == TT_4X8_LEFT);
3004
        ttblk = TT_4X8;
3005 3006 3007
    }
    switch(ttblk) {
    case TT_8X8:
3008
        pat = 0xF;
3009 3010 3011 3012 3013 3014 3015
        i = 0;
        last = 0;
        while (!last) {
            vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
            i += skip;
            if(i > 63)
                break;
S
Stefan Gehrer 已提交
3016
            idx = wmv1_scantable[0][i++];
3017
            block[idx] = value * scale;
3018 3019
            if(!v->pquantizer)
                block[idx] += (block[idx] < 0) ? -mquant : mquant;
3020
        }
3021 3022 3023
        if(!skip_block){
            s->dsp.vc1_inv_trans_8x8(block);
            s->dsp.add_pixels_clamped(block, dst, linesize);
3024 3025 3026 3027
            if(apply_filter && cbp_top  & 0xC)
                vc1_loop_filter(dst, 1, linesize, 8, mquant);
            if(apply_filter && cbp_left & 0xA)
                vc1_loop_filter(dst, linesize, 1, 8, mquant);
3028
        }
3029 3030
        break;
    case TT_4X4:
3031
        pat = ~subblkpat & 0xF;
3032 3033 3034
        for(j = 0; j < 4; j++) {
            last = subblkpat & (1 << (3 - j));
            i = 0;
3035
            off = (j & 1) * 4 + (j & 2) * 16;
3036 3037 3038 3039 3040
            while (!last) {
                vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
                i += skip;
                if(i > 15)
                    break;
3041
                idx = ff_vc1_simple_progressive_4x4_zz[i++];
3042
                block[idx + off] = value * scale;
3043 3044
                if(!v->pquantizer)
                    block[idx + off] += (block[idx + off] < 0) ? -mquant : mquant;
3045
            }
3046
            if(!(subblkpat & (1 << (3 - j))) && !skip_block){
3047
                s->dsp.vc1_inv_trans_4x4(dst + (j&1)*4 + (j&2)*2*linesize, linesize, block + off);
3048 3049 3050 3051 3052
                if(apply_filter && (j&2 ? pat & (1<<(j-2)) : (cbp_top & (1 << (j + 2)))))
                    vc1_loop_filter(dst + (j&1)*4 + (j&2)*2*linesize, 1, linesize, 4, mquant);
                if(apply_filter && (j&1 ? pat & (1<<(j-1)) : (cbp_left & (1 << (j + 1)))))
                    vc1_loop_filter(dst + (j&1)*4 + (j&2)*2*linesize, linesize, 1, 4, mquant);
            }
3053 3054 3055
        }
        break;
    case TT_8X4:
3056
        pat = ~((subblkpat & 2)*6 + (subblkpat & 1)*3) & 0xF;
3057 3058 3059 3060 3061 3062 3063 3064 3065
        for(j = 0; j < 2; j++) {
            last = subblkpat & (1 << (1 - j));
            i = 0;
            off = j * 32;
            while (!last) {
                vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
                i += skip;
                if(i > 31)
                    break;
3066 3067
                idx = v->zz_8x4[i++]+off;
                block[idx] = value * scale;
3068
                if(!v->pquantizer)
3069
                    block[idx] += (block[idx] < 0) ? -mquant : mquant;
3070
            }
3071
            if(!(subblkpat & (1 << (1 - j))) && !skip_block){
3072
                s->dsp.vc1_inv_trans_8x4(dst + j*4*linesize, linesize, block + off);
3073 3074 3075 3076 3077
                if(apply_filter && j ? pat & 0x3 : (cbp_top & 0xC))
                    vc1_loop_filter(dst + j*4*linesize, 1, linesize, 8, mquant);
                if(apply_filter && cbp_left & (2 << j))
                    vc1_loop_filter(dst + j*4*linesize, linesize, 1, 4, mquant);
            }
3078 3079 3080
        }
        break;
    case TT_4X8:
3081
        pat = ~(subblkpat*5) & 0xF;
3082 3083 3084 3085 3086 3087 3088 3089 3090
        for(j = 0; j < 2; j++) {
            last = subblkpat & (1 << (1 - j));
            i = 0;
            off = j * 4;
            while (!last) {
                vc1_decode_ac_coeff(v, &last, &skip, &value, v->codingset2);
                i += skip;
                if(i > 31)
                    break;
3091 3092
                idx = v->zz_4x8[i++]+off;
                block[idx] = value * scale;
3093
                if(!v->pquantizer)
3094
                    block[idx] += (block[idx] < 0) ? -mquant : mquant;
3095
            }
3096
            if(!(subblkpat & (1 << (1 - j))) && !skip_block){
3097
                s->dsp.vc1_inv_trans_4x8(dst + j*4, linesize, block + off);
3098 3099 3100 3101 3102
                if(apply_filter && cbp_top & (2 << j))
                    vc1_loop_filter(dst + j*4, 1, linesize, 4, mquant);
                if(apply_filter && j ? pat & 0x5 : (cbp_left & 0xA))
                    vc1_loop_filter(dst + j*4, linesize, 1, 8, mquant);
            }
3103
        }
3104
        break;
3105
    }
3106
    return pat;
3107 3108
}

3109

3110 3111
/** Decode one P-frame MB (in Simple/Main profile)
 */
3112
static int vc1_decode_p_mb(VC1Context *v)
3113 3114 3115
{
    MpegEncContext *s = &v->s;
    GetBitContext *gb = &s->gb;
3116
    int i, j;
3117
    int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
3118 3119
    int cbp; /* cbp decoding stuff */
    int mqdiff, mquant; /* MB quantization */
3120
    int ttmb = v->ttfrm; /* MB Transform type */
3121 3122 3123 3124 3125

    static const int size_table[6] = { 0, 2, 3, 4, 5, 8 },
      offset_table[6] = { 0, 1, 3, 7, 15, 31 };
    int mb_has_coeffs = 1; /* last_flag */
    int dmv_x, dmv_y; /* Differential MV components */
3126
    int index, index1; /* LUT indexes */
3127
    int val, sign; /* temp values */
3128 3129
    int first_block = 1;
    int dst_idx, off;
3130
    int skipped, fourmv;
3131
    int block_cbp = 0, pat;
3132
    int apply_loop_filter;
3133

3134 3135
    mquant = v->pq; /* Loosy initialization */

3136 3137 3138 3139 3140 3141 3142
    if (v->mv_type_is_raw)
        fourmv = get_bits1(gb);
    else
        fourmv = v->mv_type_mb_plane[mb_pos];
    if (v->skip_is_raw)
        skipped = get_bits1(gb);
    else
3143
        skipped = v->s.mbskip_table[mb_pos];
3144

K
Kostya Shishkov 已提交
3145 3146
    s->dsp.clear_blocks(s->block[0]);

3147
    apply_loop_filter = s->loop_filter && !(s->avctx->skip_loop_filter >= AVDISCARD_NONKEY);
3148
    if (!fourmv) /* 1MV mode */
3149
    {
3150
        if (!skipped)
3151 3152
        {
            GET_MVDATA(dmv_x, dmv_y);
I
Ivan Kalvachev 已提交
3153

K
Kostya Shishkov 已提交
3154 3155 3156 3157
            if (s->mb_intra) {
                s->current_picture.motion_val[1][s->block_index[0]][0] = 0;
                s->current_picture.motion_val[1][s->block_index[0]][1] = 0;
            }
3158
            s->current_picture.mb_type[mb_pos] = s->mb_intra ? MB_TYPE_INTRA : MB_TYPE_16x16;
K
Kostya Shishkov 已提交
3159
            vc1_pred_mv(s, 0, dmv_x, dmv_y, 1, v->range_x, v->range_y, v->mb_type[0]);
3160

3161
            /* FIXME Set DC val for inter block ? */
3162 3163 3164
            if (s->mb_intra && !mb_has_coeffs)
            {
                GET_MQUANT();
3165
                s->ac_pred = get_bits1(gb);
3166
                cbp = 0;
3167 3168 3169
            }
            else if (mb_has_coeffs)
            {
3170
                if (s->mb_intra) s->ac_pred = get_bits1(gb);
3171
                cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
3172 3173 3174 3175 3176
                GET_MQUANT();
            }
            else
            {
                mquant = v->pq;
3177
                cbp = 0;
3178
            }
3179
            s->current_picture.qscale_table[mb_pos] = mquant;
3180

3181
            if (!v->ttmbf && !s->mb_intra && mb_has_coeffs)
3182
                ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table,
3183
                                VC1_TTMB_VLC_BITS, 2);
3184
            if(!s->mb_intra) vc1_mc_1mv(v, 0);
3185
            dst_idx = 0;
3186 3187
            for (i=0; i<6; i++)
            {
3188 3189
                s->dc_val[0][s->block_index[i]] = 0;
                dst_idx += i >> 2;
3190
                val = ((cbp >> (5 - i)) & 1);
3191
                off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
K
Kostya Shishkov 已提交
3192
                v->mb_type[0][s->block_index[i]] = s->mb_intra;
3193
                if(s->mb_intra) {
3194 3195
                    /* check if prediction blocks A and C are available */
                    v->a_avail = v->c_avail = 0;
3196
                    if(i == 2 || i == 3 || !s->first_slice_line)
K
Kostya Shishkov 已提交
3197 3198 3199
                        v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
                    if(i == 1 || i == 3 || s->mb_x)
                        v->c_avail = v->mb_type[0][s->block_index[i] - 1];
3200

3201
                    vc1_decode_intra_block(v, s->block[i], i, val, mquant, (i&4)?v->codingset2:v->codingset);
K
Kostya Shishkov 已提交
3202
                    if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
3203
                    s->dsp.vc1_inv_trans_8x8(s->block[i]);
K
Kostya Shishkov 已提交
3204
                    if(v->rangeredfrm) for(j = 0; j < 64; j++) s->block[i][j] <<= 1;
3205
                    s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
3206 3207
                    if(v->pq >= 9 && v->overlap) {
                        if(v->c_avail)
3208
                            s->dsp.vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
3209
                        if(v->a_avail)
3210
                            s->dsp.vc1_v_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
3211
                    }
3212
                    if(apply_loop_filter && s->mb_x && s->mb_x != (s->mb_width - 1) && s->mb_y && s->mb_y != (s->mb_height - 1)){
3213 3214 3215 3216 3217
                        int left_cbp, top_cbp;
                        if(i & 4){
                            left_cbp = v->cbp[s->mb_x - 1]            >> (i * 4);
                            top_cbp  = v->cbp[s->mb_x - s->mb_stride] >> (i * 4);
                        }else{
3218 3219
                            left_cbp = (i & 1) ? (cbp >> ((i-1)*4)) : (v->cbp[s->mb_x - 1]           >> ((i+1)*4));
                            top_cbp  = (i & 2) ? (cbp >> ((i-2)*4)) : (v->cbp[s->mb_x - s->mb_stride] >> ((i+2)*4));
3220 3221 3222 3223 3224 3225 3226
                        }
                        if(left_cbp & 0xC)
                            vc1_loop_filter(s->dest[dst_idx] + off, 1, i & 4 ? s->uvlinesize : s->linesize, 8, mquant);
                        if(top_cbp  & 0xA)
                            vc1_loop_filter(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, 1, 8, mquant);
                    }
                    block_cbp |= 0xF << (i << 2);
3227
                } else if(val) {
3228
                    int left_cbp = 0, top_cbp = 0, filter = 0;
3229
                    if(apply_loop_filter && s->mb_x && s->mb_x != (s->mb_width - 1) && s->mb_y && s->mb_y != (s->mb_height - 1)){
3230 3231 3232 3233 3234
                        filter = 1;
                        if(i & 4){
                            left_cbp = v->cbp[s->mb_x - 1]            >> (i * 4);
                            top_cbp  = v->cbp[s->mb_x - s->mb_stride] >> (i * 4);
                        }else{
3235 3236
                            left_cbp = (i & 1) ? (cbp >> ((i-1)*4)) : (v->cbp[s->mb_x - 1]           >> ((i+1)*4));
                            top_cbp  = (i & 2) ? (cbp >> ((i-2)*4)) : (v->cbp[s->mb_x - s->mb_stride] >> ((i+2)*4));
3237
                        }
3238 3239 3240 3241
                        if(left_cbp & 0xC)
                            vc1_loop_filter(s->dest[dst_idx] + off, 1, i & 4 ? s->uvlinesize : s->linesize, 8, mquant);
                        if(top_cbp  & 0xA)
                            vc1_loop_filter(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, 1, 8, mquant);
3242 3243 3244
                    }
                    pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block, s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize, (i&4) && (s->flags & CODEC_FLAG_GRAY), filter, left_cbp, top_cbp);
                    block_cbp |= pat << (i << 2);
3245 3246
                    if(!v->ttmbf && ttmb < 8) ttmb = -1;
                    first_block = 0;
3247 3248 3249 3250 3251
                }
            }
        }
        else //Skipped
        {
3252
            s->mb_intra = 0;
3253 3254 3255 3256
            for(i = 0; i < 6; i++) {
                v->mb_type[0][s->block_index[i]] = 0;
                s->dc_val[0][s->block_index[i]] = 0;
            }
3257
            s->current_picture.mb_type[mb_pos] = MB_TYPE_SKIP;
K
Kostya Shishkov 已提交
3258 3259
            s->current_picture.qscale_table[mb_pos] = 0;
            vc1_pred_mv(s, 0, 0, 0, 1, v->range_x, v->range_y, v->mb_type[0]);
3260
            vc1_mc_1mv(v, 0);
3261 3262 3263 3264
            return 0;
        }
    } //1MV mode
    else //4MV mode
K
Kostya Shishkov 已提交
3265
    {
3266
        if (!skipped /* unskipped MB */)
3267
        {
K
Kostya Shishkov 已提交
3268 3269
            int intra_count = 0, coded_inter = 0;
            int is_intra[6], is_coded[6];
3270
            /* Get CBPCY */
3271
            cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
K
Kostya Shishkov 已提交
3272
            for (i=0; i<6; i++)
3273 3274
            {
                val = ((cbp >> (5 - i)) & 1);
K
Kostya Shishkov 已提交
3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292
                s->dc_val[0][s->block_index[i]] = 0;
                s->mb_intra = 0;
                if(i < 4) {
                    dmv_x = dmv_y = 0;
                    s->mb_intra = 0;
                    mb_has_coeffs = 0;
                    if(val) {
                        GET_MVDATA(dmv_x, dmv_y);
                    }
                    vc1_pred_mv(s, i, dmv_x, dmv_y, 0, v->range_x, v->range_y, v->mb_type[0]);
                    if(!s->mb_intra) vc1_mc_4mv_luma(v, i);
                    intra_count += s->mb_intra;
                    is_intra[i] = s->mb_intra;
                    is_coded[i] = mb_has_coeffs;
                }
                if(i&4){
                    is_intra[i] = (intra_count >= 3);
                    is_coded[i] = val;
3293
                }
K
Kostya Shishkov 已提交
3294 3295 3296
                if(i == 4) vc1_mc_4mv_chroma(v);
                v->mb_type[0][s->block_index[i]] = is_intra[i];
                if(!coded_inter) coded_inter = !is_intra[i] & is_coded[i];
3297
            }
3298
            // if there are no coded blocks then don't do anything more
K
Kostya Shishkov 已提交
3299
            if(!intra_count && !coded_inter) return 0;
K
Kostya Shishkov 已提交
3300 3301 3302 3303 3304 3305 3306 3307
            dst_idx = 0;
            GET_MQUANT();
            s->current_picture.qscale_table[mb_pos] = mquant;
            /* test if block is intra and has pred */
            {
                int intrapred = 0;
                for(i=0; i<6; i++)
                    if(is_intra[i]) {
3308 3309
                        if(((!s->first_slice_line || (i==2 || i==3)) && v->mb_type[0][s->block_index[i] - s->block_wrap[i]])
                            || ((s->mb_x || (i==1 || i==3)) && v->mb_type[0][s->block_index[i] - 1])) {
K
Kostya Shishkov 已提交
3310 3311 3312 3313
                            intrapred = 1;
                            break;
                        }
                    }
3314
                if(intrapred)s->ac_pred = get_bits1(gb);
K
Kostya Shishkov 已提交
3315 3316 3317
                else s->ac_pred = 0;
            }
            if (!v->ttmbf && coded_inter)
3318
                ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
K
Kostya Shishkov 已提交
3319 3320 3321 3322 3323 3324 3325 3326
            for (i=0; i<6; i++)
            {
                dst_idx += i >> 2;
                off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
                s->mb_intra = is_intra[i];
                if (is_intra[i]) {
                    /* check if prediction blocks A and C are available */
                    v->a_avail = v->c_avail = 0;
3327
                    if(i == 2 || i == 3 || !s->first_slice_line)
K
Kostya Shishkov 已提交
3328 3329 3330
                        v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
                    if(i == 1 || i == 3 || s->mb_x)
                        v->c_avail = v->mb_type[0][s->block_index[i] - 1];
3331

K
Kostya Shishkov 已提交
3332
                    vc1_decode_intra_block(v, s->block[i], i, is_coded[i], mquant, (i&4)?v->codingset2:v->codingset);
K
Kostya Shishkov 已提交
3333
                    if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
3334
                    s->dsp.vc1_inv_trans_8x8(s->block[i]);
K
Kostya Shishkov 已提交
3335
                    if(v->rangeredfrm) for(j = 0; j < 64; j++) s->block[i][j] <<= 1;
3336
                    s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize);
K
Kostya Shishkov 已提交
3337 3338
                    if(v->pq >= 9 && v->overlap) {
                        if(v->c_avail)
3339
                            s->dsp.vc1_h_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
3340
                        if(v->a_avail)
3341
                            s->dsp.vc1_v_overlap(s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
3342
                    }
3343 3344 3345 3346 3347 3348
                    if(v->s.loop_filter && s->mb_x && s->mb_x != (s->mb_width - 1) && s->mb_y && s->mb_y != (s->mb_height - 1)){
                        int left_cbp, top_cbp;
                        if(i & 4){
                            left_cbp = v->cbp[s->mb_x - 1]            >> (i * 4);
                            top_cbp  = v->cbp[s->mb_x - s->mb_stride] >> (i * 4);
                        }else{
3349 3350
                            left_cbp = (i & 1) ? (cbp >> ((i-1)*4)) : (v->cbp[s->mb_x - 1]           >> ((i+1)*4));
                            top_cbp  = (i & 2) ? (cbp >> ((i-2)*4)) : (v->cbp[s->mb_x - s->mb_stride] >> ((i+2)*4));
3351 3352 3353 3354 3355 3356 3357
                        }
                        if(left_cbp & 0xC)
                            vc1_loop_filter(s->dest[dst_idx] + off, 1, i & 4 ? s->uvlinesize : s->linesize, 8, mquant);
                        if(top_cbp  & 0xA)
                            vc1_loop_filter(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, 1, 8, mquant);
                    }
                    block_cbp |= 0xF << (i << 2);
K
Kostya Shishkov 已提交
3358
                } else if(is_coded[i]) {
3359 3360 3361 3362 3363 3364 3365
                    int left_cbp = 0, top_cbp = 0, filter = 0;
                    if(v->s.loop_filter && s->mb_x && s->mb_x != (s->mb_width - 1) && s->mb_y && s->mb_y != (s->mb_height - 1)){
                        filter = 1;
                        if(i & 4){
                            left_cbp = v->cbp[s->mb_x - 1]            >> (i * 4);
                            top_cbp  = v->cbp[s->mb_x - s->mb_stride] >> (i * 4);
                        }else{
3366 3367
                            left_cbp = (i & 1) ? (cbp >> ((i-1)*4)) : (v->cbp[s->mb_x - 1]           >> ((i+1)*4));
                            top_cbp  = (i & 2) ? (cbp >> ((i-2)*4)) : (v->cbp[s->mb_x - s->mb_stride] >> ((i+2)*4));
3368
                        }
3369 3370 3371 3372
                        if(left_cbp & 0xC)
                            vc1_loop_filter(s->dest[dst_idx] + off, 1, i & 4 ? s->uvlinesize : s->linesize, 8, mquant);
                        if(top_cbp  & 0xA)
                            vc1_loop_filter(s->dest[dst_idx] + off, i & 4 ? s->uvlinesize : s->linesize, 1, 8, mquant);
3373 3374 3375
                    }
                    pat = vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block, s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize, (i&4) && (s->flags & CODEC_FLAG_GRAY), filter, left_cbp, top_cbp);
                    block_cbp |= pat << (i << 2);
K
Kostya Shishkov 已提交
3376 3377
                    if(!v->ttmbf && ttmb < 8) ttmb = -1;
                    first_block = 0;
3378
                }
3379
            }
3380
            return 0;
3381 3382 3383
        }
        else //Skipped MB
        {
3384
            s->mb_intra = 0;
K
Kostya Shishkov 已提交
3385
            s->current_picture.qscale_table[mb_pos] = 0;
3386 3387 3388 3389
            for (i=0; i<6; i++) {
                v->mb_type[0][s->block_index[i]] = 0;
                s->dc_val[0][s->block_index[i]] = 0;
            }
3390 3391
            for (i=0; i<4; i++)
            {
K
Kostya Shishkov 已提交
3392 3393
                vc1_pred_mv(s, i, 0, 0, 0, v->range_x, v->range_y, v->mb_type[0]);
                vc1_mc_4mv_luma(v, i);
3394
            }
K
Kostya Shishkov 已提交
3395 3396
            vc1_mc_4mv_chroma(v);
            s->current_picture.qscale_table[mb_pos] = 0;
3397 3398 3399
            return 0;
        }
    }
3400
    v->cbp[s->mb_x] = block_cbp;
I
Ivan Kalvachev 已提交
3401

3402 3403 3404 3405
    /* Should never happen */
    return -1;
}

3406 3407 3408 3409 3410 3411 3412 3413
/** Decode one B-frame MB (in Main profile)
 */
static void vc1_decode_b_mb(VC1Context *v)
{
    MpegEncContext *s = &v->s;
    GetBitContext *gb = &s->gb;
    int i, j;
    int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
3414
    int cbp = 0; /* cbp decoding stuff */
3415 3416 3417 3418 3419 3420
    int mqdiff, mquant; /* MB quantization */
    int ttmb = v->ttfrm; /* MB Transform type */

    static const int size_table[6] = { 0, 2, 3, 4, 5, 8 },
      offset_table[6] = { 0, 1, 3, 7, 15, 31 };
    int mb_has_coeffs = 0; /* last_flag */
3421
    int index, index1; /* LUT indexes */
3422 3423 3424 3425 3426
    int val, sign; /* temp values */
    int first_block = 1;
    int dst_idx, off;
    int skipped, direct;
    int dmv_x[2], dmv_y[2];
3427
    int bmvtype = BMV_TYPE_BACKWARD;
3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451

    mquant = v->pq; /* Loosy initialization */
    s->mb_intra = 0;

    if (v->dmb_is_raw)
        direct = get_bits1(gb);
    else
        direct = v->direct_mb_plane[mb_pos];
    if (v->skip_is_raw)
        skipped = get_bits1(gb);
    else
        skipped = v->s.mbskip_table[mb_pos];

    s->dsp.clear_blocks(s->block[0]);
    dmv_x[0] = dmv_x[1] = dmv_y[0] = dmv_y[1] = 0;
    for(i = 0; i < 6; i++) {
        v->mb_type[0][s->block_index[i]] = 0;
        s->dc_val[0][s->block_index[i]] = 0;
    }
    s->current_picture.qscale_table[mb_pos] = 0;

    if (!direct) {
        if (!skipped) {
            GET_MVDATA(dmv_x[0], dmv_y[0]);
3452 3453
            dmv_x[1] = dmv_x[0];
            dmv_y[1] = dmv_y[0];
3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465
        }
        if(skipped || !s->mb_intra) {
            bmvtype = decode012(gb);
            switch(bmvtype) {
            case 0:
                bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_BACKWARD : BMV_TYPE_FORWARD;
                break;
            case 1:
                bmvtype = (v->bfraction >= (B_FRACTION_DEN/2)) ? BMV_TYPE_FORWARD : BMV_TYPE_BACKWARD;
                break;
            case 2:
                bmvtype = BMV_TYPE_INTERPOLATED;
3466
                dmv_x[0] = dmv_y[0] = 0;
3467 3468 3469
            }
        }
    }
K
Kostya Shishkov 已提交
3470 3471 3472
    for(i = 0; i < 6; i++)
        v->mb_type[0][s->block_index[i]] = s->mb_intra;

3473
    if (skipped) {
K
Kostya Shishkov 已提交
3474 3475
        if(direct) bmvtype = BMV_TYPE_INTERPOLATED;
        vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
3476 3477 3478 3479 3480 3481
        vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
        return;
    }
    if (direct) {
        cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
        GET_MQUANT();
3482 3483
        s->mb_intra = 0;
        mb_has_coeffs = 0;
3484
        s->current_picture.qscale_table[mb_pos] = mquant;
3485
        if(!v->ttmbf)
3486
            ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
K
Kostya Shishkov 已提交
3487 3488
        dmv_x[0] = dmv_y[0] = dmv_x[1] = dmv_y[1] = 0;
        vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
3489 3490 3491 3492
        vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
    } else {
        if(!mb_has_coeffs && !s->mb_intra) {
            /* no coded blocks - effectively skipped */
K
Kostya Shishkov 已提交
3493
            vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
3494 3495 3496 3497 3498 3499 3500 3501
            vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
            return;
        }
        if(s->mb_intra && !mb_has_coeffs) {
            GET_MQUANT();
            s->current_picture.qscale_table[mb_pos] = mquant;
            s->ac_pred = get_bits1(gb);
            cbp = 0;
K
Kostya Shishkov 已提交
3502
            vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
3503 3504
        } else {
            if(bmvtype == BMV_TYPE_INTERPOLATED) {
3505
                GET_MVDATA(dmv_x[0], dmv_y[0]);
3506 3507
                if(!mb_has_coeffs) {
                    /* interpolated skipped block */
K
Kostya Shishkov 已提交
3508
                    vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
3509 3510 3511 3512
                    vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
                    return;
                }
            }
K
Kostya Shishkov 已提交
3513 3514
            vc1_pred_b_mv(v, dmv_x, dmv_y, direct, bmvtype);
            if(!s->mb_intra) {
3515
                vc1_b_mc(v, dmv_x, dmv_y, direct, bmvtype);
K
Kostya Shishkov 已提交
3516
            }
3517 3518 3519 3520 3521 3522
            if(s->mb_intra)
                s->ac_pred = get_bits1(gb);
            cbp = get_vlc2(&v->s.gb, v->cbpcy_vlc->table, VC1_CBPCY_P_VLC_BITS, 2);
            GET_MQUANT();
            s->current_picture.qscale_table[mb_pos] = mquant;
            if(!v->ttmbf && !s->mb_intra && mb_has_coeffs)
3523
                ttmb = get_vlc2(gb, ff_vc1_ttmb_vlc[v->tt_index].table, VC1_TTMB_VLC_BITS, 2);
3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542
        }
    }
    dst_idx = 0;
    for (i=0; i<6; i++)
    {
        s->dc_val[0][s->block_index[i]] = 0;
        dst_idx += i >> 2;
        val = ((cbp >> (5 - i)) & 1);
        off = (i & 4) ? 0 : ((i & 1) * 8 + (i & 2) * 4 * s->linesize);
        v->mb_type[0][s->block_index[i]] = s->mb_intra;
        if(s->mb_intra) {
            /* check if prediction blocks A and C are available */
            v->a_avail = v->c_avail = 0;
            if(i == 2 || i == 3 || !s->first_slice_line)
                v->a_avail = v->mb_type[0][s->block_index[i] - s->block_wrap[i]];
            if(i == 1 || i == 3 || s->mb_x)
                v->c_avail = v->mb_type[0][s->block_index[i] - 1];

            vc1_decode_intra_block(v, s->block[i], i, val, mquant, (i&4)?v->codingset2:v->codingset);
K
Kostya Shishkov 已提交
3543
            if((i>3) && (s->flags & CODEC_FLAG_GRAY)) continue;
3544
            s->dsp.vc1_inv_trans_8x8(s->block[i]);
K
Kostya Shishkov 已提交
3545
            if(v->rangeredfrm) for(j = 0; j < 64; j++) s->block[i][j] <<= 1;
3546
            s->dsp.put_signed_pixels_clamped(s->block[i], s->dest[dst_idx] + off, s->linesize >> ((i & 4) >> 2));
3547
        } else if(val) {
3548
            vc1_decode_p_block(v, s->block[i], i, mquant, ttmb, first_block, s->dest[dst_idx] + off, (i&4)?s->uvlinesize:s->linesize, (i&4) && (s->flags & CODEC_FLAG_GRAY), 0, 0, 0);
3549 3550 3551 3552 3553 3554
            if(!v->ttmbf && ttmb < 8) ttmb = -1;
            first_block = 0;
        }
    }
}

3555
/** Decode blocks of I-frame
3556
 */
3557
static void vc1_decode_i_blocks(VC1Context *v)
3558
{
3559
    int k, j;
3560
    MpegEncContext *s = &v->s;
3561 3562 3563
    int cbp, val;
    uint8_t *coded_val;
    int mb_pos;
I
Ivan Kalvachev 已提交
3564

3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576
    /* select codingmode used for VLC tables selection */
    switch(v->y_ac_table_index){
    case 0:
        v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
        break;
    case 1:
        v->codingset = CS_HIGH_MOT_INTRA;
        break;
    case 2:
        v->codingset = CS_MID_RATE_INTRA;
        break;
    }
I
Ivan Kalvachev 已提交
3577

3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588
    switch(v->c_ac_table_index){
    case 0:
        v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
        break;
    case 1:
        v->codingset2 = CS_HIGH_MOT_INTER;
        break;
    case 2:
        v->codingset2 = CS_MID_RATE_INTER;
        break;
    }
3589

3590 3591 3592 3593 3594 3595 3596
    /* Set DC scale - y and c use the same */
    s->y_dc_scale = s->y_dc_scale_table[v->pq];
    s->c_dc_scale = s->c_dc_scale_table[v->pq];

    //do frame decode
    s->mb_x = s->mb_y = 0;
    s->mb_intra = 1;
3597
    s->first_slice_line = 1;
3598 3599 3600 3601 3602 3603 3604 3605
    for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
        for(s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) {
            ff_init_block_index(s);
            ff_update_block_index(s);
            s->dsp.clear_blocks(s->block[0]);
            mb_pos = s->mb_x + s->mb_y * s->mb_width;
            s->current_picture.mb_type[mb_pos] = MB_TYPE_INTRA;
            s->current_picture.qscale_table[mb_pos] = v->pq;
3606 3607
            s->current_picture.motion_val[1][s->block_index[0]][0] = 0;
            s->current_picture.motion_val[1][s->block_index[0]][1] = 0;
3608 3609 3610

            // do actual MB decoding and displaying
            cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
3611
            v->s.ac_pred = get_bits1(&v->s.gb);
3612 3613 3614

            for(k = 0; k < 6; k++) {
                val = ((cbp >> (5 - k)) & 1);
3615

3616 3617 3618 3619 3620 3621
                if (k < 4) {
                    int pred = vc1_coded_block_pred(&v->s, k, &coded_val);
                    val = val ^ pred;
                    *coded_val = val;
                }
                cbp |= val << (5 - k);
I
Ivan Kalvachev 已提交
3622

3623 3624
                vc1_decode_i_block(v, s->block[k], k, val, (k<4)? v->codingset : v->codingset2);

3625
                s->dsp.vc1_inv_trans_8x8(s->block[k]);
3626
                if(v->pq >= 9 && v->overlap) {
3627
                    for(j = 0; j < 64; j++) s->block[k][j] += 128;
3628
                }
3629 3630
            }

3631
            vc1_put_block(v, s->block);
3632
            if(v->pq >= 9 && v->overlap) {
3633
                if(s->mb_x) {
3634 3635
                    s->dsp.vc1_h_overlap(s->dest[0], s->linesize);
                    s->dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
K
Kostya Shishkov 已提交
3636
                    if(!(s->flags & CODEC_FLAG_GRAY)) {
3637 3638
                        s->dsp.vc1_h_overlap(s->dest[1], s->uvlinesize);
                        s->dsp.vc1_h_overlap(s->dest[2], s->uvlinesize);
K
Kostya Shishkov 已提交
3639
                    }
3640
                }
3641 3642
                s->dsp.vc1_h_overlap(s->dest[0] + 8, s->linesize);
                s->dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
3643
                if(!s->first_slice_line) {
3644 3645
                    s->dsp.vc1_v_overlap(s->dest[0], s->linesize);
                    s->dsp.vc1_v_overlap(s->dest[0] + 8, s->linesize);
3646
                    if(!(s->flags & CODEC_FLAG_GRAY)) {
3647 3648
                        s->dsp.vc1_v_overlap(s->dest[1], s->uvlinesize);
                        s->dsp.vc1_v_overlap(s->dest[2], s->uvlinesize);
3649 3650
                    }
                }
3651 3652
                s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
                s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
3653
            }
3654
            if(v->s.loop_filter) vc1_loop_filter_iblk(s, s->current_picture.qscale_table[mb_pos]);
3655

3656
            if(get_bits_count(&s->gb) > v->bits) {
3657
                ff_er_add_slice(s, 0, 0, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END));
3658 3659 3660 3661 3662
                av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n", get_bits_count(&s->gb), v->bits);
                return;
            }
        }
        ff_draw_horiz_band(s, s->mb_y * 16, 16);
3663
        s->first_slice_line = 0;
3664
    }
3665
    ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END));
3666 3667
}

3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717
/** Decode blocks of I-frame for advanced profile
 */
static void vc1_decode_i_blocks_adv(VC1Context *v)
{
    int k, j;
    MpegEncContext *s = &v->s;
    int cbp, val;
    uint8_t *coded_val;
    int mb_pos;
    int mquant = v->pq;
    int mqdiff;
    int overlap;
    GetBitContext *gb = &s->gb;

    /* select codingmode used for VLC tables selection */
    switch(v->y_ac_table_index){
    case 0:
        v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
        break;
    case 1:
        v->codingset = CS_HIGH_MOT_INTRA;
        break;
    case 2:
        v->codingset = CS_MID_RATE_INTRA;
        break;
    }

    switch(v->c_ac_table_index){
    case 0:
        v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
        break;
    case 1:
        v->codingset2 = CS_HIGH_MOT_INTER;
        break;
    case 2:
        v->codingset2 = CS_MID_RATE_INTER;
        break;
    }

    //do frame decode
    s->mb_x = s->mb_y = 0;
    s->mb_intra = 1;
    s->first_slice_line = 1;
    for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
        for(s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) {
            ff_init_block_index(s);
            ff_update_block_index(s);
            s->dsp.clear_blocks(s->block[0]);
            mb_pos = s->mb_x + s->mb_y * s->mb_stride;
            s->current_picture.mb_type[mb_pos] = MB_TYPE_INTRA;
3718 3719
            s->current_picture.motion_val[1][s->block_index[0]][0] = 0;
            s->current_picture.motion_val[1][s->block_index[0]][1] = 0;
3720 3721 3722 3723

            // do actual MB decoding and displaying
            cbp = get_vlc2(&v->s.gb, ff_msmp4_mb_i_vlc.table, MB_INTRA_VLC_BITS, 2);
            if(v->acpred_is_raw)
3724
                v->s.ac_pred = get_bits1(&v->s.gb);
3725 3726 3727 3728 3729
            else
                v->s.ac_pred = v->acpred_plane[mb_pos];

            if(v->condover == CONDOVER_SELECT) {
                if(v->overflg_is_raw)
3730
                    overlap = get_bits1(&v->s.gb);
3731 3732 3733 3734 3735 3736 3737 3738
                else
                    overlap = v->over_flags_plane[mb_pos];
            } else
                overlap = (v->condover == CONDOVER_ALL);

            GET_MQUANT();

            s->current_picture.qscale_table[mb_pos] = mquant;
3739 3740 3741
            /* Set DC scale - y and c use the same */
            s->y_dc_scale = s->y_dc_scale_table[mquant];
            s->c_dc_scale = s->c_dc_scale_table[mquant];
3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764

            for(k = 0; k < 6; k++) {
                val = ((cbp >> (5 - k)) & 1);

                if (k < 4) {
                    int pred = vc1_coded_block_pred(&v->s, k, &coded_val);
                    val = val ^ pred;
                    *coded_val = val;
                }
                cbp |= val << (5 - k);

                v->a_avail = !s->first_slice_line || (k==2 || k==3);
                v->c_avail = !!s->mb_x || (k==1 || k==3);

                vc1_decode_i_block_adv(v, s->block[k], k, val, (k<4)? v->codingset : v->codingset2, mquant);

                s->dsp.vc1_inv_trans_8x8(s->block[k]);
                for(j = 0; j < 64; j++) s->block[k][j] += 128;
            }

            vc1_put_block(v, s->block);
            if(overlap) {
                if(s->mb_x) {
3765 3766
                    s->dsp.vc1_h_overlap(s->dest[0], s->linesize);
                    s->dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
3767
                    if(!(s->flags & CODEC_FLAG_GRAY)) {
3768 3769
                        s->dsp.vc1_h_overlap(s->dest[1], s->uvlinesize);
                        s->dsp.vc1_h_overlap(s->dest[2], s->uvlinesize);
3770 3771
                    }
                }
3772 3773
                s->dsp.vc1_h_overlap(s->dest[0] + 8, s->linesize);
                s->dsp.vc1_h_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
3774
                if(!s->first_slice_line) {
3775 3776
                    s->dsp.vc1_v_overlap(s->dest[0], s->linesize);
                    s->dsp.vc1_v_overlap(s->dest[0] + 8, s->linesize);
3777
                    if(!(s->flags & CODEC_FLAG_GRAY)) {
3778 3779
                        s->dsp.vc1_v_overlap(s->dest[1], s->uvlinesize);
                        s->dsp.vc1_v_overlap(s->dest[2], s->uvlinesize);
3780 3781
                    }
                }
3782 3783
                s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize, s->linesize);
                s->dsp.vc1_v_overlap(s->dest[0] + 8 * s->linesize + 8, s->linesize);
3784
            }
3785
            if(v->s.loop_filter) vc1_loop_filter_iblk(s, s->current_picture.qscale_table[mb_pos]);
3786 3787

            if(get_bits_count(&s->gb) > v->bits) {
3788
                ff_er_add_slice(s, 0, 0, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END));
3789 3790 3791 3792 3793 3794 3795
                av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i\n", get_bits_count(&s->gb), v->bits);
                return;
            }
        }
        ff_draw_horiz_band(s, s->mb_y * 16, 16);
        s->first_slice_line = 0;
    }
3796
    ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END));
3797 3798
}

3799
static void vc1_decode_p_blocks(VC1Context *v)
3800 3801
{
    MpegEncContext *s = &v->s;
I
Ivan Kalvachev 已提交
3802

3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813
    /* select codingmode used for VLC tables selection */
    switch(v->c_ac_table_index){
    case 0:
        v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
        break;
    case 1:
        v->codingset = CS_HIGH_MOT_INTRA;
        break;
    case 2:
        v->codingset = CS_MID_RATE_INTRA;
        break;
3814
    }
I
Ivan Kalvachev 已提交
3815

3816 3817 3818 3819 3820 3821 3822 3823 3824 3825
    switch(v->c_ac_table_index){
    case 0:
        v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
        break;
    case 1:
        v->codingset2 = CS_HIGH_MOT_INTER;
        break;
    case 2:
        v->codingset2 = CS_MID_RATE_INTER;
        break;
3826 3827
    }

3828
    s->first_slice_line = 1;
3829
    memset(v->cbp_base, 0, sizeof(v->cbp_base[0])*2*s->mb_stride);
3830 3831 3832 3833 3834 3835
    for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
        for(s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) {
            ff_init_block_index(s);
            ff_update_block_index(s);
            s->dsp.clear_blocks(s->block[0]);

3836
            vc1_decode_p_mb(v);
3837
            if(get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) {
3838
                ff_er_add_slice(s, 0, 0, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END));
3839 3840
                av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i at %ix%i\n", get_bits_count(&s->gb), v->bits,s->mb_x,s->mb_y);
                return;
3841 3842
            }
        }
3843
        memmove(v->cbp_base, v->cbp, sizeof(v->cbp_base[0])*s->mb_stride);
3844 3845
        ff_draw_horiz_band(s, s->mb_y * 16, 16);
        s->first_slice_line = 0;
3846
    }
3847
    ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END));
3848
}
3849

3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887
static void vc1_decode_b_blocks(VC1Context *v)
{
    MpegEncContext *s = &v->s;

    /* select codingmode used for VLC tables selection */
    switch(v->c_ac_table_index){
    case 0:
        v->codingset = (v->pqindex <= 8) ? CS_HIGH_RATE_INTRA : CS_LOW_MOT_INTRA;
        break;
    case 1:
        v->codingset = CS_HIGH_MOT_INTRA;
        break;
    case 2:
        v->codingset = CS_MID_RATE_INTRA;
        break;
    }

    switch(v->c_ac_table_index){
    case 0:
        v->codingset2 = (v->pqindex <= 8) ? CS_HIGH_RATE_INTER : CS_LOW_MOT_INTER;
        break;
    case 1:
        v->codingset2 = CS_HIGH_MOT_INTER;
        break;
    case 2:
        v->codingset2 = CS_MID_RATE_INTER;
        break;
    }

    s->first_slice_line = 1;
    for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
        for(s->mb_x = 0; s->mb_x < s->mb_width; s->mb_x++) {
            ff_init_block_index(s);
            ff_update_block_index(s);
            s->dsp.clear_blocks(s->block[0]);

            vc1_decode_b_mb(v);
            if(get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) {
3888
                ff_er_add_slice(s, 0, 0, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END));
3889 3890 3891
                av_log(s->avctx, AV_LOG_ERROR, "Bits overconsumption: %i > %i at %ix%i\n", get_bits_count(&s->gb), v->bits,s->mb_x,s->mb_y);
                return;
            }
3892
            if(v->s.loop_filter) vc1_loop_filter_iblk(s, s->current_picture.qscale_table[s->mb_x + s->mb_y *s->mb_stride]);
3893 3894 3895 3896
        }
        ff_draw_horiz_band(s, s->mb_y * 16, 16);
        s->first_slice_line = 0;
    }
3897
    ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END));
3898 3899
}

3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915
static void vc1_decode_skip_blocks(VC1Context *v)
{
    MpegEncContext *s = &v->s;

    ff_er_add_slice(s, 0, 0, s->mb_width - 1, s->mb_height - 1, (AC_END|DC_END|MV_END));
    s->first_slice_line = 1;
    for(s->mb_y = 0; s->mb_y < s->mb_height; s->mb_y++) {
        s->mb_x = 0;
        ff_init_block_index(s);
        ff_update_block_index(s);
        memcpy(s->dest[0], s->last_picture.data[0] + s->mb_y * 16 * s->linesize, s->linesize * 16);
        memcpy(s->dest[1], s->last_picture.data[1] + s->mb_y * 8 * s->uvlinesize, s->uvlinesize * 8);
        memcpy(s->dest[2], s->last_picture.data[2] + s->mb_y * 8 * s->uvlinesize, s->uvlinesize * 8);
        ff_draw_horiz_band(s, s->mb_y * 16, 16);
        s->first_slice_line = 0;
    }
3916
    s->pict_type = FF_P_TYPE;
3917 3918
}

3919
static void vc1_decode_blocks(VC1Context *v)
3920 3921
{

3922
    v->s.esc3_level_length = 0;
3923 3924
    if(v->x8_type){
        ff_intrax8_decode_picture(&v->x8, 2*v->pq+v->halfpq, v->pq*(!v->pquantizer) );
3925
    }else{
A
Fixes:  
anonymous 已提交
3926

M
Michael Niedermayer 已提交
3927
        switch(v->s.pict_type) {
3928
        case FF_I_TYPE:
3929 3930 3931 3932
            if(v->profile == PROFILE_ADVANCED)
                vc1_decode_i_blocks_adv(v);
            else
                vc1_decode_i_blocks(v);
M
Michael Niedermayer 已提交
3933
            break;
3934
        case FF_P_TYPE:
M
Michael Niedermayer 已提交
3935 3936 3937 3938 3939
            if(v->p_frame_skipped)
                vc1_decode_skip_blocks(v);
            else
                vc1_decode_p_blocks(v);
            break;
3940
        case FF_B_TYPE:
M
Michael Niedermayer 已提交
3941 3942 3943 3944 3945 3946 3947 3948 3949
            if(v->bi_type){
                if(v->profile == PROFILE_ADVANCED)
                    vc1_decode_i_blocks_adv(v);
                else
                    vc1_decode_i_blocks(v);
            }else
                vc1_decode_b_blocks(v);
            break;
        }
3950
    }
3951
}
3952

3953 3954 3955
/** Find VC-1 marker in buffer
 * @return position where next marker starts or end of buffer if no marker found
 */
A
const  
Aurelien Jacobs 已提交
3956
static av_always_inline const uint8_t* find_next_marker(const uint8_t *src, const uint8_t *end)
3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968
{
    uint32_t mrk = 0xFFFFFFFF;

    if(end-src < 4) return end;
    while(src < end){
        mrk = (mrk << 8) | *src++;
        if(IS_MARKER(mrk))
            return src-4;
    }
    return end;
}

A
const  
Aurelien Jacobs 已提交
3969
static av_always_inline int vc1_unescape_buffer(const uint8_t *src, int size, uint8_t *dst)
3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986
{
    int dsize = 0, i;

    if(size < 4){
        for(dsize = 0; dsize < size; dsize++) *dst++ = *src++;
        return size;
    }
    for(i = 0; i < size; i++, src++) {
        if(src[0] == 3 && i >= 2 && !src[-1] && !src[-2] && i < size-1 && src[1] < 4) {
            dst[dsize++] = src[1];
            src++;
            i++;
        } else
            dst[dsize++] = *src;
    }
    return dsize;
}
3987

3988 3989
/** Initialize a VC1/WMV3 decoder
 * @todo TODO: Handle VC-1 IDUs (Transport level?)
A
anonymous 已提交
3990 3991
 * @todo TODO: Decypher remaining bits in extra_data
 */
3992
static av_cold int vc1_decode_init(AVCodecContext *avctx)
3993
{
3994
    VC1Context *v = avctx->priv_data;
A
anonymous 已提交
3995
    MpegEncContext *s = &v->s;
3996 3997 3998
    GetBitContext gb;

    if (!avctx->extradata_size || !avctx->extradata) return -1;
K
Kostya Shishkov 已提交
3999 4000 4001 4002
    if (!(avctx->flags & CODEC_FLAG_GRAY))
        avctx->pix_fmt = PIX_FMT_YUV420P;
    else
        avctx->pix_fmt = PIX_FMT_GRAY8;
A
anonymous 已提交
4003
    v->s.avctx = avctx;
4004 4005
    avctx->flags |= CODEC_FLAG_EMU_EDGE;
    v->s.flags |= CODEC_FLAG_EMU_EDGE;
4006

4007 4008 4009 4010
    if(avctx->idct_algo==FF_IDCT_AUTO){
        avctx->idct_algo=FF_IDCT_WMV2;
    }

A
anonymous 已提交
4011 4012
    if(ff_h263_decode_init(avctx) < 0)
        return -1;
4013
    if (vc1_init_common(v) < 0) return -1;
4014

A
Fixes:  
anonymous 已提交
4015 4016
    avctx->coded_width = avctx->width;
    avctx->coded_height = avctx->height;
4017 4018 4019 4020
    if (avctx->codec_id == CODEC_ID_WMV3)
    {
        int count = 0;

A
anonymous 已提交
4021 4022 4023 4024
        // looks like WMV3 has a sequence header stored in the extradata
        // advanced sequence header may be before the first frame
        // the last byte of the extradata is a version number, 1 for the
        // samples we can decode
4025

4026
        init_get_bits(&gb, avctx->extradata, avctx->extradata_size*8);
I
Ivan Kalvachev 已提交
4027

4028 4029
        if (decode_sequence_header(avctx, &gb) < 0)
          return -1;
4030

A
anonymous 已提交
4031 4032 4033 4034 4035 4036
        count = avctx->extradata_size*8 - get_bits_count(&gb);
        if (count>0)
        {
            av_log(avctx, AV_LOG_INFO, "Extra data: %i bits left, value: %X\n",
                   count, get_bits(&gb, count));
        }
4037
        else if (count < 0)
A
anonymous 已提交
4038 4039 4040
        {
            av_log(avctx, AV_LOG_INFO, "Read %i bits in overflow\n", -count);
        }
4041
    } else { // VC1/WVC1
A
const  
Aurelien Jacobs 已提交
4042 4043 4044 4045
        const uint8_t *start = avctx->extradata;
        uint8_t *end = avctx->extradata + avctx->extradata_size;
        const uint8_t *next;
        int size, buf2_size;
4046
        uint8_t *buf2 = NULL;
D
Diego Biurrun 已提交
4047
        int seq_initialized = 0, ep_initialized = 0;
4048 4049

        if(avctx->extradata_size < 16) {
4050
            av_log(avctx, AV_LOG_ERROR, "Extradata size too small: %i\n", avctx->extradata_size);
4051 4052 4053
            return -1;
        }

4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068
        buf2 = av_mallocz(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
        if(start[0]) start++; // in WVC1 extradata first byte is its size
        next = start;
        for(; next < end; start = next){
            next = find_next_marker(start + 4, end);
            size = next - start - 4;
            if(size <= 0) continue;
            buf2_size = vc1_unescape_buffer(start + 4, size, buf2);
            init_get_bits(&gb, buf2, buf2_size * 8);
            switch(AV_RB32(start)){
            case VC1_CODE_SEQHDR:
                if(decode_sequence_header(avctx, &gb) < 0){
                    av_free(buf2);
                    return -1;
                }
D
Diego Biurrun 已提交
4069
                seq_initialized = 1;
4070 4071 4072 4073 4074 4075
                break;
            case VC1_CODE_ENTRYPOINT:
                if(decode_entry_point(avctx, &gb) < 0){
                    av_free(buf2);
                    return -1;
                }
D
Diego Biurrun 已提交
4076
                ep_initialized = 1;
4077 4078 4079
                break;
            }
        }
4080
        av_free(buf2);
D
Diego Biurrun 已提交
4081
        if(!seq_initialized || !ep_initialized){
4082 4083 4084
            av_log(avctx, AV_LOG_ERROR, "Incomplete extradata\n");
            return -1;
        }
4085
    }
A
anonymous 已提交
4086
    avctx->has_b_frames= !!(avctx->max_b_frames);
4087
    s->low_delay = !avctx->has_b_frames;
4088

A
anonymous 已提交
4089 4090
    s->mb_width = (avctx->coded_width+15)>>4;
    s->mb_height = (avctx->coded_height+15)>>4;
4091 4092

    /* Allocate mb bitplanes */
4093
    v->mv_type_mb_plane = av_malloc(s->mb_stride * s->mb_height);
4094
    v->direct_mb_plane = av_malloc(s->mb_stride * s->mb_height);
4095 4096
    v->acpred_plane = av_malloc(s->mb_stride * s->mb_height);
    v->over_flags_plane = av_malloc(s->mb_stride * s->mb_height);
A
Fixes:  
anonymous 已提交
4097

4098 4099 4100
    v->cbp_base = av_malloc(sizeof(v->cbp_base[0]) * 2 * s->mb_stride);
    v->cbp = v->cbp_base + s->mb_stride;

K
Kostya Shishkov 已提交
4101 4102 4103 4104 4105 4106
    /* allocate block type info in that way so it could be used with s->block_index[] */
    v->mb_type_base = av_malloc(s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride * (s->mb_height + 1) * 2);
    v->mb_type[0] = v->mb_type_base + s->b8_stride + 1;
    v->mb_type[1] = v->mb_type_base + s->b8_stride * (s->mb_height * 2 + 1) + s->mb_stride + 1;
    v->mb_type[2] = v->mb_type[1] + s->mb_stride * (s->mb_height + 1);

4107
    /* Init coded blocks info */
4108
    if (v->profile == PROFILE_ADVANCED)
4109
    {
4110 4111 4112 4113
//        if (alloc_bitplane(&v->over_flags_plane, s->mb_width, s->mb_height) < 0)
//            return -1;
//        if (alloc_bitplane(&v->ac_pred_plane, s->mb_width, s->mb_height) < 0)
//            return -1;
4114 4115
    }

4116
    ff_intrax8_common_init(&v->x8,s);
4117
    return 0;
4118 4119
}

4120

4121 4122
/** Decode a VC1/WMV3 frame
 * @todo TODO: Handle VC-1 IDUs (Transport level?)
A
anonymous 已提交
4123
 */
4124
static int vc1_decode_frame(AVCodecContext *avctx,
4125
                            void *data, int *data_size,
M
Michael Niedermayer 已提交
4126
                            const uint8_t *buf, int buf_size)
4127
{
4128
    VC1Context *v = avctx->priv_data;
A
anonymous 已提交
4129
    MpegEncContext *s = &v->s;
4130
    AVFrame *pict = data;
4131
    uint8_t *buf2 = NULL;
A
anonymous 已提交
4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145

    /* no supplementary picture */
    if (buf_size == 0) {
        /* special case for last picture */
        if (s->low_delay==0 && s->next_picture_ptr) {
            *pict= *(AVFrame*)s->next_picture_ptr;
            s->next_picture_ptr= NULL;

            *data_size = sizeof(AVFrame);
        }

        return 0;
    }

D
Diego Biurrun 已提交
4146
    /* We need to set current_picture_ptr before reading the header,
K
Typo  
Kostya Shishkov 已提交
4147
     * otherwise we cannot store anything in there. */
A
anonymous 已提交
4148
    if(s->current_picture_ptr==NULL || s->current_picture_ptr->data[0]){
4149 4150
        int i= ff_find_unused_picture(s, 0);
        s->current_picture_ptr= &s->picture[i];
A
anonymous 已提交
4151 4152
    }

4153
    //for advanced profile we may need to parse and unescape data
4154
    if (avctx->codec_id == CODEC_ID_VC1) {
4155 4156 4157 4158
        int buf_size2 = 0;
        buf2 = av_mallocz(buf_size + FF_INPUT_BUFFER_PADDING_SIZE);

        if(IS_MARKER(AV_RB32(buf))){ /* frame starts with marker and needs to be parsed */
M
Michael Niedermayer 已提交
4159
            const uint8_t *start, *end, *next;
4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182
            int size;

            next = buf;
            for(start = buf, end = buf + buf_size; next < end; start = next){
                next = find_next_marker(start + 4, end);
                size = next - start - 4;
                if(size <= 0) continue;
                switch(AV_RB32(start)){
                case VC1_CODE_FRAME:
                    buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
                    break;
                case VC1_CODE_ENTRYPOINT: /* it should be before frame data */
                    buf_size2 = vc1_unescape_buffer(start + 4, size, buf2);
                    init_get_bits(&s->gb, buf2, buf_size2*8);
                    decode_entry_point(avctx, &s->gb);
                    break;
                case VC1_CODE_SLICE:
                    av_log(avctx, AV_LOG_ERROR, "Sliced decoding is not implemented (yet)\n");
                    av_free(buf2);
                    return -1;
                }
            }
        }else if(v->interlace && ((buf[0] & 0xC0) == 0xC0)){ /* WVC1 interlaced stores both fields divided by marker */
A
const  
Aurelien Jacobs 已提交
4183
            const uint8_t *divider;
4184 4185 4186 4187

            divider = find_next_marker(buf, buf + buf_size);
            if((divider == (buf + buf_size)) || AV_RB32(divider) != VC1_CODE_FIELD){
                av_log(avctx, AV_LOG_ERROR, "Error in WVC1 interlaced frame\n");
4188
                av_free(buf2);
4189 4190 4191 4192 4193 4194 4195 4196
                return -1;
            }

            buf_size2 = vc1_unescape_buffer(buf, divider - buf, buf2);
            // TODO
            av_free(buf2);return -1;
        }else{
            buf_size2 = vc1_unescape_buffer(buf, buf_size, buf2);
4197 4198 4199 4200
        }
        init_get_bits(&s->gb, buf2, buf_size2*8);
    } else
        init_get_bits(&s->gb, buf, buf_size*8);
4201
    // do parse frame header
4202 4203
    if(v->profile < PROFILE_ADVANCED) {
        if(vc1_parse_frame_header(v, &s->gb) == -1) {
4204
            av_free(buf2);
4205 4206 4207 4208
            return -1;
        }
    } else {
        if(vc1_parse_frame_header_adv(v, &s->gb) == -1) {
4209
            av_free(buf2);
4210 4211 4212
            return -1;
        }
    }
4213

4214
    if(s->pict_type != FF_I_TYPE && !v->res_rtm_flag){
4215
        av_free(buf2);
4216 4217
        return -1;
    }
A
anonymous 已提交
4218 4219 4220

    // for hurry_up==5
    s->current_picture.pict_type= s->pict_type;
4221
    s->current_picture.key_frame= s->pict_type == FF_I_TYPE;
A
anonymous 已提交
4222

4223
    /* skip B-frames if we don't have reference frames */
4224
    if(s->last_picture_ptr==NULL && (s->pict_type==FF_B_TYPE || s->dropable)){
4225
        av_free(buf2);
4226 4227
        return -1;//buf_size;
    }
A
anonymous 已提交
4228
    /* skip b frames if we are in a hurry */
4229 4230 4231
    if(avctx->hurry_up && s->pict_type==FF_B_TYPE) return -1;//buf_size;
    if(   (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type==FF_B_TYPE)
       || (avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type!=FF_I_TYPE)
4232
       ||  avctx->skip_frame >= AVDISCARD_ALL) {
4233
        av_free(buf2);
4234
        return buf_size;
4235
    }
A
anonymous 已提交
4236
    /* skip everything if we are in a hurry>=5 */
4237
    if(avctx->hurry_up>=5) {
4238
        av_free(buf2);
4239 4240
        return -1;//buf_size;
    }
I
Ivan Kalvachev 已提交
4241

A
anonymous 已提交
4242
    if(s->next_p_frame_damaged){
4243
        if(s->pict_type==FF_B_TYPE)
4244
            return buf_size;
A
anonymous 已提交
4245 4246 4247 4248
        else
            s->next_p_frame_damaged=0;
    }

4249
    if(MPV_frame_start(s, avctx) < 0) {
4250
        av_free(buf2);
A
anonymous 已提交
4251
        return -1;
4252
    }
A
anonymous 已提交
4253

4254 4255 4256
    s->me.qpel_put= s->dsp.put_qpel_pixels_tab;
    s->me.qpel_avg= s->dsp.avg_qpel_pixels_tab;

A
anonymous 已提交
4257 4258
    ff_er_frame_start(s);

4259 4260 4261 4262 4263
    v->bits = buf_size * 8;
    vc1_decode_blocks(v);
//av_log(s->avctx, AV_LOG_INFO, "Consumed %i/%i bits\n", get_bits_count(&s->gb), buf_size*8);
//  if(get_bits_count(&s->gb) > buf_size * 8)
//      return -1;
A
anonymous 已提交
4264 4265 4266 4267
    ff_er_frame_end(s);

    MPV_frame_end(s);

4268 4269
assert(s->current_picture.pict_type == s->current_picture_ptr->pict_type);
assert(s->current_picture.pict_type == s->pict_type);
4270
    if (s->pict_type == FF_B_TYPE || s->low_delay) {
4271 4272 4273 4274 4275 4276 4277
        *pict= *(AVFrame*)s->current_picture_ptr;
    } else if (s->last_picture_ptr != NULL) {
        *pict= *(AVFrame*)s->last_picture_ptr;
    }

    if(s->last_picture_ptr || s->low_delay){
        *data_size = sizeof(AVFrame);
A
anonymous 已提交
4278 4279 4280 4281
        ff_print_debug_info(s, pict);
    }

    /* Return the Picture timestamp as the frame number */
4282
    /* we subtract 1 because it is added on utils.c     */
A
anonymous 已提交
4283 4284
    avctx->frame_number = s->picture_number - 1;

4285
    av_free(buf2);
4286
    return buf_size;
4287 4288
}

4289

4290
/** Close a VC1/WMV3 decoder
A
anonymous 已提交
4291 4292
 * @warning Initial try at using MpegEncContext stuff
 */
4293
static av_cold int vc1_decode_end(AVCodecContext *avctx)
4294
{
4295
    VC1Context *v = avctx->priv_data;
4296

4297 4298
    av_freep(&v->hrd_rate);
    av_freep(&v->hrd_buffer);
A
anonymous 已提交
4299
    MPV_common_end(&v->s);
4300
    av_freep(&v->mv_type_mb_plane);
4301
    av_freep(&v->direct_mb_plane);
4302 4303
    av_freep(&v->acpred_plane);
    av_freep(&v->over_flags_plane);
K
Kostya Shishkov 已提交
4304
    av_freep(&v->mb_type_base);
4305
    av_freep(&v->cbp_base);
4306
    ff_intrax8_common_end(&v->x8);
4307 4308 4309
    return 0;
}

4310

4311 4312
AVCodec vc1_decoder = {
    "vc1",
4313
    CODEC_TYPE_VIDEO,
4314 4315 4316
    CODEC_ID_VC1,
    sizeof(VC1Context),
    vc1_decode_init,
4317
    NULL,
4318 4319
    vc1_decode_end,
    vc1_decode_frame,
4320
    CODEC_CAP_DELAY,
4321
    NULL,
4322
    .long_name = NULL_IF_CONFIG_SMALL("SMPTE VC-1"),
4323 4324 4325 4326 4327 4328
};

AVCodec wmv3_decoder = {
    "wmv3",
    CODEC_TYPE_VIDEO,
    CODEC_ID_WMV3,
4329 4330
    sizeof(VC1Context),
    vc1_decode_init,
4331
    NULL,
4332 4333
    vc1_decode_end,
    vc1_decode_frame,
4334
    CODEC_CAP_DELAY,
4335
    NULL,
4336
    .long_name = NULL_IF_CONFIG_SMALL("Windows Media Video 9"),
4337
};