Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
6dfcf530
Commit
6dfcf530
authored
Jan 04, 2012
by
Vitor Sessak
Committed by
Ronald S. Bultje
Jan 09, 2012
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
mpegaudiodec: move imdct and windowing function to mpegaudiodsp
Signed-off-by:
Ronald S. Bultje
<
rsbultje@gmail.com
>
parent
421c99a4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
226 additions
and
178 deletions
+226
-178
mpegaudiodec.c
libavcodec/mpegaudiodec.c
+15
-178
mpegaudiodsp.c
libavcodec/mpegaudiodsp.c
+5
-0
mpegaudiodsp.h
libavcodec/mpegaudiodsp.h
+16
-0
mpegaudiodsp_template.c
libavcodec/mpegaudiodsp_template.c
+190
-0
No files found.
libavcodec/mpegaudiodec.c
View file @
6dfcf530
...
@@ -130,7 +130,6 @@ static uint16_t band_index_long[9][23];
...
@@ -130,7 +130,6 @@ static uint16_t band_index_long[9][23];
static
INTFLOAT
is_table
[
2
][
16
];
static
INTFLOAT
is_table
[
2
][
16
];
static
INTFLOAT
is_table_lsf
[
2
][
2
][
16
];
static
INTFLOAT
is_table_lsf
[
2
][
2
][
16
];
static
INTFLOAT
csa_table
[
8
][
4
];
static
INTFLOAT
csa_table
[
8
][
4
];
static
INTFLOAT
mdct_win
[
8
][
36
];
static
int16_t
division_tab3
[
1
<<
6
];
static
int16_t
division_tab3
[
1
<<
6
];
static
int16_t
division_tab5
[
1
<<
8
];
static
int16_t
division_tab5
[
1
<<
8
];
...
@@ -417,43 +416,6 @@ static av_cold void decode_init_static(void)
...
@@ -417,43 +416,6 @@ static av_cold void decode_init_static(void)
csa_table
[
i
][
3
]
=
ca
-
cs
;
csa_table
[
i
][
3
]
=
ca
-
cs
;
#endif
#endif
}
}
/* compute mdct windows */
for
(
i
=
0
;
i
<
36
;
i
++
)
{
for
(
j
=
0
;
j
<
4
;
j
++
)
{
double
d
;
if
(
j
==
2
&&
i
%
3
!=
1
)
continue
;
d
=
sin
(
M_PI
*
(
i
+
0
.
5
)
/
36
.
0
);
if
(
j
==
1
)
{
if
(
i
>=
30
)
d
=
0
;
else
if
(
i
>=
24
)
d
=
sin
(
M_PI
*
(
i
-
18
+
0
.
5
)
/
12
.
0
);
else
if
(
i
>=
18
)
d
=
1
;
}
else
if
(
j
==
3
)
{
if
(
i
<
6
)
d
=
0
;
else
if
(
i
<
12
)
d
=
sin
(
M_PI
*
(
i
-
6
+
0
.
5
)
/
12
.
0
);
else
if
(
i
<
18
)
d
=
1
;
}
//merge last stage of imdct into the window coefficients
d
*=
0
.
5
/
cos
(
M_PI
*
(
2
*
i
+
19
)
/
72
);
if
(
j
==
2
)
mdct_win
[
j
][
i
/
3
]
=
FIXHR
((
d
/
(
1
<<
5
)));
else
mdct_win
[
j
][
i
]
=
FIXHR
((
d
/
(
1
<<
5
)));
}
}
/* NOTE: we do frequency inversion adter the MDCT by changing
the sign of the right window coefs */
for
(
j
=
0
;
j
<
4
;
j
++
)
{
for
(
i
=
0
;
i
<
36
;
i
+=
2
)
{
mdct_win
[
j
+
4
][
i
]
=
mdct_win
[
j
][
i
];
mdct_win
[
j
+
4
][
i
+
1
]
=
-
mdct_win
[
j
][
i
+
1
];
}
}
}
}
static
av_cold
int
decode_init
(
AVCodecContext
*
avctx
)
static
av_cold
int
decode_init
(
AVCodecContext
*
avctx
)
...
@@ -483,32 +445,9 @@ static av_cold int decode_init(AVCodecContext * avctx)
...
@@ -483,32 +445,9 @@ static av_cold int decode_init(AVCodecContext * avctx)
}
}
#define C3 FIXHR(0.86602540378443864676/2)
#define C3 FIXHR(0.86602540378443864676/2)
#define C4 FIXHR(0.70710678118654752439/2) //0.5 / cos(pi*(9)/36)
/* 0.5 / cos(pi*(2*i+1)/36) */
#define C5 FIXHR(0.51763809020504152469/2) //0.5 / cos(pi*(5)/36)
static
const
INTFLOAT
icos36
[
9
]
=
{
#define C6 FIXHR(1.93185165257813657349/4) //0.5 / cos(pi*(15)/36)
FIXR
(
0
.
50190991877167369479
),
FIXR
(
0
.
51763809020504152469
),
//0
FIXR
(
0
.
55168895948124587824
),
FIXR
(
0
.
61038729438072803416
),
FIXR
(
0
.
70710678118654752439
),
//1
FIXR
(
0
.
87172339781054900991
),
FIXR
(
1
.
18310079157624925896
),
FIXR
(
1
.
93185165257813657349
),
//2
FIXR
(
5
.
73685662283492756461
),
};
/* 0.5 / cos(pi*(2*i+1)/36) */
static
const
INTFLOAT
icos36h
[
9
]
=
{
FIXHR
(
0
.
50190991877167369479
/
2
),
FIXHR
(
0
.
51763809020504152469
/
2
),
//0
FIXHR
(
0
.
55168895948124587824
/
2
),
FIXHR
(
0
.
61038729438072803416
/
2
),
FIXHR
(
0
.
70710678118654752439
/
2
),
//1
FIXHR
(
0
.
87172339781054900991
/
2
),
FIXHR
(
1
.
18310079157624925896
/
4
),
FIXHR
(
1
.
93185165257813657349
/
4
),
//2
// FIXHR(5.73685662283492756461),
};
/* 12 points IMDCT. We compute it "by hand" by factorizing obvious
/* 12 points IMDCT. We compute it "by hand" by factorizing obvious
cases. */
cases. */
...
@@ -529,7 +468,7 @@ static void imdct12(INTFLOAT *out, INTFLOAT *in)
...
@@ -529,7 +468,7 @@ static void imdct12(INTFLOAT *out, INTFLOAT *in)
in3
=
MULH3
(
in3
,
C3
,
4
);
in3
=
MULH3
(
in3
,
C3
,
4
);
t1
=
in0
-
in4
;
t1
=
in0
-
in4
;
t2
=
MULH3
(
in1
-
in5
,
icos36h
[
4
]
,
2
);
t2
=
MULH3
(
in1
-
in5
,
C4
,
2
);
out
[
7
]
=
out
[
7
]
=
out
[
10
]
=
t1
+
t2
;
out
[
10
]
=
t1
+
t2
;
...
@@ -539,112 +478,20 @@ static void imdct12(INTFLOAT *out, INTFLOAT *in)
...
@@ -539,112 +478,20 @@ static void imdct12(INTFLOAT *out, INTFLOAT *in)
in0
+=
SHR
(
in4
,
1
);
in0
+=
SHR
(
in4
,
1
);
in4
=
in0
+
in2
;
in4
=
in0
+
in2
;
in5
+=
2
*
in1
;
in5
+=
2
*
in1
;
in1
=
MULH3
(
in5
+
in3
,
icos36h
[
1
]
,
1
);
in1
=
MULH3
(
in5
+
in3
,
C5
,
1
);
out
[
8
]
=
out
[
8
]
=
out
[
9
]
=
in4
+
in1
;
out
[
9
]
=
in4
+
in1
;
out
[
2
]
=
out
[
2
]
=
out
[
3
]
=
in4
-
in1
;
out
[
3
]
=
in4
-
in1
;
in0
-=
in2
;
in0
-=
in2
;
in5
=
MULH3
(
in5
-
in3
,
icos36h
[
7
]
,
2
);
in5
=
MULH3
(
in5
-
in3
,
C6
,
2
);
out
[
0
]
=
out
[
0
]
=
out
[
5
]
=
in0
-
in5
;
out
[
5
]
=
in0
-
in5
;
out
[
6
]
=
out
[
6
]
=
out
[
11
]
=
in0
+
in5
;
out
[
11
]
=
in0
+
in5
;
}
}
/* cos(pi*i/18) */
#define C1 FIXHR(0.98480775301220805936/2)
#define C2 FIXHR(0.93969262078590838405/2)
#define C3 FIXHR(0.86602540378443864676/2)
#define C4 FIXHR(0.76604444311897803520/2)
#define C5 FIXHR(0.64278760968653932632/2)
#define C6 FIXHR(0.5/2)
#define C7 FIXHR(0.34202014332566873304/2)
#define C8 FIXHR(0.17364817766693034885/2)
/* using Lee like decomposition followed by hand coded 9 points DCT */
static
void
imdct36
(
INTFLOAT
*
out
,
INTFLOAT
*
buf
,
INTFLOAT
*
in
,
INTFLOAT
*
win
)
{
int
i
,
j
;
INTFLOAT
t0
,
t1
,
t2
,
t3
,
s0
,
s1
,
s2
,
s3
;
INTFLOAT
tmp
[
18
],
*
tmp1
,
*
in1
;
for
(
i
=
17
;
i
>=
1
;
i
--
)
in
[
i
]
+=
in
[
i
-
1
];
for
(
i
=
17
;
i
>=
3
;
i
-=
2
)
in
[
i
]
+=
in
[
i
-
2
];
for
(
j
=
0
;
j
<
2
;
j
++
)
{
tmp1
=
tmp
+
j
;
in1
=
in
+
j
;
t2
=
in1
[
2
*
4
]
+
in1
[
2
*
8
]
-
in1
[
2
*
2
];
t3
=
in1
[
2
*
0
]
+
SHR
(
in1
[
2
*
6
],
1
);
t1
=
in1
[
2
*
0
]
-
in1
[
2
*
6
];
tmp1
[
6
]
=
t1
-
SHR
(
t2
,
1
);
tmp1
[
16
]
=
t1
+
t2
;
t0
=
MULH3
(
in1
[
2
*
2
]
+
in1
[
2
*
4
]
,
C2
,
2
);
t1
=
MULH3
(
in1
[
2
*
4
]
-
in1
[
2
*
8
]
,
-
2
*
C8
,
1
);
t2
=
MULH3
(
in1
[
2
*
2
]
+
in1
[
2
*
8
]
,
-
C4
,
2
);
tmp1
[
10
]
=
t3
-
t0
-
t2
;
tmp1
[
2
]
=
t3
+
t0
+
t1
;
tmp1
[
14
]
=
t3
+
t2
-
t1
;
tmp1
[
4
]
=
MULH3
(
in1
[
2
*
5
]
+
in1
[
2
*
7
]
-
in1
[
2
*
1
],
-
C3
,
2
);
t2
=
MULH3
(
in1
[
2
*
1
]
+
in1
[
2
*
5
],
C1
,
2
);
t3
=
MULH3
(
in1
[
2
*
5
]
-
in1
[
2
*
7
],
-
2
*
C7
,
1
);
t0
=
MULH3
(
in1
[
2
*
3
],
C3
,
2
);
t1
=
MULH3
(
in1
[
2
*
1
]
+
in1
[
2
*
7
],
-
C5
,
2
);
tmp1
[
0
]
=
t2
+
t3
+
t0
;
tmp1
[
12
]
=
t2
+
t1
-
t0
;
tmp1
[
8
]
=
t3
-
t1
-
t0
;
}
i
=
0
;
for
(
j
=
0
;
j
<
4
;
j
++
)
{
t0
=
tmp
[
i
];
t1
=
tmp
[
i
+
2
];
s0
=
t1
+
t0
;
s2
=
t1
-
t0
;
t2
=
tmp
[
i
+
1
];
t3
=
tmp
[
i
+
3
];
s1
=
MULH3
(
t3
+
t2
,
icos36h
[
j
],
2
);
s3
=
MULLx
(
t3
-
t2
,
icos36
[
8
-
j
],
FRAC_BITS
);
t0
=
s0
+
s1
;
t1
=
s0
-
s1
;
out
[(
9
+
j
)
*
SBLIMIT
]
=
MULH3
(
t1
,
win
[
9
+
j
],
1
)
+
buf
[
4
*
(
9
+
j
)];
out
[(
8
-
j
)
*
SBLIMIT
]
=
MULH3
(
t1
,
win
[
8
-
j
],
1
)
+
buf
[
4
*
(
8
-
j
)];
buf
[
4
*
(
9
+
j
)]
=
MULH3
(
t0
,
win
[
18
+
9
+
j
],
1
);
buf
[
4
*
(
8
-
j
)]
=
MULH3
(
t0
,
win
[
18
+
8
-
j
],
1
);
t0
=
s2
+
s3
;
t1
=
s2
-
s3
;
out
[(
9
+
8
-
j
)
*
SBLIMIT
]
=
MULH3
(
t1
,
win
[
9
+
8
-
j
],
1
)
+
buf
[
4
*
(
9
+
8
-
j
)];
out
[
j
*
SBLIMIT
]
=
MULH3
(
t1
,
win
[
j
],
1
)
+
buf
[
4
*
(
j
)];
buf
[
4
*
(
9
+
8
-
j
)]
=
MULH3
(
t0
,
win
[
18
+
9
+
8
-
j
],
1
);
buf
[
4
*
(
j
)]
=
MULH3
(
t0
,
win
[
18
+
j
],
1
);
i
+=
4
;
}
s0
=
tmp
[
16
];
s1
=
MULH3
(
tmp
[
17
],
icos36h
[
4
],
2
);
t0
=
s0
+
s1
;
t1
=
s0
-
s1
;
out
[(
9
+
4
)
*
SBLIMIT
]
=
MULH3
(
t1
,
win
[
9
+
4
],
1
)
+
buf
[
4
*
(
9
+
4
)];
out
[(
8
-
4
)
*
SBLIMIT
]
=
MULH3
(
t1
,
win
[
8
-
4
],
1
)
+
buf
[
4
*
(
8
-
4
)];
buf
[
4
*
(
9
+
4
)]
=
MULH3
(
t0
,
win
[
18
+
9
+
4
],
1
);
buf
[
4
*
(
8
-
4
)]
=
MULH3
(
t0
,
win
[
18
+
8
-
4
],
1
);
}
/* return the number of decoded frames */
/* return the number of decoded frames */
static
int
mp_decode_layer1
(
MPADecodeContext
*
s
)
static
int
mp_decode_layer1
(
MPADecodeContext
*
s
)
{
{
...
@@ -1366,7 +1213,7 @@ static void compute_antialias(MPADecodeContext *s, GranuleDef *g)
...
@@ -1366,7 +1213,7 @@ static void compute_antialias(MPADecodeContext *s, GranuleDef *g)
static
void
compute_imdct
(
MPADecodeContext
*
s
,
GranuleDef
*
g
,
static
void
compute_imdct
(
MPADecodeContext
*
s
,
GranuleDef
*
g
,
INTFLOAT
*
sb_samples
,
INTFLOAT
*
mdct_buf
)
INTFLOAT
*
sb_samples
,
INTFLOAT
*
mdct_buf
)
{
{
INTFLOAT
*
win
,
*
win1
,
*
out_ptr
,
*
ptr
,
*
buf
,
*
ptr1
;
INTFLOAT
*
win
,
*
out_ptr
,
*
ptr
,
*
buf
,
*
ptr1
;
INTFLOAT
out2
[
12
];
INTFLOAT
out2
[
12
];
int
i
,
j
,
mdct_long_end
,
sblimit
;
int
i
,
j
,
mdct_long_end
,
sblimit
;
...
@@ -1392,26 +1239,16 @@ static void compute_imdct(MPADecodeContext *s, GranuleDef *g,
...
@@ -1392,26 +1239,16 @@ static void compute_imdct(MPADecodeContext *s, GranuleDef *g,
mdct_long_end
=
sblimit
;
mdct_long_end
=
sblimit
;
}
}
buf
=
mdct_buf
;
s
->
mpadsp
.
RENAME
(
imdct36_blocks
)(
sb_samples
,
mdct_buf
,
g
->
sb_hybrid
,
ptr
=
g
->
sb_hybrid
;
mdct_long_end
,
g
->
switch_point
,
for
(
j
=
0
;
j
<
mdct_long_end
;
j
++
)
{
g
->
block_type
);
/* apply window & overlap with previous buffer */
out_ptr
=
sb_samples
+
j
;
buf
=
mdct_buf
+
4
*
18
*
(
mdct_long_end
>>
2
)
+
(
mdct_long_end
&
3
);
/* select window */
ptr
=
g
->
sb_hybrid
+
18
*
mdct_long_end
;
if
(
g
->
switch_point
&&
j
<
2
)
win1
=
mdct_win
[
0
];
else
win1
=
mdct_win
[
g
->
block_type
];
/* select frequency inversion */
win
=
win1
+
((
4
*
36
)
&
-
(
j
&
1
));
imdct36
(
out_ptr
,
buf
,
ptr
,
win
);
out_ptr
+=
18
*
SBLIMIT
;
ptr
+=
18
;
buf
+=
(
j
&
3
)
!=
3
?
1
:
(
4
*
18
-
3
);
}
for
(
j
=
mdct_long_end
;
j
<
sblimit
;
j
++
)
{
for
(
j
=
mdct_long_end
;
j
<
sblimit
;
j
++
)
{
/* select frequency inversion */
/* select frequency inversion */
win
=
mdct_win
[
2
+
(
4
&
-
(
j
&
1
))];
win
=
RENAME
(
ff_mdct_win
)
[
2
+
(
4
&
-
(
j
&
1
))];
out_ptr
=
sb_samples
+
j
;
out_ptr
=
sb_samples
+
j
;
for
(
i
=
0
;
i
<
6
;
i
++
)
{
for
(
i
=
0
;
i
<
6
;
i
++
)
{
...
...
libavcodec/mpegaudiodsp.c
View file @
6dfcf530
...
@@ -28,6 +28,8 @@ void ff_mpadsp_init(MPADSPContext *s)
...
@@ -28,6 +28,8 @@ void ff_mpadsp_init(MPADSPContext *s)
DCTContext
dct
;
DCTContext
dct
;
ff_dct_init
(
&
dct
,
5
,
DCT_II
);
ff_dct_init
(
&
dct
,
5
,
DCT_II
);
ff_init_mpadsp_tabs_float
();
ff_init_mpadsp_tabs_fixed
();
s
->
apply_window_float
=
ff_mpadsp_apply_window_float
;
s
->
apply_window_float
=
ff_mpadsp_apply_window_float
;
s
->
apply_window_fixed
=
ff_mpadsp_apply_window_fixed
;
s
->
apply_window_fixed
=
ff_mpadsp_apply_window_fixed
;
...
@@ -35,6 +37,9 @@ void ff_mpadsp_init(MPADSPContext *s)
...
@@ -35,6 +37,9 @@ void ff_mpadsp_init(MPADSPContext *s)
s
->
dct32_float
=
dct
.
dct32
;
s
->
dct32_float
=
dct
.
dct32
;
s
->
dct32_fixed
=
ff_dct32_fixed
;
s
->
dct32_fixed
=
ff_dct32_fixed
;
s
->
imdct36_blocks_float
=
ff_imdct36_blocks_float
;
s
->
imdct36_blocks_fixed
=
ff_imdct36_blocks_fixed
;
if
(
ARCH_ARM
)
ff_mpadsp_init_arm
(
s
);
if
(
ARCH_ARM
)
ff_mpadsp_init_arm
(
s
);
if
(
HAVE_MMX
)
ff_mpadsp_init_mmx
(
s
);
if
(
HAVE_MMX
)
ff_mpadsp_init_mmx
(
s
);
if
(
HAVE_ALTIVEC
)
ff_mpadsp_init_altivec
(
s
);
if
(
HAVE_ALTIVEC
)
ff_mpadsp_init_altivec
(
s
);
...
...
libavcodec/mpegaudiodsp.h
View file @
6dfcf530
...
@@ -28,6 +28,10 @@ typedef struct MPADSPContext {
...
@@ -28,6 +28,10 @@ typedef struct MPADSPContext {
int
*
dither_state
,
int16_t
*
samples
,
int
incr
);
int
*
dither_state
,
int16_t
*
samples
,
int
incr
);
void
(
*
dct32_float
)(
float
*
dst
,
const
float
*
src
);
void
(
*
dct32_float
)(
float
*
dst
,
const
float
*
src
);
void
(
*
dct32_fixed
)(
int
*
dst
,
const
int
*
src
);
void
(
*
dct32_fixed
)(
int
*
dst
,
const
int
*
src
);
void
(
*
imdct36_blocks_float
)(
float
*
out
,
float
*
buf
,
float
*
in
,
int
count
,
int
switch_point
,
int
block_type
);
void
(
*
imdct36_blocks_fixed
)(
int
*
out
,
int
*
buf
,
int
*
in
,
int
count
,
int
switch_point
,
int
block_type
);
}
MPADSPContext
;
}
MPADSPContext
;
void
ff_mpadsp_init
(
MPADSPContext
*
s
);
void
ff_mpadsp_init
(
MPADSPContext
*
s
);
...
@@ -61,4 +65,16 @@ void ff_mpadsp_apply_window_fixed(int32_t *synth_buf, int32_t *window,
...
@@ -61,4 +65,16 @@ void ff_mpadsp_apply_window_fixed(int32_t *synth_buf, int32_t *window,
int
*
dither_state
,
int16_t
*
samples
,
int
*
dither_state
,
int16_t
*
samples
,
int
incr
);
int
incr
);
void
ff_imdct36_blocks_float
(
float
*
out
,
float
*
buf
,
float
*
in
,
int
count
,
int
switch_point
,
int
block_type
);
void
ff_imdct36_blocks_fixed
(
int
*
out
,
int
*
buf
,
int
*
in
,
int
count
,
int
switch_point
,
int
block_type
);
void
ff_init_mpadsp_tabs_float
(
void
);
void
ff_init_mpadsp_tabs_fixed
(
void
);
extern
int
ff_mdct_win_fixed
[
8
][
36
];
extern
float
ff_mdct_win_float
[
8
][
36
];
#endif
/* AVCODEC_MPEGAUDIODSP_H */
#endif
/* AVCODEC_MPEGAUDIODSP_H */
libavcodec/mpegaudiodsp_template.c
View file @
6dfcf530
...
@@ -39,7 +39,12 @@ static inline float round_sample(float *sum)
...
@@ -39,7 +39,12 @@ static inline float round_sample(float *sum)
#define MACS(rt, ra, rb) rt+=(ra)*(rb)
#define MACS(rt, ra, rb) rt+=(ra)*(rb)
#define MULS(ra, rb) ((ra)*(rb))
#define MULS(ra, rb) ((ra)*(rb))
#define MULH3(x, y, s) ((s)*(y)*(x))
#define MLSS(rt, ra, rb) rt-=(ra)*(rb)
#define MLSS(rt, ra, rb) rt-=(ra)*(rb)
#define MULLx(x, y, s) ((y)*(x))
#define FIXHR(x) ((float)(x))
#define FIXR(x) ((float)(x))
#define SHR(a,b) ((a)*(1.0f/(1<<(b))))
#else
#else
...
@@ -57,8 +62,16 @@ static inline int round_sample(int64_t *sum)
...
@@ -57,8 +62,16 @@ static inline int round_sample(int64_t *sum)
# define MULS(ra, rb) MUL64(ra, rb)
# define MULS(ra, rb) MUL64(ra, rb)
# define MACS(rt, ra, rb) MAC64(rt, ra, rb)
# define MACS(rt, ra, rb) MAC64(rt, ra, rb)
# define MLSS(rt, ra, rb) MLS64(rt, ra, rb)
# define MLSS(rt, ra, rb) MLS64(rt, ra, rb)
# define MULH3(x, y, s) MULH((s)*(x), y)
# define MULLx(x, y, s) MULL(x,y,s)
# define SHR(a,b) ((a)>>(b))
# define FIXR(a) ((int)((a) * FRAC_ONE + 0.5))
# define FIXHR(a) ((int)((a) * (1LL<<32) + 0.5))
#endif
#endif
/** Window for MDCT. */
DECLARE_ALIGNED
(
16
,
INTFLOAT
,
RENAME
(
ff_mdct_win
))[
8
][
36
];
DECLARE_ALIGNED
(
16
,
MPA_INT
,
RENAME
(
ff_mpa_synth_window
))[
512
+
256
];
DECLARE_ALIGNED
(
16
,
MPA_INT
,
RENAME
(
ff_mpa_synth_window
))[
512
+
256
];
#define SUM8(op, sum, w, p) \
#define SUM8(op, sum, w, p) \
...
@@ -194,6 +207,7 @@ void av_cold RENAME(ff_mpa_synth_init)(MPA_INT *window)
...
@@ -194,6 +207,7 @@ void av_cold RENAME(ff_mpa_synth_init)(MPA_INT *window)
window
[
512
-
i
]
=
v
;
window
[
512
-
i
]
=
v
;
}
}
// Needed for avoiding shuffles in ASM implementations
// Needed for avoiding shuffles in ASM implementations
for
(
i
=
0
;
i
<
8
;
i
++
)
for
(
i
=
0
;
i
<
8
;
i
++
)
for
(
j
=
0
;
j
<
16
;
j
++
)
for
(
j
=
0
;
j
<
16
;
j
++
)
...
@@ -203,3 +217,179 @@ void av_cold RENAME(ff_mpa_synth_init)(MPA_INT *window)
...
@@ -203,3 +217,179 @@ void av_cold RENAME(ff_mpa_synth_init)(MPA_INT *window)
for
(
j
=
0
;
j
<
16
;
j
++
)
for
(
j
=
0
;
j
<
16
;
j
++
)
window
[
512
+
128
+
16
*
i
+
j
]
=
window
[
64
*
i
+
48
-
j
];
window
[
512
+
128
+
16
*
i
+
j
]
=
window
[
64
*
i
+
48
-
j
];
}
}
void
RENAME
(
ff_init_mpadsp_tabs
)(
void
)
{
int
i
,
j
;
/* compute mdct windows */
for
(
i
=
0
;
i
<
36
;
i
++
)
{
for
(
j
=
0
;
j
<
4
;
j
++
)
{
double
d
;
if
(
j
==
2
&&
i
%
3
!=
1
)
continue
;
d
=
sin
(
M_PI
*
(
i
+
0
.
5
)
/
36
.
0
);
if
(
j
==
1
)
{
if
(
i
>=
30
)
d
=
0
;
else
if
(
i
>=
24
)
d
=
sin
(
M_PI
*
(
i
-
18
+
0
.
5
)
/
12
.
0
);
else
if
(
i
>=
18
)
d
=
1
;
}
else
if
(
j
==
3
)
{
if
(
i
<
6
)
d
=
0
;
else
if
(
i
<
12
)
d
=
sin
(
M_PI
*
(
i
-
6
+
0
.
5
)
/
12
.
0
);
else
if
(
i
<
18
)
d
=
1
;
}
//merge last stage of imdct into the window coefficients
d
*=
0
.
5
/
cos
(
M_PI
*
(
2
*
i
+
19
)
/
72
);
if
(
j
==
2
)
RENAME
(
ff_mdct_win
)[
j
][
i
/
3
]
=
FIXHR
((
d
/
(
1
<<
5
)));
else
RENAME
(
ff_mdct_win
)[
j
][
i
]
=
FIXHR
((
d
/
(
1
<<
5
)));
}
}
/* NOTE: we do frequency inversion adter the MDCT by changing
the sign of the right window coefs */
for
(
j
=
0
;
j
<
4
;
j
++
)
{
for
(
i
=
0
;
i
<
36
;
i
+=
2
)
{
RENAME
(
ff_mdct_win
)[
j
+
4
][
i
]
=
RENAME
(
ff_mdct_win
)[
j
][
i
];
RENAME
(
ff_mdct_win
)[
j
+
4
][
i
+
1
]
=
-
RENAME
(
ff_mdct_win
)[
j
][
i
+
1
];
}
}
}
/* cos(pi*i/18) */
#define C1 FIXHR(0.98480775301220805936/2)
#define C2 FIXHR(0.93969262078590838405/2)
#define C3 FIXHR(0.86602540378443864676/2)
#define C4 FIXHR(0.76604444311897803520/2)
#define C5 FIXHR(0.64278760968653932632/2)
#define C6 FIXHR(0.5/2)
#define C7 FIXHR(0.34202014332566873304/2)
#define C8 FIXHR(0.17364817766693034885/2)
/* 0.5 / cos(pi*(2*i+1)/36) */
static
const
INTFLOAT
icos36
[
9
]
=
{
FIXR
(
0
.
50190991877167369479
),
FIXR
(
0
.
51763809020504152469
),
//0
FIXR
(
0
.
55168895948124587824
),
FIXR
(
0
.
61038729438072803416
),
FIXR
(
0
.
70710678118654752439
),
//1
FIXR
(
0
.
87172339781054900991
),
FIXR
(
1
.
18310079157624925896
),
FIXR
(
1
.
93185165257813657349
),
//2
FIXR
(
5
.
73685662283492756461
),
};
/* 0.5 / cos(pi*(2*i+1)/36) */
static
const
INTFLOAT
icos36h
[
9
]
=
{
FIXHR
(
0
.
50190991877167369479
/
2
),
FIXHR
(
0
.
51763809020504152469
/
2
),
//0
FIXHR
(
0
.
55168895948124587824
/
2
),
FIXHR
(
0
.
61038729438072803416
/
2
),
FIXHR
(
0
.
70710678118654752439
/
2
),
//1
FIXHR
(
0
.
87172339781054900991
/
2
),
FIXHR
(
1
.
18310079157624925896
/
4
),
FIXHR
(
1
.
93185165257813657349
/
4
),
//2
// FIXHR(5.73685662283492756461),
};
/* using Lee like decomposition followed by hand coded 9 points DCT */
static
void
imdct36
(
INTFLOAT
*
out
,
INTFLOAT
*
buf
,
INTFLOAT
*
in
,
INTFLOAT
*
win
)
{
int
i
,
j
;
INTFLOAT
t0
,
t1
,
t2
,
t3
,
s0
,
s1
,
s2
,
s3
;
INTFLOAT
tmp
[
18
],
*
tmp1
,
*
in1
;
for
(
i
=
17
;
i
>=
1
;
i
--
)
in
[
i
]
+=
in
[
i
-
1
];
for
(
i
=
17
;
i
>=
3
;
i
-=
2
)
in
[
i
]
+=
in
[
i
-
2
];
for
(
j
=
0
;
j
<
2
;
j
++
)
{
tmp1
=
tmp
+
j
;
in1
=
in
+
j
;
t2
=
in1
[
2
*
4
]
+
in1
[
2
*
8
]
-
in1
[
2
*
2
];
t3
=
in1
[
2
*
0
]
+
SHR
(
in1
[
2
*
6
],
1
);
t1
=
in1
[
2
*
0
]
-
in1
[
2
*
6
];
tmp1
[
6
]
=
t1
-
SHR
(
t2
,
1
);
tmp1
[
16
]
=
t1
+
t2
;
t0
=
MULH3
(
in1
[
2
*
2
]
+
in1
[
2
*
4
]
,
C2
,
2
);
t1
=
MULH3
(
in1
[
2
*
4
]
-
in1
[
2
*
8
]
,
-
2
*
C8
,
1
);
t2
=
MULH3
(
in1
[
2
*
2
]
+
in1
[
2
*
8
]
,
-
C4
,
2
);
tmp1
[
10
]
=
t3
-
t0
-
t2
;
tmp1
[
2
]
=
t3
+
t0
+
t1
;
tmp1
[
14
]
=
t3
+
t2
-
t1
;
tmp1
[
4
]
=
MULH3
(
in1
[
2
*
5
]
+
in1
[
2
*
7
]
-
in1
[
2
*
1
],
-
C3
,
2
);
t2
=
MULH3
(
in1
[
2
*
1
]
+
in1
[
2
*
5
],
C1
,
2
);
t3
=
MULH3
(
in1
[
2
*
5
]
-
in1
[
2
*
7
],
-
2
*
C7
,
1
);
t0
=
MULH3
(
in1
[
2
*
3
],
C3
,
2
);
t1
=
MULH3
(
in1
[
2
*
1
]
+
in1
[
2
*
7
],
-
C5
,
2
);
tmp1
[
0
]
=
t2
+
t3
+
t0
;
tmp1
[
12
]
=
t2
+
t1
-
t0
;
tmp1
[
8
]
=
t3
-
t1
-
t0
;
}
i
=
0
;
for
(
j
=
0
;
j
<
4
;
j
++
)
{
t0
=
tmp
[
i
];
t1
=
tmp
[
i
+
2
];
s0
=
t1
+
t0
;
s2
=
t1
-
t0
;
t2
=
tmp
[
i
+
1
];
t3
=
tmp
[
i
+
3
];
s1
=
MULH3
(
t3
+
t2
,
icos36h
[
j
],
2
);
s3
=
MULLx
(
t3
-
t2
,
icos36
[
8
-
j
],
FRAC_BITS
);
t0
=
s0
+
s1
;
t1
=
s0
-
s1
;
out
[(
9
+
j
)
*
SBLIMIT
]
=
MULH3
(
t1
,
win
[
9
+
j
],
1
)
+
buf
[
4
*
(
9
+
j
)];
out
[(
8
-
j
)
*
SBLIMIT
]
=
MULH3
(
t1
,
win
[
8
-
j
],
1
)
+
buf
[
4
*
(
8
-
j
)];
buf
[
4
*
(
9
+
j
)]
=
MULH3
(
t0
,
win
[
18
+
9
+
j
],
1
);
buf
[
4
*
(
8
-
j
)]
=
MULH3
(
t0
,
win
[
18
+
8
-
j
],
1
);
t0
=
s2
+
s3
;
t1
=
s2
-
s3
;
out
[(
9
+
8
-
j
)
*
SBLIMIT
]
=
MULH3
(
t1
,
win
[
9
+
8
-
j
],
1
)
+
buf
[
4
*
(
9
+
8
-
j
)];
out
[
j
*
SBLIMIT
]
=
MULH3
(
t1
,
win
[
j
],
1
)
+
buf
[
4
*
(
j
)];
buf
[
4
*
(
9
+
8
-
j
)]
=
MULH3
(
t0
,
win
[
18
+
9
+
8
-
j
],
1
);
buf
[
4
*
(
j
)]
=
MULH3
(
t0
,
win
[
18
+
j
],
1
);
i
+=
4
;
}
s0
=
tmp
[
16
];
s1
=
MULH3
(
tmp
[
17
],
icos36h
[
4
],
2
);
t0
=
s0
+
s1
;
t1
=
s0
-
s1
;
out
[(
9
+
4
)
*
SBLIMIT
]
=
MULH3
(
t1
,
win
[
9
+
4
],
1
)
+
buf
[
4
*
(
9
+
4
)];
out
[(
8
-
4
)
*
SBLIMIT
]
=
MULH3
(
t1
,
win
[
8
-
4
],
1
)
+
buf
[
4
*
(
8
-
4
)];
buf
[
4
*
(
9
+
4
)]
=
MULH3
(
t0
,
win
[
18
+
9
+
4
],
1
);
buf
[
4
*
(
8
-
4
)]
=
MULH3
(
t0
,
win
[
18
+
8
-
4
],
1
);
}
void
RENAME
(
ff_imdct36_blocks
)(
INTFLOAT
*
out
,
INTFLOAT
*
buf
,
INTFLOAT
*
in
,
int
count
,
int
switch_point
,
int
block_type
)
{
int
j
;
for
(
j
=
0
;
j
<
count
;
j
++
)
{
/* apply window & overlap with previous buffer */
/* select window */
int
win_idx
=
(
switch_point
&&
j
<
2
)
?
0
:
block_type
;
INTFLOAT
*
win
=
RENAME
(
ff_mdct_win
)[
win_idx
+
(
4
&
-
(
j
&
1
))];
imdct36
(
out
,
buf
,
in
,
win
);
in
+=
18
;
buf
+=
((
j
&
3
)
!=
3
?
1
:
(
72
-
3
));
out
++
;
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment