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