2 * Copyright (c) 2004 Gildas Bazin
3 * Copyright (c) 2010 Mans Rullgard <mans@mansr.com>
5 * This file is part of FFmpeg.
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.
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.
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
24 #include "libavutil/attributes.h"
25 #include "libavutil/intreadwrite.h"
29 static void decode_hf_c(float dst
[DCA_SUBBANDS
][8],
30 const int32_t vq_num
[DCA_SUBBANDS
],
31 const int8_t hf_vq
[1024][32], intptr_t vq_offset
,
32 int32_t scale
[DCA_SUBBANDS
][2],
33 intptr_t start
, intptr_t end
)
37 for (l
= start
; l
< end
; l
++) {
38 /* 1 vector -> 32 samples but we only need the 8 samples
39 * for this subsubframe. */
40 const int8_t *ptr
= &hf_vq
[vq_num
[l
]][vq_offset
];
41 float fscale
= scale
[l
][0] * (1 / 16.0);
42 for (i
= 0; i
< 8; i
++)
43 dst
[l
][i
] = ptr
[i
] * fscale
;
47 static inline void dca_lfe_fir(float *out
, const float *in
, const float *coefs
,
50 float *out2
= out
+ 2 * decifactor
- 1;
51 int num_coeffs
= 256 / decifactor
;
54 /* One decimated sample generates 2*decifactor interpolated ones */
55 for (k
= 0; k
< decifactor
; k
++) {
58 for (j
= 0; j
< num_coeffs
; j
++, coefs
++) {
59 v0
+= in
[-j
] * *coefs
;
60 v1
+= in
[j
+ 1 - num_coeffs
] * *coefs
;
67 static void dca_qmf_32_subbands(float samples_in
[32][8], int sb_act
,
68 SynthFilterContext
*synth
, FFTContext
*imdct
,
69 float synth_buf_ptr
[512],
70 int *synth_buf_offset
, float synth_buf2
[32],
71 const float window
[512], float *samples_out
,
72 float raXin
[32], float scale
)
77 for (i
= sb_act
; i
< 32; i
++)
80 /* Reconstructed channel sample index */
81 for (subindex
= 0; subindex
< 8; subindex
++) {
82 /* Load in one sample from each subband and clear inactive subbands */
83 for (i
= 0; i
< sb_act
; i
++) {
84 unsigned sign
= (i
- 1) & 2;
85 uint32_t v
= AV_RN32A(&samples_in
[i
][subindex
]) ^ sign
<< 30;
86 AV_WN32A(&raXin
[i
], v
);
89 synth
->synth_filter_float(imdct
, synth_buf_ptr
, synth_buf_offset
,
90 synth_buf2
, window
, samples_out
, raXin
,
96 static void dca_lfe_fir0_c(float *out
, const float *in
, const float *coefs
)
98 dca_lfe_fir(out
, in
, coefs
, 32);
101 static void dca_lfe_fir1_c(float *out
, const float *in
, const float *coefs
)
103 dca_lfe_fir(out
, in
, coefs
, 64);
106 av_cold
void ff_dcadsp_init(DCADSPContext
*s
)
108 s
->lfe_fir
[0] = dca_lfe_fir0_c
;
109 s
->lfe_fir
[1] = dca_lfe_fir1_c
;
110 s
->qmf_32_subbands
= dca_qmf_32_subbands
;
111 s
->decode_hf
= decode_hf_c
;
114 ff_dcadsp_init_arm(s
);
116 ff_dcadsp_init_x86(s
);