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
30b39164
Commit
30b39164
authored
Sep 13, 2012
by
Mans Rullgard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ac3dec: make downmix() take array of pointers to channel data
parent
b8f3ab8e
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
59 additions
and
33 deletions
+59
-33
ac3dec.c
libavcodec/ac3dec.c
+11
-3
ac3dec.h
libavcodec/ac3dec.h
+4
-0
ac3dsp.c
libavcodec/ac3dsp.c
+1
-1
ac3dsp.h
libavcodec/ac3dsp.h
+1
-1
ac3dsp_init.c
libavcodec/x86/ac3dsp_init.c
+42
-28
No files found.
libavcodec/ac3dec.c
View file @
30b39164
...
@@ -160,6 +160,8 @@ static av_cold void ac3_tables_init(void)
...
@@ -160,6 +160,8 @@ static av_cold void ac3_tables_init(void)
static
av_cold
int
ac3_decode_init
(
AVCodecContext
*
avctx
)
static
av_cold
int
ac3_decode_init
(
AVCodecContext
*
avctx
)
{
{
AC3DecodeContext
*
s
=
avctx
->
priv_data
;
AC3DecodeContext
*
s
=
avctx
->
priv_data
;
int
i
;
s
->
avctx
=
avctx
;
s
->
avctx
=
avctx
;
ff_ac3_common_init
();
ff_ac3_common_init
();
...
@@ -185,6 +187,12 @@ static av_cold int ac3_decode_init(AVCodecContext *avctx)
...
@@ -185,6 +187,12 @@ static av_cold int ac3_decode_init(AVCodecContext *avctx)
avcodec_get_frame_defaults
(
&
s
->
frame
);
avcodec_get_frame_defaults
(
&
s
->
frame
);
avctx
->
coded_frame
=
&
s
->
frame
;
avctx
->
coded_frame
=
&
s
->
frame
;
for
(
i
=
0
;
i
<
AC3_MAX_CHANNELS
;
i
++
)
{
s
->
outptr
[
i
]
=
s
->
output
[
i
];
s
->
xcfptr
[
i
]
=
s
->
transform_coeffs
[
i
];
s
->
dlyptr
[
i
]
=
s
->
delay
[
i
];
}
return
0
;
return
0
;
}
}
...
@@ -1231,18 +1239,18 @@ static int decode_audio_block(AC3DecodeContext *s, int blk)
...
@@ -1231,18 +1239,18 @@ static int decode_audio_block(AC3DecodeContext *s, int blk)
do_imdct
(
s
,
s
->
channels
);
do_imdct
(
s
,
s
->
channels
);
if
(
downmix_output
)
{
if
(
downmix_output
)
{
s
->
ac3dsp
.
downmix
(
s
->
outp
ut
,
s
->
downmix_coeffs
,
s
->
ac3dsp
.
downmix
(
s
->
outp
tr
,
s
->
downmix_coeffs
,
s
->
out_channels
,
s
->
fbw_channels
,
256
);
s
->
out_channels
,
s
->
fbw_channels
,
256
);
}
}
}
else
{
}
else
{
if
(
downmix_output
)
{
if
(
downmix_output
)
{
s
->
ac3dsp
.
downmix
(
s
->
transform_coeffs
+
1
,
s
->
downmix_coeffs
,
s
->
ac3dsp
.
downmix
(
s
->
xcfptr
+
1
,
s
->
downmix_coeffs
,
s
->
out_channels
,
s
->
fbw_channels
,
256
);
s
->
out_channels
,
s
->
fbw_channels
,
256
);
}
}
if
(
downmix_output
&&
!
s
->
downmixed
)
{
if
(
downmix_output
&&
!
s
->
downmixed
)
{
s
->
downmixed
=
1
;
s
->
downmixed
=
1
;
s
->
ac3dsp
.
downmix
(
s
->
d
elay
,
s
->
downmix_coeffs
,
s
->
out_channels
,
s
->
ac3dsp
.
downmix
(
s
->
d
lyptr
,
s
->
downmix_coeffs
,
s
->
out_channels
,
s
->
fbw_channels
,
128
);
s
->
fbw_channels
,
128
);
}
}
...
...
libavcodec/ac3dec.h
View file @
30b39164
...
@@ -197,6 +197,10 @@ typedef struct AC3DecodeContext {
...
@@ -197,6 +197,10 @@ typedef struct AC3DecodeContext {
FmtConvertContext
fmt_conv
;
///< optimized conversion functions
FmtConvertContext
fmt_conv
;
///< optimized conversion functions
///@}
///@}
float
*
outptr
[
AC3_MAX_CHANNELS
];
float
*
xcfptr
[
AC3_MAX_CHANNELS
];
float
*
dlyptr
[
AC3_MAX_CHANNELS
];
///@name Aligned arrays
///@name Aligned arrays
DECLARE_ALIGNED
(
16
,
int
,
fixed_coeffs
)[
AC3_MAX_CHANNELS
][
AC3_MAX_COEFS
];
///< fixed-point transform coefficients
DECLARE_ALIGNED
(
16
,
int
,
fixed_coeffs
)[
AC3_MAX_CHANNELS
][
AC3_MAX_COEFS
];
///< fixed-point transform coefficients
DECLARE_ALIGNED
(
32
,
float
,
transform_coeffs
)[
AC3_MAX_CHANNELS
][
AC3_MAX_COEFS
];
///< transform coefficients
DECLARE_ALIGNED
(
32
,
float
,
transform_coeffs
)[
AC3_MAX_CHANNELS
][
AC3_MAX_COEFS
];
///< transform coefficients
...
...
libavcodec/ac3dsp.c
View file @
30b39164
...
@@ -171,7 +171,7 @@ static void ac3_extract_exponents_c(uint8_t *exp, int32_t *coef, int nb_coefs)
...
@@ -171,7 +171,7 @@ static void ac3_extract_exponents_c(uint8_t *exp, int32_t *coef, int nb_coefs)
}
}
}
}
static
void
ac3_downmix_c
(
float
(
*
samples
)[
256
]
,
float
(
*
matrix
)[
2
],
static
void
ac3_downmix_c
(
float
**
samples
,
float
(
*
matrix
)[
2
],
int
out_ch
,
int
in_ch
,
int
len
)
int
out_ch
,
int
in_ch
,
int
len
)
{
{
int
i
,
j
;
int
i
,
j
;
...
...
libavcodec/ac3dsp.h
View file @
30b39164
...
@@ -126,7 +126,7 @@ typedef struct AC3DSPContext {
...
@@ -126,7 +126,7 @@ typedef struct AC3DSPContext {
void
(
*
extract_exponents
)(
uint8_t
*
exp
,
int32_t
*
coef
,
int
nb_coefs
);
void
(
*
extract_exponents
)(
uint8_t
*
exp
,
int32_t
*
coef
,
int
nb_coefs
);
void
(
*
downmix
)(
float
(
*
samples
)[
256
]
,
float
(
*
matrix
)[
2
],
int
out_ch
,
void
(
*
downmix
)(
float
**
samples
,
float
(
*
matrix
)[
2
],
int
out_ch
,
int
in_ch
,
int
len
);
int
in_ch
,
int
len
);
}
AC3DSPContext
;
}
AC3DSPContext
;
...
...
libavcodec/x86/ac3dsp_init.c
View file @
30b39164
...
@@ -51,25 +51,25 @@ extern void ff_ac3_extract_exponents_3dnow(uint8_t *exp, int32_t *coef, int nb_c
...
@@ -51,25 +51,25 @@ extern void ff_ac3_extract_exponents_3dnow(uint8_t *exp, int32_t *coef, int nb_c
extern
void
ff_ac3_extract_exponents_sse2
(
uint8_t
*
exp
,
int32_t
*
coef
,
int
nb_coefs
);
extern
void
ff_ac3_extract_exponents_sse2
(
uint8_t
*
exp
,
int32_t
*
coef
,
int
nb_coefs
);
extern
void
ff_ac3_extract_exponents_ssse3
(
uint8_t
*
exp
,
int32_t
*
coef
,
int
nb_coefs
);
extern
void
ff_ac3_extract_exponents_ssse3
(
uint8_t
*
exp
,
int32_t
*
coef
,
int
nb_coefs
);
#if HAVE_SSE_INLINE
#if HAVE_SSE_INLINE
&& HAVE_7REGS
#define IF1(x) x
#define IF1(x) x
#define IF0(x)
#define IF0(x)
#define MIX5(mono, stereo) \
#define MIX5(mono, stereo) \
__asm__ volatile ( \
__asm__ volatile ( \
"movss 0(%
2
), %%xmm5 \n" \
"movss 0(%
1
), %%xmm5 \n" \
"movss 8(%
2
), %%xmm6 \n" \
"movss 8(%
1
), %%xmm6 \n" \
"movss 24(%
2
), %%xmm7 \n" \
"movss 24(%
1
), %%xmm7 \n" \
"shufps $0, %%xmm5, %%xmm5 \n" \
"shufps $0, %%xmm5, %%xmm5 \n" \
"shufps $0, %%xmm6, %%xmm6 \n" \
"shufps $0, %%xmm6, %%xmm6 \n" \
"shufps $0, %%xmm7, %%xmm7 \n" \
"shufps $0, %%xmm7, %%xmm7 \n" \
"1: \n" \
"1: \n" \
"movaps (%0, %
1
), %%xmm0 \n" \
"movaps (%0, %
2
), %%xmm0 \n" \
"movaps
0x400(%0, %1
), %%xmm1 \n" \
"movaps
(%0, %3
), %%xmm1 \n" \
"movaps
0x800(%0, %1
), %%xmm2 \n" \
"movaps
(%0, %4
), %%xmm2 \n" \
"movaps
0xc00(%0, %1
), %%xmm3 \n" \
"movaps
(%0, %5
), %%xmm3 \n" \
"movaps
0x1000(%0, %1
), %%xmm4 \n" \
"movaps
(%0, %6
), %%xmm4 \n" \
"mulps %%xmm5, %%xmm0 \n" \
"mulps %%xmm5, %%xmm0 \n" \
"mulps %%xmm6, %%xmm1 \n" \
"mulps %%xmm6, %%xmm1 \n" \
"mulps %%xmm5, %%xmm2 \n" \
"mulps %%xmm5, %%xmm2 \n" \
...
@@ -80,12 +80,17 @@ extern void ff_ac3_extract_exponents_ssse3(uint8_t *exp, int32_t *coef, int nb_c
...
@@ -80,12 +80,17 @@ extern void ff_ac3_extract_exponents_ssse3(uint8_t *exp, int32_t *coef, int nb_c
"addps %%xmm3, %%xmm0 \n" \
"addps %%xmm3, %%xmm0 \n" \
"addps %%xmm4, %%xmm2 \n" \
"addps %%xmm4, %%xmm2 \n" \
mono("addps %%xmm2, %%xmm0 \n") \
mono("addps %%xmm2, %%xmm0 \n") \
"movaps %%xmm0, (%0, %
1
) \n" \
"movaps %%xmm0, (%0, %
2
) \n" \
stereo("movaps %%xmm2,
0x400(%0, %1)
\n") \
stereo("movaps %%xmm2,
(%0, %3)
\n") \
"add $16, %0 \n" \
"add $16, %0 \n" \
"jl 1b \n" \
"jl 1b \n" \
: "+&r"(i) \
: "+&r"(i) \
: "r"(samples[0] + len), "r"(matrix) \
: "r"(matrix), \
"r"(samples[0] + len), \
"r"(samples[1] + len), \
"r"(samples[2] + len), \
"r"(samples[3] + len), \
"r"(samples[4] + len) \
: XMM_CLOBBERS("%xmm0", "%xmm1", "%xmm2", "%xmm3", \
: XMM_CLOBBERS("%xmm0", "%xmm1", "%xmm2", "%xmm3", \
"%xmm4", "%xmm5", "%xmm6", "%xmm7",) \
"%xmm4", "%xmm5", "%xmm6", "%xmm7",) \
"memory" \
"memory" \
...
@@ -93,38 +98,42 @@ extern void ff_ac3_extract_exponents_ssse3(uint8_t *exp, int32_t *coef, int nb_c
...
@@ -93,38 +98,42 @@ extern void ff_ac3_extract_exponents_ssse3(uint8_t *exp, int32_t *coef, int nb_c
#define MIX_MISC(stereo) \
#define MIX_MISC(stereo) \
__asm__ volatile ( \
__asm__ volatile ( \
"mov %5, %2 \n" \
"1: \n" \
"1: \n" \
"mov -%c7(%6, %2, %c8), %3 \n" \
"movaps (%3, %0), %%xmm0 \n" \
"movaps (%3, %0), %%xmm0 \n" \
stereo("movaps %%xmm0, %%xmm1 \n") \
stereo("movaps %%xmm0, %%xmm1 \n") \
"mulps %%xmm4, %%xmm0 \n" \
"mulps %%xmm4, %%xmm0 \n" \
stereo("mulps %%xmm5, %%xmm1 \n") \
stereo("mulps %%xmm5, %%xmm1 \n") \
"lea 1024(%3, %0), %1 \n" \
"mov %5, %2 \n" \
"2: \n" \
"2: \n" \
"movaps (%1), %%xmm2 \n" \
"mov (%6, %2, %c8), %1 \n" \
"movaps (%1, %0), %%xmm2 \n" \
stereo("movaps %%xmm2, %%xmm3 \n") \
stereo("movaps %%xmm2, %%xmm3 \n") \
"mulps
(%4, %2
), %%xmm2 \n" \
"mulps
(%4, %2, 8
), %%xmm2 \n" \
stereo("mulps
16(%4, %2
), %%xmm3 \n") \
stereo("mulps
16(%4, %2, 8
), %%xmm3 \n") \
"addps %%xmm2, %%xmm0 \n" \
"addps %%xmm2, %%xmm0 \n" \
stereo("addps %%xmm3, %%xmm1 \n") \
stereo("addps %%xmm3, %%xmm1 \n") \
"add $1024, %1 \n" \
"add $4, %2 \n" \
"add $32, %2 \n" \
"jl 2b \n" \
"jl 2b \n" \
"mov %5, %2 \n" \
stereo("mov (%6, %2, %c8), %1 \n") \
"movaps %%xmm0, (%3, %0) \n" \
"movaps %%xmm0, (%3, %0) \n" \
stereo("movaps %%xmm1,
1024(%3, %0)
\n") \
stereo("movaps %%xmm1,
(%1, %0)
\n") \
"add $16, %0 \n" \
"add $16, %0 \n" \
"jl 1b \n" \
"jl 1b \n" \
: "+&r"(i), "=&r"(j), "=&r"(k) \
: "+&r"(i), "=&r"(j), "=&r"(k), "=&r"(m) \
: "r"(samples[0] + len), "r"(matrix_simd + in_ch), \
: "r"(matrix_simd + in_ch), \
"g"((intptr_t) - 32 * (in_ch - 1)) \
"g"((intptr_t) - 4 * (in_ch - 1)), \
"r"(samp + in_ch), \
"i"(sizeof(float *)), "i"(sizeof(float *)/4) \
: "memory" \
: "memory" \
);
);
static
void
ac3_downmix_sse
(
float
(
*
samples
)[
256
]
,
float
(
*
matrix
)[
2
],
static
void
ac3_downmix_sse
(
float
**
samples
,
float
(
*
matrix
)[
2
],
int
out_ch
,
int
in_ch
,
int
len
)
int
out_ch
,
int
in_ch
,
int
len
)
{
{
int
(
*
matrix_cmp
)[
2
]
=
(
int
(
*
)[
2
])
matrix
;
int
(
*
matrix_cmp
)[
2
]
=
(
int
(
*
)[
2
])
matrix
;
intptr_t
i
,
j
,
k
;
intptr_t
i
,
j
,
k
,
m
;
i
=
-
len
*
sizeof
(
float
);
i
=
-
len
*
sizeof
(
float
);
if
(
in_ch
==
5
&&
out_ch
==
2
&&
if
(
in_ch
==
5
&&
out_ch
==
2
&&
...
@@ -139,6 +148,11 @@ static void ac3_downmix_sse(float (*samples)[256], float (*matrix)[2],
...
@@ -139,6 +148,11 @@ static void ac3_downmix_sse(float (*samples)[256], float (*matrix)[2],
MIX5
(
IF1
,
IF0
);
MIX5
(
IF1
,
IF0
);
}
else
{
}
else
{
DECLARE_ALIGNED
(
16
,
float
,
matrix_simd
)[
AC3_MAX_CHANNELS
][
2
][
4
];
DECLARE_ALIGNED
(
16
,
float
,
matrix_simd
)[
AC3_MAX_CHANNELS
][
2
][
4
];
float
*
samp
[
AC3_MAX_CHANNELS
];
for
(
j
=
0
;
j
<
in_ch
;
j
++
)
samp
[
j
]
=
samples
[
j
]
+
len
;
j
=
2
*
in_ch
*
sizeof
(
float
);
j
=
2
*
in_ch
*
sizeof
(
float
);
__asm__
volatile
(
__asm__
volatile
(
"1:
\n
"
"1:
\n
"
...
@@ -162,7 +176,7 @@ static void ac3_downmix_sse(float (*samples)[256], float (*matrix)[2],
...
@@ -162,7 +176,7 @@ static void ac3_downmix_sse(float (*samples)[256], float (*matrix)[2],
}
}
}
}
#endif
/* HAVE_SSE_INLINE */
#endif
/* HAVE_SSE_INLINE
&& HAVE_7REGS
*/
av_cold
void
ff_ac3dsp_init_x86
(
AC3DSPContext
*
c
,
int
bit_exact
)
av_cold
void
ff_ac3dsp_init_x86
(
AC3DSPContext
*
c
,
int
bit_exact
)
{
{
...
@@ -205,7 +219,7 @@ av_cold void ff_ac3dsp_init_x86(AC3DSPContext *c, int bit_exact)
...
@@ -205,7 +219,7 @@ av_cold void ff_ac3dsp_init_x86(AC3DSPContext *c, int bit_exact)
}
}
}
}
#if HAVE_SSE_INLINE
#if HAVE_SSE_INLINE
&& HAVE_7REGS
if
(
INLINE_SSE
(
mm_flags
))
{
if
(
INLINE_SSE
(
mm_flags
))
{
c
->
downmix
=
ac3_downmix_sse
;
c
->
downmix
=
ac3_downmix_sse
;
}
}
...
...
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