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