vp3.c 94.3 KB
Newer Older
1
/*
2
 * Copyright (C) 2003-2004 the ffmpeg project
3
 *
4 5 6
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
7 8
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
9
 * version 2.1 of the License, or (at your option) any later version.
10
 *
11
 * FFmpeg is distributed in the hope that it will be useful,
12 13 14 15 16
 * 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
17
 * License along with FFmpeg; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 20 21 22 23
 */

/**
 * @file vp3.c
 * On2 VP3 Video Decoder
24 25 26
 *
 * VP3 Video Decoder by Mike Melanson (mike at multimedia.cx)
 * For more information about the VP3 coding process, visit:
27
 *   http://wiki.multimedia.cx/index.php?title=On2_VP3
28 29
 *
 * Theora decoder by Alex Beregszaszi
30 31 32 33 34 35 36 37 38
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include "avcodec.h"
#include "dsputil.h"
39
#include "bitstream.h"
40 41

#include "vp3data.h"
42
#include "xiph.h"
43 44 45

#define FRAGMENT_PIXELS 8

46
/*
47
 * Debugging Variables
48
 *
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
 * Define one or more of the following compile-time variables to 1 to obtain
 * elaborate information about certain aspects of the decoding process.
 *
 * DEBUG_VP3: high-level decoding flow
 * DEBUG_INIT: initialization parameters
 * DEBUG_DEQUANTIZERS: display how the dequanization tables are built
 * DEBUG_BLOCK_CODING: unpacking the superblock/macroblock/fragment coding
 * DEBUG_MODES: unpacking the coding modes for individual fragments
 * DEBUG_VECTORS: display the motion vectors
 * DEBUG_TOKEN: display exhaustive information about each DCT token
 * DEBUG_VLC: display the VLCs as they are extracted from the stream
 * DEBUG_DC_PRED: display the process of reversing DC prediction
 * DEBUG_IDCT: show every detail of the IDCT process
 */

A
Alex Beregszaszi 已提交
64
#define DEBUG_VP3 0
65 66 67 68 69 70 71 72 73 74 75
#define DEBUG_INIT 0
#define DEBUG_DEQUANTIZERS 0
#define DEBUG_BLOCK_CODING 0
#define DEBUG_MODES 0
#define DEBUG_VECTORS 0
#define DEBUG_TOKEN 0
#define DEBUG_VLC 0
#define DEBUG_DC_PRED 0
#define DEBUG_IDCT 0

#if DEBUG_VP3
A
Alex Beregszaszi 已提交
76
#define debug_vp3(args...) av_log(NULL, AV_LOG_DEBUG, ## args)
77 78 79 80 81
#else
static inline void debug_vp3(const char *format, ...) { }
#endif

#if DEBUG_INIT
A
Alex Beregszaszi 已提交
82
#define debug_init(args...) av_log(NULL, AV_LOG_DEBUG, ## args)
83 84 85 86 87
#else
static inline void debug_init(const char *format, ...) { }
#endif

#if DEBUG_DEQUANTIZERS
A
Alex Beregszaszi 已提交
88
#define debug_dequantizers(args...) av_log(NULL, AV_LOG_DEBUG, ## args)
89
#else
90
static inline void debug_dequantizers(const char *format, ...) { }
91 92 93
#endif

#if DEBUG_BLOCK_CODING
A
Alex Beregszaszi 已提交
94
#define debug_block_coding(args...) av_log(NULL, AV_LOG_DEBUG, ## args)
95
#else
96
static inline void debug_block_coding(const char *format, ...) { }
97 98 99
#endif

#if DEBUG_MODES
100
#define debug_modes(args...) av_log(NULL, AV_LOG_DEBUG, ## args)
101
#else
102
static inline void debug_modes(const char *format, ...) { }
103 104 105
#endif

#if DEBUG_VECTORS
A
Alex Beregszaszi 已提交
106
#define debug_vectors(args...) av_log(NULL, AV_LOG_DEBUG, ## args)
107
#else
108
static inline void debug_vectors(const char *format, ...) { }
109 110
#endif

111
#if DEBUG_TOKEN
A
Alex Beregszaszi 已提交
112
#define debug_token(args...) av_log(NULL, AV_LOG_DEBUG, ## args)
113
#else
114
static inline void debug_token(const char *format, ...) { }
115 116 117
#endif

#if DEBUG_VLC
A
Alex Beregszaszi 已提交
118
#define debug_vlc(args...) av_log(NULL, AV_LOG_DEBUG, ## args)
119
#else
120
static inline void debug_vlc(const char *format, ...) { }
121 122 123
#endif

#if DEBUG_DC_PRED
A
Alex Beregszaszi 已提交
124
#define debug_dc_pred(args...) av_log(NULL, AV_LOG_DEBUG, ## args)
125
#else
126
static inline void debug_dc_pred(const char *format, ...) { }
127 128 129
#endif

#if DEBUG_IDCT
A
Alex Beregszaszi 已提交
130
#define debug_idct(args...) av_log(NULL, AV_LOG_DEBUG, ## args)
131
#else
132
static inline void debug_idct(const char *format, ...) { }
133 134
#endif

135 136 137 138 139 140 141
typedef struct Coeff {
    struct Coeff *next;
    DCTELEM coeff;
    uint8_t index;
} Coeff;

//FIXME split things out into their own arrays
142
typedef struct Vp3Fragment {
143
    Coeff *next_coeff;
144 145 146 147
    /* address of first pixel taking into account which plane the fragment
     * lives on as well as the plane stride */
    int first_pixel;
    /* this is the macroblock that the fragment belongs to */
148 149 150 151
    uint16_t macroblock;
    uint8_t coding_method;
    int8_t motion_x;
    int8_t motion_y;
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
} Vp3Fragment;

#define SB_NOT_CODED        0
#define SB_PARTIALLY_CODED  1
#define SB_FULLY_CODED      2

#define MODE_INTER_NO_MV      0
#define MODE_INTRA            1
#define MODE_INTER_PLUS_MV    2
#define MODE_INTER_LAST_MV    3
#define MODE_INTER_PRIOR_LAST 4
#define MODE_USING_GOLDEN     5
#define MODE_GOLDEN_MV        6
#define MODE_INTER_FOURMV     7
#define CODING_MODE_COUNT     8

/* special internal mode */
#define MODE_COPY             8

/* There are 6 preset schemes, plus a free-form scheme */
172
static const int ModeAlphabet[6][CODING_MODE_COUNT] =
173 174
{
    /* scheme 1: Last motion vector dominates */
175
    {    MODE_INTER_LAST_MV,    MODE_INTER_PRIOR_LAST,
176
         MODE_INTER_PLUS_MV,    MODE_INTER_NO_MV,
177
         MODE_INTRA,            MODE_USING_GOLDEN,
178 179 180
         MODE_GOLDEN_MV,        MODE_INTER_FOURMV },

    /* scheme 2 */
181
    {    MODE_INTER_LAST_MV,    MODE_INTER_PRIOR_LAST,
182
         MODE_INTER_NO_MV,      MODE_INTER_PLUS_MV,
183
         MODE_INTRA,            MODE_USING_GOLDEN,
184 185 186
         MODE_GOLDEN_MV,        MODE_INTER_FOURMV },

    /* scheme 3 */
187
    {    MODE_INTER_LAST_MV,    MODE_INTER_PLUS_MV,
188
         MODE_INTER_PRIOR_LAST, MODE_INTER_NO_MV,
189
         MODE_INTRA,            MODE_USING_GOLDEN,
190 191 192
         MODE_GOLDEN_MV,        MODE_INTER_FOURMV },

    /* scheme 4 */
193
    {    MODE_INTER_LAST_MV,    MODE_INTER_PLUS_MV,
194
         MODE_INTER_NO_MV,      MODE_INTER_PRIOR_LAST,
195
         MODE_INTRA,            MODE_USING_GOLDEN,
196 197 198
         MODE_GOLDEN_MV,        MODE_INTER_FOURMV },

    /* scheme 5: No motion vector dominates */
199
    {    MODE_INTER_NO_MV,      MODE_INTER_LAST_MV,
200
         MODE_INTER_PRIOR_LAST, MODE_INTER_PLUS_MV,
201
         MODE_INTRA,            MODE_USING_GOLDEN,
202 203 204
         MODE_GOLDEN_MV,        MODE_INTER_FOURMV },

    /* scheme 6 */
205
    {    MODE_INTER_NO_MV,      MODE_USING_GOLDEN,
206
         MODE_INTER_LAST_MV,    MODE_INTER_PRIOR_LAST,
207
         MODE_INTER_PLUS_MV,    MODE_INTRA,
208 209 210 211 212 213 214 215
         MODE_GOLDEN_MV,        MODE_INTER_FOURMV },

};

#define MIN_DEQUANT_VAL 2

typedef struct Vp3DecodeContext {
    AVCodecContext *avctx;
216
    int theora, theora_tables;
A
Alex Beregszaszi 已提交
217
    int version;
218 219 220 221 222 223
    int width, height;
    AVFrame golden_frame;
    AVFrame last_frame;
    AVFrame current_frame;
    int keyframe;
    DSPContext dsp;
224
    int flipped_image;
225

226 227
    int qis[3];
    int nqis;
228 229 230 231 232 233
    int quality_index;
    int last_quality_index;

    int superblock_count;
    int superblock_width;
    int superblock_height;
234 235 236 237
    int y_superblock_width;
    int y_superblock_height;
    int c_superblock_width;
    int c_superblock_height;
238 239 240 241 242 243 244 245 246 247 248 249 250
    int u_superblock_start;
    int v_superblock_start;
    unsigned char *superblock_coding;

    int macroblock_count;
    int macroblock_width;
    int macroblock_height;

    int fragment_count;
    int fragment_width;
    int fragment_height;

    Vp3Fragment *all_fragments;
251
    uint8_t *coeff_counts;
252 253
    Coeff *coeffs;
    Coeff *next_coeff;
M
Michael Niedermayer 已提交
254
    int fragment_start[3];
255

M
Michael Niedermayer 已提交
256
    ScanTable scantable;
257

258 259
    /* tables */
    uint16_t coded_dc_scale_factor[64];
260
    uint32_t coded_ac_scale_factor[64];
261 262 263 264
    uint8_t base_matrix[384][64];
    uint8_t qr_count[2][3];
    uint8_t qr_size [2][3][64];
    uint16_t qr_base[2][3][64];
265

266
    /* this is a list of indexes into the all_fragments array indicating
267 268 269
     * which of the fragments are coded */
    int *coded_fragment_list;
    int coded_fragment_list_index;
D
Diego Biurrun 已提交
270
    int pixel_addresses_initialized;
271 272 273 274 275 276 277

    VLC dc_vlc[16];
    VLC ac_vlc_1[16];
    VLC ac_vlc_2[16];
    VLC ac_vlc_3[16];
    VLC ac_vlc_4[16];

278 279 280 281 282
    VLC superblock_run_length_vlc;
    VLC fragment_run_length_vlc;
    VLC mode_code_vlc;
    VLC motion_vector_vlc;

283 284
    /* these arrays need to be on 16-byte boundaries since SSE2 operations
     * index into them */
285
    DECLARE_ALIGNED_16(int16_t, qmat[2][4][64]);        //<qmat[is_inter][plane]
286 287

    /* This table contains superblock_count * 16 entries. Each set of 16
288
     * numbers corresponds to the fragment indexes 0..15 of the superblock.
289 290 291 292 293
     * An entry will be -1 to indicate that no entry corresponds to that
     * index. */
    int *superblock_fragments;

    /* This table contains superblock_count * 4 entries. Each set of 4
294
     * numbers corresponds to the macroblock indexes 0..3 of the superblock.
295 296 297 298 299
     * An entry will be -1 to indicate that no entry corresponds to that
     * index. */
    int *superblock_macroblocks;

    /* This table contains macroblock_count * 6 entries. Each set of 6
300
     * numbers corresponds to the fragment indexes 0..5 which comprise
301 302
     * the macroblock (4 Y fragments and 2 C fragments). */
    int *macroblock_fragments;
303
    /* This is an array that indicates how a particular macroblock
304
     * is coded. */
305
    unsigned char *macroblock_coding;
306

307 308 309 310 311
    int first_coded_y_fragment;
    int first_coded_c_fragment;
    int last_coded_y_fragment;
    int last_coded_c_fragment;

M
Michael Niedermayer 已提交
312
    uint8_t edge_emu_buffer[9*2048]; //FIXME dynamic alloc
M
Måns Rullgård 已提交
313
    int8_t qscale_table[2048]; //FIXME dynamic alloc (width+15)/16
314

315 316 317 318 319 320 321 322 323
    /* Huffman decode */
    int hti;
    unsigned int hbits;
    int entries;
    int huff_code_size;
    uint16_t huffman_table[80][32][2];

    uint32_t filter_limit_values[64];
    int bounding_values_array[256];
324 325 326 327 328 329 330 331 332 333
} Vp3DecodeContext;

/************************************************************************
 * VP3 specific functions
 ************************************************************************/

/*
 * This function sets up all of the various blocks mappings:
 * superblocks <-> fragments, macroblocks <-> fragments,
 * superblocks <-> macroblocks
334 335
 *
 * Returns 0 is successful; returns 1 if *anything* went wrong.
336
 */
337
static int init_block_mapping(Vp3DecodeContext *s)
338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354
{
    int i, j;
    signed int hilbert_walk_mb[4];

    int current_fragment = 0;
    int current_width = 0;
    int current_height = 0;
    int right_edge = 0;
    int bottom_edge = 0;
    int superblock_row_inc = 0;
    int *hilbert = NULL;
    int mapping_index = 0;

    int current_macroblock;
    int c_fragment;

    signed char travel_width[16] = {
355
         1,  1,  0, -1,
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 391 392 393
         0,  0,  1,  0,
         1,  0,  1,  0,
         0, -1,  0,  1
    };

    signed char travel_height[16] = {
         0,  0,  1,  0,
         1,  1,  0, -1,
         0,  1,  0, -1,
        -1,  0, -1,  0
    };

    signed char travel_width_mb[4] = {
         1,  0,  1,  0
    };

    signed char travel_height_mb[4] = {
         0,  1,  0, -1
    };

    debug_vp3("  vp3: initialize block mapping tables\n");

    hilbert_walk_mb[0] = 1;
    hilbert_walk_mb[1] = s->macroblock_width;
    hilbert_walk_mb[2] = 1;
    hilbert_walk_mb[3] = -s->macroblock_width;

    /* iterate through each superblock (all planes) and map the fragments */
    for (i = 0; i < s->superblock_count; i++) {
        debug_init("    superblock %d (u starts @ %d, v starts @ %d)\n",
            i, s->u_superblock_start, s->v_superblock_start);

        /* time to re-assign the limits? */
        if (i == 0) {

            /* start of Y superblocks */
            right_edge = s->fragment_width;
            bottom_edge = s->fragment_height;
394
            current_width = -1;
395
            current_height = 0;
396
            superblock_row_inc = 3 * s->fragment_width -
397
                (s->y_superblock_width * 4 - s->fragment_width);
398 399 400 401 402 403 404 405 406

            /* the first operation for this variable is to advance by 1 */
            current_fragment = -1;

        } else if (i == s->u_superblock_start) {

            /* start of U superblocks */
            right_edge = s->fragment_width / 2;
            bottom_edge = s->fragment_height / 2;
407
            current_width = -1;
408
            current_height = 0;
409
            superblock_row_inc = 3 * (s->fragment_width / 2) -
410
                (s->c_superblock_width * 4 - s->fragment_width / 2);
411 412

            /* the first operation for this variable is to advance by 1 */
M
Michael Niedermayer 已提交
413
            current_fragment = s->fragment_start[1] - 1;
414 415 416 417 418 419

        } else if (i == s->v_superblock_start) {

            /* start of V superblocks */
            right_edge = s->fragment_width / 2;
            bottom_edge = s->fragment_height / 2;
420
            current_width = -1;
421
            current_height = 0;
422
            superblock_row_inc = 3 * (s->fragment_width / 2) -
423
                (s->c_superblock_width * 4 - s->fragment_width / 2);
424 425

            /* the first operation for this variable is to advance by 1 */
M
Michael Niedermayer 已提交
426
            current_fragment = s->fragment_start[2] - 1;
427 428 429

        }

430
        if (current_width >= right_edge - 1) {
431
            /* reset width and move to next superblock row */
432
            current_width = -1;
433 434 435 436 437 438 439 440
            current_height += 4;

            /* fragment is now at the start of a new superblock row */
            current_fragment += superblock_row_inc;
        }

        /* iterate through all 16 fragments in a superblock */
        for (j = 0; j < 16; j++) {
M
Michael Niedermayer 已提交
441
            current_fragment += travel_width[j] + right_edge * travel_height[j];
442
            current_width += travel_width[j];
443 444 445
            current_height += travel_height[j];

            /* check if the fragment is in bounds */
446
            if ((current_width < right_edge) &&
447 448
                (current_height < bottom_edge)) {
                s->superblock_fragments[mapping_index] = current_fragment;
449
                debug_init("    mapping fragment %d to superblock %d, position %d (%d/%d x %d/%d)\n",
450 451
                    s->superblock_fragments[mapping_index], i, j,
                    current_width, right_edge, current_height, bottom_edge);
452 453
            } else {
                s->superblock_fragments[mapping_index] = -1;
454
                debug_init("    superblock %d, position %d has no fragment (%d/%d x %d/%d)\n",
455 456
                    i, j,
                    current_width, right_edge, current_height, bottom_edge);
457 458 459 460 461 462 463 464 465 466
            }

            mapping_index++;
        }
    }

    /* initialize the superblock <-> macroblock mapping; iterate through
     * all of the Y plane superblocks to build this mapping */
    right_edge = s->macroblock_width;
    bottom_edge = s->macroblock_height;
467
    current_width = -1;
468
    current_height = 0;
469
    superblock_row_inc = s->macroblock_width -
M
Fix ;;  
Michael Niedermayer 已提交
470
        (s->y_superblock_width * 2 - s->macroblock_width);
471 472 473 474 475
    hilbert = hilbert_walk_mb;
    mapping_index = 0;
    current_macroblock = -1;
    for (i = 0; i < s->u_superblock_start; i++) {

476
        if (current_width >= right_edge - 1) {
477
            /* reset width and move to next superblock row */
478
            current_width = -1;
479 480 481 482 483 484 485 486 487
            current_height += 2;

            /* macroblock is now at the start of a new superblock row */
            current_macroblock += superblock_row_inc;
        }

        /* iterate through each potential macroblock in the superblock */
        for (j = 0; j < 4; j++) {
            current_macroblock += hilbert_walk_mb[j];
488
            current_width += travel_width_mb[j];
489 490 491
            current_height += travel_height_mb[j];

            /* check if the macroblock is in bounds */
492
            if ((current_width < right_edge) &&
493 494
                (current_height < bottom_edge)) {
                s->superblock_macroblocks[mapping_index] = current_macroblock;
495 496 497
                debug_init("    mapping macroblock %d to superblock %d, position %d (%d/%d x %d/%d)\n",
                    s->superblock_macroblocks[mapping_index], i, j,
                    current_width, right_edge, current_height, bottom_edge);
498 499
            } else {
                s->superblock_macroblocks[mapping_index] = -1;
500 501 502
                debug_init("    superblock %d, position %d has no macroblock (%d/%d x %d/%d)\n",
                    i, j,
                    current_width, right_edge, current_height, bottom_edge);
503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529
            }

            mapping_index++;
        }
    }

    /* initialize the macroblock <-> fragment mapping */
    current_fragment = 0;
    current_macroblock = 0;
    mapping_index = 0;
    for (i = 0; i < s->fragment_height; i += 2) {

        for (j = 0; j < s->fragment_width; j += 2) {

            debug_init("    macroblock %d contains fragments: ", current_macroblock);
            s->all_fragments[current_fragment].macroblock = current_macroblock;
            s->macroblock_fragments[mapping_index++] = current_fragment;
            debug_init("%d ", current_fragment);

            if (j + 1 < s->fragment_width) {
                s->all_fragments[current_fragment + 1].macroblock = current_macroblock;
                s->macroblock_fragments[mapping_index++] = current_fragment + 1;
                debug_init("%d ", current_fragment + 1);
            } else
                s->macroblock_fragments[mapping_index++] = -1;

            if (i + 1 < s->fragment_height) {
530
                s->all_fragments[current_fragment + s->fragment_width].macroblock =
531
                    current_macroblock;
532
                s->macroblock_fragments[mapping_index++] =
533 534 535 536 537 538
                    current_fragment + s->fragment_width;
                debug_init("%d ", current_fragment + s->fragment_width);
            } else
                s->macroblock_fragments[mapping_index++] = -1;

            if ((j + 1 < s->fragment_width) && (i + 1 < s->fragment_height)) {
539
                s->all_fragments[current_fragment + s->fragment_width + 1].macroblock =
540
                    current_macroblock;
541
                s->macroblock_fragments[mapping_index++] =
542 543 544 545 546 547
                    current_fragment + s->fragment_width + 1;
                debug_init("%d ", current_fragment + s->fragment_width + 1);
            } else
                s->macroblock_fragments[mapping_index++] = -1;

            /* C planes */
M
Michael Niedermayer 已提交
548
            c_fragment = s->fragment_start[1] +
549
                (i * s->fragment_width / 4) + (j / 2);
550
            s->all_fragments[c_fragment].macroblock = s->macroblock_count;
551 552 553
            s->macroblock_fragments[mapping_index++] = c_fragment;
            debug_init("%d ", c_fragment);

M
Michael Niedermayer 已提交
554
            c_fragment = s->fragment_start[2] +
555
                (i * s->fragment_width / 4) + (j / 2);
556
            s->all_fragments[c_fragment].macroblock = s->macroblock_count;
557 558 559 560 561 562 563
            s->macroblock_fragments[mapping_index++] = c_fragment;
            debug_init("%d ", c_fragment);

            debug_init("\n");

            if (j + 2 <= s->fragment_width)
                current_fragment += 2;
564
            else
565 566 567 568 569 570
                current_fragment++;
            current_macroblock++;
        }

        current_fragment += s->fragment_width;
    }
571 572

    return 0;  /* successful path out */
573 574 575 576 577 578 579 580 581 582 583 584
}

/*
 * This function wipes out all of the fragment data.
 */
static void init_frame(Vp3DecodeContext *s, GetBitContext *gb)
{
    int i;

    /* zero out all of the fragment information */
    s->coded_fragment_list_index = 0;
    for (i = 0; i < s->fragment_count; i++) {
585
        s->coeff_counts[i] = 0;
586 587 588
        s->all_fragments[i].motion_x = 127;
        s->all_fragments[i].motion_y = 127;
        s->all_fragments[i].next_coeff= NULL;
589 590 591
        s->coeffs[i].index=
        s->coeffs[i].coeff=0;
        s->coeffs[i].next= NULL;
592 593 594 595
    }
}

/*
596
 * This function sets up the dequantization tables used for a particular
597 598 599 600
 * frame.
 */
static void init_dequantizer(Vp3DecodeContext *s)
{
601
    int ac_scale_factor = s->coded_ac_scale_factor[s->quality_index];
602
    int dc_scale_factor = s->coded_dc_scale_factor[s->quality_index];
603
    int i, plane, inter, qri, bmi, bmj, qistart;
604 605 606

    debug_vp3("  vp3: initializing dequantization tables\n");

607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623
    for(inter=0; inter<2; inter++){
        for(plane=0; plane<3; plane++){
            int sum=0;
            for(qri=0; qri<s->qr_count[inter][plane]; qri++){
                sum+= s->qr_size[inter][plane][qri];
                if(s->quality_index <= sum)
                    break;
            }
            qistart= sum - s->qr_size[inter][plane][qri];
            bmi= s->qr_base[inter][plane][qri  ];
            bmj= s->qr_base[inter][plane][qri+1];
            for(i=0; i<64; i++){
                int coeff= (  2*(sum    -s->quality_index)*s->base_matrix[bmi][i]
                            - 2*(qistart-s->quality_index)*s->base_matrix[bmj][i]
                            + s->qr_size[inter][plane][qri])
                           / (2*s->qr_size[inter][plane][qri]);

M
Michael Niedermayer 已提交
624
                int qmin= 8<<(inter + !i);
625 626
                int qscale= i ? ac_scale_factor : dc_scale_factor;

627
                s->qmat[inter][plane][s->dsp.idct_permutation[i]]= av_clip((qscale * coeff)/100 * 4, qmin, 4096);
628 629
            }
        }
630
    }
631

632
    memset(s->qscale_table, (FFMAX(s->qmat[0][0][1], s->qmat[0][1][1])+8)/16, 512); //FIXME finetune
633 634
}

635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656
/*
 * This function initializes the loop filter boundary limits if the frame's
 * quality index is different from the previous frame's.
 */
static void init_loop_filter(Vp3DecodeContext *s)
{
    int *bounding_values= s->bounding_values_array+127;
    int filter_limit;
    int x;

    filter_limit = s->filter_limit_values[s->quality_index];

    /* set up the bounding values */
    memset(s->bounding_values_array, 0, 256 * sizeof(int));
    for (x = 0; x < filter_limit; x++) {
        bounding_values[-x - filter_limit] = -filter_limit + x;
        bounding_values[-x] = -x;
        bounding_values[x] = x;
        bounding_values[x + filter_limit] = filter_limit - x;
    }
}

657
/*
658
 * This function unpacks all of the superblock/macroblock/fragment coding
659 660
 * information from the bitstream.
 */
661
static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
662 663 664 665 666 667
{
    int bit = 0;
    int current_superblock = 0;
    int current_run = 0;
    int decode_fully_flags = 0;
    int decode_partial_blocks = 0;
668
    int first_c_fragment_seen;
669 670 671 672 673 674 675 676 677 678 679 680 681 682

    int i, j;
    int current_fragment;

    debug_vp3("  vp3: unpacking superblock coding\n");

    if (s->keyframe) {

        debug_vp3("    keyframe-- all superblocks are fully coded\n");
        memset(s->superblock_coding, SB_FULLY_CODED, s->superblock_count);

    } else {

        /* unpack the list of partially-coded superblocks */
683
        bit = get_bits1(gb);
684
        /* toggle the bit because as soon as the first run length is
685 686 687
         * fetched the bit will be toggled again */
        bit ^= 1;
        while (current_superblock < s->superblock_count) {
688
            if (current_run-- == 0) {
689
                bit ^= 1;
690
                current_run = get_vlc2(gb,
691 692
                    s->superblock_run_length_vlc.table, 6, 2);
                if (current_run == 33)
693
                    current_run += get_bits(gb, 12);
694 695 696 697 698 699 700
                debug_block_coding("      setting superblocks %d..%d to %s\n",
                    current_superblock,
                    current_superblock + current_run - 1,
                    (bit) ? "partially coded" : "not coded");

                /* if any of the superblocks are not partially coded, flag
                 * a boolean to decode the list of fully-coded superblocks */
701
                if (bit == 0) {
702
                    decode_fully_flags = 1;
703
                } else {
704

705 706 707 708
                    /* make a note of the fact that there are partially coded
                     * superblocks */
                    decode_partial_blocks = 1;
                }
709
            }
710
            s->superblock_coding[current_superblock++] = bit;
711 712 713 714 715 716 717 718
        }

        /* unpack the list of fully coded superblocks if any of the blocks were
         * not marked as partially coded in the previous step */
        if (decode_fully_flags) {

            current_superblock = 0;
            current_run = 0;
719
            bit = get_bits1(gb);
720
            /* toggle the bit because as soon as the first run length is
721 722 723 724 725 726 727
             * fetched the bit will be toggled again */
            bit ^= 1;
            while (current_superblock < s->superblock_count) {

                /* skip any superblocks already marked as partially coded */
                if (s->superblock_coding[current_superblock] == SB_NOT_CODED) {

728
                    if (current_run-- == 0) {
729
                        bit ^= 1;
730
                        current_run = get_vlc2(gb,
731 732
                            s->superblock_run_length_vlc.table, 6, 2);
                        if (current_run == 33)
733
                            current_run += get_bits(gb, 12);
734 735 736 737 738
                    }

                    debug_block_coding("      setting superblock %d to %s\n",
                        current_superblock,
                        (bit) ? "fully coded" : "not coded");
739
                    s->superblock_coding[current_superblock] = 2*bit;
740 741 742 743 744 745 746 747 748 749
                }
                current_superblock++;
            }
        }

        /* if there were partial blocks, initialize bitstream for
         * unpacking fragment codings */
        if (decode_partial_blocks) {

            current_run = 0;
750
            bit = get_bits1(gb);
751
            /* toggle the bit because as soon as the first run length is
752 753 754 755 756 757 758 759
             * fetched the bit will be toggled again */
            bit ^= 1;
        }
    }

    /* figure out which fragments are coded; iterate through each
     * superblock (all planes) */
    s->coded_fragment_list_index = 0;
760
    s->next_coeff= s->coeffs + s->fragment_count;
761 762
    s->first_coded_y_fragment = s->first_coded_c_fragment = 0;
    s->last_coded_y_fragment = s->last_coded_c_fragment = -1;
763
    first_c_fragment_seen = 0;
764
    memset(s->macroblock_coding, MODE_COPY, s->macroblock_count);
765 766 767 768 769 770 771
    for (i = 0; i < s->superblock_count; i++) {

        /* iterate through all 16 fragments in a superblock */
        for (j = 0; j < 16; j++) {

            /* if the fragment is in bounds, check its coding status */
            current_fragment = s->superblock_fragments[i * 16 + j];
772
            if (current_fragment >= s->fragment_count) {
773
                av_log(s->avctx, AV_LOG_ERROR, "  vp3:unpack_superblocks(): bad fragment number (%d >= %d)\n",
774 775 776
                    current_fragment, s->fragment_count);
                return 1;
            }
777 778 779 780
            if (current_fragment != -1) {
                if (s->superblock_coding[i] == SB_NOT_CODED) {

                    /* copy all the fragments from the prior frame */
781
                    s->all_fragments[current_fragment].coding_method =
782 783 784 785 786 787
                        MODE_COPY;

                } else if (s->superblock_coding[i] == SB_PARTIALLY_CODED) {

                    /* fragment may or may not be coded; this is the case
                     * that cares about the fragment coding runs */
788
                    if (current_run-- == 0) {
789
                        bit ^= 1;
790
                        current_run = get_vlc2(gb,
791
                            s->fragment_run_length_vlc.table, 5, 2);
792 793 794
                    }

                    if (bit) {
795
                        /* default mode; actual mode will be decoded in
796
                         * the next phase */
797
                        s->all_fragments[current_fragment].coding_method =
798
                            MODE_INTER_NO_MV;
799
                        s->all_fragments[current_fragment].next_coeff= s->coeffs + current_fragment;
800
                        s->coded_fragment_list[s->coded_fragment_list_index] =
801
                            current_fragment;
M
Michael Niedermayer 已提交
802
                        if ((current_fragment >= s->fragment_start[1]) &&
803 804
                            (s->last_coded_y_fragment == -1) &&
                            (!first_c_fragment_seen)) {
805 806
                            s->first_coded_c_fragment = s->coded_fragment_list_index;
                            s->last_coded_y_fragment = s->first_coded_c_fragment - 1;
807
                            first_c_fragment_seen = 1;
808 809
                        }
                        s->coded_fragment_list_index++;
810
                        s->macroblock_coding[s->all_fragments[current_fragment].macroblock] = MODE_INTER_NO_MV;
811 812 813 814 815 816 817 818 819 820 821 822 823 824
                        debug_block_coding("      superblock %d is partially coded, fragment %d is coded\n",
                            i, current_fragment);
                    } else {
                        /* not coded; copy this fragment from the prior frame */
                        s->all_fragments[current_fragment].coding_method =
                            MODE_COPY;
                        debug_block_coding("      superblock %d is partially coded, fragment %d is not coded\n",
                            i, current_fragment);
                    }

                } else {

                    /* fragments are fully coded in this superblock; actual
                     * coding will be determined in next step */
825
                    s->all_fragments[current_fragment].coding_method =
826
                        MODE_INTER_NO_MV;
827
                    s->all_fragments[current_fragment].next_coeff= s->coeffs + current_fragment;
828
                    s->coded_fragment_list[s->coded_fragment_list_index] =
829
                        current_fragment;
M
Michael Niedermayer 已提交
830
                    if ((current_fragment >= s->fragment_start[1]) &&
831 832
                        (s->last_coded_y_fragment == -1) &&
                        (!first_c_fragment_seen)) {
833 834
                        s->first_coded_c_fragment = s->coded_fragment_list_index;
                        s->last_coded_y_fragment = s->first_coded_c_fragment - 1;
835
                        first_c_fragment_seen = 1;
836 837
                    }
                    s->coded_fragment_list_index++;
838
                    s->macroblock_coding[s->all_fragments[current_fragment].macroblock] = MODE_INTER_NO_MV;
839 840 841 842 843 844
                    debug_block_coding("      superblock %d is fully coded, fragment %d is coded\n",
                        i, current_fragment);
                }
            }
        }
    }
845

846 847
    if (!first_c_fragment_seen)
        /* only Y fragments coded in this frame */
848
        s->last_coded_y_fragment = s->coded_fragment_list_index - 1;
849
    else
850
        /* end the list of coded C fragments */
851
        s->last_coded_c_fragment = s->coded_fragment_list_index - 1;
852

853 854 855 856 857 858
    debug_block_coding("    %d total coded fragments, y: %d -> %d, c: %d -> %d\n",
        s->coded_fragment_list_index,
        s->first_coded_y_fragment,
        s->last_coded_y_fragment,
        s->first_coded_c_fragment,
        s->last_coded_c_fragment);
859 860

    return 0;
861 862 863 864 865 866
}

/*
 * This function unpacks all the coding mode data for individual macroblocks
 * from the bitstream.
 */
867
static int unpack_modes(Vp3DecodeContext *s, GetBitContext *gb)
868 869 870 871 872 873
{
    int i, j, k;
    int scheme;
    int current_macroblock;
    int current_fragment;
    int coding_mode;
874
    int custom_mode_alphabet[CODING_MODE_COUNT];
875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893

    debug_vp3("  vp3: unpacking encoding modes\n");

    if (s->keyframe) {
        debug_vp3("    keyframe-- all blocks are coded as INTRA\n");

        for (i = 0; i < s->fragment_count; i++)
            s->all_fragments[i].coding_method = MODE_INTRA;

    } else {

        /* fetch the mode coding scheme for this frame */
        scheme = get_bits(gb, 3);
        debug_modes("    using mode alphabet %d\n", scheme);

        /* is it a custom coding scheme? */
        if (scheme == 0) {
            debug_modes("    custom mode alphabet ahead:\n");
            for (i = 0; i < 8; i++)
894
                custom_mode_alphabet[get_bits(gb, 3)] = i;
895 896
        }

897 898 899 900 901 902 903 904
        for (i = 0; i < 8; i++) {
            if(scheme)
                debug_modes("      mode[%d][%d] = %d\n", scheme, i,
                    ModeAlphabet[scheme-1][i]);
            else
                debug_modes("      mode[0][%d] = %d\n", i,
                    custom_mode_alphabet[i]);
        }
905 906 907 908 909 910 911 912

        /* iterate through all of the macroblocks that contain 1 or more
         * coded fragments */
        for (i = 0; i < s->u_superblock_start; i++) {

            for (j = 0; j < 4; j++) {
                current_macroblock = s->superblock_macroblocks[i * 4 + j];
                if ((current_macroblock == -1) ||
913
                    (s->macroblock_coding[current_macroblock] == MODE_COPY))
914
                    continue;
915
                if (current_macroblock >= s->macroblock_count) {
916
                    av_log(s->avctx, AV_LOG_ERROR, "  vp3:unpack_modes(): bad macroblock number (%d >= %d)\n",
917 918 919
                        current_macroblock, s->macroblock_count);
                    return 1;
                }
920 921 922 923

                /* mode 7 means get 3 bits for each coding mode */
                if (scheme == 7)
                    coding_mode = get_bits(gb, 3);
924 925 926
                else if(scheme == 0)
                    coding_mode = custom_mode_alphabet
                        [get_vlc2(gb, s->mode_code_vlc.table, 3, 3)];
927
                else
928
                    coding_mode = ModeAlphabet[scheme-1]
929
                        [get_vlc2(gb, s->mode_code_vlc.table, 3, 3)];
930

931
                s->macroblock_coding[current_macroblock] = coding_mode;
932
                for (k = 0; k < 6; k++) {
933
                    current_fragment =
934
                        s->macroblock_fragments[current_macroblock * 6 + k];
935 936 937
                    if (current_fragment == -1)
                        continue;
                    if (current_fragment >= s->fragment_count) {
938
                        av_log(s->avctx, AV_LOG_ERROR, "  vp3:unpack_modes(): bad fragment number (%d >= %d)\n",
939 940 941
                            current_fragment, s->fragment_count);
                        return 1;
                    }
942
                    if (s->all_fragments[current_fragment].coding_method !=
943 944 945 946 947 948 949 950 951 952
                        MODE_COPY)
                        s->all_fragments[current_fragment].coding_method =
                            coding_mode;
                }

                debug_modes("    coding method for macroblock starting @ fragment %d = %d\n",
                    s->macroblock_fragments[current_macroblock * 6], coding_mode);
            }
        }
    }
953 954

    return 0;
955 956
}

957 958 959 960
/*
 * This function unpacks all the motion vectors for the individual
 * macroblocks from the bitstream.
 */
961
static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
962
{
963
    int i, j, k, l;
964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984
    int coding_mode;
    int motion_x[6];
    int motion_y[6];
    int last_motion_x = 0;
    int last_motion_y = 0;
    int prior_last_motion_x = 0;
    int prior_last_motion_y = 0;
    int current_macroblock;
    int current_fragment;

    debug_vp3("  vp3: unpacking motion vectors\n");
    if (s->keyframe) {

        debug_vp3("    keyframe-- there are no motion vectors\n");

    } else {

        memset(motion_x, 0, 6 * sizeof(int));
        memset(motion_y, 0, 6 * sizeof(int));

        /* coding mode 0 is the VLC scheme; 1 is the fixed code scheme */
985
        coding_mode = get_bits1(gb);
986 987 988 989 990 991 992 993 994 995
        debug_vectors("    using %s scheme for unpacking motion vectors\n",
            (coding_mode == 0) ? "VLC" : "fixed-length");

        /* iterate through all of the macroblocks that contain 1 or more
         * coded fragments */
        for (i = 0; i < s->u_superblock_start; i++) {

            for (j = 0; j < 4; j++) {
                current_macroblock = s->superblock_macroblocks[i * 4 + j];
                if ((current_macroblock == -1) ||
996
                    (s->macroblock_coding[current_macroblock] == MODE_COPY))
997
                    continue;
998
                if (current_macroblock >= s->macroblock_count) {
999
                    av_log(s->avctx, AV_LOG_ERROR, "  vp3:unpack_vectors(): bad macroblock number (%d >= %d)\n",
1000 1001 1002
                        current_macroblock, s->macroblock_count);
                    return 1;
                }
1003 1004

                current_fragment = s->macroblock_fragments[current_macroblock * 6];
1005
                if (current_fragment >= s->fragment_count) {
1006
                    av_log(s->avctx, AV_LOG_ERROR, "  vp3:unpack_vectors(): bad fragment number (%d >= %d\n",
1007 1008 1009
                        current_fragment, s->fragment_count);
                    return 1;
                }
1010
                switch (s->macroblock_coding[current_macroblock]) {
1011 1012 1013 1014 1015

                case MODE_INTER_PLUS_MV:
                case MODE_GOLDEN_MV:
                    /* all 6 fragments use the same motion vector */
                    if (coding_mode == 0) {
1016 1017
                        motion_x[0] = motion_vector_table[get_vlc2(gb, s->motion_vector_vlc.table, 6, 2)];
                        motion_y[0] = motion_vector_table[get_vlc2(gb, s->motion_vector_vlc.table, 6, 2)];
1018
                    } else {
1019 1020
                        motion_x[0] = fixed_motion_vector_table[get_bits(gb, 6)];
                        motion_y[0] = fixed_motion_vector_table[get_bits(gb, 6)];
1021
                    }
1022

1023 1024 1025 1026 1027 1028
                    for (k = 1; k < 6; k++) {
                        motion_x[k] = motion_x[0];
                        motion_y[k] = motion_y[0];
                    }

                    /* vector maintenance, only on MODE_INTER_PLUS_MV */
1029
                    if (s->macroblock_coding[current_macroblock] ==
1030 1031 1032 1033 1034 1035 1036 1037 1038
                        MODE_INTER_PLUS_MV) {
                        prior_last_motion_x = last_motion_x;
                        prior_last_motion_y = last_motion_y;
                        last_motion_x = motion_x[0];
                        last_motion_y = motion_y[0];
                    }
                    break;

                case MODE_INTER_FOURMV:
1039 1040 1041 1042
                    /* vector maintenance */
                    prior_last_motion_x = last_motion_x;
                    prior_last_motion_y = last_motion_y;

1043 1044 1045 1046
                    /* fetch 4 vectors from the bitstream, one for each
                     * Y fragment, then average for the C fragment vectors */
                    motion_x[4] = motion_y[4] = 0;
                    for (k = 0; k < 4; k++) {
1047 1048 1049 1050
                        for (l = 0; l < s->coded_fragment_list_index; l++)
                            if (s->coded_fragment_list[l] == s->macroblock_fragments[6*current_macroblock + k])
                                break;
                        if (l < s->coded_fragment_list_index) {
1051 1052 1053 1054 1055 1056 1057 1058 1059
                            if (coding_mode == 0) {
                                motion_x[k] = motion_vector_table[get_vlc2(gb, s->motion_vector_vlc.table, 6, 2)];
                                motion_y[k] = motion_vector_table[get_vlc2(gb, s->motion_vector_vlc.table, 6, 2)];
                            } else {
                                motion_x[k] = fixed_motion_vector_table[get_bits(gb, 6)];
                                motion_y[k] = fixed_motion_vector_table[get_bits(gb, 6)];
                            }
                            last_motion_x = motion_x[k];
                            last_motion_y = motion_y[k];
1060 1061 1062 1063
                        } else {
                            motion_x[k] = 0;
                            motion_y[k] = 0;
                        }
1064 1065 1066 1067
                        motion_x[4] += motion_x[k];
                        motion_y[4] += motion_y[k];
                    }

M
Michael Niedermayer 已提交
1068 1069 1070 1071
                    motion_x[5]=
                    motion_x[4]= RSHIFT(motion_x[4], 2);
                    motion_y[5]=
                    motion_y[4]= RSHIFT(motion_y[4], 2);
1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102
                    break;

                case MODE_INTER_LAST_MV:
                    /* all 6 fragments use the last motion vector */
                    motion_x[0] = last_motion_x;
                    motion_y[0] = last_motion_y;
                    for (k = 1; k < 6; k++) {
                        motion_x[k] = motion_x[0];
                        motion_y[k] = motion_y[0];
                    }

                    /* no vector maintenance (last vector remains the
                     * last vector) */
                    break;

                case MODE_INTER_PRIOR_LAST:
                    /* all 6 fragments use the motion vector prior to the
                     * last motion vector */
                    motion_x[0] = prior_last_motion_x;
                    motion_y[0] = prior_last_motion_y;
                    for (k = 1; k < 6; k++) {
                        motion_x[k] = motion_x[0];
                        motion_y[k] = motion_y[0];
                    }

                    /* vector maintenance */
                    prior_last_motion_x = last_motion_x;
                    prior_last_motion_y = last_motion_y;
                    last_motion_x = motion_x[0];
                    last_motion_y = motion_y[0];
                    break;
1103 1104 1105 1106 1107 1108 1109 1110

                default:
                    /* covers intra, inter without MV, golden without MV */
                    memset(motion_x, 0, 6 * sizeof(int));
                    memset(motion_y, 0, 6 * sizeof(int));

                    /* no vector maintenance */
                    break;
1111 1112 1113 1114 1115
                }

                /* assign the motion vectors to the correct fragments */
                debug_vectors("    vectors for macroblock starting @ fragment %d (coding method %d):\n",
                    current_fragment,
1116
                    s->macroblock_coding[current_macroblock]);
1117
                for (k = 0; k < 6; k++) {
1118
                    current_fragment =
1119
                        s->macroblock_fragments[current_macroblock * 6 + k];
1120 1121 1122
                    if (current_fragment == -1)
                        continue;
                    if (current_fragment >= s->fragment_count) {
1123
                        av_log(s->avctx, AV_LOG_ERROR, "  vp3:unpack_vectors(): bad fragment number (%d >= %d)\n",
1124 1125 1126
                            current_fragment, s->fragment_count);
                        return 1;
                    }
1127
                    s->all_fragments[current_fragment].motion_x = motion_x[k];
1128
                    s->all_fragments[current_fragment].motion_y = motion_y[k];
1129 1130
                    debug_vectors("    vector %d: fragment %d = (%d, %d)\n",
                        k, current_fragment, motion_x[k], motion_y[k]);
1131 1132 1133 1134
                }
            }
        }
    }
1135 1136

    return 0;
1137 1138
}

1139
/*
1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157
 * This function is called by unpack_dct_coeffs() to extract the VLCs from
 * the bitstream. The VLCs encode tokens which are used to unpack DCT
 * data. This function unpacks all the VLCs for either the Y plane or both
 * C planes, and is called for DC coefficients or different AC coefficient
 * levels (since different coefficient types require different VLC tables.
 *
 * This function returns a residual eob run. E.g, if a particular token gave
 * instructions to EOB the next 5 fragments and there were only 2 fragments
 * left in the current fragment range, 3 would be returned so that it could
 * be passed into the next call to this same function.
 */
static int unpack_vlcs(Vp3DecodeContext *s, GetBitContext *gb,
                        VLC *table, int coeff_index,
                        int first_fragment, int last_fragment,
                        int eob_run)
{
    int i;
    int token;
1158 1159
    int zero_run = 0;
    DCTELEM coeff = 0;
1160
    Vp3Fragment *fragment;
M
Michael Niedermayer 已提交
1161
    uint8_t *perm= s->scantable.permutated;
1162
    int bits_to_get;
1163

1164
    if ((first_fragment >= s->fragment_count) ||
1165 1166
        (last_fragment >= s->fragment_count)) {

1167
        av_log(s->avctx, AV_LOG_ERROR, "  vp3:unpack_vlcs(): bad fragment number (%d -> %d ?)\n",
1168
            first_fragment, last_fragment);
1169
        return 0;
1170 1171
    }

1172
    for (i = first_fragment; i <= last_fragment; i++) {
1173
        int fragment_num = s->coded_fragment_list[i];
1174

1175
        if (s->coeff_counts[fragment_num] > coeff_index)
1176
            continue;
1177
        fragment = &s->all_fragments[fragment_num];
1178 1179 1180 1181 1182 1183

        if (!eob_run) {
            /* decode a VLC into a token */
            token = get_vlc2(gb, table->table, 5, 3);
            debug_vlc(" token = %2d, ", token);
            /* use the token to get a zero run, a coefficient, and an eob run */
1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199
            if (token <= 6) {
                eob_run = eob_run_base[token];
                if (eob_run_get_bits[token])
                    eob_run += get_bits(gb, eob_run_get_bits[token]);
                coeff = zero_run = 0;
            } else {
                bits_to_get = coeff_get_bits[token];
                if (!bits_to_get)
                    coeff = coeff_tables[token][0];
                else
                    coeff = coeff_tables[token][get_bits(gb, bits_to_get)];

                zero_run = zero_run_base[token];
                if (zero_run_get_bits[token])
                    zero_run += get_bits(gb, zero_run_get_bits[token]);
            }
1200 1201 1202
        }

        if (!eob_run) {
1203 1204
            s->coeff_counts[fragment_num] += zero_run;
            if (s->coeff_counts[fragment_num] < 64){
1205
                fragment->next_coeff->coeff= coeff;
1206
                fragment->next_coeff->index= perm[s->coeff_counts[fragment_num]++]; //FIXME perm here already?
1207 1208 1209 1210
                fragment->next_coeff->next= s->next_coeff;
                s->next_coeff->next=NULL;
                fragment->next_coeff= s->next_coeff++;
            }
1211
            debug_vlc(" fragment %d coeff = %d\n",
1212
                s->coded_fragment_list[i], fragment->next_coeff[coeff_index]);
1213
        } else {
1214
            s->coeff_counts[fragment_num] |= 128;
1215
            debug_vlc(" fragment %d eob with %d coefficients\n",
1216
                s->coded_fragment_list[i], s->coeff_counts[fragment_num]&127);
1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227
            eob_run--;
        }
    }

    return eob_run;
}

/*
 * This function unpacks all of the DCT coefficient data from the
 * bitstream.
 */
1228
static int unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
1229 1230 1231 1232 1233 1234 1235 1236
{
    int i;
    int dc_y_table;
    int dc_c_table;
    int ac_y_table;
    int ac_c_table;
    int residual_eob_run = 0;

1237
    /* fetch the DC table indexes */
1238 1239 1240 1241 1242 1243
    dc_y_table = get_bits(gb, 4);
    dc_c_table = get_bits(gb, 4);

    /* unpack the Y plane DC coefficients */
    debug_vp3("  vp3: unpacking Y plane DC coefficients using table %d\n",
        dc_y_table);
1244
    residual_eob_run = unpack_vlcs(s, gb, &s->dc_vlc[dc_y_table], 0,
1245
        s->first_coded_y_fragment, s->last_coded_y_fragment, residual_eob_run);
1246 1247 1248 1249 1250

    /* unpack the C plane DC coefficients */
    debug_vp3("  vp3: unpacking C plane DC coefficients using table %d\n",
        dc_c_table);
    residual_eob_run = unpack_vlcs(s, gb, &s->dc_vlc[dc_c_table], 0,
1251
        s->first_coded_c_fragment, s->last_coded_c_fragment, residual_eob_run);
1252

1253
    /* fetch the AC table indexes */
1254 1255 1256
    ac_y_table = get_bits(gb, 4);
    ac_c_table = get_bits(gb, 4);

1257
    /* unpack the group 1 AC coefficients (coeffs 1-5) */
1258 1259 1260 1261
    for (i = 1; i <= 5; i++) {

        debug_vp3("  vp3: unpacking level %d Y plane AC coefficients using table %d\n",
            i, ac_y_table);
1262
        residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_1[ac_y_table], i,
1263
            s->first_coded_y_fragment, s->last_coded_y_fragment, residual_eob_run);
1264 1265 1266

        debug_vp3("  vp3: unpacking level %d C plane AC coefficients using table %d\n",
            i, ac_c_table);
1267
        residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_1[ac_c_table], i,
1268
            s->first_coded_c_fragment, s->last_coded_c_fragment, residual_eob_run);
1269 1270
    }

1271
    /* unpack the group 2 AC coefficients (coeffs 6-14) */
1272 1273 1274 1275
    for (i = 6; i <= 14; i++) {

        debug_vp3("  vp3: unpacking level %d Y plane AC coefficients using table %d\n",
            i, ac_y_table);
1276
        residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_2[ac_y_table], i,
1277
            s->first_coded_y_fragment, s->last_coded_y_fragment, residual_eob_run);
1278 1279 1280

        debug_vp3("  vp3: unpacking level %d C plane AC coefficients using table %d\n",
            i, ac_c_table);
1281
        residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_2[ac_c_table], i,
1282
            s->first_coded_c_fragment, s->last_coded_c_fragment, residual_eob_run);
1283 1284
    }

1285
    /* unpack the group 3 AC coefficients (coeffs 15-27) */
1286 1287 1288 1289
    for (i = 15; i <= 27; i++) {

        debug_vp3("  vp3: unpacking level %d Y plane AC coefficients using table %d\n",
            i, ac_y_table);
1290
        residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_3[ac_y_table], i,
1291
            s->first_coded_y_fragment, s->last_coded_y_fragment, residual_eob_run);
1292 1293 1294

        debug_vp3("  vp3: unpacking level %d C plane AC coefficients using table %d\n",
            i, ac_c_table);
1295
        residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_3[ac_c_table], i,
1296
            s->first_coded_c_fragment, s->last_coded_c_fragment, residual_eob_run);
1297 1298
    }

1299
    /* unpack the group 4 AC coefficients (coeffs 28-63) */
1300 1301 1302 1303
    for (i = 28; i <= 63; i++) {

        debug_vp3("  vp3: unpacking level %d Y plane AC coefficients using table %d\n",
            i, ac_y_table);
1304
        residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_4[ac_y_table], i,
1305
            s->first_coded_y_fragment, s->last_coded_y_fragment, residual_eob_run);
1306 1307 1308

        debug_vp3("  vp3: unpacking level %d C plane AC coefficients using table %d\n",
            i, ac_c_table);
1309
        residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_4[ac_c_table], i,
1310
            s->first_coded_c_fragment, s->last_coded_c_fragment, residual_eob_run);
1311
    }
1312 1313

    return 0;
1314 1315 1316 1317
}

/*
 * This function reverses the DC prediction for each coded fragment in
1318
 * the frame. Much of this function is adapted directly from the original
1319 1320 1321 1322 1323
 * VP3 source code.
 */
#define COMPATIBLE_FRAME(x) \
  (compatible_frame[s->all_fragments[x].coding_method] == current_frame_type)
#define FRAME_CODED(x) (s->all_fragments[x].coding_method != MODE_COPY)
1324
#define DC_COEFF(u) (s->coeffs[u].index ? 0 : s->coeffs[u].coeff) //FIXME do somethin to simplify this
1325 1326 1327 1328

static void reverse_dc_prediction(Vp3DecodeContext *s,
                                  int first_fragment,
                                  int fragment_width,
1329
                                  int fragment_height)
1330 1331 1332 1333 1334 1335 1336 1337 1338 1339
{

#define PUL 8
#define PU 4
#define PUR 2
#define PL 1

    int x, y;
    int i = first_fragment;

1340
    int predicted_dc;
1341 1342 1343 1344

    /* DC values for the left, up-left, up, and up-right fragments */
    int vl, vul, vu, vur;

1345
    /* indexes for the left, up-left, up, and up-right fragments */
1346 1347
    int l, ul, u, ur;

1348
    /*
1349 1350 1351 1352 1353 1354
     * The 6 fields mean:
     *   0: up-left multiplier
     *   1: up multiplier
     *   2: up-right multiplier
     *   3: left multiplier
     */
M
Michael Niedermayer 已提交
1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371
    int predictor_transform[16][4] = {
        {  0,  0,  0,  0},
        {  0,  0,  0,128},        // PL
        {  0,  0,128,  0},        // PUR
        {  0,  0, 53, 75},        // PUR|PL
        {  0,128,  0,  0},        // PU
        {  0, 64,  0, 64},        // PU|PL
        {  0,128,  0,  0},        // PU|PUR
        {  0,  0, 53, 75},        // PU|PUR|PL
        {128,  0,  0,  0},        // PUL
        {  0,  0,  0,128},        // PUL|PL
        { 64,  0, 64,  0},        // PUL|PUR
        {  0,  0, 53, 75},        // PUL|PUR|PL
        {  0,128,  0,  0},        // PUL|PU
       {-104,116,  0,116},        // PUL|PU|PL
        { 24, 80, 24,  0},        // PUL|PU|PUR
       {-104,116,  0,116}         // PUL|PU|PUR|PL
1372 1373 1374 1375 1376
    };

    /* This table shows which types of blocks can use other blocks for
     * prediction. For example, INTRA is the only mode in this table to
     * have a frame number of 0. That means INTRA blocks can only predict
1377
     * from other INTRA blocks. There are 2 golden frame coding types;
1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410
     * blocks encoding in these modes can only predict from other blocks
     * that were encoded with these 1 of these 2 modes. */
    unsigned char compatible_frame[8] = {
        1,    /* MODE_INTER_NO_MV */
        0,    /* MODE_INTRA */
        1,    /* MODE_INTER_PLUS_MV */
        1,    /* MODE_INTER_LAST_MV */
        1,    /* MODE_INTER_PRIOR_MV */
        2,    /* MODE_USING_GOLDEN */
        2,    /* MODE_GOLDEN_MV */
        1     /* MODE_INTER_FOUR_MV */
    };
    int current_frame_type;

    /* there is a last DC predictor for each of the 3 frame types */
    short last_dc[3];

    int transform = 0;

    debug_vp3("  vp3: reversing DC prediction\n");

    vul = vu = vur = vl = 0;
    last_dc[0] = last_dc[1] = last_dc[2] = 0;

    /* for each fragment row... */
    for (y = 0; y < fragment_height; y++) {

        /* for each fragment in a row... */
        for (x = 0; x < fragment_width; x++, i++) {

            /* reverse prediction if this block was coded */
            if (s->all_fragments[i].coding_method != MODE_COPY) {

1411
                current_frame_type =
1412
                    compatible_frame[s->all_fragments[i].coding_method];
M
Michael Niedermayer 已提交
1413 1414
                debug_dc_pred(" frag %d: orig DC = %d, ",
                    i, DC_COEFF(i));
1415

M
Michael Niedermayer 已提交
1416 1417 1418
                transform= 0;
                if(x){
                    l= i-1;
1419
                    vl = DC_COEFF(l);
M
Michael Niedermayer 已提交
1420 1421
                    if(FRAME_CODED(l) && COMPATIBLE_FRAME(l))
                        transform |= PL;
M
Michael Niedermayer 已提交
1422 1423 1424
                }
                if(y){
                    u= i-fragment_width;
1425
                    vu = DC_COEFF(u);
M
Michael Niedermayer 已提交
1426 1427
                    if(FRAME_CODED(u) && COMPATIBLE_FRAME(u))
                        transform |= PU;
M
Michael Niedermayer 已提交
1428 1429 1430
                    if(x){
                        ul= i-fragment_width-1;
                        vul = DC_COEFF(ul);
M
Michael Niedermayer 已提交
1431 1432
                        if(FRAME_CODED(ul) && COMPATIBLE_FRAME(ul))
                            transform |= PUL;
M
Michael Niedermayer 已提交
1433 1434 1435 1436
                    }
                    if(x + 1 < fragment_width){
                        ur= i-fragment_width+1;
                        vur = DC_COEFF(ur);
M
Michael Niedermayer 已提交
1437 1438
                        if(FRAME_CODED(ur) && COMPATIBLE_FRAME(ur))
                            transform |= PUR;
M
Michael Niedermayer 已提交
1439
                    }
1440 1441 1442 1443 1444 1445 1446 1447
                }

                debug_dc_pred("transform = %d, ", transform);

                if (transform == 0) {

                    /* if there were no fragments to predict from, use last
                     * DC saved */
1448
                    predicted_dc = last_dc[current_frame_type];
1449
                    debug_dc_pred("from last DC (%d) = %d\n",
1450
                        current_frame_type, DC_COEFF(i));
1451 1452 1453 1454 1455 1456 1457 1458 1459 1460

                } else {

                    /* apply the appropriate predictor transform */
                    predicted_dc =
                        (predictor_transform[transform][0] * vul) +
                        (predictor_transform[transform][1] * vu) +
                        (predictor_transform[transform][2] * vur) +
                        (predictor_transform[transform][3] * vl);

M
Michael Niedermayer 已提交
1461
                    predicted_dc /= 128;
1462 1463 1464 1465

                    /* check for outranging on the [ul u l] and
                     * [ul u ur l] predictors */
                    if ((transform == 13) || (transform == 15)) {
D
Diego Biurrun 已提交
1466
                        if (FFABS(predicted_dc - vu) > 128)
1467
                            predicted_dc = vu;
D
Diego Biurrun 已提交
1468
                        else if (FFABS(predicted_dc - vl) > 128)
1469
                            predicted_dc = vl;
D
Diego Biurrun 已提交
1470
                        else if (FFABS(predicted_dc - vul) > 128)
1471 1472 1473
                            predicted_dc = vul;
                    }

1474
                    debug_dc_pred("from pred DC = %d\n",
1475
                    DC_COEFF(i));
1476 1477
                }

1478 1479 1480 1481 1482 1483 1484 1485
                /* at long last, apply the predictor */
                if(s->coeffs[i].index){
                    *s->next_coeff= s->coeffs[i];
                    s->coeffs[i].index=0;
                    s->coeffs[i].coeff=0;
                    s->coeffs[i].next= s->next_coeff++;
                }
                s->coeffs[i].coeff += predicted_dc;
1486
                /* save the DC */
1487
                last_dc[current_frame_type] = DC_COEFF(i);
1488 1489
                if(DC_COEFF(i) && !(s->coeff_counts[i]&127)){
                    s->coeff_counts[i]= 129;
1490 1491 1492 1493
//                    s->all_fragments[i].next_coeff= s->next_coeff;
                    s->coeffs[i].next= s->next_coeff;
                    (s->next_coeff++)->next=NULL;
                }
1494 1495 1496 1497 1498
            }
        }
    }
}

1499 1500 1501 1502 1503 1504

static void horizontal_filter(unsigned char *first_pixel, int stride,
    int *bounding_values);
static void vertical_filter(unsigned char *first_pixel, int stride,
    int *bounding_values);

1505 1506 1507 1508 1509 1510
/*
 * Perform the final rendering for a particular slice of data.
 * The slice number ranges from 0..(macroblock_height - 1).
 */
static void render_slice(Vp3DecodeContext *s, int slice)
{
M
Michael Niedermayer 已提交
1511
    int x;
1512 1513
    int m, n;
    int16_t *dequantizer;
1514
    DECLARE_ALIGNED_16(DCTELEM, block[64]);
1515 1516 1517 1518 1519 1520 1521 1522 1523 1524
    int motion_x = 0xdeadbeef, motion_y = 0xdeadbeef;
    int motion_halfpel_index;
    uint8_t *motion_source;
    int plane;
    int current_macroblock_entry = slice * s->macroblock_width * 6;

    if (slice >= s->macroblock_height)
        return;

    for (plane = 0; plane < 3; plane++) {
M
Michael Niedermayer 已提交
1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535
        uint8_t *output_plane = s->current_frame.data    [plane];
        uint8_t *  last_plane = s->   last_frame.data    [plane];
        uint8_t *golden_plane = s-> golden_frame.data    [plane];
        int stride            = s->current_frame.linesize[plane];
        int plane_width       = s->width  >> !!plane;
        int plane_height      = s->height >> !!plane;
        int y =        slice *  FRAGMENT_PIXELS << !plane ;
        int slice_height = y + (FRAGMENT_PIXELS << !plane);
        int i = s->macroblock_fragments[current_macroblock_entry + plane + 3*!!plane];

        if (!s->flipped_image) stride = -stride;
1536

1537

D
Diego Biurrun 已提交
1538
        if(FFABS(stride) > 2048)
1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558
            return; //various tables are fixed size

        /* for each fragment row in the slice (both of them)... */
        for (; y < slice_height; y += 8) {

            /* for each fragment in a row... */
            for (x = 0; x < plane_width; x += 8, i++) {

                if ((i < 0) || (i >= s->fragment_count)) {
                    av_log(s->avctx, AV_LOG_ERROR, "  vp3:render_slice(): bad fragment number (%d)\n", i);
                    return;
                }

                /* transform if this block was coded */
                if ((s->all_fragments[i].coding_method != MODE_COPY) &&
                    !((s->avctx->flags & CODEC_FLAG_GRAY) && plane)) {

                    if ((s->all_fragments[i].coding_method == MODE_USING_GOLDEN) ||
                        (s->all_fragments[i].coding_method == MODE_GOLDEN_MV))
                        motion_source= golden_plane;
1559
                    else
1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596
                        motion_source= last_plane;

                    motion_source += s->all_fragments[i].first_pixel;
                    motion_halfpel_index = 0;

                    /* sort out the motion vector if this fragment is coded
                     * using a motion vector method */
                    if ((s->all_fragments[i].coding_method > MODE_INTRA) &&
                        (s->all_fragments[i].coding_method != MODE_USING_GOLDEN)) {
                        int src_x, src_y;
                        motion_x = s->all_fragments[i].motion_x;
                        motion_y = s->all_fragments[i].motion_y;
                        if(plane){
                            motion_x= (motion_x>>1) | (motion_x&1);
                            motion_y= (motion_y>>1) | (motion_y&1);
                        }

                        src_x= (motion_x>>1) + x;
                        src_y= (motion_y>>1) + y;
                        if ((motion_x == 127) || (motion_y == 127))
                            av_log(s->avctx, AV_LOG_ERROR, " help! got invalid motion vector! (%X, %X)\n", motion_x, motion_y);

                        motion_halfpel_index = motion_x & 0x01;
                        motion_source += (motion_x >> 1);

                        motion_halfpel_index |= (motion_y & 0x01) << 1;
                        motion_source += ((motion_y >> 1) * stride);

                        if(src_x<0 || src_y<0 || src_x + 9 >= plane_width || src_y + 9 >= plane_height){
                            uint8_t *temp= s->edge_emu_buffer;
                            if(stride<0) temp -= 9*stride;
                            else temp += 9*stride;

                            ff_emulated_edge_mc(temp, motion_source, stride, 9, 9, src_x, src_y, plane_width, plane_height);
                            motion_source= temp;
                        }
                    }
1597

1598 1599 1600 1601

                    /* first, take care of copying a block from either the
                     * previous or the golden frame */
                    if (s->all_fragments[i].coding_method != MODE_INTRA) {
1602 1603 1604
                        /* Note, it is possible to implement all MC cases with
                           put_no_rnd_pixels_l2 which would look more like the
                           VP3 source but this would be slower as
1605 1606 1607 1608 1609 1610 1611 1612 1613
                           put_no_rnd_pixels_tab is better optimzed */
                        if(motion_halfpel_index != 3){
                            s->dsp.put_no_rnd_pixels_tab[1][motion_halfpel_index](
                                output_plane + s->all_fragments[i].first_pixel,
                                motion_source, stride, 8);
                        }else{
                            int d= (motion_x ^ motion_y)>>31; // d is 0 if motion_x and _y have the same sign, else -1
                            s->dsp.put_no_rnd_pixels_l2[1](
                                output_plane + s->all_fragments[i].first_pixel,
1614 1615
                                motion_source - d,
                                motion_source + stride + 1 + d,
1616 1617
                                stride, 8);
                        }
1618
                        dequantizer = s->qmat[1][plane];
1619
                    }else{
1620
                        dequantizer = s->qmat[0][plane];
1621 1622 1623
                    }

                    /* dequantize the DCT coefficients */
1624 1625
                    debug_idct("fragment %d, coding mode %d, DC = %d, dequant = %d:\n",
                        i, s->all_fragments[i].coding_method,
1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644
                        DC_COEFF(i), dequantizer[0]);

                    if(s->avctx->idct_algo==FF_IDCT_VP3){
                        Coeff *coeff= s->coeffs + i;
                        memset(block, 0, sizeof(block));
                        while(coeff->next){
                            block[coeff->index]= coeff->coeff * dequantizer[coeff->index];
                            coeff= coeff->next;
                        }
                    }else{
                        Coeff *coeff= s->coeffs + i;
                        memset(block, 0, sizeof(block));
                        while(coeff->next){
                            block[coeff->index]= (coeff->coeff * dequantizer[coeff->index] + 2)>>2;
                            coeff= coeff->next;
                        }
                    }

                    /* invert DCT and place (or add) in final output */
1645

1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664
                    if (s->all_fragments[i].coding_method == MODE_INTRA) {
                        if(s->avctx->idct_algo!=FF_IDCT_VP3)
                            block[0] += 128<<3;
                        s->dsp.idct_put(
                            output_plane + s->all_fragments[i].first_pixel,
                            stride,
                            block);
                    } else {
                        s->dsp.idct_add(
                            output_plane + s->all_fragments[i].first_pixel,
                            stride,
                            block);
                    }

                    debug_idct("block after idct_%s():\n",
                        (s->all_fragments[i].coding_method == MODE_INTRA)?
                        "put" : "add");
                    for (m = 0; m < 8; m++) {
                        for (n = 0; n < 8; n++) {
1665
                            debug_idct(" %3d", *(output_plane +
1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680
                                s->all_fragments[i].first_pixel + (m * stride + n)));
                        }
                        debug_idct("\n");
                    }
                    debug_idct("\n");

                } else {

                    /* copy directly from the previous frame */
                    s->dsp.put_pixels_tab[1][0](
                        output_plane + s->all_fragments[i].first_pixel,
                        last_plane + s->all_fragments[i].first_pixel,
                        stride, 8);

                }
1681
#if 0
1682 1683 1684 1685 1686 1687 1688
                /* perform the left edge filter if:
                 *   - the fragment is not on the left column
                 *   - the fragment is coded in this frame
                 *   - the fragment is not coded in this frame but the left
                 *     fragment is coded in this frame (this is done instead
                 *     of a right edge filter when rendering the left fragment
                 *     since this fragment is not available yet) */
1689
                if ((x > 0) &&
1690 1691 1692
                    ((s->all_fragments[i].coding_method != MODE_COPY) ||
                     ((s->all_fragments[i].coding_method == MODE_COPY) &&
                      (s->all_fragments[i - 1].coding_method != MODE_COPY)) )) {
1693
                    horizontal_filter(
1694
                        output_plane + s->all_fragments[i].first_pixel + 7*stride,
M
Michael Niedermayer 已提交
1695
                        -stride, s->bounding_values_array + 127);
1696 1697
                }

1698 1699 1700 1701 1702 1703 1704
                /* perform the top edge filter if:
                 *   - the fragment is not on the top row
                 *   - the fragment is coded in this frame
                 *   - the fragment is not coded in this frame but the above
                 *     fragment is coded in this frame (this is done instead
                 *     of a bottom edge filter when rendering the above
                 *     fragment since this fragment is not available yet) */
1705
                if ((y > 0) &&
1706 1707 1708
                    ((s->all_fragments[i].coding_method != MODE_COPY) ||
                     ((s->all_fragments[i].coding_method == MODE_COPY) &&
                      (s->all_fragments[i - fragment_width].coding_method != MODE_COPY)) )) {
1709
                    vertical_filter(
1710
                        output_plane + s->all_fragments[i].first_pixel - stride,
M
Michael Niedermayer 已提交
1711
                        -stride, s->bounding_values_array + 127);
1712
                }
1713
#endif
1714 1715 1716 1717 1718 1719 1720
            }
        }
    }

     /* this looks like a good place for slice dispatch... */
     /* algorithm:
      *   if (slice == s->macroblock_height - 1)
1721 1722 1723
      *     dispatch (both last slice & 2nd-to-last slice);
      *   else if (slice > 0)
      *     dispatch (slice - 1);
1724 1725 1726 1727 1728
      */

    emms_c();
}

1729 1730 1731
static void horizontal_filter(unsigned char *first_pixel, int stride,
    int *bounding_values)
{
1732
    unsigned char *end;
1733 1734
    int filter_value;

M
Michael Niedermayer 已提交
1735
    for (end= first_pixel + 8*stride; first_pixel != end; first_pixel += stride) {
1736
        filter_value =
1737 1738
            (first_pixel[-2] - first_pixel[ 1])
         +3*(first_pixel[ 0] - first_pixel[-1]);
1739
        filter_value = bounding_values[(filter_value + 4) >> 3];
1740 1741
        first_pixel[-1] = av_clip_uint8(first_pixel[-1] + filter_value);
        first_pixel[ 0] = av_clip_uint8(first_pixel[ 0] - filter_value);
1742 1743 1744 1745 1746 1747
    }
}

static void vertical_filter(unsigned char *first_pixel, int stride,
    int *bounding_values)
{
1748
    unsigned char *end;
1749
    int filter_value;
1750
    const int nstride= -stride;
1751

1752
    for (end= first_pixel + 8; first_pixel < end; first_pixel++) {
1753
        filter_value =
1754 1755
            (first_pixel[2 * nstride] - first_pixel[ stride])
         +3*(first_pixel[0          ] - first_pixel[nstride]);
1756
        filter_value = bounding_values[(filter_value + 4) >> 3];
1757 1758
        first_pixel[nstride] = av_clip_uint8(first_pixel[nstride] + filter_value);
        first_pixel[0] = av_clip_uint8(first_pixel[0] - filter_value);
1759 1760 1761 1762 1763
    }
}

static void apply_loop_filter(Vp3DecodeContext *s)
{
M
Michael Niedermayer 已提交
1764 1765
    int plane;
    int x, y;
1766
    int *bounding_values= s->bounding_values_array+127;
1767

1768
#if 0
1769
    int bounding_values_array[256];
1770 1771 1772 1773 1774 1775 1776
    int filter_limit;

    /* find the right loop limit value */
    for (x = 63; x >= 0; x--) {
        if (vp31_ac_scale_factor[x] >= s->quality_index)
            break;
    }
1777
    filter_limit = vp31_filter_limit_values[s->quality_index];
1778 1779

    /* set up the bounding values */
1780
    memset(bounding_values_array, 0, 256 * sizeof(int));
1781 1782 1783 1784 1785 1786
    for (x = 0; x < filter_limit; x++) {
        bounding_values[-x - filter_limit] = -filter_limit + x;
        bounding_values[-x] = -x;
        bounding_values[x] = x;
        bounding_values[x + filter_limit] = filter_limit - x;
    }
1787
#endif
1788 1789

    for (plane = 0; plane < 3; plane++) {
M
Michael Niedermayer 已提交
1790 1791 1792 1793 1794
        int width           = s->fragment_width  >> !!plane;
        int height          = s->fragment_height >> !!plane;
        int fragment        = s->fragment_start        [plane];
        int stride          = s->current_frame.linesize[plane];
        uint8_t *plane_data = s->current_frame.data    [plane];
M
Michael Niedermayer 已提交
1795
        if (!s->flipped_image) stride = -stride;
1796 1797

        for (y = 0; y < height; y++) {
1798

1799 1800 1801 1802 1803
            for (x = 0; x < width; x++) {
                /* do not perform left edge filter for left columns frags */
                if ((x > 0) &&
                    (s->all_fragments[fragment].coding_method != MODE_COPY)) {
                    horizontal_filter(
M
Michael Niedermayer 已提交
1804
                        plane_data + s->all_fragments[fragment].first_pixel,
1805 1806 1807 1808 1809 1810 1811
                        stride, bounding_values);
                }

                /* do not perform top edge filter for top row fragments */
                if ((y > 0) &&
                    (s->all_fragments[fragment].coding_method != MODE_COPY)) {
                    vertical_filter(
M
Michael Niedermayer 已提交
1812
                        plane_data + s->all_fragments[fragment].first_pixel,
1813 1814 1815 1816 1817 1818 1819 1820 1821 1822
                        stride, bounding_values);
                }

                /* do not perform right edge filter for right column
                 * fragments or if right fragment neighbor is also coded
                 * in this frame (it will be filtered in next iteration) */
                if ((x < width - 1) &&
                    (s->all_fragments[fragment].coding_method != MODE_COPY) &&
                    (s->all_fragments[fragment + 1].coding_method == MODE_COPY)) {
                    horizontal_filter(
M
Michael Niedermayer 已提交
1823
                        plane_data + s->all_fragments[fragment + 1].first_pixel,
1824 1825 1826 1827 1828 1829 1830 1831 1832 1833
                        stride, bounding_values);
                }

                /* do not perform bottom edge filter for bottom row
                 * fragments or if bottom fragment neighbor is also coded
                 * in this frame (it will be filtered in the next row) */
                if ((y < height - 1) &&
                    (s->all_fragments[fragment].coding_method != MODE_COPY) &&
                    (s->all_fragments[fragment + width].coding_method == MODE_COPY)) {
                    vertical_filter(
M
Michael Niedermayer 已提交
1834
                        plane_data + s->all_fragments[fragment + width].first_pixel,
1835 1836 1837 1838 1839 1840 1841
                        stride, bounding_values);
                }

                fragment++;
            }
        }
    }
1842 1843
}

1844
/*
1845 1846 1847 1848
 * This function computes the first pixel addresses for each fragment.
 * This function needs to be invoked after the first frame is allocated
 * so that it has access to the plane strides.
 */
1849
static void vp3_calculate_pixel_addresses(Vp3DecodeContext *s)
1850 1851 1852 1853 1854 1855 1856 1857 1858
{

    int i, x, y;

    /* figure out the first pixel addresses for each of the fragments */
    /* Y plane */
    i = 0;
    for (y = s->fragment_height; y > 0; y--) {
        for (x = 0; x < s->fragment_width; x++) {
1859
            s->all_fragments[i++].first_pixel =
1860 1861 1862
                s->golden_frame.linesize[0] * y * FRAGMENT_PIXELS -
                    s->golden_frame.linesize[0] +
                    x * FRAGMENT_PIXELS;
1863
            debug_init("  fragment %d, first pixel @ %d\n",
1864 1865 1866 1867 1868
                i-1, s->all_fragments[i-1].first_pixel);
        }
    }

    /* U plane */
M
Michael Niedermayer 已提交
1869
    i = s->fragment_start[1];
1870 1871
    for (y = s->fragment_height / 2; y > 0; y--) {
        for (x = 0; x < s->fragment_width / 2; x++) {
1872
            s->all_fragments[i++].first_pixel =
1873 1874 1875
                s->golden_frame.linesize[1] * y * FRAGMENT_PIXELS -
                    s->golden_frame.linesize[1] +
                    x * FRAGMENT_PIXELS;
1876
            debug_init("  fragment %d, first pixel @ %d\n",
1877 1878 1879 1880 1881
                i-1, s->all_fragments[i-1].first_pixel);
        }
    }

    /* V plane */
M
Michael Niedermayer 已提交
1882
    i = s->fragment_start[2];
1883 1884
    for (y = s->fragment_height / 2; y > 0; y--) {
        for (x = 0; x < s->fragment_width / 2; x++) {
1885
            s->all_fragments[i++].first_pixel =
1886 1887 1888
                s->golden_frame.linesize[2] * y * FRAGMENT_PIXELS -
                    s->golden_frame.linesize[2] +
                    x * FRAGMENT_PIXELS;
1889
            debug_init("  fragment %d, first pixel @ %d\n",
1890 1891 1892 1893 1894
                i-1, s->all_fragments[i-1].first_pixel);
        }
    }
}

1895
/* FIXME: this should be merged with the above! */
1896
static void theora_calculate_pixel_addresses(Vp3DecodeContext *s)
1897 1898 1899 1900 1901 1902 1903 1904 1905
{

    int i, x, y;

    /* figure out the first pixel addresses for each of the fragments */
    /* Y plane */
    i = 0;
    for (y = 1; y <= s->fragment_height; y++) {
        for (x = 0; x < s->fragment_width; x++) {
1906
            s->all_fragments[i++].first_pixel =
1907 1908 1909
                s->golden_frame.linesize[0] * y * FRAGMENT_PIXELS -
                    s->golden_frame.linesize[0] +
                    x * FRAGMENT_PIXELS;
1910
            debug_init("  fragment %d, first pixel @ %d\n",
1911 1912 1913 1914 1915
                i-1, s->all_fragments[i-1].first_pixel);
        }
    }

    /* U plane */
M
Michael Niedermayer 已提交
1916
    i = s->fragment_start[1];
1917 1918
    for (y = 1; y <= s->fragment_height / 2; y++) {
        for (x = 0; x < s->fragment_width / 2; x++) {
1919
            s->all_fragments[i++].first_pixel =
1920 1921 1922
                s->golden_frame.linesize[1] * y * FRAGMENT_PIXELS -
                    s->golden_frame.linesize[1] +
                    x * FRAGMENT_PIXELS;
1923
            debug_init("  fragment %d, first pixel @ %d\n",
1924 1925 1926 1927 1928
                i-1, s->all_fragments[i-1].first_pixel);
        }
    }

    /* V plane */
M
Michael Niedermayer 已提交
1929
    i = s->fragment_start[2];
1930 1931
    for (y = 1; y <= s->fragment_height / 2; y++) {
        for (x = 0; x < s->fragment_width / 2; x++) {
1932
            s->all_fragments[i++].first_pixel =
1933 1934 1935
                s->golden_frame.linesize[2] * y * FRAGMENT_PIXELS -
                    s->golden_frame.linesize[2] +
                    x * FRAGMENT_PIXELS;
1936
            debug_init("  fragment %d, first pixel @ %d\n",
1937 1938 1939 1940 1941
                i-1, s->all_fragments[i-1].first_pixel);
        }
    }
}

1942 1943 1944
/*
 * This is the ffmpeg/libavcodec API init function.
 */
1945
static av_cold int vp3_decode_init(AVCodecContext *avctx)
1946 1947
{
    Vp3DecodeContext *s = avctx->priv_data;
1948
    int i, inter, plane;
1949 1950 1951 1952
    int c_width;
    int c_height;
    int y_superblock_count;
    int c_superblock_count;
1953

A
Alex Beregszaszi 已提交
1954
    if (avctx->codec_tag == MKTAG('V','P','3','0'))
1955
        s->version = 0;
A
Alex Beregszaszi 已提交
1956
    else
1957
        s->version = 1;
A
Alex Beregszaszi 已提交
1958

1959
    s->avctx = avctx;
1960 1961
    s->width = (avctx->width + 15) & 0xFFFFFFF0;
    s->height = (avctx->height + 15) & 0xFFFFFFF0;
1962
    avctx->pix_fmt = PIX_FMT_YUV420P;
1963 1964
    if(avctx->idct_algo==FF_IDCT_AUTO)
        avctx->idct_algo=FF_IDCT_VP3;
1965
    dsputil_init(&s->dsp, avctx);
1966

M
Michael Niedermayer 已提交
1967
    ff_init_scantable(s->dsp.idct_permutation, &s->scantable, ff_zigzag_direct);
1968 1969 1970 1971 1972

    /* initialize to an impossible value which will force a recalculation
     * in the first frame decode */
    s->quality_index = -1;

1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986
    s->y_superblock_width = (s->width + 31) / 32;
    s->y_superblock_height = (s->height + 31) / 32;
    y_superblock_count = s->y_superblock_width * s->y_superblock_height;

    /* work out the dimensions for the C planes */
    c_width = s->width / 2;
    c_height = s->height / 2;
    s->c_superblock_width = (c_width + 31) / 32;
    s->c_superblock_height = (c_height + 31) / 32;
    c_superblock_count = s->c_superblock_width * s->c_superblock_height;

    s->superblock_count = y_superblock_count + (c_superblock_count * 2);
    s->u_superblock_start = y_superblock_count;
    s->v_superblock_start = s->u_superblock_start + c_superblock_count;
1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997
    s->superblock_coding = av_malloc(s->superblock_count);

    s->macroblock_width = (s->width + 15) / 16;
    s->macroblock_height = (s->height + 15) / 16;
    s->macroblock_count = s->macroblock_width * s->macroblock_height;

    s->fragment_width = s->width / FRAGMENT_PIXELS;
    s->fragment_height = s->height / FRAGMENT_PIXELS;

    /* fragment count covers all 8x8 blocks for all 3 planes */
    s->fragment_count = s->fragment_width * s->fragment_height * 3 / 2;
M
Michael Niedermayer 已提交
1998 1999
    s->fragment_start[1] = s->fragment_width * s->fragment_height;
    s->fragment_start[2] = s->fragment_width * s->fragment_height * 5 / 4;
2000

2001 2002 2003 2004 2005 2006
    debug_init("  Y plane: %d x %d\n", s->width, s->height);
    debug_init("  C plane: %d x %d\n", c_width, c_height);
    debug_init("  Y superblocks: %d x %d, %d total\n",
        s->y_superblock_width, s->y_superblock_height, y_superblock_count);
    debug_init("  C superblocks: %d x %d, %d total\n",
        s->c_superblock_width, s->c_superblock_height, c_superblock_count);
2007
    debug_init("  total superblocks = %d, U starts @ %d, V starts @ %d\n",
2008
        s->superblock_count, s->u_superblock_start, s->v_superblock_start);
2009 2010 2011 2012 2013 2014
    debug_init("  macroblocks: %d x %d, %d total\n",
        s->macroblock_width, s->macroblock_height, s->macroblock_count);
    debug_init("  %d fragments, %d x %d, u starts @ %d, v starts @ %d\n",
        s->fragment_count,
        s->fragment_width,
        s->fragment_height,
M
Michael Niedermayer 已提交
2015 2016
        s->fragment_start[1],
        s->fragment_start[2]);
2017 2018

    s->all_fragments = av_malloc(s->fragment_count * sizeof(Vp3Fragment));
2019
    s->coeff_counts = av_malloc(s->fragment_count * sizeof(*s->coeff_counts));
2020
    s->coeffs = av_malloc(s->fragment_count * sizeof(Coeff) * 65);
2021
    s->coded_fragment_list = av_malloc(s->fragment_count * sizeof(int));
D
Diego Biurrun 已提交
2022
    s->pixel_addresses_initialized = 0;
2023

2024 2025
    if (!s->theora_tables)
    {
M
cleanup  
Michael Niedermayer 已提交
2026
        for (i = 0; i < 64; i++) {
2027 2028
            s->coded_dc_scale_factor[i] = vp31_dc_scale_factor[i];
            s->coded_ac_scale_factor[i] = vp31_ac_scale_factor[i];
2029 2030 2031
            s->base_matrix[0][i] = vp31_intra_y_dequant[i];
            s->base_matrix[1][i] = vp31_intra_c_dequant[i];
            s->base_matrix[2][i] = vp31_inter_dequant[i];
2032
            s->filter_limit_values[i] = vp31_filter_limit_values[i];
M
cleanup  
Michael Niedermayer 已提交
2033
        }
2034

2035 2036 2037 2038 2039 2040 2041 2042 2043
        for(inter=0; inter<2; inter++){
            for(plane=0; plane<3; plane++){
                s->qr_count[inter][plane]= 1;
                s->qr_size [inter][plane][0]= 63;
                s->qr_base [inter][plane][0]=
                s->qr_base [inter][plane][1]= 2*inter + (!!plane)*!inter;
            }
        }

2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099
        /* init VLC tables */
        for (i = 0; i < 16; i++) {

            /* DC histograms */
            init_vlc(&s->dc_vlc[i], 5, 32,
                &dc_bias[i][0][1], 4, 2,
                &dc_bias[i][0][0], 4, 2, 0);

            /* group 1 AC histograms */
            init_vlc(&s->ac_vlc_1[i], 5, 32,
                &ac_bias_0[i][0][1], 4, 2,
                &ac_bias_0[i][0][0], 4, 2, 0);

            /* group 2 AC histograms */
            init_vlc(&s->ac_vlc_2[i], 5, 32,
                &ac_bias_1[i][0][1], 4, 2,
                &ac_bias_1[i][0][0], 4, 2, 0);

            /* group 3 AC histograms */
            init_vlc(&s->ac_vlc_3[i], 5, 32,
                &ac_bias_2[i][0][1], 4, 2,
                &ac_bias_2[i][0][0], 4, 2, 0);

            /* group 4 AC histograms */
            init_vlc(&s->ac_vlc_4[i], 5, 32,
                &ac_bias_3[i][0][1], 4, 2,
                &ac_bias_3[i][0][0], 4, 2, 0);
        }
    } else {
        for (i = 0; i < 16; i++) {

            /* DC histograms */
            init_vlc(&s->dc_vlc[i], 5, 32,
                &s->huffman_table[i][0][1], 4, 2,
                &s->huffman_table[i][0][0], 4, 2, 0);

            /* group 1 AC histograms */
            init_vlc(&s->ac_vlc_1[i], 5, 32,
                &s->huffman_table[i+16][0][1], 4, 2,
                &s->huffman_table[i+16][0][0], 4, 2, 0);

            /* group 2 AC histograms */
            init_vlc(&s->ac_vlc_2[i], 5, 32,
                &s->huffman_table[i+16*2][0][1], 4, 2,
                &s->huffman_table[i+16*2][0][0], 4, 2, 0);

            /* group 3 AC histograms */
            init_vlc(&s->ac_vlc_3[i], 5, 32,
                &s->huffman_table[i+16*3][0][1], 4, 2,
                &s->huffman_table[i+16*3][0][0], 4, 2, 0);

            /* group 4 AC histograms */
            init_vlc(&s->ac_vlc_4[i], 5, 32,
                &s->huffman_table[i+16*4][0][1], 4, 2,
                &s->huffman_table[i+16*4][0][0], 4, 2, 0);
        }
2100 2101
    }

2102 2103 2104 2105
    init_vlc(&s->superblock_run_length_vlc, 6, 34,
        &superblock_run_length_vlc_table[0][1], 4, 2,
        &superblock_run_length_vlc_table[0][0], 4, 2, 0);

2106
    init_vlc(&s->fragment_run_length_vlc, 5, 30,
2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117
        &fragment_run_length_vlc_table[0][1], 4, 2,
        &fragment_run_length_vlc_table[0][0], 4, 2, 0);

    init_vlc(&s->mode_code_vlc, 3, 8,
        &mode_code_vlc_table[0][1], 2, 1,
        &mode_code_vlc_table[0][0], 2, 1, 0);

    init_vlc(&s->motion_vector_vlc, 6, 63,
        &motion_vector_vlc_table[0][1], 2, 1,
        &motion_vector_vlc_table[0][0], 2, 1, 0);

2118 2119 2120 2121
    /* work out the block mapping tables */
    s->superblock_fragments = av_malloc(s->superblock_count * 16 * sizeof(int));
    s->superblock_macroblocks = av_malloc(s->superblock_count * 4 * sizeof(int));
    s->macroblock_fragments = av_malloc(s->macroblock_count * 6 * sizeof(int));
2122
    s->macroblock_coding = av_malloc(s->macroblock_count + 1);
2123 2124
    init_block_mapping(s);

2125 2126 2127 2128
    for (i = 0; i < 3; i++) {
        s->current_frame.data[i] = NULL;
        s->last_frame.data[i] = NULL;
        s->golden_frame.data[i] = NULL;
2129 2130
    }

2131 2132 2133 2134 2135 2136
    return 0;
}

/*
 * This is the ffmpeg/libavcodec API frame decode function.
 */
2137
static int vp3_decode_frame(AVCodecContext *avctx,
2138
                            void *data, int *data_size,
M
const  
Michael Niedermayer 已提交
2139
                            const uint8_t *buf, int buf_size)
2140 2141 2142 2143
{
    Vp3DecodeContext *s = avctx->priv_data;
    GetBitContext gb;
    static int counter = 0;
2144
    int i;
2145 2146

    init_get_bits(&gb, buf, buf_size * 8);
2147

2148 2149
    if (s->theora && get_bits1(&gb))
    {
2150 2151
        av_log(avctx, AV_LOG_ERROR, "Header packet passed to frame decoder, skipping\n");
        return -1;
2152
    }
A
Alex Beregszaszi 已提交
2153 2154 2155

    s->keyframe = !get_bits1(&gb);
    if (!s->theora)
2156
        skip_bits(&gb, 1);
A
Alex Beregszaszi 已提交
2157
    s->last_quality_index = s->quality_index;
2158 2159 2160 2161 2162 2163 2164

    s->nqis=0;
    do{
        s->qis[s->nqis++]= get_bits(&gb, 6);
    } while(s->theora >= 0x030200 && s->nqis<3 && get_bits1(&gb));

    s->quality_index= s->qis[0];
2165

2166
    if (s->avctx->debug & FF_DEBUG_PICT_INFO)
2167 2168
        av_log(s->avctx, AV_LOG_INFO, " VP3 %sframe #%d: Q index = %d\n",
            s->keyframe?"key":"", counter, s->quality_index);
2169 2170
    counter++;

2171
    if (s->quality_index != s->last_quality_index) {
2172
        init_dequantizer(s);
2173 2174
        init_loop_filter(s);
    }
2175

2176 2177 2178
    if (avctx->skip_frame >= AVDISCARD_NONKEY && !s->keyframe)
        return buf_size;

2179
    if (s->keyframe) {
2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196
        if (!s->theora)
        {
            skip_bits(&gb, 4); /* width code */
            skip_bits(&gb, 4); /* height code */
            if (s->version)
            {
                s->version = get_bits(&gb, 5);
                if (counter == 1)
                    av_log(s->avctx, AV_LOG_DEBUG, "VP version: %d\n", s->version);
            }
        }
        if (s->version || s->theora)
        {
                if (get_bits1(&gb))
                    av_log(s->avctx, AV_LOG_ERROR, "Warning, unsupported keyframe coding type?!\n");
            skip_bits(&gb, 2); /* reserved? */
        }
A
Alex Beregszaszi 已提交
2197

2198 2199 2200
        if (s->last_frame.data[0] == s->golden_frame.data[0]) {
            if (s->golden_frame.data[0])
                avctx->release_buffer(avctx, &s->golden_frame);
2201
            s->last_frame= s->golden_frame; /* ensure that we catch any access to this released frame */
2202 2203 2204 2205 2206 2207
        } else {
            if (s->golden_frame.data[0])
                avctx->release_buffer(avctx, &s->golden_frame);
            if (s->last_frame.data[0])
                avctx->release_buffer(avctx, &s->last_frame);
        }
2208

2209
        s->golden_frame.reference = 3;
2210
        if(avctx->get_buffer(avctx, &s->golden_frame) < 0) {
2211
            av_log(s->avctx, AV_LOG_ERROR, "vp3: get_buffer() failed\n");
2212 2213 2214 2215
            return -1;
        }

        /* golden frame is also the current frame */
M
Michael Niedermayer 已提交
2216
        s->current_frame= s->golden_frame;
2217 2218

        /* time to figure out pixel addresses? */
D
Diego Biurrun 已提交
2219
        if (!s->pixel_addresses_initialized)
2220 2221 2222 2223 2224
        {
            if (!s->flipped_image)
                vp3_calculate_pixel_addresses(s);
            else
                theora_calculate_pixel_addresses(s);
D
Diego Biurrun 已提交
2225
            s->pixel_addresses_initialized = 1;
2226
        }
2227 2228
    } else {
        /* allocate a new current frame */
2229
        s->current_frame.reference = 3;
D
Diego Biurrun 已提交
2230
        if (!s->pixel_addresses_initialized) {
2231 2232 2233
            av_log(s->avctx, AV_LOG_ERROR, "vp3: first frame not a keyframe\n");
            return -1;
        }
2234
        if(avctx->get_buffer(avctx, &s->current_frame) < 0) {
2235
            av_log(s->avctx, AV_LOG_ERROR, "vp3: get_buffer() failed\n");
2236 2237 2238 2239
            return -1;
        }
    }

M
Michael Niedermayer 已提交
2240 2241 2242
    s->current_frame.qscale_table= s->qscale_table; //FIXME allocate individual tables per AVFrame
    s->current_frame.qstride= 0;

2243 2244
    init_frame(s, &gb);

M
Michael Niedermayer 已提交
2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258
    if (unpack_superblocks(s, &gb)){
        av_log(s->avctx, AV_LOG_ERROR, "error in unpack_superblocks\n");
        return -1;
    }
    if (unpack_modes(s, &gb)){
        av_log(s->avctx, AV_LOG_ERROR, "error in unpack_modes\n");
        return -1;
    }
    if (unpack_vectors(s, &gb)){
        av_log(s->avctx, AV_LOG_ERROR, "error in unpack_vectors\n");
        return -1;
    }
    if (unpack_dct_coeffs(s, &gb)){
        av_log(s->avctx, AV_LOG_ERROR, "error in unpack_dct_coeffs\n");
2259 2260
        return -1;
    }
2261 2262

    reverse_dc_prediction(s, 0, s->fragment_width, s->fragment_height);
2263
    if ((avctx->flags & CODEC_FLAG_GRAY) == 0) {
M
Michael Niedermayer 已提交
2264
        reverse_dc_prediction(s, s->fragment_start[1],
2265
            s->fragment_width / 2, s->fragment_height / 2);
M
Michael Niedermayer 已提交
2266
        reverse_dc_prediction(s, s->fragment_start[2],
2267
            s->fragment_width / 2, s->fragment_height / 2);
2268 2269 2270 2271
    }

    for (i = 0; i < s->macroblock_height; i++)
        render_slice(s, i);
2272

2273
    apply_loop_filter(s);
2274

2275 2276 2277
    *data_size=sizeof(AVFrame);
    *(AVFrame*)data= s->current_frame;

2278 2279 2280 2281 2282
    /* release the last frame, if it is allocated and if it is not the
     * golden frame */
    if ((s->last_frame.data[0]) &&
        (s->last_frame.data[0] != s->golden_frame.data[0]))
        avctx->release_buffer(avctx, &s->last_frame);
2283

2284
    /* shuffle frames (last = current) */
M
Michael Niedermayer 已提交
2285
    s->last_frame= s->current_frame;
2286
    s->current_frame.data[0]= NULL; /* ensure that we catch any access to this released frame */
2287 2288 2289 2290 2291 2292 2293

    return buf_size;
}

/*
 * This is the ffmpeg/libavcodec API module cleanup function.
 */
2294
static av_cold int vp3_decode_end(AVCodecContext *avctx)
2295 2296
{
    Vp3DecodeContext *s = avctx->priv_data;
2297
    int i;
2298

2299
    av_free(s->superblock_coding);
2300
    av_free(s->all_fragments);
2301
    av_free(s->coeff_counts);
2302
    av_free(s->coeffs);
2303 2304 2305 2306
    av_free(s->coded_fragment_list);
    av_free(s->superblock_fragments);
    av_free(s->superblock_macroblocks);
    av_free(s->macroblock_fragments);
2307
    av_free(s->macroblock_coding);
2308

2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321
    for (i = 0; i < 16; i++) {
        free_vlc(&s->dc_vlc[i]);
        free_vlc(&s->ac_vlc_1[i]);
        free_vlc(&s->ac_vlc_2[i]);
        free_vlc(&s->ac_vlc_3[i]);
        free_vlc(&s->ac_vlc_4[i]);
    }

    free_vlc(&s->superblock_run_length_vlc);
    free_vlc(&s->fragment_run_length_vlc);
    free_vlc(&s->mode_code_vlc);
    free_vlc(&s->motion_vector_vlc);

2322
    /* release all frames */
2323
    if (s->golden_frame.data[0] && s->golden_frame.data[0] != s->last_frame.data[0])
2324 2325 2326 2327 2328
        avctx->release_buffer(avctx, &s->golden_frame);
    if (s->last_frame.data[0])
        avctx->release_buffer(avctx, &s->last_frame);
    /* no need to release the current_frame since it will always be pointing
     * to the same frame as either the golden or last frame */
2329 2330 2331 2332

    return 0;
}

2333 2334 2335 2336
static int read_huffman_tree(AVCodecContext *avctx, GetBitContext *gb)
{
    Vp3DecodeContext *s = avctx->priv_data;

2337
    if (get_bits1(gb)) {
2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364
        int token;
        if (s->entries >= 32) { /* overflow */
            av_log(avctx, AV_LOG_ERROR, "huffman tree overflow\n");
            return -1;
        }
        token = get_bits(gb, 5);
        //av_log(avctx, AV_LOG_DEBUG, "hti %d hbits %x token %d entry : %d size %d\n", s->hti, s->hbits, token, s->entries, s->huff_code_size);
        s->huffman_table[s->hti][token][0] = s->hbits;
        s->huffman_table[s->hti][token][1] = s->huff_code_size;
        s->entries++;
    }
    else {
        if (s->huff_code_size >= 32) {/* overflow */
            av_log(avctx, AV_LOG_ERROR, "huffman tree overflow\n");
            return -1;
        }
        s->huff_code_size++;
        s->hbits <<= 1;
        read_huffman_tree(avctx, gb);
        s->hbits |= 1;
        read_huffman_tree(avctx, gb);
        s->hbits >>= 1;
        s->huff_code_size--;
    }
    return 0;
}

2365
#ifdef CONFIG_THEORA_DECODER
2366
static int theora_decode_header(AVCodecContext *avctx, GetBitContext *gb)
2367 2368
{
    Vp3DecodeContext *s = avctx->priv_data;
2369
    int visible_width, visible_height;
2370

2371
    s->theora = get_bits_long(gb, 24);
2372
    av_log(avctx, AV_LOG_DEBUG, "Theora bitstream version %X\n", s->theora);
2373

M
Matthieu Castet 已提交
2374
    /* 3.2.0 aka alpha3 has the same frame orientation as original vp3 */
2375
    /* but previous versions have the image flipped relative to vp3 */
M
Matthieu Castet 已提交
2376
    if (s->theora < 0x030200)
2377
    {
2378
        s->flipped_image = 1;
2379 2380
        av_log(avctx, AV_LOG_DEBUG, "Old (<alpha3) Theora bitstream, flipped image\n");
    }
2381

2382 2383
    s->width = get_bits(gb, 16) << 4;
    s->height = get_bits(gb, 16) << 4;
2384

2385
    if(avcodec_check_dimensions(avctx, s->width, s->height)){
2386
        av_log(avctx, AV_LOG_ERROR, "Invalid dimensions (%dx%d)\n", s->width, s->height);
2387 2388 2389
        s->width= s->height= 0;
        return -1;
    }
2390 2391 2392

    if (s->theora >= 0x030400)
    {
2393
        skip_bits(gb, 32); /* total number of superblocks in a frame */
2394
        // fixme, the next field is 36bits long
2395 2396 2397
        skip_bits(gb, 32); /* total number of blocks in a frame */
        skip_bits(gb, 4); /* total number of blocks in a frame */
        skip_bits(gb, 32); /* total number of macroblocks in a frame */
2398
    }
2399

2400 2401 2402
    visible_width  = get_bits_long(gb, 24);
    visible_height = get_bits_long(gb, 24);

2403 2404 2405 2406
    if (s->theora >= 0x030200) {
        skip_bits(gb, 8); /* offset x */
        skip_bits(gb, 8); /* offset y */
    }
2407

2408 2409 2410 2411
    skip_bits(gb, 32); /* fps numerator */
    skip_bits(gb, 32); /* fps denumerator */
    skip_bits(gb, 24); /* aspect numerator */
    skip_bits(gb, 24); /* aspect denumerator */
2412

M
Matthieu Castet 已提交
2413
    if (s->theora < 0x030200)
2414 2415
        skip_bits(gb, 5); /* keyframe frequency force */
    skip_bits(gb, 8); /* colorspace */
2416
    if (s->theora >= 0x030400)
2417 2418
        skip_bits(gb, 2); /* pixel format: 420,res,422,444 */
    skip_bits(gb, 24); /* bitrate */
2419

2420
    skip_bits(gb, 6); /* quality hint */
2421

M
Matthieu Castet 已提交
2422
    if (s->theora >= 0x030200)
2423
    {
2424
        skip_bits(gb, 5); /* keyframe frequency force */
2425

2426
        if (s->theora < 0x030400)
2427
            skip_bits(gb, 5); /* spare bits */
2428
    }
2429

2430
//    align_get_bits(gb);
2431

2432 2433 2434 2435 2436
    if (   visible_width  <= s->width  && visible_width  > s->width-16
        && visible_height <= s->height && visible_height > s->height-16)
        avcodec_set_dimensions(avctx, visible_width, visible_height);
    else
        avcodec_set_dimensions(avctx, s->width, s->height);
2437 2438 2439 2440

    return 0;
}

2441
static int theora_decode_tables(AVCodecContext *avctx, GetBitContext *gb)
2442 2443
{
    Vp3DecodeContext *s = avctx->priv_data;
2444
    int i, n, matrices, inter, plane;
M
Matthieu Castet 已提交
2445 2446

    if (s->theora >= 0x030200) {
2447
        n = get_bits(gb, 3);
2448
        /* loop filter limit values table */
M
Matthieu Castet 已提交
2449
        for (i = 0; i < 64; i++)
2450
            s->filter_limit_values[i] = get_bits(gb, n);
M
Matthieu Castet 已提交
2451
    }
2452

M
Matthieu Castet 已提交
2453
    if (s->theora >= 0x030200)
2454
        n = get_bits(gb, 4) + 1;
M
Matthieu Castet 已提交
2455 2456
    else
        n = 16;
2457 2458
    /* quality threshold table */
    for (i = 0; i < 64; i++)
2459
        s->coded_ac_scale_factor[i] = get_bits(gb, n);
2460

M
Matthieu Castet 已提交
2461
    if (s->theora >= 0x030200)
2462
        n = get_bits(gb, 4) + 1;
M
Matthieu Castet 已提交
2463 2464
    else
        n = 16;
2465 2466
    /* dc scale factor table */
    for (i = 0; i < 64; i++)
2467
        s->coded_dc_scale_factor[i] = get_bits(gb, n);
2468

M
Matthieu Castet 已提交
2469
    if (s->theora >= 0x030200)
2470
        matrices = get_bits(gb, 9) + 1;
M
Matthieu Castet 已提交
2471
    else
2472
        matrices = 3;
2473

2474 2475 2476 2477
    if(matrices > 384){
        av_log(avctx, AV_LOG_ERROR, "invalid number of base matrixes\n");
        return -1;
    }
A
Alex Beregszaszi 已提交
2478

2479
    for(n=0; n<matrices; n++){
2480
        for (i = 0; i < 64; i++)
2481 2482
            s->base_matrix[n][i]= get_bits(gb, 8);
    }
2483

2484 2485 2486 2487
    for (inter = 0; inter <= 1; inter++) {
        for (plane = 0; plane <= 2; plane++) {
            int newqr= 1;
            if (inter || plane > 0)
2488
                newqr = get_bits1(gb);
2489
            if (!newqr) {
2490
                int qtj, plj;
2491
                if(inter && get_bits1(gb)){
2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502
                    qtj = 0;
                    plj = plane;
                }else{
                    qtj= (3*inter + plane - 1) / 3;
                    plj= (plane + 2) % 3;
                }
                s->qr_count[inter][plane]= s->qr_count[qtj][plj];
                memcpy(s->qr_size[inter][plane], s->qr_size[qtj][plj], sizeof(s->qr_size[0][0]));
                memcpy(s->qr_base[inter][plane], s->qr_base[qtj][plj], sizeof(s->qr_base[0][0]));
            } else {
                int qri= 0;
2503
                int qi = 0;
2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516

                for(;;){
                    i= get_bits(gb, av_log2(matrices-1)+1);
                    if(i>= matrices){
                        av_log(avctx, AV_LOG_ERROR, "invalid base matrix index\n");
                        return -1;
                    }
                    s->qr_base[inter][plane][qri]= i;
                    if(qi >= 63)
                        break;
                    i = get_bits(gb, av_log2(63-qi)+1) + 1;
                    s->qr_size[inter][plane][qri++]= i;
                    qi += i;
2517
                }
2518

2519
                if (qi > 63) {
2520
                    av_log(avctx, AV_LOG_ERROR, "invalid qi %d > 63\n", qi);
2521 2522
                    return -1;
                }
2523
                s->qr_count[inter][plane]= qri;
2524 2525 2526 2527
            }
        }
    }

2528
    /* Huffman tables */
2529 2530 2531
    for (s->hti = 0; s->hti < 80; s->hti++) {
        s->entries = 0;
        s->huff_code_size = 1;
2532
        if (!get_bits1(gb)) {
2533
            s->hbits = 0;
2534
            read_huffman_tree(avctx, gb);
2535
            s->hbits = 1;
2536
            read_huffman_tree(avctx, gb);
2537 2538
        }
    }
2539

2540
    s->theora_tables = 1;
2541

2542 2543 2544 2545 2546 2547 2548 2549
    return 0;
}

static int theora_decode_init(AVCodecContext *avctx)
{
    Vp3DecodeContext *s = avctx->priv_data;
    GetBitContext gb;
    int ptype;
2550 2551 2552
    uint8_t *header_start[3];
    int header_len[3];
    int i;
2553

2554 2555 2556
    s->theora = 1;

    if (!avctx->extradata_size)
2557 2558
    {
        av_log(avctx, AV_LOG_ERROR, "Missing extradata!\n");
2559
        return -1;
2560
    }
2561

2562 2563 2564 2565 2566
    if (ff_split_xiph_headers(avctx->extradata, avctx->extradata_size,
                              42, header_start, header_len) < 0) {
        av_log(avctx, AV_LOG_ERROR, "Corrupt extradata\n");
        return -1;
    }
2567

2568 2569
  for(i=0;i<3;i++) {
    init_get_bits(&gb, header_start[i], header_len[i]);
2570 2571 2572

    ptype = get_bits(&gb, 8);
    debug_vp3("Theora headerpacket type: %x\n", ptype);
2573

2574 2575 2576
     if (!(ptype & 0x80))
     {
        av_log(avctx, AV_LOG_ERROR, "Invalid extradata!\n");
2577
//        return -1;
2578
     }
2579

2580
    // FIXME: Check for this as well.
2581
    skip_bits(&gb, 6*8); /* "theora" */
2582

2583 2584 2585
    switch(ptype)
    {
        case 0x80:
2586
            theora_decode_header(avctx, &gb);
2587 2588
                break;
        case 0x81:
2589
// FIXME: is this needed? it breaks sometimes
2590 2591 2592
//            theora_decode_comments(avctx, gb);
            break;
        case 0x82:
2593
            theora_decode_tables(avctx, &gb);
2594 2595 2596 2597
            break;
        default:
            av_log(avctx, AV_LOG_ERROR, "Unknown Theora config packet: %d\n", ptype&~0x80);
            break;
2598
    }
2599 2600
    if(8*header_len[i] != get_bits_count(&gb))
        av_log(avctx, AV_LOG_ERROR, "%d bits left in packet %X\n", 8*header_len[i] - get_bits_count(&gb), ptype);
2601 2602
    if (s->theora < 0x030200)
        break;
2603
  }
2604

M
Matthieu Castet 已提交
2605
    vp3_decode_init(avctx);
2606 2607 2608
    return 0;
}

2609 2610
AVCodec theora_decoder = {
    "theora",
2611
    CODEC_TYPE_VIDEO,
2612
    CODEC_ID_THEORA,
2613
    sizeof(Vp3DecodeContext),
2614
    theora_decode_init,
2615 2616 2617 2618
    NULL,
    vp3_decode_end,
    vp3_decode_frame,
    0,
2619
    NULL,
2620
    .long_name = NULL_IF_CONFIG_SMALL("Theora"),
2621
};
2622
#endif
2623

2624 2625
AVCodec vp3_decoder = {
    "vp3",
2626
    CODEC_TYPE_VIDEO,
2627
    CODEC_ID_VP3,
2628
    sizeof(Vp3DecodeContext),
2629
    vp3_decode_init,
2630 2631 2632 2633
    NULL,
    vp3_decode_end,
    vp3_decode_frame,
    0,
2634
    NULL,
2635
    .long_name = NULL_IF_CONFIG_SMALL("On2 VP3"),
2636
};