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
0cea3ca8
Commit
0cea3ca8
authored
Mar 15, 2019
by
Lynne
Committed by
Carl Eugen Hoyos
Mar 31, 2019
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
opusdsp: create and move deemphasis and postfiltering from opus_celt
parent
5468c1d0
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
109 additions
and
44 deletions
+109
-44
Makefile
libavcodec/Makefile
+2
-1
opus_celt.c
libavcodec/opus_celt.c
+11
-42
opus_celt.h
libavcodec/opus_celt.h
+2
-1
opusdsp.c
libavcodec/opusdsp.c
+61
-0
opusdsp.h
libavcodec/opusdsp.h
+33
-0
No files found.
libavcodec/Makefile
View file @
0cea3ca8
...
...
@@ -496,7 +496,8 @@ OBJS-$(CONFIG_NELLYMOSER_ENCODER) += nellymoserenc.o nellymoser.o
OBJS-$(CONFIG_NUV_DECODER)
+=
nuv.o
rtjpeg.o
OBJS-$(CONFIG_ON2AVC_DECODER)
+=
on2avc.o
on2avcdata.o
OBJS-$(CONFIG_OPUS_DECODER)
+=
opusdec.o
opus.o
opus_celt.o
opus_rc.o
\
opus_pvq.o
opus_silk.o
opustab.o
vorbis_data.o
opus_pvq.o
opus_silk.o
opustab.o
vorbis_data.o
\
opusdsp.o
OBJS-$(CONFIG_OPUS_ENCODER)
+=
opusenc.o
opus.o
opus_rc.o
opustab.o
opus_pvq.o
\
opusenc_psy.o
OBJS-$(CONFIG_PAF_AUDIO_DECODER)
+=
pafaudio.o
...
...
libavcodec/opus_celt.c
View file @
0cea3ca8
...
...
@@ -202,40 +202,10 @@ static void celt_postfilter_apply_transition(CeltBlock *block, float *data)
}
}
static
void
celt_postfilter_apply
(
CeltBlock
*
block
,
float
*
data
,
int
len
)
{
const
int
T
=
block
->
pf_period
;
float
g0
,
g1
,
g2
;
float
x0
,
x1
,
x2
,
x3
,
x4
;
int
i
;
if
(
block
->
pf_gains
[
0
]
==
0
.
0
||
len
<=
0
)
return
;
g0
=
block
->
pf_gains
[
0
];
g1
=
block
->
pf_gains
[
1
];
g2
=
block
->
pf_gains
[
2
];
x4
=
data
[
-
T
-
2
];
x3
=
data
[
-
T
-
1
];
x2
=
data
[
-
T
];
x1
=
data
[
-
T
+
1
];
for
(
i
=
0
;
i
<
len
;
i
++
)
{
x0
=
data
[
i
-
T
+
2
];
data
[
i
]
+=
g0
*
x2
+
g1
*
(
x1
+
x3
)
+
g2
*
(
x0
+
x4
);
x4
=
x3
;
x3
=
x2
;
x2
=
x1
;
x1
=
x0
;
}
}
static
void
celt_postfilter
(
CeltFrame
*
f
,
CeltBlock
*
block
)
{
int
len
=
f
->
blocksize
*
f
->
blocks
;
const
int
filter_len
=
len
-
2
*
CELT_OVERLAP
;
celt_postfilter_apply_transition
(
block
,
block
->
buf
+
1024
);
...
...
@@ -247,8 +217,11 @@ static void celt_postfilter(CeltFrame *f, CeltBlock *block)
if
(
len
>
CELT_OVERLAP
)
{
celt_postfilter_apply_transition
(
block
,
block
->
buf
+
1024
+
CELT_OVERLAP
);
celt_postfilter_apply
(
block
,
block
->
buf
+
1024
+
2
*
CELT_OVERLAP
,
len
-
2
*
CELT_OVERLAP
);
if
(
block
->
pf_gains
[
0
]
>
FLT_EPSILON
&&
filter_len
>
0
)
f
->
opusdsp
.
postfilter
(
block
->
buf
+
1024
+
2
*
CELT_OVERLAP
,
block
->
pf_period
,
block
->
pf_gains
,
filter_len
);
block
->
pf_period_old
=
block
->
pf_period
;
memcpy
(
block
->
pf_gains_old
,
block
->
pf_gains
,
sizeof
(
block
->
pf_gains
));
...
...
@@ -462,7 +435,6 @@ int ff_celt_decode_frame(CeltFrame *f, OpusRangeCoder *rc,
/* transform and output for each output channel */
for
(
i
=
0
;
i
<
f
->
output_channels
;
i
++
)
{
CeltBlock
*
block
=
&
f
->
block
[
i
];
float
m
=
block
->
emph_coeff
;
/* iMDCT and overlap-add */
for
(
j
=
0
;
j
<
f
->
blocks
;
j
++
)
{
...
...
@@ -480,14 +452,10 @@ int ff_celt_decode_frame(CeltFrame *f, OpusRangeCoder *rc,
/* postfilter */
celt_postfilter
(
f
,
block
);
/* deemphasis and output scaling */
for
(
j
=
0
;
j
<
frame_size
;
j
++
)
{
const
float
tmp
=
block
->
buf
[
1024
-
frame_size
+
j
]
+
m
;
m
=
tmp
*
CELT_EMPH_COEFF
;
output
[
i
][
j
]
=
tmp
;
}
block
->
emph_coeff
=
m
;
/* deemphasis */
block
->
emph_coeff
=
f
->
opusdsp
.
deemphasis
(
output
[
i
],
&
block
->
buf
[
1024
-
frame_size
],
block
->
emph_coeff
,
frame_size
);
}
if
(
channels
==
1
)
...
...
@@ -596,6 +564,7 @@ int ff_celt_init(AVCodecContext *avctx, CeltFrame **f, int output_channels,
goto
fail
;
}
ff_opus_dsp_init
(
&
frm
->
opusdsp
);
ff_celt_flush
(
frm
);
*
f
=
frm
;
...
...
libavcodec/opus_celt.h
View file @
0cea3ca8
...
...
@@ -28,6 +28,7 @@
#include "opus.h"
#include "opus_pvq.h"
#include "opusdsp.h"
#include "mdct15.h"
#include "libavutil/float_dsp.h"
...
...
@@ -40,7 +41,6 @@
#define CELT_NORM_SCALE 16384
#define CELT_QTHETA_OFFSET 4
#define CELT_QTHETA_OFFSET_TWOPHASE 16
#define CELT_EMPH_COEFF 0.85000610f
#define CELT_POSTFILTER_MINPERIOD 15
#define CELT_ENERGY_SILENCE (-28.0f)
...
...
@@ -96,6 +96,7 @@ struct CeltFrame {
AVFloatDSPContext
*
dsp
;
CeltBlock
block
[
2
];
CeltPVQ
*
pvq
;
OpusDSP
opusdsp
;
int
channels
;
int
output_channels
;
int
apply_phase_inv
;
...
...
libavcodec/opusdsp.c
0 → 100644
View file @
0cea3ca8
/*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "opusdsp.h"
static
void
postfilter_c
(
float
*
data
,
int
period
,
float
*
gains
,
int
len
)
{
const
float
g0
=
gains
[
0
];
const
float
g1
=
gains
[
1
];
const
float
g2
=
gains
[
2
];
float
x4
=
data
[
-
period
-
2
];
float
x3
=
data
[
-
period
-
1
];
float
x2
=
data
[
-
period
+
0
];
float
x1
=
data
[
-
period
+
1
];
for
(
int
i
=
0
;
i
<
len
;
i
++
)
{
float
x0
=
data
[
i
-
period
+
2
];
data
[
i
]
+=
g0
*
x2
+
g1
*
(
x1
+
x3
)
+
g2
*
(
x0
+
x4
);
x4
=
x3
;
x3
=
x2
;
x2
=
x1
;
x1
=
x0
;
}
}
static
float
deemphasis_c
(
float
*
y
,
float
*
x
,
float
coeff
,
int
len
)
{
float
state
=
coeff
;
for
(
int
i
=
0
;
i
<
len
;
i
++
)
{
const
float
tmp
=
x
[
i
]
+
state
;
state
=
tmp
*
CELT_EMPH_COEFF
;
y
[
i
]
=
tmp
;
}
return
state
;
}
av_cold
void
ff_opus_dsp_init
(
OpusDSP
*
ctx
)
{
ctx
->
postfilter
=
postfilter_c
;
ctx
->
deemphasis
=
deemphasis_c
;
}
libavcodec/opusdsp.h
0 → 100644
View file @
0cea3ca8
/*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef AVCODEC_OPUSDSP_H
#define AVCODEC_OPUSDSP_H
#include "libavutil/common.h"
#define CELT_EMPH_COEFF 0.8500061035f
typedef
struct
OpusDSP
{
void
(
*
postfilter
)(
float
*
data
,
int
period
,
float
*
gains
,
int
len
);
float
(
*
deemphasis
)(
float
*
out
,
float
*
in
,
float
coeff
,
int
len
);
}
OpusDSP
;
void
ff_opus_dsp_init
(
OpusDSP
*
ctx
);
#endif
/* AVCODEC_OPUSDSP_H */
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