/src/ffmpeg/libavcodec/wma.c
Line | Count | Source |
1 | | /* |
2 | | * WMA compatible codec |
3 | | * Copyright (c) 2002-2007 The FFmpeg Project |
4 | | * |
5 | | * This file is part of FFmpeg. |
6 | | * |
7 | | * FFmpeg is free software; you can redistribute it and/or |
8 | | * modify it under the terms of the GNU Lesser General Public |
9 | | * License as published by the Free Software Foundation; either |
10 | | * version 2.1 of the License, or (at your option) any later version. |
11 | | * |
12 | | * FFmpeg is distributed in the hope that it will be useful, |
13 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
15 | | * Lesser General Public License for more details. |
16 | | * |
17 | | * You should have received a copy of the GNU Lesser General Public |
18 | | * License along with FFmpeg; if not, write to the Free Software |
19 | | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
20 | | */ |
21 | | |
22 | | #include "libavutil/attributes.h" |
23 | | #include "libavutil/mem.h" |
24 | | |
25 | | #include "avcodec.h" |
26 | | #include "sinewin.h" |
27 | | #include "wma.h" |
28 | | #include "wma_common.h" |
29 | | #include "wma_freqs.h" |
30 | | #include "wmadata.h" |
31 | | |
32 | | /* XXX: use same run/length optimization as mpeg decoders */ |
33 | | // FIXME maybe split decode / encode or pass flag |
34 | | static av_cold int init_coef_vlc(VLC *vlc, uint16_t **prun_table, |
35 | | float **plevel_table, uint16_t **pint_table, |
36 | | const CoefVLCTable *vlc_table) |
37 | 4.66k | { |
38 | 4.66k | int n = vlc_table->n; |
39 | 4.66k | const uint8_t *table_bits = vlc_table->huffbits; |
40 | 4.66k | const uint32_t *table_codes = vlc_table->huffcodes; |
41 | 4.66k | const uint16_t *levels_table = vlc_table->levels; |
42 | 4.66k | uint16_t *run_table, *int_table; |
43 | 4.66k | float *flevel_table; |
44 | 4.66k | int i, l, j, k, level, ret; |
45 | | |
46 | 4.66k | ret = vlc_init(vlc, VLCBITS, n, table_bits, 1, 1, table_codes, 4, 4, 0); |
47 | 4.66k | if (ret < 0) |
48 | 0 | return ret; |
49 | | |
50 | 4.66k | run_table = av_malloc_array(n, sizeof(uint16_t)); |
51 | 4.66k | flevel_table = av_malloc_array(n, sizeof(*flevel_table)); |
52 | 4.66k | int_table = av_malloc_array(n, sizeof(uint16_t)); |
53 | 4.66k | if (!run_table || !flevel_table || !int_table) { |
54 | 0 | av_freep(&run_table); |
55 | 0 | av_freep(&flevel_table); |
56 | 0 | av_freep(&int_table); |
57 | 0 | return AVERROR(ENOMEM); |
58 | 0 | } |
59 | 4.66k | i = 2; |
60 | 4.66k | level = 1; |
61 | 4.66k | k = 0; |
62 | 317k | while (i < n) { |
63 | 313k | int_table[k] = i; |
64 | 313k | l = levels_table[k++]; |
65 | 2.73M | for (j = 0; j < l; j++) { |
66 | 2.42M | run_table[i] = j; |
67 | 2.42M | flevel_table[i] = level; |
68 | 2.42M | i++; |
69 | 2.42M | } |
70 | 313k | level++; |
71 | 313k | } |
72 | 4.66k | *prun_table = run_table; |
73 | 4.66k | *plevel_table = flevel_table; |
74 | 4.66k | *pint_table = int_table; |
75 | | |
76 | 4.66k | return 0; |
77 | 4.66k | } |
78 | | |
79 | | av_cold int ff_wma_init(AVCodecContext *avctx, int flags2) |
80 | 2.84k | { |
81 | 2.84k | WMACodecContext *s = avctx->priv_data; |
82 | 2.84k | int channels = avctx->ch_layout.nb_channels; |
83 | 2.84k | int i, ret; |
84 | 2.84k | float bps1, high_freq; |
85 | 2.84k | float bps; |
86 | 2.84k | int sample_rate1; |
87 | 2.84k | int coef_vlc_table; |
88 | | |
89 | 2.84k | if (avctx->sample_rate > 50000 || |
90 | 2.65k | channels > 2 || |
91 | 2.62k | avctx->bit_rate <= 0) |
92 | 350 | return -1; |
93 | | |
94 | | |
95 | 2.49k | if (avctx->codec->id == AV_CODEC_ID_WMAV1) |
96 | 1.22k | s->version = 1; |
97 | 1.27k | else |
98 | 1.27k | s->version = 2; |
99 | | |
100 | | /* compute MDCT block size */ |
101 | 2.49k | s->frame_len_bits = ff_wma_get_frame_len_bits(avctx->sample_rate, |
102 | 2.49k | s->version, 0); |
103 | 2.49k | s->next_block_len_bits = s->frame_len_bits; |
104 | 2.49k | s->prev_block_len_bits = s->frame_len_bits; |
105 | 2.49k | s->block_len_bits = s->frame_len_bits; |
106 | | |
107 | 2.49k | s->frame_len = 1 << s->frame_len_bits; |
108 | 2.49k | if (s->use_variable_block_len) { |
109 | 813 | int nb_max, nb; |
110 | 813 | nb = ((flags2 >> 3) & 3) + 1; |
111 | 813 | if ((avctx->bit_rate / channels) >= 32000) |
112 | 247 | nb += 2; |
113 | 813 | nb_max = s->frame_len_bits - BLOCK_MIN_BITS; |
114 | 813 | if (nb > nb_max) |
115 | 409 | nb = nb_max; |
116 | 813 | s->nb_block_sizes = nb + 1; |
117 | 813 | } else |
118 | 1.68k | s->nb_block_sizes = 1; |
119 | | |
120 | | /* init rate dependent parameters */ |
121 | 2.49k | s->use_noise_coding = 1; |
122 | 2.49k | high_freq = avctx->sample_rate * 0.5; |
123 | | |
124 | | /* if version 2, then the rates are normalized */ |
125 | 2.49k | sample_rate1 = avctx->sample_rate; |
126 | 2.49k | if (s->version == 2) { |
127 | 1.27k | if (sample_rate1 >= 44100) |
128 | 135 | sample_rate1 = 44100; |
129 | 1.14k | else if (sample_rate1 >= 22050) |
130 | 296 | sample_rate1 = 22050; |
131 | 845 | else if (sample_rate1 >= 16000) |
132 | 184 | sample_rate1 = 16000; |
133 | 661 | else if (sample_rate1 >= 11025) |
134 | 142 | sample_rate1 = 11025; |
135 | 519 | else if (sample_rate1 >= 8000) |
136 | 115 | sample_rate1 = 8000; |
137 | 1.27k | } |
138 | | |
139 | 2.49k | bps = (float) avctx->bit_rate / |
140 | 2.49k | (float) (channels * avctx->sample_rate); |
141 | 2.49k | s->byte_offset_bits = av_log2((int) (bps * s->frame_len / 8.0 + 0.5)) + 2; |
142 | 2.49k | if (s->byte_offset_bits + 3 > MIN_CACHE_BITS) { |
143 | 164 | av_log(avctx, AV_LOG_ERROR, "byte_offset_bits %d is too large\n", s->byte_offset_bits); |
144 | 164 | return AVERROR_PATCHWELCOME; |
145 | 164 | } |
146 | | |
147 | | /* compute high frequency value and choose if noise coding should |
148 | | * be activated */ |
149 | 2.33k | bps1 = bps; |
150 | 2.33k | if (channels == 2) |
151 | 1.00k | bps1 = bps * 1.6; |
152 | 2.33k | if (sample_rate1 == 44100) { |
153 | 120 | if (bps1 >= 0.61) |
154 | 73 | s->use_noise_coding = 0; |
155 | 47 | else |
156 | 47 | high_freq = high_freq * 0.4; |
157 | 2.21k | } else if (sample_rate1 == 22050) { |
158 | 273 | if (bps1 >= 1.16) |
159 | 93 | s->use_noise_coding = 0; |
160 | 180 | else if (bps1 >= 0.72) |
161 | 52 | high_freq = high_freq * 0.7; |
162 | 128 | else |
163 | 128 | high_freq = high_freq * 0.6; |
164 | 1.94k | } else if (sample_rate1 == 16000) { |
165 | 177 | if (bps > 0.5) |
166 | 74 | high_freq = high_freq * 0.5; |
167 | 103 | else |
168 | 103 | high_freq = high_freq * 0.3; |
169 | 1.76k | } else if (sample_rate1 == 11025) |
170 | 138 | high_freq = high_freq * 0.7; |
171 | 1.62k | else if (sample_rate1 == 8000) { |
172 | 126 | if (bps <= 0.625) |
173 | 38 | high_freq = high_freq * 0.5; |
174 | 88 | else if (bps > 0.75) |
175 | 86 | s->use_noise_coding = 0; |
176 | 2 | else |
177 | 2 | high_freq = high_freq * 0.65; |
178 | 1.49k | } else { |
179 | 1.49k | if (bps >= 0.8) |
180 | 590 | high_freq = high_freq * 0.75; |
181 | 909 | else if (bps >= 0.6) |
182 | 172 | high_freq = high_freq * 0.6; |
183 | 737 | else |
184 | 737 | high_freq = high_freq * 0.5; |
185 | 1.49k | } |
186 | 2.33k | ff_dlog(s->avctx, "flags2=0x%x\n", flags2); |
187 | 2.33k | ff_dlog(s->avctx, "version=%d channels=%d sample_rate=%d bitrate=%"PRId64" block_align=%d\n", |
188 | 2.33k | s->version, channels, avctx->sample_rate, avctx->bit_rate, |
189 | 2.33k | avctx->block_align); |
190 | 2.33k | ff_dlog(s->avctx, "bps=%f bps1=%f high_freq=%f bitoffset=%d\n", |
191 | 2.33k | bps, bps1, high_freq, s->byte_offset_bits); |
192 | 2.33k | ff_dlog(s->avctx, "use_noise_coding=%d use_exp_vlc=%d nb_block_sizes=%d\n", |
193 | 2.33k | s->use_noise_coding, s->use_exp_vlc, s->nb_block_sizes); |
194 | | |
195 | | /* compute the scale factor band sizes for each MDCT block size */ |
196 | 2.33k | { |
197 | 2.33k | int a, b, pos, lpos, k, block_len, i, j, n; |
198 | 2.33k | const uint8_t *table; |
199 | | |
200 | 2.33k | if (s->version == 1) |
201 | 1.14k | s->coefs_start = 3; |
202 | 1.18k | else |
203 | 1.18k | s->coefs_start = 0; |
204 | 6.51k | for (k = 0; k < s->nb_block_sizes; k++) { |
205 | 4.18k | block_len = s->frame_len >> k; |
206 | | |
207 | 4.18k | if (s->version == 1) { |
208 | 2.02k | lpos = 0; |
209 | 41.5k | for (i = 0; i < 25; i++) { |
210 | 41.0k | a = ff_wma_critical_freqs[i]; |
211 | 41.0k | b = avctx->sample_rate; |
212 | 41.0k | pos = ((block_len * 2 * a) + (b >> 1)) / b; |
213 | 41.0k | if (pos > block_len) |
214 | 1.50k | pos = block_len; |
215 | 41.0k | s->exponent_bands[0][i] = pos - lpos; |
216 | 41.0k | if (pos >= block_len) { |
217 | 1.52k | i++; |
218 | 1.52k | break; |
219 | 1.52k | } |
220 | 39.4k | lpos = pos; |
221 | 39.4k | } |
222 | 2.02k | s->exponent_sizes[0] = i; |
223 | 2.15k | } else { |
224 | | /* hardcoded tables */ |
225 | 2.15k | table = NULL; |
226 | 2.15k | a = s->frame_len_bits - BLOCK_MIN_BITS - k; |
227 | 2.15k | if (a < 3) { |
228 | 1.45k | if (avctx->sample_rate >= 44100) |
229 | 125 | table = exponent_band_44100[a]; |
230 | 1.32k | else if (avctx->sample_rate >= 32000) |
231 | 66 | table = exponent_band_32000[a]; |
232 | 1.25k | else if (avctx->sample_rate >= 22050) |
233 | 156 | table = exponent_band_22050[a]; |
234 | 1.45k | } |
235 | 2.15k | if (table) { |
236 | 347 | n = *table++; |
237 | 5.65k | for (i = 0; i < n; i++) |
238 | 5.30k | s->exponent_bands[k][i] = table[i]; |
239 | 347 | s->exponent_sizes[k] = n; |
240 | 1.81k | } else { |
241 | 1.81k | j = 0; |
242 | 1.81k | lpos = 0; |
243 | 30.3k | for (i = 0; i < 25; i++) { |
244 | 30.3k | a = ff_wma_critical_freqs[i]; |
245 | 30.3k | b = avctx->sample_rate; |
246 | 30.3k | pos = ((block_len * 2 * a) + (b << 1)) / (4 * b); |
247 | 30.3k | pos <<= 2; |
248 | 30.3k | if (pos > block_len) |
249 | 1.72k | pos = block_len; |
250 | 30.3k | if (pos > lpos) |
251 | 29.7k | s->exponent_bands[k][j++] = pos - lpos; |
252 | 30.3k | if (pos >= block_len) |
253 | 1.74k | break; |
254 | 28.5k | lpos = pos; |
255 | 28.5k | } |
256 | 1.81k | s->exponent_sizes[k] = j; |
257 | 1.81k | } |
258 | 2.15k | } |
259 | | |
260 | | /* max number of coefs */ |
261 | 4.18k | s->coefs_end[k] = (s->frame_len - ((s->frame_len * 9) / 100)) >> k; |
262 | | /* high freq computation */ |
263 | 4.18k | s->high_band_start[k] = (int) ((block_len * 2 * high_freq) / |
264 | 4.18k | avctx->sample_rate + 0.5); |
265 | 4.18k | n = s->exponent_sizes[k]; |
266 | 4.18k | j = 0; |
267 | 4.18k | pos = 0; |
268 | 60.5k | for (i = 0; i < n; i++) { |
269 | 56.3k | int start, end; |
270 | 56.3k | start = pos; |
271 | 56.3k | pos += s->exponent_bands[k][i]; |
272 | 56.3k | end = pos; |
273 | 56.3k | if (start < s->high_band_start[k]) |
274 | 49.7k | start = s->high_band_start[k]; |
275 | 56.3k | if (end > s->coefs_end[k]) |
276 | 4.18k | end = s->coefs_end[k]; |
277 | 56.3k | if (end > start) |
278 | 8.52k | s->exponent_high_bands[k][j++] = end - start; |
279 | 56.3k | } |
280 | 4.18k | s->exponent_high_sizes[k] = j; |
281 | 4.18k | } |
282 | 2.33k | } |
283 | | |
284 | | #ifdef TRACE |
285 | | { |
286 | | int i, j; |
287 | | for (i = 0; i < s->nb_block_sizes; i++) { |
288 | | ff_tlog(s->avctx, "%5d: n=%2d:", |
289 | | s->frame_len >> i, |
290 | | s->exponent_sizes[i]); |
291 | | for (j = 0; j < s->exponent_sizes[i]; j++) |
292 | | ff_tlog(s->avctx, " %d", s->exponent_bands[i][j]); |
293 | | ff_tlog(s->avctx, "\n"); |
294 | | } |
295 | | } |
296 | | #endif /* TRACE */ |
297 | | |
298 | | /* init MDCT windows : simple sine window */ |
299 | 6.51k | for (i = 0; i < s->nb_block_sizes; i++) { |
300 | 4.18k | ff_init_ff_sine_windows(s->frame_len_bits - i); |
301 | 4.18k | s->windows[i] = ff_sine_windows[s->frame_len_bits - i]; |
302 | 4.18k | } |
303 | | |
304 | 2.33k | s->reset_block_lengths = 1; |
305 | | |
306 | 2.33k | if (s->use_noise_coding) { |
307 | | /* init the noise generator */ |
308 | 2.08k | if (s->use_exp_vlc) |
309 | 707 | s->noise_mult = 0.02; |
310 | 1.37k | else |
311 | 1.37k | s->noise_mult = 0.04; |
312 | | |
313 | | #ifdef TRACE |
314 | | for (i = 0; i < NOISE_TAB_SIZE; i++) |
315 | | s->noise_table[i] = 1.0 * s->noise_mult; |
316 | | #else |
317 | 2.08k | { |
318 | 2.08k | unsigned int seed; |
319 | 2.08k | float norm; |
320 | 2.08k | seed = 1; |
321 | 2.08k | norm = (1.0 / (float) (1LL << 31)) * sqrt(3) * s->noise_mult; |
322 | 17.0M | for (i = 0; i < NOISE_TAB_SIZE; i++) { |
323 | 17.0M | seed = seed * 314159 + 1; |
324 | 17.0M | s->noise_table[i] = (float) ((int) seed) * norm; |
325 | 17.0M | } |
326 | 2.08k | } |
327 | 2.08k | #endif /* TRACE */ |
328 | 2.08k | } |
329 | | |
330 | 2.33k | s->fdsp = avpriv_float_dsp_alloc(avctx->flags & AV_CODEC_FLAG_BITEXACT); |
331 | 2.33k | if (!s->fdsp) |
332 | 0 | return AVERROR(ENOMEM); |
333 | | |
334 | | /* choose the VLC tables for the coefficients */ |
335 | 2.33k | coef_vlc_table = 2; |
336 | 2.33k | if (avctx->sample_rate >= 32000) { |
337 | 604 | if (bps1 < 0.72) |
338 | 299 | coef_vlc_table = 0; |
339 | 305 | else if (bps1 < 1.16) |
340 | 145 | coef_vlc_table = 1; |
341 | 604 | } |
342 | 2.33k | s->coef_vlcs[0] = &coef_vlcs[coef_vlc_table * 2]; |
343 | 2.33k | s->coef_vlcs[1] = &coef_vlcs[coef_vlc_table * 2 + 1]; |
344 | 2.33k | ret = init_coef_vlc(&s->coef_vlc[0], &s->run_table[0], &s->level_table[0], |
345 | 2.33k | &s->int_table[0], s->coef_vlcs[0]); |
346 | 2.33k | if (ret < 0) |
347 | 0 | return ret; |
348 | | |
349 | 2.33k | return init_coef_vlc(&s->coef_vlc[1], &s->run_table[1], &s->level_table[1], |
350 | 2.33k | &s->int_table[1], s->coef_vlcs[1]); |
351 | 2.33k | } |
352 | | |
353 | | int ff_wma_total_gain_to_bits(int total_gain) |
354 | 358k | { |
355 | 358k | if (total_gain < 15) |
356 | 6.04k | return 13; |
357 | 352k | else if (total_gain < 32) |
358 | 41.4k | return 12; |
359 | 311k | else if (total_gain < 40) |
360 | 34.5k | return 11; |
361 | 276k | else if (total_gain < 45) |
362 | 2.40k | return 10; |
363 | 274k | else |
364 | 274k | return 9; |
365 | 358k | } |
366 | | |
367 | | av_cold int ff_wma_end(AVCodecContext *avctx) |
368 | 2.86k | { |
369 | 2.86k | WMACodecContext *s = avctx->priv_data; |
370 | 2.86k | int i; |
371 | | |
372 | 7.51k | for (i = 0; i < s->nb_block_sizes; i++) |
373 | 4.64k | av_tx_uninit(&s->mdct_ctx[i]); |
374 | | |
375 | 2.86k | if (s->use_exp_vlc) |
376 | 886 | ff_vlc_free(&s->exp_vlc); |
377 | 2.86k | if (s->use_noise_coding) |
378 | 2.24k | ff_vlc_free(&s->hgain_vlc); |
379 | 8.59k | for (i = 0; i < 2; i++) { |
380 | 5.73k | ff_vlc_free(&s->coef_vlc[i]); |
381 | 5.73k | av_freep(&s->run_table[i]); |
382 | 5.73k | av_freep(&s->level_table[i]); |
383 | 5.73k | av_freep(&s->int_table[i]); |
384 | 5.73k | } |
385 | 2.86k | av_freep(&s->fdsp); |
386 | | |
387 | 2.86k | return 0; |
388 | 2.86k | } |
389 | | |
390 | | /** |
391 | | * Decode an uncompressed coefficient. |
392 | | * @param gb GetBitContext |
393 | | * @return the decoded coefficient |
394 | | */ |
395 | | unsigned int ff_wma_get_large_val(GetBitContext *gb) |
396 | 51.5k | { |
397 | | /** consumes up to 34 bits */ |
398 | 51.5k | int n_bits = 8; |
399 | | /** decode length */ |
400 | 51.5k | if (get_bits1(gb)) { |
401 | 38.5k | n_bits += 8; |
402 | 38.5k | if (get_bits1(gb)) { |
403 | 16.2k | n_bits += 8; |
404 | 16.2k | if (get_bits1(gb)) |
405 | 7.85k | n_bits += 7; |
406 | 16.2k | } |
407 | 38.5k | } |
408 | 51.5k | return get_bits_long(gb, n_bits); |
409 | 51.5k | } |
410 | | |
411 | | /** |
412 | | * Decode run level compressed coefficients. |
413 | | * @param avctx codec context |
414 | | * @param gb bitstream reader context |
415 | | * @param vlc vlc table for get_vlc2 |
416 | | * @param level_table level codes |
417 | | * @param run_table run codes |
418 | | * @param version 0 for wma1,2 1 for wmapro |
419 | | * @param ptr output buffer |
420 | | * @param offset offset in the output buffer |
421 | | * @param num_coefs number of input coefficients |
422 | | * @param block_len input buffer length (2^n) |
423 | | * @param frame_len_bits number of bits for escaped run codes |
424 | | * @param coef_nb_bits number of bits for escaped level codes |
425 | | * @return 0 on success, -1 otherwise |
426 | | */ |
427 | | int ff_wma_run_level_decode(AVCodecContext *avctx, GetBitContext *gb, |
428 | | const VLCElem *vlc, const float *level_table, |
429 | | const uint16_t *run_table, int version, |
430 | | WMACoef *ptr, int offset, int num_coefs, |
431 | | int block_len, int frame_len_bits, |
432 | | int coef_nb_bits) |
433 | 440k | { |
434 | 440k | int code, level, sign; |
435 | 440k | const uint32_t *ilvl = (const uint32_t *) level_table; |
436 | 440k | uint32_t *iptr = (uint32_t *) ptr; |
437 | 440k | const unsigned int coef_mask = block_len - 1; |
438 | 171M | for (; offset < num_coefs; offset++) { |
439 | 170M | code = get_vlc2(gb, vlc, VLCBITS, VLCMAX); |
440 | 170M | if (code > 1) { |
441 | | /** normal code */ |
442 | 170M | offset += run_table[code]; |
443 | 170M | sign = get_bits1(gb) - 1; |
444 | 170M | iptr[offset & coef_mask] = ilvl[code] ^ (sign & 0x80000000); |
445 | 170M | } else if (code == 1) { |
446 | | /** EOB */ |
447 | 24.4k | break; |
448 | 28.5k | } else { |
449 | | /** escape */ |
450 | 28.5k | if (!version) { |
451 | 1.21k | level = get_bits(gb, coef_nb_bits); |
452 | | /** NOTE: this is rather suboptimal. reading |
453 | | * block_len_bits would be better */ |
454 | 1.21k | offset += get_bits(gb, frame_len_bits); |
455 | 27.3k | } else { |
456 | 27.3k | level = ff_wma_get_large_val(gb); |
457 | | /** escape decode */ |
458 | 27.3k | if (get_bits1(gb)) { |
459 | 19.5k | if (get_bits1(gb)) { |
460 | 7.30k | if (get_bits1(gb)) { |
461 | 2.29k | av_log(avctx, AV_LOG_ERROR, |
462 | 2.29k | "broken escape sequence\n"); |
463 | 2.29k | return AVERROR_INVALIDDATA; |
464 | 2.29k | } else |
465 | 5.01k | offset += get_bits(gb, frame_len_bits) + 4; |
466 | 7.30k | } else |
467 | 12.2k | offset += get_bits(gb, 2) + 1; |
468 | 19.5k | } |
469 | 27.3k | } |
470 | 26.2k | sign = get_bits1(gb) - 1; |
471 | 26.2k | ptr[offset & coef_mask] = (level ^ sign) - sign; |
472 | 26.2k | } |
473 | 170M | } |
474 | | /** NOTE: EOB can be omitted */ |
475 | 438k | if (offset > num_coefs) { |
476 | 46.0k | av_log(avctx, AV_LOG_ERROR, |
477 | 46.0k | "overflow (%d > %d) in spectral RLE, ignoring\n", |
478 | 46.0k | offset, |
479 | 46.0k | num_coefs |
480 | 46.0k | ); |
481 | 46.0k | return AVERROR_INVALIDDATA; |
482 | 46.0k | } |
483 | | |
484 | 392k | return 0; |
485 | 438k | } |