Mercurial > libavcodec.hg
annotate vp3.c @ 9896:bbefbca72722 libavcodec
Drop code that attempts to decode frames that are prefixed by junk.
Too often it ends up decoding random data into noise without detecting
it (for example after seeking of some MP3 data with oddly often occurring
startcode emulation).
Fixes issue1154.
| author | michael |
|---|---|
| date | Tue, 30 Jun 2009 03:57:27 +0000 |
| parents | 87bd4aedc7b1 |
| children | f42402d1778b |
| rev | line source |
|---|---|
| 1224 | 1 /* |
|
1867
7f7aa6ac3723
cut over to using new VP3 DSP functions and remove the old ones; bring
melanson
parents:
1864
diff
changeset
|
2 * Copyright (C) 2003-2004 the ffmpeg project |
| 1224 | 3 * |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3940
diff
changeset
|
4 * This file is part of FFmpeg. |
|
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3940
diff
changeset
|
5 * |
|
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3940
diff
changeset
|
6 * FFmpeg is free software; you can redistribute it and/or |
| 1224 | 7 * modify it under the terms of the GNU Lesser General Public |
| 8 * License as published by the Free Software Foundation; either | |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3940
diff
changeset
|
9 * version 2.1 of the License, or (at your option) any later version. |
| 1224 | 10 * |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3940
diff
changeset
|
11 * FFmpeg is distributed in the hope that it will be useful, |
| 1224 | 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. | |
| 15 * | |
| 16 * You should have received a copy of the GNU Lesser General Public | |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3940
diff
changeset
|
17 * License along with FFmpeg; if not, write to the Free Software |
|
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
2979
diff
changeset
|
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| 1224 | 19 */ |
| 20 | |
| 21 /** | |
|
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
8590
diff
changeset
|
22 * @file libavcodec/vp3.c |
| 1224 | 23 * On2 VP3 Video Decoder |
|
2702
5a4e5225cbb6
use VLCs for in place of get_fragment_run_length(), get_mode_code(), and
melanson
parents:
2699
diff
changeset
|
24 * |
|
5a4e5225cbb6
use VLCs for in place of get_fragment_run_length(), get_mode_code(), and
melanson
parents:
2699
diff
changeset
|
25 * VP3 Video Decoder by Mike Melanson (mike at multimedia.cx) |
|
5a4e5225cbb6
use VLCs for in place of get_fragment_run_length(), get_mode_code(), and
melanson
parents:
2699
diff
changeset
|
26 * For more information about the VP3 coding process, visit: |
|
6747
b9a57d71425d
Add complete multimedia Wiki URL, patch by Sisir Koppaka.
diego
parents:
6710
diff
changeset
|
27 * http://wiki.multimedia.cx/index.php?title=On2_VP3 |
|
2702
5a4e5225cbb6
use VLCs for in place of get_fragment_run_length(), get_mode_code(), and
melanson
parents:
2699
diff
changeset
|
28 * |
|
5a4e5225cbb6
use VLCs for in place of get_fragment_run_length(), get_mode_code(), and
melanson
parents:
2699
diff
changeset
|
29 * Theora decoder by Alex Beregszaszi |
| 1224 | 30 */ |
| 31 | |
| 32 #include <stdio.h> | |
| 33 #include <stdlib.h> | |
| 34 #include <string.h> | |
| 35 #include <unistd.h> | |
| 36 | |
| 37 #include "avcodec.h" | |
| 38 #include "dsputil.h" | |
| 9428 | 39 #include "get_bits.h" |
| 1224 | 40 |
| 41 #include "vp3data.h" | |
|
4723
b62a3a46856c
use generic xiph header spliting func to split theora headers
aurel
parents:
4594
diff
changeset
|
42 #include "xiph.h" |
| 1224 | 43 |
| 44 #define FRAGMENT_PIXELS 8 | |
| 45 | |
|
2714
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
46 typedef struct Coeff { |
|
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
47 struct Coeff *next; |
|
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
48 DCTELEM coeff; |
|
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
49 uint8_t index; |
|
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
50 } Coeff; |
|
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
51 |
|
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
52 //FIXME split things out into their own arrays |
| 1224 | 53 typedef struct Vp3Fragment { |
|
2714
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
54 Coeff *next_coeff; |
| 1224 | 55 /* address of first pixel taking into account which plane the fragment |
| 56 * lives on as well as the plane stride */ | |
| 57 int first_pixel; | |
| 58 /* this is the macroblock that the fragment belongs to */ | |
| 2706 | 59 uint16_t macroblock; |
| 60 uint8_t coding_method; | |
| 61 int8_t motion_x; | |
| 62 int8_t motion_y; | |
| 9731 | 63 uint8_t qpi; |
| 1224 | 64 } Vp3Fragment; |
| 65 | |
| 66 #define SB_NOT_CODED 0 | |
| 67 #define SB_PARTIALLY_CODED 1 | |
| 68 #define SB_FULLY_CODED 2 | |
| 69 | |
| 70 #define MODE_INTER_NO_MV 0 | |
| 71 #define MODE_INTRA 1 | |
| 72 #define MODE_INTER_PLUS_MV 2 | |
| 73 #define MODE_INTER_LAST_MV 3 | |
| 74 #define MODE_INTER_PRIOR_LAST 4 | |
| 75 #define MODE_USING_GOLDEN 5 | |
| 76 #define MODE_GOLDEN_MV 6 | |
| 77 #define MODE_INTER_FOURMV 7 | |
| 78 #define CODING_MODE_COUNT 8 | |
| 79 | |
| 80 /* special internal mode */ | |
| 81 #define MODE_COPY 8 | |
| 82 | |
| 83 /* There are 6 preset schemes, plus a free-form scheme */ | |
|
7139
03fe3194eff7
make ModeAlphabet read-only and use a custom mode alphabet
stefang
parents:
7040
diff
changeset
|
84 static const int ModeAlphabet[6][CODING_MODE_COUNT] = |
| 1224 | 85 { |
| 86 /* scheme 1: Last motion vector dominates */ | |
| 2967 | 87 { MODE_INTER_LAST_MV, MODE_INTER_PRIOR_LAST, |
| 1224 | 88 MODE_INTER_PLUS_MV, MODE_INTER_NO_MV, |
| 2967 | 89 MODE_INTRA, MODE_USING_GOLDEN, |
| 1224 | 90 MODE_GOLDEN_MV, MODE_INTER_FOURMV }, |
| 91 | |
| 92 /* scheme 2 */ | |
| 2967 | 93 { MODE_INTER_LAST_MV, MODE_INTER_PRIOR_LAST, |
| 1224 | 94 MODE_INTER_NO_MV, MODE_INTER_PLUS_MV, |
| 2967 | 95 MODE_INTRA, MODE_USING_GOLDEN, |
| 1224 | 96 MODE_GOLDEN_MV, MODE_INTER_FOURMV }, |
| 97 | |
| 98 /* scheme 3 */ | |
| 2967 | 99 { MODE_INTER_LAST_MV, MODE_INTER_PLUS_MV, |
| 1224 | 100 MODE_INTER_PRIOR_LAST, MODE_INTER_NO_MV, |
| 2967 | 101 MODE_INTRA, MODE_USING_GOLDEN, |
| 1224 | 102 MODE_GOLDEN_MV, MODE_INTER_FOURMV }, |
| 103 | |
| 104 /* scheme 4 */ | |
| 2967 | 105 { MODE_INTER_LAST_MV, MODE_INTER_PLUS_MV, |
| 1224 | 106 MODE_INTER_NO_MV, MODE_INTER_PRIOR_LAST, |
| 2967 | 107 MODE_INTRA, MODE_USING_GOLDEN, |
| 1224 | 108 MODE_GOLDEN_MV, MODE_INTER_FOURMV }, |
| 109 | |
| 110 /* scheme 5: No motion vector dominates */ | |
| 2967 | 111 { MODE_INTER_NO_MV, MODE_INTER_LAST_MV, |
| 1224 | 112 MODE_INTER_PRIOR_LAST, MODE_INTER_PLUS_MV, |
| 2967 | 113 MODE_INTRA, MODE_USING_GOLDEN, |
| 1224 | 114 MODE_GOLDEN_MV, MODE_INTER_FOURMV }, |
| 115 | |
| 116 /* scheme 6 */ | |
| 2967 | 117 { MODE_INTER_NO_MV, MODE_USING_GOLDEN, |
| 1224 | 118 MODE_INTER_LAST_MV, MODE_INTER_PRIOR_LAST, |
| 2967 | 119 MODE_INTER_PLUS_MV, MODE_INTRA, |
| 1224 | 120 MODE_GOLDEN_MV, MODE_INTER_FOURMV }, |
| 121 | |
| 122 }; | |
| 123 | |
| 124 #define MIN_DEQUANT_VAL 2 | |
| 125 | |
| 126 typedef struct Vp3DecodeContext { | |
| 127 AVCodecContext *avctx; | |
|
1516
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
128 int theora, theora_tables; |
| 1664 | 129 int version; |
| 1224 | 130 int width, height; |
| 131 AVFrame golden_frame; | |
| 132 AVFrame last_frame; | |
| 133 AVFrame current_frame; | |
| 134 int keyframe; | |
| 135 DSPContext dsp; | |
|
1626
f74ae637ffa9
finally working with old theora bitstream (flipped image), the only sample I have is decoded successfully (theora.ogg)
alex
parents:
1598
diff
changeset
|
136 int flipped_image; |
| 1224 | 137 |
| 9731 | 138 int qps[3]; |
| 139 int nqps; | |
| 140 int last_qps[3]; | |
| 1224 | 141 |
| 142 int superblock_count; | |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
143 int y_superblock_width; |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
144 int y_superblock_height; |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
145 int c_superblock_width; |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
146 int c_superblock_height; |
| 1224 | 147 int u_superblock_start; |
| 148 int v_superblock_start; | |
| 149 unsigned char *superblock_coding; | |
| 150 | |
| 151 int macroblock_count; | |
| 152 int macroblock_width; | |
| 153 int macroblock_height; | |
| 154 | |
| 155 int fragment_count; | |
| 156 int fragment_width; | |
| 157 int fragment_height; | |
| 158 | |
| 159 Vp3Fragment *all_fragments; | |
|
7037
480faa9f79dd
Almost-cosmetics: split out coeff_count from all_fragments struct into
reimar
parents:
6903
diff
changeset
|
160 uint8_t *coeff_counts; |
|
2714
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
161 Coeff *coeffs; |
|
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
162 Coeff *next_coeff; |
| 3498 | 163 int fragment_start[3]; |
| 2967 | 164 |
| 2694 | 165 ScanTable scantable; |
| 2967 | 166 |
|
1516
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
167 /* tables */ |
|
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
168 uint16_t coded_dc_scale_factor[64]; |
|
1867
7f7aa6ac3723
cut over to using new VP3 DSP functions and remove the old ones; bring
melanson
parents:
1864
diff
changeset
|
169 uint32_t coded_ac_scale_factor[64]; |
|
3489
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
170 uint8_t base_matrix[384][64]; |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
171 uint8_t qr_count[2][3]; |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
172 uint8_t qr_size [2][3][64]; |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
173 uint16_t qr_base[2][3][64]; |
| 1224 | 174 |
| 6903 | 175 /* this is a list of indexes into the all_fragments array indicating |
| 1224 | 176 * which of the fragments are coded */ |
| 177 int *coded_fragment_list; | |
| 178 int coded_fragment_list_index; | |
| 6350 | 179 int pixel_addresses_initialized; |
| 1224 | 180 |
| 181 VLC dc_vlc[16]; | |
| 182 VLC ac_vlc_1[16]; | |
| 183 VLC ac_vlc_2[16]; | |
| 184 VLC ac_vlc_3[16]; | |
| 185 VLC ac_vlc_4[16]; | |
| 186 | |
|
2702
5a4e5225cbb6
use VLCs for in place of get_fragment_run_length(), get_mode_code(), and
melanson
parents:
2699
diff
changeset
|
187 VLC superblock_run_length_vlc; |
|
5a4e5225cbb6
use VLCs for in place of get_fragment_run_length(), get_mode_code(), and
melanson
parents:
2699
diff
changeset
|
188 VLC fragment_run_length_vlc; |
|
5a4e5225cbb6
use VLCs for in place of get_fragment_run_length(), get_mode_code(), and
melanson
parents:
2699
diff
changeset
|
189 VLC mode_code_vlc; |
|
5a4e5225cbb6
use VLCs for in place of get_fragment_run_length(), get_mode_code(), and
melanson
parents:
2699
diff
changeset
|
190 VLC motion_vector_vlc; |
|
5a4e5225cbb6
use VLCs for in place of get_fragment_run_length(), get_mode_code(), and
melanson
parents:
2699
diff
changeset
|
191 |
| 1972 | 192 /* these arrays need to be on 16-byte boundaries since SSE2 operations |
| 193 * index into them */ | |
| 9731 | 194 DECLARE_ALIGNED_16(int16_t, qmat[3][2][3][64]); //<qmat[qpi][is_inter][plane] |
| 1224 | 195 |
| 196 /* This table contains superblock_count * 16 entries. Each set of 16 | |
| 6903 | 197 * numbers corresponds to the fragment indexes 0..15 of the superblock. |
| 1224 | 198 * An entry will be -1 to indicate that no entry corresponds to that |
| 199 * index. */ | |
| 200 int *superblock_fragments; | |
| 201 | |
| 202 /* This table contains superblock_count * 4 entries. Each set of 4 | |
| 6903 | 203 * numbers corresponds to the macroblock indexes 0..3 of the superblock. |
| 1224 | 204 * An entry will be -1 to indicate that no entry corresponds to that |
| 205 * index. */ | |
| 206 int *superblock_macroblocks; | |
| 207 | |
| 208 /* This table contains macroblock_count * 6 entries. Each set of 6 | |
| 6903 | 209 * numbers corresponds to the fragment indexes 0..5 which comprise |
| 1224 | 210 * the macroblock (4 Y fragments and 2 C fragments). */ |
| 211 int *macroblock_fragments; | |
| 2967 | 212 /* This is an array that indicates how a particular macroblock |
|
1244
a02df1ba6c7f
fix image buffer leak on keyframes, add more error condition checks
tmmm
parents:
1240
diff
changeset
|
213 * is coded. */ |
|
1240
c95ff60bc1a1
fix motion vector decoding bug and reinstate interframes
tmmm
parents:
1239
diff
changeset
|
214 unsigned char *macroblock_coding; |
| 1224 | 215 |
|
1236
d6e4784ffc16
dump the shady binary search logic (the part that binary searches
tmmm
parents:
1233
diff
changeset
|
216 int first_coded_y_fragment; |
|
d6e4784ffc16
dump the shady binary search logic (the part that binary searches
tmmm
parents:
1233
diff
changeset
|
217 int first_coded_c_fragment; |
|
d6e4784ffc16
dump the shady binary search logic (the part that binary searches
tmmm
parents:
1233
diff
changeset
|
218 int last_coded_y_fragment; |
|
d6e4784ffc16
dump the shady binary search logic (the part that binary searches
tmmm
parents:
1233
diff
changeset
|
219 int last_coded_c_fragment; |
|
d6e4784ffc16
dump the shady binary search logic (the part that binary searches
tmmm
parents:
1233
diff
changeset
|
220 |
| 1406 | 221 uint8_t edge_emu_buffer[9*2048]; //FIXME dynamic alloc |
| 3776 | 222 int8_t qscale_table[2048]; //FIXME dynamic alloc (width+15)/16 |
|
2718
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
223 |
|
2723
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
224 /* Huffman decode */ |
|
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
225 int hti; |
|
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
226 unsigned int hbits; |
|
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
227 int entries; |
|
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
228 int huff_code_size; |
|
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
229 uint16_t huffman_table[80][32][2]; |
|
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
230 |
|
7966
14a49e087126
filter_limit_values only needs 7 bits, make its tables smaller
conrad
parents:
7961
diff
changeset
|
231 uint8_t filter_limit_values[64]; |
| 8032 | 232 DECLARE_ALIGNED_8(int, bounding_values_array[256+2]); |
| 1224 | 233 } Vp3DecodeContext; |
| 234 | |
| 235 /************************************************************************ | |
| 236 * VP3 specific functions | |
| 237 ************************************************************************/ | |
| 238 | |
| 239 /* | |
| 240 * This function sets up all of the various blocks mappings: | |
| 241 * superblocks <-> fragments, macroblocks <-> fragments, | |
| 242 * superblocks <-> macroblocks | |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
243 * |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
244 * Returns 0 is successful; returns 1 if *anything* went wrong. |
| 1224 | 245 */ |
| 2967 | 246 static int init_block_mapping(Vp3DecodeContext *s) |
| 1224 | 247 { |
| 248 int i, j; | |
| 249 signed int hilbert_walk_mb[4]; | |
| 250 | |
| 251 int current_fragment = 0; | |
| 252 int current_width = 0; | |
| 253 int current_height = 0; | |
| 254 int right_edge = 0; | |
| 255 int bottom_edge = 0; | |
| 256 int superblock_row_inc = 0; | |
| 257 int mapping_index = 0; | |
| 258 | |
| 259 int current_macroblock; | |
| 260 int c_fragment; | |
| 261 | |
| 262 signed char travel_width[16] = { | |
| 2967 | 263 1, 1, 0, -1, |
| 1224 | 264 0, 0, 1, 0, |
| 265 1, 0, 1, 0, | |
| 266 0, -1, 0, 1 | |
| 267 }; | |
| 268 | |
| 269 signed char travel_height[16] = { | |
| 270 0, 0, 1, 0, | |
| 271 1, 1, 0, -1, | |
| 272 0, 1, 0, -1, | |
| 273 -1, 0, -1, 0 | |
| 274 }; | |
| 275 | |
| 276 signed char travel_width_mb[4] = { | |
| 277 1, 0, 1, 0 | |
| 278 }; | |
| 279 | |
| 280 signed char travel_height_mb[4] = { | |
| 281 0, 1, 0, -1 | |
| 282 }; | |
| 283 | |
| 284 hilbert_walk_mb[0] = 1; | |
| 285 hilbert_walk_mb[1] = s->macroblock_width; | |
| 286 hilbert_walk_mb[2] = 1; | |
| 287 hilbert_walk_mb[3] = -s->macroblock_width; | |
| 288 | |
| 289 /* iterate through each superblock (all planes) and map the fragments */ | |
| 290 for (i = 0; i < s->superblock_count; i++) { | |
| 291 /* time to re-assign the limits? */ | |
| 292 if (i == 0) { | |
| 293 | |
| 294 /* start of Y superblocks */ | |
| 295 right_edge = s->fragment_width; | |
| 296 bottom_edge = s->fragment_height; | |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
297 current_width = -1; |
| 1224 | 298 current_height = 0; |
| 2967 | 299 superblock_row_inc = 3 * s->fragment_width - |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
300 (s->y_superblock_width * 4 - s->fragment_width); |
| 1224 | 301 |
| 302 /* the first operation for this variable is to advance by 1 */ | |
| 303 current_fragment = -1; | |
| 304 | |
| 305 } else if (i == s->u_superblock_start) { | |
| 306 | |
| 307 /* start of U superblocks */ | |
| 308 right_edge = s->fragment_width / 2; | |
| 309 bottom_edge = s->fragment_height / 2; | |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
310 current_width = -1; |
| 1224 | 311 current_height = 0; |
| 2967 | 312 superblock_row_inc = 3 * (s->fragment_width / 2) - |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
313 (s->c_superblock_width * 4 - s->fragment_width / 2); |
| 1224 | 314 |
| 315 /* the first operation for this variable is to advance by 1 */ | |
| 3498 | 316 current_fragment = s->fragment_start[1] - 1; |
| 1224 | 317 |
| 318 } else if (i == s->v_superblock_start) { | |
| 319 | |
| 320 /* start of V superblocks */ | |
| 321 right_edge = s->fragment_width / 2; | |
| 322 bottom_edge = s->fragment_height / 2; | |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
323 current_width = -1; |
| 1224 | 324 current_height = 0; |
| 2967 | 325 superblock_row_inc = 3 * (s->fragment_width / 2) - |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
326 (s->c_superblock_width * 4 - s->fragment_width / 2); |
| 1224 | 327 |
| 328 /* the first operation for this variable is to advance by 1 */ | |
| 3498 | 329 current_fragment = s->fragment_start[2] - 1; |
| 1224 | 330 |
| 331 } | |
| 332 | |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
333 if (current_width >= right_edge - 1) { |
| 1224 | 334 /* reset width and move to next superblock row */ |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
335 current_width = -1; |
| 1224 | 336 current_height += 4; |
| 337 | |
| 338 /* fragment is now at the start of a new superblock row */ | |
| 339 current_fragment += superblock_row_inc; | |
| 340 } | |
| 341 | |
| 342 /* iterate through all 16 fragments in a superblock */ | |
| 343 for (j = 0; j < 16; j++) { | |
| 3502 | 344 current_fragment += travel_width[j] + right_edge * travel_height[j]; |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
345 current_width += travel_width[j]; |
| 1224 | 346 current_height += travel_height[j]; |
| 347 | |
| 348 /* check if the fragment is in bounds */ | |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
349 if ((current_width < right_edge) && |
| 1224 | 350 (current_height < bottom_edge)) { |
| 351 s->superblock_fragments[mapping_index] = current_fragment; | |
| 352 } else { | |
| 353 s->superblock_fragments[mapping_index] = -1; | |
| 354 } | |
| 355 | |
| 356 mapping_index++; | |
| 357 } | |
| 358 } | |
| 359 | |
| 360 /* initialize the superblock <-> macroblock mapping; iterate through | |
| 361 * all of the Y plane superblocks to build this mapping */ | |
| 362 right_edge = s->macroblock_width; | |
| 363 bottom_edge = s->macroblock_height; | |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
364 current_width = -1; |
| 1224 | 365 current_height = 0; |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
366 superblock_row_inc = s->macroblock_width - |
| 6377 | 367 (s->y_superblock_width * 2 - s->macroblock_width); |
| 1224 | 368 mapping_index = 0; |
| 369 current_macroblock = -1; | |
| 370 for (i = 0; i < s->u_superblock_start; i++) { | |
| 371 | |
|
1240
c95ff60bc1a1
fix motion vector decoding bug and reinstate interframes
tmmm
parents:
1239
diff
changeset
|
372 if (current_width >= right_edge - 1) { |
| 1224 | 373 /* reset width and move to next superblock row */ |
|
1240
c95ff60bc1a1
fix motion vector decoding bug and reinstate interframes
tmmm
parents:
1239
diff
changeset
|
374 current_width = -1; |
| 1224 | 375 current_height += 2; |
| 376 | |
| 377 /* macroblock is now at the start of a new superblock row */ | |
| 378 current_macroblock += superblock_row_inc; | |
| 379 } | |
| 380 | |
| 381 /* iterate through each potential macroblock in the superblock */ | |
| 382 for (j = 0; j < 4; j++) { | |
| 383 current_macroblock += hilbert_walk_mb[j]; | |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
384 current_width += travel_width_mb[j]; |
| 1224 | 385 current_height += travel_height_mb[j]; |
| 386 | |
| 387 /* check if the macroblock is in bounds */ | |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
388 if ((current_width < right_edge) && |
| 1224 | 389 (current_height < bottom_edge)) { |
| 390 s->superblock_macroblocks[mapping_index] = current_macroblock; | |
| 391 } else { | |
| 392 s->superblock_macroblocks[mapping_index] = -1; | |
| 393 } | |
| 394 | |
| 395 mapping_index++; | |
| 396 } | |
| 397 } | |
| 398 | |
| 399 /* initialize the macroblock <-> fragment mapping */ | |
| 400 current_fragment = 0; | |
| 401 current_macroblock = 0; | |
| 402 mapping_index = 0; | |
| 403 for (i = 0; i < s->fragment_height; i += 2) { | |
| 404 | |
| 405 for (j = 0; j < s->fragment_width; j += 2) { | |
| 406 | |
| 407 s->all_fragments[current_fragment].macroblock = current_macroblock; | |
| 408 s->macroblock_fragments[mapping_index++] = current_fragment; | |
| 409 | |
| 410 if (j + 1 < s->fragment_width) { | |
| 411 s->all_fragments[current_fragment + 1].macroblock = current_macroblock; | |
| 412 s->macroblock_fragments[mapping_index++] = current_fragment + 1; | |
| 413 } else | |
| 414 s->macroblock_fragments[mapping_index++] = -1; | |
| 415 | |
| 416 if (i + 1 < s->fragment_height) { | |
| 2967 | 417 s->all_fragments[current_fragment + s->fragment_width].macroblock = |
| 1224 | 418 current_macroblock; |
| 2967 | 419 s->macroblock_fragments[mapping_index++] = |
| 1224 | 420 current_fragment + s->fragment_width; |
| 421 } else | |
| 422 s->macroblock_fragments[mapping_index++] = -1; | |
| 423 | |
| 424 if ((j + 1 < s->fragment_width) && (i + 1 < s->fragment_height)) { | |
| 2967 | 425 s->all_fragments[current_fragment + s->fragment_width + 1].macroblock = |
| 1224 | 426 current_macroblock; |
| 2967 | 427 s->macroblock_fragments[mapping_index++] = |
| 1224 | 428 current_fragment + s->fragment_width + 1; |
| 429 } else | |
| 430 s->macroblock_fragments[mapping_index++] = -1; | |
| 431 | |
| 432 /* C planes */ | |
| 3498 | 433 c_fragment = s->fragment_start[1] + |
| 1224 | 434 (i * s->fragment_width / 4) + (j / 2); |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
435 s->all_fragments[c_fragment].macroblock = s->macroblock_count; |
| 1224 | 436 s->macroblock_fragments[mapping_index++] = c_fragment; |
| 437 | |
| 3498 | 438 c_fragment = s->fragment_start[2] + |
| 1224 | 439 (i * s->fragment_width / 4) + (j / 2); |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
440 s->all_fragments[c_fragment].macroblock = s->macroblock_count; |
| 1224 | 441 s->macroblock_fragments[mapping_index++] = c_fragment; |
| 442 | |
| 443 if (j + 2 <= s->fragment_width) | |
| 444 current_fragment += 2; | |
| 2967 | 445 else |
| 1224 | 446 current_fragment++; |
| 447 current_macroblock++; | |
| 448 } | |
| 449 | |
| 450 current_fragment += s->fragment_width; | |
| 451 } | |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
452 |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
453 return 0; /* successful path out */ |
| 1224 | 454 } |
| 455 | |
| 456 /* | |
| 457 * This function wipes out all of the fragment data. | |
| 458 */ | |
| 459 static void init_frame(Vp3DecodeContext *s, GetBitContext *gb) | |
| 460 { | |
| 461 int i; | |
| 462 | |
| 463 /* zero out all of the fragment information */ | |
| 464 s->coded_fragment_list_index = 0; | |
| 465 for (i = 0; i < s->fragment_count; i++) { | |
|
7037
480faa9f79dd
Almost-cosmetics: split out coeff_count from all_fragments struct into
reimar
parents:
6903
diff
changeset
|
466 s->coeff_counts[i] = 0; |
| 2721 | 467 s->all_fragments[i].motion_x = 127; |
| 468 s->all_fragments[i].motion_y = 127; | |
| 469 s->all_fragments[i].next_coeff= NULL; | |
| 9731 | 470 s->all_fragments[i].qpi = 0; |
|
2714
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
471 s->coeffs[i].index= |
|
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
472 s->coeffs[i].coeff=0; |
|
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
473 s->coeffs[i].next= NULL; |
| 1224 | 474 } |
| 475 } | |
| 476 | |
| 477 /* | |
|
2723
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
478 * This function sets up the dequantization tables used for a particular |
| 1224 | 479 * frame. |
| 480 */ | |
| 9731 | 481 static void init_dequantizer(Vp3DecodeContext *s, int qpi) |
| 1224 | 482 { |
| 9731 | 483 int ac_scale_factor = s->coded_ac_scale_factor[s->qps[qpi]]; |
| 484 int dc_scale_factor = s->coded_dc_scale_factor[s->qps[qpi]]; | |
|
3920
3a151ccc6ed7
Remove unused variables and the corresponding warnings along with them.
diego
parents:
3776
diff
changeset
|
485 int i, plane, inter, qri, bmi, bmj, qistart; |
| 1224 | 486 |
|
3489
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
487 for(inter=0; inter<2; inter++){ |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
488 for(plane=0; plane<3; plane++){ |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
489 int sum=0; |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
490 for(qri=0; qri<s->qr_count[inter][plane]; qri++){ |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
491 sum+= s->qr_size[inter][plane][qri]; |
| 9731 | 492 if(s->qps[qpi] <= sum) |
|
3489
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
493 break; |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
494 } |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
495 qistart= sum - s->qr_size[inter][plane][qri]; |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
496 bmi= s->qr_base[inter][plane][qri ]; |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
497 bmj= s->qr_base[inter][plane][qri+1]; |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
498 for(i=0; i<64; i++){ |
| 9731 | 499 int coeff= ( 2*(sum -s->qps[qpi])*s->base_matrix[bmi][i] |
| 500 - 2*(qistart-s->qps[qpi])*s->base_matrix[bmj][i] | |
|
3489
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
501 + s->qr_size[inter][plane][qri]) |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
502 / (2*s->qr_size[inter][plane][qri]); |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
503 |
| 3491 | 504 int qmin= 8<<(inter + !i); |
|
3489
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
505 int qscale= i ? ac_scale_factor : dc_scale_factor; |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
506 |
| 9731 | 507 s->qmat[qpi][inter][plane][s->dsp.idct_permutation[i]]= av_clip((qscale * coeff)/100 * 4, qmin, 4096); |
|
3489
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
508 } |
| 9731 | 509 // all DC coefficients use the same quant so as not to interfere with DC prediction |
| 510 s->qmat[qpi][inter][plane][0] = s->qmat[0][inter][plane][0]; | |
|
3489
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
511 } |
| 1224 | 512 } |
| 2967 | 513 |
| 9731 | 514 memset(s->qscale_table, (FFMAX(s->qmat[0][0][0][1], s->qmat[0][0][1][1])+8)/16, 512); //FIXME finetune |
| 1224 | 515 } |
| 516 | |
| 517 /* | |
|
2723
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
518 * This function initializes the loop filter boundary limits if the frame's |
|
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
519 * quality index is different from the previous frame's. |
|
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
520 */ |
|
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
521 static void init_loop_filter(Vp3DecodeContext *s) |
|
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
522 { |
|
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
523 int *bounding_values= s->bounding_values_array+127; |
|
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
524 int filter_limit; |
|
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
525 int x; |
|
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
526 |
| 9731 | 527 filter_limit = s->filter_limit_values[s->qps[0]]; |
|
2723
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
528 |
|
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
529 /* set up the bounding values */ |
|
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
530 memset(s->bounding_values_array, 0, 256 * sizeof(int)); |
|
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
531 for (x = 0; x < filter_limit; x++) { |
|
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
532 bounding_values[-x - filter_limit] = -filter_limit + x; |
|
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
533 bounding_values[-x] = -x; |
|
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
534 bounding_values[x] = x; |
|
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
535 bounding_values[x + filter_limit] = filter_limit - x; |
|
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
536 } |
| 8032 | 537 bounding_values[129] = bounding_values[130] = filter_limit * 0x02020202; |
|
2723
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
538 } |
|
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
539 |
|
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
540 /* |
| 2967 | 541 * This function unpacks all of the superblock/macroblock/fragment coding |
| 1224 | 542 * information from the bitstream. |
| 543 */ | |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
544 static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb) |
| 1224 | 545 { |
| 546 int bit = 0; | |
| 547 int current_superblock = 0; | |
| 548 int current_run = 0; | |
| 549 int decode_fully_flags = 0; | |
| 550 int decode_partial_blocks = 0; | |
|
1272
777d4145cdfb
fix subtle logic problem in block unpacker that leads to incorrect token
tmmm
parents:
1244
diff
changeset
|
551 int first_c_fragment_seen; |
| 1224 | 552 |
| 553 int i, j; | |
| 554 int current_fragment; | |
| 555 | |
| 556 if (s->keyframe) { | |
| 557 memset(s->superblock_coding, SB_FULLY_CODED, s->superblock_count); | |
| 558 | |
| 559 } else { | |
| 560 | |
| 561 /* unpack the list of partially-coded superblocks */ | |
| 5513 | 562 bit = get_bits1(gb); |
| 2967 | 563 /* toggle the bit because as soon as the first run length is |
| 1224 | 564 * fetched the bit will be toggled again */ |
| 565 bit ^= 1; | |
| 566 while (current_superblock < s->superblock_count) { | |
| 2705 | 567 if (current_run-- == 0) { |
| 1224 | 568 bit ^= 1; |
| 2967 | 569 current_run = get_vlc2(gb, |
| 2705 | 570 s->superblock_run_length_vlc.table, 6, 2); |
| 571 if (current_run == 33) | |
|
2703
3817945001ce
replace get_superblock_run_length() with a VLC table
melanson
parents:
2702
diff
changeset
|
572 current_run += get_bits(gb, 12); |
| 1224 | 573 |
| 574 /* if any of the superblocks are not partially coded, flag | |
| 575 * a boolean to decode the list of fully-coded superblocks */ | |
|
1292
f7b3fa4bb7ae
revising and fixing motion vectors, squished block unpacking bug that
tmmm
parents:
1282
diff
changeset
|
576 if (bit == 0) { |
| 1224 | 577 decode_fully_flags = 1; |
|
1292
f7b3fa4bb7ae
revising and fixing motion vectors, squished block unpacking bug that
tmmm
parents:
1282
diff
changeset
|
578 } else { |
|
f7b3fa4bb7ae
revising and fixing motion vectors, squished block unpacking bug that
tmmm
parents:
1282
diff
changeset
|
579 |
|
f7b3fa4bb7ae
revising and fixing motion vectors, squished block unpacking bug that
tmmm
parents:
1282
diff
changeset
|
580 /* make a note of the fact that there are partially coded |
|
f7b3fa4bb7ae
revising and fixing motion vectors, squished block unpacking bug that
tmmm
parents:
1282
diff
changeset
|
581 * superblocks */ |
|
f7b3fa4bb7ae
revising and fixing motion vectors, squished block unpacking bug that
tmmm
parents:
1282
diff
changeset
|
582 decode_partial_blocks = 1; |
|
f7b3fa4bb7ae
revising and fixing motion vectors, squished block unpacking bug that
tmmm
parents:
1282
diff
changeset
|
583 } |
| 1224 | 584 } |
| 2705 | 585 s->superblock_coding[current_superblock++] = bit; |
| 1224 | 586 } |
| 587 | |
| 588 /* unpack the list of fully coded superblocks if any of the blocks were | |
| 589 * not marked as partially coded in the previous step */ | |
| 590 if (decode_fully_flags) { | |
| 591 | |
| 592 current_superblock = 0; | |
| 593 current_run = 0; | |
| 5513 | 594 bit = get_bits1(gb); |
| 2967 | 595 /* toggle the bit because as soon as the first run length is |
| 1224 | 596 * fetched the bit will be toggled again */ |
| 597 bit ^= 1; | |
| 598 while (current_superblock < s->superblock_count) { | |
| 599 | |
| 600 /* skip any superblocks already marked as partially coded */ | |
| 601 if (s->superblock_coding[current_superblock] == SB_NOT_CODED) { | |
| 602 | |
| 2705 | 603 if (current_run-- == 0) { |
| 1224 | 604 bit ^= 1; |
| 2967 | 605 current_run = get_vlc2(gb, |
| 2705 | 606 s->superblock_run_length_vlc.table, 6, 2); |
| 607 if (current_run == 33) | |
|
2703
3817945001ce
replace get_superblock_run_length() with a VLC table
melanson
parents:
2702
diff
changeset
|
608 current_run += get_bits(gb, 12); |
| 1224 | 609 } |
| 2705 | 610 s->superblock_coding[current_superblock] = 2*bit; |
| 1224 | 611 } |
| 612 current_superblock++; | |
| 613 } | |
| 614 } | |
| 615 | |
| 616 /* if there were partial blocks, initialize bitstream for | |
| 617 * unpacking fragment codings */ | |
| 618 if (decode_partial_blocks) { | |
| 619 | |
| 620 current_run = 0; | |
| 5513 | 621 bit = get_bits1(gb); |
| 2967 | 622 /* toggle the bit because as soon as the first run length is |
| 1224 | 623 * fetched the bit will be toggled again */ |
| 624 bit ^= 1; | |
| 625 } | |
| 626 } | |
| 627 | |
| 628 /* figure out which fragments are coded; iterate through each | |
| 629 * superblock (all planes) */ | |
| 630 s->coded_fragment_list_index = 0; | |
|
2714
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
631 s->next_coeff= s->coeffs + s->fragment_count; |
|
1236
d6e4784ffc16
dump the shady binary search logic (the part that binary searches
tmmm
parents:
1233
diff
changeset
|
632 s->first_coded_y_fragment = s->first_coded_c_fragment = 0; |
|
d6e4784ffc16
dump the shady binary search logic (the part that binary searches
tmmm
parents:
1233
diff
changeset
|
633 s->last_coded_y_fragment = s->last_coded_c_fragment = -1; |
|
1272
777d4145cdfb
fix subtle logic problem in block unpacker that leads to incorrect token
tmmm
parents:
1244
diff
changeset
|
634 first_c_fragment_seen = 0; |
|
1240
c95ff60bc1a1
fix motion vector decoding bug and reinstate interframes
tmmm
parents:
1239
diff
changeset
|
635 memset(s->macroblock_coding, MODE_COPY, s->macroblock_count); |
| 1224 | 636 for (i = 0; i < s->superblock_count; i++) { |
| 637 | |
| 638 /* iterate through all 16 fragments in a superblock */ | |
| 639 for (j = 0; j < 16; j++) { | |
| 640 | |
| 641 /* if the fragment is in bounds, check its coding status */ | |
| 642 current_fragment = s->superblock_fragments[i * 16 + j]; | |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
643 if (current_fragment >= s->fragment_count) { |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1518
diff
changeset
|
644 av_log(s->avctx, AV_LOG_ERROR, " vp3:unpack_superblocks(): bad fragment number (%d >= %d)\n", |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
645 current_fragment, s->fragment_count); |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
646 return 1; |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
647 } |
| 1224 | 648 if (current_fragment != -1) { |
| 649 if (s->superblock_coding[i] == SB_NOT_CODED) { | |
| 650 | |
| 651 /* copy all the fragments from the prior frame */ | |
| 2967 | 652 s->all_fragments[current_fragment].coding_method = |
| 1224 | 653 MODE_COPY; |
| 654 | |
| 655 } else if (s->superblock_coding[i] == SB_PARTIALLY_CODED) { | |
| 656 | |
| 657 /* fragment may or may not be coded; this is the case | |
| 658 * that cares about the fragment coding runs */ | |
| 2705 | 659 if (current_run-- == 0) { |
| 1224 | 660 bit ^= 1; |
| 2967 | 661 current_run = get_vlc2(gb, |
| 2705 | 662 s->fragment_run_length_vlc.table, 5, 2); |
| 1224 | 663 } |
| 664 | |
| 665 if (bit) { | |
| 2967 | 666 /* default mode; actual mode will be decoded in |
|
1272
777d4145cdfb
fix subtle logic problem in block unpacker that leads to incorrect token
tmmm
parents:
1244
diff
changeset
|
667 * the next phase */ |
| 2967 | 668 s->all_fragments[current_fragment].coding_method = |
| 1224 | 669 MODE_INTER_NO_MV; |
|
2714
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
670 s->all_fragments[current_fragment].next_coeff= s->coeffs + current_fragment; |
| 2967 | 671 s->coded_fragment_list[s->coded_fragment_list_index] = |
| 1224 | 672 current_fragment; |
| 3498 | 673 if ((current_fragment >= s->fragment_start[1]) && |
|
1272
777d4145cdfb
fix subtle logic problem in block unpacker that leads to incorrect token
tmmm
parents:
1244
diff
changeset
|
674 (s->last_coded_y_fragment == -1) && |
|
777d4145cdfb
fix subtle logic problem in block unpacker that leads to incorrect token
tmmm
parents:
1244
diff
changeset
|
675 (!first_c_fragment_seen)) { |
|
1236
d6e4784ffc16
dump the shady binary search logic (the part that binary searches
tmmm
parents:
1233
diff
changeset
|
676 s->first_coded_c_fragment = s->coded_fragment_list_index; |
|
d6e4784ffc16
dump the shady binary search logic (the part that binary searches
tmmm
parents:
1233
diff
changeset
|
677 s->last_coded_y_fragment = s->first_coded_c_fragment - 1; |
|
1272
777d4145cdfb
fix subtle logic problem in block unpacker that leads to incorrect token
tmmm
parents:
1244
diff
changeset
|
678 first_c_fragment_seen = 1; |
|
1236
d6e4784ffc16
dump the shady binary search logic (the part that binary searches
tmmm
parents:
1233
diff
changeset
|
679 } |
|
d6e4784ffc16
dump the shady binary search logic (the part that binary searches
tmmm
parents:
1233
diff
changeset
|
680 s->coded_fragment_list_index++; |
|
1240
c95ff60bc1a1
fix motion vector decoding bug and reinstate interframes
tmmm
parents:
1239
diff
changeset
|
681 s->macroblock_coding[s->all_fragments[current_fragment].macroblock] = MODE_INTER_NO_MV; |
| 1224 | 682 } else { |
| 683 /* not coded; copy this fragment from the prior frame */ | |
| 684 s->all_fragments[current_fragment].coding_method = | |
| 685 MODE_COPY; | |
| 686 } | |
| 687 | |
| 688 } else { | |
| 689 | |
| 690 /* fragments are fully coded in this superblock; actual | |
| 691 * coding will be determined in next step */ | |
| 2967 | 692 s->all_fragments[current_fragment].coding_method = |
| 1224 | 693 MODE_INTER_NO_MV; |
|
2714
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
694 s->all_fragments[current_fragment].next_coeff= s->coeffs + current_fragment; |
| 2967 | 695 s->coded_fragment_list[s->coded_fragment_list_index] = |
| 1224 | 696 current_fragment; |
| 3498 | 697 if ((current_fragment >= s->fragment_start[1]) && |
|
1272
777d4145cdfb
fix subtle logic problem in block unpacker that leads to incorrect token
tmmm
parents:
1244
diff
changeset
|
698 (s->last_coded_y_fragment == -1) && |
|
777d4145cdfb
fix subtle logic problem in block unpacker that leads to incorrect token
tmmm
parents:
1244
diff
changeset
|
699 (!first_c_fragment_seen)) { |
|
1236
d6e4784ffc16
dump the shady binary search logic (the part that binary searches
tmmm
parents:
1233
diff
changeset
|
700 s->first_coded_c_fragment = s->coded_fragment_list_index; |
|
d6e4784ffc16
dump the shady binary search logic (the part that binary searches
tmmm
parents:
1233
diff
changeset
|
701 s->last_coded_y_fragment = s->first_coded_c_fragment - 1; |
|
1272
777d4145cdfb
fix subtle logic problem in block unpacker that leads to incorrect token
tmmm
parents:
1244
diff
changeset
|
702 first_c_fragment_seen = 1; |
|
1236
d6e4784ffc16
dump the shady binary search logic (the part that binary searches
tmmm
parents:
1233
diff
changeset
|
703 } |
|
d6e4784ffc16
dump the shady binary search logic (the part that binary searches
tmmm
parents:
1233
diff
changeset
|
704 s->coded_fragment_list_index++; |
|
1240
c95ff60bc1a1
fix motion vector decoding bug and reinstate interframes
tmmm
parents:
1239
diff
changeset
|
705 s->macroblock_coding[s->all_fragments[current_fragment].macroblock] = MODE_INTER_NO_MV; |
| 1224 | 706 } |
| 707 } | |
| 708 } | |
| 709 } | |
|
1236
d6e4784ffc16
dump the shady binary search logic (the part that binary searches
tmmm
parents:
1233
diff
changeset
|
710 |
|
1272
777d4145cdfb
fix subtle logic problem in block unpacker that leads to incorrect token
tmmm
parents:
1244
diff
changeset
|
711 if (!first_c_fragment_seen) |
|
777d4145cdfb
fix subtle logic problem in block unpacker that leads to incorrect token
tmmm
parents:
1244
diff
changeset
|
712 /* only Y fragments coded in this frame */ |
|
1236
d6e4784ffc16
dump the shady binary search logic (the part that binary searches
tmmm
parents:
1233
diff
changeset
|
713 s->last_coded_y_fragment = s->coded_fragment_list_index - 1; |
| 2967 | 714 else |
|
1292
f7b3fa4bb7ae
revising and fixing motion vectors, squished block unpacking bug that
tmmm
parents:
1282
diff
changeset
|
715 /* end the list of coded C fragments */ |
|
1236
d6e4784ffc16
dump the shady binary search logic (the part that binary searches
tmmm
parents:
1233
diff
changeset
|
716 s->last_coded_c_fragment = s->coded_fragment_list_index - 1; |
|
1272
777d4145cdfb
fix subtle logic problem in block unpacker that leads to incorrect token
tmmm
parents:
1244
diff
changeset
|
717 |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
718 return 0; |
| 1224 | 719 } |
| 720 | |
| 721 /* | |
| 722 * This function unpacks all the coding mode data for individual macroblocks | |
| 723 * from the bitstream. | |
| 724 */ | |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
725 static int unpack_modes(Vp3DecodeContext *s, GetBitContext *gb) |
| 1224 | 726 { |
| 727 int i, j, k; | |
| 728 int scheme; | |
| 729 int current_macroblock; | |
| 730 int current_fragment; | |
| 731 int coding_mode; | |
|
7139
03fe3194eff7
make ModeAlphabet read-only and use a custom mode alphabet
stefang
parents:
7040
diff
changeset
|
732 int custom_mode_alphabet[CODING_MODE_COUNT]; |
| 1224 | 733 |
| 734 if (s->keyframe) { | |
| 735 for (i = 0; i < s->fragment_count; i++) | |
| 736 s->all_fragments[i].coding_method = MODE_INTRA; | |
| 737 | |
| 738 } else { | |
| 739 | |
| 740 /* fetch the mode coding scheme for this frame */ | |
| 741 scheme = get_bits(gb, 3); | |
| 742 | |
| 743 /* is it a custom coding scheme? */ | |
| 744 if (scheme == 0) { | |
| 745 for (i = 0; i < 8; i++) | |
|
8736
f973fff63599
VP3: Prevent stack corruption from an unset custom coding method.
alexc
parents:
8718
diff
changeset
|
746 custom_mode_alphabet[i] = MODE_INTER_NO_MV; |
|
f973fff63599
VP3: Prevent stack corruption from an unset custom coding method.
alexc
parents:
8718
diff
changeset
|
747 for (i = 0; i < 8; i++) |
|
7139
03fe3194eff7
make ModeAlphabet read-only and use a custom mode alphabet
stefang
parents:
7040
diff
changeset
|
748 custom_mode_alphabet[get_bits(gb, 3)] = i; |
| 1224 | 749 } |
| 750 | |
| 751 /* iterate through all of the macroblocks that contain 1 or more | |
| 752 * coded fragments */ | |
| 753 for (i = 0; i < s->u_superblock_start; i++) { | |
| 754 | |
| 755 for (j = 0; j < 4; j++) { | |
| 756 current_macroblock = s->superblock_macroblocks[i * 4 + j]; | |
| 757 if ((current_macroblock == -1) || | |
|
1240
c95ff60bc1a1
fix motion vector decoding bug and reinstate interframes
tmmm
parents:
1239
diff
changeset
|
758 (s->macroblock_coding[current_macroblock] == MODE_COPY)) |
| 1224 | 759 continue; |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
760 if (current_macroblock >= s->macroblock_count) { |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1518
diff
changeset
|
761 av_log(s->avctx, AV_LOG_ERROR, " vp3:unpack_modes(): bad macroblock number (%d >= %d)\n", |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
762 current_macroblock, s->macroblock_count); |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
763 return 1; |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
764 } |
| 1224 | 765 |
| 766 /* mode 7 means get 3 bits for each coding mode */ | |
| 767 if (scheme == 7) | |
| 768 coding_mode = get_bits(gb, 3); | |
|
7139
03fe3194eff7
make ModeAlphabet read-only and use a custom mode alphabet
stefang
parents:
7040
diff
changeset
|
769 else if(scheme == 0) |
|
03fe3194eff7
make ModeAlphabet read-only and use a custom mode alphabet
stefang
parents:
7040
diff
changeset
|
770 coding_mode = custom_mode_alphabet |
|
03fe3194eff7
make ModeAlphabet read-only and use a custom mode alphabet
stefang
parents:
7040
diff
changeset
|
771 [get_vlc2(gb, s->mode_code_vlc.table, 3, 3)]; |
| 1224 | 772 else |
|
7139
03fe3194eff7
make ModeAlphabet read-only and use a custom mode alphabet
stefang
parents:
7040
diff
changeset
|
773 coding_mode = ModeAlphabet[scheme-1] |
|
2702
5a4e5225cbb6
use VLCs for in place of get_fragment_run_length(), get_mode_code(), and
melanson
parents:
2699
diff
changeset
|
774 [get_vlc2(gb, s->mode_code_vlc.table, 3, 3)]; |
| 1224 | 775 |
|
1240
c95ff60bc1a1
fix motion vector decoding bug and reinstate interframes
tmmm
parents:
1239
diff
changeset
|
776 s->macroblock_coding[current_macroblock] = coding_mode; |
| 1224 | 777 for (k = 0; k < 6; k++) { |
| 2967 | 778 current_fragment = |
| 1224 | 779 s->macroblock_fragments[current_macroblock * 6 + k]; |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
780 if (current_fragment == -1) |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
781 continue; |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
782 if (current_fragment >= s->fragment_count) { |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1518
diff
changeset
|
783 av_log(s->avctx, AV_LOG_ERROR, " vp3:unpack_modes(): bad fragment number (%d >= %d)\n", |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
784 current_fragment, s->fragment_count); |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
785 return 1; |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
786 } |
| 2967 | 787 if (s->all_fragments[current_fragment].coding_method != |
| 1224 | 788 MODE_COPY) |
| 789 s->all_fragments[current_fragment].coding_method = | |
| 790 coding_mode; | |
| 791 } | |
| 792 } | |
| 793 } | |
| 794 } | |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
795 |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
796 return 0; |
|
1229
cefec170ee46
fixed buffer allocation logic (hopefully) so that decoder does not crash
tmmm
parents:
1227
diff
changeset
|
797 } |
|
cefec170ee46
fixed buffer allocation logic (hopefully) so that decoder does not crash
tmmm
parents:
1227
diff
changeset
|
798 |
|
cefec170ee46
fixed buffer allocation logic (hopefully) so that decoder does not crash
tmmm
parents:
1227
diff
changeset
|
799 /* |
| 1224 | 800 * This function unpacks all the motion vectors for the individual |
| 801 * macroblocks from the bitstream. | |
| 802 */ | |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
803 static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb) |
| 1224 | 804 { |
| 7778 | 805 int i, j, k, l; |
| 1224 | 806 int coding_mode; |
| 807 int motion_x[6]; | |
| 808 int motion_y[6]; | |
| 809 int last_motion_x = 0; | |
| 810 int last_motion_y = 0; | |
| 811 int prior_last_motion_x = 0; | |
| 812 int prior_last_motion_y = 0; | |
| 813 int current_macroblock; | |
| 814 int current_fragment; | |
| 815 | |
| 7970 | 816 if (s->keyframe) |
| 7969 | 817 return 0; |
| 7971 | 818 |
| 7972 | 819 memset(motion_x, 0, 6 * sizeof(int)); |
| 820 memset(motion_y, 0, 6 * sizeof(int)); | |
| 1224 | 821 |
| 7972 | 822 /* coding mode 0 is the VLC scheme; 1 is the fixed code scheme */ |
| 823 coding_mode = get_bits1(gb); | |
| 1224 | 824 |
| 7972 | 825 /* iterate through all of the macroblocks that contain 1 or more |
| 826 * coded fragments */ | |
| 827 for (i = 0; i < s->u_superblock_start; i++) { | |
| 1224 | 828 |
| 7972 | 829 for (j = 0; j < 4; j++) { |
| 830 current_macroblock = s->superblock_macroblocks[i * 4 + j]; | |
| 831 if ((current_macroblock == -1) || | |
| 832 (s->macroblock_coding[current_macroblock] == MODE_COPY)) | |
| 833 continue; | |
| 834 if (current_macroblock >= s->macroblock_count) { | |
| 835 av_log(s->avctx, AV_LOG_ERROR, " vp3:unpack_vectors(): bad macroblock number (%d >= %d)\n", | |
| 836 current_macroblock, s->macroblock_count); | |
| 837 return 1; | |
| 838 } | |
| 839 | |
| 840 current_fragment = s->macroblock_fragments[current_macroblock * 6]; | |
| 841 if (current_fragment >= s->fragment_count) { | |
| 842 av_log(s->avctx, AV_LOG_ERROR, " vp3:unpack_vectors(): bad fragment number (%d >= %d\n", | |
| 843 current_fragment, s->fragment_count); | |
| 844 return 1; | |
| 845 } | |
| 846 switch (s->macroblock_coding[current_macroblock]) { | |
| 847 | |
| 848 case MODE_INTER_PLUS_MV: | |
| 849 case MODE_GOLDEN_MV: | |
| 850 /* all 6 fragments use the same motion vector */ | |
| 851 if (coding_mode == 0) { | |
| 852 motion_x[0] = motion_vector_table[get_vlc2(gb, s->motion_vector_vlc.table, 6, 2)]; | |
| 853 motion_y[0] = motion_vector_table[get_vlc2(gb, s->motion_vector_vlc.table, 6, 2)]; | |
| 854 } else { | |
| 855 motion_x[0] = fixed_motion_vector_table[get_bits(gb, 6)]; | |
| 856 motion_y[0] = fixed_motion_vector_table[get_bits(gb, 6)]; | |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
857 } |
| 1224 | 858 |
| 7972 | 859 for (k = 1; k < 6; k++) { |
| 860 motion_x[k] = motion_x[0]; | |
| 861 motion_y[k] = motion_y[0]; | |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
862 } |
|
7777
8002605f6aaf
theoradec: small 4MV code reorganization to ease future improvements
aurel
parents:
7139
diff
changeset
|
863 |
| 7972 | 864 /* vector maintenance, only on MODE_INTER_PLUS_MV */ |
| 865 if (s->macroblock_coding[current_macroblock] == | |
| 866 MODE_INTER_PLUS_MV) { | |
| 1224 | 867 prior_last_motion_x = last_motion_x; |
| 868 prior_last_motion_y = last_motion_y; | |
| 869 last_motion_x = motion_x[0]; | |
| 870 last_motion_y = motion_y[0]; | |
| 7972 | 871 } |
| 872 break; | |
| 873 | |
| 874 case MODE_INTER_FOURMV: | |
| 875 /* vector maintenance */ | |
| 876 prior_last_motion_x = last_motion_x; | |
| 877 prior_last_motion_y = last_motion_y; | |
|
1229
cefec170ee46
fixed buffer allocation logic (hopefully) so that decoder does not crash
tmmm
parents:
1227
diff
changeset
|
878 |
| 7972 | 879 /* fetch 4 vectors from the bitstream, one for each |
| 880 * Y fragment, then average for the C fragment vectors */ | |
| 881 motion_x[4] = motion_y[4] = 0; | |
| 882 for (k = 0; k < 4; k++) { | |
| 883 for (l = 0; l < s->coded_fragment_list_index; l++) | |
| 884 if (s->coded_fragment_list[l] == s->macroblock_fragments[6*current_macroblock + k]) | |
| 885 break; | |
| 886 if (l < s->coded_fragment_list_index) { | |
| 887 if (coding_mode == 0) { | |
| 888 motion_x[k] = motion_vector_table[get_vlc2(gb, s->motion_vector_vlc.table, 6, 2)]; | |
| 889 motion_y[k] = motion_vector_table[get_vlc2(gb, s->motion_vector_vlc.table, 6, 2)]; | |
| 890 } else { | |
| 891 motion_x[k] = fixed_motion_vector_table[get_bits(gb, 6)]; | |
| 892 motion_y[k] = fixed_motion_vector_table[get_bits(gb, 6)]; | |
| 893 } | |
| 894 last_motion_x = motion_x[k]; | |
| 895 last_motion_y = motion_y[k]; | |
| 896 } else { | |
| 897 motion_x[k] = 0; | |
| 898 motion_y[k] = 0; | |
| 899 } | |
| 900 motion_x[4] += motion_x[k]; | |
| 901 motion_y[4] += motion_y[k]; | |
| 1224 | 902 } |
| 903 | |
| 7972 | 904 motion_x[5]= |
| 905 motion_x[4]= RSHIFT(motion_x[4], 2); | |
| 906 motion_y[5]= | |
| 907 motion_y[4]= RSHIFT(motion_y[4], 2); | |
| 908 break; | |
| 909 | |
| 910 case MODE_INTER_LAST_MV: | |
| 911 /* all 6 fragments use the last motion vector */ | |
| 912 motion_x[0] = last_motion_x; | |
| 913 motion_y[0] = last_motion_y; | |
| 914 for (k = 1; k < 6; k++) { | |
| 915 motion_x[k] = motion_x[0]; | |
| 916 motion_y[k] = motion_y[0]; | |
| 917 } | |
| 918 | |
| 919 /* no vector maintenance (last vector remains the | |
| 920 * last vector) */ | |
| 921 break; | |
| 922 | |
| 923 case MODE_INTER_PRIOR_LAST: | |
| 924 /* all 6 fragments use the motion vector prior to the | |
| 925 * last motion vector */ | |
| 926 motion_x[0] = prior_last_motion_x; | |
| 927 motion_y[0] = prior_last_motion_y; | |
| 928 for (k = 1; k < 6; k++) { | |
| 929 motion_x[k] = motion_x[0]; | |
| 930 motion_y[k] = motion_y[0]; | |
| 1224 | 931 } |
| 7972 | 932 |
| 933 /* vector maintenance */ | |
| 934 prior_last_motion_x = last_motion_x; | |
| 935 prior_last_motion_y = last_motion_y; | |
| 936 last_motion_x = motion_x[0]; | |
| 937 last_motion_y = motion_y[0]; | |
| 938 break; | |
| 939 | |
| 940 default: | |
| 941 /* covers intra, inter without MV, golden without MV */ | |
| 942 memset(motion_x, 0, 6 * sizeof(int)); | |
| 943 memset(motion_y, 0, 6 * sizeof(int)); | |
| 944 | |
| 945 /* no vector maintenance */ | |
| 946 break; | |
| 947 } | |
| 948 | |
| 949 /* assign the motion vectors to the correct fragments */ | |
| 950 for (k = 0; k < 6; k++) { | |
| 951 current_fragment = | |
| 952 s->macroblock_fragments[current_macroblock * 6 + k]; | |
| 953 if (current_fragment == -1) | |
| 954 continue; | |
| 955 if (current_fragment >= s->fragment_count) { | |
| 956 av_log(s->avctx, AV_LOG_ERROR, " vp3:unpack_vectors(): bad fragment number (%d >= %d)\n", | |
| 957 current_fragment, s->fragment_count); | |
| 958 return 1; | |
| 959 } | |
| 960 s->all_fragments[current_fragment].motion_x = motion_x[k]; | |
| 961 s->all_fragments[current_fragment].motion_y = motion_y[k]; | |
| 1224 | 962 } |
| 963 } | |
| 7972 | 964 } |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
965 |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
966 return 0; |
| 1224 | 967 } |
| 968 | |
| 9731 | 969 static int unpack_block_qpis(Vp3DecodeContext *s, GetBitContext *gb) |
| 970 { | |
| 971 int qpi, i, j, bit, run_length, blocks_decoded, num_blocks_at_qpi; | |
| 972 int num_blocks = s->coded_fragment_list_index; | |
| 973 | |
| 974 for (qpi = 0; qpi < s->nqps-1 && num_blocks > 0; qpi++) { | |
| 975 i = blocks_decoded = num_blocks_at_qpi = 0; | |
| 976 | |
| 977 bit = get_bits1(gb); | |
| 978 | |
| 979 do { | |
| 980 run_length = get_vlc2(gb, s->superblock_run_length_vlc.table, 6, 2) + 1; | |
| 981 if (run_length == 34) | |
| 982 run_length += get_bits(gb, 12); | |
| 983 blocks_decoded += run_length; | |
| 984 | |
| 985 if (!bit) | |
| 986 num_blocks_at_qpi += run_length; | |
| 987 | |
| 988 for (j = 0; j < run_length; i++) { | |
| 989 if (i > s->coded_fragment_list_index) | |
| 990 return -1; | |
| 991 | |
| 992 if (s->all_fragments[s->coded_fragment_list[i]].qpi == qpi) { | |
| 993 s->all_fragments[s->coded_fragment_list[i]].qpi += bit; | |
| 994 j++; | |
| 995 } | |
| 996 } | |
| 997 | |
| 998 if (run_length == 4129) | |
| 999 bit = get_bits1(gb); | |
| 1000 else | |
| 1001 bit ^= 1; | |
| 1002 } while (blocks_decoded < num_blocks); | |
| 1003 | |
| 1004 num_blocks -= num_blocks_at_qpi; | |
| 1005 } | |
| 1006 | |
| 1007 return 0; | |
| 1008 } | |
| 1009 | |
| 2967 | 1010 /* |
| 1224 | 1011 * This function is called by unpack_dct_coeffs() to extract the VLCs from |
| 1012 * the bitstream. The VLCs encode tokens which are used to unpack DCT | |
| 1013 * data. This function unpacks all the VLCs for either the Y plane or both | |
| 1014 * C planes, and is called for DC coefficients or different AC coefficient | |
| 1015 * levels (since different coefficient types require different VLC tables. | |
| 1016 * | |
| 1017 * This function returns a residual eob run. E.g, if a particular token gave | |
| 1018 * instructions to EOB the next 5 fragments and there were only 2 fragments | |
| 1019 * left in the current fragment range, 3 would be returned so that it could | |
| 1020 * be passed into the next call to this same function. | |
| 1021 */ | |
| 1022 static int unpack_vlcs(Vp3DecodeContext *s, GetBitContext *gb, | |
| 1023 VLC *table, int coeff_index, | |
| 1024 int first_fragment, int last_fragment, | |
| 1025 int eob_run) | |
| 1026 { | |
| 1027 int i; | |
| 1028 int token; | |
|
2712
9c1a436dac6b
replace unpack_token() with a series of lookup tables
melanson
parents:
2709
diff
changeset
|
1029 int zero_run = 0; |
|
9c1a436dac6b
replace unpack_token() with a series of lookup tables
melanson
parents:
2709
diff
changeset
|
1030 DCTELEM coeff = 0; |
| 1224 | 1031 Vp3Fragment *fragment; |
| 2694 | 1032 uint8_t *perm= s->scantable.permutated; |
|
2712
9c1a436dac6b
replace unpack_token() with a series of lookup tables
melanson
parents:
2709
diff
changeset
|
1033 int bits_to_get; |
| 1224 | 1034 |
|
1272
777d4145cdfb
fix subtle logic problem in block unpacker that leads to incorrect token
tmmm
parents:
1244
diff
changeset
|
1035 if ((first_fragment >= s->fragment_count) || |
|
1244
a02df1ba6c7f
fix image buffer leak on keyframes, add more error condition checks
tmmm
parents:
1240
diff
changeset
|
1036 (last_fragment >= s->fragment_count)) { |
|
a02df1ba6c7f
fix image buffer leak on keyframes, add more error condition checks
tmmm
parents:
1240
diff
changeset
|
1037 |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1518
diff
changeset
|
1038 av_log(s->avctx, AV_LOG_ERROR, " vp3:unpack_vlcs(): bad fragment number (%d -> %d ?)\n", |
|
1244
a02df1ba6c7f
fix image buffer leak on keyframes, add more error condition checks
tmmm
parents:
1240
diff
changeset
|
1039 first_fragment, last_fragment); |
|
1272
777d4145cdfb
fix subtle logic problem in block unpacker that leads to incorrect token
tmmm
parents:
1244
diff
changeset
|
1040 return 0; |
|
1244
a02df1ba6c7f
fix image buffer leak on keyframes, add more error condition checks
tmmm
parents:
1240
diff
changeset
|
1041 } |
|
a02df1ba6c7f
fix image buffer leak on keyframes, add more error condition checks
tmmm
parents:
1240
diff
changeset
|
1042 |
|
1236
d6e4784ffc16
dump the shady binary search logic (the part that binary searches
tmmm
parents:
1233
diff
changeset
|
1043 for (i = first_fragment; i <= last_fragment; i++) { |
|
7037
480faa9f79dd
Almost-cosmetics: split out coeff_count from all_fragments struct into
reimar
parents:
6903
diff
changeset
|
1044 int fragment_num = s->coded_fragment_list[i]; |
|
480faa9f79dd
Almost-cosmetics: split out coeff_count from all_fragments struct into
reimar
parents:
6903
diff
changeset
|
1045 |
|
480faa9f79dd
Almost-cosmetics: split out coeff_count from all_fragments struct into
reimar
parents:
6903
diff
changeset
|
1046 if (s->coeff_counts[fragment_num] > coeff_index) |
| 1224 | 1047 continue; |
|
7037
480faa9f79dd
Almost-cosmetics: split out coeff_count from all_fragments struct into
reimar
parents:
6903
diff
changeset
|
1048 fragment = &s->all_fragments[fragment_num]; |
| 1224 | 1049 |
| 1050 if (!eob_run) { | |
| 1051 /* decode a VLC into a token */ | |
| 1052 token = get_vlc2(gb, table->table, 5, 3); | |
| 1053 /* use the token to get a zero run, a coefficient, and an eob run */ | |
|
2712
9c1a436dac6b
replace unpack_token() with a series of lookup tables
melanson
parents:
2709
diff
changeset
|
1054 if (token <= 6) { |
|
9c1a436dac6b
replace unpack_token() with a series of lookup tables
melanson
parents:
2709
diff
changeset
|
1055 eob_run = eob_run_base[token]; |
|
9c1a436dac6b
replace unpack_token() with a series of lookup tables
melanson
parents:
2709
diff
changeset
|
1056 if (eob_run_get_bits[token]) |
|
9c1a436dac6b
replace unpack_token() with a series of lookup tables
melanson
parents:
2709
diff
changeset
|
1057 eob_run += get_bits(gb, eob_run_get_bits[token]); |
|
9c1a436dac6b
replace unpack_token() with a series of lookup tables
melanson
parents:
2709
diff
changeset
|
1058 coeff = zero_run = 0; |
|
9c1a436dac6b
replace unpack_token() with a series of lookup tables
melanson
parents:
2709
diff
changeset
|
1059 } else { |
|
9c1a436dac6b
replace unpack_token() with a series of lookup tables
melanson
parents:
2709
diff
changeset
|
1060 bits_to_get = coeff_get_bits[token]; |
|
9c1a436dac6b
replace unpack_token() with a series of lookup tables
melanson
parents:
2709
diff
changeset
|
1061 if (!bits_to_get) |
|
9c1a436dac6b
replace unpack_token() with a series of lookup tables
melanson
parents:
2709
diff
changeset
|
1062 coeff = coeff_tables[token][0]; |
|
9c1a436dac6b
replace unpack_token() with a series of lookup tables
melanson
parents:
2709
diff
changeset
|
1063 else |
|
9c1a436dac6b
replace unpack_token() with a series of lookup tables
melanson
parents:
2709
diff
changeset
|
1064 coeff = coeff_tables[token][get_bits(gb, bits_to_get)]; |
|
9c1a436dac6b
replace unpack_token() with a series of lookup tables
melanson
parents:
2709
diff
changeset
|
1065 |
|
9c1a436dac6b
replace unpack_token() with a series of lookup tables
melanson
parents:
2709
diff
changeset
|
1066 zero_run = zero_run_base[token]; |
|
9c1a436dac6b
replace unpack_token() with a series of lookup tables
melanson
parents:
2709
diff
changeset
|
1067 if (zero_run_get_bits[token]) |
|
9c1a436dac6b
replace unpack_token() with a series of lookup tables
melanson
parents:
2709
diff
changeset
|
1068 zero_run += get_bits(gb, zero_run_get_bits[token]); |
|
9c1a436dac6b
replace unpack_token() with a series of lookup tables
melanson
parents:
2709
diff
changeset
|
1069 } |
| 1224 | 1070 } |
| 1071 | |
| 1072 if (!eob_run) { | |
|
7037
480faa9f79dd
Almost-cosmetics: split out coeff_count from all_fragments struct into
reimar
parents:
6903
diff
changeset
|
1073 s->coeff_counts[fragment_num] += zero_run; |
|
480faa9f79dd
Almost-cosmetics: split out coeff_count from all_fragments struct into
reimar
parents:
6903
diff
changeset
|
1074 if (s->coeff_counts[fragment_num] < 64){ |
|
2714
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
1075 fragment->next_coeff->coeff= coeff; |
|
7037
480faa9f79dd
Almost-cosmetics: split out coeff_count from all_fragments struct into
reimar
parents:
6903
diff
changeset
|
1076 fragment->next_coeff->index= perm[s->coeff_counts[fragment_num]++]; //FIXME perm here already? |
|
2714
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
1077 fragment->next_coeff->next= s->next_coeff; |
|
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
1078 s->next_coeff->next=NULL; |
|
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
1079 fragment->next_coeff= s->next_coeff++; |
|
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
1080 } |
| 1224 | 1081 } else { |
|
7037
480faa9f79dd
Almost-cosmetics: split out coeff_count from all_fragments struct into
reimar
parents:
6903
diff
changeset
|
1082 s->coeff_counts[fragment_num] |= 128; |
| 1224 | 1083 eob_run--; |
| 1084 } | |
| 1085 } | |
| 1086 | |
| 1087 return eob_run; | |
| 1088 } | |
| 1089 | |
| 1090 /* | |
| 1091 * This function unpacks all of the DCT coefficient data from the | |
| 1092 * bitstream. | |
| 1093 */ | |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
1094 static int unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb) |
| 1224 | 1095 { |
| 1096 int i; | |
| 1097 int dc_y_table; | |
| 1098 int dc_c_table; | |
| 1099 int ac_y_table; | |
| 1100 int ac_c_table; | |
| 1101 int residual_eob_run = 0; | |
| 1102 | |
| 6903 | 1103 /* fetch the DC table indexes */ |
| 1224 | 1104 dc_y_table = get_bits(gb, 4); |
| 1105 dc_c_table = get_bits(gb, 4); | |
| 1106 | |
| 1107 /* unpack the Y plane DC coefficients */ | |
| 2967 | 1108 residual_eob_run = unpack_vlcs(s, gb, &s->dc_vlc[dc_y_table], 0, |
|
1236
d6e4784ffc16
dump the shady binary search logic (the part that binary searches
tmmm
parents:
1233
diff
changeset
|
1109 s->first_coded_y_fragment, s->last_coded_y_fragment, residual_eob_run); |
| 1224 | 1110 |
| 1111 /* unpack the C plane DC coefficients */ | |
| 1112 residual_eob_run = unpack_vlcs(s, gb, &s->dc_vlc[dc_c_table], 0, | |
|
1236
d6e4784ffc16
dump the shady binary search logic (the part that binary searches
tmmm
parents:
1233
diff
changeset
|
1113 s->first_coded_c_fragment, s->last_coded_c_fragment, residual_eob_run); |
| 1224 | 1114 |
| 6903 | 1115 /* fetch the AC table indexes */ |
| 1224 | 1116 ac_y_table = get_bits(gb, 4); |
| 1117 ac_c_table = get_bits(gb, 4); | |
| 1118 | |
|
1233
5d66713e97e2
correct the custom coding mode alphabet, add some validation on the
tmmm
parents:
1230
diff
changeset
|
1119 /* unpack the group 1 AC coefficients (coeffs 1-5) */ |
| 1224 | 1120 for (i = 1; i <= 5; i++) { |
| 2967 | 1121 residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_1[ac_y_table], i, |
|
1236
d6e4784ffc16
dump the shady binary search logic (the part that binary searches
tmmm
parents:
1233
diff
changeset
|
1122 s->first_coded_y_fragment, s->last_coded_y_fragment, residual_eob_run); |
| 1224 | 1123 |
| 2967 | 1124 residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_1[ac_c_table], i, |
|
1236
d6e4784ffc16
dump the shady binary search logic (the part that binary searches
tmmm
parents:
1233
diff
changeset
|
1125 s->first_coded_c_fragment, s->last_coded_c_fragment, residual_eob_run); |
| 1224 | 1126 } |
| 1127 | |
|
1233
5d66713e97e2
correct the custom coding mode alphabet, add some validation on the
tmmm
parents:
1230
diff
changeset
|
1128 /* unpack the group 2 AC coefficients (coeffs 6-14) */ |
| 1224 | 1129 for (i = 6; i <= 14; i++) { |
| 2967 | 1130 residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_2[ac_y_table], i, |
|
1236
d6e4784ffc16
dump the shady binary search logic (the part that binary searches
tmmm
parents:
1233
diff
changeset
|
1131 s->first_coded_y_fragment, s->last_coded_y_fragment, residual_eob_run); |
| 1224 | 1132 |
| 2967 | 1133 residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_2[ac_c_table], i, |
|
1236
d6e4784ffc16
dump the shady binary search logic (the part that binary searches
tmmm
parents:
1233
diff
changeset
|
1134 s->first_coded_c_fragment, s->last_coded_c_fragment, residual_eob_run); |
| 1224 | 1135 } |
| 1136 | |
|
1233
5d66713e97e2
correct the custom coding mode alphabet, add some validation on the
tmmm
parents:
1230
diff
changeset
|
1137 /* unpack the group 3 AC coefficients (coeffs 15-27) */ |
| 1224 | 1138 for (i = 15; i <= 27; i++) { |
| 2967 | 1139 residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_3[ac_y_table], i, |
|
1236
d6e4784ffc16
dump the shady binary search logic (the part that binary searches
tmmm
parents:
1233
diff
changeset
|
1140 s->first_coded_y_fragment, s->last_coded_y_fragment, residual_eob_run); |
| 1224 | 1141 |
| 2967 | 1142 residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_3[ac_c_table], i, |
|
1236
d6e4784ffc16
dump the shady binary search logic (the part that binary searches
tmmm
parents:
1233
diff
changeset
|
1143 s->first_coded_c_fragment, s->last_coded_c_fragment, residual_eob_run); |
| 1224 | 1144 } |
| 1145 | |
|
1233
5d66713e97e2
correct the custom coding mode alphabet, add some validation on the
tmmm
parents:
1230
diff
changeset
|
1146 /* unpack the group 4 AC coefficients (coeffs 28-63) */ |
| 1224 | 1147 for (i = 28; i <= 63; i++) { |
| 2967 | 1148 residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_4[ac_y_table], i, |
|
1236
d6e4784ffc16
dump the shady binary search logic (the part that binary searches
tmmm
parents:
1233
diff
changeset
|
1149 s->first_coded_y_fragment, s->last_coded_y_fragment, residual_eob_run); |
| 1224 | 1150 |
| 2967 | 1151 residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_4[ac_c_table], i, |
|
1236
d6e4784ffc16
dump the shady binary search logic (the part that binary searches
tmmm
parents:
1233
diff
changeset
|
1152 s->first_coded_c_fragment, s->last_coded_c_fragment, residual_eob_run); |
| 1224 | 1153 } |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
1154 |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
1155 return 0; |
| 1224 | 1156 } |
| 1157 | |
| 1158 /* | |
| 1159 * This function reverses the DC prediction for each coded fragment in | |
| 2967 | 1160 * the frame. Much of this function is adapted directly from the original |
| 1224 | 1161 * VP3 source code. |
| 1162 */ | |
| 1163 #define COMPATIBLE_FRAME(x) \ | |
| 1164 (compatible_frame[s->all_fragments[x].coding_method] == current_frame_type) | |
| 1165 #define FRAME_CODED(x) (s->all_fragments[x].coding_method != MODE_COPY) | |
|
2714
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
1166 #define DC_COEFF(u) (s->coeffs[u].index ? 0 : s->coeffs[u].coeff) //FIXME do somethin to simplify this |
| 1224 | 1167 |
| 1168 static void reverse_dc_prediction(Vp3DecodeContext *s, | |
| 1169 int first_fragment, | |
| 1170 int fragment_width, | |
| 2967 | 1171 int fragment_height) |
| 1224 | 1172 { |
| 1173 | |
| 1174 #define PUL 8 | |
| 1175 #define PU 4 | |
| 1176 #define PUR 2 | |
| 1177 #define PL 1 | |
| 1178 | |
| 1179 int x, y; | |
| 1180 int i = first_fragment; | |
| 1181 | |
| 3940 | 1182 int predicted_dc; |
| 1224 | 1183 |
| 1184 /* DC values for the left, up-left, up, and up-right fragments */ | |
| 1185 int vl, vul, vu, vur; | |
| 1186 | |
| 6903 | 1187 /* indexes for the left, up-left, up, and up-right fragments */ |
| 1224 | 1188 int l, ul, u, ur; |
| 1189 | |
| 2967 | 1190 /* |
| 1224 | 1191 * The 6 fields mean: |
| 1192 * 0: up-left multiplier | |
| 1193 * 1: up multiplier | |
| 1194 * 2: up-right multiplier | |
| 1195 * 3: left multiplier | |
| 1196 */ | |
| 3501 | 1197 int predictor_transform[16][4] = { |
| 1198 { 0, 0, 0, 0}, | |
| 1199 { 0, 0, 0,128}, // PL | |
| 1200 { 0, 0,128, 0}, // PUR | |
| 1201 { 0, 0, 53, 75}, // PUR|PL | |
| 1202 { 0,128, 0, 0}, // PU | |
| 1203 { 0, 64, 0, 64}, // PU|PL | |
| 1204 { 0,128, 0, 0}, // PU|PUR | |
| 1205 { 0, 0, 53, 75}, // PU|PUR|PL | |
| 1206 {128, 0, 0, 0}, // PUL | |
| 1207 { 0, 0, 0,128}, // PUL|PL | |
| 1208 { 64, 0, 64, 0}, // PUL|PUR | |
| 1209 { 0, 0, 53, 75}, // PUL|PUR|PL | |
| 1210 { 0,128, 0, 0}, // PUL|PU | |
| 1211 {-104,116, 0,116}, // PUL|PU|PL | |
| 1212 { 24, 80, 24, 0}, // PUL|PU|PUR | |
| 1213 {-104,116, 0,116} // PUL|PU|PUR|PL | |
| 1224 | 1214 }; |
| 1215 | |
| 1216 /* This table shows which types of blocks can use other blocks for | |
| 1217 * prediction. For example, INTRA is the only mode in this table to | |
| 1218 * have a frame number of 0. That means INTRA blocks can only predict | |
| 2967 | 1219 * from other INTRA blocks. There are 2 golden frame coding types; |
| 1224 | 1220 * blocks encoding in these modes can only predict from other blocks |
| 1221 * that were encoded with these 1 of these 2 modes. */ | |
| 1222 unsigned char compatible_frame[8] = { | |
| 1223 1, /* MODE_INTER_NO_MV */ | |
| 1224 0, /* MODE_INTRA */ | |
| 1225 1, /* MODE_INTER_PLUS_MV */ | |
| 1226 1, /* MODE_INTER_LAST_MV */ | |
| 1227 1, /* MODE_INTER_PRIOR_MV */ | |
| 1228 2, /* MODE_USING_GOLDEN */ | |
| 1229 2, /* MODE_GOLDEN_MV */ | |
| 1230 1 /* MODE_INTER_FOUR_MV */ | |
| 1231 }; | |
| 1232 int current_frame_type; | |
| 1233 | |
| 1234 /* there is a last DC predictor for each of the 3 frame types */ | |
| 1235 short last_dc[3]; | |
| 1236 | |
| 1237 int transform = 0; | |
| 1238 | |
| 1239 vul = vu = vur = vl = 0; | |
| 1240 last_dc[0] = last_dc[1] = last_dc[2] = 0; | |
| 1241 | |
| 1242 /* for each fragment row... */ | |
| 1243 for (y = 0; y < fragment_height; y++) { | |
| 1244 | |
| 1245 /* for each fragment in a row... */ | |
| 1246 for (x = 0; x < fragment_width; x++, i++) { | |
| 1247 | |
| 1248 /* reverse prediction if this block was coded */ | |
| 1249 if (s->all_fragments[i].coding_method != MODE_COPY) { | |
| 1250 | |
| 2967 | 1251 current_frame_type = |
| 1224 | 1252 compatible_frame[s->all_fragments[i].coding_method]; |
| 3500 | 1253 |
| 1254 transform= 0; | |
| 1255 if(x){ | |
| 1256 l= i-1; | |
|
2714
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
1257 vl = DC_COEFF(l); |
| 3501 | 1258 if(FRAME_CODED(l) && COMPATIBLE_FRAME(l)) |
| 1259 transform |= PL; | |
| 3500 | 1260 } |
| 1261 if(y){ | |
| 1262 u= i-fragment_width; | |
|
2714
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
1263 vu = DC_COEFF(u); |
| 3501 | 1264 if(FRAME_CODED(u) && COMPATIBLE_FRAME(u)) |
| 1265 transform |= PU; | |
| 3500 | 1266 if(x){ |
| 1267 ul= i-fragment_width-1; | |
| 1268 vul = DC_COEFF(ul); | |
| 3501 | 1269 if(FRAME_CODED(ul) && COMPATIBLE_FRAME(ul)) |
| 1270 transform |= PUL; | |
| 3500 | 1271 } |
| 1272 if(x + 1 < fragment_width){ | |
| 1273 ur= i-fragment_width+1; | |
| 1274 vur = DC_COEFF(ur); | |
| 3501 | 1275 if(FRAME_CODED(ur) && COMPATIBLE_FRAME(ur)) |
| 1276 transform |= PUR; | |
| 3500 | 1277 } |
| 1224 | 1278 } |
| 1279 | |
| 1280 if (transform == 0) { | |
| 1281 | |
| 1282 /* if there were no fragments to predict from, use last | |
| 1283 * DC saved */ | |
|
2714
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
1284 predicted_dc = last_dc[current_frame_type]; |
| 1224 | 1285 } else { |
| 1286 | |
| 1287 /* apply the appropriate predictor transform */ | |
| 1288 predicted_dc = | |
| 1289 (predictor_transform[transform][0] * vul) + | |
| 1290 (predictor_transform[transform][1] * vu) + | |
| 1291 (predictor_transform[transform][2] * vur) + | |
| 1292 (predictor_transform[transform][3] * vl); | |
| 1293 | |
| 3502 | 1294 predicted_dc /= 128; |
| 1224 | 1295 |
| 1296 /* check for outranging on the [ul u l] and | |
| 1297 * [ul u ur l] predictors */ | |
| 1298 if ((transform == 13) || (transform == 15)) { | |
| 4001 | 1299 if (FFABS(predicted_dc - vu) > 128) |
| 1224 | 1300 predicted_dc = vu; |
| 4001 | 1301 else if (FFABS(predicted_dc - vl) > 128) |
| 1224 | 1302 predicted_dc = vl; |
| 4001 | 1303 else if (FFABS(predicted_dc - vul) > 128) |
| 1224 | 1304 predicted_dc = vul; |
| 1305 } | |
| 1306 } | |
| 1307 | |
|
2714
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
1308 /* at long last, apply the predictor */ |
|
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
1309 if(s->coeffs[i].index){ |
|
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
1310 *s->next_coeff= s->coeffs[i]; |
|
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
1311 s->coeffs[i].index=0; |
|
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
1312 s->coeffs[i].coeff=0; |
|
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
1313 s->coeffs[i].next= s->next_coeff++; |
|
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
1314 } |
|
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
1315 s->coeffs[i].coeff += predicted_dc; |
| 1224 | 1316 /* save the DC */ |
|
2714
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
1317 last_dc[current_frame_type] = DC_COEFF(i); |
|
7037
480faa9f79dd
Almost-cosmetics: split out coeff_count from all_fragments struct into
reimar
parents:
6903
diff
changeset
|
1318 if(DC_COEFF(i) && !(s->coeff_counts[i]&127)){ |
|
480faa9f79dd
Almost-cosmetics: split out coeff_count from all_fragments struct into
reimar
parents:
6903
diff
changeset
|
1319 s->coeff_counts[i]= 129; |
|
2714
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
1320 // s->all_fragments[i].next_coeff= s->next_coeff; |
|
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
1321 s->coeffs[i].next= s->next_coeff; |
|
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
1322 (s->next_coeff++)->next=NULL; |
|
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
1323 } |
| 1224 | 1324 } |
| 1325 } | |
| 1326 } | |
| 1327 } | |
| 1328 | |
| 1329 /* | |
| 2722 | 1330 * Perform the final rendering for a particular slice of data. |
| 1331 * The slice number ranges from 0..(macroblock_height - 1). | |
| 1332 */ | |
| 1333 static void render_slice(Vp3DecodeContext *s, int slice) | |
| 1334 { | |
| 3498 | 1335 int x; |
| 2722 | 1336 int16_t *dequantizer; |
| 3089 | 1337 DECLARE_ALIGNED_16(DCTELEM, block[64]); |
| 2722 | 1338 int motion_x = 0xdeadbeef, motion_y = 0xdeadbeef; |
| 1339 int motion_halfpel_index; | |
| 1340 uint8_t *motion_source; | |
| 1341 int plane; | |
| 1342 int current_macroblock_entry = slice * s->macroblock_width * 6; | |
| 1343 | |
| 1344 if (slice >= s->macroblock_height) | |
| 1345 return; | |
| 1346 | |
| 1347 for (plane = 0; plane < 3; plane++) { | |
| 3498 | 1348 uint8_t *output_plane = s->current_frame.data [plane]; |
| 1349 uint8_t * last_plane = s-> last_frame.data [plane]; | |
| 1350 uint8_t *golden_plane = s-> golden_frame.data [plane]; | |
| 1351 int stride = s->current_frame.linesize[plane]; | |
| 1352 int plane_width = s->width >> !!plane; | |
| 1353 int plane_height = s->height >> !!plane; | |
| 1354 int y = slice * FRAGMENT_PIXELS << !plane ; | |
| 1355 int slice_height = y + (FRAGMENT_PIXELS << !plane); | |
| 1356 int i = s->macroblock_fragments[current_macroblock_entry + plane + 3*!!plane]; | |
| 1357 | |
| 1358 if (!s->flipped_image) stride = -stride; | |
| 1359 | |
| 2967 | 1360 |
| 4001 | 1361 if(FFABS(stride) > 2048) |
| 2722 | 1362 return; //various tables are fixed size |
| 1363 | |
| 1364 /* for each fragment row in the slice (both of them)... */ | |
| 1365 for (; y < slice_height; y += 8) { | |
| 1366 | |
| 1367 /* for each fragment in a row... */ | |
| 1368 for (x = 0; x < plane_width; x += 8, i++) { | |
| 1369 | |
| 1370 if ((i < 0) || (i >= s->fragment_count)) { | |
| 1371 av_log(s->avctx, AV_LOG_ERROR, " vp3:render_slice(): bad fragment number (%d)\n", i); | |
| 1372 return; | |
| 1373 } | |
| 1374 | |
| 1375 /* transform if this block was coded */ | |
| 1376 if ((s->all_fragments[i].coding_method != MODE_COPY) && | |
| 1377 !((s->avctx->flags & CODEC_FLAG_GRAY) && plane)) { | |
| 1378 | |
| 1379 if ((s->all_fragments[i].coding_method == MODE_USING_GOLDEN) || | |
| 1380 (s->all_fragments[i].coding_method == MODE_GOLDEN_MV)) | |
| 1381 motion_source= golden_plane; | |
| 2967 | 1382 else |
| 2722 | 1383 motion_source= last_plane; |
| 1384 | |
| 1385 motion_source += s->all_fragments[i].first_pixel; | |
| 1386 motion_halfpel_index = 0; | |
| 1387 | |
| 1388 /* sort out the motion vector if this fragment is coded | |
| 1389 * using a motion vector method */ | |
| 1390 if ((s->all_fragments[i].coding_method > MODE_INTRA) && | |
| 1391 (s->all_fragments[i].coding_method != MODE_USING_GOLDEN)) { | |
| 1392 int src_x, src_y; | |
| 1393 motion_x = s->all_fragments[i].motion_x; | |
| 1394 motion_y = s->all_fragments[i].motion_y; | |
| 1395 if(plane){ | |
| 1396 motion_x= (motion_x>>1) | (motion_x&1); | |
| 1397 motion_y= (motion_y>>1) | (motion_y&1); | |
| 1398 } | |
| 1399 | |
| 1400 src_x= (motion_x>>1) + x; | |
| 1401 src_y= (motion_y>>1) + y; | |
| 1402 if ((motion_x == 127) || (motion_y == 127)) | |
| 1403 av_log(s->avctx, AV_LOG_ERROR, " help! got invalid motion vector! (%X, %X)\n", motion_x, motion_y); | |
| 1404 | |
| 1405 motion_halfpel_index = motion_x & 0x01; | |
| 1406 motion_source += (motion_x >> 1); | |
| 1407 | |
| 1408 motion_halfpel_index |= (motion_y & 0x01) << 1; | |
| 1409 motion_source += ((motion_y >> 1) * stride); | |
| 1410 | |
| 1411 if(src_x<0 || src_y<0 || src_x + 9 >= plane_width || src_y + 9 >= plane_height){ | |
| 1412 uint8_t *temp= s->edge_emu_buffer; | |
| 1413 if(stride<0) temp -= 9*stride; | |
| 1414 else temp += 9*stride; | |
| 1415 | |
| 1416 ff_emulated_edge_mc(temp, motion_source, stride, 9, 9, src_x, src_y, plane_width, plane_height); | |
| 1417 motion_source= temp; | |
| 1418 } | |
| 1419 } | |
| 2967 | 1420 |
| 2722 | 1421 |
| 1422 /* first, take care of copying a block from either the | |
| 1423 * previous or the golden frame */ | |
| 1424 if (s->all_fragments[i].coding_method != MODE_INTRA) { | |
| 2967 | 1425 /* Note, it is possible to implement all MC cases with |
| 1426 put_no_rnd_pixels_l2 which would look more like the | |
| 1427 VP3 source but this would be slower as | |
| 2722 | 1428 put_no_rnd_pixels_tab is better optimzed */ |
| 1429 if(motion_halfpel_index != 3){ | |
| 1430 s->dsp.put_no_rnd_pixels_tab[1][motion_halfpel_index]( | |
| 1431 output_plane + s->all_fragments[i].first_pixel, | |
| 1432 motion_source, stride, 8); | |
| 1433 }else{ | |
| 1434 int d= (motion_x ^ motion_y)>>31; // d is 0 if motion_x and _y have the same sign, else -1 | |
| 1435 s->dsp.put_no_rnd_pixels_l2[1]( | |
| 1436 output_plane + s->all_fragments[i].first_pixel, | |
| 2967 | 1437 motion_source - d, |
| 1438 motion_source + stride + 1 + d, | |
| 2722 | 1439 stride, 8); |
| 1440 } | |
| 9731 | 1441 dequantizer = s->qmat[s->all_fragments[i].qpi][1][plane]; |
| 2722 | 1442 }else{ |
| 9731 | 1443 dequantizer = s->qmat[s->all_fragments[i].qpi][0][plane]; |
| 2722 | 1444 } |
| 1445 | |
| 1446 /* dequantize the DCT coefficients */ | |
| 1447 if(s->avctx->idct_algo==FF_IDCT_VP3){ | |
| 1448 Coeff *coeff= s->coeffs + i; | |
| 8288 | 1449 s->dsp.clear_block(block); |
| 2722 | 1450 while(coeff->next){ |
| 1451 block[coeff->index]= coeff->coeff * dequantizer[coeff->index]; | |
| 1452 coeff= coeff->next; | |
| 1453 } | |
| 1454 }else{ | |
| 1455 Coeff *coeff= s->coeffs + i; | |
| 8288 | 1456 s->dsp.clear_block(block); |
| 2722 | 1457 while(coeff->next){ |
| 1458 block[coeff->index]= (coeff->coeff * dequantizer[coeff->index] + 2)>>2; | |
| 1459 coeff= coeff->next; | |
| 1460 } | |
| 1461 } | |
| 1462 | |
| 1463 /* invert DCT and place (or add) in final output */ | |
| 2967 | 1464 |
| 2722 | 1465 if (s->all_fragments[i].coding_method == MODE_INTRA) { |
| 1466 if(s->avctx->idct_algo!=FF_IDCT_VP3) | |
| 1467 block[0] += 128<<3; | |
| 1468 s->dsp.idct_put( | |
| 1469 output_plane + s->all_fragments[i].first_pixel, | |
| 1470 stride, | |
| 1471 block); | |
| 1472 } else { | |
| 1473 s->dsp.idct_add( | |
| 1474 output_plane + s->all_fragments[i].first_pixel, | |
| 1475 stride, | |
| 1476 block); | |
| 1477 } | |
| 1478 } else { | |
| 1479 | |
| 1480 /* copy directly from the previous frame */ | |
| 1481 s->dsp.put_pixels_tab[1][0]( | |
| 1482 output_plane + s->all_fragments[i].first_pixel, | |
| 1483 last_plane + s->all_fragments[i].first_pixel, | |
| 1484 stride, 8); | |
| 1485 | |
| 1486 } | |
| 2724 | 1487 #if 0 |
|
2726
77ba1f653619
fix bugs in new loop filter code; also, refrain from filtering against
melanson
parents:
2724
diff
changeset
|
1488 /* perform the left edge filter if: |
|
77ba1f653619
fix bugs in new loop filter code; also, refrain from filtering against
melanson
parents:
2724
diff
changeset
|
1489 * - the fragment is not on the left column |
|
77ba1f653619
fix bugs in new loop filter code; also, refrain from filtering against
melanson
parents:
2724
diff
changeset
|
1490 * - the fragment is coded in this frame |
|
77ba1f653619
fix bugs in new loop filter code; also, refrain from filtering against
melanson
parents:
2724
diff
changeset
|
1491 * - the fragment is not coded in this frame but the left |
|
77ba1f653619
fix bugs in new loop filter code; also, refrain from filtering against
melanson
parents:
2724
diff
changeset
|
1492 * fragment is coded in this frame (this is done instead |
|
77ba1f653619
fix bugs in new loop filter code; also, refrain from filtering against
melanson
parents:
2724
diff
changeset
|
1493 * of a right edge filter when rendering the left fragment |
|
77ba1f653619
fix bugs in new loop filter code; also, refrain from filtering against
melanson
parents:
2724
diff
changeset
|
1494 * since this fragment is not available yet) */ |
|
2723
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
1495 if ((x > 0) && |
|
2726
77ba1f653619
fix bugs in new loop filter code; also, refrain from filtering against
melanson
parents:
2724
diff
changeset
|
1496 ((s->all_fragments[i].coding_method != MODE_COPY) || |
|
77ba1f653619
fix bugs in new loop filter code; also, refrain from filtering against
melanson
parents:
2724
diff
changeset
|
1497 ((s->all_fragments[i].coding_method == MODE_COPY) && |
|
77ba1f653619
fix bugs in new loop filter code; also, refrain from filtering against
melanson
parents:
2724
diff
changeset
|
1498 (s->all_fragments[i - 1].coding_method != MODE_COPY)) )) { |
|
2723
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
1499 horizontal_filter( |
|
2726
77ba1f653619
fix bugs in new loop filter code; also, refrain from filtering against
melanson
parents:
2724
diff
changeset
|
1500 output_plane + s->all_fragments[i].first_pixel + 7*stride, |
| 3497 | 1501 -stride, s->bounding_values_array + 127); |
|
2723
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
1502 } |
|
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
1503 |
|
2726
77ba1f653619
fix bugs in new loop filter code; also, refrain from filtering against
melanson
parents:
2724
diff
changeset
|
1504 /* perform the top edge filter if: |
|
77ba1f653619
fix bugs in new loop filter code; also, refrain from filtering against
melanson
parents:
2724
diff
changeset
|
1505 * - the fragment is not on the top row |
|
77ba1f653619
fix bugs in new loop filter code; also, refrain from filtering against
melanson
parents:
2724
diff
changeset
|
1506 * - the fragment is coded in this frame |
|
77ba1f653619
fix bugs in new loop filter code; also, refrain from filtering against
melanson
parents:
2724
diff
changeset
|
1507 * - the fragment is not coded in this frame but the above |
|
77ba1f653619
fix bugs in new loop filter code; also, refrain from filtering against
melanson
parents:
2724
diff
changeset
|
1508 * fragment is coded in this frame (this is done instead |
|
77ba1f653619
fix bugs in new loop filter code; also, refrain from filtering against
melanson
parents:
2724
diff
changeset
|
1509 * of a bottom edge filter when rendering the above |
|
77ba1f653619
fix bugs in new loop filter code; also, refrain from filtering against
melanson
parents:
2724
diff
changeset
|
1510 * fragment since this fragment is not available yet) */ |
|
77ba1f653619
fix bugs in new loop filter code; also, refrain from filtering against
melanson
parents:
2724
diff
changeset
|
1511 if ((y > 0) && |
|
77ba1f653619
fix bugs in new loop filter code; also, refrain from filtering against
melanson
parents:
2724
diff
changeset
|
1512 ((s->all_fragments[i].coding_method != MODE_COPY) || |
|
77ba1f653619
fix bugs in new loop filter code; also, refrain from filtering against
melanson
parents:
2724
diff
changeset
|
1513 ((s->all_fragments[i].coding_method == MODE_COPY) && |
|
77ba1f653619
fix bugs in new loop filter code; also, refrain from filtering against
melanson
parents:
2724
diff
changeset
|
1514 (s->all_fragments[i - fragment_width].coding_method != MODE_COPY)) )) { |
|
2723
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
1515 vertical_filter( |
|
2726
77ba1f653619
fix bugs in new loop filter code; also, refrain from filtering against
melanson
parents:
2724
diff
changeset
|
1516 output_plane + s->all_fragments[i].first_pixel - stride, |
| 3497 | 1517 -stride, s->bounding_values_array + 127); |
|
2723
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
1518 } |
| 2724 | 1519 #endif |
| 2722 | 1520 } |
| 1521 } | |
| 1522 } | |
| 1523 | |
| 1524 /* this looks like a good place for slice dispatch... */ | |
| 1525 /* algorithm: | |
|
2723
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
1526 * if (slice == s->macroblock_height - 1) |
|
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
1527 * dispatch (both last slice & 2nd-to-last slice); |
|
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
1528 * else if (slice > 0) |
| 2722 | 1529 * dispatch (slice - 1); |
| 1530 */ | |
| 1531 | |
| 1532 emms_c(); | |
| 1533 } | |
| 1534 | |
|
2531
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1535 static void apply_loop_filter(Vp3DecodeContext *s) |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1536 { |
| 3498 | 1537 int plane; |
| 1538 int x, y; | |
|
2723
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
1539 int *bounding_values= s->bounding_values_array+127; |
|
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
1540 |
|
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
1541 #if 0 |
| 2686 | 1542 int bounding_values_array[256]; |
|
2531
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1543 int filter_limit; |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1544 |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1545 /* find the right loop limit value */ |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1546 for (x = 63; x >= 0; x--) { |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1547 if (vp31_ac_scale_factor[x] >= s->quality_index) |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1548 break; |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1549 } |
| 2686 | 1550 filter_limit = vp31_filter_limit_values[s->quality_index]; |
|
2531
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1551 |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1552 /* set up the bounding values */ |
| 2686 | 1553 memset(bounding_values_array, 0, 256 * sizeof(int)); |
|
2531
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1554 for (x = 0; x < filter_limit; x++) { |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1555 bounding_values[-x - filter_limit] = -filter_limit + x; |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1556 bounding_values[-x] = -x; |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1557 bounding_values[x] = x; |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1558 bounding_values[x + filter_limit] = filter_limit - x; |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1559 } |
|
2723
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
1560 #endif |
|
2531
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1561 |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1562 for (plane = 0; plane < 3; plane++) { |
| 3498 | 1563 int width = s->fragment_width >> !!plane; |
| 1564 int height = s->fragment_height >> !!plane; | |
| 1565 int fragment = s->fragment_start [plane]; | |
| 1566 int stride = s->current_frame.linesize[plane]; | |
| 1567 uint8_t *plane_data = s->current_frame.data [plane]; | |
| 3497 | 1568 if (!s->flipped_image) stride = -stride; |
|
2531
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1569 |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1570 for (y = 0; y < height; y++) { |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1571 |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1572 for (x = 0; x < width; x++) { |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1573 /* do not perform left edge filter for left columns frags */ |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1574 if ((x > 0) && |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1575 (s->all_fragments[fragment].coding_method != MODE_COPY)) { |
| 7995 | 1576 s->dsp.vp3_h_loop_filter( |
| 3497 | 1577 plane_data + s->all_fragments[fragment].first_pixel, |
|
2531
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1578 stride, bounding_values); |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1579 } |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1580 |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1581 /* do not perform top edge filter for top row fragments */ |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1582 if ((y > 0) && |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1583 (s->all_fragments[fragment].coding_method != MODE_COPY)) { |
| 7995 | 1584 s->dsp.vp3_v_loop_filter( |
| 3497 | 1585 plane_data + s->all_fragments[fragment].first_pixel, |
|
2531
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1586 stride, bounding_values); |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1587 } |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1588 |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1589 /* do not perform right edge filter for right column |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1590 * fragments or if right fragment neighbor is also coded |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1591 * in this frame (it will be filtered in next iteration) */ |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1592 if ((x < width - 1) && |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1593 (s->all_fragments[fragment].coding_method != MODE_COPY) && |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1594 (s->all_fragments[fragment + 1].coding_method == MODE_COPY)) { |
| 7995 | 1595 s->dsp.vp3_h_loop_filter( |
| 3497 | 1596 plane_data + s->all_fragments[fragment + 1].first_pixel, |
|
2531
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1597 stride, bounding_values); |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1598 } |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1599 |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1600 /* do not perform bottom edge filter for bottom row |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1601 * fragments or if bottom fragment neighbor is also coded |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1602 * in this frame (it will be filtered in the next row) */ |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1603 if ((y < height - 1) && |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1604 (s->all_fragments[fragment].coding_method != MODE_COPY) && |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1605 (s->all_fragments[fragment + width].coding_method == MODE_COPY)) { |
| 7995 | 1606 s->dsp.vp3_v_loop_filter( |
| 3497 | 1607 plane_data + s->all_fragments[fragment + width].first_pixel, |
|
2531
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1608 stride, bounding_values); |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1609 } |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1610 |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1611 fragment++; |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1612 } |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1613 } |
|
eed7d92a1dfc
VP3 post-processing loop filter; disabled until the correct final step
melanson
parents:
2466
diff
changeset
|
1614 } |
| 1224 | 1615 } |
| 1616 | |
| 2967 | 1617 /* |
| 1224 | 1618 * This function computes the first pixel addresses for each fragment. |
| 1619 * This function needs to be invoked after the first frame is allocated | |
| 1620 * so that it has access to the plane strides. | |
| 1621 */ | |
| 2967 | 1622 static void vp3_calculate_pixel_addresses(Vp3DecodeContext *s) |
| 1224 | 1623 { |
| 7960 | 1624 #define Y_INITIAL(chroma_shift) s->flipped_image ? 1 : s->fragment_height >> chroma_shift |
| 1625 #define Y_FINISHED(chroma_shift) s->flipped_image ? y <= s->fragment_height >> chroma_shift : y > 0 | |
| 1224 | 1626 |
| 1627 int i, x, y; | |
| 7960 | 1628 const int y_inc = s->flipped_image ? 1 : -1; |
| 1224 | 1629 |
| 1630 /* figure out the first pixel addresses for each of the fragments */ | |
| 1631 /* Y plane */ | |
| 1632 i = 0; | |
| 7960 | 1633 for (y = Y_INITIAL(0); Y_FINISHED(0); y += y_inc) { |
| 1224 | 1634 for (x = 0; x < s->fragment_width; x++) { |
| 2967 | 1635 s->all_fragments[i++].first_pixel = |
| 1224 | 1636 s->golden_frame.linesize[0] * y * FRAGMENT_PIXELS - |
| 1637 s->golden_frame.linesize[0] + | |
| 1638 x * FRAGMENT_PIXELS; | |
| 1639 } | |
| 1640 } | |
| 1641 | |
| 1642 /* U plane */ | |
| 3498 | 1643 i = s->fragment_start[1]; |
| 7960 | 1644 for (y = Y_INITIAL(1); Y_FINISHED(1); y += y_inc) { |
| 1224 | 1645 for (x = 0; x < s->fragment_width / 2; x++) { |
| 2967 | 1646 s->all_fragments[i++].first_pixel = |
| 1224 | 1647 s->golden_frame.linesize[1] * y * FRAGMENT_PIXELS - |
| 1648 s->golden_frame.linesize[1] + | |
| 1649 x * FRAGMENT_PIXELS; | |
| 1650 } | |
| 1651 } | |
| 1652 | |
| 1653 /* V plane */ | |
| 3498 | 1654 i = s->fragment_start[2]; |
| 7960 | 1655 for (y = Y_INITIAL(1); Y_FINISHED(1); y += y_inc) { |
|
1626
f74ae637ffa9
finally working with old theora bitstream (flipped image), the only sample I have is decoded successfully (theora.ogg)
alex
parents:
1598
diff
changeset
|
1656 for (x = 0; x < s->fragment_width / 2; x++) { |
| 2967 | 1657 s->all_fragments[i++].first_pixel = |
|
1626
f74ae637ffa9
finally working with old theora bitstream (flipped image), the only sample I have is decoded successfully (theora.ogg)
alex
parents:
1598
diff
changeset
|
1658 s->golden_frame.linesize[2] * y * FRAGMENT_PIXELS - |
|
f74ae637ffa9
finally working with old theora bitstream (flipped image), the only sample I have is decoded successfully (theora.ogg)
alex
parents:
1598
diff
changeset
|
1659 s->golden_frame.linesize[2] + |
|
f74ae637ffa9
finally working with old theora bitstream (flipped image), the only sample I have is decoded successfully (theora.ogg)
alex
parents:
1598
diff
changeset
|
1660 x * FRAGMENT_PIXELS; |
|
f74ae637ffa9
finally working with old theora bitstream (flipped image), the only sample I have is decoded successfully (theora.ogg)
alex
parents:
1598
diff
changeset
|
1661 } |
|
f74ae637ffa9
finally working with old theora bitstream (flipped image), the only sample I have is decoded successfully (theora.ogg)
alex
parents:
1598
diff
changeset
|
1662 } |
|
f74ae637ffa9
finally working with old theora bitstream (flipped image), the only sample I have is decoded successfully (theora.ogg)
alex
parents:
1598
diff
changeset
|
1663 } |
|
f74ae637ffa9
finally working with old theora bitstream (flipped image), the only sample I have is decoded successfully (theora.ogg)
alex
parents:
1598
diff
changeset
|
1664 |
| 1224 | 1665 /* |
| 1666 * This is the ffmpeg/libavcodec API init function. | |
| 1667 */ | |
|
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6448
diff
changeset
|
1668 static av_cold int vp3_decode_init(AVCodecContext *avctx) |
| 1224 | 1669 { |
| 1670 Vp3DecodeContext *s = avctx->priv_data; | |
|
3489
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
1671 int i, inter, plane; |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
1672 int c_width; |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
1673 int c_height; |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
1674 int y_superblock_count; |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
1675 int c_superblock_count; |
| 1224 | 1676 |
| 1664 | 1677 if (avctx->codec_tag == MKTAG('V','P','3','0')) |
| 2979 | 1678 s->version = 0; |
| 1664 | 1679 else |
| 2979 | 1680 s->version = 1; |
| 1664 | 1681 |
| 1224 | 1682 s->avctx = avctx; |
|
9686
bc32976d6d9d
Move ALIGN macro to libavutil/common.h and use it in various places
conrad
parents:
9637
diff
changeset
|
1683 s->width = FFALIGN(avctx->width, 16); |
|
bc32976d6d9d
Move ALIGN macro to libavutil/common.h and use it in various places
conrad
parents:
9637
diff
changeset
|
1684 s->height = FFALIGN(avctx->height, 16); |
| 1224 | 1685 avctx->pix_fmt = PIX_FMT_YUV420P; |
|
9626
bd3e11b60ccd
Add a chroma_sample_location field to define positioning of chroma samples
conrad
parents:
9591
diff
changeset
|
1686 avctx->chroma_sample_location = AVCHROMA_LOC_CENTER; |
| 2693 | 1687 if(avctx->idct_algo==FF_IDCT_AUTO) |
| 1688 avctx->idct_algo=FF_IDCT_VP3; | |
| 1224 | 1689 dsputil_init(&s->dsp, avctx); |
| 2967 | 1690 |
| 2694 | 1691 ff_init_scantable(s->dsp.idct_permutation, &s->scantable, ff_zigzag_direct); |
| 1224 | 1692 |
| 1693 /* initialize to an impossible value which will force a recalculation | |
| 1694 * in the first frame decode */ | |
| 9731 | 1695 for (i = 0; i < 3; i++) |
| 1696 s->qps[i] = -1; | |
| 1224 | 1697 |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
1698 s->y_superblock_width = (s->width + 31) / 32; |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
1699 s->y_superblock_height = (s->height + 31) / 32; |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
1700 y_superblock_count = s->y_superblock_width * s->y_superblock_height; |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
1701 |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
1702 /* work out the dimensions for the C planes */ |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
1703 c_width = s->width / 2; |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
1704 c_height = s->height / 2; |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
1705 s->c_superblock_width = (c_width + 31) / 32; |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
1706 s->c_superblock_height = (c_height + 31) / 32; |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
1707 c_superblock_count = s->c_superblock_width * s->c_superblock_height; |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
1708 |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
1709 s->superblock_count = y_superblock_count + (c_superblock_count * 2); |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
1710 s->u_superblock_start = y_superblock_count; |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
1711 s->v_superblock_start = s->u_superblock_start + c_superblock_count; |
| 1224 | 1712 s->superblock_coding = av_malloc(s->superblock_count); |
| 1713 | |
| 1714 s->macroblock_width = (s->width + 15) / 16; | |
| 1715 s->macroblock_height = (s->height + 15) / 16; | |
| 1716 s->macroblock_count = s->macroblock_width * s->macroblock_height; | |
| 1717 | |
| 1718 s->fragment_width = s->width / FRAGMENT_PIXELS; | |
| 1719 s->fragment_height = s->height / FRAGMENT_PIXELS; | |
| 1720 | |
| 1721 /* fragment count covers all 8x8 blocks for all 3 planes */ | |
| 1722 s->fragment_count = s->fragment_width * s->fragment_height * 3 / 2; | |
| 3498 | 1723 s->fragment_start[1] = s->fragment_width * s->fragment_height; |
| 1724 s->fragment_start[2] = s->fragment_width * s->fragment_height * 5 / 4; | |
| 1224 | 1725 |
| 1726 s->all_fragments = av_malloc(s->fragment_count * sizeof(Vp3Fragment)); | |
|
7037
480faa9f79dd
Almost-cosmetics: split out coeff_count from all_fragments struct into
reimar
parents:
6903
diff
changeset
|
1727 s->coeff_counts = av_malloc(s->fragment_count * sizeof(*s->coeff_counts)); |
|
2714
b008c78467e6
use O(number of non zero coeffs) instead of O(number of coeffs) storage for the coefficient colleting/reordering
michael
parents:
2712
diff
changeset
|
1728 s->coeffs = av_malloc(s->fragment_count * sizeof(Coeff) * 65); |
| 1224 | 1729 s->coded_fragment_list = av_malloc(s->fragment_count * sizeof(int)); |
| 6350 | 1730 s->pixel_addresses_initialized = 0; |
| 1224 | 1731 |
|
1516
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
1732 if (!s->theora_tables) |
|
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
1733 { |
| 3585 | 1734 for (i = 0; i < 64; i++) { |
| 2979 | 1735 s->coded_dc_scale_factor[i] = vp31_dc_scale_factor[i]; |
| 1736 s->coded_ac_scale_factor[i] = vp31_ac_scale_factor[i]; | |
|
3489
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
1737 s->base_matrix[0][i] = vp31_intra_y_dequant[i]; |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
1738 s->base_matrix[1][i] = vp31_intra_c_dequant[i]; |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
1739 s->base_matrix[2][i] = vp31_inter_dequant[i]; |
| 2979 | 1740 s->filter_limit_values[i] = vp31_filter_limit_values[i]; |
| 3585 | 1741 } |
|
2718
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1742 |
|
3489
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
1743 for(inter=0; inter<2; inter++){ |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
1744 for(plane=0; plane<3; plane++){ |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
1745 s->qr_count[inter][plane]= 1; |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
1746 s->qr_size [inter][plane][0]= 63; |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
1747 s->qr_base [inter][plane][0]= |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
1748 s->qr_base [inter][plane][1]= 2*inter + (!!plane)*!inter; |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
1749 } |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
1750 } |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
1751 |
|
2718
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1752 /* init VLC tables */ |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1753 for (i = 0; i < 16; i++) { |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1754 |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1755 /* DC histograms */ |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1756 init_vlc(&s->dc_vlc[i], 5, 32, |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1757 &dc_bias[i][0][1], 4, 2, |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1758 &dc_bias[i][0][0], 4, 2, 0); |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1759 |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1760 /* group 1 AC histograms */ |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1761 init_vlc(&s->ac_vlc_1[i], 5, 32, |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1762 &ac_bias_0[i][0][1], 4, 2, |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1763 &ac_bias_0[i][0][0], 4, 2, 0); |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1764 |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1765 /* group 2 AC histograms */ |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1766 init_vlc(&s->ac_vlc_2[i], 5, 32, |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1767 &ac_bias_1[i][0][1], 4, 2, |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1768 &ac_bias_1[i][0][0], 4, 2, 0); |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1769 |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1770 /* group 3 AC histograms */ |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1771 init_vlc(&s->ac_vlc_3[i], 5, 32, |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1772 &ac_bias_2[i][0][1], 4, 2, |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1773 &ac_bias_2[i][0][0], 4, 2, 0); |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1774 |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1775 /* group 4 AC histograms */ |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1776 init_vlc(&s->ac_vlc_4[i], 5, 32, |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1777 &ac_bias_3[i][0][1], 4, 2, |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1778 &ac_bias_3[i][0][0], 4, 2, 0); |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1779 } |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1780 } else { |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1781 for (i = 0; i < 16; i++) { |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1782 |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1783 /* DC histograms */ |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1784 init_vlc(&s->dc_vlc[i], 5, 32, |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1785 &s->huffman_table[i][0][1], 4, 2, |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1786 &s->huffman_table[i][0][0], 4, 2, 0); |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1787 |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1788 /* group 1 AC histograms */ |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1789 init_vlc(&s->ac_vlc_1[i], 5, 32, |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1790 &s->huffman_table[i+16][0][1], 4, 2, |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1791 &s->huffman_table[i+16][0][0], 4, 2, 0); |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1792 |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1793 /* group 2 AC histograms */ |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1794 init_vlc(&s->ac_vlc_2[i], 5, 32, |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1795 &s->huffman_table[i+16*2][0][1], 4, 2, |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1796 &s->huffman_table[i+16*2][0][0], 4, 2, 0); |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1797 |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1798 /* group 3 AC histograms */ |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1799 init_vlc(&s->ac_vlc_3[i], 5, 32, |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1800 &s->huffman_table[i+16*3][0][1], 4, 2, |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1801 &s->huffman_table[i+16*3][0][0], 4, 2, 0); |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1802 |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1803 /* group 4 AC histograms */ |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1804 init_vlc(&s->ac_vlc_4[i], 5, 32, |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1805 &s->huffman_table[i+16*4][0][1], 4, 2, |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1806 &s->huffman_table[i+16*4][0][0], 4, 2, 0); |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
1807 } |
| 1224 | 1808 } |
| 1809 | |
|
2703
3817945001ce
replace get_superblock_run_length() with a VLC table
melanson
parents:
2702
diff
changeset
|
1810 init_vlc(&s->superblock_run_length_vlc, 6, 34, |
|
3817945001ce
replace get_superblock_run_length() with a VLC table
melanson
parents:
2702
diff
changeset
|
1811 &superblock_run_length_vlc_table[0][1], 4, 2, |
|
3817945001ce
replace get_superblock_run_length() with a VLC table
melanson
parents:
2702
diff
changeset
|
1812 &superblock_run_length_vlc_table[0][0], 4, 2, 0); |
|
3817945001ce
replace get_superblock_run_length() with a VLC table
melanson
parents:
2702
diff
changeset
|
1813 |
|
2942
868c48736d1c
fixed long standing off-by-one bug (fixes playback on ppc)
alex
parents:
2866
diff
changeset
|
1814 init_vlc(&s->fragment_run_length_vlc, 5, 30, |
|
2702
5a4e5225cbb6
use VLCs for in place of get_fragment_run_length(), get_mode_code(), and
melanson
parents:
2699
diff
changeset
|
1815 &fragment_run_length_vlc_table[0][1], 4, 2, |
|
5a4e5225cbb6
use VLCs for in place of get_fragment_run_length(), get_mode_code(), and
melanson
parents:
2699
diff
changeset
|
1816 &fragment_run_length_vlc_table[0][0], 4, 2, 0); |
|
5a4e5225cbb6
use VLCs for in place of get_fragment_run_length(), get_mode_code(), and
melanson
parents:
2699
diff
changeset
|
1817 |
|
5a4e5225cbb6
use VLCs for in place of get_fragment_run_length(), get_mode_code(), and
melanson
parents:
2699
diff
changeset
|
1818 init_vlc(&s->mode_code_vlc, 3, 8, |
|
5a4e5225cbb6
use VLCs for in place of get_fragment_run_length(), get_mode_code(), and
melanson
parents:
2699
diff
changeset
|
1819 &mode_code_vlc_table[0][1], 2, 1, |
|
5a4e5225cbb6
use VLCs for in place of get_fragment_run_length(), get_mode_code(), and
melanson
parents:
2699
diff
changeset
|
1820 &mode_code_vlc_table[0][0], 2, 1, 0); |
|
5a4e5225cbb6
use VLCs for in place of get_fragment_run_length(), get_mode_code(), and
melanson
parents:
2699
diff
changeset
|
1821 |
|
5a4e5225cbb6
use VLCs for in place of get_fragment_run_length(), get_mode_code(), and
melanson
parents:
2699
diff
changeset
|
1822 init_vlc(&s->motion_vector_vlc, 6, 63, |
|
5a4e5225cbb6
use VLCs for in place of get_fragment_run_length(), get_mode_code(), and
melanson
parents:
2699
diff
changeset
|
1823 &motion_vector_vlc_table[0][1], 2, 1, |
|
5a4e5225cbb6
use VLCs for in place of get_fragment_run_length(), get_mode_code(), and
melanson
parents:
2699
diff
changeset
|
1824 &motion_vector_vlc_table[0][0], 2, 1, 0); |
|
5a4e5225cbb6
use VLCs for in place of get_fragment_run_length(), get_mode_code(), and
melanson
parents:
2699
diff
changeset
|
1825 |
| 1224 | 1826 /* work out the block mapping tables */ |
| 1827 s->superblock_fragments = av_malloc(s->superblock_count * 16 * sizeof(int)); | |
| 1828 s->superblock_macroblocks = av_malloc(s->superblock_count * 4 * sizeof(int)); | |
| 1829 s->macroblock_fragments = av_malloc(s->macroblock_count * 6 * sizeof(int)); | |
|
1240
c95ff60bc1a1
fix motion vector decoding bug and reinstate interframes
tmmm
parents:
1239
diff
changeset
|
1830 s->macroblock_coding = av_malloc(s->macroblock_count + 1); |
| 1224 | 1831 init_block_mapping(s); |
| 1832 | |
|
1229
cefec170ee46
fixed buffer allocation logic (hopefully) so that decoder does not crash
tmmm
parents:
1227
diff
changeset
|
1833 for (i = 0; i < 3; i++) { |
|
cefec170ee46
fixed buffer allocation logic (hopefully) so that decoder does not crash
tmmm
parents:
1227
diff
changeset
|
1834 s->current_frame.data[i] = NULL; |
|
cefec170ee46
fixed buffer allocation logic (hopefully) so that decoder does not crash
tmmm
parents:
1227
diff
changeset
|
1835 s->last_frame.data[i] = NULL; |
|
cefec170ee46
fixed buffer allocation logic (hopefully) so that decoder does not crash
tmmm
parents:
1227
diff
changeset
|
1836 s->golden_frame.data[i] = NULL; |
|
1227
184c480cefc3
fix decoder so that ffmpeg does not crash, at least not right away
tmmm
parents:
1224
diff
changeset
|
1837 } |
|
184c480cefc3
fix decoder so that ffmpeg does not crash, at least not right away
tmmm
parents:
1224
diff
changeset
|
1838 |
| 1224 | 1839 return 0; |
| 1840 } | |
| 1841 | |
| 1842 /* | |
| 1843 * This is the ffmpeg/libavcodec API frame decode function. | |
| 1844 */ | |
| 2967 | 1845 static int vp3_decode_frame(AVCodecContext *avctx, |
| 1224 | 1846 void *data, int *data_size, |
|
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9007
diff
changeset
|
1847 AVPacket *avpkt) |
| 1224 | 1848 { |
|
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9007
diff
changeset
|
1849 const uint8_t *buf = avpkt->data; |
|
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9007
diff
changeset
|
1850 int buf_size = avpkt->size; |
| 1224 | 1851 Vp3DecodeContext *s = avctx->priv_data; |
| 1852 GetBitContext gb; | |
| 1853 static int counter = 0; | |
| 2722 | 1854 int i; |
| 1224 | 1855 |
| 1856 init_get_bits(&gb, buf, buf_size * 8); | |
| 2967 | 1857 |
|
1516
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
1858 if (s->theora && get_bits1(&gb)) |
|
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
1859 { |
| 2979 | 1860 av_log(avctx, AV_LOG_ERROR, "Header packet passed to frame decoder, skipping\n"); |
| 1861 return -1; | |
|
1516
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
1862 } |
|
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
1863 |
|
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
1864 s->keyframe = !get_bits1(&gb); |
| 1664 | 1865 if (!s->theora) |
| 2979 | 1866 skip_bits(&gb, 1); |
| 9731 | 1867 for (i = 0; i < 3; i++) |
| 1868 s->last_qps[i] = s->qps[i]; | |
|
3492
fa3794c46f21
parse all QIS values (we still ignore them though ...)
michael
parents:
3491
diff
changeset
|
1869 |
| 9731 | 1870 s->nqps=0; |
|
3492
fa3794c46f21
parse all QIS values (we still ignore them though ...)
michael
parents:
3491
diff
changeset
|
1871 do{ |
| 9731 | 1872 s->qps[s->nqps++]= get_bits(&gb, 6); |
| 1873 } while(s->theora >= 0x030200 && s->nqps<3 && get_bits1(&gb)); | |
| 1874 for (i = s->nqps; i < 3; i++) | |
| 1875 s->qps[i] = -1; | |
| 1224 | 1876 |
| 1667 | 1877 if (s->avctx->debug & FF_DEBUG_PICT_INFO) |
| 2979 | 1878 av_log(s->avctx, AV_LOG_INFO, " VP3 %sframe #%d: Q index = %d\n", |
| 9731 | 1879 s->keyframe?"key":"", counter, s->qps[0]); |
| 1224 | 1880 counter++; |
| 1881 | |
| 9731 | 1882 if (s->qps[0] != s->last_qps[0]) |
|
2723
5ae980827158
apply the loop filter to fragments as they are rendered into the final
melanson
parents:
2722
diff
changeset
|
1883 init_loop_filter(s); |
| 9731 | 1884 |
| 1885 for (i = 0; i < s->nqps; i++) | |
| 1886 // reinit all dequantizers if the first one changed, because | |
| 1887 // the DC of the first quantizer must be used for all matrices | |
| 1888 if (s->qps[i] != s->last_qps[i] || s->qps[0] != s->last_qps[0]) | |
| 1889 init_dequantizer(s, i); | |
|
1292
f7b3fa4bb7ae
revising and fixing motion vectors, squished block unpacking bug that
tmmm
parents:
1282
diff
changeset
|
1890 |
|
7938
66226ee647a4
Use skip_frame for keyframe-only decoding rather than #ifdef
conrad
parents:
7875
diff
changeset
|
1891 if (avctx->skip_frame >= AVDISCARD_NONKEY && !s->keyframe) |
|
66226ee647a4
Use skip_frame for keyframe-only decoding rather than #ifdef
conrad
parents:
7875
diff
changeset
|
1892 return buf_size; |
|
66226ee647a4
Use skip_frame for keyframe-only decoding rather than #ifdef
conrad
parents:
7875
diff
changeset
|
1893 |
| 1224 | 1894 if (s->keyframe) { |
| 2979 | 1895 if (!s->theora) |
| 1896 { | |
| 1897 skip_bits(&gb, 4); /* width code */ | |
| 1898 skip_bits(&gb, 4); /* height code */ | |
| 1899 if (s->version) | |
| 1900 { | |
| 1901 s->version = get_bits(&gb, 5); | |
| 1902 if (counter == 1) | |
| 1903 av_log(s->avctx, AV_LOG_DEBUG, "VP version: %d\n", s->version); | |
| 1904 } | |
| 1905 } | |
| 1906 if (s->version || s->theora) | |
| 1907 { | |
| 1908 if (get_bits1(&gb)) | |
| 1909 av_log(s->avctx, AV_LOG_ERROR, "Warning, unsupported keyframe coding type?!\n"); | |
| 1910 skip_bits(&gb, 2); /* reserved? */ | |
| 1911 } | |
| 1664 | 1912 |
|
1244
a02df1ba6c7f
fix image buffer leak on keyframes, add more error condition checks
tmmm
parents:
1240
diff
changeset
|
1913 if (s->last_frame.data[0] == s->golden_frame.data[0]) { |
|
a02df1ba6c7f
fix image buffer leak on keyframes, add more error condition checks
tmmm
parents:
1240
diff
changeset
|
1914 if (s->golden_frame.data[0]) |
|
a02df1ba6c7f
fix image buffer leak on keyframes, add more error condition checks
tmmm
parents:
1240
diff
changeset
|
1915 avctx->release_buffer(avctx, &s->golden_frame); |
|
1405
e69f99ade5b0
fix AVFrame.reference (the frames are used for decoding future frames so it should be !=0)
michaelni
parents:
1355
diff
changeset
|
1916 s->last_frame= s->golden_frame; /* ensure that we catch any access to this released frame */ |
|
1244
a02df1ba6c7f
fix image buffer leak on keyframes, add more error condition checks
tmmm
parents:
1240
diff
changeset
|
1917 } else { |
|
a02df1ba6c7f
fix image buffer leak on keyframes, add more error condition checks
tmmm
parents:
1240
diff
changeset
|
1918 if (s->golden_frame.data[0]) |
|
a02df1ba6c7f
fix image buffer leak on keyframes, add more error condition checks
tmmm
parents:
1240
diff
changeset
|
1919 avctx->release_buffer(avctx, &s->golden_frame); |
|
a02df1ba6c7f
fix image buffer leak on keyframes, add more error condition checks
tmmm
parents:
1240
diff
changeset
|
1920 if (s->last_frame.data[0]) |
|
a02df1ba6c7f
fix image buffer leak on keyframes, add more error condition checks
tmmm
parents:
1240
diff
changeset
|
1921 avctx->release_buffer(avctx, &s->last_frame); |
|
a02df1ba6c7f
fix image buffer leak on keyframes, add more error condition checks
tmmm
parents:
1240
diff
changeset
|
1922 } |
| 1224 | 1923 |
|
1405
e69f99ade5b0
fix AVFrame.reference (the frames are used for decoding future frames so it should be !=0)
michaelni
parents:
1355
diff
changeset
|
1924 s->golden_frame.reference = 3; |
| 1224 | 1925 if(avctx->get_buffer(avctx, &s->golden_frame) < 0) { |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1518
diff
changeset
|
1926 av_log(s->avctx, AV_LOG_ERROR, "vp3: get_buffer() failed\n"); |
| 1224 | 1927 return -1; |
| 1928 } | |
| 1929 | |
| 1930 /* golden frame is also the current frame */ | |
| 3486 | 1931 s->current_frame= s->golden_frame; |
| 1224 | 1932 |
| 1933 /* time to figure out pixel addresses? */ | |
| 6350 | 1934 if (!s->pixel_addresses_initialized) |
| 2979 | 1935 { |
| 7961 | 1936 vp3_calculate_pixel_addresses(s); |
| 6350 | 1937 s->pixel_addresses_initialized = 1; |
| 2979 | 1938 } |
| 1224 | 1939 } else { |
| 1940 /* allocate a new current frame */ | |
|
1405
e69f99ade5b0
fix AVFrame.reference (the frames are used for decoding future frames so it should be !=0)
michaelni
parents:
1355
diff
changeset
|
1941 s->current_frame.reference = 3; |
| 6350 | 1942 if (!s->pixel_addresses_initialized) { |
|
3512
feace06d4184
Do not crash when the first frame is not a keyframe (and thus none of the
reimar
parents:
3502
diff
changeset
|
1943 av_log(s->avctx, AV_LOG_ERROR, "vp3: first frame not a keyframe\n"); |
|
feace06d4184
Do not crash when the first frame is not a keyframe (and thus none of the
reimar
parents:
3502
diff
changeset
|
1944 return -1; |
|
feace06d4184
Do not crash when the first frame is not a keyframe (and thus none of the
reimar
parents:
3502
diff
changeset
|
1945 } |
| 1224 | 1946 if(avctx->get_buffer(avctx, &s->current_frame) < 0) { |
|
1598
932d306bf1dc
av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents:
1518
diff
changeset
|
1947 av_log(s->avctx, AV_LOG_ERROR, "vp3: get_buffer() failed\n"); |
| 1224 | 1948 return -1; |
| 1949 } | |
| 1950 } | |
| 1951 | |
| 1407 | 1952 s->current_frame.qscale_table= s->qscale_table; //FIXME allocate individual tables per AVFrame |
| 1953 s->current_frame.qstride= 0; | |
| 1954 | |
| 1224 | 1955 init_frame(s, &gb); |
| 1956 | |
| 2687 | 1957 if (unpack_superblocks(s, &gb)){ |
| 1958 av_log(s->avctx, AV_LOG_ERROR, "error in unpack_superblocks\n"); | |
| 1959 return -1; | |
| 1960 } | |
| 1961 if (unpack_modes(s, &gb)){ | |
| 1962 av_log(s->avctx, AV_LOG_ERROR, "error in unpack_modes\n"); | |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
1963 return -1; |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
1964 } |
| 2687 | 1965 if (unpack_vectors(s, &gb)){ |
| 1966 av_log(s->avctx, AV_LOG_ERROR, "error in unpack_vectors\n"); | |
| 1967 return -1; | |
| 1968 } | |
| 9731 | 1969 if (unpack_block_qpis(s, &gb)){ |
| 1970 av_log(s->avctx, AV_LOG_ERROR, "error in unpack_block_qpis\n"); | |
| 1971 return -1; | |
| 1972 } | |
| 2687 | 1973 if (unpack_dct_coeffs(s, &gb)){ |
| 1974 av_log(s->avctx, AV_LOG_ERROR, "error in unpack_dct_coeffs\n"); | |
| 1975 return -1; | |
| 1976 } | |
| 1224 | 1977 |
| 1978 reverse_dc_prediction(s, 0, s->fragment_width, s->fragment_height); | |
|
1355
1c05f4290517
added the official VP3 IDCT (C implementation) as well as a grayscale
tmmm
parents:
1292
diff
changeset
|
1979 if ((avctx->flags & CODEC_FLAG_GRAY) == 0) { |
| 3498 | 1980 reverse_dc_prediction(s, s->fragment_start[1], |
|
1355
1c05f4290517
added the official VP3 IDCT (C implementation) as well as a grayscale
tmmm
parents:
1292
diff
changeset
|
1981 s->fragment_width / 2, s->fragment_height / 2); |
| 3498 | 1982 reverse_dc_prediction(s, s->fragment_start[2], |
|
1355
1c05f4290517
added the official VP3 IDCT (C implementation) as well as a grayscale
tmmm
parents:
1292
diff
changeset
|
1983 s->fragment_width / 2, s->fragment_height / 2); |
| 2722 | 1984 } |
| 1985 | |
| 1986 for (i = 0; i < s->macroblock_height; i++) | |
| 1987 render_slice(s, i); | |
|
7038
110080ab2391
Remove the START_TIMER/STOP_TIMER from vp3.c, they clutter the output and
reimar
parents:
7037
diff
changeset
|
1988 |
| 2724 | 1989 apply_loop_filter(s); |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
1990 |
| 1224 | 1991 *data_size=sizeof(AVFrame); |
| 1992 *(AVFrame*)data= s->current_frame; | |
| 1993 | |
|
1229
cefec170ee46
fixed buffer allocation logic (hopefully) so that decoder does not crash
tmmm
parents:
1227
diff
changeset
|
1994 /* release the last frame, if it is allocated and if it is not the |
|
cefec170ee46
fixed buffer allocation logic (hopefully) so that decoder does not crash
tmmm
parents:
1227
diff
changeset
|
1995 * golden frame */ |
|
cefec170ee46
fixed buffer allocation logic (hopefully) so that decoder does not crash
tmmm
parents:
1227
diff
changeset
|
1996 if ((s->last_frame.data[0]) && |
|
cefec170ee46
fixed buffer allocation logic (hopefully) so that decoder does not crash
tmmm
parents:
1227
diff
changeset
|
1997 (s->last_frame.data[0] != s->golden_frame.data[0])) |
|
cefec170ee46
fixed buffer allocation logic (hopefully) so that decoder does not crash
tmmm
parents:
1227
diff
changeset
|
1998 avctx->release_buffer(avctx, &s->last_frame); |
| 1224 | 1999 |
|
1227
184c480cefc3
fix decoder so that ffmpeg does not crash, at least not right away
tmmm
parents:
1224
diff
changeset
|
2000 /* shuffle frames (last = current) */ |
| 3486 | 2001 s->last_frame= s->current_frame; |
|
1405
e69f99ade5b0
fix AVFrame.reference (the frames are used for decoding future frames so it should be !=0)
michaelni
parents:
1355
diff
changeset
|
2002 s->current_frame.data[0]= NULL; /* ensure that we catch any access to this released frame */ |
| 1224 | 2003 |
| 2004 return buf_size; | |
| 2005 } | |
| 2006 | |
| 2007 /* | |
| 2008 * This is the ffmpeg/libavcodec API module cleanup function. | |
| 2009 */ | |
|
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6448
diff
changeset
|
2010 static av_cold int vp3_decode_end(AVCodecContext *avctx) |
| 1224 | 2011 { |
| 2012 Vp3DecodeContext *s = avctx->priv_data; | |
| 6393 | 2013 int i; |
| 2014 | |
| 2015 av_free(s->superblock_coding); | |
| 1224 | 2016 av_free(s->all_fragments); |
|
7037
480faa9f79dd
Almost-cosmetics: split out coeff_count from all_fragments struct into
reimar
parents:
6903
diff
changeset
|
2017 av_free(s->coeff_counts); |
|
2689
ed0ab6f82167
clear blocks after each idct instead of per picture
michael
parents:
2687
diff
changeset
|
2018 av_free(s->coeffs); |
| 1224 | 2019 av_free(s->coded_fragment_list); |
| 2020 av_free(s->superblock_fragments); | |
| 2021 av_free(s->superblock_macroblocks); | |
| 2022 av_free(s->macroblock_fragments); | |
|
1240
c95ff60bc1a1
fix motion vector decoding bug and reinstate interframes
tmmm
parents:
1239
diff
changeset
|
2023 av_free(s->macroblock_coding); |
| 2967 | 2024 |
| 6393 | 2025 for (i = 0; i < 16; i++) { |
| 2026 free_vlc(&s->dc_vlc[i]); | |
| 2027 free_vlc(&s->ac_vlc_1[i]); | |
| 2028 free_vlc(&s->ac_vlc_2[i]); | |
| 2029 free_vlc(&s->ac_vlc_3[i]); | |
| 2030 free_vlc(&s->ac_vlc_4[i]); | |
| 2031 } | |
| 2032 | |
| 2033 free_vlc(&s->superblock_run_length_vlc); | |
| 2034 free_vlc(&s->fragment_run_length_vlc); | |
| 2035 free_vlc(&s->mode_code_vlc); | |
| 2036 free_vlc(&s->motion_vector_vlc); | |
| 2037 | |
| 1224 | 2038 /* release all frames */ |
|
1405
e69f99ade5b0
fix AVFrame.reference (the frames are used for decoding future frames so it should be !=0)
michaelni
parents:
1355
diff
changeset
|
2039 if (s->golden_frame.data[0] && s->golden_frame.data[0] != s->last_frame.data[0]) |
|
1238
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
2040 avctx->release_buffer(avctx, &s->golden_frame); |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
2041 if (s->last_frame.data[0]) |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
2042 avctx->release_buffer(avctx, &s->last_frame); |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
2043 /* no need to release the current_frame since it will always be pointing |
|
6eab0df78d47
squashed a bunch of subtle array indexing bugs, fixed block mapping
tmmm
parents:
1236
diff
changeset
|
2044 * to the same frame as either the golden or last frame */ |
| 1224 | 2045 |
| 2046 return 0; | |
| 2047 } | |
| 2048 | |
|
2718
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2049 static int read_huffman_tree(AVCodecContext *avctx, GetBitContext *gb) |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2050 { |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2051 Vp3DecodeContext *s = avctx->priv_data; |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2052 |
| 5513 | 2053 if (get_bits1(gb)) { |
|
2718
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2054 int token; |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2055 if (s->entries >= 32) { /* overflow */ |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2056 av_log(avctx, AV_LOG_ERROR, "huffman tree overflow\n"); |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2057 return -1; |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2058 } |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2059 token = get_bits(gb, 5); |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2060 //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); |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2061 s->huffman_table[s->hti][token][0] = s->hbits; |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2062 s->huffman_table[s->hti][token][1] = s->huff_code_size; |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2063 s->entries++; |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2064 } |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2065 else { |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2066 if (s->huff_code_size >= 32) {/* overflow */ |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2067 av_log(avctx, AV_LOG_ERROR, "huffman tree overflow\n"); |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2068 return -1; |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2069 } |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2070 s->huff_code_size++; |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2071 s->hbits <<= 1; |
| 8770 | 2072 if (read_huffman_tree(avctx, gb)) |
| 2073 return -1; | |
|
2718
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2074 s->hbits |= 1; |
| 8770 | 2075 if (read_huffman_tree(avctx, gb)) |
| 2076 return -1; | |
|
2718
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2077 s->hbits >>= 1; |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2078 s->huff_code_size--; |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2079 } |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2080 return 0; |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2081 } |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2082 |
| 8590 | 2083 #if CONFIG_THEORA_DECODER |
|
3484
9a70c6d3c653
check how many bits are left after decoding extradata
michael
parents:
3483
diff
changeset
|
2084 static int theora_decode_header(AVCodecContext *avctx, GetBitContext *gb) |
|
1516
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2085 { |
|
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2086 Vp3DecodeContext *s = avctx->priv_data; |
|
4935
b34f448e1a12
fix display of theora videos with visible size smaller than encoded size
aurel
parents:
4826
diff
changeset
|
2087 int visible_width, visible_height; |
| 3483 | 2088 |
|
3484
9a70c6d3c653
check how many bits are left after decoding extradata
michael
parents:
3483
diff
changeset
|
2089 s->theora = get_bits_long(gb, 24); |
|
6349
aed237dd11d8
Print Theora bitstream version at DEBUG, not at VERBOSE level.
diego
parents:
6282
diff
changeset
|
2090 av_log(avctx, AV_LOG_DEBUG, "Theora bitstream version %X\n", s->theora); |
|
1627
a80b15c0b9d5
theora alpha3 support (with maintaining backward compatibility, maybe we should remove all backward compatibility codes after final theora release?)
alex
parents:
1626
diff
changeset
|
2091 |
| 2678 | 2092 /* 3.2.0 aka alpha3 has the same frame orientation as original vp3 */ |
|
1626
f74ae637ffa9
finally working with old theora bitstream (flipped image), the only sample I have is decoded successfully (theora.ogg)
alex
parents:
1598
diff
changeset
|
2093 /* but previous versions have the image flipped relative to vp3 */ |
| 2678 | 2094 if (s->theora < 0x030200) |
|
1626
f74ae637ffa9
finally working with old theora bitstream (flipped image), the only sample I have is decoded successfully (theora.ogg)
alex
parents:
1598
diff
changeset
|
2095 { |
| 2979 | 2096 s->flipped_image = 1; |
|
1626
f74ae637ffa9
finally working with old theora bitstream (flipped image), the only sample I have is decoded successfully (theora.ogg)
alex
parents:
1598
diff
changeset
|
2097 av_log(avctx, AV_LOG_DEBUG, "Old (<alpha3) Theora bitstream, flipped image\n"); |
|
f74ae637ffa9
finally working with old theora bitstream (flipped image), the only sample I have is decoded successfully (theora.ogg)
alex
parents:
1598
diff
changeset
|
2098 } |
|
f74ae637ffa9
finally working with old theora bitstream (flipped image), the only sample I have is decoded successfully (theora.ogg)
alex
parents:
1598
diff
changeset
|
2099 |
|
7967
6ac2c8312a2b
Visible width/height fields were added in Theora 3.2
conrad
parents:
7966
diff
changeset
|
2100 visible_width = s->width = get_bits(gb, 16) << 4; |
|
6ac2c8312a2b
Visible width/height fields were added in Theora 3.2
conrad
parents:
7966
diff
changeset
|
2101 visible_height = s->height = get_bits(gb, 16) << 4; |
| 2967 | 2102 |
| 2422 | 2103 if(avcodec_check_dimensions(avctx, s->width, s->height)){ |
|
2943
6bf62c1cf1b6
Fixing theora _again_. DONT BOTHER BREAKING THIS AGAIN. Added support for Theora 3.4 and stream created by Elphel cameras are decodable.
alex
parents:
2942
diff
changeset
|
2104 av_log(avctx, AV_LOG_ERROR, "Invalid dimensions (%dx%d)\n", s->width, s->height); |
| 2422 | 2105 s->width= s->height= 0; |
| 2106 return -1; | |
| 2107 } | |
|
2943
6bf62c1cf1b6
Fixing theora _again_. DONT BOTHER BREAKING THIS AGAIN. Added support for Theora 3.4 and stream created by Elphel cameras are decodable.
alex
parents:
2942
diff
changeset
|
2108 |
|
6bf62c1cf1b6
Fixing theora _again_. DONT BOTHER BREAKING THIS AGAIN. Added support for Theora 3.4 and stream created by Elphel cameras are decodable.
alex
parents:
2942
diff
changeset
|
2109 if (s->theora >= 0x030400) |
|
6bf62c1cf1b6
Fixing theora _again_. DONT BOTHER BREAKING THIS AGAIN. Added support for Theora 3.4 and stream created by Elphel cameras are decodable.
alex
parents:
2942
diff
changeset
|
2110 { |
|
3484
9a70c6d3c653
check how many bits are left after decoding extradata
michael
parents:
3483
diff
changeset
|
2111 skip_bits(gb, 32); /* total number of superblocks in a frame */ |
| 2979 | 2112 // fixme, the next field is 36bits long |
|
3484
9a70c6d3c653
check how many bits are left after decoding extradata
michael
parents:
3483
diff
changeset
|
2113 skip_bits(gb, 32); /* total number of blocks in a frame */ |
|
9a70c6d3c653
check how many bits are left after decoding extradata
michael
parents:
3483
diff
changeset
|
2114 skip_bits(gb, 4); /* total number of blocks in a frame */ |
|
9a70c6d3c653
check how many bits are left after decoding extradata
michael
parents:
3483
diff
changeset
|
2115 skip_bits(gb, 32); /* total number of macroblocks in a frame */ |
|
2943
6bf62c1cf1b6
Fixing theora _again_. DONT BOTHER BREAKING THIS AGAIN. Added support for Theora 3.4 and stream created by Elphel cameras are decodable.
alex
parents:
2942
diff
changeset
|
2116 } |
|
4935
b34f448e1a12
fix display of theora videos with visible size smaller than encoded size
aurel
parents:
4826
diff
changeset
|
2117 |
|
7967
6ac2c8312a2b
Visible width/height fields were added in Theora 3.2
conrad
parents:
7966
diff
changeset
|
2118 if (s->theora >= 0x030200) { |
| 7968 | 2119 visible_width = get_bits_long(gb, 24); |
| 2120 visible_height = get_bits_long(gb, 24); | |
|
1516
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2121 |
| 4936 | 2122 skip_bits(gb, 8); /* offset x */ |
| 2123 skip_bits(gb, 8); /* offset y */ | |
| 2124 } | |
|
3484
9a70c6d3c653
check how many bits are left after decoding extradata
michael
parents:
3483
diff
changeset
|
2125 |
|
9a70c6d3c653
check how many bits are left after decoding extradata
michael
parents:
3483
diff
changeset
|
2126 skip_bits(gb, 32); /* fps numerator */ |
|
9a70c6d3c653
check how many bits are left after decoding extradata
michael
parents:
3483
diff
changeset
|
2127 skip_bits(gb, 32); /* fps denumerator */ |
|
9a70c6d3c653
check how many bits are left after decoding extradata
michael
parents:
3483
diff
changeset
|
2128 skip_bits(gb, 24); /* aspect numerator */ |
|
9a70c6d3c653
check how many bits are left after decoding extradata
michael
parents:
3483
diff
changeset
|
2129 skip_bits(gb, 24); /* aspect denumerator */ |
| 2967 | 2130 |
| 2678 | 2131 if (s->theora < 0x030200) |
|
3484
9a70c6d3c653
check how many bits are left after decoding extradata
michael
parents:
3483
diff
changeset
|
2132 skip_bits(gb, 5); /* keyframe frequency force */ |
|
9a70c6d3c653
check how many bits are left after decoding extradata
michael
parents:
3483
diff
changeset
|
2133 skip_bits(gb, 8); /* colorspace */ |
|
2943
6bf62c1cf1b6
Fixing theora _again_. DONT BOTHER BREAKING THIS AGAIN. Added support for Theora 3.4 and stream created by Elphel cameras are decodable.
alex
parents:
2942
diff
changeset
|
2134 if (s->theora >= 0x030400) |
|
3484
9a70c6d3c653
check how many bits are left after decoding extradata
michael
parents:
3483
diff
changeset
|
2135 skip_bits(gb, 2); /* pixel format: 420,res,422,444 */ |
|
9a70c6d3c653
check how many bits are left after decoding extradata
michael
parents:
3483
diff
changeset
|
2136 skip_bits(gb, 24); /* bitrate */ |
|
9a70c6d3c653
check how many bits are left after decoding extradata
michael
parents:
3483
diff
changeset
|
2137 |
|
9a70c6d3c653
check how many bits are left after decoding extradata
michael
parents:
3483
diff
changeset
|
2138 skip_bits(gb, 6); /* quality hint */ |
| 2967 | 2139 |
| 2678 | 2140 if (s->theora >= 0x030200) |
|
1627
a80b15c0b9d5
theora alpha3 support (with maintaining backward compatibility, maybe we should remove all backward compatibility codes after final theora release?)
alex
parents:
1626
diff
changeset
|
2141 { |
|
3484
9a70c6d3c653
check how many bits are left after decoding extradata
michael
parents:
3483
diff
changeset
|
2142 skip_bits(gb, 5); /* keyframe frequency force */ |
| 2979 | 2143 |
| 2144 if (s->theora < 0x030400) | |
|
3484
9a70c6d3c653
check how many bits are left after decoding extradata
michael
parents:
3483
diff
changeset
|
2145 skip_bits(gb, 5); /* spare bits */ |
|
1627
a80b15c0b9d5
theora alpha3 support (with maintaining backward compatibility, maybe we should remove all backward compatibility codes after final theora release?)
alex
parents:
1626
diff
changeset
|
2146 } |
| 2967 | 2147 |
|
3484
9a70c6d3c653
check how many bits are left after decoding extradata
michael
parents:
3483
diff
changeset
|
2148 // align_get_bits(gb); |
| 2967 | 2149 |
|
4935
b34f448e1a12
fix display of theora videos with visible size smaller than encoded size
aurel
parents:
4826
diff
changeset
|
2150 if ( visible_width <= s->width && visible_width > s->width-16 |
|
b34f448e1a12
fix display of theora videos with visible size smaller than encoded size
aurel
parents:
4826
diff
changeset
|
2151 && visible_height <= s->height && visible_height > s->height-16) |
|
b34f448e1a12
fix display of theora videos with visible size smaller than encoded size
aurel
parents:
4826
diff
changeset
|
2152 avcodec_set_dimensions(avctx, visible_width, visible_height); |
|
b34f448e1a12
fix display of theora videos with visible size smaller than encoded size
aurel
parents:
4826
diff
changeset
|
2153 else |
|
b34f448e1a12
fix display of theora videos with visible size smaller than encoded size
aurel
parents:
4826
diff
changeset
|
2154 avcodec_set_dimensions(avctx, s->width, s->height); |
|
1516
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2155 |
|
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2156 return 0; |
|
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2157 } |
|
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2158 |
|
3484
9a70c6d3c653
check how many bits are left after decoding extradata
michael
parents:
3483
diff
changeset
|
2159 static int theora_decode_tables(AVCodecContext *avctx, GetBitContext *gb) |
|
1516
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2160 { |
|
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2161 Vp3DecodeContext *s = avctx->priv_data; |
|
3489
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2162 int i, n, matrices, inter, plane; |
| 2678 | 2163 |
| 2164 if (s->theora >= 0x030200) { | |
|
3484
9a70c6d3c653
check how many bits are left after decoding extradata
michael
parents:
3483
diff
changeset
|
2165 n = get_bits(gb, 3); |
|
2731
0b4b57c4a8f5
read loop filter limit values from Theora header, courtesy of Matthieu
melanson
parents:
2726
diff
changeset
|
2166 /* loop filter limit values table */ |
| 2678 | 2167 for (i = 0; i < 64; i++) |
|
3484
9a70c6d3c653
check how many bits are left after decoding extradata
michael
parents:
3483
diff
changeset
|
2168 s->filter_limit_values[i] = get_bits(gb, n); |
| 2678 | 2169 } |
| 2967 | 2170 |
| 2678 | 2171 if (s->theora >= 0x030200) |
|
3484
9a70c6d3c653
check how many bits are left after decoding extradata
michael
parents:
3483
diff
changeset
|
2172 n = get_bits(gb, 4) + 1; |
| 2678 | 2173 else |
| 2174 n = 16; | |
|
1516
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2175 /* quality threshold table */ |
|
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2176 for (i = 0; i < 64; i++) |
|
3484
9a70c6d3c653
check how many bits are left after decoding extradata
michael
parents:
3483
diff
changeset
|
2177 s->coded_ac_scale_factor[i] = get_bits(gb, n); |
| 2678 | 2178 |
| 2179 if (s->theora >= 0x030200) | |
|
3484
9a70c6d3c653
check how many bits are left after decoding extradata
michael
parents:
3483
diff
changeset
|
2180 n = get_bits(gb, 4) + 1; |
| 2678 | 2181 else |
| 2182 n = 16; | |
|
1516
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2183 /* dc scale factor table */ |
|
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2184 for (i = 0; i < 64; i++) |
|
3484
9a70c6d3c653
check how many bits are left after decoding extradata
michael
parents:
3483
diff
changeset
|
2185 s->coded_dc_scale_factor[i] = get_bits(gb, n); |
| 2678 | 2186 |
| 2187 if (s->theora >= 0x030200) | |
|
3484
9a70c6d3c653
check how many bits are left after decoding extradata
michael
parents:
3483
diff
changeset
|
2188 matrices = get_bits(gb, 9) + 1; |
| 2678 | 2189 else |
|
2944
3785497656c9
Correctly skip unknown matrices (patch by Matthieu Castet) and disable comment reading
alex
parents:
2943
diff
changeset
|
2190 matrices = 3; |
|
3489
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2191 |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2192 if(matrices > 384){ |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2193 av_log(avctx, AV_LOG_ERROR, "invalid number of base matrixes\n"); |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2194 return -1; |
| 2678 | 2195 } |
|
3489
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2196 |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2197 for(n=0; n<matrices; n++){ |
| 2979 | 2198 for (i = 0; i < 64; i++) |
|
3489
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2199 s->base_matrix[n][i]= get_bits(gb, 8); |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2200 } |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2201 |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2202 for (inter = 0; inter <= 1; inter++) { |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2203 for (plane = 0; plane <= 2; plane++) { |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2204 int newqr= 1; |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2205 if (inter || plane > 0) |
| 5513 | 2206 newqr = get_bits1(gb); |
|
2718
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2207 if (!newqr) { |
|
3489
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2208 int qtj, plj; |
| 5513 | 2209 if(inter && get_bits1(gb)){ |
|
3489
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2210 qtj = 0; |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2211 plj = plane; |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2212 }else{ |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2213 qtj= (3*inter + plane - 1) / 3; |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2214 plj= (plane + 2) % 3; |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2215 } |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2216 s->qr_count[inter][plane]= s->qr_count[qtj][plj]; |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2217 memcpy(s->qr_size[inter][plane], s->qr_size[qtj][plj], sizeof(s->qr_size[0][0])); |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2218 memcpy(s->qr_base[inter][plane], s->qr_base[qtj][plj], sizeof(s->qr_base[0][0])); |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2219 } else { |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2220 int qri= 0; |
|
2718
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2221 int qi = 0; |
|
3489
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2222 |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2223 for(;;){ |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2224 i= get_bits(gb, av_log2(matrices-1)+1); |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2225 if(i>= matrices){ |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2226 av_log(avctx, AV_LOG_ERROR, "invalid base matrix index\n"); |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2227 return -1; |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2228 } |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2229 s->qr_base[inter][plane][qri]= i; |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2230 if(qi >= 63) |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2231 break; |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2232 i = get_bits(gb, av_log2(63-qi)+1) + 1; |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2233 s->qr_size[inter][plane][qri++]= i; |
|
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2234 qi += i; |
|
2718
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2235 } |
|
3489
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2236 |
|
2944
3785497656c9
Correctly skip unknown matrices (patch by Matthieu Castet) and disable comment reading
alex
parents:
2943
diff
changeset
|
2237 if (qi > 63) { |
|
2943
6bf62c1cf1b6
Fixing theora _again_. DONT BOTHER BREAKING THIS AGAIN. Added support for Theora 3.4 and stream created by Elphel cameras are decodable.
alex
parents:
2942
diff
changeset
|
2238 av_log(avctx, AV_LOG_ERROR, "invalid qi %d > 63\n", qi); |
| 2979 | 2239 return -1; |
| 2240 } | |
|
3489
9aacd9410e57
attempt to implement xiphs useless and stupid quantization matrix mess
michael
parents:
3488
diff
changeset
|
2241 s->qr_count[inter][plane]= qri; |
|
2718
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2242 } |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2243 } |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2244 } |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2245 |
|
2944
3785497656c9
Correctly skip unknown matrices (patch by Matthieu Castet) and disable comment reading
alex
parents:
2943
diff
changeset
|
2246 /* Huffman tables */ |
|
2718
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2247 for (s->hti = 0; s->hti < 80; s->hti++) { |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2248 s->entries = 0; |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2249 s->huff_code_size = 1; |
| 5513 | 2250 if (!get_bits1(gb)) { |
|
2718
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2251 s->hbits = 0; |
| 8770 | 2252 if(read_huffman_tree(avctx, gb)) |
| 2253 return -1; | |
|
2718
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2254 s->hbits = 1; |
| 8770 | 2255 if(read_huffman_tree(avctx, gb)) |
| 2256 return -1; | |
|
2718
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2257 } |
|
158dc437c783
read Huffman tables from Theora header (patch courtesy of
melanson
parents:
2714
diff
changeset
|
2258 } |
| 2967 | 2259 |
|
1516
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2260 s->theora_tables = 1; |
| 2967 | 2261 |
|
1516
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2262 return 0; |
|
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2263 } |
|
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2264 |
|
9007
043574c5c153
Add missing av_cold in static init/close functions.
stefano
parents:
8770
diff
changeset
|
2265 static av_cold int theora_decode_init(AVCodecContext *avctx) |
|
1516
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2266 { |
|
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2267 Vp3DecodeContext *s = avctx->priv_data; |
|
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2268 GetBitContext gb; |
|
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2269 int ptype; |
|
4723
b62a3a46856c
use generic xiph header spliting func to split theora headers
aurel
parents:
4594
diff
changeset
|
2270 uint8_t *header_start[3]; |
|
b62a3a46856c
use generic xiph header spliting func to split theora headers
aurel
parents:
4594
diff
changeset
|
2271 int header_len[3]; |
|
b62a3a46856c
use generic xiph header spliting func to split theora headers
aurel
parents:
4594
diff
changeset
|
2272 int i; |
| 2967 | 2273 |
|
1516
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2274 s->theora = 1; |
|
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2275 |
|
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2276 if (!avctx->extradata_size) |
|
2943
6bf62c1cf1b6
Fixing theora _again_. DONT BOTHER BREAKING THIS AGAIN. Added support for Theora 3.4 and stream created by Elphel cameras are decodable.
alex
parents:
2942
diff
changeset
|
2277 { |
|
6bf62c1cf1b6
Fixing theora _again_. DONT BOTHER BREAKING THIS AGAIN. Added support for Theora 3.4 and stream created by Elphel cameras are decodable.
alex
parents:
2942
diff
changeset
|
2278 av_log(avctx, AV_LOG_ERROR, "Missing extradata!\n"); |
| 2979 | 2279 return -1; |
|
2943
6bf62c1cf1b6
Fixing theora _again_. DONT BOTHER BREAKING THIS AGAIN. Added support for Theora 3.4 and stream created by Elphel cameras are decodable.
alex
parents:
2942
diff
changeset
|
2280 } |
|
1516
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2281 |
|
4723
b62a3a46856c
use generic xiph header spliting func to split theora headers
aurel
parents:
4594
diff
changeset
|
2282 if (ff_split_xiph_headers(avctx->extradata, avctx->extradata_size, |
|
b62a3a46856c
use generic xiph header spliting func to split theora headers
aurel
parents:
4594
diff
changeset
|
2283 42, header_start, header_len) < 0) { |
|
b62a3a46856c
use generic xiph header spliting func to split theora headers
aurel
parents:
4594
diff
changeset
|
2284 av_log(avctx, AV_LOG_ERROR, "Corrupt extradata\n"); |
|
b62a3a46856c
use generic xiph header spliting func to split theora headers
aurel
parents:
4594
diff
changeset
|
2285 return -1; |
|
b62a3a46856c
use generic xiph header spliting func to split theora headers
aurel
parents:
4594
diff
changeset
|
2286 } |
|
b62a3a46856c
use generic xiph header spliting func to split theora headers
aurel
parents:
4594
diff
changeset
|
2287 |
| 2533 | 2288 for(i=0;i<3;i++) { |
|
4723
b62a3a46856c
use generic xiph header spliting func to split theora headers
aurel
parents:
4594
diff
changeset
|
2289 init_get_bits(&gb, header_start[i], header_len[i]); |
|
1516
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2290 |
|
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2291 ptype = get_bits(&gb, 8); |
| 2967 | 2292 |
|
2943
6bf62c1cf1b6
Fixing theora _again_. DONT BOTHER BREAKING THIS AGAIN. Added support for Theora 3.4 and stream created by Elphel cameras are decodable.
alex
parents:
2942
diff
changeset
|
2293 if (!(ptype & 0x80)) |
|
6bf62c1cf1b6
Fixing theora _again_. DONT BOTHER BREAKING THIS AGAIN. Added support for Theora 3.4 and stream created by Elphel cameras are decodable.
alex
parents:
2942
diff
changeset
|
2294 { |
|
6bf62c1cf1b6
Fixing theora _again_. DONT BOTHER BREAKING THIS AGAIN. Added support for Theora 3.4 and stream created by Elphel cameras are decodable.
alex
parents:
2942
diff
changeset
|
2295 av_log(avctx, AV_LOG_ERROR, "Invalid extradata!\n"); |
|
3484
9a70c6d3c653
check how many bits are left after decoding extradata
michael
parents:
3483
diff
changeset
|
2296 // return -1; |
| 2967 | 2297 } |
|
2943
6bf62c1cf1b6
Fixing theora _again_. DONT BOTHER BREAKING THIS AGAIN. Added support for Theora 3.4 and stream created by Elphel cameras are decodable.
alex
parents:
2942
diff
changeset
|
2298 |
| 4561 | 2299 // FIXME: Check for this as well. |
| 9637 | 2300 skip_bits_long(&gb, 6*8); /* "theora" */ |
| 2967 | 2301 |
|
1516
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2302 switch(ptype) |
|
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2303 { |
|
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2304 case 0x80: |
|
3484
9a70c6d3c653
check how many bits are left after decoding extradata
michael
parents:
3483
diff
changeset
|
2305 theora_decode_header(avctx, &gb); |
| 2979 | 2306 break; |
| 2307 case 0x81: | |
|
2944
3785497656c9
Correctly skip unknown matrices (patch by Matthieu Castet) and disable comment reading
alex
parents:
2943
diff
changeset
|
2308 // FIXME: is this needed? it breaks sometimes |
| 2979 | 2309 // theora_decode_comments(avctx, gb); |
| 2310 break; | |
| 2311 case 0x82: | |
| 8770 | 2312 if (theora_decode_tables(avctx, &gb)) |
| 2313 return -1; | |
| 2979 | 2314 break; |
| 2315 default: | |
| 2316 av_log(avctx, AV_LOG_ERROR, "Unknown Theora config packet: %d\n", ptype&~0x80); | |
| 2317 break; | |
|
1516
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2318 } |
|
7943
3ff31e4454cd
Downgrade severity of leftover bits in header packets, and don't check for the comment header
conrad
parents:
7938
diff
changeset
|
2319 if(ptype != 0x81 && 8*header_len[i] != get_bits_count(&gb)) |
|
3ff31e4454cd
Downgrade severity of leftover bits in header packets, and don't check for the comment header
conrad
parents:
7938
diff
changeset
|
2320 av_log(avctx, AV_LOG_WARNING, "%d bits left in packet %X\n", 8*header_len[i] - get_bits_count(&gb), ptype); |
|
3490
b43d45362038
fix playback of theora.ogg on mphq patch by (matthieu castet %% castet dat matthieu ot free dat fr %%)
michael
parents:
3489
diff
changeset
|
2321 if (s->theora < 0x030200) |
|
b43d45362038
fix playback of theora.ogg on mphq patch by (matthieu castet %% castet dat matthieu ot free dat fr %%)
michael
parents:
3489
diff
changeset
|
2322 break; |
| 2533 | 2323 } |
|
1516
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2324 |
| 2678 | 2325 vp3_decode_init(avctx); |
|
1516
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2326 return 0; |
|
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2327 } |
|
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2328 |
|
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2329 AVCodec theora_decoder = { |
|
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2330 "theora", |
|
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2331 CODEC_TYPE_VIDEO, |
|
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2332 CODEC_ID_THEORA, |
|
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2333 sizeof(Vp3DecodeContext), |
|
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2334 theora_decode_init, |
|
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2335 NULL, |
|
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2336 vp3_decode_end, |
|
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2337 vp3_decode_frame, |
|
9811
87bd4aedc7b1
vp3 and theora decoders use get_buffer, set CODEC_CAP_DR1
bcoudurier
parents:
9731
diff
changeset
|
2338 CODEC_CAP_DR1, |
| 6710 | 2339 NULL, |
|
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
7038
diff
changeset
|
2340 .long_name = NULL_IF_CONFIG_SMALL("Theora"), |
|
1516
0f0e9dfa6723
theora decoding support (only keyframes for now, because by theora the frame isn't flipped so the motion vectors are getting screwed up)
alex
parents:
1463
diff
changeset
|
2341 }; |
|
4823
cff8c7ecac71
Fix compilation when Theora decoder is disabled, but VP3 is enabled.
diego
parents:
4801
diff
changeset
|
2342 #endif |
|
4825
3f32f0e5a77b
cosmetics: Move one code block to save an #ifdef in the next commit.
diego
parents:
4824
diff
changeset
|
2343 |
|
3f32f0e5a77b
cosmetics: Move one code block to save an #ifdef in the next commit.
diego
parents:
4824
diff
changeset
|
2344 AVCodec vp3_decoder = { |
|
3f32f0e5a77b
cosmetics: Move one code block to save an #ifdef in the next commit.
diego
parents:
4824
diff
changeset
|
2345 "vp3", |
|
3f32f0e5a77b
cosmetics: Move one code block to save an #ifdef in the next commit.
diego
parents:
4824
diff
changeset
|
2346 CODEC_TYPE_VIDEO, |
|
3f32f0e5a77b
cosmetics: Move one code block to save an #ifdef in the next commit.
diego
parents:
4824
diff
changeset
|
2347 CODEC_ID_VP3, |
|
3f32f0e5a77b
cosmetics: Move one code block to save an #ifdef in the next commit.
diego
parents:
4824
diff
changeset
|
2348 sizeof(Vp3DecodeContext), |
|
3f32f0e5a77b
cosmetics: Move one code block to save an #ifdef in the next commit.
diego
parents:
4824
diff
changeset
|
2349 vp3_decode_init, |
|
3f32f0e5a77b
cosmetics: Move one code block to save an #ifdef in the next commit.
diego
parents:
4824
diff
changeset
|
2350 NULL, |
|
3f32f0e5a77b
cosmetics: Move one code block to save an #ifdef in the next commit.
diego
parents:
4824
diff
changeset
|
2351 vp3_decode_end, |
|
3f32f0e5a77b
cosmetics: Move one code block to save an #ifdef in the next commit.
diego
parents:
4824
diff
changeset
|
2352 vp3_decode_frame, |
|
9811
87bd4aedc7b1
vp3 and theora decoders use get_buffer, set CODEC_CAP_DR1
bcoudurier
parents:
9731
diff
changeset
|
2353 CODEC_CAP_DR1, |
| 6710 | 2354 NULL, |
|
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
7038
diff
changeset
|
2355 .long_name = NULL_IF_CONFIG_SMALL("On2 VP3"), |
|
4825
3f32f0e5a77b
cosmetics: Move one code block to save an #ifdef in the next commit.
diego
parents:
4824
diff
changeset
|
2356 }; |
