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
25c2d76b
Commit
25c2d76b
authored
Dec 18, 2011
by
Asen Lekov
Committed by
Diego Biurrun
Dec 19, 2011
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
qcelpdec: K&R formatting cosmetics
Signed-off-by:
Diego Biurrun
<
diego@biurrun.de
>
parent
2fd29184
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
177 additions
and
183 deletions
+177
-183
qcelpdec.c
libavcodec/qcelpdec.c
+177
-183
No files found.
libavcodec/qcelpdec.c
View file @
25c2d76b
...
@@ -44,8 +44,7 @@
...
@@ -44,8 +44,7 @@
#undef NDEBUG
#undef NDEBUG
#include <assert.h>
#include <assert.h>
typedef
enum
typedef
enum
{
{
I_F_Q
=
-
1
,
/**< insufficient frame quality */
I_F_Q
=
-
1
,
/**< insufficient frame quality */
SILENCE
,
SILENCE
,
RATE_OCTAVE
,
RATE_OCTAVE
,
...
@@ -54,8 +53,7 @@ typedef enum
...
@@ -54,8 +53,7 @@ typedef enum
RATE_FULL
RATE_FULL
}
qcelp_packet_rate
;
}
qcelp_packet_rate
;
typedef
struct
typedef
struct
{
{
AVFrame
avframe
;
AVFrame
avframe
;
GetBitContext
gb
;
GetBitContext
gb
;
qcelp_packet_rate
bitrate
;
qcelp_packet_rate
bitrate
;
...
@@ -95,8 +93,8 @@ static av_cold int qcelp_decode_init(AVCodecContext *avctx)
...
@@ -95,8 +93,8 @@ static av_cold int qcelp_decode_init(AVCodecContext *avctx)
avctx
->
sample_fmt
=
AV_SAMPLE_FMT_FLT
;
avctx
->
sample_fmt
=
AV_SAMPLE_FMT_FLT
;
for
(
i
=
0
;
i
<
10
;
i
++
)
for
(
i
=
0
;
i
<
10
;
i
++
)
q
->
prev_lspf
[
i
]
=
(
i
+
1
)
/
11
.;
q
->
prev_lspf
[
i
]
=
(
i
+
1
)
/
11
.;
avcodec_get_frame_defaults
(
&
q
->
avframe
);
avcodec_get_frame_defaults
(
&
q
->
avframe
);
avctx
->
coded_frame
=
&
q
->
avframe
;
avctx
->
coded_frame
=
&
q
->
avframe
;
...
@@ -129,12 +127,12 @@ static int decode_lspf(QCELPContext *q, float *lspf)
...
@@ -129,12 +127,12 @@ static int decode_lspf(QCELPContext *q, float *lspf)
if
(
q
->
bitrate
==
RATE_OCTAVE
)
{
if
(
q
->
bitrate
==
RATE_OCTAVE
)
{
q
->
octave_count
++
;
q
->
octave_count
++
;
for
(
i
=
0
;
i
<
10
;
i
++
)
{
for
(
i
=
0
;
i
<
10
;
i
++
)
{
q
->
predictor_lspf
[
i
]
=
q
->
predictor_lspf
[
i
]
=
lspf
[
i
]
=
(
q
->
frame
.
lspv
[
i
]
?
QCELP_LSP_SPREAD_FACTOR
lspf
[
i
]
=
(
q
->
frame
.
lspv
[
i
]
?
QCELP_LSP_SPREAD_FACTOR
:
-
QCELP_LSP_SPREAD_FACTOR
)
:
-
QCELP_LSP_SPREAD_FACTOR
)
+
+
predictors
[
i
]
*
QCELP_LSP_OCTAVE_PREDICTOR
predictors
[
i
]
*
QCELP_LSP_OCTAVE_PREDICTOR
+
+
(
i
+
1
)
*
((
1
-
QCELP_LSP_OCTAVE_PREDICTOR
)
/
11
);
(
i
+
1
)
*
((
1
-
QCELP_LSP_OCTAVE_PREDICTOR
)
/
11
);
}
}
smooth
=
q
->
octave_count
<
10
?
.
875
:
0
.
1
;
smooth
=
q
->
octave_count
<
10
?
.
875
:
0
.
1
;
}
else
{
}
else
{
...
@@ -142,49 +140,49 @@ static int decode_lspf(QCELPContext *q, float *lspf)
...
@@ -142,49 +140,49 @@ static int decode_lspf(QCELPContext *q, float *lspf)
assert
(
q
->
bitrate
==
I_F_Q
);
assert
(
q
->
bitrate
==
I_F_Q
);
if
(
q
->
erasure_count
>
1
)
if
(
q
->
erasure_count
>
1
)
erasure_coeff
*=
q
->
erasure_count
<
4
?
0
.
9
:
0
.
7
;
erasure_coeff
*=
q
->
erasure_count
<
4
?
0
.
9
:
0
.
7
;
for
(
i
=
0
;
i
<
10
;
i
++
)
{
for
(
i
=
0
;
i
<
10
;
i
++
)
{
q
->
predictor_lspf
[
i
]
=
q
->
predictor_lspf
[
i
]
=
lspf
[
i
]
=
(
i
+
1
)
*
(
1
-
erasure_coeff
)
/
11
lspf
[
i
]
=
(
i
+
1
)
*
(
1
-
erasure_coeff
)
/
11
+
+
erasure_coeff
*
predictors
[
i
];
erasure_coeff
*
predictors
[
i
];
}
}
smooth
=
0
.
125
;
smooth
=
0
.
125
;
}
}
// Check the stability of the LSP frequencies.
// Check the stability of the LSP frequencies.
lspf
[
0
]
=
FFMAX
(
lspf
[
0
],
QCELP_LSP_SPREAD_FACTOR
);
lspf
[
0
]
=
FFMAX
(
lspf
[
0
],
QCELP_LSP_SPREAD_FACTOR
);
for
(
i
=
1
;
i
<
10
;
i
++
)
for
(
i
=
1
;
i
<
10
;
i
++
)
lspf
[
i
]
=
FFMAX
(
lspf
[
i
],
lspf
[
i
-
1
]
+
QCELP_LSP_SPREAD_FACTOR
);
lspf
[
i
]
=
FFMAX
(
lspf
[
i
],
lspf
[
i
-
1
]
+
QCELP_LSP_SPREAD_FACTOR
);
lspf
[
9
]
=
FFMIN
(
lspf
[
9
],
1
.
0
-
QCELP_LSP_SPREAD_FACTOR
);
lspf
[
9
]
=
FFMIN
(
lspf
[
9
],
1
.
0
-
QCELP_LSP_SPREAD_FACTOR
);
for
(
i
=
9
;
i
>
0
;
i
--
)
for
(
i
=
9
;
i
>
0
;
i
--
)
lspf
[
i
-
1
]
=
FFMIN
(
lspf
[
i
-
1
],
lspf
[
i
]
-
QCELP_LSP_SPREAD_FACTOR
);
lspf
[
i
-
1
]
=
FFMIN
(
lspf
[
i
-
1
],
lspf
[
i
]
-
QCELP_LSP_SPREAD_FACTOR
);
// Low-pass filter the LSP frequencies.
// Low-pass filter the LSP frequencies.
ff_weighted_vector_sumf
(
lspf
,
lspf
,
q
->
prev_lspf
,
smooth
,
1
.
0
-
smooth
,
10
);
ff_weighted_vector_sumf
(
lspf
,
lspf
,
q
->
prev_lspf
,
smooth
,
1
.
0
-
smooth
,
10
);
}
else
{
}
else
{
q
->
octave_count
=
0
;
q
->
octave_count
=
0
;
tmp_lspf
=
0
.;
tmp_lspf
=
0
.;
for
(
i
=
0
;
i
<
5
;
i
++
)
{
for
(
i
=
0
;
i
<
5
;
i
++
)
{
lspf
[
2
*
i
+
0
]
=
tmp_lspf
+=
qcelp_lspvq
[
i
][
q
->
frame
.
lspv
[
i
]][
0
]
*
0
.
0001
;
lspf
[
2
*
i
+
0
]
=
tmp_lspf
+=
qcelp_lspvq
[
i
][
q
->
frame
.
lspv
[
i
]][
0
]
*
0
.
0001
;
lspf
[
2
*
i
+
1
]
=
tmp_lspf
+=
qcelp_lspvq
[
i
][
q
->
frame
.
lspv
[
i
]][
1
]
*
0
.
0001
;
lspf
[
2
*
i
+
1
]
=
tmp_lspf
+=
qcelp_lspvq
[
i
][
q
->
frame
.
lspv
[
i
]][
1
]
*
0
.
0001
;
}
}
// Check for badly received packets.
// Check for badly received packets.
if
(
q
->
bitrate
==
RATE_QUARTER
)
{
if
(
q
->
bitrate
==
RATE_QUARTER
)
{
if
(
lspf
[
9
]
<=
.
70
||
lspf
[
9
]
>=
.
97
)
if
(
lspf
[
9
]
<=
.
70
||
lspf
[
9
]
>=
.
97
)
return
-
1
;
return
-
1
;
for
(
i
=
3
;
i
<
10
;
i
++
)
for
(
i
=
3
;
i
<
10
;
i
++
)
if
(
fabs
(
lspf
[
i
]
-
lspf
[
i
-
2
])
<
.
08
)
if
(
fabs
(
lspf
[
i
]
-
lspf
[
i
-
2
])
<
.
08
)
return
-
1
;
return
-
1
;
}
else
{
}
else
{
if
(
lspf
[
9
]
<=
.
66
||
lspf
[
9
]
>=
.
985
)
if
(
lspf
[
9
]
<=
.
66
||
lspf
[
9
]
>=
.
985
)
return
-
1
;
return
-
1
;
for
(
i
=
4
;
i
<
10
;
i
++
)
for
(
i
=
4
;
i
<
10
;
i
++
)
if
(
fabs
(
lspf
[
i
]
-
lspf
[
i
-
4
])
<
.
0931
)
if
(
fabs
(
lspf
[
i
]
-
lspf
[
i
-
4
])
<
.
0931
)
return
-
1
;
return
-
1
;
}
}
}
}
...
@@ -199,8 +197,8 @@ static int decode_lspf(QCELPContext *q, float *lspf)
...
@@ -199,8 +197,8 @@ static int decode_lspf(QCELPContext *q, float *lspf)
*
*
* TIA/EIA/IS-733 2.4.6.2
* TIA/EIA/IS-733 2.4.6.2
*/
*/
static
void
decode_gain_and_index
(
QCELPContext
*
q
,
static
void
decode_gain_and_index
(
QCELPContext
*
q
,
float
*
gain
)
float
*
gain
)
{
{
int
i
,
subframes_count
,
g1
[
16
];
int
i
,
subframes_count
,
g1
[
16
];
float
slope
;
float
slope
;
...
@@ -210,38 +208,38 @@ static void decode_gain_and_index(QCELPContext *q,
...
@@ -210,38 +208,38 @@ static void decode_gain_and_index(QCELPContext *q,
case
RATE_HALF
:
subframes_count
=
4
;
break
;
case
RATE_HALF
:
subframes_count
=
4
;
break
;
default:
subframes_count
=
5
;
default:
subframes_count
=
5
;
}
}
for
(
i
=
0
;
i
<
subframes_count
;
i
++
)
{
for
(
i
=
0
;
i
<
subframes_count
;
i
++
)
{
g1
[
i
]
=
4
*
q
->
frame
.
cbgain
[
i
];
g1
[
i
]
=
4
*
q
->
frame
.
cbgain
[
i
];
if
(
q
->
bitrate
==
RATE_FULL
&&
!
((
i
+
1
)
&
3
))
{
if
(
q
->
bitrate
==
RATE_FULL
&&
!
((
i
+
1
)
&
3
))
{
g1
[
i
]
+=
av_clip
((
g1
[
i
-
1
]
+
g1
[
i
-
2
]
+
g1
[
i
-
3
])
/
3
-
6
,
0
,
32
);
g1
[
i
]
+=
av_clip
((
g1
[
i
-
1
]
+
g1
[
i
-
2
]
+
g1
[
i
-
3
])
/
3
-
6
,
0
,
32
);
}
}
gain
[
i
]
=
qcelp_g12ga
[
g1
[
i
]];
gain
[
i
]
=
qcelp_g12ga
[
g1
[
i
]];
if
(
q
->
frame
.
cbsign
[
i
])
{
if
(
q
->
frame
.
cbsign
[
i
])
{
gain
[
i
]
=
-
gain
[
i
];
gain
[
i
]
=
-
gain
[
i
];
q
->
frame
.
cindex
[
i
]
=
(
q
->
frame
.
cindex
[
i
]
-
89
)
&
127
;
q
->
frame
.
cindex
[
i
]
=
(
q
->
frame
.
cindex
[
i
]
-
89
)
&
127
;
}
}
}
}
q
->
prev_g1
[
0
]
=
g1
[
i
-
2
];
q
->
prev_g1
[
0
]
=
g1
[
i
-
2
];
q
->
prev_g1
[
1
]
=
g1
[
i
-
1
];
q
->
prev_g1
[
1
]
=
g1
[
i
-
1
];
q
->
last_codebook_gain
=
qcelp_g12ga
[
g1
[
i
-
1
]];
q
->
last_codebook_gain
=
qcelp_g12ga
[
g1
[
i
-
1
]];
if
(
q
->
bitrate
==
RATE_QUARTER
)
{
if
(
q
->
bitrate
==
RATE_QUARTER
)
{
// Provide smoothing of the unvoiced excitation energy.
// Provide smoothing of the unvoiced excitation energy.
gain
[
7
]
=
gain
[
4
];
gain
[
7
]
=
gain
[
4
];
gain
[
6
]
=
0
.
4
*
gain
[
3
]
+
0
.
6
*
gain
[
4
];
gain
[
6
]
=
0
.
4
*
gain
[
3
]
+
0
.
6
*
gain
[
4
];
gain
[
5
]
=
gain
[
3
];
gain
[
5
]
=
gain
[
3
];
gain
[
4
]
=
0
.
8
*
gain
[
2
]
+
0
.
2
*
gain
[
3
];
gain
[
4
]
=
0
.
8
*
gain
[
2
]
+
0
.
2
*
gain
[
3
];
gain
[
3
]
=
0
.
2
*
gain
[
1
]
+
0
.
8
*
gain
[
2
];
gain
[
3
]
=
0
.
2
*
gain
[
1
]
+
0
.
8
*
gain
[
2
];
gain
[
2
]
=
gain
[
1
];
gain
[
2
]
=
gain
[
1
];
gain
[
1
]
=
0
.
6
*
gain
[
0
]
+
0
.
4
*
gain
[
1
];
gain
[
1
]
=
0
.
6
*
gain
[
0
]
+
0
.
4
*
gain
[
1
];
}
}
}
else
if
(
q
->
bitrate
!=
SILENCE
)
{
}
else
if
(
q
->
bitrate
!=
SILENCE
)
{
if
(
q
->
bitrate
==
RATE_OCTAVE
)
{
if
(
q
->
bitrate
==
RATE_OCTAVE
)
{
g1
[
0
]
=
2
*
q
->
frame
.
cbgain
[
0
]
g1
[
0
]
=
2
*
q
->
frame
.
cbgain
[
0
]
+
+
av_clip
((
q
->
prev_g1
[
0
]
+
q
->
prev_g1
[
1
])
/
2
-
5
,
0
,
54
);
av_clip
((
q
->
prev_g1
[
0
]
+
q
->
prev_g1
[
1
])
/
2
-
5
,
0
,
54
);
subframes_count
=
8
;
subframes_count
=
8
;
}
else
{
}
else
{
assert
(
q
->
bitrate
==
I_F_Q
);
assert
(
q
->
bitrate
==
I_F_Q
);
...
@@ -253,16 +251,16 @@ static void decode_gain_and_index(QCELPContext *q,
...
@@ -253,16 +251,16 @@ static void decode_gain_and_index(QCELPContext *q,
case
3
:
g1
[
0
]
-=
2
;
break
;
case
3
:
g1
[
0
]
-=
2
;
break
;
default:
g1
[
0
]
-=
6
;
default:
g1
[
0
]
-=
6
;
}
}
if
(
g1
[
0
]
<
0
)
if
(
g1
[
0
]
<
0
)
g1
[
0
]
=
0
;
g1
[
0
]
=
0
;
subframes_count
=
4
;
subframes_count
=
4
;
}
}
// This interpolation is done to produce smoother background noise.
// This interpolation is done to produce smoother background noise.
slope
=
0
.
5
*
(
qcelp_g12ga
[
g1
[
0
]]
-
q
->
last_codebook_gain
)
/
subframes_count
;
slope
=
0
.
5
*
(
qcelp_g12ga
[
g1
[
0
]]
-
q
->
last_codebook_gain
)
/
subframes_count
;
for
(
i
=
1
;
i
<=
subframes_count
;
i
++
)
for
(
i
=
1
;
i
<=
subframes_count
;
i
++
)
gain
[
i
-
1
]
=
q
->
last_codebook_gain
+
slope
*
i
;
gain
[
i
-
1
]
=
q
->
last_codebook_gain
+
slope
*
i
;
q
->
last_codebook_gain
=
gain
[
i
-
2
];
q
->
last_codebook_gain
=
gain
[
i
-
2
];
q
->
prev_g1
[
0
]
=
q
->
prev_g1
[
1
];
q
->
prev_g1
[
0
]
=
q
->
prev_g1
[
1
];
q
->
prev_g1
[
1
]
=
g1
[
0
];
q
->
prev_g1
[
1
]
=
g1
[
0
];
}
}
...
@@ -279,13 +277,13 @@ static void decode_gain_and_index(QCELPContext *q,
...
@@ -279,13 +277,13 @@ static void decode_gain_and_index(QCELPContext *q,
*/
*/
static
int
codebook_sanity_check_for_rate_quarter
(
const
uint8_t
*
cbgain
)
static
int
codebook_sanity_check_for_rate_quarter
(
const
uint8_t
*
cbgain
)
{
{
int
i
,
diff
,
prev_diff
=
0
;
int
i
,
diff
,
prev_diff
=
0
;
for
(
i
=
1
;
i
<
5
;
i
++
)
{
for
(
i
=
1
;
i
<
5
;
i
++
)
{
diff
=
cbgain
[
i
]
-
cbgain
[
i
-
1
];
diff
=
cbgain
[
i
]
-
cbgain
[
i
-
1
];
if
(
FFABS
(
diff
)
>
10
)
if
(
FFABS
(
diff
)
>
10
)
return
-
1
;
return
-
1
;
else
if
(
FFABS
(
diff
-
prev_diff
)
>
12
)
else
if
(
FFABS
(
diff
-
prev_diff
)
>
12
)
return
-
1
;
return
-
1
;
prev_diff
=
diff
;
prev_diff
=
diff
;
}
}
...
@@ -325,7 +323,7 @@ static void compute_svector(QCELPContext *q, const float *gain,
...
@@ -325,7 +323,7 @@ static void compute_svector(QCELPContext *q, const float *gain,
for
(
i
=
0
;
i
<
16
;
i
++
)
{
for
(
i
=
0
;
i
<
16
;
i
++
)
{
tmp_gain
=
gain
[
i
]
*
QCELP_RATE_FULL_CODEBOOK_RATIO
;
tmp_gain
=
gain
[
i
]
*
QCELP_RATE_FULL_CODEBOOK_RATIO
;
cindex
=
-
q
->
frame
.
cindex
[
i
];
cindex
=
-
q
->
frame
.
cindex
[
i
];
for
(
j
=
0
;
j
<
10
;
j
++
)
for
(
j
=
0
;
j
<
10
;
j
++
)
*
cdn_vector
++
=
tmp_gain
*
qcelp_rate_full_codebook
[
cindex
++
&
127
];
*
cdn_vector
++
=
tmp_gain
*
qcelp_rate_full_codebook
[
cindex
++
&
127
];
}
}
break
;
break
;
...
@@ -338,30 +336,31 @@ static void compute_svector(QCELPContext *q, const float *gain,
...
@@ -338,30 +336,31 @@ static void compute_svector(QCELPContext *q, const float *gain,
}
}
break
;
break
;
case
RATE_QUARTER
:
case
RATE_QUARTER
:
cbseed
=
(
0x0003
&
q
->
frame
.
lspv
[
4
])
<<
14
|
cbseed
=
(
0x0003
&
q
->
frame
.
lspv
[
4
])
<<
14
|
(
0x003F
&
q
->
frame
.
lspv
[
3
])
<<
8
|
(
0x003F
&
q
->
frame
.
lspv
[
3
])
<<
8
|
(
0x0060
&
q
->
frame
.
lspv
[
2
])
<<
1
|
(
0x0060
&
q
->
frame
.
lspv
[
2
])
<<
1
|
(
0x0007
&
q
->
frame
.
lspv
[
1
])
<<
3
|
(
0x0007
&
q
->
frame
.
lspv
[
1
])
<<
3
|
(
0x0038
&
q
->
frame
.
lspv
[
0
])
>>
3
;
(
0x0038
&
q
->
frame
.
lspv
[
0
])
>>
3
;
rnd
=
q
->
rnd_fir_filter_mem
+
20
;
rnd
=
q
->
rnd_fir_filter_mem
+
20
;
for
(
i
=
0
;
i
<
8
;
i
++
)
{
for
(
i
=
0
;
i
<
8
;
i
++
)
{
tmp_gain
=
gain
[
i
]
*
(
QCELP_SQRT1887
/
32768
.
0
);
tmp_gain
=
gain
[
i
]
*
(
QCELP_SQRT1887
/
32768
.
0
);
for
(
k
=
0
;
k
<
20
;
k
++
)
{
for
(
k
=
0
;
k
<
20
;
k
++
)
{
cbseed
=
521
*
cbseed
+
259
;
cbseed
=
521
*
cbseed
+
259
;
*
rnd
=
(
int16_t
)
cbseed
;
*
rnd
=
(
int16_t
)
cbseed
;
// FIR filter
// FIR filter
fir_filter_value
=
0
.
0
;
fir_filter_value
=
0
.
0
;
for
(
j
=
0
;
j
<
10
;
j
++
)
for
(
j
=
0
;
j
<
10
;
j
++
)
fir_filter_value
+=
qcelp_rnd_fir_coefs
[
j
]
fir_filter_value
+=
qcelp_rnd_fir_coefs
[
j
]
*
*
(
rnd
[
-
j
]
+
rnd
[
-
20
+
j
]);
(
rnd
[
-
j
]
+
rnd
[
-
20
+
j
]);
fir_filter_value
+=
qcelp_rnd_fir_coefs
[
10
]
*
rnd
[
-
10
];
fir_filter_value
+=
qcelp_rnd_fir_coefs
[
10
]
*
rnd
[
-
10
];
*
cdn_vector
++
=
tmp_gain
*
fir_filter_value
;
*
cdn_vector
++
=
tmp_gain
*
fir_filter_value
;
rnd
++
;
rnd
++
;
}
}
}
}
memcpy
(
q
->
rnd_fir_filter_mem
,
q
->
rnd_fir_filter_mem
+
160
,
20
*
sizeof
(
float
));
memcpy
(
q
->
rnd_fir_filter_mem
,
q
->
rnd_fir_filter_mem
+
160
,
20
*
sizeof
(
float
));
break
;
break
;
case
RATE_OCTAVE
:
case
RATE_OCTAVE
:
cbseed
=
q
->
first16bits
;
cbseed
=
q
->
first16bits
;
...
@@ -369,7 +368,7 @@ static void compute_svector(QCELPContext *q, const float *gain,
...
@@ -369,7 +368,7 @@ static void compute_svector(QCELPContext *q, const float *gain,
tmp_gain
=
gain
[
i
]
*
(
QCELP_SQRT1887
/
32768
.
0
);
tmp_gain
=
gain
[
i
]
*
(
QCELP_SQRT1887
/
32768
.
0
);
for
(
j
=
0
;
j
<
20
;
j
++
)
{
for
(
j
=
0
;
j
<
20
;
j
++
)
{
cbseed
=
521
*
cbseed
+
259
;
cbseed
=
521
*
cbseed
+
259
;
*
cdn_vector
++
=
tmp_gain
*
(
int16_t
)
cbseed
;
*
cdn_vector
++
=
tmp_gain
*
(
int16_t
)
cbseed
;
}
}
}
}
break
;
break
;
...
@@ -377,7 +376,7 @@ static void compute_svector(QCELPContext *q, const float *gain,
...
@@ -377,7 +376,7 @@ static void compute_svector(QCELPContext *q, const float *gain,
cbseed
=
-
44
;
// random codebook index
cbseed
=
-
44
;
// random codebook index
for
(
i
=
0
;
i
<
4
;
i
++
)
{
for
(
i
=
0
;
i
<
4
;
i
++
)
{
tmp_gain
=
gain
[
i
]
*
QCELP_RATE_FULL_CODEBOOK_RATIO
;
tmp_gain
=
gain
[
i
]
*
QCELP_RATE_FULL_CODEBOOK_RATIO
;
for
(
j
=
0
;
j
<
40
;
j
++
)
for
(
j
=
0
;
j
<
40
;
j
++
)
*
cdn_vector
++
=
tmp_gain
*
qcelp_rate_full_codebook
[
cbseed
++
&
127
];
*
cdn_vector
++
=
tmp_gain
*
qcelp_rate_full_codebook
[
cbseed
++
&
127
];
}
}
break
;
break
;
...
@@ -396,8 +395,7 @@ static void compute_svector(QCELPContext *q, const float *gain,
...
@@ -396,8 +395,7 @@ static void compute_svector(QCELPContext *q, const float *gain,
*
*
* TIA/EIA/IS-733 2.4.8.3, 2.4.8.6
* TIA/EIA/IS-733 2.4.8.3, 2.4.8.6
*/
*/
static
void
apply_gain_ctrl
(
float
*
v_out
,
const
float
*
v_ref
,
static
void
apply_gain_ctrl
(
float
*
v_out
,
const
float
*
v_ref
,
const
float
*
v_in
)
const
float
*
v_in
)
{
{
int
i
;
int
i
;
...
@@ -440,9 +438,9 @@ static const float *do_pitchfilter(float memory[303], const float v_in[160],
...
@@ -440,9 +438,9 @@ static const float *do_pitchfilter(float memory[303], const float v_in[160],
v_lag
=
memory
+
143
+
40
*
i
-
lag
[
i
];
v_lag
=
memory
+
143
+
40
*
i
-
lag
[
i
];
for
(
v_len
=
v_in
+
40
;
v_in
<
v_len
;
v_in
++
)
{
for
(
v_len
=
v_in
+
40
;
v_in
<
v_len
;
v_in
++
)
{
if
(
pfrac
[
i
])
{
// If it is a fractional lag...
if
(
pfrac
[
i
])
{
// If it is a fractional lag...
for
(
j
=
0
,
*
v_out
=
0
.;
j
<
4
;
j
++
)
for
(
j
=
0
,
*
v_out
=
0
.;
j
<
4
;
j
++
)
*
v_out
+=
qcelp_hammsinc_table
[
j
]
*
(
v_lag
[
j
-
4
]
+
v_lag
[
3
-
j
]);
*
v_out
+=
qcelp_hammsinc_table
[
j
]
*
(
v_lag
[
j
-
4
]
+
v_lag
[
3
-
j
]);
}
else
}
else
*
v_out
=
*
v_lag
;
*
v_out
=
*
v_lag
;
*
v_out
=
*
v_in
+
gain
[
i
]
*
*
v_out
;
*
v_out
=
*
v_in
+
gain
[
i
]
*
*
v_out
;
...
@@ -473,12 +471,10 @@ static void apply_pitch_filters(QCELPContext *q, float *cdn_vector)
...
@@ -473,12 +471,10 @@ static void apply_pitch_filters(QCELPContext *q, float *cdn_vector)
int
i
;
int
i
;
const
float
*
v_synthesis_filtered
,
*
v_pre_filtered
;
const
float
*
v_synthesis_filtered
,
*
v_pre_filtered
;
if
(
q
->
bitrate
>=
RATE_HALF
||
if
(
q
->
bitrate
>=
RATE_HALF
||
q
->
bitrate
==
SILENCE
||
q
->
bitrate
==
SILENCE
||
(
q
->
bitrate
==
I_F_Q
&&
(
q
->
prev_bitrate
>=
RATE_HALF
)))
{
(
q
->
bitrate
==
I_F_Q
&&
(
q
->
prev_bitrate
>=
RATE_HALF
)))
{
if
(
q
->
bitrate
>=
RATE_HALF
)
{
if
(
q
->
bitrate
>=
RATE_HALF
)
{
// Compute gain & lag for the whole frame.
// Compute gain & lag for the whole frame.
for
(
i
=
0
;
i
<
4
;
i
++
)
{
for
(
i
=
0
;
i
<
4
;
i
++
)
{
q
->
pitch_gain
[
i
]
=
q
->
frame
.
plag
[
i
]
?
(
q
->
frame
.
pgain
[
i
]
+
1
)
*
0
.
25
:
0
.
0
;
q
->
pitch_gain
[
i
]
=
q
->
frame
.
plag
[
i
]
?
(
q
->
frame
.
pgain
[
i
]
+
1
)
*
0
.
25
:
0
.
0
;
...
@@ -497,7 +493,7 @@ static void apply_pitch_filters(QCELPContext *q, float *cdn_vector)
...
@@ -497,7 +493,7 @@ static void apply_pitch_filters(QCELPContext *q, float *cdn_vector)
assert
(
q
->
bitrate
==
SILENCE
);
assert
(
q
->
bitrate
==
SILENCE
);
max_pitch_gain
=
1
.
0
;
max_pitch_gain
=
1
.
0
;
}
}
for
(
i
=
0
;
i
<
4
;
i
++
)
for
(
i
=
0
;
i
<
4
;
i
++
)
q
->
pitch_gain
[
i
]
=
FFMIN
(
q
->
pitch_gain
[
i
],
max_pitch_gain
);
q
->
pitch_gain
[
i
]
=
FFMIN
(
q
->
pitch_gain
[
i
],
max_pitch_gain
);
memset
(
q
->
frame
.
pfrac
,
0
,
sizeof
(
q
->
frame
.
pfrac
));
memset
(
q
->
frame
.
pfrac
,
0
,
sizeof
(
q
->
frame
.
pfrac
));
...
@@ -509,7 +505,7 @@ static void apply_pitch_filters(QCELPContext *q, float *cdn_vector)
...
@@ -509,7 +505,7 @@ static void apply_pitch_filters(QCELPContext *q, float *cdn_vector)
q
->
pitch_lag
,
q
->
frame
.
pfrac
);
q
->
pitch_lag
,
q
->
frame
.
pfrac
);
// pitch prefilter update
// pitch prefilter update
for
(
i
=
0
;
i
<
4
;
i
++
)
for
(
i
=
0
;
i
<
4
;
i
++
)
q
->
pitch_gain
[
i
]
=
0
.
5
*
FFMIN
(
q
->
pitch_gain
[
i
],
1
.
0
);
q
->
pitch_gain
[
i
]
=
0
.
5
*
FFMIN
(
q
->
pitch_gain
[
i
],
1
.
0
);
v_pre_filtered
=
do_pitchfilter
(
q
->
pitch_pre_filter_mem
,
v_pre_filtered
=
do_pitchfilter
(
q
->
pitch_pre_filter_mem
,
...
@@ -519,8 +515,7 @@ static void apply_pitch_filters(QCELPContext *q, float *cdn_vector)
...
@@ -519,8 +515,7 @@ static void apply_pitch_filters(QCELPContext *q, float *cdn_vector)
apply_gain_ctrl
(
cdn_vector
,
v_synthesis_filtered
,
v_pre_filtered
);
apply_gain_ctrl
(
cdn_vector
,
v_synthesis_filtered
,
v_pre_filtered
);
}
else
{
}
else
{
memcpy
(
q
->
pitch_synthesis_filter_mem
,
cdn_vector
+
17
,
memcpy
(
q
->
pitch_synthesis_filter_mem
,
cdn_vector
+
17
,
143
*
sizeof
(
float
));
143
*
sizeof
(
float
));
memcpy
(
q
->
pitch_pre_filter_mem
,
cdn_vector
+
17
,
143
*
sizeof
(
float
));
memcpy
(
q
->
pitch_pre_filter_mem
,
cdn_vector
+
17
,
143
*
sizeof
(
float
));
memset
(
q
->
pitch_gain
,
0
,
sizeof
(
q
->
pitch_gain
));
memset
(
q
->
pitch_gain
,
0
,
sizeof
(
q
->
pitch_gain
));
memset
(
q
->
pitch_lag
,
0
,
sizeof
(
q
->
pitch_lag
));
memset
(
q
->
pitch_lag
,
0
,
sizeof
(
q
->
pitch_lag
));
...
@@ -545,7 +540,7 @@ static void lspf2lpc(const float *lspf, float *lpc)
...
@@ -545,7 +540,7 @@ static void lspf2lpc(const float *lspf, float *lpc)
double
bandwidth_expansion_coeff
=
QCELP_BANDWIDTH_EXPANSION_COEFF
;
double
bandwidth_expansion_coeff
=
QCELP_BANDWIDTH_EXPANSION_COEFF
;
int
i
;
int
i
;
for
(
i
=
0
;
i
<
10
;
i
++
)
for
(
i
=
0
;
i
<
10
;
i
++
)
lsp
[
i
]
=
cos
(
M_PI
*
lspf
[
i
]);
lsp
[
i
]
=
cos
(
M_PI
*
lspf
[
i
]);
ff_acelp_lspd2lpc
(
lsp
,
lpc
,
5
);
ff_acelp_lspd2lpc
(
lsp
,
lpc
,
5
);
...
@@ -573,9 +568,9 @@ static void interpolate_lpc(QCELPContext *q, const float *curr_lspf,
...
@@ -573,9 +568,9 @@ static void interpolate_lpc(QCELPContext *q, const float *curr_lspf,
float
interpolated_lspf
[
10
];
float
interpolated_lspf
[
10
];
float
weight
;
float
weight
;
if
(
q
->
bitrate
>=
RATE_QUARTER
)
if
(
q
->
bitrate
>=
RATE_QUARTER
)
weight
=
0
.
25
*
(
subframe_num
+
1
);
weight
=
0
.
25
*
(
subframe_num
+
1
);
else
if
(
q
->
bitrate
==
RATE_OCTAVE
&&
!
subframe_num
)
else
if
(
q
->
bitrate
==
RATE_OCTAVE
&&
!
subframe_num
)
weight
=
0
.
625
;
weight
=
0
.
625
;
else
else
weight
=
1
.
0
;
weight
=
1
.
0
;
...
@@ -584,10 +579,10 @@ static void interpolate_lpc(QCELPContext *q, const float *curr_lspf,
...
@@ -584,10 +579,10 @@ static void interpolate_lpc(QCELPContext *q, const float *curr_lspf,
ff_weighted_vector_sumf
(
interpolated_lspf
,
curr_lspf
,
q
->
prev_lspf
,
ff_weighted_vector_sumf
(
interpolated_lspf
,
curr_lspf
,
q
->
prev_lspf
,
weight
,
1
.
0
-
weight
,
10
);
weight
,
1
.
0
-
weight
,
10
);
lspf2lpc
(
interpolated_lspf
,
lpc
);
lspf2lpc
(
interpolated_lspf
,
lpc
);
}
else
if
(
q
->
bitrate
>=
RATE_QUARTER
||
}
else
if
(
q
->
bitrate
>=
RATE_QUARTER
||
(
q
->
bitrate
==
I_F_Q
&&
!
subframe_num
))
(
q
->
bitrate
==
I_F_Q
&&
!
subframe_num
))
lspf2lpc
(
curr_lspf
,
lpc
);
lspf2lpc
(
curr_lspf
,
lpc
);
else
if
(
q
->
bitrate
==
SILENCE
&&
!
subframe_num
)
else
if
(
q
->
bitrate
==
SILENCE
&&
!
subframe_num
)
lspf2lpc
(
q
->
prev_lspf
,
lpc
);
lspf2lpc
(
q
->
prev_lspf
,
lpc
);
}
}
...
@@ -616,7 +611,8 @@ static qcelp_packet_rate buf_size2bitrate(const int buf_size)
...
@@ -616,7 +611,8 @@ static qcelp_packet_rate buf_size2bitrate(const int buf_size)
*
*
* TIA/EIA/IS-733 2.4.8.7.1
* TIA/EIA/IS-733 2.4.8.7.1
*/
*/
static
qcelp_packet_rate
determine_bitrate
(
AVCodecContext
*
avctx
,
const
int
buf_size
,
static
qcelp_packet_rate
determine_bitrate
(
AVCodecContext
*
avctx
,
const
int
buf_size
,
const
uint8_t
**
buf
)
const
uint8_t
**
buf
)
{
{
qcelp_packet_rate
bitrate
;
qcelp_packet_rate
bitrate
;
...
@@ -639,7 +635,7 @@ static qcelp_packet_rate determine_bitrate(AVCodecContext *avctx, const int buf_
...
@@ -639,7 +635,7 @@ static qcelp_packet_rate determine_bitrate(AVCodecContext *avctx, const int buf_
}
else
if
((
bitrate
=
buf_size2bitrate
(
buf_size
+
1
))
>=
0
)
{
}
else
if
((
bitrate
=
buf_size2bitrate
(
buf_size
+
1
))
>=
0
)
{
av_log
(
avctx
,
AV_LOG_WARNING
,
av_log
(
avctx
,
AV_LOG_WARNING
,
"Bitrate byte is missing, guessing the bitrate from packet size.
\n
"
);
"Bitrate byte is missing, guessing the bitrate from packet size.
\n
"
);
}
else
}
else
return
I_F_Q
;
return
I_F_Q
;
if
(
bitrate
==
SILENCE
)
{
if
(
bitrate
==
SILENCE
)
{
...
@@ -652,8 +648,8 @@ static qcelp_packet_rate determine_bitrate(AVCodecContext *avctx, const int buf_
...
@@ -652,8 +648,8 @@ static qcelp_packet_rate determine_bitrate(AVCodecContext *avctx, const int buf_
static
void
warn_insufficient_frame_quality
(
AVCodecContext
*
avctx
,
static
void
warn_insufficient_frame_quality
(
AVCodecContext
*
avctx
,
const
char
*
message
)
const
char
*
message
)
{
{
av_log
(
avctx
,
AV_LOG_WARNING
,
"Frame #%d, IFQ: %s
\n
"
,
avctx
->
frame_number
,
av_log
(
avctx
,
AV_LOG_WARNING
,
"Frame #%d, IFQ: %s
\n
"
,
message
);
avctx
->
frame_number
,
message
);
}
}
static
void
postfilter
(
QCELPContext
*
q
,
float
*
samples
,
float
*
lpc
)
static
void
postfilter
(
QCELPContext
*
q
,
float
*
samples
,
float
*
lpc
)
...
@@ -682,7 +678,8 @@ static void postfilter(QCELPContext *q, float *samples, float *lpc)
...
@@ -682,7 +678,8 @@ static void postfilter(QCELPContext *q, float *samples, float *lpc)
ff_tilt_compensation
(
&
q
->
postfilter_tilt_mem
,
0
.
3
,
pole_out
+
10
,
160
);
ff_tilt_compensation
(
&
q
->
postfilter_tilt_mem
,
0
.
3
,
pole_out
+
10
,
160
);
ff_adaptive_gain_control
(
samples
,
pole_out
+
10
,
ff_adaptive_gain_control
(
samples
,
pole_out
+
10
,
ff_dot_productf
(
q
->
formant_mem
+
10
,
q
->
formant_mem
+
10
,
160
),
ff_dot_productf
(
q
->
formant_mem
+
10
,
q
->
formant_mem
+
10
,
160
),
160
,
0
.
9375
,
&
q
->
postfilter_agc_mem
);
160
,
0
.
9375
,
&
q
->
postfilter_agc_mem
);
}
}
...
@@ -711,7 +708,7 @@ static int qcelp_decode_frame(AVCodecContext *avctx, void *data,
...
@@ -711,7 +708,7 @@ static int qcelp_decode_frame(AVCodecContext *avctx, void *data,
goto
erasure
;
goto
erasure
;
}
}
if
(
q
->
bitrate
==
RATE_OCTAVE
&&
if
(
q
->
bitrate
==
RATE_OCTAVE
&&
(
q
->
first16bits
=
AV_RB16
(
buf
))
==
0xFFFF
)
{
(
q
->
first16bits
=
AV_RB16
(
buf
))
==
0xFFFF
)
{
warn_insufficient_frame_quality
(
avctx
,
"Bitrate is 1/8 and first 16 bits are on."
);
warn_insufficient_frame_quality
(
avctx
,
"Bitrate is 1/8 and first 16 bits are on."
);
goto
erasure
;
goto
erasure
;
...
@@ -719,15 +716,15 @@ static int qcelp_decode_frame(AVCodecContext *avctx, void *data,
...
@@ -719,15 +716,15 @@ static int qcelp_decode_frame(AVCodecContext *avctx, void *data,
if
(
q
->
bitrate
>
SILENCE
)
{
if
(
q
->
bitrate
>
SILENCE
)
{
const
QCELPBitmap
*
bitmaps
=
qcelp_unpacking_bitmaps_per_rate
[
q
->
bitrate
];
const
QCELPBitmap
*
bitmaps
=
qcelp_unpacking_bitmaps_per_rate
[
q
->
bitrate
];
const
QCELPBitmap
*
bitmaps_end
=
qcelp_unpacking_bitmaps_per_rate
[
q
->
bitrate
]
const
QCELPBitmap
*
bitmaps_end
=
qcelp_unpacking_bitmaps_per_rate
[
q
->
bitrate
]
+
+
qcelp_unpacking_bitmaps_lengths
[
q
->
bitrate
];
qcelp_unpacking_bitmaps_lengths
[
q
->
bitrate
];
uint8_t
*
unpacked_data
=
(
uint8_t
*
)
&
q
->
frame
;
uint8_t
*
unpacked_data
=
(
uint8_t
*
)
&
q
->
frame
;
init_get_bits
(
&
q
->
gb
,
buf
,
8
*
buf_size
);
init_get_bits
(
&
q
->
gb
,
buf
,
8
*
buf_size
);
memset
(
&
q
->
frame
,
0
,
sizeof
(
QCELPFrame
));
memset
(
&
q
->
frame
,
0
,
sizeof
(
QCELPFrame
));
for
(;
bitmaps
<
bitmaps_end
;
bitmaps
++
)
for
(;
bitmaps
<
bitmaps_end
;
bitmaps
++
)
unpacked_data
[
bitmaps
->
index
]
|=
get_bits
(
&
q
->
gb
,
bitmaps
->
bitlen
)
<<
bitmaps
->
bitpos
;
unpacked_data
[
bitmaps
->
index
]
|=
get_bits
(
&
q
->
gb
,
bitmaps
->
bitlen
)
<<
bitmaps
->
bitpos
;
// Check for erasures/blanks on rates 1, 1/4 and 1/8.
// Check for erasures/blanks on rates 1, 1/4 and 1/8.
...
@@ -735,7 +732,7 @@ static int qcelp_decode_frame(AVCodecContext *avctx, void *data,
...
@@ -735,7 +732,7 @@ static int qcelp_decode_frame(AVCodecContext *avctx, void *data,
warn_insufficient_frame_quality
(
avctx
,
"Wrong data in reserved frame area."
);
warn_insufficient_frame_quality
(
avctx
,
"Wrong data in reserved frame area."
);
goto
erasure
;
goto
erasure
;
}
}
if
(
q
->
bitrate
==
RATE_QUARTER
&&
if
(
q
->
bitrate
==
RATE_QUARTER
&&
codebook_sanity_check_for_rate_quarter
(
q
->
frame
.
cbgain
))
{
codebook_sanity_check_for_rate_quarter
(
q
->
frame
.
cbgain
))
{
warn_insufficient_frame_quality
(
avctx
,
"Codebook gain sanity check failed."
);
warn_insufficient_frame_quality
(
avctx
,
"Codebook gain sanity check failed."
);
goto
erasure
;
goto
erasure
;
...
@@ -759,7 +756,6 @@ static int qcelp_decode_frame(AVCodecContext *avctx, void *data,
...
@@ -759,7 +756,6 @@ static int qcelp_decode_frame(AVCodecContext *avctx, void *data,
goto
erasure
;
goto
erasure
;
}
}
apply_pitch_filters
(
q
,
outbuffer
);
apply_pitch_filters
(
q
,
outbuffer
);
if
(
q
->
bitrate
==
I_F_Q
)
{
if
(
q
->
bitrate
==
I_F_Q
)
{
...
@@ -770,14 +766,13 @@ erasure:
...
@@ -770,14 +766,13 @@ erasure:
compute_svector
(
q
,
gain
,
outbuffer
);
compute_svector
(
q
,
gain
,
outbuffer
);
decode_lspf
(
q
,
quantized_lspf
);
decode_lspf
(
q
,
quantized_lspf
);
apply_pitch_filters
(
q
,
outbuffer
);
apply_pitch_filters
(
q
,
outbuffer
);
}
else
}
else
q
->
erasure_count
=
0
;
q
->
erasure_count
=
0
;
formant_mem
=
q
->
formant_mem
+
10
;
formant_mem
=
q
->
formant_mem
+
10
;
for
(
i
=
0
;
i
<
4
;
i
++
)
{
for
(
i
=
0
;
i
<
4
;
i
++
)
{
interpolate_lpc
(
q
,
quantized_lspf
,
lpc
,
i
);
interpolate_lpc
(
q
,
quantized_lspf
,
lpc
,
i
);
ff_celp_lp_synthesis_filterf
(
formant_mem
,
lpc
,
outbuffer
+
i
*
40
,
40
,
ff_celp_lp_synthesis_filterf
(
formant_mem
,
lpc
,
outbuffer
+
i
*
40
,
40
,
10
);
10
);
formant_mem
+=
40
;
formant_mem
+=
40
;
}
}
...
@@ -795,8 +790,7 @@ erasure:
...
@@ -795,8 +790,7 @@ erasure:
return
buf_size
;
return
buf_size
;
}
}
AVCodec
ff_qcelp_decoder
=
AVCodec
ff_qcelp_decoder
=
{
{
.
name
=
"qcelp"
,
.
name
=
"qcelp"
,
.
type
=
AVMEDIA_TYPE_AUDIO
,
.
type
=
AVMEDIA_TYPE_AUDIO
,
.
id
=
CODEC_ID_QCELP
,
.
id
=
CODEC_ID_QCELP
,
...
...
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