]> git.sesse.net Git - ffmpeg/blob - libavcodec/vp3.c
* fixing a bug in avpicture_layout (PAL8 wasn't handled properly)
[ffmpeg] / libavcodec / vp3.c
1 /*
2  *
3  * Copyright (C) 2003 the ffmpeg project
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18  *
19  * VP3 Video Decoder by Mike Melanson (melanson@pcisys.net)
20  *
21  */
22
23 /**
24  * @file vp3.c
25  * On2 VP3 Video Decoder
26  */
27
28 #include <stdio.h>
29 #include <stdlib.h>
30 #include <string.h>
31 #include <unistd.h>
32
33 #include "common.h"
34 #include "avcodec.h"
35 #include "dsputil.h"
36 #include "mpegvideo.h"
37 #include "dsputil.h"
38 #include "bswap.h"
39
40 #include "vp3data.h"
41
42 #define FRAGMENT_PIXELS 8
43
44 /* 
45  * Debugging Variables
46  * 
47  * Define one or more of the following compile-time variables to 1 to obtain
48  * elaborate information about certain aspects of the decoding process.
49  *
50  * KEYFRAMES_ONLY: set this to 1 to only see keyframes (VP3 slideshow mode)
51  * DEBUG_VP3: high-level decoding flow
52  * DEBUG_INIT: initialization parameters
53  * DEBUG_DEQUANTIZERS: display how the dequanization tables are built
54  * DEBUG_BLOCK_CODING: unpacking the superblock/macroblock/fragment coding
55  * DEBUG_MODES: unpacking the coding modes for individual fragments
56  * DEBUG_VECTORS: display the motion vectors
57  * DEBUG_TOKEN: display exhaustive information about each DCT token
58  * DEBUG_VLC: display the VLCs as they are extracted from the stream
59  * DEBUG_DC_PRED: display the process of reversing DC prediction
60  * DEBUG_IDCT: show every detail of the IDCT process
61  */
62
63 #define KEYFRAMES_ONLY 0
64
65 #define DEBUG_VP3 0
66 #define DEBUG_INIT 0
67 #define DEBUG_DEQUANTIZERS 0
68 #define DEBUG_BLOCK_CODING 0
69 #define DEBUG_MODES 0
70 #define DEBUG_VECTORS 0
71 #define DEBUG_TOKEN 0
72 #define DEBUG_VLC 0
73 #define DEBUG_DC_PRED 0
74 #define DEBUG_IDCT 0
75
76 #if DEBUG_VP3
77 #define debug_vp3 printf
78 #else
79 static inline void debug_vp3(const char *format, ...) { }
80 #endif
81
82 #if DEBUG_INIT
83 #define debug_init printf
84 #else
85 static inline void debug_init(const char *format, ...) { }
86 #endif
87
88 #if DEBUG_DEQUANTIZERS
89 #define debug_dequantizers printf 
90 #else
91 static inline void debug_dequantizers(const char *format, ...) { } 
92 #endif
93
94 #if DEBUG_BLOCK_CODING
95 #define debug_block_coding printf 
96 #else
97 static inline void debug_block_coding(const char *format, ...) { } 
98 #endif
99
100 #if DEBUG_MODES
101 #define debug_modes printf 
102 #else
103 static inline void debug_modes(const char *format, ...) { } 
104 #endif
105
106 #if DEBUG_VECTORS
107 #define debug_vectors printf 
108 #else
109 static inline void debug_vectors(const char *format, ...) { } 
110 #endif
111
112 #if DEBUG_TOKEN 
113 #define debug_token printf 
114 #else
115 static inline void debug_token(const char *format, ...) { } 
116 #endif
117
118 #if DEBUG_VLC
119 #define debug_vlc printf 
120 #else
121 static inline void debug_vlc(const char *format, ...) { } 
122 #endif
123
124 #if DEBUG_DC_PRED
125 #define debug_dc_pred printf 
126 #else
127 static inline void debug_dc_pred(const char *format, ...) { } 
128 #endif
129
130 #if DEBUG_IDCT
131 #define debug_idct printf 
132 #else
133 static inline void debug_idct(const char *format, ...) { } 
134 #endif
135
136 typedef struct Vp3Fragment {
137     DCTELEM coeffs[64];
138     int coding_method;
139     int coeff_count;
140     int last_coeff;
141     int motion_x;
142     int motion_y;
143     /* this indicates which ffmpeg put_pixels() function to use:
144      * 00b = no halfpel, 01b = x halfpel, 10b = y halfpel, 11b = both halfpel */
145     int motion_halfpel_index;
146     /* address of first pixel taking into account which plane the fragment
147      * lives on as well as the plane stride */
148     int first_pixel;
149     /* this is the macroblock that the fragment belongs to */
150     int macroblock;
151 } Vp3Fragment;
152
153 #define SB_NOT_CODED        0
154 #define SB_PARTIALLY_CODED  1
155 #define SB_FULLY_CODED      2
156
157 #define MODE_INTER_NO_MV      0
158 #define MODE_INTRA            1
159 #define MODE_INTER_PLUS_MV    2
160 #define MODE_INTER_LAST_MV    3
161 #define MODE_INTER_PRIOR_LAST 4
162 #define MODE_USING_GOLDEN     5
163 #define MODE_GOLDEN_MV        6
164 #define MODE_INTER_FOURMV     7
165 #define CODING_MODE_COUNT     8
166
167 /* special internal mode */
168 #define MODE_COPY             8
169
170 /* There are 6 preset schemes, plus a free-form scheme */
171 static int ModeAlphabet[7][CODING_MODE_COUNT] =
172 {
173     /* this is the custom scheme */
174     { 0, 0, 0, 0, 0, 0, 0, 0 },
175
176     /* scheme 1: Last motion vector dominates */
177     {    MODE_INTER_LAST_MV,    MODE_INTER_PRIOR_LAST,  
178          MODE_INTER_PLUS_MV,    MODE_INTER_NO_MV,
179          MODE_INTRA,            MODE_USING_GOLDEN,      
180          MODE_GOLDEN_MV,        MODE_INTER_FOURMV },
181
182     /* scheme 2 */
183     {    MODE_INTER_LAST_MV,    MODE_INTER_PRIOR_LAST,  
184          MODE_INTER_NO_MV,      MODE_INTER_PLUS_MV,
185          MODE_INTRA,            MODE_USING_GOLDEN,      
186          MODE_GOLDEN_MV,        MODE_INTER_FOURMV },
187
188     /* scheme 3 */
189     {    MODE_INTER_LAST_MV,    MODE_INTER_PLUS_MV,     
190          MODE_INTER_PRIOR_LAST, MODE_INTER_NO_MV,
191          MODE_INTRA,            MODE_USING_GOLDEN,      
192          MODE_GOLDEN_MV,        MODE_INTER_FOURMV },
193
194     /* scheme 4 */
195     {    MODE_INTER_LAST_MV,    MODE_INTER_PLUS_MV,     
196          MODE_INTER_NO_MV,      MODE_INTER_PRIOR_LAST,
197          MODE_INTRA,            MODE_USING_GOLDEN,      
198          MODE_GOLDEN_MV,        MODE_INTER_FOURMV },
199
200     /* scheme 5: No motion vector dominates */
201     {    MODE_INTER_NO_MV,      MODE_INTER_LAST_MV,     
202          MODE_INTER_PRIOR_LAST, MODE_INTER_PLUS_MV,
203          MODE_INTRA,            MODE_USING_GOLDEN,      
204          MODE_GOLDEN_MV,        MODE_INTER_FOURMV },
205
206     /* scheme 6 */
207     {    MODE_INTER_NO_MV,      MODE_USING_GOLDEN,      
208          MODE_INTER_LAST_MV,    MODE_INTER_PRIOR_LAST,
209          MODE_INTER_PLUS_MV,    MODE_INTRA,             
210          MODE_GOLDEN_MV,        MODE_INTER_FOURMV },
211
212 };
213
214 #define MIN_DEQUANT_VAL 2
215
216 typedef struct Vp3DecodeContext {
217     AVCodecContext *avctx;
218     int width, height;
219     AVFrame golden_frame;
220     AVFrame last_frame;
221     AVFrame current_frame;
222     int keyframe;
223     DSPContext dsp;
224
225     int quality_index;
226     int last_quality_index;
227
228     int superblock_count;
229     int superblock_width;
230     int superblock_height;
231     int y_superblock_width;
232     int y_superblock_height;
233     int c_superblock_width;
234     int c_superblock_height;
235     int u_superblock_start;
236     int v_superblock_start;
237     unsigned char *superblock_coding;
238
239     int macroblock_count;
240     int macroblock_width;
241     int macroblock_height;
242
243     int fragment_count;
244     int fragment_width;
245     int fragment_height;
246
247     Vp3Fragment *all_fragments;
248     int u_fragment_start;
249     int v_fragment_start;
250
251     /* this is a list of indices into the all_fragments array indicating
252      * which of the fragments are coded */
253     int *coded_fragment_list;
254     int coded_fragment_list_index;
255     int pixel_addresses_inited;
256
257     VLC dc_vlc[16];
258     VLC ac_vlc_1[16];
259     VLC ac_vlc_2[16];
260     VLC ac_vlc_3[16];
261     VLC ac_vlc_4[16];
262
263     int16_t intra_y_dequant[64];
264     int16_t intra_c_dequant[64];
265     int16_t inter_dequant[64];
266
267     /* This table contains superblock_count * 16 entries. Each set of 16
268      * numbers corresponds to the fragment indices 0..15 of the superblock.
269      * An entry will be -1 to indicate that no entry corresponds to that
270      * index. */
271     int *superblock_fragments;
272
273     /* This table contains superblock_count * 4 entries. Each set of 4
274      * numbers corresponds to the macroblock indices 0..3 of the superblock.
275      * An entry will be -1 to indicate that no entry corresponds to that
276      * index. */
277     int *superblock_macroblocks;
278
279     /* This table contains macroblock_count * 6 entries. Each set of 6
280      * numbers corresponds to the fragment indices 0..5 which comprise
281      * the macroblock (4 Y fragments and 2 C fragments). */
282     int *macroblock_fragments;
283     /* This is an array of that indicates how a particular 
284      * macroblock is coded. */
285     unsigned char *macroblock_coding;
286
287     int first_coded_y_fragment;
288     int first_coded_c_fragment;
289     int last_coded_y_fragment;
290     int last_coded_c_fragment;
291
292 } Vp3DecodeContext;
293
294 /************************************************************************
295  * VP3 specific functions
296  ************************************************************************/
297
298 /*
299  * This function sets up all of the various blocks mappings:
300  * superblocks <-> fragments, macroblocks <-> fragments,
301  * superblocks <-> macroblocks
302  *
303  * Returns 0 is successful; returns 1 if *anything* went wrong.
304  */
305 static int init_block_mapping(Vp3DecodeContext *s) 
306 {
307     int i, j;
308     signed int hilbert_walk_y[16];
309     signed int hilbert_walk_c[16];
310     signed int hilbert_walk_mb[4];
311
312     int current_fragment = 0;
313     int current_width = 0;
314     int current_height = 0;
315     int right_edge = 0;
316     int bottom_edge = 0;
317     int superblock_row_inc = 0;
318     int *hilbert = NULL;
319     int mapping_index = 0;
320
321     int current_macroblock;
322     int c_fragment;
323
324     signed char travel_width[16] = {
325          1,  1,  0, -1, 
326          0,  0,  1,  0,
327          1,  0,  1,  0,
328          0, -1,  0,  1
329     };
330
331     signed char travel_height[16] = {
332          0,  0,  1,  0,
333          1,  1,  0, -1,
334          0,  1,  0, -1,
335         -1,  0, -1,  0
336     };
337
338     signed char travel_width_mb[4] = {
339          1,  0,  1,  0
340     };
341
342     signed char travel_height_mb[4] = {
343          0,  1,  0, -1
344     };
345
346     debug_vp3("  vp3: initialize block mapping tables\n");
347
348     /* figure out hilbert pattern per these frame dimensions */
349     hilbert_walk_y[0]  = 1;
350     hilbert_walk_y[1]  = 1;
351     hilbert_walk_y[2]  = s->fragment_width;
352     hilbert_walk_y[3]  = -1;
353     hilbert_walk_y[4]  = s->fragment_width;
354     hilbert_walk_y[5]  = s->fragment_width;
355     hilbert_walk_y[6]  = 1;
356     hilbert_walk_y[7]  = -s->fragment_width;
357     hilbert_walk_y[8]  = 1;
358     hilbert_walk_y[9]  = s->fragment_width;
359     hilbert_walk_y[10]  = 1;
360     hilbert_walk_y[11] = -s->fragment_width;
361     hilbert_walk_y[12] = -s->fragment_width;
362     hilbert_walk_y[13] = -1;
363     hilbert_walk_y[14] = -s->fragment_width;
364     hilbert_walk_y[15] = 1;
365
366     hilbert_walk_c[0]  = 1;
367     hilbert_walk_c[1]  = 1;
368     hilbert_walk_c[2]  = s->fragment_width / 2;
369     hilbert_walk_c[3]  = -1;
370     hilbert_walk_c[4]  = s->fragment_width / 2;
371     hilbert_walk_c[5]  = s->fragment_width / 2;
372     hilbert_walk_c[6]  = 1;
373     hilbert_walk_c[7]  = -s->fragment_width / 2;
374     hilbert_walk_c[8]  = 1;
375     hilbert_walk_c[9]  = s->fragment_width / 2;
376     hilbert_walk_c[10]  = 1;
377     hilbert_walk_c[11] = -s->fragment_width / 2;
378     hilbert_walk_c[12] = -s->fragment_width / 2;
379     hilbert_walk_c[13] = -1;
380     hilbert_walk_c[14] = -s->fragment_width / 2;
381     hilbert_walk_c[15] = 1;
382
383     hilbert_walk_mb[0] = 1;
384     hilbert_walk_mb[1] = s->macroblock_width;
385     hilbert_walk_mb[2] = 1;
386     hilbert_walk_mb[3] = -s->macroblock_width;
387
388     /* iterate through each superblock (all planes) and map the fragments */
389     for (i = 0; i < s->superblock_count; i++) {
390         debug_init("    superblock %d (u starts @ %d, v starts @ %d)\n",
391             i, s->u_superblock_start, s->v_superblock_start);
392
393         /* time to re-assign the limits? */
394         if (i == 0) {
395
396             /* start of Y superblocks */
397             right_edge = s->fragment_width;
398             bottom_edge = s->fragment_height;
399             current_width = -1;
400             current_height = 0;
401             superblock_row_inc = 3 * s->fragment_width - 
402                 (s->y_superblock_width * 4 - s->fragment_width);
403             hilbert = hilbert_walk_y;
404
405             /* the first operation for this variable is to advance by 1 */
406             current_fragment = -1;
407
408         } else if (i == s->u_superblock_start) {
409
410             /* start of U superblocks */
411             right_edge = s->fragment_width / 2;
412             bottom_edge = s->fragment_height / 2;
413             current_width = -1;
414             current_height = 0;
415             superblock_row_inc = 3 * (s->fragment_width / 2) - 
416                 (s->c_superblock_width * 4 - s->fragment_width / 2);
417             hilbert = hilbert_walk_c;
418
419             /* the first operation for this variable is to advance by 1 */
420             current_fragment = s->u_fragment_start - 1;
421
422         } else if (i == s->v_superblock_start) {
423
424             /* start of V superblocks */
425             right_edge = s->fragment_width / 2;
426             bottom_edge = s->fragment_height / 2;
427             current_width = -1;
428             current_height = 0;
429             superblock_row_inc = 3 * (s->fragment_width / 2) - 
430                 (s->c_superblock_width * 4 - s->fragment_width / 2);
431             hilbert = hilbert_walk_c;
432
433             /* the first operation for this variable is to advance by 1 */
434             current_fragment = s->v_fragment_start - 1;
435
436         }
437
438         if (current_width >= right_edge - 1) {
439             /* reset width and move to next superblock row */
440             current_width = -1;
441             current_height += 4;
442
443             /* fragment is now at the start of a new superblock row */
444             current_fragment += superblock_row_inc;
445         }
446
447         /* iterate through all 16 fragments in a superblock */
448         for (j = 0; j < 16; j++) {
449             current_fragment += hilbert[j];
450             current_width += travel_width[j];
451             current_height += travel_height[j];
452
453             /* check if the fragment is in bounds */
454             if ((current_width < right_edge) &&
455                 (current_height < bottom_edge)) {
456                 s->superblock_fragments[mapping_index] = current_fragment;
457                 debug_init("    mapping fragment %d to superblock %d, position %d (%d/%d x %d/%d)\n", 
458                     s->superblock_fragments[mapping_index], i, j,
459                     current_width, right_edge, current_height, bottom_edge);
460             } else {
461                 s->superblock_fragments[mapping_index] = -1;
462                 debug_init("    superblock %d, position %d has no fragment (%d/%d x %d/%d)\n", 
463                     i, j,
464                     current_width, right_edge, current_height, bottom_edge);
465             }
466
467             mapping_index++;
468         }
469     }
470
471     /* initialize the superblock <-> macroblock mapping; iterate through
472      * all of the Y plane superblocks to build this mapping */
473     right_edge = s->macroblock_width;
474     bottom_edge = s->macroblock_height;
475     current_width = -1;
476     current_height = 0;
477     superblock_row_inc = s->macroblock_width -
478         (s->y_superblock_width * 2 - s->macroblock_width);;
479     hilbert = hilbert_walk_mb;
480     mapping_index = 0;
481     current_macroblock = -1;
482     for (i = 0; i < s->u_superblock_start; i++) {
483
484         if (current_width >= right_edge - 1) {
485             /* reset width and move to next superblock row */
486             current_width = -1;
487             current_height += 2;
488
489             /* macroblock is now at the start of a new superblock row */
490             current_macroblock += superblock_row_inc;
491         }
492
493         /* iterate through each potential macroblock in the superblock */
494         for (j = 0; j < 4; j++) {
495             current_macroblock += hilbert_walk_mb[j];
496             current_width += travel_width_mb[j];
497             current_height += travel_height_mb[j];
498
499             /* check if the macroblock is in bounds */
500             if ((current_width < right_edge) &&
501                 (current_height < bottom_edge)) {
502                 s->superblock_macroblocks[mapping_index] = current_macroblock;
503                 debug_init("    mapping macroblock %d to superblock %d, position %d (%d/%d x %d/%d)\n",
504                     s->superblock_macroblocks[mapping_index], i, j,
505                     current_width, right_edge, current_height, bottom_edge);
506             } else {
507                 s->superblock_macroblocks[mapping_index] = -1;
508                 debug_init("    superblock %d, position %d has no macroblock (%d/%d x %d/%d)\n",
509                     i, j,
510                     current_width, right_edge, current_height, bottom_edge);
511             }
512
513             mapping_index++;
514         }
515     }
516
517     /* initialize the macroblock <-> fragment mapping */
518     current_fragment = 0;
519     current_macroblock = 0;
520     mapping_index = 0;
521     for (i = 0; i < s->fragment_height; i += 2) {
522
523         for (j = 0; j < s->fragment_width; j += 2) {
524
525             debug_init("    macroblock %d contains fragments: ", current_macroblock);
526             s->all_fragments[current_fragment].macroblock = current_macroblock;
527             s->macroblock_fragments[mapping_index++] = current_fragment;
528             debug_init("%d ", current_fragment);
529
530             if (j + 1 < s->fragment_width) {
531                 s->all_fragments[current_fragment + 1].macroblock = current_macroblock;
532                 s->macroblock_fragments[mapping_index++] = current_fragment + 1;
533                 debug_init("%d ", current_fragment + 1);
534             } else
535                 s->macroblock_fragments[mapping_index++] = -1;
536
537             if (i + 1 < s->fragment_height) {
538                 s->all_fragments[current_fragment + s->fragment_width].macroblock = 
539                     current_macroblock;
540                 s->macroblock_fragments[mapping_index++] = 
541                     current_fragment + s->fragment_width;
542                 debug_init("%d ", current_fragment + s->fragment_width);
543             } else
544                 s->macroblock_fragments[mapping_index++] = -1;
545
546             if ((j + 1 < s->fragment_width) && (i + 1 < s->fragment_height)) {
547                 s->all_fragments[current_fragment + s->fragment_width + 1].macroblock = 
548                     current_macroblock;
549                 s->macroblock_fragments[mapping_index++] = 
550                     current_fragment + s->fragment_width + 1;
551                 debug_init("%d ", current_fragment + s->fragment_width + 1);
552             } else
553                 s->macroblock_fragments[mapping_index++] = -1;
554
555             /* C planes */
556             c_fragment = s->u_fragment_start + 
557                 (i * s->fragment_width / 4) + (j / 2);
558             s->all_fragments[c_fragment].macroblock = s->macroblock_count;
559             s->macroblock_fragments[mapping_index++] = c_fragment;
560             debug_init("%d ", c_fragment);
561
562             c_fragment = s->v_fragment_start + 
563                 (i * s->fragment_width / 4) + (j / 2);
564             s->all_fragments[c_fragment].macroblock = s->macroblock_count;
565             s->macroblock_fragments[mapping_index++] = c_fragment;
566             debug_init("%d ", c_fragment);
567
568             debug_init("\n");
569
570             if (j + 2 <= s->fragment_width)
571                 current_fragment += 2;
572             else 
573                 current_fragment++;
574             current_macroblock++;
575         }
576
577         current_fragment += s->fragment_width;
578     }
579
580     return 0;  /* successful path out */
581 }
582
583 /*
584  * This function unpacks a single token (which should be in the range 0..31)
585  * and returns a zero run (number of zero coefficients in current DCT matrix
586  * before next non-zero coefficient), the next DCT coefficient, and the
587  * number of consecutive, non-EOB'd DCT blocks to EOB.
588  */
589 static void unpack_token(GetBitContext *gb, int token, int *zero_run,
590                          DCTELEM *coeff, int *eob_run) 
591 {
592     int sign;
593
594     *zero_run = 0;
595     *eob_run = 0;
596     *coeff = 0;
597
598     debug_token("    vp3 token %d: ", token);
599     switch (token) {
600
601     case 0:
602         debug_token("DCT_EOB_TOKEN, EOB next block\n");
603         *eob_run = 1;
604         break;
605
606     case 1:
607         debug_token("DCT_EOB_PAIR_TOKEN, EOB next 2 blocks\n");
608         *eob_run = 2;
609         break;
610
611     case 2:
612         debug_token("DCT_EOB_TRIPLE_TOKEN, EOB next 3 blocks\n");
613         *eob_run = 3;
614         break;
615
616     case 3:
617         debug_token("DCT_REPEAT_RUN_TOKEN, ");
618         *eob_run = get_bits(gb, 2) + 4;
619         debug_token("EOB the next %d blocks\n", *eob_run);
620         break;
621
622     case 4:
623         debug_token("DCT_REPEAT_RUN2_TOKEN, ");
624         *eob_run = get_bits(gb, 3) + 8;
625         debug_token("EOB the next %d blocks\n", *eob_run);
626         break;
627
628     case 5:
629         debug_token("DCT_REPEAT_RUN3_TOKEN, ");
630         *eob_run = get_bits(gb, 4) + 16;
631         debug_token("EOB the next %d blocks\n", *eob_run);
632         break;
633
634     case 6:
635         debug_token("DCT_REPEAT_RUN4_TOKEN, ");
636         *eob_run = get_bits(gb, 12);
637         debug_token("EOB the next %d blocks\n", *eob_run);
638         break;
639
640     case 7:
641         debug_token("DCT_SHORT_ZRL_TOKEN, ");
642         /* note that this token actually indicates that (3 extra bits) + 1 0s
643          * should be output; this case specifies a run of (3 EBs) 0s and a
644          * coefficient of 0. */
645         *zero_run = get_bits(gb, 3);
646         *coeff = 0;
647         debug_token("skip the next %d positions in output matrix\n", *zero_run + 1);
648         break;
649
650     case 8:
651         debug_token("DCT_ZRL_TOKEN, ");
652         /* note that this token actually indicates that (6 extra bits) + 1 0s
653          * should be output; this case specifies a run of (6 EBs) 0s and a
654          * coefficient of 0. */
655         *zero_run = get_bits(gb, 6);
656         *coeff = 0;
657         debug_token("skip the next %d positions in output matrix\n", *zero_run + 1);
658         break;
659
660     case 9:
661         debug_token("ONE_TOKEN, output 1\n");
662         *coeff = 1;
663         break;
664
665     case 10:
666         debug_token("MINUS_ONE_TOKEN, output -1\n");
667         *coeff = -1;
668         break;
669
670     case 11:
671         debug_token("TWO_TOKEN, output 2\n");
672         *coeff = 2;
673         break;
674
675     case 12:
676         debug_token("MINUS_TWO_TOKEN, output -2\n");
677         *coeff = -2;
678         break;
679
680     case 13:
681     case 14:
682     case 15:
683     case 16:
684         debug_token("LOW_VAL_TOKENS, ");
685         if (get_bits(gb, 1))
686             *coeff = -(3 + (token - 13));
687         else
688             *coeff = 3 + (token - 13);
689         debug_token("output %d\n", *coeff);
690         break;
691
692     case 17:
693         debug_token("DCT_VAL_CATEGORY3, ");
694         sign = get_bits(gb, 1);
695         *coeff = 7 + get_bits(gb, 1);
696         if (sign)
697             *coeff = -(*coeff);
698         debug_token("output %d\n", *coeff);
699         break;
700
701     case 18:
702         debug_token("DCT_VAL_CATEGORY4, ");
703         sign = get_bits(gb, 1);
704         *coeff = 9 + get_bits(gb, 2);
705         if (sign)
706             *coeff = -(*coeff);
707         debug_token("output %d\n", *coeff);
708         break;
709
710     case 19:
711         debug_token("DCT_VAL_CATEGORY5, ");
712         sign = get_bits(gb, 1);
713         *coeff = 13 + get_bits(gb, 3);
714         if (sign)
715             *coeff = -(*coeff);
716         debug_token("output %d\n", *coeff);
717         break;
718
719     case 20:
720         debug_token("DCT_VAL_CATEGORY6, ");
721         sign = get_bits(gb, 1);
722         *coeff = 21 + get_bits(gb, 4);
723         if (sign)
724             *coeff = -(*coeff);
725         debug_token("output %d\n", *coeff);
726         break;
727
728     case 21:
729         debug_token("DCT_VAL_CATEGORY7, ");
730         sign = get_bits(gb, 1);
731         *coeff = 37 + get_bits(gb, 5);
732         if (sign)
733             *coeff = -(*coeff);
734         debug_token("output %d\n", *coeff);
735         break;
736
737     case 22:
738         debug_token("DCT_VAL_CATEGORY8, ");
739         sign = get_bits(gb, 1);
740         *coeff = 69 + get_bits(gb, 9);
741         if (sign)
742             *coeff = -(*coeff);
743         debug_token("output %d\n", *coeff);
744         break;
745
746     case 23:
747     case 24:
748     case 25:
749     case 26:
750     case 27:
751         debug_token("DCT_RUN_CATEGORY1, ");
752         *zero_run = token - 22;
753         if (get_bits(gb, 1))
754             *coeff = -1;
755         else
756             *coeff = 1;
757         debug_token("output %d 0s, then %d\n", *zero_run, *coeff);
758         break;
759
760     case 28:
761         debug_token("DCT_RUN_CATEGORY1B, ");
762         if (get_bits(gb, 1))
763             *coeff = -1;
764         else
765             *coeff = 1;
766         *zero_run = 6 + get_bits(gb, 2);
767         debug_token("output %d 0s, then %d\n", *zero_run, *coeff);
768         break;
769
770     case 29:
771         debug_token("DCT_RUN_CATEGORY1C, ");
772         if (get_bits(gb, 1))
773             *coeff = -1;
774         else
775             *coeff = 1;
776         *zero_run = 10 + get_bits(gb, 3);
777         debug_token("output %d 0s, then %d\n", *zero_run, *coeff);
778         break;
779
780     case 30:
781         debug_token("DCT_RUN_CATEGORY2, ");
782         sign = get_bits(gb, 1);
783         *coeff = 2 + get_bits(gb, 1);
784         if (sign)
785             *coeff = -(*coeff);
786         *zero_run = 1;
787         debug_token("output %d 0s, then %d\n", *zero_run, *coeff);
788         break;
789
790     case 31:
791         debug_token("DCT_RUN_CATEGORY2, ");
792         sign = get_bits(gb, 1);
793         *coeff = 2 + get_bits(gb, 1);
794         if (sign)
795             *coeff = -(*coeff);
796         *zero_run = 2 + get_bits(gb, 1);
797         debug_token("output %d 0s, then %d\n", *zero_run, *coeff);
798         break;
799
800     default:
801         printf ("  vp3: help! Got a bad token: %d > 31\n", token);
802         break;
803
804   }
805 }
806
807 /*
808  * This function wipes out all of the fragment data.
809  */
810 static void init_frame(Vp3DecodeContext *s, GetBitContext *gb)
811 {
812     int i;
813
814     /* zero out all of the fragment information */
815     s->coded_fragment_list_index = 0;
816     for (i = 0; i < s->fragment_count; i++) {
817         memset(s->all_fragments[i].coeffs, 0, 64 * sizeof(DCTELEM));
818         s->all_fragments[i].coeff_count = 0;
819         s->all_fragments[i].last_coeff = 0;
820     }
821 }
822
823 /*
824  * This function sets of the dequantization tables used for a particular
825  * frame.
826  */
827 static void init_dequantizer(Vp3DecodeContext *s)
828 {
829
830     int quality_scale = vp31_quality_threshold[s->quality_index];
831     int dc_scale_factor = vp31_dc_scale_factor[s->quality_index];
832     int i, j;
833
834     debug_vp3("  vp3: initializing dequantization tables\n");
835
836     /* 
837      * Scale dequantizers:
838      *
839      *   quantizer * sf
840      *   --------------
841      *        100
842      *
843      * where sf = dc_scale_factor for DC quantizer
844      *           or quality_scale for AC quantizer
845      *
846      * Then, saturate the result to a lower limit of MIN_DEQUANT_VAL.
847      */
848 #define SCALER 1
849
850     /* scale DC quantizers */
851     s->intra_y_dequant[0] = vp31_intra_y_dequant[0] * dc_scale_factor / 100;
852     if (s->intra_y_dequant[0] < MIN_DEQUANT_VAL * 2)
853         s->intra_y_dequant[0] = MIN_DEQUANT_VAL * 2;
854     s->intra_y_dequant[0] *= SCALER;
855
856     s->intra_c_dequant[0] = vp31_intra_c_dequant[0] * dc_scale_factor / 100;
857     if (s->intra_c_dequant[0] < MIN_DEQUANT_VAL * 2)
858         s->intra_c_dequant[0] = MIN_DEQUANT_VAL * 2;
859     s->intra_c_dequant[0] *= SCALER;
860
861     s->inter_dequant[0] = vp31_inter_dequant[0] * dc_scale_factor / 100;
862     if (s->inter_dequant[0] < MIN_DEQUANT_VAL * 4)
863         s->inter_dequant[0] = MIN_DEQUANT_VAL * 4;
864     s->inter_dequant[0] *= SCALER;
865
866     /* scale AC quantizers, zigzag at the same time in preparation for
867      * the dequantization phase */
868     for (i = 1; i < 64; i++) {
869
870         j = zigzag_index[i];
871
872         s->intra_y_dequant[j] = vp31_intra_y_dequant[i] * quality_scale / 100;
873         if (s->intra_y_dequant[j] < MIN_DEQUANT_VAL)
874             s->intra_y_dequant[j] = MIN_DEQUANT_VAL;
875         s->intra_y_dequant[j] *= SCALER;
876
877         s->intra_c_dequant[j] = vp31_intra_c_dequant[i] * quality_scale / 100;
878         if (s->intra_c_dequant[j] < MIN_DEQUANT_VAL)
879             s->intra_c_dequant[j] = MIN_DEQUANT_VAL;
880         s->intra_c_dequant[j] *= SCALER;
881
882         s->inter_dequant[j] = vp31_inter_dequant[i] * quality_scale / 100;
883         if (s->inter_dequant[j] < MIN_DEQUANT_VAL * 2)
884             s->inter_dequant[j] = MIN_DEQUANT_VAL * 2;
885         s->inter_dequant[j] *= SCALER;
886     }
887
888     /* print debug information as requested */
889     debug_dequantizers("intra Y dequantizers:\n");
890     for (i = 0; i < 8; i++) {
891       for (j = i * 8; j < i * 8 + 8; j++) {
892         debug_dequantizers(" %4d,", s->intra_y_dequant[j]);
893       }
894       debug_dequantizers("\n");
895     }
896     debug_dequantizers("\n");
897
898     debug_dequantizers("intra C dequantizers:\n");
899     for (i = 0; i < 8; i++) {
900       for (j = i * 8; j < i * 8 + 8; j++) {
901         debug_dequantizers(" %4d,", s->intra_c_dequant[j]);
902       }
903       debug_dequantizers("\n");
904     }
905     debug_dequantizers("\n");
906
907     debug_dequantizers("interframe dequantizers:\n");
908     for (i = 0; i < 8; i++) {
909       for (j = i * 8; j < i * 8 + 8; j++) {
910         debug_dequantizers(" %4d,", s->inter_dequant[j]);
911       }
912       debug_dequantizers("\n");
913     }
914     debug_dequantizers("\n");
915 }
916
917 /*
918  * This function is used to fetch runs of 1s or 0s from the bitstream for
919  * use in determining which superblocks are fully and partially coded.
920  *
921  *  Codeword                RunLength
922  *  0                       1
923  *  10x                     2-3
924  *  110x                    4-5
925  *  1110xx                  6-9
926  *  11110xxx                10-17
927  *  111110xxxx              18-33
928  *  111111xxxxxxxxxxxx      34-4129
929  */
930 static int get_superblock_run_length(GetBitContext *gb)
931 {
932
933     if (get_bits(gb, 1) == 0)
934         return 1;
935
936     else if (get_bits(gb, 1) == 0)
937         return (2 + get_bits(gb, 1));
938
939     else if (get_bits(gb, 1) == 0)
940         return (4 + get_bits(gb, 1));
941
942     else if (get_bits(gb, 1) == 0)
943         return (6 + get_bits(gb, 2));
944
945     else if (get_bits(gb, 1) == 0)
946         return (10 + get_bits(gb, 3));
947
948     else if (get_bits(gb, 1) == 0)
949         return (18 + get_bits(gb, 4));
950
951     else
952         return (34 + get_bits(gb, 12));
953
954 }
955
956 /*
957  * This function is used to fetch runs of 1s or 0s from the bitstream for
958  * use in determining which particular fragments are coded.
959  *
960  * Codeword                RunLength
961  * 0x                      1-2
962  * 10x                     3-4
963  * 110x                    5-6
964  * 1110xx                  7-10
965  * 11110xx                 11-14
966  * 11111xxxx               15-30
967  */
968 static int get_fragment_run_length(GetBitContext *gb)
969 {
970
971     if (get_bits(gb, 1) == 0)
972         return (1 + get_bits(gb, 1));
973
974     else if (get_bits(gb, 1) == 0)
975         return (3 + get_bits(gb, 1));
976
977     else if (get_bits(gb, 1) == 0)
978         return (5 + get_bits(gb, 1));
979
980     else if (get_bits(gb, 1) == 0)
981         return (7 + get_bits(gb, 2));
982
983     else if (get_bits(gb, 1) == 0)
984         return (11 + get_bits(gb, 2));
985
986     else
987         return (15 + get_bits(gb, 4));
988
989 }
990
991 /*
992  * This function decodes a VLC from the bitstream and returns a number
993  * that ranges from 0..7. The number indicates which of the 8 coding
994  * modes to use.
995  *
996  *  VLC       Number
997  *  0            0
998  *  10           1
999  *  110          2
1000  *  1110         3
1001  *  11110        4
1002  *  111110       5
1003  *  1111110      6
1004  *  1111111      7
1005  *
1006  */
1007 static int get_mode_code(GetBitContext *gb)
1008 {
1009
1010     if (get_bits(gb, 1) == 0)
1011         return 0;
1012
1013     else if (get_bits(gb, 1) == 0)
1014         return 1;
1015
1016     else if (get_bits(gb, 1) == 0)
1017         return 2;
1018
1019     else if (get_bits(gb, 1) == 0)
1020         return 3;
1021
1022     else if (get_bits(gb, 1) == 0)
1023         return 4;
1024
1025     else if (get_bits(gb, 1) == 0)
1026         return 5;
1027
1028     else if (get_bits(gb, 1) == 0)
1029         return 6;
1030
1031     else
1032         return 7;
1033
1034 }
1035
1036 /*
1037  * This function extracts a motion vector from the bitstream using a VLC
1038  * scheme. 3 bits are fetched from the bitstream and 1 of 8 actions is
1039  * taken depending on the value on those 3 bits:
1040  *
1041  *  0: return 0
1042  *  1: return 1
1043  *  2: return -1
1044  *  3: if (next bit is 1) return -2, else return 2
1045  *  4: if (next bit is 1) return -3, else return 3
1046  *  5: return 4 + (next 2 bits), next bit is sign
1047  *  6: return 8 + (next 3 bits), next bit is sign
1048  *  7: return 16 + (next 4 bits), next bit is sign
1049  */
1050 static int get_motion_vector_vlc(GetBitContext *gb)
1051 {
1052     int bits;
1053
1054     bits = get_bits(gb, 3);
1055
1056     switch(bits) {
1057
1058     case 0:
1059         bits = 0;
1060         break;
1061
1062     case 1:
1063         bits = 1;
1064         break;
1065
1066     case 2:
1067         bits = -1;
1068         break;
1069
1070     case 3:
1071         if (get_bits(gb, 1) == 0)
1072             bits = 2;
1073         else
1074             bits = -2;
1075         break;
1076
1077     case 4:
1078         if (get_bits(gb, 1) == 0)
1079             bits = 3;
1080         else
1081             bits = -3;
1082         break;
1083
1084     case 5:
1085         bits = 4 + get_bits(gb, 2);
1086         if (get_bits(gb, 1) == 1)
1087             bits = -bits;
1088         break;
1089
1090     case 6:
1091         bits = 8 + get_bits(gb, 3);
1092         if (get_bits(gb, 1) == 1)
1093             bits = -bits;
1094         break;
1095
1096     case 7:
1097         bits = 16 + get_bits(gb, 4);
1098         if (get_bits(gb, 1) == 1)
1099             bits = -bits;
1100         break;
1101
1102     }
1103
1104     return bits;
1105 }
1106
1107 /*
1108  * This function fetches a 5-bit number from the stream followed by
1109  * a sign and calls it a motion vector.
1110  */
1111 static int get_motion_vector_fixed(GetBitContext *gb)
1112 {
1113
1114     int bits;
1115
1116     bits = get_bits(gb, 5);
1117
1118     if (get_bits(gb, 1) == 1)
1119         bits = -bits;
1120
1121     return bits;
1122 }
1123
1124 /*
1125  * This function unpacks all of the superblock/macroblock/fragment coding 
1126  * information from the bitstream.
1127  */
1128 static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb)
1129 {
1130     int bit = 0;
1131     int current_superblock = 0;
1132     int current_run = 0;
1133     int decode_fully_flags = 0;
1134     int decode_partial_blocks = 0;
1135
1136     int i, j;
1137     int current_fragment;
1138
1139     debug_vp3("  vp3: unpacking superblock coding\n");
1140
1141     if (s->keyframe) {
1142
1143         debug_vp3("    keyframe-- all superblocks are fully coded\n");
1144         memset(s->superblock_coding, SB_FULLY_CODED, s->superblock_count);
1145
1146     } else {
1147
1148         /* unpack the list of partially-coded superblocks */
1149         bit = get_bits(gb, 1);
1150         /* toggle the bit because as soon as the first run length is 
1151          * fetched the bit will be toggled again */
1152         bit ^= 1;
1153         while (current_superblock < s->superblock_count) {
1154             if (current_run == 0) {
1155                 bit ^= 1;
1156                 current_run = get_superblock_run_length(gb);
1157                 debug_block_coding("      setting superblocks %d..%d to %s\n",
1158                     current_superblock,
1159                     current_superblock + current_run - 1,
1160                     (bit) ? "partially coded" : "not coded");
1161
1162                 /* if any of the superblocks are not partially coded, flag
1163                  * a boolean to decode the list of fully-coded superblocks */
1164                 if (bit == 0)
1165                     decode_fully_flags = 1;
1166             } else {
1167
1168                 /* make a note of the fact that there are partially coded
1169                  * superblocks */
1170                 decode_partial_blocks = 1;
1171
1172             }
1173             s->superblock_coding[current_superblock++] = 
1174                 (bit) ? SB_PARTIALLY_CODED : SB_NOT_CODED;
1175             current_run--;
1176         }
1177
1178         /* unpack the list of fully coded superblocks if any of the blocks were
1179          * not marked as partially coded in the previous step */
1180         if (decode_fully_flags) {
1181
1182             current_superblock = 0;
1183             current_run = 0;
1184             bit = get_bits(gb, 1);
1185             /* toggle the bit because as soon as the first run length is 
1186              * fetched the bit will be toggled again */
1187             bit ^= 1;
1188             while (current_superblock < s->superblock_count) {
1189
1190                 /* skip any superblocks already marked as partially coded */
1191                 if (s->superblock_coding[current_superblock] == SB_NOT_CODED) {
1192
1193                     if (current_run == 0) {
1194                         bit ^= 1;
1195                         current_run = get_superblock_run_length(gb);
1196                     }
1197
1198                     debug_block_coding("      setting superblock %d to %s\n",
1199                         current_superblock,
1200                         (bit) ? "fully coded" : "not coded");
1201                     s->superblock_coding[current_superblock] = 
1202                         (bit) ? SB_FULLY_CODED : SB_NOT_CODED;
1203                     current_run--;
1204                 }
1205                 current_superblock++;
1206             }
1207         }
1208
1209         /* if there were partial blocks, initialize bitstream for
1210          * unpacking fragment codings */
1211         if (decode_partial_blocks) {
1212
1213             current_run = 0;
1214             bit = get_bits(gb, 1);
1215             /* toggle the bit because as soon as the first run length is 
1216              * fetched the bit will be toggled again */
1217             bit ^= 1;
1218         }
1219     }
1220
1221     /* figure out which fragments are coded; iterate through each
1222      * superblock (all planes) */
1223     s->coded_fragment_list_index = 0;
1224     s->first_coded_y_fragment = s->first_coded_c_fragment = 0;
1225     s->last_coded_y_fragment = s->last_coded_c_fragment = -1;
1226     memset(s->macroblock_coding, MODE_COPY, s->macroblock_count);
1227     for (i = 0; i < s->superblock_count; i++) {
1228
1229         /* iterate through all 16 fragments in a superblock */
1230         for (j = 0; j < 16; j++) {
1231
1232             /* if the fragment is in bounds, check its coding status */
1233             current_fragment = s->superblock_fragments[i * 16 + j];
1234             if (current_fragment >= s->fragment_count) {
1235                 printf ("  vp3:unpack_superblocks(): bad fragment number (%d >= %d)\n",
1236                     current_fragment, s->fragment_count);
1237                 return 1;
1238             }
1239             if (current_fragment != -1) {
1240                 if (s->superblock_coding[i] == SB_NOT_CODED) {
1241
1242                     /* copy all the fragments from the prior frame */
1243                     s->all_fragments[current_fragment].coding_method = 
1244                         MODE_COPY;
1245
1246                 } else if (s->superblock_coding[i] == SB_PARTIALLY_CODED) {
1247
1248                     /* fragment may or may not be coded; this is the case
1249                      * that cares about the fragment coding runs */
1250                     if (current_run == 0) {
1251                         bit ^= 1;
1252                         current_run = get_fragment_run_length(gb);
1253                     }
1254
1255                     if (bit) {
1256                         /* mode will be decoded in the next phase */
1257                         s->all_fragments[current_fragment].coding_method = 
1258                             MODE_INTER_NO_MV;
1259                         s->coded_fragment_list[s->coded_fragment_list_index] = 
1260                             current_fragment;
1261                         if ((current_fragment >= s->u_fragment_start) &&
1262                             (s->last_coded_y_fragment == -1)) {
1263                             s->first_coded_c_fragment = s->coded_fragment_list_index;
1264                             s->last_coded_y_fragment = s->first_coded_c_fragment - 1;
1265                         }
1266                         s->coded_fragment_list_index++;
1267                         s->macroblock_coding[s->all_fragments[current_fragment].macroblock] = MODE_INTER_NO_MV;
1268                         debug_block_coding("      superblock %d is partially coded, fragment %d is coded\n",
1269                             i, current_fragment);
1270                     } else {
1271                         /* not coded; copy this fragment from the prior frame */
1272                         s->all_fragments[current_fragment].coding_method =
1273                             MODE_COPY;
1274                         debug_block_coding("      superblock %d is partially coded, fragment %d is not coded\n",
1275                             i, current_fragment);
1276                     }
1277
1278                     current_run--;
1279
1280                 } else {
1281
1282                     /* fragments are fully coded in this superblock; actual
1283                      * coding will be determined in next step */
1284                     s->all_fragments[current_fragment].coding_method = 
1285                         MODE_INTER_NO_MV;
1286                     s->coded_fragment_list[s->coded_fragment_list_index] = 
1287                         current_fragment;
1288                     if ((current_fragment >= s->u_fragment_start) &&
1289                         (s->last_coded_y_fragment == -1)) {
1290                         s->first_coded_c_fragment = s->coded_fragment_list_index;
1291                         s->last_coded_y_fragment = s->first_coded_c_fragment - 1;
1292                     }
1293                     s->coded_fragment_list_index++;
1294                     s->macroblock_coding[s->all_fragments[current_fragment].macroblock] = MODE_INTER_NO_MV;
1295                     debug_block_coding("      superblock %d is fully coded, fragment %d is coded\n",
1296                         i, current_fragment);
1297                 }
1298             }
1299         }
1300     }
1301
1302     if (s->first_coded_c_fragment == 0)
1303         /* no C fragments coded */
1304         s->last_coded_y_fragment = s->coded_fragment_list_index - 1;
1305     else
1306         s->last_coded_c_fragment = s->coded_fragment_list_index - 1;
1307     debug_block_coding("    %d total coded fragments, y: %d -> %d, c: %d -> %d\n",
1308         s->coded_fragment_list_index,
1309         s->first_coded_y_fragment,
1310         s->last_coded_y_fragment,
1311         s->first_coded_c_fragment,
1312         s->last_coded_c_fragment);
1313
1314     return 0;
1315 }
1316
1317 /*
1318  * This function unpacks all the coding mode data for individual macroblocks
1319  * from the bitstream.
1320  */
1321 static int unpack_modes(Vp3DecodeContext *s, GetBitContext *gb)
1322 {
1323     int i, j, k;
1324     int scheme;
1325     int current_macroblock;
1326     int current_fragment;
1327     int coding_mode;
1328
1329     debug_vp3("  vp3: unpacking encoding modes\n");
1330
1331     if (s->keyframe) {
1332         debug_vp3("    keyframe-- all blocks are coded as INTRA\n");
1333
1334         for (i = 0; i < s->fragment_count; i++)
1335             s->all_fragments[i].coding_method = MODE_INTRA;
1336
1337     } else {
1338
1339         /* fetch the mode coding scheme for this frame */
1340         scheme = get_bits(gb, 3);
1341         debug_modes("    using mode alphabet %d\n", scheme);
1342
1343         /* is it a custom coding scheme? */
1344         if (scheme == 0) {
1345             debug_modes("    custom mode alphabet ahead:\n");
1346             for (i = 0; i < 8; i++)
1347                 ModeAlphabet[scheme][get_bits(gb, 3)] = i;
1348         }
1349
1350         for (i = 0; i < 8; i++)
1351             debug_modes("      mode[%d][%d] = %d\n", scheme, i, 
1352                 ModeAlphabet[scheme][i]);
1353
1354         /* iterate through all of the macroblocks that contain 1 or more
1355          * coded fragments */
1356         for (i = 0; i < s->u_superblock_start; i++) {
1357
1358             for (j = 0; j < 4; j++) {
1359                 current_macroblock = s->superblock_macroblocks[i * 4 + j];
1360                 if ((current_macroblock == -1) ||
1361                     (s->macroblock_coding[current_macroblock] == MODE_COPY))
1362                     continue;
1363                 if (current_macroblock >= s->macroblock_count) {
1364                     printf ("  vp3:unpack_modes(): bad macroblock number (%d >= %d)\n",
1365                         current_macroblock, s->macroblock_count);
1366                     return 1;
1367                 }
1368
1369                 /* mode 7 means get 3 bits for each coding mode */
1370                 if (scheme == 7)
1371                     coding_mode = get_bits(gb, 3);
1372                 else
1373                     coding_mode = ModeAlphabet[scheme][get_mode_code(gb)];
1374
1375                 s->macroblock_coding[current_macroblock] = coding_mode;
1376                 for (k = 0; k < 6; k++) {
1377                     current_fragment = 
1378                         s->macroblock_fragments[current_macroblock * 6 + k];
1379                     if (current_fragment == -1)
1380                         continue;
1381                     if (current_fragment >= s->fragment_count) {
1382                         printf ("  vp3:unpack_modes(): bad fragment number (%d >= %d)\n",
1383                             current_fragment, s->fragment_count);
1384                         return 1;
1385                     }
1386                     if (s->all_fragments[current_fragment].coding_method != 
1387                         MODE_COPY)
1388                         s->all_fragments[current_fragment].coding_method =
1389                             coding_mode;
1390                 }
1391
1392                 debug_modes("    coding method for macroblock starting @ fragment %d = %d\n",
1393                     s->macroblock_fragments[current_macroblock * 6], coding_mode);
1394             }
1395         }
1396     }
1397
1398     return 0;
1399 }
1400
1401 /*
1402  * This function adjusts the components of a motion vector for the halfpel
1403  * motion grid. c_plane indicates whether the vector applies to the U or V
1404  * plane. The function returns the halfpel function index to be used in
1405  * ffmpeg's put_pixels[]() array of functions.
1406  */
1407 static inline int adjust_vector(int *x, int *y, int c_plane)
1408 {
1409     int motion_halfpel_index = 0;
1410     int x_halfpel;
1411     int y_halfpel;
1412
1413     if (!c_plane) {
1414
1415         x_halfpel = *x & 1;
1416         motion_halfpel_index |= x_halfpel;
1417         if (*x >= 0)
1418             *x >>= 1;
1419         else
1420             *x = -( (-(*x) >> 1) + x_halfpel);
1421
1422         y_halfpel = *y & 1;
1423         motion_halfpel_index |= (y_halfpel << 1);
1424         if (*y >= 0)
1425             *y >>= 1;
1426         else
1427             *y = -( (-(*y) >> 1) + y_halfpel);
1428
1429     } else {
1430
1431         x_halfpel = ((*x & 0x03) != 0);
1432         motion_halfpel_index |= x_halfpel;
1433         if (*x >= 0)
1434             *x >>= 2;
1435         else
1436             *x = -( (-(*x) >> 2) + x_halfpel);
1437
1438         y_halfpel = ((*y & 0x03) != 0);
1439         motion_halfpel_index |= (y_halfpel << 1);
1440         if (*y >= 0)
1441             *y >>= 2;
1442         else
1443             *y = -( (-(*y) >> 2) + y_halfpel);
1444
1445     }
1446
1447     return motion_halfpel_index;
1448 }
1449
1450 /*
1451  * This function unpacks all the motion vectors for the individual
1452  * macroblocks from the bitstream.
1453  */
1454 static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
1455 {
1456     int i, j, k;
1457     int coding_mode;
1458     int motion_x[6];
1459     int motion_y[6];
1460     int last_motion_x = 0;
1461     int last_motion_y = 0;
1462     int prior_last_motion_x = 0;
1463     int prior_last_motion_y = 0;
1464     int current_macroblock;
1465     int current_fragment;
1466
1467     debug_vp3("  vp3: unpacking motion vectors\n");
1468
1469     if (s->keyframe) {
1470
1471         debug_vp3("    keyframe-- there are no motion vectors\n");
1472
1473     } else {
1474
1475         memset(motion_x, 0, 6 * sizeof(int));
1476         memset(motion_y, 0, 6 * sizeof(int));
1477
1478         /* coding mode 0 is the VLC scheme; 1 is the fixed code scheme */
1479         coding_mode = get_bits(gb, 1);
1480         debug_vectors("    using %s scheme for unpacking motion vectors\n",
1481             (coding_mode == 0) ? "VLC" : "fixed-length");
1482
1483         /* iterate through all of the macroblocks that contain 1 or more
1484          * coded fragments */
1485         for (i = 0; i < s->u_superblock_start; i++) {
1486
1487             for (j = 0; j < 4; j++) {
1488                 current_macroblock = s->superblock_macroblocks[i * 4 + j];
1489                 if ((current_macroblock == -1) ||
1490                     (s->macroblock_coding[current_macroblock] == MODE_COPY))
1491                     continue;
1492                 if (current_macroblock >= s->macroblock_count) {
1493                     printf ("  vp3:unpack_vectors(): bad macroblock number (%d >= %d)\n",
1494                         current_macroblock, s->macroblock_count);
1495                     return 1;
1496                 }
1497
1498                 current_fragment = s->macroblock_fragments[current_macroblock * 6];
1499                 if (current_fragment >= s->fragment_count) {
1500                     printf ("  vp3:unpack_vectors(): bad fragment number (%d >= %d\n",
1501                         current_fragment, s->fragment_count);
1502                     return 1;
1503                 }
1504                 switch (s->macroblock_coding[current_macroblock]) {
1505
1506                 case MODE_INTER_PLUS_MV:
1507                 case MODE_GOLDEN_MV:
1508                     /* all 6 fragments use the same motion vector */
1509                     if (coding_mode == 0) {
1510                         motion_x[0] = get_motion_vector_vlc(gb);
1511                         motion_y[0] = get_motion_vector_vlc(gb);
1512                     } else {
1513                         motion_x[0] = get_motion_vector_fixed(gb);
1514                         motion_y[0] = get_motion_vector_fixed(gb);
1515                     }
1516                     for (k = 1; k < 6; k++) {
1517                         motion_x[k] = motion_x[0];
1518                         motion_y[k] = motion_y[0];
1519                     }
1520
1521                     /* vector maintenance, only on MODE_INTER_PLUS_MV */
1522                     if (s->all_fragments[current_fragment].coding_method ==
1523                         MODE_INTER_PLUS_MV) {
1524                         prior_last_motion_x = last_motion_x;
1525                         prior_last_motion_y = last_motion_y;
1526                         last_motion_x = motion_x[0];
1527                         last_motion_y = motion_y[0];
1528                     }
1529                     break;
1530
1531                 case MODE_INTER_FOURMV:
1532                     /* fetch 4 vectors from the bitstream, one for each
1533                      * Y fragment, then average for the C fragment vectors */
1534                     motion_x[4] = motion_y[4] = 0;
1535                     for (k = 0; k < 4; k++) {
1536                         if (coding_mode == 0) {
1537                             motion_x[k] = get_motion_vector_vlc(gb);
1538                             motion_y[k] = get_motion_vector_vlc(gb);
1539                         } else {
1540                             motion_x[k] = get_motion_vector_fixed(gb);
1541                             motion_y[k] = get_motion_vector_fixed(gb);
1542                         }
1543                         motion_x[4] += motion_x[k];
1544                         motion_y[4] += motion_y[k];
1545                     }
1546
1547                     if (motion_x[4] >= 0) 
1548                         motion_x[4] = (motion_x[4] + 2) / 4;
1549                     else
1550                         motion_x[4] = (motion_x[4] - 2) / 4;
1551                     motion_x[5] = motion_x[4];
1552
1553                     if (motion_y[4] >= 0) 
1554                         motion_y[4] = (motion_y[4] + 2) / 4;
1555                     else
1556                         motion_y[4] = (motion_y[4] - 2) / 4;
1557                     motion_y[5] = motion_y[4];
1558
1559                     /* vector maintenance; vector[3] is treated as the
1560                      * last vector in this case */
1561                     prior_last_motion_x = last_motion_x;
1562                     prior_last_motion_y = last_motion_y;
1563                     last_motion_x = motion_x[3];
1564                     last_motion_y = motion_y[3];
1565                     break;
1566
1567                 case MODE_INTER_LAST_MV:
1568                     /* all 6 fragments use the last motion vector */
1569                     motion_x[0] = last_motion_x;
1570                     motion_y[0] = last_motion_y;
1571                     for (k = 1; k < 6; k++) {
1572                         motion_x[k] = motion_x[0];
1573                         motion_y[k] = motion_y[0];
1574                     }
1575
1576                     /* no vector maintenance (last vector remains the
1577                      * last vector) */
1578                     break;
1579
1580                 case MODE_INTER_PRIOR_LAST:
1581                     /* all 6 fragments use the motion vector prior to the
1582                      * last motion vector */
1583                     motion_x[0] = prior_last_motion_x;
1584                     motion_y[0] = prior_last_motion_y;
1585                     for (k = 1; k < 6; k++) {
1586                         motion_x[k] = motion_x[0];
1587                         motion_y[k] = motion_y[0];
1588                     }
1589
1590                     /* vector maintenance */
1591                     prior_last_motion_x = last_motion_x;
1592                     prior_last_motion_y = last_motion_y;
1593                     last_motion_x = motion_x[0];
1594                     last_motion_y = motion_y[0];
1595                     break;
1596
1597                 default:
1598                     /* covers intra, inter without MV, golden without MV */
1599                     memset(motion_x, 0, 6 * sizeof(int));
1600                     memset(motion_y, 0, 6 * sizeof(int));
1601
1602                     /* no vector maintenance */
1603                     break;
1604                 }
1605
1606                 /* assign the motion vectors to the correct fragments */
1607                 debug_vectors("    vectors for macroblock starting @ fragment %d (coding method %d):\n",
1608                     current_fragment,
1609                     s->all_fragments[current_fragment].coding_method);
1610                 for (k = 0; k < 6; k++) {
1611                     current_fragment = 
1612                         s->macroblock_fragments[current_macroblock * 6 + k];
1613                     if (current_fragment == -1)
1614                         continue;
1615                     if (current_fragment >= s->fragment_count) {
1616                         printf ("  vp3:unpack_vectors(): bad fragment number (%d >= %d)\n",
1617                             current_fragment, s->fragment_count);
1618                         return 1;
1619                     }
1620                     s->all_fragments[current_fragment].motion_halfpel_index =
1621                         adjust_vector(&motion_x[k], &motion_y[k],
1622                         ((k == 4) || (k == 5)));
1623                     s->all_fragments[current_fragment].motion_x = motion_x[k];
1624                     s->all_fragments[current_fragment].motion_y = motion_y[k];
1625                     debug_vectors("    vector %d: fragment %d = (%d, %d), index %d\n",
1626                         k, current_fragment, motion_x[k], motion_y[k],
1627                         s->all_fragments[current_fragment].motion_halfpel_index);
1628                 }
1629             }
1630         }
1631     }
1632
1633     return 0;
1634 }
1635
1636 /* 
1637  * This function is called by unpack_dct_coeffs() to extract the VLCs from
1638  * the bitstream. The VLCs encode tokens which are used to unpack DCT
1639  * data. This function unpacks all the VLCs for either the Y plane or both
1640  * C planes, and is called for DC coefficients or different AC coefficient
1641  * levels (since different coefficient types require different VLC tables.
1642  *
1643  * This function returns a residual eob run. E.g, if a particular token gave
1644  * instructions to EOB the next 5 fragments and there were only 2 fragments
1645  * left in the current fragment range, 3 would be returned so that it could
1646  * be passed into the next call to this same function.
1647  */
1648 static int unpack_vlcs(Vp3DecodeContext *s, GetBitContext *gb,
1649                         VLC *table, int coeff_index,
1650                         int first_fragment, int last_fragment,
1651                         int eob_run)
1652 {
1653     int i;
1654     int token;
1655     int zero_run;
1656     DCTELEM coeff;
1657     Vp3Fragment *fragment;
1658
1659     for (i = first_fragment; i <= last_fragment; i++) {
1660
1661         fragment = &s->all_fragments[s->coded_fragment_list[i]];
1662         if (fragment->coeff_count > coeff_index)
1663             continue;
1664
1665         if (!eob_run) {
1666             /* decode a VLC into a token */
1667             token = get_vlc2(gb, table->table, 5, 3);
1668             debug_vlc(" token = %2d, ", token);
1669             /* use the token to get a zero run, a coefficient, and an eob run */
1670             unpack_token(gb, token, &zero_run, &coeff, &eob_run);
1671         }
1672
1673         if (!eob_run) {
1674             fragment->coeff_count += zero_run;
1675             if (fragment->coeff_count < 64)
1676                 fragment->coeffs[fragment->coeff_count++] = coeff;
1677             debug_vlc(" fragment %d coeff = %d\n",
1678                 s->coded_fragment_list[i], fragment->coeffs[coeff_index]);
1679         } else {
1680             fragment->last_coeff = fragment->coeff_count;
1681             fragment->coeff_count = 64;
1682             debug_vlc(" fragment %d eob with %d coefficients\n", 
1683                 s->coded_fragment_list[i], fragment->last_coeff);
1684             eob_run--;
1685         }
1686     }
1687
1688     return eob_run;
1689 }
1690
1691 /*
1692  * This function unpacks all of the DCT coefficient data from the
1693  * bitstream.
1694  */
1695 static int unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
1696 {
1697     int i;
1698     int dc_y_table;
1699     int dc_c_table;
1700     int ac_y_table;
1701     int ac_c_table;
1702     int residual_eob_run = 0;
1703
1704     /* fetch the DC table indices */
1705     dc_y_table = get_bits(gb, 4);
1706     dc_c_table = get_bits(gb, 4);
1707
1708     /* unpack the Y plane DC coefficients */
1709     debug_vp3("  vp3: unpacking Y plane DC coefficients using table %d\n",
1710         dc_y_table);
1711     residual_eob_run = unpack_vlcs(s, gb, &s->dc_vlc[dc_y_table], 0, 
1712         s->first_coded_y_fragment, s->last_coded_y_fragment, residual_eob_run);
1713
1714     /* unpack the C plane DC coefficients */
1715     debug_vp3("  vp3: unpacking C plane DC coefficients using table %d\n",
1716         dc_c_table);
1717     residual_eob_run = unpack_vlcs(s, gb, &s->dc_vlc[dc_c_table], 0,
1718         s->first_coded_c_fragment, s->last_coded_c_fragment, residual_eob_run);
1719
1720     /* fetch the AC table indices */
1721     ac_y_table = get_bits(gb, 4);
1722     ac_c_table = get_bits(gb, 4);
1723
1724     /* unpack the group 1 AC coefficients (coeffs 1-5) */
1725     for (i = 1; i <= 5; i++) {
1726
1727         debug_vp3("  vp3: unpacking level %d Y plane AC coefficients using table %d\n",
1728             i, ac_y_table);
1729         residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_1[ac_y_table], i, 
1730             s->first_coded_y_fragment, s->last_coded_y_fragment, residual_eob_run);
1731
1732         debug_vp3("  vp3: unpacking level %d C plane AC coefficients using table %d\n",
1733             i, ac_c_table);
1734         residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_1[ac_c_table], i, 
1735             s->first_coded_c_fragment, s->last_coded_c_fragment, residual_eob_run);
1736     }
1737
1738     /* unpack the group 2 AC coefficients (coeffs 6-14) */
1739     for (i = 6; i <= 14; i++) {
1740
1741         debug_vp3("  vp3: unpacking level %d Y plane AC coefficients using table %d\n",
1742             i, ac_y_table);
1743         residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_2[ac_y_table], i, 
1744             s->first_coded_y_fragment, s->last_coded_y_fragment, residual_eob_run);
1745
1746         debug_vp3("  vp3: unpacking level %d C plane AC coefficients using table %d\n",
1747             i, ac_c_table);
1748         residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_2[ac_c_table], i, 
1749             s->first_coded_c_fragment, s->last_coded_c_fragment, residual_eob_run);
1750     }
1751
1752     /* unpack the group 3 AC coefficients (coeffs 15-27) */
1753     for (i = 15; i <= 27; i++) {
1754
1755         debug_vp3("  vp3: unpacking level %d Y plane AC coefficients using table %d\n",
1756             i, ac_y_table);
1757         residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_3[ac_y_table], i, 
1758             s->first_coded_y_fragment, s->last_coded_y_fragment, residual_eob_run);
1759
1760         debug_vp3("  vp3: unpacking level %d C plane AC coefficients using table %d\n",
1761             i, ac_c_table);
1762         residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_3[ac_c_table], i, 
1763             s->first_coded_c_fragment, s->last_coded_c_fragment, residual_eob_run);
1764     }
1765
1766     /* unpack the group 4 AC coefficients (coeffs 28-63) */
1767     for (i = 28; i <= 63; i++) {
1768
1769         debug_vp3("  vp3: unpacking level %d Y plane AC coefficients using table %d\n",
1770             i, ac_y_table);
1771         residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_4[ac_y_table], i, 
1772             s->first_coded_y_fragment, s->last_coded_y_fragment, residual_eob_run);
1773
1774         debug_vp3("  vp3: unpacking level %d C plane AC coefficients using table %d\n",
1775             i, ac_c_table);
1776         residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_4[ac_c_table], i, 
1777             s->first_coded_c_fragment, s->last_coded_c_fragment, residual_eob_run);
1778     }
1779
1780     return 0;
1781 }
1782
1783 /*
1784  * This function reverses the DC prediction for each coded fragment in
1785  * the frame. Much of this function is adapted directly from the original 
1786  * VP3 source code.
1787  */
1788 #define COMPATIBLE_FRAME(x) \
1789   (compatible_frame[s->all_fragments[x].coding_method] == current_frame_type)
1790 #define FRAME_CODED(x) (s->all_fragments[x].coding_method != MODE_COPY)
1791 static inline int iabs (int x) { return ((x < 0) ? -x : x); }
1792
1793 static void reverse_dc_prediction(Vp3DecodeContext *s,
1794                                   int first_fragment,
1795                                   int fragment_width,
1796                                   int fragment_height) 
1797 {
1798
1799 #define PUL 8
1800 #define PU 4
1801 #define PUR 2
1802 #define PL 1
1803
1804     int x, y;
1805     int i = first_fragment;
1806
1807     /*
1808      * Fragment prediction groups:
1809      *
1810      * 32222222226
1811      * 10000000004
1812      * 10000000004
1813      * 10000000004
1814      * 10000000004
1815      *
1816      * Note: Groups 5 and 7 do not exist as it would mean that the 
1817      * fragment's x coordinate is both 0 and (width - 1) at the same time.
1818      */
1819     int predictor_group;
1820     short predicted_dc;
1821
1822     /* validity flags for the left, up-left, up, and up-right fragments */
1823     int fl, ful, fu, fur;
1824
1825     /* DC values for the left, up-left, up, and up-right fragments */
1826     int vl, vul, vu, vur;
1827
1828     /* indices for the left, up-left, up, and up-right fragments */
1829     int l, ul, u, ur;
1830
1831     /* 
1832      * The 6 fields mean:
1833      *   0: up-left multiplier
1834      *   1: up multiplier
1835      *   2: up-right multiplier
1836      *   3: left multiplier
1837      *   4: mask
1838      *   5: right bit shift divisor (e.g., 7 means >>=7, a.k.a. div by 128)
1839      */
1840     int predictor_transform[16][6] = {
1841         {  0,  0,  0,  0,   0,  0 },
1842         {  0,  0,  0,  1,   0,  0 },        // PL
1843         {  0,  0,  1,  0,   0,  0 },        // PUR
1844         {  0,  0, 53, 75, 127,  7 },        // PUR|PL
1845         {  0,  1,  0,  0,   0,  0 },        // PU
1846         {  0,  1,  0,  1,   1,  1 },        // PU|PL
1847         {  0,  1,  0,  0,   0,  0 },        // PU|PUR
1848         {  0,  0, 53, 75, 127,  7 },        // PU|PUR|PL
1849         {  1,  0,  0,  0,   0,  0 },        // PUL
1850         {  0,  0,  0,  1,   0,  0 },        // PUL|PL
1851         {  1,  0,  1,  0,   1,  1 },        // PUL|PUR
1852         {  0,  0, 53, 75, 127,  7 },        // PUL|PUR|PL
1853         {  0,  1,  0,  0,   0,  0 },        // PUL|PU
1854         {-26, 29,  0, 29,  31,  5 },        // PUL|PU|PL
1855         {  3, 10,  3,  0,  15,  4 },        // PUL|PU|PUR
1856         {-26, 29,  0, 29,  31,  5 }         // PUL|PU|PUR|PL
1857     };
1858
1859     /* This table shows which types of blocks can use other blocks for
1860      * prediction. For example, INTRA is the only mode in this table to
1861      * have a frame number of 0. That means INTRA blocks can only predict
1862      * from other INTRA blocks. There are 2 golden frame coding types; 
1863      * blocks encoding in these modes can only predict from other blocks
1864      * that were encoded with these 1 of these 2 modes. */
1865     unsigned char compatible_frame[8] = {
1866         1,    /* MODE_INTER_NO_MV */
1867         0,    /* MODE_INTRA */
1868         1,    /* MODE_INTER_PLUS_MV */
1869         1,    /* MODE_INTER_LAST_MV */
1870         1,    /* MODE_INTER_PRIOR_MV */
1871         2,    /* MODE_USING_GOLDEN */
1872         2,    /* MODE_GOLDEN_MV */
1873         1     /* MODE_INTER_FOUR_MV */
1874     };
1875     int current_frame_type;
1876
1877     /* there is a last DC predictor for each of the 3 frame types */
1878     short last_dc[3];
1879
1880     int transform = 0;
1881
1882     debug_vp3("  vp3: reversing DC prediction\n");
1883
1884     vul = vu = vur = vl = 0;
1885     last_dc[0] = last_dc[1] = last_dc[2] = 0;
1886
1887     /* for each fragment row... */
1888     for (y = 0; y < fragment_height; y++) {
1889
1890         /* for each fragment in a row... */
1891         for (x = 0; x < fragment_width; x++, i++) {
1892
1893             /* reverse prediction if this block was coded */
1894             if (s->all_fragments[i].coding_method != MODE_COPY) {
1895
1896                 current_frame_type = 
1897                     compatible_frame[s->all_fragments[i].coding_method];
1898                 predictor_group = (x == 0) + ((y == 0) << 1) +
1899                     ((x + 1 == fragment_width) << 2);
1900                 debug_dc_pred(" frag %d: group %d, orig DC = %d, ",
1901                     i, predictor_group, s->all_fragments[i].coeffs[0]);
1902
1903                 switch (predictor_group) {
1904
1905                 case 0:
1906                     /* main body of fragments; consider all 4 possible
1907                      * fragments for prediction */
1908
1909                     /* calculate the indices of the predicting fragments */
1910                     ul = i - fragment_width - 1;
1911                     u = i - fragment_width;
1912                     ur = i - fragment_width + 1;
1913                     l = i - 1;
1914
1915                     /* fetch the DC values for the predicting fragments */
1916                     vul = s->all_fragments[ul].coeffs[0];
1917                     vu = s->all_fragments[u].coeffs[0];
1918                     vur = s->all_fragments[ur].coeffs[0];
1919                     vl = s->all_fragments[l].coeffs[0];
1920
1921                     /* figure out which fragments are valid */
1922                     ful = FRAME_CODED(ul) && COMPATIBLE_FRAME(ul);
1923                     fu = FRAME_CODED(u) && COMPATIBLE_FRAME(u);
1924                     fur = FRAME_CODED(ur) && COMPATIBLE_FRAME(ur);
1925                     fl = FRAME_CODED(l) && COMPATIBLE_FRAME(l);
1926
1927                     /* decide which predictor transform to use */
1928                     transform = (fl*PL) | (fu*PU) | (ful*PUL) | (fur*PUR);
1929
1930                     break;
1931
1932                 case 1:
1933                     /* left column of fragments, not including top corner;
1934                      * only consider up and up-right fragments */
1935
1936                     /* calculate the indices of the predicting fragments */
1937                     u = i - fragment_width;
1938                     ur = i - fragment_width + 1;
1939
1940                     /* fetch the DC values for the predicting fragments */
1941                     vu = s->all_fragments[u].coeffs[0];
1942                     vur = s->all_fragments[ur].coeffs[0];
1943
1944                     /* figure out which fragments are valid */
1945                     fur = FRAME_CODED(ur) && COMPATIBLE_FRAME(ur);
1946                     fu = FRAME_CODED(u) && COMPATIBLE_FRAME(u);
1947
1948                     /* decide which predictor transform to use */
1949                     transform = (fu*PU) | (fur*PUR);
1950
1951                     break;
1952
1953                 case 2:
1954                 case 6:
1955                     /* top row of fragments, not including top-left frag;
1956                      * only consider the left fragment for prediction */
1957
1958                     /* calculate the indices of the predicting fragments */
1959                     l = i - 1;
1960
1961                     /* fetch the DC values for the predicting fragments */
1962                     vl = s->all_fragments[l].coeffs[0];
1963
1964                     /* figure out which fragments are valid */
1965                     fl = FRAME_CODED(l) && COMPATIBLE_FRAME(l);
1966
1967                     /* decide which predictor transform to use */
1968                     transform = (fl*PL);
1969
1970                     break;
1971
1972                 case 3:
1973                     /* top-left fragment */
1974
1975                     /* nothing to predict from in this case */
1976                     transform = 0;
1977
1978                     break;
1979
1980                 case 4:
1981                     /* right column of fragments, not including top corner;
1982                      * consider up-left, up, and left fragments for
1983                      * prediction */
1984
1985                     /* calculate the indices of the predicting fragments */
1986                     ul = i - fragment_width - 1;
1987                     u = i - fragment_width;
1988                     l = i - 1;
1989
1990                     /* fetch the DC values for the predicting fragments */
1991                     vul = s->all_fragments[ul].coeffs[0];
1992                     vu = s->all_fragments[u].coeffs[0];
1993                     vl = s->all_fragments[l].coeffs[0];
1994
1995                     /* figure out which fragments are valid */
1996                     ful = FRAME_CODED(ul) && COMPATIBLE_FRAME(ul);
1997                     fu = FRAME_CODED(u) && COMPATIBLE_FRAME(u);
1998                     fl = FRAME_CODED(l) && COMPATIBLE_FRAME(l);
1999
2000                     /* decide which predictor transform to use */
2001                     transform = (fl*PL) | (fu*PU) | (ful*PUL);
2002
2003                     break;
2004
2005                 }
2006
2007                 debug_dc_pred("transform = %d, ", transform);
2008
2009                 if (transform == 0) {
2010
2011                     /* if there were no fragments to predict from, use last
2012                      * DC saved */
2013                     s->all_fragments[i].coeffs[0] += last_dc[current_frame_type];
2014                     debug_dc_pred("from last DC (%d) = %d\n", 
2015                         current_frame_type, s->all_fragments[i].coeffs[0]);
2016
2017                 } else {
2018
2019                     /* apply the appropriate predictor transform */
2020                     predicted_dc =
2021                         (predictor_transform[transform][0] * vul) +
2022                         (predictor_transform[transform][1] * vu) +
2023                         (predictor_transform[transform][2] * vur) +
2024                         (predictor_transform[transform][3] * vl);
2025
2026                     /* if there is a shift value in the transform, add
2027                      * the sign bit before the shift */
2028                     if (predictor_transform[transform][5] != 0) {
2029                         predicted_dc += ((predicted_dc >> 15) & 
2030                             predictor_transform[transform][4]);
2031                         predicted_dc >>= predictor_transform[transform][5];
2032                     }
2033
2034                     /* check for outranging on the [ul u l] and
2035                      * [ul u ur l] predictors */
2036                     if ((transform == 13) || (transform == 15)) {
2037                         if (iabs(predicted_dc - vu) > 128)
2038                             predicted_dc = vu;
2039                         else if (iabs(predicted_dc - vl) > 128)
2040                             predicted_dc = vl;
2041                         else if (iabs(predicted_dc - vul) > 128)
2042                             predicted_dc = vul;
2043                     }
2044
2045                     /* at long last, apply the predictor */
2046                     s->all_fragments[i].coeffs[0] += predicted_dc;
2047                     debug_dc_pred("from pred DC = %d\n", 
2048                     s->all_fragments[i].coeffs[0]);
2049                 }
2050
2051                 /* save the DC */
2052                 last_dc[current_frame_type] = s->all_fragments[i].coeffs[0];
2053             }
2054         }
2055     }
2056 }
2057
2058 /*
2059  * This function performs the final rendering of each fragment's data
2060  * onto the output frame.
2061  */
2062 static void render_fragments(Vp3DecodeContext *s,
2063                              int first_fragment,
2064                              int width,
2065                              int height,
2066                              int plane /* 0 = Y, 1 = U, 2 = V */) 
2067 {
2068     int x, y;
2069     int m, n;
2070     int i = first_fragment;
2071     int j;
2072     int16_t *dequantizer;
2073     DCTELEM dequant_block[64];
2074     DCTELEM dequant_block_permuted[64];
2075     unsigned char *output_plane;
2076     unsigned char *last_plane;
2077     unsigned char *golden_plane;
2078     int stride;
2079     int motion_x, motion_y;
2080     int upper_motion_limit, lower_motion_limit;
2081     int motion_halfpel_index;
2082     unsigned int motion_source;
2083
2084     debug_vp3("  vp3: rendering final fragments for %s\n",
2085         (plane == 0) ? "Y plane" : (plane == 1) ? "U plane" : "V plane");
2086
2087     /* set up plane-specific parameters */
2088     if (plane == 0) {
2089         dequantizer = s->intra_y_dequant;
2090         output_plane = s->current_frame.data[0];
2091         last_plane = s->last_frame.data[0];
2092         golden_plane = s->golden_frame.data[0];
2093         stride = -s->current_frame.linesize[0];
2094         upper_motion_limit = 7 * s->current_frame.linesize[0];
2095         lower_motion_limit = height * s->current_frame.linesize[0] + width - 8;
2096     } else if (plane == 1) {
2097         dequantizer = s->intra_c_dequant;
2098         output_plane = s->current_frame.data[1];
2099         last_plane = s->last_frame.data[1];
2100         golden_plane = s->golden_frame.data[1];
2101         stride = -s->current_frame.linesize[1];
2102         upper_motion_limit = 7 * s->current_frame.linesize[1];
2103         lower_motion_limit = height * s->current_frame.linesize[1] + width - 8;
2104     } else {
2105         dequantizer = s->intra_c_dequant;
2106         output_plane = s->current_frame.data[2];
2107         last_plane = s->last_frame.data[2];
2108         golden_plane = s->golden_frame.data[2];
2109         stride = -s->current_frame.linesize[2];
2110         upper_motion_limit = 7 * s->current_frame.linesize[2];
2111         lower_motion_limit = height * s->current_frame.linesize[2] + width - 8;
2112     }
2113
2114     /* for each fragment row... */
2115     for (y = 0; y < height; y += 8) {
2116
2117         /* for each fragment in a row... */
2118         for (x = 0; x < width; x += 8, i++) {
2119
2120             /* transform if this block was coded */
2121             if (s->all_fragments[i].coding_method != MODE_COPY) {
2122
2123                 /* sort out the motion vector */
2124                 motion_x = s->all_fragments[i].motion_x;
2125                 motion_y = s->all_fragments[i].motion_y;
2126                 motion_halfpel_index = s->all_fragments[i].motion_halfpel_index;
2127
2128                 motion_source = s->all_fragments[i].first_pixel;
2129                 motion_source += motion_x;
2130                 motion_source += (motion_y * stride);
2131
2132                 /* if the are any problems with a motion vector, refuse
2133                  * to render the block */
2134                 if ((motion_source < upper_motion_limit) ||
2135                     (motion_source > lower_motion_limit)) {
2136 //                    printf ("  vp3: help! motion source (%d) out of range (%d..%d)\n",
2137 //                        motion_source, upper_motion_limit, lower_motion_limit);
2138                     continue;
2139                 }
2140
2141                 /* first, take care of copying a block from either the
2142                  * previous or the golden frame */
2143                 if ((s->all_fragments[i].coding_method == MODE_USING_GOLDEN) ||
2144                     (s->all_fragments[i].coding_method == MODE_GOLDEN_MV)) {
2145
2146                     s->dsp.put_pixels_tab[1][motion_halfpel_index](
2147                         output_plane + s->all_fragments[i].first_pixel,
2148                         golden_plane + motion_source,
2149                         stride, 8);
2150
2151                 } else 
2152                 if (s->all_fragments[i].coding_method != MODE_INTRA) {
2153
2154                     s->dsp.put_pixels_tab[1][motion_halfpel_index](
2155                         output_plane + s->all_fragments[i].first_pixel,
2156                         last_plane + motion_source,
2157                         stride, 8);
2158                 }
2159
2160                 /* dequantize the DCT coefficients */
2161                 debug_idct("fragment %d, coding mode %d, DC = %d, dequant = %d:\n", 
2162                     i, s->all_fragments[i].coding_method, 
2163                     s->all_fragments[i].coeffs[0], dequantizer[0]);
2164                 for (j = 0; j < 64; j++)
2165                     dequant_block[dezigzag_index[j]] =
2166                         s->all_fragments[i].coeffs[j] *
2167                         dequantizer[j];
2168                 for (j = 0; j < 64; j++)
2169                     dequant_block_permuted[s->dsp.idct_permutation[j]] =
2170                         dequant_block[j];
2171
2172                 debug_idct("dequantized block:\n");
2173                 for (m = 0; m < 8; m++) {
2174                     for (n = 0; n < 8; n++) {
2175                         debug_idct(" %5d", dequant_block[m * 8 + n]);
2176                     }
2177                     debug_idct("\n");
2178                 }
2179                 debug_idct("\n");
2180
2181                 /* invert DCT and place (or add) in final output */
2182
2183                 if (s->all_fragments[i].coding_method == MODE_INTRA) {
2184                     dequant_block_permuted[0] += 1024;
2185                     s->dsp.idct_put(
2186                         output_plane + s->all_fragments[i].first_pixel,
2187                         stride, dequant_block_permuted);
2188                 } else {
2189                     s->dsp.idct_add(
2190                         output_plane + s->all_fragments[i].first_pixel,
2191                         stride, dequant_block_permuted);
2192                 }
2193
2194                 debug_idct("block after idct_%s():\n",
2195                     (s->all_fragments[i].coding_method == MODE_INTRA)?
2196                     "put" : "add");
2197                 for (m = 0; m < 8; m++) {
2198                     for (n = 0; n < 8; n++) {
2199                         debug_idct(" %3d", *(output_plane + 
2200                             s->all_fragments[i].first_pixel + (m * stride + n)));
2201                     }
2202                     debug_idct("\n");
2203                 }
2204                 debug_idct("\n");
2205
2206             } else {
2207
2208                 /* copy directly from the previous frame */
2209                 s->dsp.put_pixels_tab[1][0](
2210                     output_plane + s->all_fragments[i].first_pixel,
2211                     last_plane + s->all_fragments[i].first_pixel,
2212                     stride, 8);
2213
2214             }
2215         }
2216     }
2217
2218     emms_c();
2219
2220 }
2221
2222 /* 
2223  * This function computes the first pixel addresses for each fragment.
2224  * This function needs to be invoked after the first frame is allocated
2225  * so that it has access to the plane strides.
2226  */
2227 static void vp3_calculate_pixel_addresses(Vp3DecodeContext *s) 
2228 {
2229
2230     int i, x, y;
2231
2232     /* figure out the first pixel addresses for each of the fragments */
2233     /* Y plane */
2234     i = 0;
2235     for (y = s->fragment_height; y > 0; y--) {
2236         for (x = 0; x < s->fragment_width; x++) {
2237             s->all_fragments[i++].first_pixel = 
2238                 s->golden_frame.linesize[0] * y * FRAGMENT_PIXELS -
2239                     s->golden_frame.linesize[0] +
2240                     x * FRAGMENT_PIXELS;
2241             debug_init("  fragment %d, first pixel @ %d\n", 
2242                 i-1, s->all_fragments[i-1].first_pixel);
2243         }
2244     }
2245
2246     /* U plane */
2247     i = s->u_fragment_start;
2248     for (y = s->fragment_height / 2; y > 0; y--) {
2249         for (x = 0; x < s->fragment_width / 2; x++) {
2250             s->all_fragments[i++].first_pixel = 
2251                 s->golden_frame.linesize[1] * y * FRAGMENT_PIXELS -
2252                     s->golden_frame.linesize[1] +
2253                     x * FRAGMENT_PIXELS;
2254             debug_init("  fragment %d, first pixel @ %d\n", 
2255                 i-1, s->all_fragments[i-1].first_pixel);
2256         }
2257     }
2258
2259     /* V plane */
2260     i = s->v_fragment_start;
2261     for (y = s->fragment_height / 2; y > 0; y--) {
2262         for (x = 0; x < s->fragment_width / 2; x++) {
2263             s->all_fragments[i++].first_pixel = 
2264                 s->golden_frame.linesize[2] * y * FRAGMENT_PIXELS -
2265                     s->golden_frame.linesize[2] +
2266                     x * FRAGMENT_PIXELS;
2267             debug_init("  fragment %d, first pixel @ %d\n", 
2268                 i-1, s->all_fragments[i-1].first_pixel);
2269         }
2270     }
2271 }
2272
2273 /*
2274  * This is the ffmpeg/libavcodec API init function.
2275  */
2276 static int vp3_decode_init(AVCodecContext *avctx)
2277 {
2278     Vp3DecodeContext *s = avctx->priv_data;
2279     int i;
2280     int c_width;
2281     int c_height;
2282     int y_superblock_count;
2283     int c_superblock_count;
2284
2285     s->avctx = avctx;
2286     s->width = avctx->width;
2287     s->height = avctx->height;
2288     avctx->pix_fmt = PIX_FMT_YUV420P;
2289     avctx->has_b_frames = 0;
2290     dsputil_init(&s->dsp, avctx);
2291
2292     /* initialize to an impossible value which will force a recalculation
2293      * in the first frame decode */
2294     s->quality_index = -1;
2295
2296     s->y_superblock_width = (s->width + 31) / 32;
2297     s->y_superblock_height = (s->height + 31) / 32;
2298     y_superblock_count = s->y_superblock_width * s->y_superblock_height;
2299
2300     /* work out the dimensions for the C planes */
2301     c_width = s->width / 2;
2302     c_height = s->height / 2;
2303     s->c_superblock_width = (c_width + 31) / 32;
2304     s->c_superblock_height = (c_height + 31) / 32;
2305     c_superblock_count = s->c_superblock_width * s->c_superblock_height;
2306
2307     s->superblock_count = y_superblock_count + (c_superblock_count * 2);
2308     s->u_superblock_start = y_superblock_count;
2309     s->v_superblock_start = s->u_superblock_start + c_superblock_count;
2310     s->superblock_coding = av_malloc(s->superblock_count);
2311
2312     s->macroblock_width = (s->width + 15) / 16;
2313     s->macroblock_height = (s->height + 15) / 16;
2314     s->macroblock_count = s->macroblock_width * s->macroblock_height;
2315
2316     s->fragment_width = s->width / FRAGMENT_PIXELS;
2317     s->fragment_height = s->height / FRAGMENT_PIXELS;
2318
2319     /* fragment count covers all 8x8 blocks for all 3 planes */
2320     s->fragment_count = s->fragment_width * s->fragment_height * 3 / 2;
2321     s->u_fragment_start = s->fragment_width * s->fragment_height;
2322     s->v_fragment_start = s->fragment_width * s->fragment_height * 5 / 4;
2323
2324     debug_init("  Y plane: %d x %d\n", s->width, s->height);
2325     debug_init("  C plane: %d x %d\n", c_width, c_height);
2326     debug_init("  Y superblocks: %d x %d, %d total\n",
2327         s->y_superblock_width, s->y_superblock_height, y_superblock_count);
2328     debug_init("  C superblocks: %d x %d, %d total\n",
2329         s->c_superblock_width, s->c_superblock_height, c_superblock_count);
2330     debug_init("  total superblocks = %d, U starts @ %d, V starts @ %d\n", 
2331         s->superblock_count, s->u_superblock_start, s->v_superblock_start);
2332     debug_init("  macroblocks: %d x %d, %d total\n",
2333         s->macroblock_width, s->macroblock_height, s->macroblock_count);
2334     debug_init("  %d fragments, %d x %d, u starts @ %d, v starts @ %d\n",
2335         s->fragment_count,
2336         s->fragment_width,
2337         s->fragment_height,
2338         s->u_fragment_start,
2339         s->v_fragment_start);
2340
2341     s->all_fragments = av_malloc(s->fragment_count * sizeof(Vp3Fragment));
2342     s->coded_fragment_list = av_malloc(s->fragment_count * sizeof(int));
2343     s->pixel_addresses_inited = 0;
2344
2345     /* init VLC tables */
2346     for (i = 0; i < 16; i++) {
2347
2348         /* DC histograms */
2349         init_vlc(&s->dc_vlc[i], 5, 32,
2350             &dc_bias[i][0][1], 4, 2,
2351             &dc_bias[i][0][0], 4, 2);
2352
2353         /* group 1 AC histograms */
2354         init_vlc(&s->ac_vlc_1[i], 5, 32,
2355             &ac_bias_0[i][0][1], 4, 2,
2356             &ac_bias_0[i][0][0], 4, 2);
2357
2358         /* group 2 AC histograms */
2359         init_vlc(&s->ac_vlc_2[i], 5, 32,
2360             &ac_bias_1[i][0][1], 4, 2,
2361             &ac_bias_1[i][0][0], 4, 2);
2362
2363         /* group 3 AC histograms */
2364         init_vlc(&s->ac_vlc_3[i], 5, 32,
2365             &ac_bias_2[i][0][1], 4, 2,
2366             &ac_bias_2[i][0][0], 4, 2);
2367
2368         /* group 4 AC histograms */
2369         init_vlc(&s->ac_vlc_4[i], 5, 32,
2370             &ac_bias_3[i][0][1], 4, 2,
2371             &ac_bias_3[i][0][0], 4, 2);
2372     }
2373
2374     /* build quantization zigzag table */
2375     for (i = 0; i < 64; i++)
2376         zigzag_index[dezigzag_index[i]] = i;
2377
2378     /* work out the block mapping tables */
2379     s->superblock_fragments = av_malloc(s->superblock_count * 16 * sizeof(int));
2380     s->superblock_macroblocks = av_malloc(s->superblock_count * 4 * sizeof(int));
2381     s->macroblock_fragments = av_malloc(s->macroblock_count * 6 * sizeof(int));
2382     s->macroblock_coding = av_malloc(s->macroblock_count + 1);
2383     init_block_mapping(s);
2384
2385     for (i = 0; i < 3; i++) {
2386         s->current_frame.data[i] = NULL;
2387         s->last_frame.data[i] = NULL;
2388         s->golden_frame.data[i] = NULL;
2389     }
2390
2391     return 0;
2392 }
2393
2394 /*
2395  * This is the ffmpeg/libavcodec API frame decode function.
2396  */
2397 static int vp3_decode_frame(AVCodecContext *avctx, 
2398                             void *data, int *data_size,
2399                             uint8_t *buf, int buf_size)
2400 {
2401     Vp3DecodeContext *s = avctx->priv_data;
2402     GetBitContext gb;
2403     static int counter = 0;
2404
2405     *data_size = 0;
2406
2407     init_get_bits(&gb, buf, buf_size * 8);
2408
2409     s->keyframe = get_bits(&gb, 1);
2410     s->keyframe ^= 1;
2411     skip_bits(&gb, 1);
2412     s->last_quality_index = s->quality_index;
2413     s->quality_index = get_bits(&gb, 6);
2414     if (s->quality_index != s->last_quality_index)
2415         init_dequantizer(s);
2416
2417     debug_vp3(" VP3 frame #%d: Q index = %d", counter, s->quality_index);
2418     counter++;
2419
2420     if (s->keyframe) {
2421         if ((s->golden_frame.data[0]) &&
2422             (s->last_frame.data[0] == s->golden_frame.data[0]))
2423             avctx->release_buffer(avctx, &s->golden_frame);
2424         else if (s->last_frame.data[0])
2425             avctx->release_buffer(avctx, &s->last_frame);
2426
2427         s->golden_frame.reference = 0;
2428         if(avctx->get_buffer(avctx, &s->golden_frame) < 0) {
2429             printf("vp3: get_buffer() failed\n");
2430             return -1;
2431         }
2432
2433         /* golden frame is also the current frame */
2434         memcpy(&s->current_frame, &s->golden_frame, sizeof(AVFrame));
2435
2436         /* time to figure out pixel addresses? */
2437         if (!s->pixel_addresses_inited)
2438             vp3_calculate_pixel_addresses(s);
2439
2440     } else {
2441
2442         /* allocate a new current frame */
2443         s->current_frame.reference = 0;
2444         if(avctx->get_buffer(avctx, &s->current_frame) < 0) {
2445             printf("vp3: get_buffer() failed\n");
2446             return -1;
2447         }
2448
2449     }
2450
2451     if (s->keyframe) {
2452       debug_vp3(", keyframe\n");
2453       /* skip the other 2 header bytes for now */
2454       skip_bits(&gb, 16);
2455     } else
2456       debug_vp3("\n");
2457
2458     init_frame(s, &gb);
2459
2460 #if KEYFRAMES_ONLY
2461 if (!s->keyframe) {
2462
2463     memcpy(s->current_frame.data[0], s->golden_frame.data[0],
2464         s->current_frame.linesize[0] * s->height);
2465     memcpy(s->current_frame.data[1], s->golden_frame.data[1],
2466         s->current_frame.linesize[1] * s->height / 2);
2467     memcpy(s->current_frame.data[2], s->golden_frame.data[2],
2468         s->current_frame.linesize[2] * s->height / 2);
2469
2470 } else {
2471 #endif
2472
2473     if (unpack_superblocks(s, &gb) ||
2474         unpack_modes(s, &gb) ||
2475         unpack_vectors(s, &gb) ||
2476         unpack_dct_coeffs(s, &gb)) {
2477
2478         printf("  vp3: could not decode frame\n");
2479         return -1;
2480     }
2481
2482     reverse_dc_prediction(s, 0, s->fragment_width, s->fragment_height);
2483     reverse_dc_prediction(s, s->u_fragment_start,
2484         s->fragment_width / 2, s->fragment_height / 2);
2485     reverse_dc_prediction(s, s->v_fragment_start,
2486         s->fragment_width / 2, s->fragment_height / 2);
2487
2488     render_fragments(s, 0, s->width, s->height, 0);
2489     render_fragments(s, s->u_fragment_start, s->width / 2, s->height / 2, 1);
2490     render_fragments(s, s->v_fragment_start, s->width / 2, s->height / 2, 2);
2491
2492 #if KEYFRAMES_ONLY
2493 }
2494 #endif
2495
2496     *data_size=sizeof(AVFrame);
2497     *(AVFrame*)data= s->current_frame;
2498
2499     /* release the last frame, if it is allocated and if it is not the
2500      * golden frame */
2501     if ((s->last_frame.data[0]) &&
2502         (s->last_frame.data[0] != s->golden_frame.data[0]))
2503         avctx->release_buffer(avctx, &s->last_frame);
2504
2505     /* shuffle frames (last = current) */
2506     memcpy(&s->last_frame, &s->current_frame, sizeof(AVFrame));
2507
2508     return buf_size;
2509 }
2510
2511 /*
2512  * This is the ffmpeg/libavcodec API module cleanup function.
2513  */
2514 static int vp3_decode_end(AVCodecContext *avctx)
2515 {
2516     Vp3DecodeContext *s = avctx->priv_data;
2517
2518     av_free(s->all_fragments);
2519     av_free(s->coded_fragment_list);
2520     av_free(s->superblock_fragments);
2521     av_free(s->superblock_macroblocks);
2522     av_free(s->macroblock_fragments);
2523     av_free(s->macroblock_coding);
2524
2525     /* release all frames */
2526     if (s->golden_frame.data[0])
2527         avctx->release_buffer(avctx, &s->golden_frame);
2528     if (s->last_frame.data[0])
2529         avctx->release_buffer(avctx, &s->last_frame);
2530     /* no need to release the current_frame since it will always be pointing
2531      * to the same frame as either the golden or last frame */
2532
2533     return 0;
2534 }
2535
2536 AVCodec vp3_decoder = {
2537     "vp3",
2538     CODEC_TYPE_VIDEO,
2539     CODEC_ID_VP3,
2540     sizeof(Vp3DecodeContext),
2541     vp3_decode_init,
2542     NULL,
2543     vp3_decode_end,
2544     vp3_decode_frame,
2545     0,
2546     NULL
2547 };