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
9b8e2a87
Commit
9b8e2a87
authored
Dec 15, 2011
by
Nathan Caldwell
Committed by
Alex Converse
Jan 23, 2012
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
aacenc: Deinterleave input samples before processing.
Signed-off-by:
Alex Converse
<
alex.converse@gmail.com
>
parent
04af2efa
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
80 additions
and
62 deletions
+80
-62
aacenc.c
libavcodec/aacenc.c
+61
-39
aacenc.h
libavcodec/aacenc.h
+5
-1
aacpsy.c
libavcodec/aacpsy.c
+5
-6
psymodel.c
libavcodec/psymodel.c
+6
-10
psymodel.h
libavcodec/psymodel.h
+3
-6
No files found.
libavcodec/aacenc.c
View file @
9b8e2a87
...
...
@@ -143,6 +143,18 @@ static const uint8_t aac_chan_configs[6][5] = {
{
4
,
TYPE_SCE
,
TYPE_CPE
,
TYPE_CPE
,
TYPE_LFE
},
// 6 channels - front center + stereo + back stereo + LFE
};
/**
* Table to remap channels from Libav's default order to AAC order.
*/
static
const
uint8_t
aac_chan_maps
[
AAC_MAX_CHANNELS
][
AAC_MAX_CHANNELS
]
=
{
{
0
},
{
0
,
1
},
{
2
,
0
,
1
},
{
2
,
0
,
1
,
3
},
{
2
,
0
,
1
,
3
,
4
},
{
2
,
0
,
1
,
4
,
5
,
3
},
};
/**
* Make AAC audio config object.
* @see 1.6.2.1 "Syntax - AudioSpecificConfig"
...
...
@@ -172,34 +184,29 @@ static void apply_window_and_mdct(AACEncContext *s, SingleChannelElement *sce,
float
*
audio
)
{
int
i
,
k
;
const
int
chans
=
s
->
channels
;
const
float
*
lwindow
=
sce
->
ics
.
use_kb_window
[
0
]
?
ff_aac_kbd_long_1024
:
ff_sine_1024
;
const
float
*
swindow
=
sce
->
ics
.
use_kb_window
[
0
]
?
ff_aac_kbd_short_128
:
ff_sine_128
;
const
float
*
pwindow
=
sce
->
ics
.
use_kb_window
[
1
]
?
ff_aac_kbd_short_128
:
ff_sine_128
;
float
*
output
=
sce
->
ret
;
if
(
sce
->
ics
.
window_sequence
[
0
]
!=
EIGHT_SHORT_SEQUENCE
)
{
memcpy
(
output
,
sce
->
saved
,
sizeof
(
float
)
*
1024
);
memcpy
(
output
,
sce
->
saved
,
sizeof
(
output
[
0
]
)
*
1024
);
if
(
sce
->
ics
.
window_sequence
[
0
]
==
LONG_STOP_SEQUENCE
)
{
memset
(
output
,
0
,
sizeof
(
output
[
0
])
*
448
);
for
(
i
=
448
;
i
<
576
;
i
++
)
output
[
i
]
=
sce
->
saved
[
i
]
*
pwindow
[
i
-
448
];
for
(
i
=
576
;
i
<
704
;
i
++
)
output
[
i
]
=
sce
->
saved
[
i
];
}
if
(
sce
->
ics
.
window_sequence
[
0
]
!=
LONG_START_SEQUENCE
)
{
for
(
i
=
0
;
i
<
1024
;
i
++
)
{
output
[
i
+
1024
]
=
audio
[
i
*
chans
]
*
lwindow
[
1024
-
i
-
1
];
sce
->
saved
[
i
]
=
audio
[
i
*
chans
]
*
lwindow
[
i
];
output
[
i
+
1024
]
=
audio
[
i
]
*
lwindow
[
1024
-
i
-
1
];
sce
->
saved
[
i
]
=
audio
[
i
]
*
lwindow
[
i
];
}
}
else
{
for
(
i
=
0
;
i
<
448
;
i
++
)
output
[
i
+
1024
]
=
audio
[
i
*
chans
];
memcpy
(
output
+
1024
,
audio
,
sizeof
(
output
[
0
])
*
448
);
for
(;
i
<
576
;
i
++
)
output
[
i
+
1024
]
=
audio
[
i
*
chans
]
*
swindow
[
576
-
i
-
1
];
output
[
i
+
1024
]
=
audio
[
i
]
*
swindow
[
576
-
i
-
1
];
memset
(
output
+
1024
+
576
,
0
,
sizeof
(
output
[
0
])
*
448
);
for
(
i
=
0
;
i
<
1024
;
i
++
)
sce
->
saved
[
i
]
=
audio
[
i
*
chans
];
memcpy
(
sce
->
saved
,
audio
,
sizeof
(
sce
->
saved
[
0
])
*
1024
);
}
s
->
mdct1024
.
mdct_calc
(
&
s
->
mdct1024
,
sce
->
coeffs
,
output
);
}
else
{
...
...
@@ -207,13 +214,12 @@ static void apply_window_and_mdct(AACEncContext *s, SingleChannelElement *sce,
for
(
i
=
448
+
k
;
i
<
448
+
k
+
256
;
i
++
)
output
[
i
-
448
-
k
]
=
(
i
<
1024
)
?
sce
->
saved
[
i
]
:
audio
[
(
i
-
1024
)
*
chans
];
:
audio
[
i
-
1024
];
s
->
dsp
.
vector_fmul
(
output
,
output
,
k
?
swindow
:
pwindow
,
128
);
s
->
dsp
.
vector_fmul_reverse
(
output
+
128
,
output
+
128
,
swindow
,
128
);
s
->
mdct128
.
mdct_calc
(
&
s
->
mdct128
,
sce
->
coeffs
+
k
,
output
);
}
for
(
i
=
0
;
i
<
1024
;
i
++
)
sce
->
saved
[
i
]
=
audio
[
i
*
chans
];
memcpy
(
sce
->
saved
,
audio
,
sizeof
(
sce
->
saved
[
0
])
*
1024
);
}
}
...
...
@@ -432,11 +438,37 @@ static void put_bitstream_info(AVCodecContext *avctx, AACEncContext *s,
put_bits
(
&
s
->
pb
,
12
-
padbits
,
0
);
}
/*
* Deinterleave input samples.
* Channels are reordered from Libav's default order to AAC order.
*/
static
void
deinterleave_input_samples
(
AACEncContext
*
s
,
const
float
*
samples
)
{
int
ch
,
i
;
const
int
sinc
=
s
->
channels
;
const
uint8_t
*
channel_map
=
aac_chan_maps
[
sinc
-
1
];
/* deinterleave and remap input samples */
for
(
ch
=
0
;
ch
<
sinc
;
ch
++
)
{
const
float
*
sptr
=
samples
+
channel_map
[
ch
];
/* copy last 1024 samples of previous frame to the start of the current frame */
memcpy
(
&
s
->
planar_samples
[
ch
][
0
],
&
s
->
planar_samples
[
ch
][
1024
],
1024
*
sizeof
(
s
->
planar_samples
[
0
][
0
]));
/* deinterleave */
for
(
i
=
1024
;
i
<
1024
*
2
;
i
++
)
{
s
->
planar_samples
[
ch
][
i
]
=
*
sptr
;
sptr
+=
sinc
;
}
}
}
static
int
aac_encode_frame
(
AVCodecContext
*
avctx
,
uint8_t
*
frame
,
int
buf_size
,
void
*
data
)
{
AACEncContext
*
s
=
avctx
->
priv_data
;
float
*
samples
=
s
->
samples
,
*
samples2
,
*
la
;
float
*
*
samples
=
s
->
planar_
samples
,
*
samples2
,
*
la
;
ChannelElement
*
cpe
;
int
i
,
ch
,
w
,
g
,
chans
,
tag
,
start_ch
;
int
chan_el_counter
[
4
];
...
...
@@ -444,27 +476,15 @@ static int aac_encode_frame(AVCodecContext *avctx,
if
(
s
->
last_frame
)
return
0
;
if
(
data
)
{
if
(
!
s
->
psypp
)
{
memcpy
(
s
->
samples
+
1024
*
s
->
channels
,
data
,
1024
*
s
->
channels
*
sizeof
(
s
->
samples
[
0
]));
}
else
{
start_ch
=
0
;
samples2
=
s
->
samples
+
1024
*
s
->
channels
;
for
(
i
=
0
;
i
<
s
->
chan_map
[
0
];
i
++
)
{
tag
=
s
->
chan_map
[
i
+
1
];
chans
=
tag
==
TYPE_CPE
?
2
:
1
;
ff_psy_preprocess
(
s
->
psypp
,
(
float
*
)
data
+
start_ch
,
samples2
+
start_ch
,
start_ch
,
chans
);
start_ch
+=
chans
;
}
}
deinterleave_input_samples
(
s
,
data
);
if
(
s
->
psypp
)
ff_psy_preprocess
(
s
->
psypp
,
s
->
planar_samples
,
s
->
channels
);
}
if
(
!
avctx
->
frame_number
)
{
memcpy
(
s
->
samples
,
s
->
samples
+
1024
*
s
->
channels
,
1024
*
s
->
channels
*
sizeof
(
s
->
samples
[
0
]));
if
(
!
avctx
->
frame_number
)
return
0
;
}
start_ch
=
0
;
for
(
i
=
0
;
i
<
s
->
chan_map
[
0
];
i
++
)
{
...
...
@@ -475,8 +495,8 @@ static int aac_encode_frame(AVCodecContext *avctx,
for
(
ch
=
0
;
ch
<
chans
;
ch
++
)
{
IndividualChannelStream
*
ics
=
&
cpe
->
ch
[
ch
].
ics
;
int
cur_channel
=
start_ch
+
ch
;
samples2
=
samples
+
cur_channel
;
la
=
samples2
+
(
448
+
64
)
*
s
->
channels
;
samples2
=
&
samples
[
cur_channel
][
0
]
;
la
=
samples2
+
(
448
+
64
);
if
(
!
data
)
la
=
NULL
;
if
(
tag
==
TYPE_LFE
)
{
...
...
@@ -592,8 +612,7 @@ static int aac_encode_frame(AVCodecContext *avctx,
if
(
!
data
)
s
->
last_frame
=
1
;
memcpy
(
s
->
samples
,
s
->
samples
+
1024
*
s
->
channels
,
1024
*
s
->
channels
*
sizeof
(
s
->
samples
[
0
]));
return
put_bits_count
(
&
s
->
pb
)
>>
3
;
}
...
...
@@ -606,7 +625,7 @@ static av_cold int aac_encode_end(AVCodecContext *avctx)
ff_psy_end
(
&
s
->
psy
);
if
(
s
->
psypp
)
ff_psy_preprocess_end
(
s
->
psypp
);
av_freep
(
&
s
->
samples
);
av_freep
(
&
s
->
buffer
.
samples
);
av_freep
(
&
s
->
cpe
);
return
0
;
}
...
...
@@ -633,10 +652,13 @@ static av_cold int dsp_init(AVCodecContext *avctx, AACEncContext *s)
static
av_cold
int
alloc_buffers
(
AVCodecContext
*
avctx
,
AACEncContext
*
s
)
{
FF_ALLOC
_OR_GOTO
(
avctx
,
s
->
samples
,
2
*
1024
*
s
->
channels
*
sizeof
(
s
->
samples
[
0
]),
alloc_fail
);
FF_ALLOC
Z_OR_GOTO
(
avctx
,
s
->
buffer
.
samples
,
2
*
1024
*
s
->
channels
*
sizeof
(
s
->
buffer
.
samples
[
0
]),
alloc_fail
);
FF_ALLOCZ_OR_GOTO
(
avctx
,
s
->
cpe
,
sizeof
(
ChannelElement
)
*
s
->
chan_map
[
0
],
alloc_fail
);
FF_ALLOCZ_OR_GOTO
(
avctx
,
avctx
->
extradata
,
5
+
FF_INPUT_BUFFER_PADDING_SIZE
,
alloc_fail
);
for
(
int
ch
=
0
;
ch
<
s
->
channels
;
ch
++
)
s
->
planar_samples
[
ch
]
=
s
->
buffer
.
samples
+
2
*
1024
*
ch
;
return
0
;
alloc_fail:
return
AVERROR
(
ENOMEM
);
...
...
libavcodec/aacenc.h
View file @
9b8e2a87
...
...
@@ -58,7 +58,7 @@ typedef struct AACEncContext {
FFTContext
mdct1024
;
///< long (1024 samples) frame transform context
FFTContext
mdct128
;
///< short (128 samples) frame transform context
DSPContext
dsp
;
float
*
samples
;
///< saved preprocessed input
float
*
planar_samples
[
6
];
///< saved preprocessed input
int
samplerate_index
;
///< MPEG-4 samplerate index
int
channels
;
///< channel count
...
...
@@ -73,6 +73,10 @@ typedef struct AACEncContext {
float
lambda
;
DECLARE_ALIGNED
(
16
,
int
,
qcoefs
)[
96
];
///< quantized coefficients
DECLARE_ALIGNED
(
32
,
float
,
scoefs
)[
1024
];
///< scaled coefficients
struct
{
float
*
samples
;
}
buffer
;
}
AACEncContext
;
extern
float
ff_aac_pow34sf_tab
[
428
];
...
...
libavcodec/aacpsy.c
View file @
9b8e2a87
...
...
@@ -400,7 +400,7 @@ static av_unused FFPsyWindowInfo psy_3gpp_window(FFPsyContext *ctx,
int
stay_short
=
0
;
for
(
i
=
0
;
i
<
8
;
i
++
)
{
for
(
j
=
0
;
j
<
128
;
j
++
)
{
v
=
iir_filter
(
la
[
(
i
*
128
+
j
)
*
ctx
->
avctx
->
channels
],
pch
->
iir_state
);
v
=
iir_filter
(
la
[
i
*
128
+
j
],
pch
->
iir_state
);
sum
+=
v
*
v
;
}
s
[
i
]
=
sum
;
...
...
@@ -794,18 +794,17 @@ static FFPsyWindowInfo psy_lame_window(FFPsyContext *ctx, const float *audio,
float
attack_intensity
[(
AAC_NUM_BLOCKS_SHORT
+
1
)
*
PSY_LAME_NUM_SUBBLOCKS
];
float
energy_subshort
[(
AAC_NUM_BLOCKS_SHORT
+
1
)
*
PSY_LAME_NUM_SUBBLOCKS
];
float
energy_short
[
AAC_NUM_BLOCKS_SHORT
+
1
]
=
{
0
};
int
chans
=
ctx
->
avctx
->
channels
;
const
float
*
firbuf
=
la
+
(
AAC_BLOCK_SIZE_SHORT
/
4
-
PSY_LAME_FIR_LEN
)
*
chans
;
const
float
*
firbuf
=
la
+
(
AAC_BLOCK_SIZE_SHORT
/
4
-
PSY_LAME_FIR_LEN
);
int
j
,
att_sum
=
0
;
/* LAME comment: apply high pass filter of fs/4 */
for
(
i
=
0
;
i
<
AAC_BLOCK_SIZE_LONG
;
i
++
)
{
float
sum1
,
sum2
;
sum1
=
firbuf
[
(
i
+
((
PSY_LAME_FIR_LEN
-
1
)
/
2
))
*
chans
];
sum1
=
firbuf
[
i
+
(
PSY_LAME_FIR_LEN
-
1
)
/
2
];
sum2
=
0
.
0
;
for
(
j
=
0
;
j
<
((
PSY_LAME_FIR_LEN
-
1
)
/
2
)
-
1
;
j
+=
2
)
{
sum1
+=
psy_fir_coeffs
[
j
]
*
(
firbuf
[
(
i
+
j
)
*
chans
]
+
firbuf
[(
i
+
PSY_LAME_FIR_LEN
-
j
)
*
chans
]);
sum2
+=
psy_fir_coeffs
[
j
+
1
]
*
(
firbuf
[
(
i
+
j
+
1
)
*
chans
]
+
firbuf
[(
i
+
PSY_LAME_FIR_LEN
-
j
-
1
)
*
chans
]);
sum1
+=
psy_fir_coeffs
[
j
]
*
(
firbuf
[
i
+
j
]
+
firbuf
[
i
+
PSY_LAME_FIR_LEN
-
j
]);
sum2
+=
psy_fir_coeffs
[
j
+
1
]
*
(
firbuf
[
i
+
j
+
1
]
+
firbuf
[
i
+
PSY_LAME_FIR_LEN
-
j
-
1
]);
}
/* NOTE: The LAME psymodel expects it's input in the range -32768 to 32768. Tuning this for normalized floats would be difficult. */
hpfsmpl
[
i
]
=
(
sum1
+
sum2
)
*
32768
.
0
f
;
...
...
libavcodec/psymodel.c
View file @
9b8e2a87
...
...
@@ -112,19 +112,15 @@ av_cold struct FFPsyPreprocessContext* ff_psy_preprocess_init(AVCodecContext *av
return
ctx
;
}
void
ff_psy_preprocess
(
struct
FFPsyPreprocessContext
*
ctx
,
const
float
*
audio
,
float
*
dest
,
int
tag
,
int
channels
)
void
ff_psy_preprocess
(
struct
FFPsyPreprocessContext
*
ctx
,
float
**
audio
,
int
channels
)
{
int
ch
,
i
;
int
ch
;
int
frame_size
=
ctx
->
avctx
->
frame_size
;
if
(
ctx
->
fstate
)
{
for
(
ch
=
0
;
ch
<
channels
;
ch
++
)
ff_iir_filter_flt
(
ctx
->
fcoeffs
,
ctx
->
fstate
[
tag
+
ch
],
ctx
->
avctx
->
frame_size
,
audio
+
ch
,
ctx
->
avctx
->
channels
,
dest
+
ch
,
ctx
->
avctx
->
channels
);
}
else
{
for
(
ch
=
0
;
ch
<
channels
;
ch
++
)
for
(
i
=
0
;
i
<
ctx
->
avctx
->
frame_size
;
i
++
)
dest
[
i
*
ctx
->
avctx
->
channels
+
ch
]
=
audio
[
i
*
ctx
->
avctx
->
channels
+
ch
];
ff_iir_filter_flt
(
ctx
->
fcoeffs
,
ctx
->
fstate
[
ch
],
frame_size
,
&
audio
[
ch
][
frame_size
],
1
,
&
audio
[
ch
][
frame_size
],
1
);
}
}
...
...
libavcodec/psymodel.h
View file @
9b8e2a87
...
...
@@ -174,13 +174,10 @@ av_cold struct FFPsyPreprocessContext* ff_psy_preprocess_init(AVCodecContext *av
* Preprocess several channel in audio frame in order to compress it better.
*
* @param ctx preprocessing context
* @param audio samples to preprocess
* @param dest place to put filtered samples
* @param tag channel number
* @param channels number of channel to preprocess (some additional work may be done on stereo pair)
* @param audio samples to be filtered (in place)
* @param channels number of channel to preprocess
*/
void
ff_psy_preprocess
(
struct
FFPsyPreprocessContext
*
ctx
,
const
float
*
audio
,
float
*
dest
,
int
tag
,
int
channels
);
void
ff_psy_preprocess
(
struct
FFPsyPreprocessContext
*
ctx
,
float
**
audio
,
int
channels
);
/**
* Cleanup audio preprocessing module.
...
...
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