2 * On2 Audio for Video Codec decoder
4 * Copyright (c) 2013 Konstantin Shishkov
6 * This file is part of FFmpeg.
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 #include "libavutil/channel_layout.h"
24 #include "libavutil/ffmath.h"
25 #include "libavutil/float_dsp.h"
26 #include "libavutil/mem.h"
27 #include "libavutil/mem_internal.h"
28 #include "libavutil/tx.h"
31 #include "bytestream.h"
32 #include "codec_internal.h"
36 #include "on2avcdata.h"
38 #define ON2AVC_SUBFRAME_SIZE 1024
42 WINDOW_TYPE_LONG_STOP
,
43 WINDOW_TYPE_LONG_START
,
44 WINDOW_TYPE_8SHORT
= 3,
51 typedef struct On2AVCContext
{
52 AVCodecContext
*avctx
;
53 AVFloatDSPContext
*fdsp
;
54 AVTXContext
*mdct
, *mdct_half
, *mdct_small
;
55 AVTXContext
*fft64
, *fft128
, *fft256
, *fft512
;
56 av_tx_fn mdct_fn
, mdct_half_fn
, mdct_small_fn
;
57 av_tx_fn fft64_fn
, fft128_fn
, fft256_fn
, fft512_fn
;
58 void (*wtf
)(struct On2AVCContext
*ctx
, float *out
, float *in
, int size
);
62 const On2AVCMode
*modes
;
63 int window_type
, prev_window_type
;
64 int num_windows
, num_bands
;
66 const int *band_start
;
70 int ms_info
[ON2AVC_MAX_BANDS
];
74 uint8_t band_type
[ON2AVC_MAX_BANDS
];
75 uint8_t band_run_end
[ON2AVC_MAX_BANDS
];
78 float band_scales
[ON2AVC_MAX_BANDS
];
85 DECLARE_ALIGNED(32, float, coeffs
)[2][ON2AVC_SUBFRAME_SIZE
];
86 DECLARE_ALIGNED(32, float, delay
) [2][ON2AVC_SUBFRAME_SIZE
];
88 DECLARE_ALIGNED(32, float, temp
) [ON2AVC_SUBFRAME_SIZE
* 2];
89 DECLARE_ALIGNED(32, float, mdct_buf
) [ON2AVC_SUBFRAME_SIZE
];
90 DECLARE_ALIGNED(32, float, long_win
) [ON2AVC_SUBFRAME_SIZE
];
91 DECLARE_ALIGNED(32, float, short_win
)[ON2AVC_SUBFRAME_SIZE
/ 8];
94 static void on2avc_read_ms_info(On2AVCContext
*c
, GetBitContext
*gb
)
96 int w
, b
, band_off
= 0;
98 c
->ms_present
= get_bits1(gb
);
101 for (w
= 0; w
< c
->num_windows
; w
++) {
102 if (!c
->grouping
[w
]) {
103 memcpy(c
->ms_info
+ band_off
,
104 c
->ms_info
+ band_off
- c
->num_bands
,
105 c
->num_bands
* sizeof(*c
->ms_info
));
106 band_off
+= c
->num_bands
;
109 for (b
= 0; b
< c
->num_bands
; b
++)
110 c
->ms_info
[band_off
++] = get_bits1(gb
);
114 // do not see Table 17 in ISO/IEC 13818-7
115 static int on2avc_decode_band_types(On2AVCContext
*c
, GetBitContext
*gb
)
117 int bits_per_sect
= c
->is_long
? 5 : 3;
118 int esc_val
= (1 << bits_per_sect
) - 1;
119 int num_bands
= c
->num_bands
* c
->num_windows
;
120 int band
= 0, i
, band_type
, run_len
, run
;
122 while (band
< num_bands
) {
123 band_type
= get_bits(gb
, 4);
126 run
= get_bits(gb
, bits_per_sect
);
127 if (run
> num_bands
- band
- run_len
) {
128 av_log(c
->avctx
, AV_LOG_ERROR
, "Invalid band type run\n");
129 return AVERROR_INVALIDDATA
;
132 } while (run
== esc_val
);
133 for (i
= band
; i
< band
+ run_len
; i
++) {
134 c
->band_type
[i
] = band_type
;
135 c
->band_run_end
[i
] = band
+ run_len
;
143 // completely not like Table 18 in ISO/IEC 13818-7
144 // (no intensity stereo, different coding for the first coefficient)
145 static int on2avc_decode_band_scales(On2AVCContext
*c
, GetBitContext
*gb
)
147 int w
, w2
, b
, scale
, first
= 1;
150 for (w
= 0; w
< c
->num_windows
; w
++) {
151 if (!c
->grouping
[w
]) {
152 memcpy(c
->band_scales
+ band_off
,
153 c
->band_scales
+ band_off
- c
->num_bands
,
154 c
->num_bands
* sizeof(*c
->band_scales
));
155 band_off
+= c
->num_bands
;
158 for (b
= 0; b
< c
->num_bands
; b
++) {
159 if (!c
->band_type
[band_off
]) {
161 for (w2
= w
+ 1; w2
< c
->num_windows
; w2
++) {
164 if (c
->band_type
[w2
* c
->num_bands
+ b
]) {
170 c
->band_scales
[band_off
++] = 0;
175 scale
= get_bits(gb
, 7);
178 scale
+= get_vlc2(gb
, c
->scale_diff
.table
, 9, 3);
180 if (scale
< 0 || scale
> 127) {
181 av_log(c
->avctx
, AV_LOG_ERROR
, "Invalid scale value %d\n",
183 return AVERROR_INVALIDDATA
;
185 c
->band_scales
[band_off
++] = c
->scale_tab
[scale
];
192 static inline float on2avc_scale(int v
, float scale
)
194 return v
* sqrtf(abs(v
)) * scale
;
197 // spectral data is coded completely differently - there are no unsigned codebooks
198 static int on2avc_decode_quads(On2AVCContext
*c
, GetBitContext
*gb
, float *dst
,
199 int dst_size
, int type
, float band_scale
)
203 for (i
= 0; i
< dst_size
; i
+= 4) {
204 val
= get_vlc2(gb
, c
->cb_vlc
[type
].table
, 9, 2);
206 for (j
= 0; j
< 4; j
++) {
207 val1
= sign_extend((val
>> (12 - j
* 4)) & 0xF, 4);
208 *dst
++ = on2avc_scale(val1
, band_scale
);
215 static inline int get_egolomb(GetBitContext
*gb
)
219 while (get_bits1(gb
)) {
222 av_log(NULL
, AV_LOG_WARNING
, "Too large golomb code in get_egolomb.\n");
228 return (1 << v
) + get_bits_long(gb
, v
);
231 static int on2avc_decode_pairs(On2AVCContext
*c
, GetBitContext
*gb
, float *dst
,
232 int dst_size
, int type
, float band_scale
)
234 int i
, val
, val1
, val2
, sign
;
236 for (i
= 0; i
< dst_size
; i
+= 2) {
237 val
= get_vlc2(gb
, c
->cb_vlc
[type
].table
, 9, 2);
239 val1
= sign_extend(val
>> 8, 8);
240 val2
= sign_extend(val
& 0xFF, 8);
241 if (type
== ON2AVC_ESC_CB
) {
242 if (val1
<= -16 || val1
>= 16) {
243 sign
= 1 - (val1
< 0) * 2;
244 val1
= sign
* get_egolomb(gb
);
246 if (val2
<= -16 || val2
>= 16) {
247 sign
= 1 - (val2
< 0) * 2;
248 val2
= sign
* get_egolomb(gb
);
252 *dst
++ = on2avc_scale(val1
, band_scale
);
253 *dst
++ = on2avc_scale(val2
, band_scale
);
259 static int on2avc_read_channel_data(On2AVCContext
*c
, GetBitContext
*gb
, int ch
)
265 if ((ret
= on2avc_decode_band_types(c
, gb
)) < 0)
267 if ((ret
= on2avc_decode_band_scales(c
, gb
)) < 0)
270 coeff_ptr
= c
->coeffs
[ch
];
272 memset(coeff_ptr
, 0, ON2AVC_SUBFRAME_SIZE
* sizeof(*coeff_ptr
));
273 for (w
= 0; w
< c
->num_windows
; w
++) {
274 for (b
= 0; b
< c
->num_bands
; b
++) {
275 int band_size
= c
->band_start
[b
+ 1] - c
->band_start
[b
];
276 int band_type
= c
->band_type
[band_idx
+ b
];
279 coeff_ptr
+= band_size
;
283 on2avc_decode_quads(c
, gb
, coeff_ptr
, band_size
, band_type
,
284 c
->band_scales
[band_idx
+ b
]);
286 on2avc_decode_pairs(c
, gb
, coeff_ptr
, band_size
, band_type
,
287 c
->band_scales
[band_idx
+ b
]);
288 coeff_ptr
+= band_size
;
290 band_idx
+= c
->num_bands
;
296 static int on2avc_apply_ms(On2AVCContext
*c
)
300 float *ch0
= c
->coeffs
[0];
301 float *ch1
= c
->coeffs
[1];
303 for (w
= 0; w
< c
->num_windows
; w
++) {
304 for (b
= 0; b
< c
->num_bands
; b
++) {
305 if (c
->ms_info
[band_off
+ b
]) {
306 for (i
= c
->band_start
[b
]; i
< c
->band_start
[b
+ 1]; i
++) {
307 float l
= *ch0
, r
= *ch1
;
312 ch0
+= c
->band_start
[b
+ 1] - c
->band_start
[b
];
313 ch1
+= c
->band_start
[b
+ 1] - c
->band_start
[b
];
316 band_off
+= c
->num_bands
;
321 static void zero_head_and_tail(float *src
, int len
, int order0
, int order1
)
323 memset(src
, 0, sizeof(*src
) * order0
);
324 memset(src
+ len
- order1
, 0, sizeof(*src
) * order1
);
327 static void pretwiddle(float *src
, float *dst
, int dst_len
, int tab_step
,
328 int step
, int order0
, int order1
, const double * const *tabs
)
336 for (i
= 0; i
< tab_step
; i
++) {
338 for (j
= 0; j
< order0
; j
++)
339 sum
+= src
[j
] * tab
[j
* tab_step
+ i
];
343 out
= dst
+ dst_len
- tab_step
;
345 src2
= src
+ (dst_len
- tab_step
) / step
+ 1 + order0
;
346 for (i
= 0; i
< tab_step
; i
++) {
348 for (j
= 0; j
< order1
; j
++)
349 sum
+= src2
[j
] * tab
[j
* tab_step
+ i
];
354 static void twiddle(float *src1
, float *src2
, int src2_len
,
355 const double *tab
, int tab_len
, int step
,
356 int order0
, int order1
, const double * const *tabs
)
362 steps
= (src2_len
- tab_len
) / step
+ 1;
363 pretwiddle(src1
, src2
, src2_len
, tab_len
, step
, order0
, order1
, tabs
);
366 for (i
= 0; i
< steps
; i
++) {
367 float in0
= src1
[order0
+ i
];
368 int pos
= (src2_len
- 1) & mask
;
371 const double *t
= tab
;
372 for (j
= pos
; j
>= 0; j
--)
373 src2
[j
] += in0
* *t
++;
374 for (j
= 0; j
< tab_len
- pos
- 1; j
++)
375 src2
[src2_len
- j
- 1] += in0
* tab
[pos
+ 1 + j
];
377 for (j
= 0; j
< tab_len
; j
++)
378 src2
[pos
- j
] += in0
* tab
[j
];
384 #define CMUL1_R(s, t, is, it) \
385 s[is + 0] * t[it + 0] - s[is + 1] * t[it + 1]
386 #define CMUL1_I(s, t, is, it) \
387 s[is + 0] * t[it + 1] + s[is + 1] * t[it + 0]
388 #define CMUL2_R(s, t, is, it) \
389 s[is + 0] * t[it + 0] + s[is + 1] * t[it + 1]
390 #define CMUL2_I(s, t, is, it) \
391 s[is + 0] * t[it + 1] - s[is + 1] * t[it + 0]
393 #define CMUL0(dst, id, s0, s1, s2, s3, t0, t1, t2, t3, is, it) \
394 dst[id] = s0[is] * t0[it] + s1[is] * t1[it] \
395 + s2[is] * t2[it] + s3[is] * t3[it]; \
396 dst[id + 1] = s0[is] * t0[it + 1] + s1[is] * t1[it + 1] \
397 + s2[is] * t2[it + 1] + s3[is] * t3[it + 1];
399 #define CMUL1(dst, s0, s1, s2, s3, t0, t1, t2, t3, is, it) \
400 *dst++ = CMUL1_R(s0, t0, is, it) \
401 + CMUL1_R(s1, t1, is, it) \
402 + CMUL1_R(s2, t2, is, it) \
403 + CMUL1_R(s3, t3, is, it); \
404 *dst++ = CMUL1_I(s0, t0, is, it) \
405 + CMUL1_I(s1, t1, is, it) \
406 + CMUL1_I(s2, t2, is, it) \
407 + CMUL1_I(s3, t3, is, it);
409 #define CMUL2(dst, s0, s1, s2, s3, t0, t1, t2, t3, is, it) \
410 *dst++ = CMUL2_R(s0, t0, is, it) \
411 + CMUL2_R(s1, t1, is, it) \
412 + CMUL2_R(s2, t2, is, it) \
413 + CMUL2_R(s3, t3, is, it); \
414 *dst++ = CMUL2_I(s0, t0, is, it) \
415 + CMUL2_I(s1, t1, is, it) \
416 + CMUL2_I(s2, t2, is, it) \
417 + CMUL2_I(s3, t3, is, it);
419 static void combine_fft(float *s0
, float *s1
, float *s2
, float *s3
, float *dst
,
420 const float *t0
, const float *t1
,
421 const float *t2
, const float *t3
, int len
, int step
)
423 const float *h0
, *h1
, *h2
, *h3
;
426 int len2
= len
>> 1, len4
= len
>> 2;
431 for (half
= len2
; tmp
> 1; half
<<= 1, tmp
>>= 1);
438 CMUL0(dst
, 0, s0
, s1
, s2
, s3
, t0
, t1
, t2
, t3
, 0, 0);
440 hoff
= 2 * step
* (len4
>> 1);
445 d2
= dst
+ 2 + (len
>> 1);
446 for (i
= 0; i
< (len4
- 1) >> 1; i
++) {
447 CMUL1(d1
, s0
, s1
, s2
, s3
, t0
, t1
, t2
, t3
, j
, k
);
448 CMUL1(d2
, s0
, s1
, s2
, s3
, h0
, h1
, h2
, h3
, j
, k
);
452 CMUL0(dst
, len4
, s0
, s1
, s2
, s3
, t0
, t1
, t2
, t3
, 1, hoff
);
453 CMUL0(dst
, len4
+ len2
, s0
, s1
, s2
, s3
, h0
, h1
, h2
, h3
, 1, hoff
);
456 k
= hoff
+ 2 * step
* len4
;
458 d2
= dst
+ len4
+ 2 + len2
;
459 for (i
= 0; i
< (len4
- 2) >> 1; i
++) {
460 CMUL2(d1
, s0
, s1
, s2
, s3
, t0
, t1
, t2
, t3
, j
, k
);
461 CMUL2(d2
, s0
, s1
, s2
, s3
, h0
, h1
, h2
, h3
, j
, k
);
465 CMUL0(dst
, len2
+ 4, s0
, s1
, s2
, s3
, t0
, t1
, t2
, t3
, 0, k
);
468 static void wtf_end_512(On2AVCContext
*c
, float *out
, float *src
,
469 float *tmp0
, float *tmp1
)
471 memcpy(tmp1
, tmp0
, 384 * sizeof(*tmp0
));
472 memcpy(tmp0
+ 384, tmp1
+ 384, 128 * sizeof(*tmp0
));
474 zero_head_and_tail(tmp1
, 128, 16, 4);
475 zero_head_and_tail(tmp1
+ 128, 128, 16, 4);
476 zero_head_and_tail(tmp1
+ 256, 128, 13, 7);
477 zero_head_and_tail(tmp1
+ 384, 128, 15, 5);
479 c
->fft64_fn(c
->fft64
, src
+ 0, tmp1
+ 0, sizeof(float));
480 c
->fft64_fn(c
->fft64
, src
+ 128, tmp1
+ 128, sizeof(float));
481 c
->fft64_fn(c
->fft64
, src
+ 256, tmp1
+ 256, sizeof(float));
482 c
->fft64_fn(c
->fft64
, src
+ 384, tmp1
+ 384, sizeof(float));
484 combine_fft(src
, src
+ 128, src
+ 256, src
+ 384, tmp1
,
485 ff_on2avc_ctab_1
, ff_on2avc_ctab_2
,
486 ff_on2avc_ctab_3
, ff_on2avc_ctab_4
, 512, 2);
488 c
->fft256_fn(c
->fft256
, src
, tmp1
, sizeof(float));
490 pretwiddle(&tmp0
[ 0], src
, 512, 84, 4, 16, 4, ff_on2avc_tabs_20_84_1
);
491 pretwiddle(&tmp0
[128], src
, 512, 84, 4, 16, 4, ff_on2avc_tabs_20_84_2
);
492 pretwiddle(&tmp0
[256], src
, 512, 84, 4, 13, 7, ff_on2avc_tabs_20_84_3
);
493 pretwiddle(&tmp0
[384], src
, 512, 84, 4, 15, 5, ff_on2avc_tabs_20_84_4
);
496 static void wtf_end_1024(On2AVCContext
*c
, float *out
, float *src
,
497 float *tmp0
, float *tmp1
)
499 memcpy(tmp1
, tmp0
, 768 * sizeof(*tmp0
));
500 memcpy(tmp0
+ 768, tmp1
+ 768, 256 * sizeof(*tmp0
));
502 zero_head_and_tail(tmp1
, 256, 16, 4);
503 zero_head_and_tail(tmp1
+ 256, 256, 16, 4);
504 zero_head_and_tail(tmp1
+ 512, 256, 13, 7);
505 zero_head_and_tail(tmp1
+ 768, 256, 15, 5);
507 c
->fft128_fn(c
->fft128
, src
+ 0, tmp1
+ 0, sizeof(float));
508 c
->fft128_fn(c
->fft128
, src
+ 256, tmp1
+ 256, sizeof(float));
509 c
->fft128_fn(c
->fft128
, src
+ 512, tmp1
+ 512, sizeof(float));
510 c
->fft128_fn(c
->fft128
, src
+ 768, tmp1
+ 768, sizeof(float));
512 combine_fft(src
, src
+ 256, src
+ 512, src
+ 768, tmp1
,
513 ff_on2avc_ctab_1
, ff_on2avc_ctab_2
,
514 ff_on2avc_ctab_3
, ff_on2avc_ctab_4
, 1024, 1);
516 c
->fft512_fn(c
->fft512
, src
, tmp1
, sizeof(float));
518 pretwiddle(&tmp0
[ 0], src
, 1024, 84, 4, 16, 4, ff_on2avc_tabs_20_84_1
);
519 pretwiddle(&tmp0
[256], src
, 1024, 84, 4, 16, 4, ff_on2avc_tabs_20_84_2
);
520 pretwiddle(&tmp0
[512], src
, 1024, 84, 4, 13, 7, ff_on2avc_tabs_20_84_3
);
521 pretwiddle(&tmp0
[768], src
, 1024, 84, 4, 15, 5, ff_on2avc_tabs_20_84_4
);
524 static void wtf_40(On2AVCContext
*c
, float *out
, float *src
, int size
)
526 float *tmp0
= c
->temp
, *tmp1
= c
->temp
+ 1024;
528 memset(tmp0
, 0, sizeof(*tmp0
) * 1024);
529 memset(tmp1
, 0, sizeof(*tmp1
) * 1024);
532 twiddle(src
, &tmp0
[ 0], 16, ff_on2avc_tab_10_1
, 10, 2, 1, 3, ff_on2avc_tabs_4_10_1
);
533 twiddle(src
+ 8, &tmp0
[ 0], 16, ff_on2avc_tab_10_2
, 10, 2, 3, 1, ff_on2avc_tabs_4_10_2
);
534 twiddle(src
+ 16, &tmp0
[ 16], 16, ff_on2avc_tab_10_2
, 10, 2, 3, 1, ff_on2avc_tabs_4_10_2
);
535 twiddle(src
+ 24, &tmp0
[ 16], 16, ff_on2avc_tab_10_1
, 10, 2, 1, 3, ff_on2avc_tabs_4_10_1
);
536 twiddle(src
+ 32, &tmp0
[ 32], 16, ff_on2avc_tab_10_1
, 10, 2, 1, 3, ff_on2avc_tabs_4_10_1
);
537 twiddle(src
+ 40, &tmp0
[ 32], 16, ff_on2avc_tab_10_2
, 10, 2, 3, 1, ff_on2avc_tabs_4_10_2
);
538 twiddle(src
+ 48, &tmp0
[ 48], 16, ff_on2avc_tab_10_2
, 10, 2, 3, 1, ff_on2avc_tabs_4_10_2
);
539 twiddle(src
+ 56, &tmp0
[ 48], 16, ff_on2avc_tab_10_1
, 10, 2, 1, 3, ff_on2avc_tabs_4_10_1
);
540 twiddle(&tmp0
[ 0], &tmp1
[ 0], 32, ff_on2avc_tab_20_1
, 20, 2, 5, 4, ff_on2avc_tabs_9_20_1
);
541 twiddle(&tmp0
[16], &tmp1
[ 0], 32, ff_on2avc_tab_20_2
, 20, 2, 4, 5, ff_on2avc_tabs_9_20_2
);
542 twiddle(&tmp0
[32], &tmp1
[ 32], 32, ff_on2avc_tab_20_2
, 20, 2, 4, 5, ff_on2avc_tabs_9_20_2
);
543 twiddle(&tmp0
[48], &tmp1
[ 32], 32, ff_on2avc_tab_20_1
, 20, 2, 5, 4, ff_on2avc_tabs_9_20_1
);
544 twiddle(src
+ 64, &tmp1
[ 64], 32, ff_on2avc_tab_20_1
, 20, 2, 5, 4, ff_on2avc_tabs_9_20_1
);
545 twiddle(src
+ 80, &tmp1
[ 64], 32, ff_on2avc_tab_20_2
, 20, 2, 4, 5, ff_on2avc_tabs_9_20_2
);
546 twiddle(src
+ 96, &tmp1
[ 96], 32, ff_on2avc_tab_20_2
, 20, 2, 4, 5, ff_on2avc_tabs_9_20_2
);
547 twiddle(src
+ 112, &tmp1
[ 96], 32, ff_on2avc_tab_20_1
, 20, 2, 5, 4, ff_on2avc_tabs_9_20_1
);
548 twiddle(src
+ 128, &tmp1
[128], 32, ff_on2avc_tab_20_1
, 20, 2, 5, 4, ff_on2avc_tabs_9_20_1
);
549 twiddle(src
+ 144, &tmp1
[128], 32, ff_on2avc_tab_20_2
, 20, 2, 4, 5, ff_on2avc_tabs_9_20_2
);
550 twiddle(src
+ 160, &tmp1
[160], 32, ff_on2avc_tab_20_2
, 20, 2, 4, 5, ff_on2avc_tabs_9_20_2
);
551 twiddle(src
+ 176, &tmp1
[160], 32, ff_on2avc_tab_20_1
, 20, 2, 5, 4, ff_on2avc_tabs_9_20_1
);
553 memset(tmp0
, 0, 64 * sizeof(*tmp0
));
555 twiddle(&tmp1
[ 0], &tmp0
[ 0], 128, ff_on2avc_tab_84_1
, 84, 4, 16, 4, ff_on2avc_tabs_20_84_1
);
556 twiddle(&tmp1
[ 32], &tmp0
[ 0], 128, ff_on2avc_tab_84_2
, 84, 4, 16, 4, ff_on2avc_tabs_20_84_2
);
557 twiddle(&tmp1
[ 64], &tmp0
[ 0], 128, ff_on2avc_tab_84_3
, 84, 4, 13, 7, ff_on2avc_tabs_20_84_3
);
558 twiddle(&tmp1
[ 96], &tmp0
[ 0], 128, ff_on2avc_tab_84_4
, 84, 4, 15, 5, ff_on2avc_tabs_20_84_4
);
559 twiddle(&tmp1
[128], &tmp0
[128], 128, ff_on2avc_tab_84_4
, 84, 4, 15, 5, ff_on2avc_tabs_20_84_4
);
560 twiddle(&tmp1
[160], &tmp0
[128], 128, ff_on2avc_tab_84_3
, 84, 4, 13, 7, ff_on2avc_tabs_20_84_3
);
561 twiddle(src
+ 192, &tmp0
[128], 128, ff_on2avc_tab_84_2
, 84, 4, 16, 4, ff_on2avc_tabs_20_84_2
);
562 twiddle(src
+ 224, &tmp0
[128], 128, ff_on2avc_tab_84_1
, 84, 4, 16, 4, ff_on2avc_tabs_20_84_1
);
563 twiddle(src
+ 256, &tmp0
[256], 128, ff_on2avc_tab_84_1
, 84, 4, 16, 4, ff_on2avc_tabs_20_84_1
);
564 twiddle(src
+ 288, &tmp0
[256], 128, ff_on2avc_tab_84_2
, 84, 4, 16, 4, ff_on2avc_tabs_20_84_2
);
565 twiddle(src
+ 320, &tmp0
[256], 128, ff_on2avc_tab_84_3
, 84, 4, 13, 7, ff_on2avc_tabs_20_84_3
);
566 twiddle(src
+ 352, &tmp0
[256], 128, ff_on2avc_tab_84_4
, 84, 4, 15, 5, ff_on2avc_tabs_20_84_4
);
568 wtf_end_512(c
, out
, src
, tmp0
, tmp1
);
570 twiddle(src
, &tmp0
[ 0], 32, ff_on2avc_tab_20_1
, 20, 2, 5, 4, ff_on2avc_tabs_9_20_1
);
571 twiddle(src
+ 16, &tmp0
[ 0], 32, ff_on2avc_tab_20_2
, 20, 2, 4, 5, ff_on2avc_tabs_9_20_2
);
572 twiddle(src
+ 32, &tmp0
[ 32], 32, ff_on2avc_tab_20_2
, 20, 2, 4, 5, ff_on2avc_tabs_9_20_2
);
573 twiddle(src
+ 48, &tmp0
[ 32], 32, ff_on2avc_tab_20_1
, 20, 2, 5, 4, ff_on2avc_tabs_9_20_1
);
574 twiddle(src
+ 64, &tmp0
[ 64], 32, ff_on2avc_tab_20_1
, 20, 2, 5, 4, ff_on2avc_tabs_9_20_1
);
575 twiddle(src
+ 80, &tmp0
[ 64], 32, ff_on2avc_tab_20_2
, 20, 2, 4, 5, ff_on2avc_tabs_9_20_2
);
576 twiddle(src
+ 96, &tmp0
[ 96], 32, ff_on2avc_tab_20_2
, 20, 2, 4, 5, ff_on2avc_tabs_9_20_2
);
577 twiddle(src
+ 112, &tmp0
[ 96], 32, ff_on2avc_tab_20_1
, 20, 2, 5, 4, ff_on2avc_tabs_9_20_1
);
578 twiddle(&tmp0
[ 0], &tmp1
[ 0], 64, ff_on2avc_tab_40_1
, 40, 2, 11, 8, ff_on2avc_tabs_19_40_1
);
579 twiddle(&tmp0
[32], &tmp1
[ 0], 64, ff_on2avc_tab_40_2
, 40, 2, 8, 11, ff_on2avc_tabs_19_40_2
);
580 twiddle(&tmp0
[64], &tmp1
[ 64], 64, ff_on2avc_tab_40_2
, 40, 2, 8, 11, ff_on2avc_tabs_19_40_2
);
581 twiddle(&tmp0
[96], &tmp1
[ 64], 64, ff_on2avc_tab_40_1
, 40, 2, 11, 8, ff_on2avc_tabs_19_40_1
);
582 twiddle(src
+ 128, &tmp1
[128], 64, ff_on2avc_tab_40_1
, 40, 2, 11, 8, ff_on2avc_tabs_19_40_1
);
583 twiddle(src
+ 160, &tmp1
[128], 64, ff_on2avc_tab_40_2
, 40, 2, 8, 11, ff_on2avc_tabs_19_40_2
);
584 twiddle(src
+ 192, &tmp1
[192], 64, ff_on2avc_tab_40_2
, 40, 2, 8, 11, ff_on2avc_tabs_19_40_2
);
585 twiddle(src
+ 224, &tmp1
[192], 64, ff_on2avc_tab_40_1
, 40, 2, 11, 8, ff_on2avc_tabs_19_40_1
);
586 twiddle(src
+ 256, &tmp1
[256], 64, ff_on2avc_tab_40_1
, 40, 2, 11, 8, ff_on2avc_tabs_19_40_1
);
587 twiddle(src
+ 288, &tmp1
[256], 64, ff_on2avc_tab_40_2
, 40, 2, 8, 11, ff_on2avc_tabs_19_40_2
);
588 twiddle(src
+ 320, &tmp1
[320], 64, ff_on2avc_tab_40_2
, 40, 2, 8, 11, ff_on2avc_tabs_19_40_2
);
589 twiddle(src
+ 352, &tmp1
[320], 64, ff_on2avc_tab_40_1
, 40, 2, 11, 8, ff_on2avc_tabs_19_40_1
);
591 memset(tmp0
, 0, 128 * sizeof(*tmp0
));
593 twiddle(&tmp1
[ 0], &tmp0
[ 0], 256, ff_on2avc_tab_84_1
, 84, 4, 16, 4, ff_on2avc_tabs_20_84_1
);
594 twiddle(&tmp1
[ 64], &tmp0
[ 0], 256, ff_on2avc_tab_84_2
, 84, 4, 16, 4, ff_on2avc_tabs_20_84_2
);
595 twiddle(&tmp1
[128], &tmp0
[ 0], 256, ff_on2avc_tab_84_3
, 84, 4, 13, 7, ff_on2avc_tabs_20_84_3
);
596 twiddle(&tmp1
[192], &tmp0
[ 0], 256, ff_on2avc_tab_84_4
, 84, 4, 15, 5, ff_on2avc_tabs_20_84_4
);
597 twiddle(&tmp1
[256], &tmp0
[256], 256, ff_on2avc_tab_84_4
, 84, 4, 15, 5, ff_on2avc_tabs_20_84_4
);
598 twiddle(&tmp1
[320], &tmp0
[256], 256, ff_on2avc_tab_84_3
, 84, 4, 13, 7, ff_on2avc_tabs_20_84_3
);
599 twiddle(src
+ 384, &tmp0
[256], 256, ff_on2avc_tab_84_2
, 84, 4, 16, 4, ff_on2avc_tabs_20_84_2
);
600 twiddle(src
+ 448, &tmp0
[256], 256, ff_on2avc_tab_84_1
, 84, 4, 16, 4, ff_on2avc_tabs_20_84_1
);
601 twiddle(src
+ 512, &tmp0
[512], 256, ff_on2avc_tab_84_1
, 84, 4, 16, 4, ff_on2avc_tabs_20_84_1
);
602 twiddle(src
+ 576, &tmp0
[512], 256, ff_on2avc_tab_84_2
, 84, 4, 16, 4, ff_on2avc_tabs_20_84_2
);
603 twiddle(src
+ 640, &tmp0
[512], 256, ff_on2avc_tab_84_3
, 84, 4, 13, 7, ff_on2avc_tabs_20_84_3
);
604 twiddle(src
+ 704, &tmp0
[512], 256, ff_on2avc_tab_84_4
, 84, 4, 15, 5, ff_on2avc_tabs_20_84_4
);
606 wtf_end_1024(c
, out
, src
, tmp0
, tmp1
);
610 static void wtf_44(On2AVCContext
*c
, float *out
, float *src
, int size
)
612 float *tmp0
= c
->temp
, *tmp1
= c
->temp
+ 1024;
614 memset(tmp0
, 0, sizeof(*tmp0
) * 1024);
615 memset(tmp1
, 0, sizeof(*tmp1
) * 1024);
618 twiddle(src
, &tmp0
[ 0], 16, ff_on2avc_tab_10_1
, 10, 2, 1, 3, ff_on2avc_tabs_4_10_1
);
619 twiddle(src
+ 8, &tmp0
[ 0], 16, ff_on2avc_tab_10_2
, 10, 2, 3, 1, ff_on2avc_tabs_4_10_2
);
620 twiddle(src
+ 16, &tmp0
[16], 16, ff_on2avc_tab_10_2
, 10, 2, 3, 1, ff_on2avc_tabs_4_10_2
);
621 twiddle(src
+ 24, &tmp0
[16], 16, ff_on2avc_tab_10_1
, 10, 2, 1, 3, ff_on2avc_tabs_4_10_1
);
622 twiddle(src
+ 32, &tmp0
[32], 16, ff_on2avc_tab_10_1
, 10, 2, 1, 3, ff_on2avc_tabs_4_10_1
);
623 twiddle(src
+ 40, &tmp0
[32], 16, ff_on2avc_tab_10_2
, 10, 2, 3, 1, ff_on2avc_tabs_4_10_2
);
624 twiddle(src
+ 48, &tmp0
[48], 16, ff_on2avc_tab_10_2
, 10, 2, 3, 1, ff_on2avc_tabs_4_10_2
);
625 twiddle(src
+ 56, &tmp0
[48], 16, ff_on2avc_tab_10_1
, 10, 2, 1, 3, ff_on2avc_tabs_4_10_1
);
626 twiddle(&tmp0
[ 0], &tmp1
[ 0], 32, ff_on2avc_tab_20_1
, 20, 2, 5, 4, ff_on2avc_tabs_9_20_1
);
627 twiddle(&tmp0
[16], &tmp1
[ 0], 32, ff_on2avc_tab_20_2
, 20, 2, 4, 5, ff_on2avc_tabs_9_20_2
);
628 twiddle(&tmp0
[32], &tmp1
[32], 32, ff_on2avc_tab_20_2
, 20, 2, 4, 5, ff_on2avc_tabs_9_20_2
);
629 twiddle(&tmp0
[48], &tmp1
[32], 32, ff_on2avc_tab_20_1
, 20, 2, 5, 4, ff_on2avc_tabs_9_20_1
);
630 twiddle(src
+ 64, &tmp1
[64], 32, ff_on2avc_tab_20_1
, 20, 2, 5, 4, ff_on2avc_tabs_9_20_1
);
631 twiddle(src
+ 80, &tmp1
[64], 32, ff_on2avc_tab_20_2
, 20, 2, 4, 5, ff_on2avc_tabs_9_20_2
);
632 twiddle(src
+ 96, &tmp1
[96], 32, ff_on2avc_tab_20_2
, 20, 2, 4, 5, ff_on2avc_tabs_9_20_2
);
633 twiddle(src
+ 112, &tmp1
[96], 32, ff_on2avc_tab_20_1
, 20, 2, 5, 4, ff_on2avc_tabs_9_20_1
);
635 memset(tmp0
, 0, 64 * sizeof(*tmp0
));
637 twiddle(&tmp1
[ 0], &tmp0
[ 0], 128, ff_on2avc_tab_84_1
, 84, 4, 16, 4, ff_on2avc_tabs_20_84_1
);
638 twiddle(&tmp1
[32], &tmp0
[ 0], 128, ff_on2avc_tab_84_2
, 84, 4, 16, 4, ff_on2avc_tabs_20_84_2
);
639 twiddle(&tmp1
[64], &tmp0
[ 0], 128, ff_on2avc_tab_84_3
, 84, 4, 13, 7, ff_on2avc_tabs_20_84_3
);
640 twiddle(&tmp1
[96], &tmp0
[ 0], 128, ff_on2avc_tab_84_4
, 84, 4, 15, 5, ff_on2avc_tabs_20_84_4
);
641 twiddle(src
+ 128, &tmp0
[128], 128, ff_on2avc_tab_84_4
, 84, 4, 15, 5, ff_on2avc_tabs_20_84_4
);
642 twiddle(src
+ 160, &tmp0
[128], 128, ff_on2avc_tab_84_3
, 84, 4, 13, 7, ff_on2avc_tabs_20_84_3
);
643 twiddle(src
+ 192, &tmp0
[128], 128, ff_on2avc_tab_84_2
, 84, 4, 16, 4, ff_on2avc_tabs_20_84_2
);
644 twiddle(src
+ 224, &tmp0
[128], 128, ff_on2avc_tab_84_1
, 84, 4, 16, 4, ff_on2avc_tabs_20_84_1
);
645 twiddle(src
+ 256, &tmp0
[256], 128, ff_on2avc_tab_40_1
, 40, 2, 11, 8, ff_on2avc_tabs_19_40_1
);
646 twiddle(src
+ 320, &tmp0
[256], 128, ff_on2avc_tab_40_2
, 40, 2, 8, 11, ff_on2avc_tabs_19_40_2
);
648 wtf_end_512(c
, out
, src
, tmp0
, tmp1
);
650 twiddle(src
, &tmp0
[ 0], 32, ff_on2avc_tab_20_1
, 20, 2, 5, 4, ff_on2avc_tabs_9_20_1
);
651 twiddle(src
+ 16, &tmp0
[ 0], 32, ff_on2avc_tab_20_2
, 20, 2, 4, 5, ff_on2avc_tabs_9_20_2
);
652 twiddle(src
+ 32, &tmp0
[ 32], 32, ff_on2avc_tab_20_2
, 20, 2, 4, 5, ff_on2avc_tabs_9_20_2
);
653 twiddle(src
+ 48, &tmp0
[ 32], 32, ff_on2avc_tab_20_1
, 20, 2, 5, 4, ff_on2avc_tabs_9_20_1
);
654 twiddle(src
+ 64, &tmp0
[ 64], 32, ff_on2avc_tab_20_1
, 20, 2, 5, 4, ff_on2avc_tabs_9_20_1
);
655 twiddle(src
+ 80, &tmp0
[ 64], 32, ff_on2avc_tab_20_2
, 20, 2, 4, 5, ff_on2avc_tabs_9_20_2
);
656 twiddle(src
+ 96, &tmp0
[ 96], 32, ff_on2avc_tab_20_2
, 20, 2, 4, 5, ff_on2avc_tabs_9_20_2
);
657 twiddle(src
+ 112, &tmp0
[ 96], 32, ff_on2avc_tab_20_1
, 20, 2, 5, 4, ff_on2avc_tabs_9_20_1
);
658 twiddle(&tmp0
[ 0], &tmp1
[ 0], 64, ff_on2avc_tab_40_1
, 40, 2, 11, 8, ff_on2avc_tabs_19_40_1
);
659 twiddle(&tmp0
[32], &tmp1
[ 0], 64, ff_on2avc_tab_40_2
, 40, 2, 8, 11, ff_on2avc_tabs_19_40_2
);
660 twiddle(&tmp0
[64], &tmp1
[ 64], 64, ff_on2avc_tab_40_2
, 40, 2, 8, 11, ff_on2avc_tabs_19_40_2
);
661 twiddle(&tmp0
[96], &tmp1
[ 64], 64, ff_on2avc_tab_40_1
, 40, 2, 11, 8, ff_on2avc_tabs_19_40_1
);
662 twiddle(src
+ 128, &tmp1
[128], 64, ff_on2avc_tab_40_1
, 40, 2, 11, 8, ff_on2avc_tabs_19_40_1
);
663 twiddle(src
+ 160, &tmp1
[128], 64, ff_on2avc_tab_40_2
, 40, 2, 8, 11, ff_on2avc_tabs_19_40_2
);
664 twiddle(src
+ 192, &tmp1
[192], 64, ff_on2avc_tab_40_2
, 40, 2, 8, 11, ff_on2avc_tabs_19_40_2
);
665 twiddle(src
+ 224, &tmp1
[192], 64, ff_on2avc_tab_40_1
, 40, 2, 11, 8, ff_on2avc_tabs_19_40_1
);
667 memset(tmp0
, 0, 128 * sizeof(*tmp0
));
669 twiddle(&tmp1
[ 0], &tmp0
[ 0], 256, ff_on2avc_tab_84_1
, 84, 4, 16, 4, ff_on2avc_tabs_20_84_1
);
670 twiddle(&tmp1
[ 64], &tmp0
[ 0], 256, ff_on2avc_tab_84_2
, 84, 4, 16, 4, ff_on2avc_tabs_20_84_2
);
671 twiddle(&tmp1
[128], &tmp0
[ 0], 256, ff_on2avc_tab_84_3
, 84, 4, 13, 7, ff_on2avc_tabs_20_84_3
);
672 twiddle(&tmp1
[192], &tmp0
[ 0], 256, ff_on2avc_tab_84_4
, 84, 4, 15, 5, ff_on2avc_tabs_20_84_4
);
673 twiddle(src
+ 256, &tmp0
[256], 256, ff_on2avc_tab_84_4
, 84, 4, 15, 5, ff_on2avc_tabs_20_84_4
);
674 twiddle(src
+ 320, &tmp0
[256], 256, ff_on2avc_tab_84_3
, 84, 4, 13, 7, ff_on2avc_tabs_20_84_3
);
675 twiddle(src
+ 384, &tmp0
[256], 256, ff_on2avc_tab_84_2
, 84, 4, 16, 4, ff_on2avc_tabs_20_84_2
);
676 twiddle(src
+ 448, &tmp0
[256], 256, ff_on2avc_tab_84_1
, 84, 4, 16, 4, ff_on2avc_tabs_20_84_1
);
677 twiddle(src
+ 512, &tmp0
[512], 256, ff_on2avc_tab_40_1
, 40, 2, 11, 8, ff_on2avc_tabs_19_40_1
);
678 twiddle(src
+ 640, &tmp0
[512], 256, ff_on2avc_tab_40_2
, 40, 2, 8, 11, ff_on2avc_tabs_19_40_2
);
680 wtf_end_1024(c
, out
, src
, tmp0
, tmp1
);
684 static int on2avc_reconstruct_channel_ext(On2AVCContext
*c
, AVFrame
*dst
, int offset
)
688 for (ch
= 0; ch
< c
->avctx
->ch_layout
.nb_channels
; ch
++) {
689 float *out
= (float*)dst
->extended_data
[ch
] + offset
;
690 float *in
= c
->coeffs
[ch
];
691 float *saved
= c
->delay
[ch
];
692 float *buf
= c
->mdct_buf
;
693 float *wout
= out
+ 448;
695 switch (c
->window_type
) {
696 case WINDOW_TYPE_EXT7
:
697 c
->mdct_fn(c
->mdct
, buf
, in
, sizeof(float));
699 case WINDOW_TYPE_EXT4
:
700 c
->wtf(c
, buf
, in
, 1024);
702 case WINDOW_TYPE_EXT5
:
703 c
->wtf(c
, buf
, in
, 512);
704 c
->mdct_half_fn(c
->mdct_half
, buf
+ 512, in
+ 512, sizeof(float));
705 for (i
= 0; i
< 256; i
++) {
706 FFSWAP(float, buf
[i
+ 512], buf
[1023 - i
]);
709 case WINDOW_TYPE_EXT6
:
710 c
->mdct_half_fn(c
->mdct_half
, buf
, in
, sizeof(float));
711 for (i
= 0; i
< 256; i
++) {
712 FFSWAP(float, buf
[i
], buf
[511 - i
]);
714 c
->wtf(c
, buf
+ 512, in
+ 512, 512);
718 memcpy(out
, saved
, 448 * sizeof(float));
719 c
->fdsp
->vector_fmul_window(wout
, saved
+ 448, buf
, c
->short_win
, 64);
720 memcpy(wout
+ 128, buf
+ 64, 448 * sizeof(float));
721 memcpy(saved
, buf
+ 512, 448 * sizeof(float));
722 memcpy(saved
+ 448, buf
+ 7*128 + 64, 64 * sizeof(float));
728 // not borrowed from aacdec.c - the codec has original design after all
729 static int on2avc_reconstruct_channel(On2AVCContext
*c
, int channel
,
730 AVFrame
*dst
, int offset
)
733 float *out
= (float*)dst
->extended_data
[channel
] + offset
;
734 float *in
= c
->coeffs
[channel
];
735 float *saved
= c
->delay
[channel
];
736 float *buf
= c
->mdct_buf
;
737 float *temp
= c
->temp
;
739 switch (c
->window_type
) {
740 case WINDOW_TYPE_LONG_START
:
741 case WINDOW_TYPE_LONG_STOP
:
742 case WINDOW_TYPE_LONG
:
743 c
->mdct_fn(c
->mdct
, buf
, in
, sizeof(float));
745 case WINDOW_TYPE_8SHORT
:
746 for (i
= 0; i
< ON2AVC_SUBFRAME_SIZE
; i
+= ON2AVC_SUBFRAME_SIZE
/ 8)
747 c
->mdct_small_fn(c
->mdct_small
, buf
+ i
, in
+ i
, sizeof(float));
751 if ((c
->prev_window_type
== WINDOW_TYPE_LONG
||
752 c
->prev_window_type
== WINDOW_TYPE_LONG_STOP
) &&
753 (c
->window_type
== WINDOW_TYPE_LONG
||
754 c
->window_type
== WINDOW_TYPE_LONG_START
)) {
755 c
->fdsp
->vector_fmul_window(out
, saved
, buf
, c
->long_win
, 512);
757 float *wout
= out
+ 448;
758 memcpy(out
, saved
, 448 * sizeof(float));
760 if (c
->window_type
== WINDOW_TYPE_8SHORT
) {
761 c
->fdsp
->vector_fmul_window(wout
+ 0*128, saved
+ 448, buf
+ 0*128, c
->short_win
, 64);
762 c
->fdsp
->vector_fmul_window(wout
+ 1*128, buf
+ 0*128 + 64, buf
+ 1*128, c
->short_win
, 64);
763 c
->fdsp
->vector_fmul_window(wout
+ 2*128, buf
+ 1*128 + 64, buf
+ 2*128, c
->short_win
, 64);
764 c
->fdsp
->vector_fmul_window(wout
+ 3*128, buf
+ 2*128 + 64, buf
+ 3*128, c
->short_win
, 64);
765 c
->fdsp
->vector_fmul_window(temp
, buf
+ 3*128 + 64, buf
+ 4*128, c
->short_win
, 64);
766 memcpy(wout
+ 4*128, temp
, 64 * sizeof(float));
768 c
->fdsp
->vector_fmul_window(wout
, saved
+ 448, buf
, c
->short_win
, 64);
769 memcpy(wout
+ 128, buf
+ 64, 448 * sizeof(float));
774 switch (c
->window_type
) {
775 case WINDOW_TYPE_8SHORT
:
776 memcpy(saved
, temp
+ 64, 64 * sizeof(float));
777 c
->fdsp
->vector_fmul_window(saved
+ 64, buf
+ 4*128 + 64, buf
+ 5*128, c
->short_win
, 64);
778 c
->fdsp
->vector_fmul_window(saved
+ 192, buf
+ 5*128 + 64, buf
+ 6*128, c
->short_win
, 64);
779 c
->fdsp
->vector_fmul_window(saved
+ 320, buf
+ 6*128 + 64, buf
+ 7*128, c
->short_win
, 64);
780 memcpy(saved
+ 448, buf
+ 7*128 + 64, 64 * sizeof(float));
782 case WINDOW_TYPE_LONG_START
:
783 memcpy(saved
, buf
+ 512, 448 * sizeof(float));
784 memcpy(saved
+ 448, buf
+ 7*128 + 64, 64 * sizeof(float));
786 case WINDOW_TYPE_LONG_STOP
:
787 case WINDOW_TYPE_LONG
:
788 memcpy(saved
, buf
+ 512, 512 * sizeof(float));
794 static int on2avc_decode_subframe(On2AVCContext
*c
, const uint8_t *buf
,
795 int buf_size
, AVFrame
*dst
, int offset
)
800 if ((ret
= init_get_bits8(&gb
, buf
, buf_size
)) < 0)
803 if (get_bits1(&gb
)) {
804 av_log(c
->avctx
, AV_LOG_ERROR
, "enh bit set\n");
805 return AVERROR_INVALIDDATA
;
807 c
->prev_window_type
= c
->window_type
;
808 c
->window_type
= get_bits(&gb
, 3);
810 c
->band_start
= c
->modes
[c
->window_type
].band_start
;
811 c
->num_windows
= c
->modes
[c
->window_type
].num_windows
;
812 c
->num_bands
= c
->modes
[c
->window_type
].num_bands
;
813 c
->is_long
= (c
->window_type
!= WINDOW_TYPE_8SHORT
);
816 for (i
= 1; i
< c
->num_windows
; i
++)
817 c
->grouping
[i
] = !get_bits1(&gb
);
819 on2avc_read_ms_info(c
, &gb
);
820 for (i
= 0; i
< c
->avctx
->ch_layout
.nb_channels
; i
++)
821 if ((ret
= on2avc_read_channel_data(c
, &gb
, i
)) < 0)
822 return AVERROR_INVALIDDATA
;
823 if (c
->avctx
->ch_layout
.nb_channels
== 2 && c
->ms_present
)
825 if (c
->window_type
< WINDOW_TYPE_EXT4
) {
826 for (i
= 0; i
< c
->avctx
->ch_layout
.nb_channels
; i
++)
827 on2avc_reconstruct_channel(c
, i
, dst
, offset
);
829 on2avc_reconstruct_channel_ext(c
, dst
, offset
);
835 static int on2avc_decode_frame(AVCodecContext
* avctx
, AVFrame
*frame
,
836 int *got_frame_ptr
, AVPacket
*avpkt
)
838 const uint8_t *buf
= avpkt
->data
;
839 int buf_size
= avpkt
->size
;
840 On2AVCContext
*c
= avctx
->priv_data
;
842 int num_frames
= 0, frame_size
, audio_off
;
846 /* get output buffer */
847 frame
->nb_samples
= ON2AVC_SUBFRAME_SIZE
;
848 if ((ret
= ff_get_buffer(avctx
, frame
, 0)) < 0)
851 if ((ret
= on2avc_decode_subframe(c
, buf
, buf_size
, frame
, 0)) < 0)
854 bytestream2_init(&gb
, buf
, buf_size
);
855 while (bytestream2_get_bytes_left(&gb
) > 2) {
856 frame_size
= bytestream2_get_le16(&gb
);
857 if (!frame_size
|| frame_size
> bytestream2_get_bytes_left(&gb
)) {
858 av_log(avctx
, AV_LOG_ERROR
, "Invalid subframe size %d\n",
860 return AVERROR_INVALIDDATA
;
863 bytestream2_skip(&gb
, frame_size
);
866 av_log(avctx
, AV_LOG_ERROR
, "No subframes present\n");
867 return AVERROR_INVALIDDATA
;
870 /* get output buffer */
871 frame
->nb_samples
= ON2AVC_SUBFRAME_SIZE
* num_frames
;
872 if ((ret
= ff_get_buffer(avctx
, frame
, 0)) < 0)
876 bytestream2_init(&gb
, buf
, buf_size
);
877 while (bytestream2_get_bytes_left(&gb
) > 2) {
878 frame_size
= bytestream2_get_le16(&gb
);
879 if ((ret
= on2avc_decode_subframe(c
, gb
.buffer
, frame_size
,
880 frame
, audio_off
)) < 0)
882 audio_off
+= ON2AVC_SUBFRAME_SIZE
;
883 bytestream2_skip(&gb
, frame_size
);
892 static av_cold
void on2avc_free_vlcs(On2AVCContext
*c
)
896 ff_vlc_free(&c
->scale_diff
);
897 for (i
= 1; i
< 16; i
++)
898 ff_vlc_free(&c
->cb_vlc
[i
]);
901 static av_cold
int on2avc_decode_init(AVCodecContext
*avctx
)
903 On2AVCContext
*c
= avctx
->priv_data
;
904 const uint8_t *lens
= ff_on2avc_cb_lens
;
905 const uint16_t *syms
= ff_on2avc_cb_syms
;
906 int channels
= avctx
->ch_layout
.nb_channels
;
911 avpriv_request_sample(avctx
, "Decoding more than 2 channels");
912 return AVERROR_PATCHWELCOME
;
916 avctx
->sample_fmt
= AV_SAMPLE_FMT_FLTP
;
917 av_channel_layout_uninit(&avctx
->ch_layout
);
918 avctx
->ch_layout
= (channels
== 2) ? (AVChannelLayout
)AV_CHANNEL_LAYOUT_STEREO
:
919 (AVChannelLayout
)AV_CHANNEL_LAYOUT_MONO
;
921 c
->is_av500
= (avctx
->codec_tag
== 0x500);
924 av_log(avctx
, AV_LOG_WARNING
,
925 "Stereo mode support is not good, patch is welcome\n");
927 // We add -0.01 before ceil() to avoid any values to fall at exactly the
928 // midpoint between different ceil values. The results are identical to
929 // using pow(10, i / 10.0) without such bias
930 for (i
= 0; i
< 20; i
++)
931 c
->scale_tab
[i
] = ceil(ff_exp10(i
* 0.1) * 16 - 0.01) / 32;
933 c
->scale_tab
[i
] = ceil(ff_exp10(i
* 0.1) * 0.5 - 0.01);
935 if (avctx
->sample_rate
< 32000 || channels
== 1)
936 memcpy(c
->long_win
, ff_on2avc_window_long_24000
,
937 1024 * sizeof(*c
->long_win
));
939 memcpy(c
->long_win
, ff_on2avc_window_long_32000
,
940 1024 * sizeof(*c
->long_win
));
941 memcpy(c
->short_win
, ff_on2avc_window_short
, 128 * sizeof(*c
->short_win
));
943 c
->modes
= (avctx
->sample_rate
<= 40000) ? ff_on2avc_modes_40
944 : ff_on2avc_modes_44
;
945 c
->wtf
= (avctx
->sample_rate
<= 40000) ? wtf_40
948 scale
= 1.0 / (1024*32768);
949 if ((ret
= av_tx_init(&c
->mdct
, &c
->mdct_fn
, AV_TX_FLOAT_MDCT
, 1, 1024, &scale
, 0)) < 0)
952 scale
= 1.0 / (512*32768);
953 if ((ret
= av_tx_init(&c
->mdct_half
, &c
->mdct_half_fn
, AV_TX_FLOAT_MDCT
, 1, 512, &scale
, 0)) < 0)
956 scale
= 1.0 / (128*32768);
957 if ((ret
= av_tx_init(&c
->mdct_small
, &c
->mdct_small_fn
, AV_TX_FLOAT_MDCT
, 1, 128, &scale
, 0)) < 0)
960 if ((ret
= av_tx_init(&c
->fft512
, &c
->fft512_fn
, AV_TX_FLOAT_FFT
, 1, 512, NULL
, 0)) < 0)
962 if ((ret
= av_tx_init(&c
->fft256
, &c
->fft256_fn
, AV_TX_FLOAT_FFT
, 1, 256, NULL
, 0)) < 0)
964 if ((ret
= av_tx_init(&c
->fft128
, &c
->fft128_fn
, AV_TX_FLOAT_FFT
, 0, 128, NULL
, 0)) < 0)
966 if ((ret
= av_tx_init(&c
->fft64
, &c
->fft64_fn
, AV_TX_FLOAT_FFT
, 0, 64, NULL
, 0)) < 0)
969 c
->fdsp
= avpriv_float_dsp_alloc(avctx
->flags
& AV_CODEC_FLAG_BITEXACT
);
971 return AVERROR(ENOMEM
);
973 ret
= ff_vlc_init_from_lengths(&c
->scale_diff
, 9, ON2AVC_SCALE_DIFFS
,
974 ff_on2avc_scale_diff_bits
, 1,
975 ff_on2avc_scale_diff_syms
, 1, 1, -60, 0, avctx
);
978 for (i
= 1; i
< 16; i
++) {
980 ret
= ff_vlc_init_from_lengths(&c
->cb_vlc
[i
], 9, ff_on2avc_cb_elems
[idx
],
982 syms
, 2, 2, 0, 0, avctx
);
985 lens
+= ff_on2avc_cb_elems
[idx
];
986 syms
+= ff_on2avc_cb_elems
[idx
];
991 av_log(avctx
, AV_LOG_ERROR
, "Cannot init VLC\n");
995 static av_cold
int on2avc_decode_close(AVCodecContext
*avctx
)
997 On2AVCContext
*c
= avctx
->priv_data
;
999 av_tx_uninit(&c
->mdct
);
1000 av_tx_uninit(&c
->mdct_half
);
1001 av_tx_uninit(&c
->mdct_small
);
1002 av_tx_uninit(&c
->fft64
);
1003 av_tx_uninit(&c
->fft128
);
1004 av_tx_uninit(&c
->fft256
);
1005 av_tx_uninit(&c
->fft512
);
1009 on2avc_free_vlcs(c
);
1015 const FFCodec ff_on2avc_decoder
= {
1017 CODEC_LONG_NAME("On2 Audio for Video Codec"),
1018 .p
.type
= AVMEDIA_TYPE_AUDIO
,
1019 .p
.id
= AV_CODEC_ID_ON2AVC
,
1020 .priv_data_size
= sizeof(On2AVCContext
),
1021 .init
= on2avc_decode_init
,
1022 FF_CODEC_DECODE_CB(on2avc_decode_frame
),
1023 .close
= on2avc_decode_close
,
1024 .p
.capabilities
= AV_CODEC_CAP_DR1
,
1025 .caps_internal
= FF_CODEC_CAP_INIT_CLEANUP
,
1026 .p
.sample_fmts
= (const enum AVSampleFormat
[]) { AV_SAMPLE_FMT_FLTP
,
1027 AV_SAMPLE_FMT_NONE
},