2 * Copyright (C) 2003-2004 the ffmpeg project
4 * This file is part of FFmpeg.
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 * On2 VP3 Video Decoder
26 * VP3 Video Decoder by Mike Melanson (mike at multimedia.cx)
27 * For more information about the VP3 coding process, visit:
28 * http://multimedia.cx/
30 * Theora decoder by Alex Beregszaszi
40 #include "mpegvideo.h"
45 #define FRAGMENT_PIXELS 8
50 * Define one or more of the following compile-time variables to 1 to obtain
51 * elaborate information about certain aspects of the decoding process.
53 * KEYFRAMES_ONLY: set this to 1 to only see keyframes (VP3 slideshow mode)
54 * DEBUG_VP3: high-level decoding flow
55 * DEBUG_INIT: initialization parameters
56 * DEBUG_DEQUANTIZERS: display how the dequanization tables are built
57 * DEBUG_BLOCK_CODING: unpacking the superblock/macroblock/fragment coding
58 * DEBUG_MODES: unpacking the coding modes for individual fragments
59 * DEBUG_VECTORS: display the motion vectors
60 * DEBUG_TOKEN: display exhaustive information about each DCT token
61 * DEBUG_VLC: display the VLCs as they are extracted from the stream
62 * DEBUG_DC_PRED: display the process of reversing DC prediction
63 * DEBUG_IDCT: show every detail of the IDCT process
66 #define KEYFRAMES_ONLY 0
70 #define DEBUG_DEQUANTIZERS 0
71 #define DEBUG_BLOCK_CODING 0
73 #define DEBUG_VECTORS 0
76 #define DEBUG_DC_PRED 0
80 #define debug_vp3(args...) av_log(NULL, AV_LOG_DEBUG, ## args)
82 static inline void debug_vp3(const char *format
, ...) { }
86 #define debug_init(args...) av_log(NULL, AV_LOG_DEBUG, ## args)
88 static inline void debug_init(const char *format
, ...) { }
91 #if DEBUG_DEQUANTIZERS
92 #define debug_dequantizers(args...) av_log(NULL, AV_LOG_DEBUG, ## args)
94 static inline void debug_dequantizers(const char *format
, ...) { }
97 #if DEBUG_BLOCK_CODING
98 #define debug_block_coding(args...) av_log(NULL, AV_LOG_DEBUG, ## args)
100 static inline void debug_block_coding(const char *format
, ...) { }
104 #define debug_modes(args...) av_log(NULL, AV_LOG_DEBUG, ## args)
106 static inline void debug_modes(const char *format
, ...) { }
110 #define debug_vectors(args...) av_log(NULL, AV_LOG_DEBUG, ## args)
112 static inline void debug_vectors(const char *format
, ...) { }
116 #define debug_token(args...) av_log(NULL, AV_LOG_DEBUG, ## args)
118 static inline void debug_token(const char *format
, ...) { }
122 #define debug_vlc(args...) av_log(NULL, AV_LOG_DEBUG, ## args)
124 static inline void debug_vlc(const char *format
, ...) { }
128 #define debug_dc_pred(args...) av_log(NULL, AV_LOG_DEBUG, ## args)
130 static inline void debug_dc_pred(const char *format
, ...) { }
134 #define debug_idct(args...) av_log(NULL, AV_LOG_DEBUG, ## args)
136 static inline void debug_idct(const char *format
, ...) { }
139 typedef struct Coeff
{
145 //FIXME split things out into their own arrays
146 typedef struct Vp3Fragment
{
148 /* address of first pixel taking into account which plane the fragment
149 * lives on as well as the plane stride */
151 /* this is the macroblock that the fragment belongs to */
153 uint8_t coding_method
;
159 #define SB_NOT_CODED 0
160 #define SB_PARTIALLY_CODED 1
161 #define SB_FULLY_CODED 2
163 #define MODE_INTER_NO_MV 0
165 #define MODE_INTER_PLUS_MV 2
166 #define MODE_INTER_LAST_MV 3
167 #define MODE_INTER_PRIOR_LAST 4
168 #define MODE_USING_GOLDEN 5
169 #define MODE_GOLDEN_MV 6
170 #define MODE_INTER_FOURMV 7
171 #define CODING_MODE_COUNT 8
173 /* special internal mode */
176 /* There are 6 preset schemes, plus a free-form scheme */
177 static int ModeAlphabet
[7][CODING_MODE_COUNT
] =
179 /* this is the custom scheme */
180 { 0, 0, 0, 0, 0, 0, 0, 0 },
182 /* scheme 1: Last motion vector dominates */
183 { MODE_INTER_LAST_MV
, MODE_INTER_PRIOR_LAST
,
184 MODE_INTER_PLUS_MV
, MODE_INTER_NO_MV
,
185 MODE_INTRA
, MODE_USING_GOLDEN
,
186 MODE_GOLDEN_MV
, MODE_INTER_FOURMV
},
189 { MODE_INTER_LAST_MV
, MODE_INTER_PRIOR_LAST
,
190 MODE_INTER_NO_MV
, MODE_INTER_PLUS_MV
,
191 MODE_INTRA
, MODE_USING_GOLDEN
,
192 MODE_GOLDEN_MV
, MODE_INTER_FOURMV
},
195 { MODE_INTER_LAST_MV
, MODE_INTER_PLUS_MV
,
196 MODE_INTER_PRIOR_LAST
, MODE_INTER_NO_MV
,
197 MODE_INTRA
, MODE_USING_GOLDEN
,
198 MODE_GOLDEN_MV
, MODE_INTER_FOURMV
},
201 { MODE_INTER_LAST_MV
, MODE_INTER_PLUS_MV
,
202 MODE_INTER_NO_MV
, MODE_INTER_PRIOR_LAST
,
203 MODE_INTRA
, MODE_USING_GOLDEN
,
204 MODE_GOLDEN_MV
, MODE_INTER_FOURMV
},
206 /* scheme 5: No motion vector dominates */
207 { MODE_INTER_NO_MV
, MODE_INTER_LAST_MV
,
208 MODE_INTER_PRIOR_LAST
, MODE_INTER_PLUS_MV
,
209 MODE_INTRA
, MODE_USING_GOLDEN
,
210 MODE_GOLDEN_MV
, MODE_INTER_FOURMV
},
213 { MODE_INTER_NO_MV
, MODE_USING_GOLDEN
,
214 MODE_INTER_LAST_MV
, MODE_INTER_PRIOR_LAST
,
215 MODE_INTER_PLUS_MV
, MODE_INTRA
,
216 MODE_GOLDEN_MV
, MODE_INTER_FOURMV
},
220 #define MIN_DEQUANT_VAL 2
222 typedef struct Vp3DecodeContext
{
223 AVCodecContext
*avctx
;
224 int theora
, theora_tables
;
227 AVFrame golden_frame
;
229 AVFrame current_frame
;
237 int last_quality_index
;
239 int superblock_count
;
240 int superblock_width
;
241 int superblock_height
;
242 int y_superblock_width
;
243 int y_superblock_height
;
244 int c_superblock_width
;
245 int c_superblock_height
;
246 int u_superblock_start
;
247 int v_superblock_start
;
248 unsigned char *superblock_coding
;
250 int macroblock_count
;
251 int macroblock_width
;
252 int macroblock_height
;
258 Vp3Fragment
*all_fragments
;
261 int fragment_start
[3];
266 uint16_t coded_dc_scale_factor
[64];
267 uint32_t coded_ac_scale_factor
[64];
268 uint8_t base_matrix
[384][64];
269 uint8_t qr_count
[2][3];
270 uint8_t qr_size
[2][3][64];
271 uint16_t qr_base
[2][3][64];
273 /* this is a list of indices into the all_fragments array indicating
274 * which of the fragments are coded */
275 int *coded_fragment_list
;
276 int coded_fragment_list_index
;
277 int pixel_addresses_inited
;
285 VLC superblock_run_length_vlc
;
286 VLC fragment_run_length_vlc
;
288 VLC motion_vector_vlc
;
290 /* these arrays need to be on 16-byte boundaries since SSE2 operations
292 DECLARE_ALIGNED_16(int16_t, qmat
[2][4][64]); //<qmat[is_inter][plane]
294 /* This table contains superblock_count * 16 entries. Each set of 16
295 * numbers corresponds to the fragment indices 0..15 of the superblock.
296 * An entry will be -1 to indicate that no entry corresponds to that
298 int *superblock_fragments
;
300 /* This table contains superblock_count * 4 entries. Each set of 4
301 * numbers corresponds to the macroblock indices 0..3 of the superblock.
302 * An entry will be -1 to indicate that no entry corresponds to that
304 int *superblock_macroblocks
;
306 /* This table contains macroblock_count * 6 entries. Each set of 6
307 * numbers corresponds to the fragment indices 0..5 which comprise
308 * the macroblock (4 Y fragments and 2 C fragments). */
309 int *macroblock_fragments
;
310 /* This is an array that indicates how a particular macroblock
312 unsigned char *macroblock_coding
;
314 int first_coded_y_fragment
;
315 int first_coded_c_fragment
;
316 int last_coded_y_fragment
;
317 int last_coded_c_fragment
;
319 uint8_t edge_emu_buffer
[9*2048]; //FIXME dynamic alloc
320 int8_t qscale_table
[2048]; //FIXME dynamic alloc (width+15)/16
327 uint16_t huffman_table
[80][32][2];
329 uint32_t filter_limit_values
[64];
330 int bounding_values_array
[256];
333 /************************************************************************
334 * VP3 specific functions
335 ************************************************************************/
338 * This function sets up all of the various blocks mappings:
339 * superblocks <-> fragments, macroblocks <-> fragments,
340 * superblocks <-> macroblocks
342 * Returns 0 is successful; returns 1 if *anything* went wrong.
344 static int init_block_mapping(Vp3DecodeContext
*s
)
347 signed int hilbert_walk_mb
[4];
349 int current_fragment
= 0;
350 int current_width
= 0;
351 int current_height
= 0;
354 int superblock_row_inc
= 0;
356 int mapping_index
= 0;
358 int current_macroblock
;
361 signed char travel_width
[16] = {
368 signed char travel_height
[16] = {
375 signed char travel_width_mb
[4] = {
379 signed char travel_height_mb
[4] = {
383 debug_vp3(" vp3: initialize block mapping tables\n");
385 hilbert_walk_mb
[0] = 1;
386 hilbert_walk_mb
[1] = s
->macroblock_width
;
387 hilbert_walk_mb
[2] = 1;
388 hilbert_walk_mb
[3] = -s
->macroblock_width
;
390 /* iterate through each superblock (all planes) and map the fragments */
391 for (i
= 0; i
< s
->superblock_count
; i
++) {
392 debug_init(" superblock %d (u starts @ %d, v starts @ %d)\n",
393 i
, s
->u_superblock_start
, s
->v_superblock_start
);
395 /* time to re-assign the limits? */
398 /* start of Y superblocks */
399 right_edge
= s
->fragment_width
;
400 bottom_edge
= s
->fragment_height
;
403 superblock_row_inc
= 3 * s
->fragment_width
-
404 (s
->y_superblock_width
* 4 - s
->fragment_width
);
406 /* the first operation for this variable is to advance by 1 */
407 current_fragment
= -1;
409 } else if (i
== s
->u_superblock_start
) {
411 /* start of U superblocks */
412 right_edge
= s
->fragment_width
/ 2;
413 bottom_edge
= s
->fragment_height
/ 2;
416 superblock_row_inc
= 3 * (s
->fragment_width
/ 2) -
417 (s
->c_superblock_width
* 4 - s
->fragment_width
/ 2);
419 /* the first operation for this variable is to advance by 1 */
420 current_fragment
= s
->fragment_start
[1] - 1;
422 } else if (i
== s
->v_superblock_start
) {
424 /* start of V superblocks */
425 right_edge
= s
->fragment_width
/ 2;
426 bottom_edge
= s
->fragment_height
/ 2;
429 superblock_row_inc
= 3 * (s
->fragment_width
/ 2) -
430 (s
->c_superblock_width
* 4 - s
->fragment_width
/ 2);
432 /* the first operation for this variable is to advance by 1 */
433 current_fragment
= s
->fragment_start
[2] - 1;
437 if (current_width
>= right_edge
- 1) {
438 /* reset width and move to next superblock row */
442 /* fragment is now at the start of a new superblock row */
443 current_fragment
+= superblock_row_inc
;
446 /* iterate through all 16 fragments in a superblock */
447 for (j
= 0; j
< 16; j
++) {
448 current_fragment
+= travel_width
[j
] + right_edge
* travel_height
[j
];
449 current_width
+= travel_width
[j
];
450 current_height
+= travel_height
[j
];
452 /* check if the fragment is in bounds */
453 if ((current_width
< right_edge
) &&
454 (current_height
< bottom_edge
)) {
455 s
->superblock_fragments
[mapping_index
] = current_fragment
;
456 debug_init(" mapping fragment %d to superblock %d, position %d (%d/%d x %d/%d)\n",
457 s
->superblock_fragments
[mapping_index
], i
, j
,
458 current_width
, right_edge
, current_height
, bottom_edge
);
460 s
->superblock_fragments
[mapping_index
] = -1;
461 debug_init(" superblock %d, position %d has no fragment (%d/%d x %d/%d)\n",
463 current_width
, right_edge
, current_height
, bottom_edge
);
470 /* initialize the superblock <-> macroblock mapping; iterate through
471 * all of the Y plane superblocks to build this mapping */
472 right_edge
= s
->macroblock_width
;
473 bottom_edge
= s
->macroblock_height
;
476 superblock_row_inc
= s
->macroblock_width
-
477 (s
->y_superblock_width
* 2 - s
->macroblock_width
);;
478 hilbert
= hilbert_walk_mb
;
480 current_macroblock
= -1;
481 for (i
= 0; i
< s
->u_superblock_start
; i
++) {
483 if (current_width
>= right_edge
- 1) {
484 /* reset width and move to next superblock row */
488 /* macroblock is now at the start of a new superblock row */
489 current_macroblock
+= superblock_row_inc
;
492 /* iterate through each potential macroblock in the superblock */
493 for (j
= 0; j
< 4; j
++) {
494 current_macroblock
+= hilbert_walk_mb
[j
];
495 current_width
+= travel_width_mb
[j
];
496 current_height
+= travel_height_mb
[j
];
498 /* check if the macroblock is in bounds */
499 if ((current_width
< right_edge
) &&
500 (current_height
< bottom_edge
)) {
501 s
->superblock_macroblocks
[mapping_index
] = current_macroblock
;
502 debug_init(" mapping macroblock %d to superblock %d, position %d (%d/%d x %d/%d)\n",
503 s
->superblock_macroblocks
[mapping_index
], i
, j
,
504 current_width
, right_edge
, current_height
, bottom_edge
);
506 s
->superblock_macroblocks
[mapping_index
] = -1;
507 debug_init(" superblock %d, position %d has no macroblock (%d/%d x %d/%d)\n",
509 current_width
, right_edge
, current_height
, bottom_edge
);
516 /* initialize the macroblock <-> fragment mapping */
517 current_fragment
= 0;
518 current_macroblock
= 0;
520 for (i
= 0; i
< s
->fragment_height
; i
+= 2) {
522 for (j
= 0; j
< s
->fragment_width
; j
+= 2) {
524 debug_init(" macroblock %d contains fragments: ", current_macroblock
);
525 s
->all_fragments
[current_fragment
].macroblock
= current_macroblock
;
526 s
->macroblock_fragments
[mapping_index
++] = current_fragment
;
527 debug_init("%d ", current_fragment
);
529 if (j
+ 1 < s
->fragment_width
) {
530 s
->all_fragments
[current_fragment
+ 1].macroblock
= current_macroblock
;
531 s
->macroblock_fragments
[mapping_index
++] = current_fragment
+ 1;
532 debug_init("%d ", current_fragment
+ 1);
534 s
->macroblock_fragments
[mapping_index
++] = -1;
536 if (i
+ 1 < s
->fragment_height
) {
537 s
->all_fragments
[current_fragment
+ s
->fragment_width
].macroblock
=
539 s
->macroblock_fragments
[mapping_index
++] =
540 current_fragment
+ s
->fragment_width
;
541 debug_init("%d ", current_fragment
+ s
->fragment_width
);
543 s
->macroblock_fragments
[mapping_index
++] = -1;
545 if ((j
+ 1 < s
->fragment_width
) && (i
+ 1 < s
->fragment_height
)) {
546 s
->all_fragments
[current_fragment
+ s
->fragment_width
+ 1].macroblock
=
548 s
->macroblock_fragments
[mapping_index
++] =
549 current_fragment
+ s
->fragment_width
+ 1;
550 debug_init("%d ", current_fragment
+ s
->fragment_width
+ 1);
552 s
->macroblock_fragments
[mapping_index
++] = -1;
555 c_fragment
= s
->fragment_start
[1] +
556 (i
* s
->fragment_width
/ 4) + (j
/ 2);
557 s
->all_fragments
[c_fragment
].macroblock
= s
->macroblock_count
;
558 s
->macroblock_fragments
[mapping_index
++] = c_fragment
;
559 debug_init("%d ", c_fragment
);
561 c_fragment
= s
->fragment_start
[2] +
562 (i
* s
->fragment_width
/ 4) + (j
/ 2);
563 s
->all_fragments
[c_fragment
].macroblock
= s
->macroblock_count
;
564 s
->macroblock_fragments
[mapping_index
++] = c_fragment
;
565 debug_init("%d ", c_fragment
);
569 if (j
+ 2 <= s
->fragment_width
)
570 current_fragment
+= 2;
573 current_macroblock
++;
576 current_fragment
+= s
->fragment_width
;
579 return 0; /* successful path out */
583 * This function wipes out all of the fragment data.
585 static void init_frame(Vp3DecodeContext
*s
, GetBitContext
*gb
)
589 /* zero out all of the fragment information */
590 s
->coded_fragment_list_index
= 0;
591 for (i
= 0; i
< s
->fragment_count
; i
++) {
592 s
->all_fragments
[i
].coeff_count
= 0;
593 s
->all_fragments
[i
].motion_x
= 127;
594 s
->all_fragments
[i
].motion_y
= 127;
595 s
->all_fragments
[i
].next_coeff
= NULL
;
597 s
->coeffs
[i
].coeff
=0;
598 s
->coeffs
[i
].next
= NULL
;
603 * This function sets up the dequantization tables used for a particular
606 static void init_dequantizer(Vp3DecodeContext
*s
)
608 int ac_scale_factor
= s
->coded_ac_scale_factor
[s
->quality_index
];
609 int dc_scale_factor
= s
->coded_dc_scale_factor
[s
->quality_index
];
610 int i
, plane
, inter
, qri
, bmi
, bmj
, qistart
;
612 debug_vp3(" vp3: initializing dequantization tables\n");
614 for(inter
=0; inter
<2; inter
++){
615 for(plane
=0; plane
<3; plane
++){
617 for(qri
=0; qri
<s
->qr_count
[inter
][plane
]; qri
++){
618 sum
+= s
->qr_size
[inter
][plane
][qri
];
619 if(s
->quality_index
<= sum
)
622 qistart
= sum
- s
->qr_size
[inter
][plane
][qri
];
623 bmi
= s
->qr_base
[inter
][plane
][qri
];
624 bmj
= s
->qr_base
[inter
][plane
][qri
+1];
626 int coeff
= ( 2*(sum
-s
->quality_index
)*s
->base_matrix
[bmi
][i
]
627 - 2*(qistart
-s
->quality_index
)*s
->base_matrix
[bmj
][i
]
628 + s
->qr_size
[inter
][plane
][qri
])
629 / (2*s
->qr_size
[inter
][plane
][qri
]);
631 int qmin
= 8<<(inter
+ !i
);
632 int qscale
= i
? ac_scale_factor
: dc_scale_factor
;
634 s
->qmat
[inter
][plane
][i
]= av_clip((qscale
* coeff
)/100 * 4, qmin
, 4096);
639 memset(s
->qscale_table
, (FFMAX(s
->qmat
[0][0][1], s
->qmat
[0][1][1])+8)/16, 512); //FIXME finetune
643 * This function initializes the loop filter boundary limits if the frame's
644 * quality index is different from the previous frame's.
646 static void init_loop_filter(Vp3DecodeContext
*s
)
648 int *bounding_values
= s
->bounding_values_array
+127;
652 filter_limit
= s
->filter_limit_values
[s
->quality_index
];
654 /* set up the bounding values */
655 memset(s
->bounding_values_array
, 0, 256 * sizeof(int));
656 for (x
= 0; x
< filter_limit
; x
++) {
657 bounding_values
[-x
- filter_limit
] = -filter_limit
+ x
;
658 bounding_values
[-x
] = -x
;
659 bounding_values
[x
] = x
;
660 bounding_values
[x
+ filter_limit
] = filter_limit
- x
;
665 * This function unpacks all of the superblock/macroblock/fragment coding
666 * information from the bitstream.
668 static int unpack_superblocks(Vp3DecodeContext
*s
, GetBitContext
*gb
)
671 int current_superblock
= 0;
673 int decode_fully_flags
= 0;
674 int decode_partial_blocks
= 0;
675 int first_c_fragment_seen
;
678 int current_fragment
;
680 debug_vp3(" vp3: unpacking superblock coding\n");
684 debug_vp3(" keyframe-- all superblocks are fully coded\n");
685 memset(s
->superblock_coding
, SB_FULLY_CODED
, s
->superblock_count
);
689 /* unpack the list of partially-coded superblocks */
690 bit
= get_bits(gb
, 1);
691 /* toggle the bit because as soon as the first run length is
692 * fetched the bit will be toggled again */
694 while (current_superblock
< s
->superblock_count
) {
695 if (current_run
-- == 0) {
697 current_run
= get_vlc2(gb
,
698 s
->superblock_run_length_vlc
.table
, 6, 2);
699 if (current_run
== 33)
700 current_run
+= get_bits(gb
, 12);
701 debug_block_coding(" setting superblocks %d..%d to %s\n",
703 current_superblock
+ current_run
- 1,
704 (bit
) ? "partially coded" : "not coded");
706 /* if any of the superblocks are not partially coded, flag
707 * a boolean to decode the list of fully-coded superblocks */
709 decode_fully_flags
= 1;
712 /* make a note of the fact that there are partially coded
714 decode_partial_blocks
= 1;
717 s
->superblock_coding
[current_superblock
++] = bit
;
720 /* unpack the list of fully coded superblocks if any of the blocks were
721 * not marked as partially coded in the previous step */
722 if (decode_fully_flags
) {
724 current_superblock
= 0;
726 bit
= get_bits(gb
, 1);
727 /* toggle the bit because as soon as the first run length is
728 * fetched the bit will be toggled again */
730 while (current_superblock
< s
->superblock_count
) {
732 /* skip any superblocks already marked as partially coded */
733 if (s
->superblock_coding
[current_superblock
] == SB_NOT_CODED
) {
735 if (current_run
-- == 0) {
737 current_run
= get_vlc2(gb
,
738 s
->superblock_run_length_vlc
.table
, 6, 2);
739 if (current_run
== 33)
740 current_run
+= get_bits(gb
, 12);
743 debug_block_coding(" setting superblock %d to %s\n",
745 (bit
) ? "fully coded" : "not coded");
746 s
->superblock_coding
[current_superblock
] = 2*bit
;
748 current_superblock
++;
752 /* if there were partial blocks, initialize bitstream for
753 * unpacking fragment codings */
754 if (decode_partial_blocks
) {
757 bit
= get_bits(gb
, 1);
758 /* toggle the bit because as soon as the first run length is
759 * fetched the bit will be toggled again */
764 /* figure out which fragments are coded; iterate through each
765 * superblock (all planes) */
766 s
->coded_fragment_list_index
= 0;
767 s
->next_coeff
= s
->coeffs
+ s
->fragment_count
;
768 s
->first_coded_y_fragment
= s
->first_coded_c_fragment
= 0;
769 s
->last_coded_y_fragment
= s
->last_coded_c_fragment
= -1;
770 first_c_fragment_seen
= 0;
771 memset(s
->macroblock_coding
, MODE_COPY
, s
->macroblock_count
);
772 for (i
= 0; i
< s
->superblock_count
; i
++) {
774 /* iterate through all 16 fragments in a superblock */
775 for (j
= 0; j
< 16; j
++) {
777 /* if the fragment is in bounds, check its coding status */
778 current_fragment
= s
->superblock_fragments
[i
* 16 + j
];
779 if (current_fragment
>= s
->fragment_count
) {
780 av_log(s
->avctx
, AV_LOG_ERROR
, " vp3:unpack_superblocks(): bad fragment number (%d >= %d)\n",
781 current_fragment
, s
->fragment_count
);
784 if (current_fragment
!= -1) {
785 if (s
->superblock_coding
[i
] == SB_NOT_CODED
) {
787 /* copy all the fragments from the prior frame */
788 s
->all_fragments
[current_fragment
].coding_method
=
791 } else if (s
->superblock_coding
[i
] == SB_PARTIALLY_CODED
) {
793 /* fragment may or may not be coded; this is the case
794 * that cares about the fragment coding runs */
795 if (current_run
-- == 0) {
797 current_run
= get_vlc2(gb
,
798 s
->fragment_run_length_vlc
.table
, 5, 2);
802 /* default mode; actual mode will be decoded in
804 s
->all_fragments
[current_fragment
].coding_method
=
806 s
->all_fragments
[current_fragment
].next_coeff
= s
->coeffs
+ current_fragment
;
807 s
->coded_fragment_list
[s
->coded_fragment_list_index
] =
809 if ((current_fragment
>= s
->fragment_start
[1]) &&
810 (s
->last_coded_y_fragment
== -1) &&
811 (!first_c_fragment_seen
)) {
812 s
->first_coded_c_fragment
= s
->coded_fragment_list_index
;
813 s
->last_coded_y_fragment
= s
->first_coded_c_fragment
- 1;
814 first_c_fragment_seen
= 1;
816 s
->coded_fragment_list_index
++;
817 s
->macroblock_coding
[s
->all_fragments
[current_fragment
].macroblock
] = MODE_INTER_NO_MV
;
818 debug_block_coding(" superblock %d is partially coded, fragment %d is coded\n",
819 i
, current_fragment
);
821 /* not coded; copy this fragment from the prior frame */
822 s
->all_fragments
[current_fragment
].coding_method
=
824 debug_block_coding(" superblock %d is partially coded, fragment %d is not coded\n",
825 i
, current_fragment
);
830 /* fragments are fully coded in this superblock; actual
831 * coding will be determined in next step */
832 s
->all_fragments
[current_fragment
].coding_method
=
834 s
->all_fragments
[current_fragment
].next_coeff
= s
->coeffs
+ current_fragment
;
835 s
->coded_fragment_list
[s
->coded_fragment_list_index
] =
837 if ((current_fragment
>= s
->fragment_start
[1]) &&
838 (s
->last_coded_y_fragment
== -1) &&
839 (!first_c_fragment_seen
)) {
840 s
->first_coded_c_fragment
= s
->coded_fragment_list_index
;
841 s
->last_coded_y_fragment
= s
->first_coded_c_fragment
- 1;
842 first_c_fragment_seen
= 1;
844 s
->coded_fragment_list_index
++;
845 s
->macroblock_coding
[s
->all_fragments
[current_fragment
].macroblock
] = MODE_INTER_NO_MV
;
846 debug_block_coding(" superblock %d is fully coded, fragment %d is coded\n",
847 i
, current_fragment
);
853 if (!first_c_fragment_seen
)
854 /* only Y fragments coded in this frame */
855 s
->last_coded_y_fragment
= s
->coded_fragment_list_index
- 1;
857 /* end the list of coded C fragments */
858 s
->last_coded_c_fragment
= s
->coded_fragment_list_index
- 1;
860 debug_block_coding(" %d total coded fragments, y: %d -> %d, c: %d -> %d\n",
861 s
->coded_fragment_list_index
,
862 s
->first_coded_y_fragment
,
863 s
->last_coded_y_fragment
,
864 s
->first_coded_c_fragment
,
865 s
->last_coded_c_fragment
);
871 * This function unpacks all the coding mode data for individual macroblocks
872 * from the bitstream.
874 static int unpack_modes(Vp3DecodeContext
*s
, GetBitContext
*gb
)
878 int current_macroblock
;
879 int current_fragment
;
882 debug_vp3(" vp3: unpacking encoding modes\n");
885 debug_vp3(" keyframe-- all blocks are coded as INTRA\n");
887 for (i
= 0; i
< s
->fragment_count
; i
++)
888 s
->all_fragments
[i
].coding_method
= MODE_INTRA
;
892 /* fetch the mode coding scheme for this frame */
893 scheme
= get_bits(gb
, 3);
894 debug_modes(" using mode alphabet %d\n", scheme
);
896 /* is it a custom coding scheme? */
898 debug_modes(" custom mode alphabet ahead:\n");
899 for (i
= 0; i
< 8; i
++)
900 ModeAlphabet
[scheme
][get_bits(gb
, 3)] = i
;
903 for (i
= 0; i
< 8; i
++)
904 debug_modes(" mode[%d][%d] = %d\n", scheme
, i
,
905 ModeAlphabet
[scheme
][i
]);
907 /* iterate through all of the macroblocks that contain 1 or more
909 for (i
= 0; i
< s
->u_superblock_start
; i
++) {
911 for (j
= 0; j
< 4; j
++) {
912 current_macroblock
= s
->superblock_macroblocks
[i
* 4 + j
];
913 if ((current_macroblock
== -1) ||
914 (s
->macroblock_coding
[current_macroblock
] == MODE_COPY
))
916 if (current_macroblock
>= s
->macroblock_count
) {
917 av_log(s
->avctx
, AV_LOG_ERROR
, " vp3:unpack_modes(): bad macroblock number (%d >= %d)\n",
918 current_macroblock
, s
->macroblock_count
);
922 /* mode 7 means get 3 bits for each coding mode */
924 coding_mode
= get_bits(gb
, 3);
926 coding_mode
= ModeAlphabet
[scheme
]
927 [get_vlc2(gb
, s
->mode_code_vlc
.table
, 3, 3)];
929 s
->macroblock_coding
[current_macroblock
] = coding_mode
;
930 for (k
= 0; k
< 6; k
++) {
932 s
->macroblock_fragments
[current_macroblock
* 6 + k
];
933 if (current_fragment
== -1)
935 if (current_fragment
>= s
->fragment_count
) {
936 av_log(s
->avctx
, AV_LOG_ERROR
, " vp3:unpack_modes(): bad fragment number (%d >= %d)\n",
937 current_fragment
, s
->fragment_count
);
940 if (s
->all_fragments
[current_fragment
].coding_method
!=
942 s
->all_fragments
[current_fragment
].coding_method
=
946 debug_modes(" coding method for macroblock starting @ fragment %d = %d\n",
947 s
->macroblock_fragments
[current_macroblock
* 6], coding_mode
);
956 * This function unpacks all the motion vectors for the individual
957 * macroblocks from the bitstream.
959 static int unpack_vectors(Vp3DecodeContext
*s
, GetBitContext
*gb
)
965 int last_motion_x
= 0;
966 int last_motion_y
= 0;
967 int prior_last_motion_x
= 0;
968 int prior_last_motion_y
= 0;
969 int current_macroblock
;
970 int current_fragment
;
972 debug_vp3(" vp3: unpacking motion vectors\n");
975 debug_vp3(" keyframe-- there are no motion vectors\n");
979 memset(motion_x
, 0, 6 * sizeof(int));
980 memset(motion_y
, 0, 6 * sizeof(int));
982 /* coding mode 0 is the VLC scheme; 1 is the fixed code scheme */
983 coding_mode
= get_bits(gb
, 1);
984 debug_vectors(" using %s scheme for unpacking motion vectors\n",
985 (coding_mode
== 0) ? "VLC" : "fixed-length");
987 /* iterate through all of the macroblocks that contain 1 or more
989 for (i
= 0; i
< s
->u_superblock_start
; i
++) {
991 for (j
= 0; j
< 4; j
++) {
992 current_macroblock
= s
->superblock_macroblocks
[i
* 4 + j
];
993 if ((current_macroblock
== -1) ||
994 (s
->macroblock_coding
[current_macroblock
] == MODE_COPY
))
996 if (current_macroblock
>= s
->macroblock_count
) {
997 av_log(s
->avctx
, AV_LOG_ERROR
, " vp3:unpack_vectors(): bad macroblock number (%d >= %d)\n",
998 current_macroblock
, s
->macroblock_count
);
1002 current_fragment
= s
->macroblock_fragments
[current_macroblock
* 6];
1003 if (current_fragment
>= s
->fragment_count
) {
1004 av_log(s
->avctx
, AV_LOG_ERROR
, " vp3:unpack_vectors(): bad fragment number (%d >= %d\n",
1005 current_fragment
, s
->fragment_count
);
1008 switch (s
->macroblock_coding
[current_macroblock
]) {
1010 case MODE_INTER_PLUS_MV
:
1011 case MODE_GOLDEN_MV
:
1012 /* all 6 fragments use the same motion vector */
1013 if (coding_mode
== 0) {
1014 motion_x
[0] = motion_vector_table
[get_vlc2(gb
, s
->motion_vector_vlc
.table
, 6, 2)];
1015 motion_y
[0] = motion_vector_table
[get_vlc2(gb
, s
->motion_vector_vlc
.table
, 6, 2)];
1017 motion_x
[0] = fixed_motion_vector_table
[get_bits(gb
, 6)];
1018 motion_y
[0] = fixed_motion_vector_table
[get_bits(gb
, 6)];
1021 for (k
= 1; k
< 6; k
++) {
1022 motion_x
[k
] = motion_x
[0];
1023 motion_y
[k
] = motion_y
[0];
1026 /* vector maintenance, only on MODE_INTER_PLUS_MV */
1027 if (s
->macroblock_coding
[current_macroblock
] ==
1028 MODE_INTER_PLUS_MV
) {
1029 prior_last_motion_x
= last_motion_x
;
1030 prior_last_motion_y
= last_motion_y
;
1031 last_motion_x
= motion_x
[0];
1032 last_motion_y
= motion_y
[0];
1036 case MODE_INTER_FOURMV
:
1037 /* fetch 4 vectors from the bitstream, one for each
1038 * Y fragment, then average for the C fragment vectors */
1039 motion_x
[4] = motion_y
[4] = 0;
1040 for (k
= 0; k
< 4; k
++) {
1041 if (coding_mode
== 0) {
1042 motion_x
[k
] = motion_vector_table
[get_vlc2(gb
, s
->motion_vector_vlc
.table
, 6, 2)];
1043 motion_y
[k
] = motion_vector_table
[get_vlc2(gb
, s
->motion_vector_vlc
.table
, 6, 2)];
1045 motion_x
[k
] = fixed_motion_vector_table
[get_bits(gb
, 6)];
1046 motion_y
[k
] = fixed_motion_vector_table
[get_bits(gb
, 6)];
1048 motion_x
[4] += motion_x
[k
];
1049 motion_y
[4] += motion_y
[k
];
1053 motion_x
[4]= RSHIFT(motion_x
[4], 2);
1055 motion_y
[4]= RSHIFT(motion_y
[4], 2);
1057 /* vector maintenance; vector[3] is treated as the
1058 * last vector in this case */
1059 prior_last_motion_x
= last_motion_x
;
1060 prior_last_motion_y
= last_motion_y
;
1061 last_motion_x
= motion_x
[3];
1062 last_motion_y
= motion_y
[3];
1065 case MODE_INTER_LAST_MV
:
1066 /* all 6 fragments use the last motion vector */
1067 motion_x
[0] = last_motion_x
;
1068 motion_y
[0] = last_motion_y
;
1069 for (k
= 1; k
< 6; k
++) {
1070 motion_x
[k
] = motion_x
[0];
1071 motion_y
[k
] = motion_y
[0];
1074 /* no vector maintenance (last vector remains the
1078 case MODE_INTER_PRIOR_LAST
:
1079 /* all 6 fragments use the motion vector prior to the
1080 * last motion vector */
1081 motion_x
[0] = prior_last_motion_x
;
1082 motion_y
[0] = prior_last_motion_y
;
1083 for (k
= 1; k
< 6; k
++) {
1084 motion_x
[k
] = motion_x
[0];
1085 motion_y
[k
] = motion_y
[0];
1088 /* vector maintenance */
1089 prior_last_motion_x
= last_motion_x
;
1090 prior_last_motion_y
= last_motion_y
;
1091 last_motion_x
= motion_x
[0];
1092 last_motion_y
= motion_y
[0];
1096 /* covers intra, inter without MV, golden without MV */
1097 memset(motion_x
, 0, 6 * sizeof(int));
1098 memset(motion_y
, 0, 6 * sizeof(int));
1100 /* no vector maintenance */
1104 /* assign the motion vectors to the correct fragments */
1105 debug_vectors(" vectors for macroblock starting @ fragment %d (coding method %d):\n",
1107 s
->macroblock_coding
[current_macroblock
]);
1108 for (k
= 0; k
< 6; k
++) {
1110 s
->macroblock_fragments
[current_macroblock
* 6 + k
];
1111 if (current_fragment
== -1)
1113 if (current_fragment
>= s
->fragment_count
) {
1114 av_log(s
->avctx
, AV_LOG_ERROR
, " vp3:unpack_vectors(): bad fragment number (%d >= %d)\n",
1115 current_fragment
, s
->fragment_count
);
1118 s
->all_fragments
[current_fragment
].motion_x
= motion_x
[k
];
1119 s
->all_fragments
[current_fragment
].motion_y
= motion_y
[k
];
1120 debug_vectors(" vector %d: fragment %d = (%d, %d)\n",
1121 k
, current_fragment
, motion_x
[k
], motion_y
[k
]);
1131 * This function is called by unpack_dct_coeffs() to extract the VLCs from
1132 * the bitstream. The VLCs encode tokens which are used to unpack DCT
1133 * data. This function unpacks all the VLCs for either the Y plane or both
1134 * C planes, and is called for DC coefficients or different AC coefficient
1135 * levels (since different coefficient types require different VLC tables.
1137 * This function returns a residual eob run. E.g, if a particular token gave
1138 * instructions to EOB the next 5 fragments and there were only 2 fragments
1139 * left in the current fragment range, 3 would be returned so that it could
1140 * be passed into the next call to this same function.
1142 static int unpack_vlcs(Vp3DecodeContext
*s
, GetBitContext
*gb
,
1143 VLC
*table
, int coeff_index
,
1144 int first_fragment
, int last_fragment
,
1151 Vp3Fragment
*fragment
;
1152 uint8_t *perm
= s
->scantable
.permutated
;
1155 if ((first_fragment
>= s
->fragment_count
) ||
1156 (last_fragment
>= s
->fragment_count
)) {
1158 av_log(s
->avctx
, AV_LOG_ERROR
, " vp3:unpack_vlcs(): bad fragment number (%d -> %d ?)\n",
1159 first_fragment
, last_fragment
);
1163 for (i
= first_fragment
; i
<= last_fragment
; i
++) {
1165 fragment
= &s
->all_fragments
[s
->coded_fragment_list
[i
]];
1166 if (fragment
->coeff_count
> coeff_index
)
1170 /* decode a VLC into a token */
1171 token
= get_vlc2(gb
, table
->table
, 5, 3);
1172 debug_vlc(" token = %2d, ", token
);
1173 /* use the token to get a zero run, a coefficient, and an eob run */
1175 eob_run
= eob_run_base
[token
];
1176 if (eob_run_get_bits
[token
])
1177 eob_run
+= get_bits(gb
, eob_run_get_bits
[token
]);
1178 coeff
= zero_run
= 0;
1180 bits_to_get
= coeff_get_bits
[token
];
1182 coeff
= coeff_tables
[token
][0];
1184 coeff
= coeff_tables
[token
][get_bits(gb
, bits_to_get
)];
1186 zero_run
= zero_run_base
[token
];
1187 if (zero_run_get_bits
[token
])
1188 zero_run
+= get_bits(gb
, zero_run_get_bits
[token
]);
1193 fragment
->coeff_count
+= zero_run
;
1194 if (fragment
->coeff_count
< 64){
1195 fragment
->next_coeff
->coeff
= coeff
;
1196 fragment
->next_coeff
->index
= perm
[fragment
->coeff_count
++]; //FIXME perm here already?
1197 fragment
->next_coeff
->next
= s
->next_coeff
;
1198 s
->next_coeff
->next
=NULL
;
1199 fragment
->next_coeff
= s
->next_coeff
++;
1201 debug_vlc(" fragment %d coeff = %d\n",
1202 s
->coded_fragment_list
[i
], fragment
->next_coeff
[coeff_index
]);
1204 fragment
->coeff_count
|= 128;
1205 debug_vlc(" fragment %d eob with %d coefficients\n",
1206 s
->coded_fragment_list
[i
], fragment
->coeff_count
&127);
1215 * This function unpacks all of the DCT coefficient data from the
1218 static int unpack_dct_coeffs(Vp3DecodeContext
*s
, GetBitContext
*gb
)
1225 int residual_eob_run
= 0;
1227 /* fetch the DC table indices */
1228 dc_y_table
= get_bits(gb
, 4);
1229 dc_c_table
= get_bits(gb
, 4);
1231 /* unpack the Y plane DC coefficients */
1232 debug_vp3(" vp3: unpacking Y plane DC coefficients using table %d\n",
1234 residual_eob_run
= unpack_vlcs(s
, gb
, &s
->dc_vlc
[dc_y_table
], 0,
1235 s
->first_coded_y_fragment
, s
->last_coded_y_fragment
, residual_eob_run
);
1237 /* unpack the C plane DC coefficients */
1238 debug_vp3(" vp3: unpacking C plane DC coefficients using table %d\n",
1240 residual_eob_run
= unpack_vlcs(s
, gb
, &s
->dc_vlc
[dc_c_table
], 0,
1241 s
->first_coded_c_fragment
, s
->last_coded_c_fragment
, residual_eob_run
);
1243 /* fetch the AC table indices */
1244 ac_y_table
= get_bits(gb
, 4);
1245 ac_c_table
= get_bits(gb
, 4);
1247 /* unpack the group 1 AC coefficients (coeffs 1-5) */
1248 for (i
= 1; i
<= 5; i
++) {
1250 debug_vp3(" vp3: unpacking level %d Y plane AC coefficients using table %d\n",
1252 residual_eob_run
= unpack_vlcs(s
, gb
, &s
->ac_vlc_1
[ac_y_table
], i
,
1253 s
->first_coded_y_fragment
, s
->last_coded_y_fragment
, residual_eob_run
);
1255 debug_vp3(" vp3: unpacking level %d C plane AC coefficients using table %d\n",
1257 residual_eob_run
= unpack_vlcs(s
, gb
, &s
->ac_vlc_1
[ac_c_table
], i
,
1258 s
->first_coded_c_fragment
, s
->last_coded_c_fragment
, residual_eob_run
);
1261 /* unpack the group 2 AC coefficients (coeffs 6-14) */
1262 for (i
= 6; i
<= 14; i
++) {
1264 debug_vp3(" vp3: unpacking level %d Y plane AC coefficients using table %d\n",
1266 residual_eob_run
= unpack_vlcs(s
, gb
, &s
->ac_vlc_2
[ac_y_table
], i
,
1267 s
->first_coded_y_fragment
, s
->last_coded_y_fragment
, residual_eob_run
);
1269 debug_vp3(" vp3: unpacking level %d C plane AC coefficients using table %d\n",
1271 residual_eob_run
= unpack_vlcs(s
, gb
, &s
->ac_vlc_2
[ac_c_table
], i
,
1272 s
->first_coded_c_fragment
, s
->last_coded_c_fragment
, residual_eob_run
);
1275 /* unpack the group 3 AC coefficients (coeffs 15-27) */
1276 for (i
= 15; i
<= 27; i
++) {
1278 debug_vp3(" vp3: unpacking level %d Y plane AC coefficients using table %d\n",
1280 residual_eob_run
= unpack_vlcs(s
, gb
, &s
->ac_vlc_3
[ac_y_table
], i
,
1281 s
->first_coded_y_fragment
, s
->last_coded_y_fragment
, residual_eob_run
);
1283 debug_vp3(" vp3: unpacking level %d C plane AC coefficients using table %d\n",
1285 residual_eob_run
= unpack_vlcs(s
, gb
, &s
->ac_vlc_3
[ac_c_table
], i
,
1286 s
->first_coded_c_fragment
, s
->last_coded_c_fragment
, residual_eob_run
);
1289 /* unpack the group 4 AC coefficients (coeffs 28-63) */
1290 for (i
= 28; i
<= 63; i
++) {
1292 debug_vp3(" vp3: unpacking level %d Y plane AC coefficients using table %d\n",
1294 residual_eob_run
= unpack_vlcs(s
, gb
, &s
->ac_vlc_4
[ac_y_table
], i
,
1295 s
->first_coded_y_fragment
, s
->last_coded_y_fragment
, residual_eob_run
);
1297 debug_vp3(" vp3: unpacking level %d C plane AC coefficients using table %d\n",
1299 residual_eob_run
= unpack_vlcs(s
, gb
, &s
->ac_vlc_4
[ac_c_table
], i
,
1300 s
->first_coded_c_fragment
, s
->last_coded_c_fragment
, residual_eob_run
);
1307 * This function reverses the DC prediction for each coded fragment in
1308 * the frame. Much of this function is adapted directly from the original
1311 #define COMPATIBLE_FRAME(x) \
1312 (compatible_frame[s->all_fragments[x].coding_method] == current_frame_type)
1313 #define FRAME_CODED(x) (s->all_fragments[x].coding_method != MODE_COPY)
1314 #define DC_COEFF(u) (s->coeffs[u].index ? 0 : s->coeffs[u].coeff) //FIXME do somethin to simplify this
1316 static void reverse_dc_prediction(Vp3DecodeContext
*s
,
1319 int fragment_height
)
1328 int i
= first_fragment
;
1332 /* DC values for the left, up-left, up, and up-right fragments */
1333 int vl
, vul
, vu
, vur
;
1335 /* indices for the left, up-left, up, and up-right fragments */
1339 * The 6 fields mean:
1340 * 0: up-left multiplier
1342 * 2: up-right multiplier
1343 * 3: left multiplier
1345 int predictor_transform
[16][4] = {
1347 { 0, 0, 0,128}, // PL
1348 { 0, 0,128, 0}, // PUR
1349 { 0, 0, 53, 75}, // PUR|PL
1350 { 0,128, 0, 0}, // PU
1351 { 0, 64, 0, 64}, // PU|PL
1352 { 0,128, 0, 0}, // PU|PUR
1353 { 0, 0, 53, 75}, // PU|PUR|PL
1354 {128, 0, 0, 0}, // PUL
1355 { 0, 0, 0,128}, // PUL|PL
1356 { 64, 0, 64, 0}, // PUL|PUR
1357 { 0, 0, 53, 75}, // PUL|PUR|PL
1358 { 0,128, 0, 0}, // PUL|PU
1359 {-104,116, 0,116}, // PUL|PU|PL
1360 { 24, 80, 24, 0}, // PUL|PU|PUR
1361 {-104,116, 0,116} // PUL|PU|PUR|PL
1364 /* This table shows which types of blocks can use other blocks for
1365 * prediction. For example, INTRA is the only mode in this table to
1366 * have a frame number of 0. That means INTRA blocks can only predict
1367 * from other INTRA blocks. There are 2 golden frame coding types;
1368 * blocks encoding in these modes can only predict from other blocks
1369 * that were encoded with these 1 of these 2 modes. */
1370 unsigned char compatible_frame
[8] = {
1371 1, /* MODE_INTER_NO_MV */
1373 1, /* MODE_INTER_PLUS_MV */
1374 1, /* MODE_INTER_LAST_MV */
1375 1, /* MODE_INTER_PRIOR_MV */
1376 2, /* MODE_USING_GOLDEN */
1377 2, /* MODE_GOLDEN_MV */
1378 1 /* MODE_INTER_FOUR_MV */
1380 int current_frame_type
;
1382 /* there is a last DC predictor for each of the 3 frame types */
1387 debug_vp3(" vp3: reversing DC prediction\n");
1389 vul
= vu
= vur
= vl
= 0;
1390 last_dc
[0] = last_dc
[1] = last_dc
[2] = 0;
1392 /* for each fragment row... */
1393 for (y
= 0; y
< fragment_height
; y
++) {
1395 /* for each fragment in a row... */
1396 for (x
= 0; x
< fragment_width
; x
++, i
++) {
1398 /* reverse prediction if this block was coded */
1399 if (s
->all_fragments
[i
].coding_method
!= MODE_COPY
) {
1401 current_frame_type
=
1402 compatible_frame
[s
->all_fragments
[i
].coding_method
];
1403 debug_dc_pred(" frag %d: orig DC = %d, ",
1410 if(FRAME_CODED(l
) && COMPATIBLE_FRAME(l
))
1414 u
= i
-fragment_width
;
1416 if(FRAME_CODED(u
) && COMPATIBLE_FRAME(u
))
1419 ul
= i
-fragment_width
-1;
1421 if(FRAME_CODED(ul
) && COMPATIBLE_FRAME(ul
))
1424 if(x
+ 1 < fragment_width
){
1425 ur
= i
-fragment_width
+1;
1427 if(FRAME_CODED(ur
) && COMPATIBLE_FRAME(ur
))
1432 debug_dc_pred("transform = %d, ", transform
);
1434 if (transform
== 0) {
1436 /* if there were no fragments to predict from, use last
1438 predicted_dc
= last_dc
[current_frame_type
];
1439 debug_dc_pred("from last DC (%d) = %d\n",
1440 current_frame_type
, DC_COEFF(i
));
1444 /* apply the appropriate predictor transform */
1446 (predictor_transform
[transform
][0] * vul
) +
1447 (predictor_transform
[transform
][1] * vu
) +
1448 (predictor_transform
[transform
][2] * vur
) +
1449 (predictor_transform
[transform
][3] * vl
);
1451 predicted_dc
/= 128;
1453 /* check for outranging on the [ul u l] and
1454 * [ul u ur l] predictors */
1455 if ((transform
== 13) || (transform
== 15)) {
1456 if (FFABS(predicted_dc
- vu
) > 128)
1458 else if (FFABS(predicted_dc
- vl
) > 128)
1460 else if (FFABS(predicted_dc
- vul
) > 128)
1464 debug_dc_pred("from pred DC = %d\n",
1468 /* at long last, apply the predictor */
1469 if(s
->coeffs
[i
].index
){
1470 *s
->next_coeff
= s
->coeffs
[i
];
1471 s
->coeffs
[i
].index
=0;
1472 s
->coeffs
[i
].coeff
=0;
1473 s
->coeffs
[i
].next
= s
->next_coeff
++;
1475 s
->coeffs
[i
].coeff
+= predicted_dc
;
1477 last_dc
[current_frame_type
] = DC_COEFF(i
);
1478 if(DC_COEFF(i
) && !(s
->all_fragments
[i
].coeff_count
&127)){
1479 s
->all_fragments
[i
].coeff_count
= 129;
1480 // s->all_fragments[i].next_coeff= s->next_coeff;
1481 s
->coeffs
[i
].next
= s
->next_coeff
;
1482 (s
->next_coeff
++)->next
=NULL
;
1490 static void horizontal_filter(unsigned char *first_pixel
, int stride
,
1491 int *bounding_values
);
1492 static void vertical_filter(unsigned char *first_pixel
, int stride
,
1493 int *bounding_values
);
1496 * Perform the final rendering for a particular slice of data.
1497 * The slice number ranges from 0..(macroblock_height - 1).
1499 static void render_slice(Vp3DecodeContext
*s
, int slice
)
1503 int16_t *dequantizer
;
1504 DECLARE_ALIGNED_16(DCTELEM
, block
[64]);
1505 int motion_x
= 0xdeadbeef, motion_y
= 0xdeadbeef;
1506 int motion_halfpel_index
;
1507 uint8_t *motion_source
;
1509 int current_macroblock_entry
= slice
* s
->macroblock_width
* 6;
1511 if (slice
>= s
->macroblock_height
)
1514 for (plane
= 0; plane
< 3; plane
++) {
1515 uint8_t *output_plane
= s
->current_frame
.data
[plane
];
1516 uint8_t * last_plane
= s
-> last_frame
.data
[plane
];
1517 uint8_t *golden_plane
= s
-> golden_frame
.data
[plane
];
1518 int stride
= s
->current_frame
.linesize
[plane
];
1519 int plane_width
= s
->width
>> !!plane
;
1520 int plane_height
= s
->height
>> !!plane
;
1521 int y
= slice
* FRAGMENT_PIXELS
<< !plane
;
1522 int slice_height
= y
+ (FRAGMENT_PIXELS
<< !plane
);
1523 int i
= s
->macroblock_fragments
[current_macroblock_entry
+ plane
+ 3*!!plane
];
1525 if (!s
->flipped_image
) stride
= -stride
;
1528 if(FFABS(stride
) > 2048)
1529 return; //various tables are fixed size
1531 /* for each fragment row in the slice (both of them)... */
1532 for (; y
< slice_height
; y
+= 8) {
1534 /* for each fragment in a row... */
1535 for (x
= 0; x
< plane_width
; x
+= 8, i
++) {
1537 if ((i
< 0) || (i
>= s
->fragment_count
)) {
1538 av_log(s
->avctx
, AV_LOG_ERROR
, " vp3:render_slice(): bad fragment number (%d)\n", i
);
1542 /* transform if this block was coded */
1543 if ((s
->all_fragments
[i
].coding_method
!= MODE_COPY
) &&
1544 !((s
->avctx
->flags
& CODEC_FLAG_GRAY
) && plane
)) {
1546 if ((s
->all_fragments
[i
].coding_method
== MODE_USING_GOLDEN
) ||
1547 (s
->all_fragments
[i
].coding_method
== MODE_GOLDEN_MV
))
1548 motion_source
= golden_plane
;
1550 motion_source
= last_plane
;
1552 motion_source
+= s
->all_fragments
[i
].first_pixel
;
1553 motion_halfpel_index
= 0;
1555 /* sort out the motion vector if this fragment is coded
1556 * using a motion vector method */
1557 if ((s
->all_fragments
[i
].coding_method
> MODE_INTRA
) &&
1558 (s
->all_fragments
[i
].coding_method
!= MODE_USING_GOLDEN
)) {
1560 motion_x
= s
->all_fragments
[i
].motion_x
;
1561 motion_y
= s
->all_fragments
[i
].motion_y
;
1563 motion_x
= (motion_x
>>1) | (motion_x
&1);
1564 motion_y
= (motion_y
>>1) | (motion_y
&1);
1567 src_x
= (motion_x
>>1) + x
;
1568 src_y
= (motion_y
>>1) + y
;
1569 if ((motion_x
== 127) || (motion_y
== 127))
1570 av_log(s
->avctx
, AV_LOG_ERROR
, " help! got invalid motion vector! (%X, %X)\n", motion_x
, motion_y
);
1572 motion_halfpel_index
= motion_x
& 0x01;
1573 motion_source
+= (motion_x
>> 1);
1575 motion_halfpel_index
|= (motion_y
& 0x01) << 1;
1576 motion_source
+= ((motion_y
>> 1) * stride
);
1578 if(src_x
<0 || src_y
<0 || src_x
+ 9 >= plane_width
|| src_y
+ 9 >= plane_height
){
1579 uint8_t *temp
= s
->edge_emu_buffer
;
1580 if(stride
<0) temp
-= 9*stride
;
1581 else temp
+= 9*stride
;
1583 ff_emulated_edge_mc(temp
, motion_source
, stride
, 9, 9, src_x
, src_y
, plane_width
, plane_height
);
1584 motion_source
= temp
;
1589 /* first, take care of copying a block from either the
1590 * previous or the golden frame */
1591 if (s
->all_fragments
[i
].coding_method
!= MODE_INTRA
) {
1592 /* Note, it is possible to implement all MC cases with
1593 put_no_rnd_pixels_l2 which would look more like the
1594 VP3 source but this would be slower as
1595 put_no_rnd_pixels_tab is better optimzed */
1596 if(motion_halfpel_index
!= 3){
1597 s
->dsp
.put_no_rnd_pixels_tab
[1][motion_halfpel_index
](
1598 output_plane
+ s
->all_fragments
[i
].first_pixel
,
1599 motion_source
, stride
, 8);
1601 int d
= (motion_x
^ motion_y
)>>31; // d is 0 if motion_x and _y have the same sign, else -1
1602 s
->dsp
.put_no_rnd_pixels_l2
[1](
1603 output_plane
+ s
->all_fragments
[i
].first_pixel
,
1605 motion_source
+ stride
+ 1 + d
,
1608 dequantizer
= s
->qmat
[1][plane
];
1610 dequantizer
= s
->qmat
[0][plane
];
1613 /* dequantize the DCT coefficients */
1614 debug_idct("fragment %d, coding mode %d, DC = %d, dequant = %d:\n",
1615 i
, s
->all_fragments
[i
].coding_method
,
1616 DC_COEFF(i
), dequantizer
[0]);
1618 if(s
->avctx
->idct_algo
==FF_IDCT_VP3
){
1619 Coeff
*coeff
= s
->coeffs
+ i
;
1620 memset(block
, 0, sizeof(block
));
1622 block
[coeff
->index
]= coeff
->coeff
* dequantizer
[coeff
->index
];
1626 Coeff
*coeff
= s
->coeffs
+ i
;
1627 memset(block
, 0, sizeof(block
));
1629 block
[coeff
->index
]= (coeff
->coeff
* dequantizer
[coeff
->index
] + 2)>>2;
1634 /* invert DCT and place (or add) in final output */
1636 if (s
->all_fragments
[i
].coding_method
== MODE_INTRA
) {
1637 if(s
->avctx
->idct_algo
!=FF_IDCT_VP3
)
1640 output_plane
+ s
->all_fragments
[i
].first_pixel
,
1645 output_plane
+ s
->all_fragments
[i
].first_pixel
,
1650 debug_idct("block after idct_%s():\n",
1651 (s
->all_fragments
[i
].coding_method
== MODE_INTRA
)?
1653 for (m
= 0; m
< 8; m
++) {
1654 for (n
= 0; n
< 8; n
++) {
1655 debug_idct(" %3d", *(output_plane
+
1656 s
->all_fragments
[i
].first_pixel
+ (m
* stride
+ n
)));
1664 /* copy directly from the previous frame */
1665 s
->dsp
.put_pixels_tab
[1][0](
1666 output_plane
+ s
->all_fragments
[i
].first_pixel
,
1667 last_plane
+ s
->all_fragments
[i
].first_pixel
,
1672 /* perform the left edge filter if:
1673 * - the fragment is not on the left column
1674 * - the fragment is coded in this frame
1675 * - the fragment is not coded in this frame but the left
1676 * fragment is coded in this frame (this is done instead
1677 * of a right edge filter when rendering the left fragment
1678 * since this fragment is not available yet) */
1680 ((s
->all_fragments
[i
].coding_method
!= MODE_COPY
) ||
1681 ((s
->all_fragments
[i
].coding_method
== MODE_COPY
) &&
1682 (s
->all_fragments
[i
- 1].coding_method
!= MODE_COPY
)) )) {
1684 output_plane
+ s
->all_fragments
[i
].first_pixel
+ 7*stride
,
1685 -stride
, s
->bounding_values_array
+ 127);
1688 /* perform the top edge filter if:
1689 * - the fragment is not on the top row
1690 * - the fragment is coded in this frame
1691 * - the fragment is not coded in this frame but the above
1692 * fragment is coded in this frame (this is done instead
1693 * of a bottom edge filter when rendering the above
1694 * fragment since this fragment is not available yet) */
1696 ((s
->all_fragments
[i
].coding_method
!= MODE_COPY
) ||
1697 ((s
->all_fragments
[i
].coding_method
== MODE_COPY
) &&
1698 (s
->all_fragments
[i
- fragment_width
].coding_method
!= MODE_COPY
)) )) {
1700 output_plane
+ s
->all_fragments
[i
].first_pixel
- stride
,
1701 -stride
, s
->bounding_values_array
+ 127);
1708 /* this looks like a good place for slice dispatch... */
1710 * if (slice == s->macroblock_height - 1)
1711 * dispatch (both last slice & 2nd-to-last slice);
1712 * else if (slice > 0)
1713 * dispatch (slice - 1);
1719 static void horizontal_filter(unsigned char *first_pixel
, int stride
,
1720 int *bounding_values
)
1725 for (end
= first_pixel
+ 8*stride
; first_pixel
!= end
; first_pixel
+= stride
) {
1727 (first_pixel
[-2] - first_pixel
[ 1])
1728 +3*(first_pixel
[ 0] - first_pixel
[-1]);
1729 filter_value
= bounding_values
[(filter_value
+ 4) >> 3];
1730 first_pixel
[-1] = av_clip_uint8(first_pixel
[-1] + filter_value
);
1731 first_pixel
[ 0] = av_clip_uint8(first_pixel
[ 0] - filter_value
);
1735 static void vertical_filter(unsigned char *first_pixel
, int stride
,
1736 int *bounding_values
)
1740 const int nstride
= -stride
;
1742 for (end
= first_pixel
+ 8; first_pixel
< end
; first_pixel
++) {
1744 (first_pixel
[2 * nstride
] - first_pixel
[ stride
])
1745 +3*(first_pixel
[0 ] - first_pixel
[nstride
]);
1746 filter_value
= bounding_values
[(filter_value
+ 4) >> 3];
1747 first_pixel
[nstride
] = av_clip_uint8(first_pixel
[nstride
] + filter_value
);
1748 first_pixel
[0] = av_clip_uint8(first_pixel
[0] - filter_value
);
1752 static void apply_loop_filter(Vp3DecodeContext
*s
)
1756 int *bounding_values
= s
->bounding_values_array
+127;
1759 int bounding_values_array
[256];
1762 /* find the right loop limit value */
1763 for (x
= 63; x
>= 0; x
--) {
1764 if (vp31_ac_scale_factor
[x
] >= s
->quality_index
)
1767 filter_limit
= vp31_filter_limit_values
[s
->quality_index
];
1769 /* set up the bounding values */
1770 memset(bounding_values_array
, 0, 256 * sizeof(int));
1771 for (x
= 0; x
< filter_limit
; x
++) {
1772 bounding_values
[-x
- filter_limit
] = -filter_limit
+ x
;
1773 bounding_values
[-x
] = -x
;
1774 bounding_values
[x
] = x
;
1775 bounding_values
[x
+ filter_limit
] = filter_limit
- x
;
1779 for (plane
= 0; plane
< 3; plane
++) {
1780 int width
= s
->fragment_width
>> !!plane
;
1781 int height
= s
->fragment_height
>> !!plane
;
1782 int fragment
= s
->fragment_start
[plane
];
1783 int stride
= s
->current_frame
.linesize
[plane
];
1784 uint8_t *plane_data
= s
->current_frame
.data
[plane
];
1785 if (!s
->flipped_image
) stride
= -stride
;
1787 for (y
= 0; y
< height
; y
++) {
1789 for (x
= 0; x
< width
; x
++) {
1791 /* do not perform left edge filter for left columns frags */
1793 (s
->all_fragments
[fragment
].coding_method
!= MODE_COPY
)) {
1795 plane_data
+ s
->all_fragments
[fragment
].first_pixel
,
1796 stride
, bounding_values
);
1799 /* do not perform top edge filter for top row fragments */
1801 (s
->all_fragments
[fragment
].coding_method
!= MODE_COPY
)) {
1803 plane_data
+ s
->all_fragments
[fragment
].first_pixel
,
1804 stride
, bounding_values
);
1807 /* do not perform right edge filter for right column
1808 * fragments or if right fragment neighbor is also coded
1809 * in this frame (it will be filtered in next iteration) */
1810 if ((x
< width
- 1) &&
1811 (s
->all_fragments
[fragment
].coding_method
!= MODE_COPY
) &&
1812 (s
->all_fragments
[fragment
+ 1].coding_method
== MODE_COPY
)) {
1814 plane_data
+ s
->all_fragments
[fragment
+ 1].first_pixel
,
1815 stride
, bounding_values
);
1818 /* do not perform bottom edge filter for bottom row
1819 * fragments or if bottom fragment neighbor is also coded
1820 * in this frame (it will be filtered in the next row) */
1821 if ((y
< height
- 1) &&
1822 (s
->all_fragments
[fragment
].coding_method
!= MODE_COPY
) &&
1823 (s
->all_fragments
[fragment
+ width
].coding_method
== MODE_COPY
)) {
1825 plane_data
+ s
->all_fragments
[fragment
+ width
].first_pixel
,
1826 stride
, bounding_values
);
1830 STOP_TIMER("loop filter")
1837 * This function computes the first pixel addresses for each fragment.
1838 * This function needs to be invoked after the first frame is allocated
1839 * so that it has access to the plane strides.
1841 static void vp3_calculate_pixel_addresses(Vp3DecodeContext
*s
)
1846 /* figure out the first pixel addresses for each of the fragments */
1849 for (y
= s
->fragment_height
; y
> 0; y
--) {
1850 for (x
= 0; x
< s
->fragment_width
; x
++) {
1851 s
->all_fragments
[i
++].first_pixel
=
1852 s
->golden_frame
.linesize
[0] * y
* FRAGMENT_PIXELS
-
1853 s
->golden_frame
.linesize
[0] +
1854 x
* FRAGMENT_PIXELS
;
1855 debug_init(" fragment %d, first pixel @ %d\n",
1856 i
-1, s
->all_fragments
[i
-1].first_pixel
);
1861 i
= s
->fragment_start
[1];
1862 for (y
= s
->fragment_height
/ 2; y
> 0; y
--) {
1863 for (x
= 0; x
< s
->fragment_width
/ 2; x
++) {
1864 s
->all_fragments
[i
++].first_pixel
=
1865 s
->golden_frame
.linesize
[1] * y
* FRAGMENT_PIXELS
-
1866 s
->golden_frame
.linesize
[1] +
1867 x
* FRAGMENT_PIXELS
;
1868 debug_init(" fragment %d, first pixel @ %d\n",
1869 i
-1, s
->all_fragments
[i
-1].first_pixel
);
1874 i
= s
->fragment_start
[2];
1875 for (y
= s
->fragment_height
/ 2; y
> 0; y
--) {
1876 for (x
= 0; x
< s
->fragment_width
/ 2; x
++) {
1877 s
->all_fragments
[i
++].first_pixel
=
1878 s
->golden_frame
.linesize
[2] * y
* FRAGMENT_PIXELS
-
1879 s
->golden_frame
.linesize
[2] +
1880 x
* FRAGMENT_PIXELS
;
1881 debug_init(" fragment %d, first pixel @ %d\n",
1882 i
-1, s
->all_fragments
[i
-1].first_pixel
);
1887 /* FIXME: this should be merged with the above! */
1888 static void theora_calculate_pixel_addresses(Vp3DecodeContext
*s
)
1893 /* figure out the first pixel addresses for each of the fragments */
1896 for (y
= 1; y
<= s
->fragment_height
; y
++) {
1897 for (x
= 0; x
< s
->fragment_width
; x
++) {
1898 s
->all_fragments
[i
++].first_pixel
=
1899 s
->golden_frame
.linesize
[0] * y
* FRAGMENT_PIXELS
-
1900 s
->golden_frame
.linesize
[0] +
1901 x
* FRAGMENT_PIXELS
;
1902 debug_init(" fragment %d, first pixel @ %d\n",
1903 i
-1, s
->all_fragments
[i
-1].first_pixel
);
1908 i
= s
->fragment_start
[1];
1909 for (y
= 1; y
<= s
->fragment_height
/ 2; y
++) {
1910 for (x
= 0; x
< s
->fragment_width
/ 2; x
++) {
1911 s
->all_fragments
[i
++].first_pixel
=
1912 s
->golden_frame
.linesize
[1] * y
* FRAGMENT_PIXELS
-
1913 s
->golden_frame
.linesize
[1] +
1914 x
* FRAGMENT_PIXELS
;
1915 debug_init(" fragment %d, first pixel @ %d\n",
1916 i
-1, s
->all_fragments
[i
-1].first_pixel
);
1921 i
= s
->fragment_start
[2];
1922 for (y
= 1; y
<= s
->fragment_height
/ 2; y
++) {
1923 for (x
= 0; x
< s
->fragment_width
/ 2; x
++) {
1924 s
->all_fragments
[i
++].first_pixel
=
1925 s
->golden_frame
.linesize
[2] * y
* FRAGMENT_PIXELS
-
1926 s
->golden_frame
.linesize
[2] +
1927 x
* FRAGMENT_PIXELS
;
1928 debug_init(" fragment %d, first pixel @ %d\n",
1929 i
-1, s
->all_fragments
[i
-1].first_pixel
);
1935 * This is the ffmpeg/libavcodec API init function.
1937 static int vp3_decode_init(AVCodecContext
*avctx
)
1939 Vp3DecodeContext
*s
= avctx
->priv_data
;
1940 int i
, inter
, plane
;
1943 int y_superblock_count
;
1944 int c_superblock_count
;
1946 if (avctx
->codec_tag
== MKTAG('V','P','3','0'))
1952 s
->width
= (avctx
->width
+ 15) & 0xFFFFFFF0;
1953 s
->height
= (avctx
->height
+ 15) & 0xFFFFFFF0;
1954 avctx
->pix_fmt
= PIX_FMT_YUV420P
;
1955 if(avctx
->idct_algo
==FF_IDCT_AUTO
)
1956 avctx
->idct_algo
=FF_IDCT_VP3
;
1957 dsputil_init(&s
->dsp
, avctx
);
1959 ff_init_scantable(s
->dsp
.idct_permutation
, &s
->scantable
, ff_zigzag_direct
);
1961 /* initialize to an impossible value which will force a recalculation
1962 * in the first frame decode */
1963 s
->quality_index
= -1;
1965 s
->y_superblock_width
= (s
->width
+ 31) / 32;
1966 s
->y_superblock_height
= (s
->height
+ 31) / 32;
1967 y_superblock_count
= s
->y_superblock_width
* s
->y_superblock_height
;
1969 /* work out the dimensions for the C planes */
1970 c_width
= s
->width
/ 2;
1971 c_height
= s
->height
/ 2;
1972 s
->c_superblock_width
= (c_width
+ 31) / 32;
1973 s
->c_superblock_height
= (c_height
+ 31) / 32;
1974 c_superblock_count
= s
->c_superblock_width
* s
->c_superblock_height
;
1976 s
->superblock_count
= y_superblock_count
+ (c_superblock_count
* 2);
1977 s
->u_superblock_start
= y_superblock_count
;
1978 s
->v_superblock_start
= s
->u_superblock_start
+ c_superblock_count
;
1979 s
->superblock_coding
= av_malloc(s
->superblock_count
);
1981 s
->macroblock_width
= (s
->width
+ 15) / 16;
1982 s
->macroblock_height
= (s
->height
+ 15) / 16;
1983 s
->macroblock_count
= s
->macroblock_width
* s
->macroblock_height
;
1985 s
->fragment_width
= s
->width
/ FRAGMENT_PIXELS
;
1986 s
->fragment_height
= s
->height
/ FRAGMENT_PIXELS
;
1988 /* fragment count covers all 8x8 blocks for all 3 planes */
1989 s
->fragment_count
= s
->fragment_width
* s
->fragment_height
* 3 / 2;
1990 s
->fragment_start
[1] = s
->fragment_width
* s
->fragment_height
;
1991 s
->fragment_start
[2] = s
->fragment_width
* s
->fragment_height
* 5 / 4;
1993 debug_init(" Y plane: %d x %d\n", s
->width
, s
->height
);
1994 debug_init(" C plane: %d x %d\n", c_width
, c_height
);
1995 debug_init(" Y superblocks: %d x %d, %d total\n",
1996 s
->y_superblock_width
, s
->y_superblock_height
, y_superblock_count
);
1997 debug_init(" C superblocks: %d x %d, %d total\n",
1998 s
->c_superblock_width
, s
->c_superblock_height
, c_superblock_count
);
1999 debug_init(" total superblocks = %d, U starts @ %d, V starts @ %d\n",
2000 s
->superblock_count
, s
->u_superblock_start
, s
->v_superblock_start
);
2001 debug_init(" macroblocks: %d x %d, %d total\n",
2002 s
->macroblock_width
, s
->macroblock_height
, s
->macroblock_count
);
2003 debug_init(" %d fragments, %d x %d, u starts @ %d, v starts @ %d\n",
2007 s
->fragment_start
[1],
2008 s
->fragment_start
[2]);
2010 s
->all_fragments
= av_malloc(s
->fragment_count
* sizeof(Vp3Fragment
));
2011 s
->coeffs
= av_malloc(s
->fragment_count
* sizeof(Coeff
) * 65);
2012 s
->coded_fragment_list
= av_malloc(s
->fragment_count
* sizeof(int));
2013 s
->pixel_addresses_inited
= 0;
2015 if (!s
->theora_tables
)
2017 for (i
= 0; i
< 64; i
++) {
2018 s
->coded_dc_scale_factor
[i
] = vp31_dc_scale_factor
[i
];
2019 s
->coded_ac_scale_factor
[i
] = vp31_ac_scale_factor
[i
];
2020 s
->base_matrix
[0][i
] = vp31_intra_y_dequant
[i
];
2021 s
->base_matrix
[1][i
] = vp31_intra_c_dequant
[i
];
2022 s
->base_matrix
[2][i
] = vp31_inter_dequant
[i
];
2023 s
->filter_limit_values
[i
] = vp31_filter_limit_values
[i
];
2026 for(inter
=0; inter
<2; inter
++){
2027 for(plane
=0; plane
<3; plane
++){
2028 s
->qr_count
[inter
][plane
]= 1;
2029 s
->qr_size
[inter
][plane
][0]= 63;
2030 s
->qr_base
[inter
][plane
][0]=
2031 s
->qr_base
[inter
][plane
][1]= 2*inter
+ (!!plane
)*!inter
;
2035 /* init VLC tables */
2036 for (i
= 0; i
< 16; i
++) {
2039 init_vlc(&s
->dc_vlc
[i
], 5, 32,
2040 &dc_bias
[i
][0][1], 4, 2,
2041 &dc_bias
[i
][0][0], 4, 2, 0);
2043 /* group 1 AC histograms */
2044 init_vlc(&s
->ac_vlc_1
[i
], 5, 32,
2045 &ac_bias_0
[i
][0][1], 4, 2,
2046 &ac_bias_0
[i
][0][0], 4, 2, 0);
2048 /* group 2 AC histograms */
2049 init_vlc(&s
->ac_vlc_2
[i
], 5, 32,
2050 &ac_bias_1
[i
][0][1], 4, 2,
2051 &ac_bias_1
[i
][0][0], 4, 2, 0);
2053 /* group 3 AC histograms */
2054 init_vlc(&s
->ac_vlc_3
[i
], 5, 32,
2055 &ac_bias_2
[i
][0][1], 4, 2,
2056 &ac_bias_2
[i
][0][0], 4, 2, 0);
2058 /* group 4 AC histograms */
2059 init_vlc(&s
->ac_vlc_4
[i
], 5, 32,
2060 &ac_bias_3
[i
][0][1], 4, 2,
2061 &ac_bias_3
[i
][0][0], 4, 2, 0);
2064 for (i
= 0; i
< 16; i
++) {
2067 init_vlc(&s
->dc_vlc
[i
], 5, 32,
2068 &s
->huffman_table
[i
][0][1], 4, 2,
2069 &s
->huffman_table
[i
][0][0], 4, 2, 0);
2071 /* group 1 AC histograms */
2072 init_vlc(&s
->ac_vlc_1
[i
], 5, 32,
2073 &s
->huffman_table
[i
+16][0][1], 4, 2,
2074 &s
->huffman_table
[i
+16][0][0], 4, 2, 0);
2076 /* group 2 AC histograms */
2077 init_vlc(&s
->ac_vlc_2
[i
], 5, 32,
2078 &s
->huffman_table
[i
+16*2][0][1], 4, 2,
2079 &s
->huffman_table
[i
+16*2][0][0], 4, 2, 0);
2081 /* group 3 AC histograms */
2082 init_vlc(&s
->ac_vlc_3
[i
], 5, 32,
2083 &s
->huffman_table
[i
+16*3][0][1], 4, 2,
2084 &s
->huffman_table
[i
+16*3][0][0], 4, 2, 0);
2086 /* group 4 AC histograms */
2087 init_vlc(&s
->ac_vlc_4
[i
], 5, 32,
2088 &s
->huffman_table
[i
+16*4][0][1], 4, 2,
2089 &s
->huffman_table
[i
+16*4][0][0], 4, 2, 0);
2093 init_vlc(&s
->superblock_run_length_vlc
, 6, 34,
2094 &superblock_run_length_vlc_table
[0][1], 4, 2,
2095 &superblock_run_length_vlc_table
[0][0], 4, 2, 0);
2097 init_vlc(&s
->fragment_run_length_vlc
, 5, 30,
2098 &fragment_run_length_vlc_table
[0][1], 4, 2,
2099 &fragment_run_length_vlc_table
[0][0], 4, 2, 0);
2101 init_vlc(&s
->mode_code_vlc
, 3, 8,
2102 &mode_code_vlc_table
[0][1], 2, 1,
2103 &mode_code_vlc_table
[0][0], 2, 1, 0);
2105 init_vlc(&s
->motion_vector_vlc
, 6, 63,
2106 &motion_vector_vlc_table
[0][1], 2, 1,
2107 &motion_vector_vlc_table
[0][0], 2, 1, 0);
2109 /* work out the block mapping tables */
2110 s
->superblock_fragments
= av_malloc(s
->superblock_count
* 16 * sizeof(int));
2111 s
->superblock_macroblocks
= av_malloc(s
->superblock_count
* 4 * sizeof(int));
2112 s
->macroblock_fragments
= av_malloc(s
->macroblock_count
* 6 * sizeof(int));
2113 s
->macroblock_coding
= av_malloc(s
->macroblock_count
+ 1);
2114 init_block_mapping(s
);
2116 for (i
= 0; i
< 3; i
++) {
2117 s
->current_frame
.data
[i
] = NULL
;
2118 s
->last_frame
.data
[i
] = NULL
;
2119 s
->golden_frame
.data
[i
] = NULL
;
2126 * This is the ffmpeg/libavcodec API frame decode function.
2128 static int vp3_decode_frame(AVCodecContext
*avctx
,
2129 void *data
, int *data_size
,
2130 uint8_t *buf
, int buf_size
)
2132 Vp3DecodeContext
*s
= avctx
->priv_data
;
2134 static int counter
= 0;
2137 init_get_bits(&gb
, buf
, buf_size
* 8);
2139 if (s
->theora
&& get_bits1(&gb
))
2141 av_log(avctx
, AV_LOG_ERROR
, "Header packet passed to frame decoder, skipping\n");
2145 s
->keyframe
= !get_bits1(&gb
);
2148 s
->last_quality_index
= s
->quality_index
;
2152 s
->qis
[s
->nqis
++]= get_bits(&gb
, 6);
2153 } while(s
->theora
>= 0x030200 && s
->nqis
<3 && get_bits1(&gb
));
2155 s
->quality_index
= s
->qis
[0];
2157 if (s
->avctx
->debug
& FF_DEBUG_PICT_INFO
)
2158 av_log(s
->avctx
, AV_LOG_INFO
, " VP3 %sframe #%d: Q index = %d\n",
2159 s
->keyframe
?"key":"", counter
, s
->quality_index
);
2162 if (s
->quality_index
!= s
->last_quality_index
) {
2163 init_dequantizer(s
);
2164 init_loop_filter(s
);
2170 skip_bits(&gb
, 4); /* width code */
2171 skip_bits(&gb
, 4); /* height code */
2174 s
->version
= get_bits(&gb
, 5);
2176 av_log(s
->avctx
, AV_LOG_DEBUG
, "VP version: %d\n", s
->version
);
2179 if (s
->version
|| s
->theora
)
2182 av_log(s
->avctx
, AV_LOG_ERROR
, "Warning, unsupported keyframe coding type?!\n");
2183 skip_bits(&gb
, 2); /* reserved? */
2186 if (s
->last_frame
.data
[0] == s
->golden_frame
.data
[0]) {
2187 if (s
->golden_frame
.data
[0])
2188 avctx
->release_buffer(avctx
, &s
->golden_frame
);
2189 s
->last_frame
= s
->golden_frame
; /* ensure that we catch any access to this released frame */
2191 if (s
->golden_frame
.data
[0])
2192 avctx
->release_buffer(avctx
, &s
->golden_frame
);
2193 if (s
->last_frame
.data
[0])
2194 avctx
->release_buffer(avctx
, &s
->last_frame
);
2197 s
->golden_frame
.reference
= 3;
2198 if(avctx
->get_buffer(avctx
, &s
->golden_frame
) < 0) {
2199 av_log(s
->avctx
, AV_LOG_ERROR
, "vp3: get_buffer() failed\n");
2203 /* golden frame is also the current frame */
2204 s
->current_frame
= s
->golden_frame
;
2206 /* time to figure out pixel addresses? */
2207 if (!s
->pixel_addresses_inited
)
2209 if (!s
->flipped_image
)
2210 vp3_calculate_pixel_addresses(s
);
2212 theora_calculate_pixel_addresses(s
);
2213 s
->pixel_addresses_inited
= 1;
2216 /* allocate a new current frame */
2217 s
->current_frame
.reference
= 3;
2218 if (!s
->pixel_addresses_inited
) {
2219 av_log(s
->avctx
, AV_LOG_ERROR
, "vp3: first frame not a keyframe\n");
2222 if(avctx
->get_buffer(avctx
, &s
->current_frame
) < 0) {
2223 av_log(s
->avctx
, AV_LOG_ERROR
, "vp3: get_buffer() failed\n");
2228 s
->current_frame
.qscale_table
= s
->qscale_table
; //FIXME allocate individual tables per AVFrame
2229 s
->current_frame
.qstride
= 0;
2233 STOP_TIMER("init_frame")}
2238 memcpy(s
->current_frame
.data
[0], s
->golden_frame
.data
[0],
2239 s
->current_frame
.linesize
[0] * s
->height
);
2240 memcpy(s
->current_frame
.data
[1], s
->golden_frame
.data
[1],
2241 s
->current_frame
.linesize
[1] * s
->height
/ 2);
2242 memcpy(s
->current_frame
.data
[2], s
->golden_frame
.data
[2],
2243 s
->current_frame
.linesize
[2] * s
->height
/ 2);
2249 if (unpack_superblocks(s
, &gb
)){
2250 av_log(s
->avctx
, AV_LOG_ERROR
, "error in unpack_superblocks\n");
2253 STOP_TIMER("unpack_superblocks")}
2255 if (unpack_modes(s
, &gb
)){
2256 av_log(s
->avctx
, AV_LOG_ERROR
, "error in unpack_modes\n");
2259 STOP_TIMER("unpack_modes")}
2261 if (unpack_vectors(s
, &gb
)){
2262 av_log(s
->avctx
, AV_LOG_ERROR
, "error in unpack_vectors\n");
2265 STOP_TIMER("unpack_vectors")}
2267 if (unpack_dct_coeffs(s
, &gb
)){
2268 av_log(s
->avctx
, AV_LOG_ERROR
, "error in unpack_dct_coeffs\n");
2271 STOP_TIMER("unpack_dct_coeffs")}
2274 reverse_dc_prediction(s
, 0, s
->fragment_width
, s
->fragment_height
);
2275 if ((avctx
->flags
& CODEC_FLAG_GRAY
) == 0) {
2276 reverse_dc_prediction(s
, s
->fragment_start
[1],
2277 s
->fragment_width
/ 2, s
->fragment_height
/ 2);
2278 reverse_dc_prediction(s
, s
->fragment_start
[2],
2279 s
->fragment_width
/ 2, s
->fragment_height
/ 2);
2281 STOP_TIMER("reverse_dc_prediction")}
2284 for (i
= 0; i
< s
->macroblock_height
; i
++)
2286 STOP_TIMER("render_fragments")}
2289 apply_loop_filter(s
);
2290 STOP_TIMER("apply_loop_filter")}
2295 *data_size
=sizeof(AVFrame
);
2296 *(AVFrame
*)data
= s
->current_frame
;
2298 /* release the last frame, if it is allocated and if it is not the
2300 if ((s
->last_frame
.data
[0]) &&
2301 (s
->last_frame
.data
[0] != s
->golden_frame
.data
[0]))
2302 avctx
->release_buffer(avctx
, &s
->last_frame
);
2304 /* shuffle frames (last = current) */
2305 s
->last_frame
= s
->current_frame
;
2306 s
->current_frame
.data
[0]= NULL
; /* ensure that we catch any access to this released frame */
2312 * This is the ffmpeg/libavcodec API module cleanup function.
2314 static int vp3_decode_end(AVCodecContext
*avctx
)
2316 Vp3DecodeContext
*s
= avctx
->priv_data
;
2318 av_free(s
->all_fragments
);
2320 av_free(s
->coded_fragment_list
);
2321 av_free(s
->superblock_fragments
);
2322 av_free(s
->superblock_macroblocks
);
2323 av_free(s
->macroblock_fragments
);
2324 av_free(s
->macroblock_coding
);
2326 /* release all frames */
2327 if (s
->golden_frame
.data
[0] && s
->golden_frame
.data
[0] != s
->last_frame
.data
[0])
2328 avctx
->release_buffer(avctx
, &s
->golden_frame
);
2329 if (s
->last_frame
.data
[0])
2330 avctx
->release_buffer(avctx
, &s
->last_frame
);
2331 /* no need to release the current_frame since it will always be pointing
2332 * to the same frame as either the golden or last frame */
2337 static int read_huffman_tree(AVCodecContext
*avctx
, GetBitContext
*gb
)
2339 Vp3DecodeContext
*s
= avctx
->priv_data
;
2341 if (get_bits(gb
, 1)) {
2343 if (s
->entries
>= 32) { /* overflow */
2344 av_log(avctx
, AV_LOG_ERROR
, "huffman tree overflow\n");
2347 token
= get_bits(gb
, 5);
2348 //av_log(avctx, AV_LOG_DEBUG, "hti %d hbits %x token %d entry : %d size %d\n", s->hti, s->hbits, token, s->entries, s->huff_code_size);
2349 s
->huffman_table
[s
->hti
][token
][0] = s
->hbits
;
2350 s
->huffman_table
[s
->hti
][token
][1] = s
->huff_code_size
;
2354 if (s
->huff_code_size
>= 32) {/* overflow */
2355 av_log(avctx
, AV_LOG_ERROR
, "huffman tree overflow\n");
2358 s
->huff_code_size
++;
2360 read_huffman_tree(avctx
, gb
);
2362 read_huffman_tree(avctx
, gb
);
2364 s
->huff_code_size
--;
2369 #ifdef CONFIG_THEORA_DECODER
2370 static int theora_decode_header(AVCodecContext
*avctx
, GetBitContext
*gb
)
2372 Vp3DecodeContext
*s
= avctx
->priv_data
;
2373 int visible_width
, visible_height
;
2375 s
->theora
= get_bits_long(gb
, 24);
2376 av_log(avctx
, AV_LOG_INFO
, "Theora bitstream version %X\n", s
->theora
);
2378 /* 3.2.0 aka alpha3 has the same frame orientation as original vp3 */
2379 /* but previous versions have the image flipped relative to vp3 */
2380 if (s
->theora
< 0x030200)
2382 s
->flipped_image
= 1;
2383 av_log(avctx
, AV_LOG_DEBUG
, "Old (<alpha3) Theora bitstream, flipped image\n");
2386 s
->width
= get_bits(gb
, 16) << 4;
2387 s
->height
= get_bits(gb
, 16) << 4;
2389 if(avcodec_check_dimensions(avctx
, s
->width
, s
->height
)){
2390 av_log(avctx
, AV_LOG_ERROR
, "Invalid dimensions (%dx%d)\n", s
->width
, s
->height
);
2391 s
->width
= s
->height
= 0;
2395 if (s
->theora
>= 0x030400)
2397 skip_bits(gb
, 32); /* total number of superblocks in a frame */
2398 // fixme, the next field is 36bits long
2399 skip_bits(gb
, 32); /* total number of blocks in a frame */
2400 skip_bits(gb
, 4); /* total number of blocks in a frame */
2401 skip_bits(gb
, 32); /* total number of macroblocks in a frame */
2404 visible_width
= get_bits_long(gb
, 24);
2405 visible_height
= get_bits_long(gb
, 24);
2407 if (s
->theora
>= 0x030200) {
2408 skip_bits(gb
, 8); /* offset x */
2409 skip_bits(gb
, 8); /* offset y */
2412 skip_bits(gb
, 32); /* fps numerator */
2413 skip_bits(gb
, 32); /* fps denumerator */
2414 skip_bits(gb
, 24); /* aspect numerator */
2415 skip_bits(gb
, 24); /* aspect denumerator */
2417 if (s
->theora
< 0x030200)
2418 skip_bits(gb
, 5); /* keyframe frequency force */
2419 skip_bits(gb
, 8); /* colorspace */
2420 if (s
->theora
>= 0x030400)
2421 skip_bits(gb
, 2); /* pixel format: 420,res,422,444 */
2422 skip_bits(gb
, 24); /* bitrate */
2424 skip_bits(gb
, 6); /* quality hint */
2426 if (s
->theora
>= 0x030200)
2428 skip_bits(gb
, 5); /* keyframe frequency force */
2430 if (s
->theora
< 0x030400)
2431 skip_bits(gb
, 5); /* spare bits */
2434 // align_get_bits(gb);
2436 if ( visible_width
<= s
->width
&& visible_width
> s
->width
-16
2437 && visible_height
<= s
->height
&& visible_height
> s
->height
-16)
2438 avcodec_set_dimensions(avctx
, visible_width
, visible_height
);
2440 avcodec_set_dimensions(avctx
, s
->width
, s
->height
);
2445 static int theora_decode_tables(AVCodecContext
*avctx
, GetBitContext
*gb
)
2447 Vp3DecodeContext
*s
= avctx
->priv_data
;
2448 int i
, n
, matrices
, inter
, plane
;
2450 if (s
->theora
>= 0x030200) {
2451 n
= get_bits(gb
, 3);
2452 /* loop filter limit values table */
2453 for (i
= 0; i
< 64; i
++)
2454 s
->filter_limit_values
[i
] = get_bits(gb
, n
);
2457 if (s
->theora
>= 0x030200)
2458 n
= get_bits(gb
, 4) + 1;
2461 /* quality threshold table */
2462 for (i
= 0; i
< 64; i
++)
2463 s
->coded_ac_scale_factor
[i
] = get_bits(gb
, n
);
2465 if (s
->theora
>= 0x030200)
2466 n
= get_bits(gb
, 4) + 1;
2469 /* dc scale factor table */
2470 for (i
= 0; i
< 64; i
++)
2471 s
->coded_dc_scale_factor
[i
] = get_bits(gb
, n
);
2473 if (s
->theora
>= 0x030200)
2474 matrices
= get_bits(gb
, 9) + 1;
2479 av_log(avctx
, AV_LOG_ERROR
, "invalid number of base matrixes\n");
2483 for(n
=0; n
<matrices
; n
++){
2484 for (i
= 0; i
< 64; i
++)
2485 s
->base_matrix
[n
][i
]= get_bits(gb
, 8);
2488 for (inter
= 0; inter
<= 1; inter
++) {
2489 for (plane
= 0; plane
<= 2; plane
++) {
2491 if (inter
|| plane
> 0)
2492 newqr
= get_bits(gb
, 1);
2495 if(inter
&& get_bits(gb
, 1)){
2499 qtj
= (3*inter
+ plane
- 1) / 3;
2500 plj
= (plane
+ 2) % 3;
2502 s
->qr_count
[inter
][plane
]= s
->qr_count
[qtj
][plj
];
2503 memcpy(s
->qr_size
[inter
][plane
], s
->qr_size
[qtj
][plj
], sizeof(s
->qr_size
[0][0]));
2504 memcpy(s
->qr_base
[inter
][plane
], s
->qr_base
[qtj
][plj
], sizeof(s
->qr_base
[0][0]));
2510 i
= get_bits(gb
, av_log2(matrices
-1)+1);
2512 av_log(avctx
, AV_LOG_ERROR
, "invalid base matrix index\n");
2515 s
->qr_base
[inter
][plane
][qri
]= i
;
2518 i
= get_bits(gb
, av_log2(63-qi
)+1) + 1;
2519 s
->qr_size
[inter
][plane
][qri
++]= i
;
2524 av_log(avctx
, AV_LOG_ERROR
, "invalid qi %d > 63\n", qi
);
2527 s
->qr_count
[inter
][plane
]= qri
;
2532 /* Huffman tables */
2533 for (s
->hti
= 0; s
->hti
< 80; s
->hti
++) {
2535 s
->huff_code_size
= 1;
2536 if (!get_bits(gb
, 1)) {
2538 read_huffman_tree(avctx
, gb
);
2540 read_huffman_tree(avctx
, gb
);
2544 s
->theora_tables
= 1;
2549 static int theora_decode_init(AVCodecContext
*avctx
)
2551 Vp3DecodeContext
*s
= avctx
->priv_data
;
2554 uint8_t *header_start
[3];
2560 if (!avctx
->extradata_size
)
2562 av_log(avctx
, AV_LOG_ERROR
, "Missing extradata!\n");
2566 if (ff_split_xiph_headers(avctx
->extradata
, avctx
->extradata_size
,
2567 42, header_start
, header_len
) < 0) {
2568 av_log(avctx
, AV_LOG_ERROR
, "Corrupt extradata\n");
2573 init_get_bits(&gb
, header_start
[i
], header_len
[i
]);
2575 ptype
= get_bits(&gb
, 8);
2576 debug_vp3("Theora headerpacket type: %x\n", ptype
);
2578 if (!(ptype
& 0x80))
2580 av_log(avctx
, AV_LOG_ERROR
, "Invalid extradata!\n");
2584 // FIXME: Check for this as well.
2585 skip_bits(&gb
, 6*8); /* "theora" */
2590 theora_decode_header(avctx
, &gb
);
2593 // FIXME: is this needed? it breaks sometimes
2594 // theora_decode_comments(avctx, gb);
2597 theora_decode_tables(avctx
, &gb
);
2600 av_log(avctx
, AV_LOG_ERROR
, "Unknown Theora config packet: %d\n", ptype
&~0x80);
2603 if(8*header_len
[i
] != get_bits_count(&gb
))
2604 av_log(avctx
, AV_LOG_ERROR
, "%d bits left in packet %X\n", 8*header_len
[i
] - get_bits_count(&gb
), ptype
);
2605 if (s
->theora
< 0x030200)
2609 vp3_decode_init(avctx
);
2613 AVCodec theora_decoder
= {
2617 sizeof(Vp3DecodeContext
),
2627 AVCodec vp3_decoder
= {
2631 sizeof(Vp3DecodeContext
),