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
23 * On2 VP3 Video Decoder
25 * VP3 Video Decoder by Mike Melanson (mike at multimedia.cx)
26 * For more information about the VP3 coding process, visit:
27 * http://multimedia.cx/
29 * Theora decoder by Alex Beregszaszi
39 #include "mpegvideo.h"
44 #define FRAGMENT_PIXELS 8
49 * Define one or more of the following compile-time variables to 1 to obtain
50 * elaborate information about certain aspects of the decoding process.
52 * KEYFRAMES_ONLY: set this to 1 to only see keyframes (VP3 slideshow mode)
53 * DEBUG_VP3: high-level decoding flow
54 * DEBUG_INIT: initialization parameters
55 * DEBUG_DEQUANTIZERS: display how the dequanization tables are built
56 * DEBUG_BLOCK_CODING: unpacking the superblock/macroblock/fragment coding
57 * DEBUG_MODES: unpacking the coding modes for individual fragments
58 * DEBUG_VECTORS: display the motion vectors
59 * DEBUG_TOKEN: display exhaustive information about each DCT token
60 * DEBUG_VLC: display the VLCs as they are extracted from the stream
61 * DEBUG_DC_PRED: display the process of reversing DC prediction
62 * DEBUG_IDCT: show every detail of the IDCT process
65 #define KEYFRAMES_ONLY 0
69 #define DEBUG_DEQUANTIZERS 0
70 #define DEBUG_BLOCK_CODING 0
72 #define DEBUG_VECTORS 0
75 #define DEBUG_DC_PRED 0
79 #define debug_vp3(args...) av_log(NULL, AV_LOG_DEBUG, ## args)
81 static inline void debug_vp3(const char *format
, ...) { }
85 #define debug_init(args...) av_log(NULL, AV_LOG_DEBUG, ## args)
87 static inline void debug_init(const char *format
, ...) { }
90 #if DEBUG_DEQUANTIZERS
91 #define debug_dequantizers(args...) av_log(NULL, AV_LOG_DEBUG, ## args)
93 static inline void debug_dequantizers(const char *format
, ...) { }
96 #if DEBUG_BLOCK_CODING
97 #define debug_block_coding(args...) av_log(NULL, AV_LOG_DEBUG, ## args)
99 static inline void debug_block_coding(const char *format
, ...) { }
103 #define debug_modes(args...) av_log(NULL, AV_LOG_DEBUG, ## args)
105 static inline void debug_modes(const char *format
, ...) { }
109 #define debug_vectors(args...) av_log(NULL, AV_LOG_DEBUG, ## args)
111 static inline void debug_vectors(const char *format
, ...) { }
115 #define debug_token(args...) av_log(NULL, AV_LOG_DEBUG, ## args)
117 static inline void debug_token(const char *format
, ...) { }
121 #define debug_vlc(args...) av_log(NULL, AV_LOG_DEBUG, ## args)
123 static inline void debug_vlc(const char *format
, ...) { }
127 #define debug_dc_pred(args...) av_log(NULL, AV_LOG_DEBUG, ## args)
129 static inline void debug_dc_pred(const char *format
, ...) { }
133 #define debug_idct(args...) av_log(NULL, AV_LOG_DEBUG, ## args)
135 static inline void debug_idct(const char *format
, ...) { }
138 typedef struct Coeff
{
144 //FIXME split things out into their own arrays
145 typedef struct Vp3Fragment
{
147 /* address of first pixel taking into account which plane the fragment
148 * lives on as well as the plane stride */
150 /* this is the macroblock that the fragment belongs to */
152 uint8_t coding_method
;
158 #define SB_NOT_CODED 0
159 #define SB_PARTIALLY_CODED 1
160 #define SB_FULLY_CODED 2
162 #define MODE_INTER_NO_MV 0
164 #define MODE_INTER_PLUS_MV 2
165 #define MODE_INTER_LAST_MV 3
166 #define MODE_INTER_PRIOR_LAST 4
167 #define MODE_USING_GOLDEN 5
168 #define MODE_GOLDEN_MV 6
169 #define MODE_INTER_FOURMV 7
170 #define CODING_MODE_COUNT 8
172 /* special internal mode */
175 /* There are 6 preset schemes, plus a free-form scheme */
176 static int ModeAlphabet
[7][CODING_MODE_COUNT
] =
178 /* this is the custom scheme */
179 { 0, 0, 0, 0, 0, 0, 0, 0 },
181 /* scheme 1: Last motion vector dominates */
182 { MODE_INTER_LAST_MV
, MODE_INTER_PRIOR_LAST
,
183 MODE_INTER_PLUS_MV
, MODE_INTER_NO_MV
,
184 MODE_INTRA
, MODE_USING_GOLDEN
,
185 MODE_GOLDEN_MV
, MODE_INTER_FOURMV
},
188 { MODE_INTER_LAST_MV
, MODE_INTER_PRIOR_LAST
,
189 MODE_INTER_NO_MV
, MODE_INTER_PLUS_MV
,
190 MODE_INTRA
, MODE_USING_GOLDEN
,
191 MODE_GOLDEN_MV
, MODE_INTER_FOURMV
},
194 { MODE_INTER_LAST_MV
, MODE_INTER_PLUS_MV
,
195 MODE_INTER_PRIOR_LAST
, MODE_INTER_NO_MV
,
196 MODE_INTRA
, MODE_USING_GOLDEN
,
197 MODE_GOLDEN_MV
, MODE_INTER_FOURMV
},
200 { MODE_INTER_LAST_MV
, MODE_INTER_PLUS_MV
,
201 MODE_INTER_NO_MV
, MODE_INTER_PRIOR_LAST
,
202 MODE_INTRA
, MODE_USING_GOLDEN
,
203 MODE_GOLDEN_MV
, MODE_INTER_FOURMV
},
205 /* scheme 5: No motion vector dominates */
206 { MODE_INTER_NO_MV
, MODE_INTER_LAST_MV
,
207 MODE_INTER_PRIOR_LAST
, MODE_INTER_PLUS_MV
,
208 MODE_INTRA
, MODE_USING_GOLDEN
,
209 MODE_GOLDEN_MV
, MODE_INTER_FOURMV
},
212 { MODE_INTER_NO_MV
, MODE_USING_GOLDEN
,
213 MODE_INTER_LAST_MV
, MODE_INTER_PRIOR_LAST
,
214 MODE_INTER_PLUS_MV
, MODE_INTRA
,
215 MODE_GOLDEN_MV
, MODE_INTER_FOURMV
},
219 #define MIN_DEQUANT_VAL 2
221 typedef struct Vp3DecodeContext
{
222 AVCodecContext
*avctx
;
223 int theora
, theora_tables
;
226 AVFrame golden_frame
;
228 AVFrame current_frame
;
236 int last_quality_index
;
238 int superblock_count
;
239 int superblock_width
;
240 int superblock_height
;
241 int y_superblock_width
;
242 int y_superblock_height
;
243 int c_superblock_width
;
244 int c_superblock_height
;
245 int u_superblock_start
;
246 int v_superblock_start
;
247 unsigned char *superblock_coding
;
249 int macroblock_count
;
250 int macroblock_width
;
251 int macroblock_height
;
257 Vp3Fragment
*all_fragments
;
260 int fragment_start
[3];
265 uint16_t coded_dc_scale_factor
[64];
266 uint32_t coded_ac_scale_factor
[64];
267 uint8_t base_matrix
[384][64];
268 uint8_t qr_count
[2][3];
269 uint8_t qr_size
[2][3][64];
270 uint16_t qr_base
[2][3][64];
272 /* this is a list of indices into the all_fragments array indicating
273 * which of the fragments are coded */
274 int *coded_fragment_list
;
275 int coded_fragment_list_index
;
276 int pixel_addresses_inited
;
284 VLC superblock_run_length_vlc
;
285 VLC fragment_run_length_vlc
;
287 VLC motion_vector_vlc
;
289 /* these arrays need to be on 16-byte boundaries since SSE2 operations
291 DECLARE_ALIGNED_16(int16_t, qmat
[2][4][64]); //<qmat[is_inter][plane]
293 /* This table contains superblock_count * 16 entries. Each set of 16
294 * numbers corresponds to the fragment indices 0..15 of the superblock.
295 * An entry will be -1 to indicate that no entry corresponds to that
297 int *superblock_fragments
;
299 /* This table contains superblock_count * 4 entries. Each set of 4
300 * numbers corresponds to the macroblock indices 0..3 of the superblock.
301 * An entry will be -1 to indicate that no entry corresponds to that
303 int *superblock_macroblocks
;
305 /* This table contains macroblock_count * 6 entries. Each set of 6
306 * numbers corresponds to the fragment indices 0..5 which comprise
307 * the macroblock (4 Y fragments and 2 C fragments). */
308 int *macroblock_fragments
;
309 /* This is an array that indicates how a particular macroblock
311 unsigned char *macroblock_coding
;
313 int first_coded_y_fragment
;
314 int first_coded_c_fragment
;
315 int last_coded_y_fragment
;
316 int last_coded_c_fragment
;
318 uint8_t edge_emu_buffer
[9*2048]; //FIXME dynamic alloc
319 int8_t qscale_table
[2048]; //FIXME dynamic alloc (width+15)/16
326 uint16_t huffman_table
[80][32][2];
328 uint32_t filter_limit_values
[64];
329 int bounding_values_array
[256];
332 /************************************************************************
333 * VP3 specific functions
334 ************************************************************************/
337 * This function sets up all of the various blocks mappings:
338 * superblocks <-> fragments, macroblocks <-> fragments,
339 * superblocks <-> macroblocks
341 * Returns 0 is successful; returns 1 if *anything* went wrong.
343 static int init_block_mapping(Vp3DecodeContext
*s
)
346 signed int hilbert_walk_mb
[4];
348 int current_fragment
= 0;
349 int current_width
= 0;
350 int current_height
= 0;
353 int superblock_row_inc
= 0;
355 int mapping_index
= 0;
357 int current_macroblock
;
360 signed char travel_width
[16] = {
367 signed char travel_height
[16] = {
374 signed char travel_width_mb
[4] = {
378 signed char travel_height_mb
[4] = {
382 debug_vp3(" vp3: initialize block mapping tables\n");
384 hilbert_walk_mb
[0] = 1;
385 hilbert_walk_mb
[1] = s
->macroblock_width
;
386 hilbert_walk_mb
[2] = 1;
387 hilbert_walk_mb
[3] = -s
->macroblock_width
;
389 /* iterate through each superblock (all planes) and map the fragments */
390 for (i
= 0; i
< s
->superblock_count
; i
++) {
391 debug_init(" superblock %d (u starts @ %d, v starts @ %d)\n",
392 i
, s
->u_superblock_start
, s
->v_superblock_start
);
394 /* time to re-assign the limits? */
397 /* start of Y superblocks */
398 right_edge
= s
->fragment_width
;
399 bottom_edge
= s
->fragment_height
;
402 superblock_row_inc
= 3 * s
->fragment_width
-
403 (s
->y_superblock_width
* 4 - s
->fragment_width
);
405 /* the first operation for this variable is to advance by 1 */
406 current_fragment
= -1;
408 } else if (i
== s
->u_superblock_start
) {
410 /* start of U superblocks */
411 right_edge
= s
->fragment_width
/ 2;
412 bottom_edge
= s
->fragment_height
/ 2;
415 superblock_row_inc
= 3 * (s
->fragment_width
/ 2) -
416 (s
->c_superblock_width
* 4 - s
->fragment_width
/ 2);
418 /* the first operation for this variable is to advance by 1 */
419 current_fragment
= s
->fragment_start
[1] - 1;
421 } else if (i
== s
->v_superblock_start
) {
423 /* start of V superblocks */
424 right_edge
= s
->fragment_width
/ 2;
425 bottom_edge
= s
->fragment_height
/ 2;
428 superblock_row_inc
= 3 * (s
->fragment_width
/ 2) -
429 (s
->c_superblock_width
* 4 - s
->fragment_width
/ 2);
431 /* the first operation for this variable is to advance by 1 */
432 current_fragment
= s
->fragment_start
[2] - 1;
436 if (current_width
>= right_edge
- 1) {
437 /* reset width and move to next superblock row */
441 /* fragment is now at the start of a new superblock row */
442 current_fragment
+= superblock_row_inc
;
445 /* iterate through all 16 fragments in a superblock */
446 for (j
= 0; j
< 16; j
++) {
447 current_fragment
+= travel_width
[j
] + right_edge
* travel_height
[j
];
448 current_width
+= travel_width
[j
];
449 current_height
+= travel_height
[j
];
451 /* check if the fragment is in bounds */
452 if ((current_width
< right_edge
) &&
453 (current_height
< bottom_edge
)) {
454 s
->superblock_fragments
[mapping_index
] = current_fragment
;
455 debug_init(" mapping fragment %d to superblock %d, position %d (%d/%d x %d/%d)\n",
456 s
->superblock_fragments
[mapping_index
], i
, j
,
457 current_width
, right_edge
, current_height
, bottom_edge
);
459 s
->superblock_fragments
[mapping_index
] = -1;
460 debug_init(" superblock %d, position %d has no fragment (%d/%d x %d/%d)\n",
462 current_width
, right_edge
, current_height
, bottom_edge
);
469 /* initialize the superblock <-> macroblock mapping; iterate through
470 * all of the Y plane superblocks to build this mapping */
471 right_edge
= s
->macroblock_width
;
472 bottom_edge
= s
->macroblock_height
;
475 superblock_row_inc
= s
->macroblock_width
-
476 (s
->y_superblock_width
* 2 - s
->macroblock_width
);;
477 hilbert
= hilbert_walk_mb
;
479 current_macroblock
= -1;
480 for (i
= 0; i
< s
->u_superblock_start
; i
++) {
482 if (current_width
>= right_edge
- 1) {
483 /* reset width and move to next superblock row */
487 /* macroblock is now at the start of a new superblock row */
488 current_macroblock
+= superblock_row_inc
;
491 /* iterate through each potential macroblock in the superblock */
492 for (j
= 0; j
< 4; j
++) {
493 current_macroblock
+= hilbert_walk_mb
[j
];
494 current_width
+= travel_width_mb
[j
];
495 current_height
+= travel_height_mb
[j
];
497 /* check if the macroblock is in bounds */
498 if ((current_width
< right_edge
) &&
499 (current_height
< bottom_edge
)) {
500 s
->superblock_macroblocks
[mapping_index
] = current_macroblock
;
501 debug_init(" mapping macroblock %d to superblock %d, position %d (%d/%d x %d/%d)\n",
502 s
->superblock_macroblocks
[mapping_index
], i
, j
,
503 current_width
, right_edge
, current_height
, bottom_edge
);
505 s
->superblock_macroblocks
[mapping_index
] = -1;
506 debug_init(" superblock %d, position %d has no macroblock (%d/%d x %d/%d)\n",
508 current_width
, right_edge
, current_height
, bottom_edge
);
515 /* initialize the macroblock <-> fragment mapping */
516 current_fragment
= 0;
517 current_macroblock
= 0;
519 for (i
= 0; i
< s
->fragment_height
; i
+= 2) {
521 for (j
= 0; j
< s
->fragment_width
; j
+= 2) {
523 debug_init(" macroblock %d contains fragments: ", current_macroblock
);
524 s
->all_fragments
[current_fragment
].macroblock
= current_macroblock
;
525 s
->macroblock_fragments
[mapping_index
++] = current_fragment
;
526 debug_init("%d ", current_fragment
);
528 if (j
+ 1 < s
->fragment_width
) {
529 s
->all_fragments
[current_fragment
+ 1].macroblock
= current_macroblock
;
530 s
->macroblock_fragments
[mapping_index
++] = current_fragment
+ 1;
531 debug_init("%d ", current_fragment
+ 1);
533 s
->macroblock_fragments
[mapping_index
++] = -1;
535 if (i
+ 1 < s
->fragment_height
) {
536 s
->all_fragments
[current_fragment
+ s
->fragment_width
].macroblock
=
538 s
->macroblock_fragments
[mapping_index
++] =
539 current_fragment
+ s
->fragment_width
;
540 debug_init("%d ", current_fragment
+ s
->fragment_width
);
542 s
->macroblock_fragments
[mapping_index
++] = -1;
544 if ((j
+ 1 < s
->fragment_width
) && (i
+ 1 < s
->fragment_height
)) {
545 s
->all_fragments
[current_fragment
+ s
->fragment_width
+ 1].macroblock
=
547 s
->macroblock_fragments
[mapping_index
++] =
548 current_fragment
+ s
->fragment_width
+ 1;
549 debug_init("%d ", current_fragment
+ s
->fragment_width
+ 1);
551 s
->macroblock_fragments
[mapping_index
++] = -1;
554 c_fragment
= s
->fragment_start
[1] +
555 (i
* s
->fragment_width
/ 4) + (j
/ 2);
556 s
->all_fragments
[c_fragment
].macroblock
= s
->macroblock_count
;
557 s
->macroblock_fragments
[mapping_index
++] = c_fragment
;
558 debug_init("%d ", c_fragment
);
560 c_fragment
= s
->fragment_start
[2] +
561 (i
* s
->fragment_width
/ 4) + (j
/ 2);
562 s
->all_fragments
[c_fragment
].macroblock
= s
->macroblock_count
;
563 s
->macroblock_fragments
[mapping_index
++] = c_fragment
;
564 debug_init("%d ", c_fragment
);
568 if (j
+ 2 <= s
->fragment_width
)
569 current_fragment
+= 2;
572 current_macroblock
++;
575 current_fragment
+= s
->fragment_width
;
578 return 0; /* successful path out */
582 * This function wipes out all of the fragment data.
584 static void init_frame(Vp3DecodeContext
*s
, GetBitContext
*gb
)
588 /* zero out all of the fragment information */
589 s
->coded_fragment_list_index
= 0;
590 for (i
= 0; i
< s
->fragment_count
; i
++) {
591 s
->all_fragments
[i
].coeff_count
= 0;
592 s
->all_fragments
[i
].motion_x
= 127;
593 s
->all_fragments
[i
].motion_y
= 127;
594 s
->all_fragments
[i
].next_coeff
= NULL
;
596 s
->coeffs
[i
].coeff
=0;
597 s
->coeffs
[i
].next
= NULL
;
602 * This function sets up the dequantization tables used for a particular
605 static void init_dequantizer(Vp3DecodeContext
*s
)
607 int ac_scale_factor
= s
->coded_ac_scale_factor
[s
->quality_index
];
608 int dc_scale_factor
= s
->coded_dc_scale_factor
[s
->quality_index
];
609 int i
, plane
, inter
, qri
, bmi
, bmj
, qistart
;
611 debug_vp3(" vp3: initializing dequantization tables\n");
613 for(inter
=0; inter
<2; inter
++){
614 for(plane
=0; plane
<3; plane
++){
616 for(qri
=0; qri
<s
->qr_count
[inter
][plane
]; qri
++){
617 sum
+= s
->qr_size
[inter
][plane
][qri
];
618 if(s
->quality_index
<= sum
)
621 qistart
= sum
- s
->qr_size
[inter
][plane
][qri
];
622 bmi
= s
->qr_base
[inter
][plane
][qri
];
623 bmj
= s
->qr_base
[inter
][plane
][qri
+1];
625 int coeff
= ( 2*(sum
-s
->quality_index
)*s
->base_matrix
[bmi
][i
]
626 - 2*(qistart
-s
->quality_index
)*s
->base_matrix
[bmj
][i
]
627 + s
->qr_size
[inter
][plane
][qri
])
628 / (2*s
->qr_size
[inter
][plane
][qri
]);
630 int qmin
= 8<<(inter
+ !i
);
631 int qscale
= i
? ac_scale_factor
: dc_scale_factor
;
633 s
->qmat
[inter
][plane
][i
]= av_clip((qscale
* coeff
)/100 * 4, qmin
, 4096);
638 memset(s
->qscale_table
, (FFMAX(s
->qmat
[0][0][1], s
->qmat
[0][1][1])+8)/16, 512); //FIXME finetune
642 * This function initializes the loop filter boundary limits if the frame's
643 * quality index is different from the previous frame's.
645 static void init_loop_filter(Vp3DecodeContext
*s
)
647 int *bounding_values
= s
->bounding_values_array
+127;
651 filter_limit
= s
->filter_limit_values
[s
->quality_index
];
653 /* set up the bounding values */
654 memset(s
->bounding_values_array
, 0, 256 * sizeof(int));
655 for (x
= 0; x
< filter_limit
; x
++) {
656 bounding_values
[-x
- filter_limit
] = -filter_limit
+ x
;
657 bounding_values
[-x
] = -x
;
658 bounding_values
[x
] = x
;
659 bounding_values
[x
+ filter_limit
] = filter_limit
- x
;
664 * This function unpacks all of the superblock/macroblock/fragment coding
665 * information from the bitstream.
667 static int unpack_superblocks(Vp3DecodeContext
*s
, GetBitContext
*gb
)
670 int current_superblock
= 0;
672 int decode_fully_flags
= 0;
673 int decode_partial_blocks
= 0;
674 int first_c_fragment_seen
;
677 int current_fragment
;
679 debug_vp3(" vp3: unpacking superblock coding\n");
683 debug_vp3(" keyframe-- all superblocks are fully coded\n");
684 memset(s
->superblock_coding
, SB_FULLY_CODED
, s
->superblock_count
);
688 /* unpack the list of partially-coded superblocks */
690 /* toggle the bit because as soon as the first run length is
691 * fetched the bit will be toggled again */
693 while (current_superblock
< s
->superblock_count
) {
694 if (current_run
-- == 0) {
696 current_run
= get_vlc2(gb
,
697 s
->superblock_run_length_vlc
.table
, 6, 2);
698 if (current_run
== 33)
699 current_run
+= get_bits(gb
, 12);
700 debug_block_coding(" setting superblocks %d..%d to %s\n",
702 current_superblock
+ current_run
- 1,
703 (bit
) ? "partially coded" : "not coded");
705 /* if any of the superblocks are not partially coded, flag
706 * a boolean to decode the list of fully-coded superblocks */
708 decode_fully_flags
= 1;
711 /* make a note of the fact that there are partially coded
713 decode_partial_blocks
= 1;
716 s
->superblock_coding
[current_superblock
++] = bit
;
719 /* unpack the list of fully coded superblocks if any of the blocks were
720 * not marked as partially coded in the previous step */
721 if (decode_fully_flags
) {
723 current_superblock
= 0;
726 /* toggle the bit because as soon as the first run length is
727 * fetched the bit will be toggled again */
729 while (current_superblock
< s
->superblock_count
) {
731 /* skip any superblocks already marked as partially coded */
732 if (s
->superblock_coding
[current_superblock
] == SB_NOT_CODED
) {
734 if (current_run
-- == 0) {
736 current_run
= get_vlc2(gb
,
737 s
->superblock_run_length_vlc
.table
, 6, 2);
738 if (current_run
== 33)
739 current_run
+= get_bits(gb
, 12);
742 debug_block_coding(" setting superblock %d to %s\n",
744 (bit
) ? "fully coded" : "not coded");
745 s
->superblock_coding
[current_superblock
] = 2*bit
;
747 current_superblock
++;
751 /* if there were partial blocks, initialize bitstream for
752 * unpacking fragment codings */
753 if (decode_partial_blocks
) {
757 /* toggle the bit because as soon as the first run length is
758 * fetched the bit will be toggled again */
763 /* figure out which fragments are coded; iterate through each
764 * superblock (all planes) */
765 s
->coded_fragment_list_index
= 0;
766 s
->next_coeff
= s
->coeffs
+ s
->fragment_count
;
767 s
->first_coded_y_fragment
= s
->first_coded_c_fragment
= 0;
768 s
->last_coded_y_fragment
= s
->last_coded_c_fragment
= -1;
769 first_c_fragment_seen
= 0;
770 memset(s
->macroblock_coding
, MODE_COPY
, s
->macroblock_count
);
771 for (i
= 0; i
< s
->superblock_count
; i
++) {
773 /* iterate through all 16 fragments in a superblock */
774 for (j
= 0; j
< 16; j
++) {
776 /* if the fragment is in bounds, check its coding status */
777 current_fragment
= s
->superblock_fragments
[i
* 16 + j
];
778 if (current_fragment
>= s
->fragment_count
) {
779 av_log(s
->avctx
, AV_LOG_ERROR
, " vp3:unpack_superblocks(): bad fragment number (%d >= %d)\n",
780 current_fragment
, s
->fragment_count
);
783 if (current_fragment
!= -1) {
784 if (s
->superblock_coding
[i
] == SB_NOT_CODED
) {
786 /* copy all the fragments from the prior frame */
787 s
->all_fragments
[current_fragment
].coding_method
=
790 } else if (s
->superblock_coding
[i
] == SB_PARTIALLY_CODED
) {
792 /* fragment may or may not be coded; this is the case
793 * that cares about the fragment coding runs */
794 if (current_run
-- == 0) {
796 current_run
= get_vlc2(gb
,
797 s
->fragment_run_length_vlc
.table
, 5, 2);
801 /* default mode; actual mode will be decoded in
803 s
->all_fragments
[current_fragment
].coding_method
=
805 s
->all_fragments
[current_fragment
].next_coeff
= s
->coeffs
+ current_fragment
;
806 s
->coded_fragment_list
[s
->coded_fragment_list_index
] =
808 if ((current_fragment
>= s
->fragment_start
[1]) &&
809 (s
->last_coded_y_fragment
== -1) &&
810 (!first_c_fragment_seen
)) {
811 s
->first_coded_c_fragment
= s
->coded_fragment_list_index
;
812 s
->last_coded_y_fragment
= s
->first_coded_c_fragment
- 1;
813 first_c_fragment_seen
= 1;
815 s
->coded_fragment_list_index
++;
816 s
->macroblock_coding
[s
->all_fragments
[current_fragment
].macroblock
] = MODE_INTER_NO_MV
;
817 debug_block_coding(" superblock %d is partially coded, fragment %d is coded\n",
818 i
, current_fragment
);
820 /* not coded; copy this fragment from the prior frame */
821 s
->all_fragments
[current_fragment
].coding_method
=
823 debug_block_coding(" superblock %d is partially coded, fragment %d is not coded\n",
824 i
, current_fragment
);
829 /* fragments are fully coded in this superblock; actual
830 * coding will be determined in next step */
831 s
->all_fragments
[current_fragment
].coding_method
=
833 s
->all_fragments
[current_fragment
].next_coeff
= s
->coeffs
+ current_fragment
;
834 s
->coded_fragment_list
[s
->coded_fragment_list_index
] =
836 if ((current_fragment
>= s
->fragment_start
[1]) &&
837 (s
->last_coded_y_fragment
== -1) &&
838 (!first_c_fragment_seen
)) {
839 s
->first_coded_c_fragment
= s
->coded_fragment_list_index
;
840 s
->last_coded_y_fragment
= s
->first_coded_c_fragment
- 1;
841 first_c_fragment_seen
= 1;
843 s
->coded_fragment_list_index
++;
844 s
->macroblock_coding
[s
->all_fragments
[current_fragment
].macroblock
] = MODE_INTER_NO_MV
;
845 debug_block_coding(" superblock %d is fully coded, fragment %d is coded\n",
846 i
, current_fragment
);
852 if (!first_c_fragment_seen
)
853 /* only Y fragments coded in this frame */
854 s
->last_coded_y_fragment
= s
->coded_fragment_list_index
- 1;
856 /* end the list of coded C fragments */
857 s
->last_coded_c_fragment
= s
->coded_fragment_list_index
- 1;
859 debug_block_coding(" %d total coded fragments, y: %d -> %d, c: %d -> %d\n",
860 s
->coded_fragment_list_index
,
861 s
->first_coded_y_fragment
,
862 s
->last_coded_y_fragment
,
863 s
->first_coded_c_fragment
,
864 s
->last_coded_c_fragment
);
870 * This function unpacks all the coding mode data for individual macroblocks
871 * from the bitstream.
873 static int unpack_modes(Vp3DecodeContext
*s
, GetBitContext
*gb
)
877 int current_macroblock
;
878 int current_fragment
;
881 debug_vp3(" vp3: unpacking encoding modes\n");
884 debug_vp3(" keyframe-- all blocks are coded as INTRA\n");
886 for (i
= 0; i
< s
->fragment_count
; i
++)
887 s
->all_fragments
[i
].coding_method
= MODE_INTRA
;
891 /* fetch the mode coding scheme for this frame */
892 scheme
= get_bits(gb
, 3);
893 debug_modes(" using mode alphabet %d\n", scheme
);
895 /* is it a custom coding scheme? */
897 debug_modes(" custom mode alphabet ahead:\n");
898 for (i
= 0; i
< 8; i
++)
899 ModeAlphabet
[scheme
][get_bits(gb
, 3)] = i
;
902 for (i
= 0; i
< 8; i
++)
903 debug_modes(" mode[%d][%d] = %d\n", scheme
, i
,
904 ModeAlphabet
[scheme
][i
]);
906 /* iterate through all of the macroblocks that contain 1 or more
908 for (i
= 0; i
< s
->u_superblock_start
; i
++) {
910 for (j
= 0; j
< 4; j
++) {
911 current_macroblock
= s
->superblock_macroblocks
[i
* 4 + j
];
912 if ((current_macroblock
== -1) ||
913 (s
->macroblock_coding
[current_macroblock
] == MODE_COPY
))
915 if (current_macroblock
>= s
->macroblock_count
) {
916 av_log(s
->avctx
, AV_LOG_ERROR
, " vp3:unpack_modes(): bad macroblock number (%d >= %d)\n",
917 current_macroblock
, s
->macroblock_count
);
921 /* mode 7 means get 3 bits for each coding mode */
923 coding_mode
= get_bits(gb
, 3);
925 coding_mode
= ModeAlphabet
[scheme
]
926 [get_vlc2(gb
, s
->mode_code_vlc
.table
, 3, 3)];
928 s
->macroblock_coding
[current_macroblock
] = coding_mode
;
929 for (k
= 0; k
< 6; k
++) {
931 s
->macroblock_fragments
[current_macroblock
* 6 + k
];
932 if (current_fragment
== -1)
934 if (current_fragment
>= s
->fragment_count
) {
935 av_log(s
->avctx
, AV_LOG_ERROR
, " vp3:unpack_modes(): bad fragment number (%d >= %d)\n",
936 current_fragment
, s
->fragment_count
);
939 if (s
->all_fragments
[current_fragment
].coding_method
!=
941 s
->all_fragments
[current_fragment
].coding_method
=
945 debug_modes(" coding method for macroblock starting @ fragment %d = %d\n",
946 s
->macroblock_fragments
[current_macroblock
* 6], coding_mode
);
955 * This function unpacks all the motion vectors for the individual
956 * macroblocks from the bitstream.
958 static int unpack_vectors(Vp3DecodeContext
*s
, GetBitContext
*gb
)
964 int last_motion_x
= 0;
965 int last_motion_y
= 0;
966 int prior_last_motion_x
= 0;
967 int prior_last_motion_y
= 0;
968 int current_macroblock
;
969 int current_fragment
;
971 debug_vp3(" vp3: unpacking motion vectors\n");
974 debug_vp3(" keyframe-- there are no motion vectors\n");
978 memset(motion_x
, 0, 6 * sizeof(int));
979 memset(motion_y
, 0, 6 * sizeof(int));
981 /* coding mode 0 is the VLC scheme; 1 is the fixed code scheme */
982 coding_mode
= get_bits1(gb
);
983 debug_vectors(" using %s scheme for unpacking motion vectors\n",
984 (coding_mode
== 0) ? "VLC" : "fixed-length");
986 /* iterate through all of the macroblocks that contain 1 or more
988 for (i
= 0; i
< s
->u_superblock_start
; i
++) {
990 for (j
= 0; j
< 4; j
++) {
991 current_macroblock
= s
->superblock_macroblocks
[i
* 4 + j
];
992 if ((current_macroblock
== -1) ||
993 (s
->macroblock_coding
[current_macroblock
] == MODE_COPY
))
995 if (current_macroblock
>= s
->macroblock_count
) {
996 av_log(s
->avctx
, AV_LOG_ERROR
, " vp3:unpack_vectors(): bad macroblock number (%d >= %d)\n",
997 current_macroblock
, s
->macroblock_count
);
1001 current_fragment
= s
->macroblock_fragments
[current_macroblock
* 6];
1002 if (current_fragment
>= s
->fragment_count
) {
1003 av_log(s
->avctx
, AV_LOG_ERROR
, " vp3:unpack_vectors(): bad fragment number (%d >= %d\n",
1004 current_fragment
, s
->fragment_count
);
1007 switch (s
->macroblock_coding
[current_macroblock
]) {
1009 case MODE_INTER_PLUS_MV
:
1010 case MODE_GOLDEN_MV
:
1011 /* all 6 fragments use the same motion vector */
1012 if (coding_mode
== 0) {
1013 motion_x
[0] = motion_vector_table
[get_vlc2(gb
, s
->motion_vector_vlc
.table
, 6, 2)];
1014 motion_y
[0] = motion_vector_table
[get_vlc2(gb
, s
->motion_vector_vlc
.table
, 6, 2)];
1016 motion_x
[0] = fixed_motion_vector_table
[get_bits(gb
, 6)];
1017 motion_y
[0] = fixed_motion_vector_table
[get_bits(gb
, 6)];
1020 for (k
= 1; k
< 6; k
++) {
1021 motion_x
[k
] = motion_x
[0];
1022 motion_y
[k
] = motion_y
[0];
1025 /* vector maintenance, only on MODE_INTER_PLUS_MV */
1026 if (s
->macroblock_coding
[current_macroblock
] ==
1027 MODE_INTER_PLUS_MV
) {
1028 prior_last_motion_x
= last_motion_x
;
1029 prior_last_motion_y
= last_motion_y
;
1030 last_motion_x
= motion_x
[0];
1031 last_motion_y
= motion_y
[0];
1035 case MODE_INTER_FOURMV
:
1036 /* fetch 4 vectors from the bitstream, one for each
1037 * Y fragment, then average for the C fragment vectors */
1038 motion_x
[4] = motion_y
[4] = 0;
1039 for (k
= 0; k
< 4; k
++) {
1040 if (coding_mode
== 0) {
1041 motion_x
[k
] = motion_vector_table
[get_vlc2(gb
, s
->motion_vector_vlc
.table
, 6, 2)];
1042 motion_y
[k
] = motion_vector_table
[get_vlc2(gb
, s
->motion_vector_vlc
.table
, 6, 2)];
1044 motion_x
[k
] = fixed_motion_vector_table
[get_bits(gb
, 6)];
1045 motion_y
[k
] = fixed_motion_vector_table
[get_bits(gb
, 6)];
1047 motion_x
[4] += motion_x
[k
];
1048 motion_y
[4] += motion_y
[k
];
1052 motion_x
[4]= RSHIFT(motion_x
[4], 2);
1054 motion_y
[4]= RSHIFT(motion_y
[4], 2);
1056 /* vector maintenance; vector[3] is treated as the
1057 * last vector in this case */
1058 prior_last_motion_x
= last_motion_x
;
1059 prior_last_motion_y
= last_motion_y
;
1060 last_motion_x
= motion_x
[3];
1061 last_motion_y
= motion_y
[3];
1064 case MODE_INTER_LAST_MV
:
1065 /* all 6 fragments use the last motion vector */
1066 motion_x
[0] = last_motion_x
;
1067 motion_y
[0] = last_motion_y
;
1068 for (k
= 1; k
< 6; k
++) {
1069 motion_x
[k
] = motion_x
[0];
1070 motion_y
[k
] = motion_y
[0];
1073 /* no vector maintenance (last vector remains the
1077 case MODE_INTER_PRIOR_LAST
:
1078 /* all 6 fragments use the motion vector prior to the
1079 * last motion vector */
1080 motion_x
[0] = prior_last_motion_x
;
1081 motion_y
[0] = prior_last_motion_y
;
1082 for (k
= 1; k
< 6; k
++) {
1083 motion_x
[k
] = motion_x
[0];
1084 motion_y
[k
] = motion_y
[0];
1087 /* vector maintenance */
1088 prior_last_motion_x
= last_motion_x
;
1089 prior_last_motion_y
= last_motion_y
;
1090 last_motion_x
= motion_x
[0];
1091 last_motion_y
= motion_y
[0];
1095 /* covers intra, inter without MV, golden without MV */
1096 memset(motion_x
, 0, 6 * sizeof(int));
1097 memset(motion_y
, 0, 6 * sizeof(int));
1099 /* no vector maintenance */
1103 /* assign the motion vectors to the correct fragments */
1104 debug_vectors(" vectors for macroblock starting @ fragment %d (coding method %d):\n",
1106 s
->macroblock_coding
[current_macroblock
]);
1107 for (k
= 0; k
< 6; k
++) {
1109 s
->macroblock_fragments
[current_macroblock
* 6 + k
];
1110 if (current_fragment
== -1)
1112 if (current_fragment
>= s
->fragment_count
) {
1113 av_log(s
->avctx
, AV_LOG_ERROR
, " vp3:unpack_vectors(): bad fragment number (%d >= %d)\n",
1114 current_fragment
, s
->fragment_count
);
1117 s
->all_fragments
[current_fragment
].motion_x
= motion_x
[k
];
1118 s
->all_fragments
[current_fragment
].motion_y
= motion_y
[k
];
1119 debug_vectors(" vector %d: fragment %d = (%d, %d)\n",
1120 k
, current_fragment
, motion_x
[k
], motion_y
[k
]);
1130 * This function is called by unpack_dct_coeffs() to extract the VLCs from
1131 * the bitstream. The VLCs encode tokens which are used to unpack DCT
1132 * data. This function unpacks all the VLCs for either the Y plane or both
1133 * C planes, and is called for DC coefficients or different AC coefficient
1134 * levels (since different coefficient types require different VLC tables.
1136 * This function returns a residual eob run. E.g, if a particular token gave
1137 * instructions to EOB the next 5 fragments and there were only 2 fragments
1138 * left in the current fragment range, 3 would be returned so that it could
1139 * be passed into the next call to this same function.
1141 static int unpack_vlcs(Vp3DecodeContext
*s
, GetBitContext
*gb
,
1142 VLC
*table
, int coeff_index
,
1143 int first_fragment
, int last_fragment
,
1150 Vp3Fragment
*fragment
;
1151 uint8_t *perm
= s
->scantable
.permutated
;
1154 if ((first_fragment
>= s
->fragment_count
) ||
1155 (last_fragment
>= s
->fragment_count
)) {
1157 av_log(s
->avctx
, AV_LOG_ERROR
, " vp3:unpack_vlcs(): bad fragment number (%d -> %d ?)\n",
1158 first_fragment
, last_fragment
);
1162 for (i
= first_fragment
; i
<= last_fragment
; i
++) {
1164 fragment
= &s
->all_fragments
[s
->coded_fragment_list
[i
]];
1165 if (fragment
->coeff_count
> coeff_index
)
1169 /* decode a VLC into a token */
1170 token
= get_vlc2(gb
, table
->table
, 5, 3);
1171 debug_vlc(" token = %2d, ", token
);
1172 /* use the token to get a zero run, a coefficient, and an eob run */
1174 eob_run
= eob_run_base
[token
];
1175 if (eob_run_get_bits
[token
])
1176 eob_run
+= get_bits(gb
, eob_run_get_bits
[token
]);
1177 coeff
= zero_run
= 0;
1179 bits_to_get
= coeff_get_bits
[token
];
1181 coeff
= coeff_tables
[token
][0];
1183 coeff
= coeff_tables
[token
][get_bits(gb
, bits_to_get
)];
1185 zero_run
= zero_run_base
[token
];
1186 if (zero_run_get_bits
[token
])
1187 zero_run
+= get_bits(gb
, zero_run_get_bits
[token
]);
1192 fragment
->coeff_count
+= zero_run
;
1193 if (fragment
->coeff_count
< 64){
1194 fragment
->next_coeff
->coeff
= coeff
;
1195 fragment
->next_coeff
->index
= perm
[fragment
->coeff_count
++]; //FIXME perm here already?
1196 fragment
->next_coeff
->next
= s
->next_coeff
;
1197 s
->next_coeff
->next
=NULL
;
1198 fragment
->next_coeff
= s
->next_coeff
++;
1200 debug_vlc(" fragment %d coeff = %d\n",
1201 s
->coded_fragment_list
[i
], fragment
->next_coeff
[coeff_index
]);
1203 fragment
->coeff_count
|= 128;
1204 debug_vlc(" fragment %d eob with %d coefficients\n",
1205 s
->coded_fragment_list
[i
], fragment
->coeff_count
&127);
1214 * This function unpacks all of the DCT coefficient data from the
1217 static int unpack_dct_coeffs(Vp3DecodeContext
*s
, GetBitContext
*gb
)
1224 int residual_eob_run
= 0;
1226 /* fetch the DC table indices */
1227 dc_y_table
= get_bits(gb
, 4);
1228 dc_c_table
= get_bits(gb
, 4);
1230 /* unpack the Y plane DC coefficients */
1231 debug_vp3(" vp3: unpacking Y plane DC coefficients using table %d\n",
1233 residual_eob_run
= unpack_vlcs(s
, gb
, &s
->dc_vlc
[dc_y_table
], 0,
1234 s
->first_coded_y_fragment
, s
->last_coded_y_fragment
, residual_eob_run
);
1236 /* unpack the C plane DC coefficients */
1237 debug_vp3(" vp3: unpacking C plane DC coefficients using table %d\n",
1239 residual_eob_run
= unpack_vlcs(s
, gb
, &s
->dc_vlc
[dc_c_table
], 0,
1240 s
->first_coded_c_fragment
, s
->last_coded_c_fragment
, residual_eob_run
);
1242 /* fetch the AC table indices */
1243 ac_y_table
= get_bits(gb
, 4);
1244 ac_c_table
= get_bits(gb
, 4);
1246 /* unpack the group 1 AC coefficients (coeffs 1-5) */
1247 for (i
= 1; i
<= 5; i
++) {
1249 debug_vp3(" vp3: unpacking level %d Y plane AC coefficients using table %d\n",
1251 residual_eob_run
= unpack_vlcs(s
, gb
, &s
->ac_vlc_1
[ac_y_table
], i
,
1252 s
->first_coded_y_fragment
, s
->last_coded_y_fragment
, residual_eob_run
);
1254 debug_vp3(" vp3: unpacking level %d C plane AC coefficients using table %d\n",
1256 residual_eob_run
= unpack_vlcs(s
, gb
, &s
->ac_vlc_1
[ac_c_table
], i
,
1257 s
->first_coded_c_fragment
, s
->last_coded_c_fragment
, residual_eob_run
);
1260 /* unpack the group 2 AC coefficients (coeffs 6-14) */
1261 for (i
= 6; i
<= 14; i
++) {
1263 debug_vp3(" vp3: unpacking level %d Y plane AC coefficients using table %d\n",
1265 residual_eob_run
= unpack_vlcs(s
, gb
, &s
->ac_vlc_2
[ac_y_table
], i
,
1266 s
->first_coded_y_fragment
, s
->last_coded_y_fragment
, residual_eob_run
);
1268 debug_vp3(" vp3: unpacking level %d C plane AC coefficients using table %d\n",
1270 residual_eob_run
= unpack_vlcs(s
, gb
, &s
->ac_vlc_2
[ac_c_table
], i
,
1271 s
->first_coded_c_fragment
, s
->last_coded_c_fragment
, residual_eob_run
);
1274 /* unpack the group 3 AC coefficients (coeffs 15-27) */
1275 for (i
= 15; i
<= 27; i
++) {
1277 debug_vp3(" vp3: unpacking level %d Y plane AC coefficients using table %d\n",
1279 residual_eob_run
= unpack_vlcs(s
, gb
, &s
->ac_vlc_3
[ac_y_table
], i
,
1280 s
->first_coded_y_fragment
, s
->last_coded_y_fragment
, residual_eob_run
);
1282 debug_vp3(" vp3: unpacking level %d C plane AC coefficients using table %d\n",
1284 residual_eob_run
= unpack_vlcs(s
, gb
, &s
->ac_vlc_3
[ac_c_table
], i
,
1285 s
->first_coded_c_fragment
, s
->last_coded_c_fragment
, residual_eob_run
);
1288 /* unpack the group 4 AC coefficients (coeffs 28-63) */
1289 for (i
= 28; i
<= 63; i
++) {
1291 debug_vp3(" vp3: unpacking level %d Y plane AC coefficients using table %d\n",
1293 residual_eob_run
= unpack_vlcs(s
, gb
, &s
->ac_vlc_4
[ac_y_table
], i
,
1294 s
->first_coded_y_fragment
, s
->last_coded_y_fragment
, residual_eob_run
);
1296 debug_vp3(" vp3: unpacking level %d C plane AC coefficients using table %d\n",
1298 residual_eob_run
= unpack_vlcs(s
, gb
, &s
->ac_vlc_4
[ac_c_table
], i
,
1299 s
->first_coded_c_fragment
, s
->last_coded_c_fragment
, residual_eob_run
);
1306 * This function reverses the DC prediction for each coded fragment in
1307 * the frame. Much of this function is adapted directly from the original
1310 #define COMPATIBLE_FRAME(x) \
1311 (compatible_frame[s->all_fragments[x].coding_method] == current_frame_type)
1312 #define FRAME_CODED(x) (s->all_fragments[x].coding_method != MODE_COPY)
1313 #define DC_COEFF(u) (s->coeffs[u].index ? 0 : s->coeffs[u].coeff) //FIXME do somethin to simplify this
1315 static void reverse_dc_prediction(Vp3DecodeContext
*s
,
1318 int fragment_height
)
1327 int i
= first_fragment
;
1331 /* DC values for the left, up-left, up, and up-right fragments */
1332 int vl
, vul
, vu
, vur
;
1334 /* indices for the left, up-left, up, and up-right fragments */
1338 * The 6 fields mean:
1339 * 0: up-left multiplier
1341 * 2: up-right multiplier
1342 * 3: left multiplier
1344 int predictor_transform
[16][4] = {
1346 { 0, 0, 0,128}, // PL
1347 { 0, 0,128, 0}, // PUR
1348 { 0, 0, 53, 75}, // PUR|PL
1349 { 0,128, 0, 0}, // PU
1350 { 0, 64, 0, 64}, // PU|PL
1351 { 0,128, 0, 0}, // PU|PUR
1352 { 0, 0, 53, 75}, // PU|PUR|PL
1353 {128, 0, 0, 0}, // PUL
1354 { 0, 0, 0,128}, // PUL|PL
1355 { 64, 0, 64, 0}, // PUL|PUR
1356 { 0, 0, 53, 75}, // PUL|PUR|PL
1357 { 0,128, 0, 0}, // PUL|PU
1358 {-104,116, 0,116}, // PUL|PU|PL
1359 { 24, 80, 24, 0}, // PUL|PU|PUR
1360 {-104,116, 0,116} // PUL|PU|PUR|PL
1363 /* This table shows which types of blocks can use other blocks for
1364 * prediction. For example, INTRA is the only mode in this table to
1365 * have a frame number of 0. That means INTRA blocks can only predict
1366 * from other INTRA blocks. There are 2 golden frame coding types;
1367 * blocks encoding in these modes can only predict from other blocks
1368 * that were encoded with these 1 of these 2 modes. */
1369 unsigned char compatible_frame
[8] = {
1370 1, /* MODE_INTER_NO_MV */
1372 1, /* MODE_INTER_PLUS_MV */
1373 1, /* MODE_INTER_LAST_MV */
1374 1, /* MODE_INTER_PRIOR_MV */
1375 2, /* MODE_USING_GOLDEN */
1376 2, /* MODE_GOLDEN_MV */
1377 1 /* MODE_INTER_FOUR_MV */
1379 int current_frame_type
;
1381 /* there is a last DC predictor for each of the 3 frame types */
1386 debug_vp3(" vp3: reversing DC prediction\n");
1388 vul
= vu
= vur
= vl
= 0;
1389 last_dc
[0] = last_dc
[1] = last_dc
[2] = 0;
1391 /* for each fragment row... */
1392 for (y
= 0; y
< fragment_height
; y
++) {
1394 /* for each fragment in a row... */
1395 for (x
= 0; x
< fragment_width
; x
++, i
++) {
1397 /* reverse prediction if this block was coded */
1398 if (s
->all_fragments
[i
].coding_method
!= MODE_COPY
) {
1400 current_frame_type
=
1401 compatible_frame
[s
->all_fragments
[i
].coding_method
];
1402 debug_dc_pred(" frag %d: orig DC = %d, ",
1409 if(FRAME_CODED(l
) && COMPATIBLE_FRAME(l
))
1413 u
= i
-fragment_width
;
1415 if(FRAME_CODED(u
) && COMPATIBLE_FRAME(u
))
1418 ul
= i
-fragment_width
-1;
1420 if(FRAME_CODED(ul
) && COMPATIBLE_FRAME(ul
))
1423 if(x
+ 1 < fragment_width
){
1424 ur
= i
-fragment_width
+1;
1426 if(FRAME_CODED(ur
) && COMPATIBLE_FRAME(ur
))
1431 debug_dc_pred("transform = %d, ", transform
);
1433 if (transform
== 0) {
1435 /* if there were no fragments to predict from, use last
1437 predicted_dc
= last_dc
[current_frame_type
];
1438 debug_dc_pred("from last DC (%d) = %d\n",
1439 current_frame_type
, DC_COEFF(i
));
1443 /* apply the appropriate predictor transform */
1445 (predictor_transform
[transform
][0] * vul
) +
1446 (predictor_transform
[transform
][1] * vu
) +
1447 (predictor_transform
[transform
][2] * vur
) +
1448 (predictor_transform
[transform
][3] * vl
);
1450 predicted_dc
/= 128;
1452 /* check for outranging on the [ul u l] and
1453 * [ul u ur l] predictors */
1454 if ((transform
== 13) || (transform
== 15)) {
1455 if (FFABS(predicted_dc
- vu
) > 128)
1457 else if (FFABS(predicted_dc
- vl
) > 128)
1459 else if (FFABS(predicted_dc
- vul
) > 128)
1463 debug_dc_pred("from pred DC = %d\n",
1467 /* at long last, apply the predictor */
1468 if(s
->coeffs
[i
].index
){
1469 *s
->next_coeff
= s
->coeffs
[i
];
1470 s
->coeffs
[i
].index
=0;
1471 s
->coeffs
[i
].coeff
=0;
1472 s
->coeffs
[i
].next
= s
->next_coeff
++;
1474 s
->coeffs
[i
].coeff
+= predicted_dc
;
1476 last_dc
[current_frame_type
] = DC_COEFF(i
);
1477 if(DC_COEFF(i
) && !(s
->all_fragments
[i
].coeff_count
&127)){
1478 s
->all_fragments
[i
].coeff_count
= 129;
1479 // s->all_fragments[i].next_coeff= s->next_coeff;
1480 s
->coeffs
[i
].next
= s
->next_coeff
;
1481 (s
->next_coeff
++)->next
=NULL
;
1489 static void horizontal_filter(unsigned char *first_pixel
, int stride
,
1490 int *bounding_values
);
1491 static void vertical_filter(unsigned char *first_pixel
, int stride
,
1492 int *bounding_values
);
1495 * Perform the final rendering for a particular slice of data.
1496 * The slice number ranges from 0..(macroblock_height - 1).
1498 static void render_slice(Vp3DecodeContext
*s
, int slice
)
1502 int16_t *dequantizer
;
1503 DECLARE_ALIGNED_16(DCTELEM
, block
[64]);
1504 int motion_x
= 0xdeadbeef, motion_y
= 0xdeadbeef;
1505 int motion_halfpel_index
;
1506 uint8_t *motion_source
;
1508 int current_macroblock_entry
= slice
* s
->macroblock_width
* 6;
1510 if (slice
>= s
->macroblock_height
)
1513 for (plane
= 0; plane
< 3; plane
++) {
1514 uint8_t *output_plane
= s
->current_frame
.data
[plane
];
1515 uint8_t * last_plane
= s
-> last_frame
.data
[plane
];
1516 uint8_t *golden_plane
= s
-> golden_frame
.data
[plane
];
1517 int stride
= s
->current_frame
.linesize
[plane
];
1518 int plane_width
= s
->width
>> !!plane
;
1519 int plane_height
= s
->height
>> !!plane
;
1520 int y
= slice
* FRAGMENT_PIXELS
<< !plane
;
1521 int slice_height
= y
+ (FRAGMENT_PIXELS
<< !plane
);
1522 int i
= s
->macroblock_fragments
[current_macroblock_entry
+ plane
+ 3*!!plane
];
1524 if (!s
->flipped_image
) stride
= -stride
;
1527 if(FFABS(stride
) > 2048)
1528 return; //various tables are fixed size
1530 /* for each fragment row in the slice (both of them)... */
1531 for (; y
< slice_height
; y
+= 8) {
1533 /* for each fragment in a row... */
1534 for (x
= 0; x
< plane_width
; x
+= 8, i
++) {
1536 if ((i
< 0) || (i
>= s
->fragment_count
)) {
1537 av_log(s
->avctx
, AV_LOG_ERROR
, " vp3:render_slice(): bad fragment number (%d)\n", i
);
1541 /* transform if this block was coded */
1542 if ((s
->all_fragments
[i
].coding_method
!= MODE_COPY
) &&
1543 !((s
->avctx
->flags
& CODEC_FLAG_GRAY
) && plane
)) {
1545 if ((s
->all_fragments
[i
].coding_method
== MODE_USING_GOLDEN
) ||
1546 (s
->all_fragments
[i
].coding_method
== MODE_GOLDEN_MV
))
1547 motion_source
= golden_plane
;
1549 motion_source
= last_plane
;
1551 motion_source
+= s
->all_fragments
[i
].first_pixel
;
1552 motion_halfpel_index
= 0;
1554 /* sort out the motion vector if this fragment is coded
1555 * using a motion vector method */
1556 if ((s
->all_fragments
[i
].coding_method
> MODE_INTRA
) &&
1557 (s
->all_fragments
[i
].coding_method
!= MODE_USING_GOLDEN
)) {
1559 motion_x
= s
->all_fragments
[i
].motion_x
;
1560 motion_y
= s
->all_fragments
[i
].motion_y
;
1562 motion_x
= (motion_x
>>1) | (motion_x
&1);
1563 motion_y
= (motion_y
>>1) | (motion_y
&1);
1566 src_x
= (motion_x
>>1) + x
;
1567 src_y
= (motion_y
>>1) + y
;
1568 if ((motion_x
== 127) || (motion_y
== 127))
1569 av_log(s
->avctx
, AV_LOG_ERROR
, " help! got invalid motion vector! (%X, %X)\n", motion_x
, motion_y
);
1571 motion_halfpel_index
= motion_x
& 0x01;
1572 motion_source
+= (motion_x
>> 1);
1574 motion_halfpel_index
|= (motion_y
& 0x01) << 1;
1575 motion_source
+= ((motion_y
>> 1) * stride
);
1577 if(src_x
<0 || src_y
<0 || src_x
+ 9 >= plane_width
|| src_y
+ 9 >= plane_height
){
1578 uint8_t *temp
= s
->edge_emu_buffer
;
1579 if(stride
<0) temp
-= 9*stride
;
1580 else temp
+= 9*stride
;
1582 ff_emulated_edge_mc(temp
, motion_source
, stride
, 9, 9, src_x
, src_y
, plane_width
, plane_height
);
1583 motion_source
= temp
;
1588 /* first, take care of copying a block from either the
1589 * previous or the golden frame */
1590 if (s
->all_fragments
[i
].coding_method
!= MODE_INTRA
) {
1591 /* Note, it is possible to implement all MC cases with
1592 put_no_rnd_pixels_l2 which would look more like the
1593 VP3 source but this would be slower as
1594 put_no_rnd_pixels_tab is better optimzed */
1595 if(motion_halfpel_index
!= 3){
1596 s
->dsp
.put_no_rnd_pixels_tab
[1][motion_halfpel_index
](
1597 output_plane
+ s
->all_fragments
[i
].first_pixel
,
1598 motion_source
, stride
, 8);
1600 int d
= (motion_x
^ motion_y
)>>31; // d is 0 if motion_x and _y have the same sign, else -1
1601 s
->dsp
.put_no_rnd_pixels_l2
[1](
1602 output_plane
+ s
->all_fragments
[i
].first_pixel
,
1604 motion_source
+ stride
+ 1 + d
,
1607 dequantizer
= s
->qmat
[1][plane
];
1609 dequantizer
= s
->qmat
[0][plane
];
1612 /* dequantize the DCT coefficients */
1613 debug_idct("fragment %d, coding mode %d, DC = %d, dequant = %d:\n",
1614 i
, s
->all_fragments
[i
].coding_method
,
1615 DC_COEFF(i
), dequantizer
[0]);
1617 if(s
->avctx
->idct_algo
==FF_IDCT_VP3
){
1618 Coeff
*coeff
= s
->coeffs
+ i
;
1619 memset(block
, 0, sizeof(block
));
1621 block
[coeff
->index
]= coeff
->coeff
* dequantizer
[coeff
->index
];
1625 Coeff
*coeff
= s
->coeffs
+ i
;
1626 memset(block
, 0, sizeof(block
));
1628 block
[coeff
->index
]= (coeff
->coeff
* dequantizer
[coeff
->index
] + 2)>>2;
1633 /* invert DCT and place (or add) in final output */
1635 if (s
->all_fragments
[i
].coding_method
== MODE_INTRA
) {
1636 if(s
->avctx
->idct_algo
!=FF_IDCT_VP3
)
1639 output_plane
+ s
->all_fragments
[i
].first_pixel
,
1644 output_plane
+ s
->all_fragments
[i
].first_pixel
,
1649 debug_idct("block after idct_%s():\n",
1650 (s
->all_fragments
[i
].coding_method
== MODE_INTRA
)?
1652 for (m
= 0; m
< 8; m
++) {
1653 for (n
= 0; n
< 8; n
++) {
1654 debug_idct(" %3d", *(output_plane
+
1655 s
->all_fragments
[i
].first_pixel
+ (m
* stride
+ n
)));
1663 /* copy directly from the previous frame */
1664 s
->dsp
.put_pixels_tab
[1][0](
1665 output_plane
+ s
->all_fragments
[i
].first_pixel
,
1666 last_plane
+ s
->all_fragments
[i
].first_pixel
,
1671 /* perform the left edge filter if:
1672 * - the fragment is not on the left column
1673 * - the fragment is coded in this frame
1674 * - the fragment is not coded in this frame but the left
1675 * fragment is coded in this frame (this is done instead
1676 * of a right edge filter when rendering the left fragment
1677 * since this fragment is not available yet) */
1679 ((s
->all_fragments
[i
].coding_method
!= MODE_COPY
) ||
1680 ((s
->all_fragments
[i
].coding_method
== MODE_COPY
) &&
1681 (s
->all_fragments
[i
- 1].coding_method
!= MODE_COPY
)) )) {
1683 output_plane
+ s
->all_fragments
[i
].first_pixel
+ 7*stride
,
1684 -stride
, s
->bounding_values_array
+ 127);
1687 /* perform the top edge filter if:
1688 * - the fragment is not on the top row
1689 * - the fragment is coded in this frame
1690 * - the fragment is not coded in this frame but the above
1691 * fragment is coded in this frame (this is done instead
1692 * of a bottom edge filter when rendering the above
1693 * fragment since this fragment is not available yet) */
1695 ((s
->all_fragments
[i
].coding_method
!= MODE_COPY
) ||
1696 ((s
->all_fragments
[i
].coding_method
== MODE_COPY
) &&
1697 (s
->all_fragments
[i
- fragment_width
].coding_method
!= MODE_COPY
)) )) {
1699 output_plane
+ s
->all_fragments
[i
].first_pixel
- stride
,
1700 -stride
, s
->bounding_values_array
+ 127);
1707 /* this looks like a good place for slice dispatch... */
1709 * if (slice == s->macroblock_height - 1)
1710 * dispatch (both last slice & 2nd-to-last slice);
1711 * else if (slice > 0)
1712 * dispatch (slice - 1);
1718 static void horizontal_filter(unsigned char *first_pixel
, int stride
,
1719 int *bounding_values
)
1724 for (end
= first_pixel
+ 8*stride
; first_pixel
!= end
; first_pixel
+= stride
) {
1726 (first_pixel
[-2] - first_pixel
[ 1])
1727 +3*(first_pixel
[ 0] - first_pixel
[-1]);
1728 filter_value
= bounding_values
[(filter_value
+ 4) >> 3];
1729 first_pixel
[-1] = av_clip_uint8(first_pixel
[-1] + filter_value
);
1730 first_pixel
[ 0] = av_clip_uint8(first_pixel
[ 0] - filter_value
);
1734 static void vertical_filter(unsigned char *first_pixel
, int stride
,
1735 int *bounding_values
)
1739 const int nstride
= -stride
;
1741 for (end
= first_pixel
+ 8; first_pixel
< end
; first_pixel
++) {
1743 (first_pixel
[2 * nstride
] - first_pixel
[ stride
])
1744 +3*(first_pixel
[0 ] - first_pixel
[nstride
]);
1745 filter_value
= bounding_values
[(filter_value
+ 4) >> 3];
1746 first_pixel
[nstride
] = av_clip_uint8(first_pixel
[nstride
] + filter_value
);
1747 first_pixel
[0] = av_clip_uint8(first_pixel
[0] - filter_value
);
1751 static void apply_loop_filter(Vp3DecodeContext
*s
)
1755 int *bounding_values
= s
->bounding_values_array
+127;
1758 int bounding_values_array
[256];
1761 /* find the right loop limit value */
1762 for (x
= 63; x
>= 0; x
--) {
1763 if (vp31_ac_scale_factor
[x
] >= s
->quality_index
)
1766 filter_limit
= vp31_filter_limit_values
[s
->quality_index
];
1768 /* set up the bounding values */
1769 memset(bounding_values_array
, 0, 256 * sizeof(int));
1770 for (x
= 0; x
< filter_limit
; x
++) {
1771 bounding_values
[-x
- filter_limit
] = -filter_limit
+ x
;
1772 bounding_values
[-x
] = -x
;
1773 bounding_values
[x
] = x
;
1774 bounding_values
[x
+ filter_limit
] = filter_limit
- x
;
1778 for (plane
= 0; plane
< 3; plane
++) {
1779 int width
= s
->fragment_width
>> !!plane
;
1780 int height
= s
->fragment_height
>> !!plane
;
1781 int fragment
= s
->fragment_start
[plane
];
1782 int stride
= s
->current_frame
.linesize
[plane
];
1783 uint8_t *plane_data
= s
->current_frame
.data
[plane
];
1784 if (!s
->flipped_image
) stride
= -stride
;
1786 for (y
= 0; y
< height
; y
++) {
1788 for (x
= 0; x
< width
; x
++) {
1790 /* do not perform left edge filter for left columns frags */
1792 (s
->all_fragments
[fragment
].coding_method
!= MODE_COPY
)) {
1794 plane_data
+ s
->all_fragments
[fragment
].first_pixel
,
1795 stride
, bounding_values
);
1798 /* do not perform top edge filter for top row fragments */
1800 (s
->all_fragments
[fragment
].coding_method
!= MODE_COPY
)) {
1802 plane_data
+ s
->all_fragments
[fragment
].first_pixel
,
1803 stride
, bounding_values
);
1806 /* do not perform right edge filter for right column
1807 * fragments or if right fragment neighbor is also coded
1808 * in this frame (it will be filtered in next iteration) */
1809 if ((x
< width
- 1) &&
1810 (s
->all_fragments
[fragment
].coding_method
!= MODE_COPY
) &&
1811 (s
->all_fragments
[fragment
+ 1].coding_method
== MODE_COPY
)) {
1813 plane_data
+ s
->all_fragments
[fragment
+ 1].first_pixel
,
1814 stride
, bounding_values
);
1817 /* do not perform bottom edge filter for bottom row
1818 * fragments or if bottom fragment neighbor is also coded
1819 * in this frame (it will be filtered in the next row) */
1820 if ((y
< height
- 1) &&
1821 (s
->all_fragments
[fragment
].coding_method
!= MODE_COPY
) &&
1822 (s
->all_fragments
[fragment
+ width
].coding_method
== MODE_COPY
)) {
1824 plane_data
+ s
->all_fragments
[fragment
+ width
].first_pixel
,
1825 stride
, bounding_values
);
1829 STOP_TIMER("loop filter")
1836 * This function computes the first pixel addresses for each fragment.
1837 * This function needs to be invoked after the first frame is allocated
1838 * so that it has access to the plane strides.
1840 static void vp3_calculate_pixel_addresses(Vp3DecodeContext
*s
)
1845 /* figure out the first pixel addresses for each of the fragments */
1848 for (y
= s
->fragment_height
; y
> 0; y
--) {
1849 for (x
= 0; x
< s
->fragment_width
; x
++) {
1850 s
->all_fragments
[i
++].first_pixel
=
1851 s
->golden_frame
.linesize
[0] * y
* FRAGMENT_PIXELS
-
1852 s
->golden_frame
.linesize
[0] +
1853 x
* FRAGMENT_PIXELS
;
1854 debug_init(" fragment %d, first pixel @ %d\n",
1855 i
-1, s
->all_fragments
[i
-1].first_pixel
);
1860 i
= s
->fragment_start
[1];
1861 for (y
= s
->fragment_height
/ 2; y
> 0; y
--) {
1862 for (x
= 0; x
< s
->fragment_width
/ 2; x
++) {
1863 s
->all_fragments
[i
++].first_pixel
=
1864 s
->golden_frame
.linesize
[1] * y
* FRAGMENT_PIXELS
-
1865 s
->golden_frame
.linesize
[1] +
1866 x
* FRAGMENT_PIXELS
;
1867 debug_init(" fragment %d, first pixel @ %d\n",
1868 i
-1, s
->all_fragments
[i
-1].first_pixel
);
1873 i
= s
->fragment_start
[2];
1874 for (y
= s
->fragment_height
/ 2; y
> 0; y
--) {
1875 for (x
= 0; x
< s
->fragment_width
/ 2; x
++) {
1876 s
->all_fragments
[i
++].first_pixel
=
1877 s
->golden_frame
.linesize
[2] * y
* FRAGMENT_PIXELS
-
1878 s
->golden_frame
.linesize
[2] +
1879 x
* FRAGMENT_PIXELS
;
1880 debug_init(" fragment %d, first pixel @ %d\n",
1881 i
-1, s
->all_fragments
[i
-1].first_pixel
);
1886 /* FIXME: this should be merged with the above! */
1887 static void theora_calculate_pixel_addresses(Vp3DecodeContext
*s
)
1892 /* figure out the first pixel addresses for each of the fragments */
1895 for (y
= 1; y
<= s
->fragment_height
; y
++) {
1896 for (x
= 0; x
< s
->fragment_width
; x
++) {
1897 s
->all_fragments
[i
++].first_pixel
=
1898 s
->golden_frame
.linesize
[0] * y
* FRAGMENT_PIXELS
-
1899 s
->golden_frame
.linesize
[0] +
1900 x
* FRAGMENT_PIXELS
;
1901 debug_init(" fragment %d, first pixel @ %d\n",
1902 i
-1, s
->all_fragments
[i
-1].first_pixel
);
1907 i
= s
->fragment_start
[1];
1908 for (y
= 1; y
<= s
->fragment_height
/ 2; y
++) {
1909 for (x
= 0; x
< s
->fragment_width
/ 2; x
++) {
1910 s
->all_fragments
[i
++].first_pixel
=
1911 s
->golden_frame
.linesize
[1] * y
* FRAGMENT_PIXELS
-
1912 s
->golden_frame
.linesize
[1] +
1913 x
* FRAGMENT_PIXELS
;
1914 debug_init(" fragment %d, first pixel @ %d\n",
1915 i
-1, s
->all_fragments
[i
-1].first_pixel
);
1920 i
= s
->fragment_start
[2];
1921 for (y
= 1; y
<= s
->fragment_height
/ 2; y
++) {
1922 for (x
= 0; x
< s
->fragment_width
/ 2; x
++) {
1923 s
->all_fragments
[i
++].first_pixel
=
1924 s
->golden_frame
.linesize
[2] * y
* FRAGMENT_PIXELS
-
1925 s
->golden_frame
.linesize
[2] +
1926 x
* FRAGMENT_PIXELS
;
1927 debug_init(" fragment %d, first pixel @ %d\n",
1928 i
-1, s
->all_fragments
[i
-1].first_pixel
);
1934 * This is the ffmpeg/libavcodec API init function.
1936 static int vp3_decode_init(AVCodecContext
*avctx
)
1938 Vp3DecodeContext
*s
= avctx
->priv_data
;
1939 int i
, inter
, plane
;
1942 int y_superblock_count
;
1943 int c_superblock_count
;
1945 if (avctx
->codec_tag
== MKTAG('V','P','3','0'))
1951 s
->width
= (avctx
->width
+ 15) & 0xFFFFFFF0;
1952 s
->height
= (avctx
->height
+ 15) & 0xFFFFFFF0;
1953 avctx
->pix_fmt
= PIX_FMT_YUV420P
;
1954 if(avctx
->idct_algo
==FF_IDCT_AUTO
)
1955 avctx
->idct_algo
=FF_IDCT_VP3
;
1956 dsputil_init(&s
->dsp
, avctx
);
1958 ff_init_scantable(s
->dsp
.idct_permutation
, &s
->scantable
, ff_zigzag_direct
);
1960 /* initialize to an impossible value which will force a recalculation
1961 * in the first frame decode */
1962 s
->quality_index
= -1;
1964 s
->y_superblock_width
= (s
->width
+ 31) / 32;
1965 s
->y_superblock_height
= (s
->height
+ 31) / 32;
1966 y_superblock_count
= s
->y_superblock_width
* s
->y_superblock_height
;
1968 /* work out the dimensions for the C planes */
1969 c_width
= s
->width
/ 2;
1970 c_height
= s
->height
/ 2;
1971 s
->c_superblock_width
= (c_width
+ 31) / 32;
1972 s
->c_superblock_height
= (c_height
+ 31) / 32;
1973 c_superblock_count
= s
->c_superblock_width
* s
->c_superblock_height
;
1975 s
->superblock_count
= y_superblock_count
+ (c_superblock_count
* 2);
1976 s
->u_superblock_start
= y_superblock_count
;
1977 s
->v_superblock_start
= s
->u_superblock_start
+ c_superblock_count
;
1978 s
->superblock_coding
= av_malloc(s
->superblock_count
);
1980 s
->macroblock_width
= (s
->width
+ 15) / 16;
1981 s
->macroblock_height
= (s
->height
+ 15) / 16;
1982 s
->macroblock_count
= s
->macroblock_width
* s
->macroblock_height
;
1984 s
->fragment_width
= s
->width
/ FRAGMENT_PIXELS
;
1985 s
->fragment_height
= s
->height
/ FRAGMENT_PIXELS
;
1987 /* fragment count covers all 8x8 blocks for all 3 planes */
1988 s
->fragment_count
= s
->fragment_width
* s
->fragment_height
* 3 / 2;
1989 s
->fragment_start
[1] = s
->fragment_width
* s
->fragment_height
;
1990 s
->fragment_start
[2] = s
->fragment_width
* s
->fragment_height
* 5 / 4;
1992 debug_init(" Y plane: %d x %d\n", s
->width
, s
->height
);
1993 debug_init(" C plane: %d x %d\n", c_width
, c_height
);
1994 debug_init(" Y superblocks: %d x %d, %d total\n",
1995 s
->y_superblock_width
, s
->y_superblock_height
, y_superblock_count
);
1996 debug_init(" C superblocks: %d x %d, %d total\n",
1997 s
->c_superblock_width
, s
->c_superblock_height
, c_superblock_count
);
1998 debug_init(" total superblocks = %d, U starts @ %d, V starts @ %d\n",
1999 s
->superblock_count
, s
->u_superblock_start
, s
->v_superblock_start
);
2000 debug_init(" macroblocks: %d x %d, %d total\n",
2001 s
->macroblock_width
, s
->macroblock_height
, s
->macroblock_count
);
2002 debug_init(" %d fragments, %d x %d, u starts @ %d, v starts @ %d\n",
2006 s
->fragment_start
[1],
2007 s
->fragment_start
[2]);
2009 s
->all_fragments
= av_malloc(s
->fragment_count
* sizeof(Vp3Fragment
));
2010 s
->coeffs
= av_malloc(s
->fragment_count
* sizeof(Coeff
) * 65);
2011 s
->coded_fragment_list
= av_malloc(s
->fragment_count
* sizeof(int));
2012 s
->pixel_addresses_inited
= 0;
2014 if (!s
->theora_tables
)
2016 for (i
= 0; i
< 64; i
++) {
2017 s
->coded_dc_scale_factor
[i
] = vp31_dc_scale_factor
[i
];
2018 s
->coded_ac_scale_factor
[i
] = vp31_ac_scale_factor
[i
];
2019 s
->base_matrix
[0][i
] = vp31_intra_y_dequant
[i
];
2020 s
->base_matrix
[1][i
] = vp31_intra_c_dequant
[i
];
2021 s
->base_matrix
[2][i
] = vp31_inter_dequant
[i
];
2022 s
->filter_limit_values
[i
] = vp31_filter_limit_values
[i
];
2025 for(inter
=0; inter
<2; inter
++){
2026 for(plane
=0; plane
<3; plane
++){
2027 s
->qr_count
[inter
][plane
]= 1;
2028 s
->qr_size
[inter
][plane
][0]= 63;
2029 s
->qr_base
[inter
][plane
][0]=
2030 s
->qr_base
[inter
][plane
][1]= 2*inter
+ (!!plane
)*!inter
;
2034 /* init VLC tables */
2035 for (i
= 0; i
< 16; i
++) {
2038 init_vlc(&s
->dc_vlc
[i
], 5, 32,
2039 &dc_bias
[i
][0][1], 4, 2,
2040 &dc_bias
[i
][0][0], 4, 2, 0);
2042 /* group 1 AC histograms */
2043 init_vlc(&s
->ac_vlc_1
[i
], 5, 32,
2044 &ac_bias_0
[i
][0][1], 4, 2,
2045 &ac_bias_0
[i
][0][0], 4, 2, 0);
2047 /* group 2 AC histograms */
2048 init_vlc(&s
->ac_vlc_2
[i
], 5, 32,
2049 &ac_bias_1
[i
][0][1], 4, 2,
2050 &ac_bias_1
[i
][0][0], 4, 2, 0);
2052 /* group 3 AC histograms */
2053 init_vlc(&s
->ac_vlc_3
[i
], 5, 32,
2054 &ac_bias_2
[i
][0][1], 4, 2,
2055 &ac_bias_2
[i
][0][0], 4, 2, 0);
2057 /* group 4 AC histograms */
2058 init_vlc(&s
->ac_vlc_4
[i
], 5, 32,
2059 &ac_bias_3
[i
][0][1], 4, 2,
2060 &ac_bias_3
[i
][0][0], 4, 2, 0);
2063 for (i
= 0; i
< 16; i
++) {
2066 init_vlc(&s
->dc_vlc
[i
], 5, 32,
2067 &s
->huffman_table
[i
][0][1], 4, 2,
2068 &s
->huffman_table
[i
][0][0], 4, 2, 0);
2070 /* group 1 AC histograms */
2071 init_vlc(&s
->ac_vlc_1
[i
], 5, 32,
2072 &s
->huffman_table
[i
+16][0][1], 4, 2,
2073 &s
->huffman_table
[i
+16][0][0], 4, 2, 0);
2075 /* group 2 AC histograms */
2076 init_vlc(&s
->ac_vlc_2
[i
], 5, 32,
2077 &s
->huffman_table
[i
+16*2][0][1], 4, 2,
2078 &s
->huffman_table
[i
+16*2][0][0], 4, 2, 0);
2080 /* group 3 AC histograms */
2081 init_vlc(&s
->ac_vlc_3
[i
], 5, 32,
2082 &s
->huffman_table
[i
+16*3][0][1], 4, 2,
2083 &s
->huffman_table
[i
+16*3][0][0], 4, 2, 0);
2085 /* group 4 AC histograms */
2086 init_vlc(&s
->ac_vlc_4
[i
], 5, 32,
2087 &s
->huffman_table
[i
+16*4][0][1], 4, 2,
2088 &s
->huffman_table
[i
+16*4][0][0], 4, 2, 0);
2092 init_vlc(&s
->superblock_run_length_vlc
, 6, 34,
2093 &superblock_run_length_vlc_table
[0][1], 4, 2,
2094 &superblock_run_length_vlc_table
[0][0], 4, 2, 0);
2096 init_vlc(&s
->fragment_run_length_vlc
, 5, 30,
2097 &fragment_run_length_vlc_table
[0][1], 4, 2,
2098 &fragment_run_length_vlc_table
[0][0], 4, 2, 0);
2100 init_vlc(&s
->mode_code_vlc
, 3, 8,
2101 &mode_code_vlc_table
[0][1], 2, 1,
2102 &mode_code_vlc_table
[0][0], 2, 1, 0);
2104 init_vlc(&s
->motion_vector_vlc
, 6, 63,
2105 &motion_vector_vlc_table
[0][1], 2, 1,
2106 &motion_vector_vlc_table
[0][0], 2, 1, 0);
2108 /* work out the block mapping tables */
2109 s
->superblock_fragments
= av_malloc(s
->superblock_count
* 16 * sizeof(int));
2110 s
->superblock_macroblocks
= av_malloc(s
->superblock_count
* 4 * sizeof(int));
2111 s
->macroblock_fragments
= av_malloc(s
->macroblock_count
* 6 * sizeof(int));
2112 s
->macroblock_coding
= av_malloc(s
->macroblock_count
+ 1);
2113 init_block_mapping(s
);
2115 for (i
= 0; i
< 3; i
++) {
2116 s
->current_frame
.data
[i
] = NULL
;
2117 s
->last_frame
.data
[i
] = NULL
;
2118 s
->golden_frame
.data
[i
] = NULL
;
2125 * This is the ffmpeg/libavcodec API frame decode function.
2127 static int vp3_decode_frame(AVCodecContext
*avctx
,
2128 void *data
, int *data_size
,
2129 uint8_t *buf
, int buf_size
)
2131 Vp3DecodeContext
*s
= avctx
->priv_data
;
2133 static int counter
= 0;
2136 init_get_bits(&gb
, buf
, buf_size
* 8);
2138 if (s
->theora
&& get_bits1(&gb
))
2140 av_log(avctx
, AV_LOG_ERROR
, "Header packet passed to frame decoder, skipping\n");
2144 s
->keyframe
= !get_bits1(&gb
);
2147 s
->last_quality_index
= s
->quality_index
;
2151 s
->qis
[s
->nqis
++]= get_bits(&gb
, 6);
2152 } while(s
->theora
>= 0x030200 && s
->nqis
<3 && get_bits1(&gb
));
2154 s
->quality_index
= s
->qis
[0];
2156 if (s
->avctx
->debug
& FF_DEBUG_PICT_INFO
)
2157 av_log(s
->avctx
, AV_LOG_INFO
, " VP3 %sframe #%d: Q index = %d\n",
2158 s
->keyframe
?"key":"", counter
, s
->quality_index
);
2161 if (s
->quality_index
!= s
->last_quality_index
) {
2162 init_dequantizer(s
);
2163 init_loop_filter(s
);
2169 skip_bits(&gb
, 4); /* width code */
2170 skip_bits(&gb
, 4); /* height code */
2173 s
->version
= get_bits(&gb
, 5);
2175 av_log(s
->avctx
, AV_LOG_DEBUG
, "VP version: %d\n", s
->version
);
2178 if (s
->version
|| s
->theora
)
2181 av_log(s
->avctx
, AV_LOG_ERROR
, "Warning, unsupported keyframe coding type?!\n");
2182 skip_bits(&gb
, 2); /* reserved? */
2185 if (s
->last_frame
.data
[0] == s
->golden_frame
.data
[0]) {
2186 if (s
->golden_frame
.data
[0])
2187 avctx
->release_buffer(avctx
, &s
->golden_frame
);
2188 s
->last_frame
= s
->golden_frame
; /* ensure that we catch any access to this released frame */
2190 if (s
->golden_frame
.data
[0])
2191 avctx
->release_buffer(avctx
, &s
->golden_frame
);
2192 if (s
->last_frame
.data
[0])
2193 avctx
->release_buffer(avctx
, &s
->last_frame
);
2196 s
->golden_frame
.reference
= 3;
2197 if(avctx
->get_buffer(avctx
, &s
->golden_frame
) < 0) {
2198 av_log(s
->avctx
, AV_LOG_ERROR
, "vp3: get_buffer() failed\n");
2202 /* golden frame is also the current frame */
2203 s
->current_frame
= s
->golden_frame
;
2205 /* time to figure out pixel addresses? */
2206 if (!s
->pixel_addresses_inited
)
2208 if (!s
->flipped_image
)
2209 vp3_calculate_pixel_addresses(s
);
2211 theora_calculate_pixel_addresses(s
);
2212 s
->pixel_addresses_inited
= 1;
2215 /* allocate a new current frame */
2216 s
->current_frame
.reference
= 3;
2217 if (!s
->pixel_addresses_inited
) {
2218 av_log(s
->avctx
, AV_LOG_ERROR
, "vp3: first frame not a keyframe\n");
2221 if(avctx
->get_buffer(avctx
, &s
->current_frame
) < 0) {
2222 av_log(s
->avctx
, AV_LOG_ERROR
, "vp3: get_buffer() failed\n");
2227 s
->current_frame
.qscale_table
= s
->qscale_table
; //FIXME allocate individual tables per AVFrame
2228 s
->current_frame
.qstride
= 0;
2232 STOP_TIMER("init_frame")}
2237 memcpy(s
->current_frame
.data
[0], s
->golden_frame
.data
[0],
2238 s
->current_frame
.linesize
[0] * s
->height
);
2239 memcpy(s
->current_frame
.data
[1], s
->golden_frame
.data
[1],
2240 s
->current_frame
.linesize
[1] * s
->height
/ 2);
2241 memcpy(s
->current_frame
.data
[2], s
->golden_frame
.data
[2],
2242 s
->current_frame
.linesize
[2] * s
->height
/ 2);
2248 if (unpack_superblocks(s
, &gb
)){
2249 av_log(s
->avctx
, AV_LOG_ERROR
, "error in unpack_superblocks\n");
2252 STOP_TIMER("unpack_superblocks")}
2254 if (unpack_modes(s
, &gb
)){
2255 av_log(s
->avctx
, AV_LOG_ERROR
, "error in unpack_modes\n");
2258 STOP_TIMER("unpack_modes")}
2260 if (unpack_vectors(s
, &gb
)){
2261 av_log(s
->avctx
, AV_LOG_ERROR
, "error in unpack_vectors\n");
2264 STOP_TIMER("unpack_vectors")}
2266 if (unpack_dct_coeffs(s
, &gb
)){
2267 av_log(s
->avctx
, AV_LOG_ERROR
, "error in unpack_dct_coeffs\n");
2270 STOP_TIMER("unpack_dct_coeffs")}
2273 reverse_dc_prediction(s
, 0, s
->fragment_width
, s
->fragment_height
);
2274 if ((avctx
->flags
& CODEC_FLAG_GRAY
) == 0) {
2275 reverse_dc_prediction(s
, s
->fragment_start
[1],
2276 s
->fragment_width
/ 2, s
->fragment_height
/ 2);
2277 reverse_dc_prediction(s
, s
->fragment_start
[2],
2278 s
->fragment_width
/ 2, s
->fragment_height
/ 2);
2280 STOP_TIMER("reverse_dc_prediction")}
2283 for (i
= 0; i
< s
->macroblock_height
; i
++)
2285 STOP_TIMER("render_fragments")}
2288 apply_loop_filter(s
);
2289 STOP_TIMER("apply_loop_filter")}
2294 *data_size
=sizeof(AVFrame
);
2295 *(AVFrame
*)data
= s
->current_frame
;
2297 /* release the last frame, if it is allocated and if it is not the
2299 if ((s
->last_frame
.data
[0]) &&
2300 (s
->last_frame
.data
[0] != s
->golden_frame
.data
[0]))
2301 avctx
->release_buffer(avctx
, &s
->last_frame
);
2303 /* shuffle frames (last = current) */
2304 s
->last_frame
= s
->current_frame
;
2305 s
->current_frame
.data
[0]= NULL
; /* ensure that we catch any access to this released frame */
2311 * This is the ffmpeg/libavcodec API module cleanup function.
2313 static int vp3_decode_end(AVCodecContext
*avctx
)
2315 Vp3DecodeContext
*s
= avctx
->priv_data
;
2317 av_free(s
->all_fragments
);
2319 av_free(s
->coded_fragment_list
);
2320 av_free(s
->superblock_fragments
);
2321 av_free(s
->superblock_macroblocks
);
2322 av_free(s
->macroblock_fragments
);
2323 av_free(s
->macroblock_coding
);
2325 /* release all frames */
2326 if (s
->golden_frame
.data
[0] && s
->golden_frame
.data
[0] != s
->last_frame
.data
[0])
2327 avctx
->release_buffer(avctx
, &s
->golden_frame
);
2328 if (s
->last_frame
.data
[0])
2329 avctx
->release_buffer(avctx
, &s
->last_frame
);
2330 /* no need to release the current_frame since it will always be pointing
2331 * to the same frame as either the golden or last frame */
2336 static int read_huffman_tree(AVCodecContext
*avctx
, GetBitContext
*gb
)
2338 Vp3DecodeContext
*s
= avctx
->priv_data
;
2340 if (get_bits1(gb
)) {
2342 if (s
->entries
>= 32) { /* overflow */
2343 av_log(avctx
, AV_LOG_ERROR
, "huffman tree overflow\n");
2346 token
= get_bits(gb
, 5);
2347 //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);
2348 s
->huffman_table
[s
->hti
][token
][0] = s
->hbits
;
2349 s
->huffman_table
[s
->hti
][token
][1] = s
->huff_code_size
;
2353 if (s
->huff_code_size
>= 32) {/* overflow */
2354 av_log(avctx
, AV_LOG_ERROR
, "huffman tree overflow\n");
2357 s
->huff_code_size
++;
2359 read_huffman_tree(avctx
, gb
);
2361 read_huffman_tree(avctx
, gb
);
2363 s
->huff_code_size
--;
2368 #ifdef CONFIG_THEORA_DECODER
2369 static int theora_decode_header(AVCodecContext
*avctx
, GetBitContext
*gb
)
2371 Vp3DecodeContext
*s
= avctx
->priv_data
;
2372 int visible_width
, visible_height
;
2374 s
->theora
= get_bits_long(gb
, 24);
2375 av_log(avctx
, AV_LOG_VERBOSE
, "Theora bitstream version %X\n", s
->theora
);
2377 /* 3.2.0 aka alpha3 has the same frame orientation as original vp3 */
2378 /* but previous versions have the image flipped relative to vp3 */
2379 if (s
->theora
< 0x030200)
2381 s
->flipped_image
= 1;
2382 av_log(avctx
, AV_LOG_DEBUG
, "Old (<alpha3) Theora bitstream, flipped image\n");
2385 s
->width
= get_bits(gb
, 16) << 4;
2386 s
->height
= get_bits(gb
, 16) << 4;
2388 if(avcodec_check_dimensions(avctx
, s
->width
, s
->height
)){
2389 av_log(avctx
, AV_LOG_ERROR
, "Invalid dimensions (%dx%d)\n", s
->width
, s
->height
);
2390 s
->width
= s
->height
= 0;
2394 if (s
->theora
>= 0x030400)
2396 skip_bits(gb
, 32); /* total number of superblocks in a frame */
2397 // fixme, the next field is 36bits long
2398 skip_bits(gb
, 32); /* total number of blocks in a frame */
2399 skip_bits(gb
, 4); /* total number of blocks in a frame */
2400 skip_bits(gb
, 32); /* total number of macroblocks in a frame */
2403 visible_width
= get_bits_long(gb
, 24);
2404 visible_height
= get_bits_long(gb
, 24);
2406 if (s
->theora
>= 0x030200) {
2407 skip_bits(gb
, 8); /* offset x */
2408 skip_bits(gb
, 8); /* offset y */
2411 skip_bits(gb
, 32); /* fps numerator */
2412 skip_bits(gb
, 32); /* fps denumerator */
2413 skip_bits(gb
, 24); /* aspect numerator */
2414 skip_bits(gb
, 24); /* aspect denumerator */
2416 if (s
->theora
< 0x030200)
2417 skip_bits(gb
, 5); /* keyframe frequency force */
2418 skip_bits(gb
, 8); /* colorspace */
2419 if (s
->theora
>= 0x030400)
2420 skip_bits(gb
, 2); /* pixel format: 420,res,422,444 */
2421 skip_bits(gb
, 24); /* bitrate */
2423 skip_bits(gb
, 6); /* quality hint */
2425 if (s
->theora
>= 0x030200)
2427 skip_bits(gb
, 5); /* keyframe frequency force */
2429 if (s
->theora
< 0x030400)
2430 skip_bits(gb
, 5); /* spare bits */
2433 // align_get_bits(gb);
2435 if ( visible_width
<= s
->width
&& visible_width
> s
->width
-16
2436 && visible_height
<= s
->height
&& visible_height
> s
->height
-16)
2437 avcodec_set_dimensions(avctx
, visible_width
, visible_height
);
2439 avcodec_set_dimensions(avctx
, s
->width
, s
->height
);
2444 static int theora_decode_tables(AVCodecContext
*avctx
, GetBitContext
*gb
)
2446 Vp3DecodeContext
*s
= avctx
->priv_data
;
2447 int i
, n
, matrices
, inter
, plane
;
2449 if (s
->theora
>= 0x030200) {
2450 n
= get_bits(gb
, 3);
2451 /* loop filter limit values table */
2452 for (i
= 0; i
< 64; i
++)
2453 s
->filter_limit_values
[i
] = get_bits(gb
, n
);
2456 if (s
->theora
>= 0x030200)
2457 n
= get_bits(gb
, 4) + 1;
2460 /* quality threshold table */
2461 for (i
= 0; i
< 64; i
++)
2462 s
->coded_ac_scale_factor
[i
] = get_bits(gb
, n
);
2464 if (s
->theora
>= 0x030200)
2465 n
= get_bits(gb
, 4) + 1;
2468 /* dc scale factor table */
2469 for (i
= 0; i
< 64; i
++)
2470 s
->coded_dc_scale_factor
[i
] = get_bits(gb
, n
);
2472 if (s
->theora
>= 0x030200)
2473 matrices
= get_bits(gb
, 9) + 1;
2478 av_log(avctx
, AV_LOG_ERROR
, "invalid number of base matrixes\n");
2482 for(n
=0; n
<matrices
; n
++){
2483 for (i
= 0; i
< 64; i
++)
2484 s
->base_matrix
[n
][i
]= get_bits(gb
, 8);
2487 for (inter
= 0; inter
<= 1; inter
++) {
2488 for (plane
= 0; plane
<= 2; plane
++) {
2490 if (inter
|| plane
> 0)
2491 newqr
= get_bits1(gb
);
2494 if(inter
&& get_bits1(gb
)){
2498 qtj
= (3*inter
+ plane
- 1) / 3;
2499 plj
= (plane
+ 2) % 3;
2501 s
->qr_count
[inter
][plane
]= s
->qr_count
[qtj
][plj
];
2502 memcpy(s
->qr_size
[inter
][plane
], s
->qr_size
[qtj
][plj
], sizeof(s
->qr_size
[0][0]));
2503 memcpy(s
->qr_base
[inter
][plane
], s
->qr_base
[qtj
][plj
], sizeof(s
->qr_base
[0][0]));
2509 i
= get_bits(gb
, av_log2(matrices
-1)+1);
2511 av_log(avctx
, AV_LOG_ERROR
, "invalid base matrix index\n");
2514 s
->qr_base
[inter
][plane
][qri
]= i
;
2517 i
= get_bits(gb
, av_log2(63-qi
)+1) + 1;
2518 s
->qr_size
[inter
][plane
][qri
++]= i
;
2523 av_log(avctx
, AV_LOG_ERROR
, "invalid qi %d > 63\n", qi
);
2526 s
->qr_count
[inter
][plane
]= qri
;
2531 /* Huffman tables */
2532 for (s
->hti
= 0; s
->hti
< 80; s
->hti
++) {
2534 s
->huff_code_size
= 1;
2535 if (!get_bits1(gb
)) {
2537 read_huffman_tree(avctx
, gb
);
2539 read_huffman_tree(avctx
, gb
);
2543 s
->theora_tables
= 1;
2548 static int theora_decode_init(AVCodecContext
*avctx
)
2550 Vp3DecodeContext
*s
= avctx
->priv_data
;
2553 uint8_t *header_start
[3];
2559 if (!avctx
->extradata_size
)
2561 av_log(avctx
, AV_LOG_ERROR
, "Missing extradata!\n");
2565 if (ff_split_xiph_headers(avctx
->extradata
, avctx
->extradata_size
,
2566 42, header_start
, header_len
) < 0) {
2567 av_log(avctx
, AV_LOG_ERROR
, "Corrupt extradata\n");
2572 init_get_bits(&gb
, header_start
[i
], header_len
[i
]);
2574 ptype
= get_bits(&gb
, 8);
2575 debug_vp3("Theora headerpacket type: %x\n", ptype
);
2577 if (!(ptype
& 0x80))
2579 av_log(avctx
, AV_LOG_ERROR
, "Invalid extradata!\n");
2583 // FIXME: Check for this as well.
2584 skip_bits(&gb
, 6*8); /* "theora" */
2589 theora_decode_header(avctx
, &gb
);
2592 // FIXME: is this needed? it breaks sometimes
2593 // theora_decode_comments(avctx, gb);
2596 theora_decode_tables(avctx
, &gb
);
2599 av_log(avctx
, AV_LOG_ERROR
, "Unknown Theora config packet: %d\n", ptype
&~0x80);
2602 if(8*header_len
[i
] != get_bits_count(&gb
))
2603 av_log(avctx
, AV_LOG_ERROR
, "%d bits left in packet %X\n", 8*header_len
[i
] - get_bits_count(&gb
), ptype
);
2604 if (s
->theora
< 0x030200)
2608 vp3_decode_init(avctx
);
2612 AVCodec theora_decoder
= {
2616 sizeof(Vp3DecodeContext
),
2626 AVCodec vp3_decoder
= {
2630 sizeof(Vp3DecodeContext
),