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
Hide 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 @@
#undef NDEBUG
#include <assert.h>
typedef
enum
{
typedef
enum
{
I_F_Q
=
-
1
,
/**< insufficient frame quality */
SILENCE
,
RATE_OCTAVE
,
...
...
@@ -54,8 +53,7 @@ typedef enum
RATE_FULL
}
qcelp_packet_rate
;
typedef
struct
{
typedef
struct
{
AVFrame
avframe
;
GetBitContext
gb
;
qcelp_packet_rate
bitrate
;
...
...
@@ -95,8 +93,8 @@ static av_cold int qcelp_decode_init(AVCodecContext *avctx)
avctx
->
sample_fmt
=
AV_SAMPLE_FMT_FLT
;
for
(
i
=
0
;
i
<
10
;
i
++
)
q
->
prev_lspf
[
i
]
=
(
i
+
1
)
/
11
.;
for
(
i
=
0
;
i
<
10
;
i
++
)
q
->
prev_lspf
[
i
]
=
(
i
+
1
)
/
11
.;
avcodec_get_frame_defaults
(
&
q
->
avframe
);
avctx
->
coded_frame
=
&
q
->
avframe
;
...
...
@@ -129,12 +127,12 @@ static int decode_lspf(QCELPContext *q, float *lspf)
if
(
q
->
bitrate
==
RATE_OCTAVE
)
{
q
->
octave_count
++
;
for
(
i
=
0
;
i
<
10
;
i
++
)
{
for
(
i
=
0
;
i
<
10
;
i
++
)
{
q
->
predictor_lspf
[
i
]
=
lspf
[
i
]
=
(
q
->
frame
.
lspv
[
i
]
?
QCELP_LSP_SPREAD_FACTOR
:
-
QCELP_LSP_SPREAD_FACTOR
)
+
predictors
[
i
]
*
QCELP_LSP_OCTAVE_PREDICTOR
+
(
i
+
1
)
*
((
1
-
QCELP_LSP_OCTAVE_PREDICTOR
)
/
11
);
:
-
QCELP_LSP_SPREAD_FACTOR
)
+
predictors
[
i
]
*
QCELP_LSP_OCTAVE_PREDICTOR
+
(
i
+
1
)
*
((
1
-
QCELP_LSP_OCTAVE_PREDICTOR
)
/
11
);
}
smooth
=
q
->
octave_count
<
10
?
.
875
:
0
.
1
;
}
else
{
...
...
@@ -142,49 +140,49 @@ static int decode_lspf(QCELPContext *q, float *lspf)
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
;
for
(
i
=
0
;
i
<
10
;
i
++
)
{
for
(
i
=
0
;
i
<
10
;
i
++
)
{
q
->
predictor_lspf
[
i
]
=
lspf
[
i
]
=
(
i
+
1
)
*
(
1
-
erasure_coeff
)
/
11
+
erasure_coeff
*
predictors
[
i
];
lspf
[
i
]
=
(
i
+
1
)
*
(
1
-
erasure_coeff
)
/
11
+
erasure_coeff
*
predictors
[
i
];
}
smooth
=
0
.
125
;
}
// Check the stability of the LSP frequencies.
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
[
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
);
// 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
{
q
->
octave_count
=
0
;
tmp_lspf
=
0
.;
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
+
1
]
=
tmp_lspf
+=
qcelp_lspvq
[
i
][
q
->
frame
.
lspv
[
i
]][
1
]
*
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
;
}
// Check for badly received packets.
if
(
q
->
bitrate
==
RATE_QUARTER
)
{
if
(
lspf
[
9
]
<=
.
70
||
lspf
[
9
]
>=
.
97
)
if
(
lspf
[
9
]
<=
.
70
||
lspf
[
9
]
>=
.
97
)
return
-
1
;
for
(
i
=
3
;
i
<
10
;
i
++
)
if
(
fabs
(
lspf
[
i
]
-
lspf
[
i
-
2
])
<
.
08
)
for
(
i
=
3
;
i
<
10
;
i
++
)
if
(
fabs
(
lspf
[
i
]
-
lspf
[
i
-
2
])
<
.
08
)
return
-
1
;
}
else
{
if
(
lspf
[
9
]
<=
.
66
||
lspf
[
9
]
>=
.
985
)
if
(
lspf
[
9
]
<=
.
66
||
lspf
[
9
]
>=
.
985
)
return
-
1
;
for
(
i
=
4
;
i
<
10
;
i
++
)
if
(
fabs
(
lspf
[
i
]
-
lspf
[
i
-
4
])
<
.
0931
)
for
(
i
=
4
;
i
<
10
;
i
++
)
if
(
fabs
(
lspf
[
i
]
-
lspf
[
i
-
4
])
<
.
0931
)
return
-
1
;
}
}
...
...
@@ -199,72 +197,72 @@ static int decode_lspf(QCELPContext *q, float *lspf)
*
* TIA/EIA/IS-733 2.4.6.2
*/
static
void
decode_gain_and_index
(
QCELPContext
*
q
,
float
*
gain
)
{
int
i
,
subframes_count
,
g1
[
16
];
static
void
decode_gain_and_index
(
QCELPContext
*
q
,
float
*
gain
)
{
int
i
,
subframes_count
,
g1
[
16
];
float
slope
;
if
(
q
->
bitrate
>=
RATE_QUARTER
)
{
switch
(
q
->
bitrate
)
{
case
RATE_FULL
:
subframes_count
=
16
;
break
;
case
RATE_HALF
:
subframes_count
=
4
;
break
;
default:
subframes_count
=
5
;
case
RATE_FULL
:
subframes_count
=
16
;
break
;
case
RATE_HALF
:
subframes_count
=
4
;
break
;
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
];
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
);
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
);
}
gain
[
i
]
=
qcelp_g12ga
[
g1
[
i
]];
if
(
q
->
frame
.
cbsign
[
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
[
1
]
=
g1
[
i
-
1
];
q
->
last_codebook_gain
=
qcelp_g12ga
[
g1
[
i
-
1
]];
q
->
prev_g1
[
0
]
=
g1
[
i
-
2
];
q
->
prev_g1
[
1
]
=
g1
[
i
-
1
];
q
->
last_codebook_gain
=
qcelp_g12ga
[
g1
[
i
-
1
]];
if
(
q
->
bitrate
==
RATE_QUARTER
)
{
// Provide smoothing of the unvoiced excitation energy.
gain
[
7
]
=
gain
[
4
];
gain
[
6
]
=
0
.
4
*
gain
[
3
]
+
0
.
6
*
gain
[
4
];
gain
[
5
]
=
gain
[
3
];
gain
[
4
]
=
0
.
8
*
gain
[
2
]
+
0
.
2
*
gain
[
3
];
gain
[
3
]
=
0
.
2
*
gain
[
1
]
+
0
.
8
*
gain
[
2
];
gain
[
2
]
=
gain
[
1
];
gain
[
1
]
=
0
.
6
*
gain
[
0
]
+
0
.
4
*
gain
[
1
];
gain
[
7
]
=
gain
[
4
];
gain
[
6
]
=
0
.
4
*
gain
[
3
]
+
0
.
6
*
gain
[
4
];
gain
[
5
]
=
gain
[
3
];
gain
[
4
]
=
0
.
8
*
gain
[
2
]
+
0
.
2
*
gain
[
3
];
gain
[
3
]
=
0
.
2
*
gain
[
1
]
+
0
.
8
*
gain
[
2
];
gain
[
2
]
=
gain
[
1
];
gain
[
1
]
=
0
.
6
*
gain
[
0
]
+
0
.
4
*
gain
[
1
];
}
}
else
if
(
q
->
bitrate
!=
SILENCE
)
{
if
(
q
->
bitrate
==
RATE_OCTAVE
)
{
g1
[
0
]
=
2
*
q
->
frame
.
cbgain
[
0
]
+
av_clip
((
q
->
prev_g1
[
0
]
+
q
->
prev_g1
[
1
])
/
2
-
5
,
0
,
54
);
g1
[
0
]
=
2
*
q
->
frame
.
cbgain
[
0
]
+
av_clip
((
q
->
prev_g1
[
0
]
+
q
->
prev_g1
[
1
])
/
2
-
5
,
0
,
54
);
subframes_count
=
8
;
}
else
{
assert
(
q
->
bitrate
==
I_F_Q
);
g1
[
0
]
=
q
->
prev_g1
[
1
];
switch
(
q
->
erasure_count
)
{
case
1
:
break
;
case
2
:
g1
[
0
]
-=
1
;
break
;
case
3
:
g1
[
0
]
-=
2
;
break
;
default:
g1
[
0
]
-=
6
;
case
1
:
break
;
case
2
:
g1
[
0
]
-=
1
;
break
;
case
3
:
g1
[
0
]
-=
2
;
break
;
default:
g1
[
0
]
-=
6
;
}
if
(
g1
[
0
]
<
0
)
if
(
g1
[
0
]
<
0
)
g1
[
0
]
=
0
;
subframes_count
=
4
;
}
// This interpolation is done to produce smoother background noise.
slope
=
0
.
5
*
(
qcelp_g12ga
[
g1
[
0
]]
-
q
->
last_codebook_gain
)
/
subframes_count
;
for
(
i
=
1
;
i
<=
subframes_count
;
i
++
)
gain
[
i
-
1
]
=
q
->
last_codebook_gain
+
slope
*
i
;
slope
=
0
.
5
*
(
qcelp_g12ga
[
g1
[
0
]]
-
q
->
last_codebook_gain
)
/
subframes_count
;
for
(
i
=
1
;
i
<=
subframes_count
;
i
++
)
gain
[
i
-
1
]
=
q
->
last_codebook_gain
+
slope
*
i
;
q
->
last_codebook_gain
=
gain
[
i
-
2
];
q
->
prev_g1
[
0
]
=
q
->
prev_g1
[
1
];
q
->
prev_g1
[
1
]
=
g1
[
0
];
q
->
last_codebook_gain
=
gain
[
i
-
2
];
q
->
prev_g1
[
0
]
=
q
->
prev_g1
[
1
];
q
->
prev_g1
[
1
]
=
g1
[
0
];
}
}
...
...
@@ -279,13 +277,13 @@ static void decode_gain_and_index(QCELPContext *q,
*/
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
];
if
(
FFABS
(
diff
)
>
10
)
if
(
FFABS
(
diff
)
>
10
)
return
-
1
;
else
if
(
FFABS
(
diff
-
prev_diff
)
>
12
)
else
if
(
FFABS
(
diff
-
prev_diff
)
>
12
)
return
-
1
;
prev_diff
=
diff
;
}
...
...
@@ -316,73 +314,74 @@ static int codebook_sanity_check_for_rate_quarter(const uint8_t *cbgain)
static
void
compute_svector
(
QCELPContext
*
q
,
const
float
*
gain
,
float
*
cdn_vector
)
{
int
i
,
j
,
k
;
int
i
,
j
,
k
;
uint16_t
cbseed
,
cindex
;
float
*
rnd
,
tmp_gain
,
fir_filter_value
;
float
*
rnd
,
tmp_gain
,
fir_filter_value
;
switch
(
q
->
bitrate
)
{
case
RATE_FULL
:
for
(
i
=
0
;
i
<
16
;
i
++
)
{
tmp_gain
=
gain
[
i
]
*
QCELP_RATE_FULL_CODEBOOK_RATIO
;
cindex
=
-
q
->
frame
.
cindex
[
i
];
for
(
j
=
0
;
j
<
10
;
j
++
)
*
cdn_vector
++
=
tmp_gain
*
qcelp_rate_full_codebook
[
cindex
++
&
127
];
}
case
RATE_FULL
:
for
(
i
=
0
;
i
<
16
;
i
++
)
{
tmp_gain
=
gain
[
i
]
*
QCELP_RATE_FULL_CODEBOOK_RATIO
;
cindex
=
-
q
->
frame
.
cindex
[
i
];
for
(
j
=
0
;
j
<
10
;
j
++
)
*
cdn_vector
++
=
tmp_gain
*
qcelp_rate_full_codebook
[
cindex
++
&
127
];
}
break
;
case
RATE_HALF
:
for
(
i
=
0
;
i
<
4
;
i
++
)
{
tmp_gain
=
gain
[
i
]
*
QCELP_RATE_HALF_CODEBOOK_RATIO
;
cindex
=
-
q
->
frame
.
cindex
[
i
];
for
(
j
=
0
;
j
<
40
;
j
++
)
case
RATE_HALF
:
for
(
i
=
0
;
i
<
4
;
i
++
)
{
tmp_gain
=
gain
[
i
]
*
QCELP_RATE_HALF_CODEBOOK_RATIO
;
cindex
=
-
q
->
frame
.
cindex
[
i
];
for
(
j
=
0
;
j
<
40
;
j
++
)
*
cdn_vector
++
=
tmp_gain
*
qcelp_rate_half_codebook
[
cindex
++
&
127
];
}
}
break
;
case
RATE_QUARTER
:
cbseed
=
(
0x0003
&
q
->
frame
.
lspv
[
4
])
<<
14
|
(
0x003F
&
q
->
frame
.
lspv
[
3
])
<<
8
|
(
0x0060
&
q
->
frame
.
lspv
[
2
])
<<
1
|
(
0x0007
&
q
->
frame
.
lspv
[
1
])
<<
3
|
(
0x0038
&
q
->
frame
.
lspv
[
0
])
>>
3
;
rnd
=
q
->
rnd_fir_filter_mem
+
20
;
for
(
i
=
0
;
i
<
8
;
i
++
)
{
tmp_gain
=
gain
[
i
]
*
(
QCELP_SQRT1887
/
32768
.
0
);
for
(
k
=
0
;
k
<
20
;
k
++
)
{
cbseed
=
521
*
cbseed
+
259
;
*
rnd
=
(
int16_t
)
cbseed
;
case
RATE_QUARTER
:
cbseed
=
(
0x0003
&
q
->
frame
.
lspv
[
4
])
<<
14
|
(
0x003F
&
q
->
frame
.
lspv
[
3
])
<<
8
|
(
0x0060
&
q
->
frame
.
lspv
[
2
])
<<
1
|
(
0x0007
&
q
->
frame
.
lspv
[
1
])
<<
3
|
(
0x0038
&
q
->
frame
.
lspv
[
0
])
>>
3
;
rnd
=
q
->
rnd_fir_filter_mem
+
20
;
for
(
i
=
0
;
i
<
8
;
i
++
)
{
tmp_gain
=
gain
[
i
]
*
(
QCELP_SQRT1887
/
32768
.
0
);
for
(
k
=
0
;
k
<
20
;
k
++
)
{
cbseed
=
521
*
cbseed
+
259
;
*
rnd
=
(
int16_t
)
cbseed
;
// FIR filter
fir_filter_value
=
0
.
0
;
for
(
j
=
0
;
j
<
10
;
j
++
)
fir_filter_value
+=
qcelp_rnd_fir_coefs
[
j
]
*
(
rnd
[
-
j
]
+
rnd
[
-
20
+
j
]);
fir_filter_value
+=
qcelp_rnd_fir_coefs
[
10
]
*
rnd
[
-
10
];
*
cdn_vector
++
=
tmp_gain
*
fir_filter_value
;
rnd
++
;
}
fir_filter_value
=
0
.
0
;
for
(
j
=
0
;
j
<
10
;
j
++
)
fir_filter_value
+=
qcelp_rnd_fir_coefs
[
j
]
*
(
rnd
[
-
j
]
+
rnd
[
-
20
+
j
]);
fir_filter_value
+=
qcelp_rnd_fir_coefs
[
10
]
*
rnd
[
-
10
];
*
cdn_vector
++
=
tmp_gain
*
fir_filter_value
;
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
;
case
RATE_OCTAVE
:
cbseed
=
q
->
first16bits
;
for
(
i
=
0
;
i
<
8
;
i
++
)
{
tmp_gain
=
gain
[
i
]
*
(
QCELP_SQRT1887
/
32768
.
0
);
for
(
j
=
0
;
j
<
20
;
j
++
)
{
cbseed
=
521
*
cbseed
+
259
;
*
cdn_vector
++
=
tmp_gain
*
(
int16_t
)
cbseed
;
}
case
RATE_OCTAVE
:
cbseed
=
q
->
first16bits
;
for
(
i
=
0
;
i
<
8
;
i
++
)
{
tmp_gain
=
gain
[
i
]
*
(
QCELP_SQRT1887
/
32768
.
0
);
for
(
j
=
0
;
j
<
20
;
j
++
)
{
cbseed
=
521
*
cbseed
+
259
;
*
cdn_vector
++
=
tmp_gain
*
(
int16_t
)
cbseed
;
}
}
break
;
case
I_F_Q
:
cbseed
=
-
44
;
// random codebook index
for
(
i
=
0
;
i
<
4
;
i
++
)
{
tmp_gain
=
gain
[
i
]
*
QCELP_RATE_FULL_CODEBOOK_RATIO
;
for
(
j
=
0
;
j
<
40
;
j
++
)
*
cdn_vector
++
=
tmp_gain
*
qcelp_rate_full_codebook
[
cbseed
++
&
127
];
}
case
I_F_Q
:
cbseed
=
-
44
;
// random codebook index
for
(
i
=
0
;
i
<
4
;
i
++
)
{
tmp_gain
=
gain
[
i
]
*
QCELP_RATE_FULL_CODEBOOK_RATIO
;
for
(
j
=
0
;
j
<
40
;
j
++
)
*
cdn_vector
++
=
tmp_gain
*
qcelp_rate_full_codebook
[
cbseed
++
&
127
];
}
break
;
case
SILENCE
:
memset
(
cdn_vector
,
0
,
160
*
sizeof
(
float
));
case
SILENCE
:
memset
(
cdn_vector
,
0
,
160
*
sizeof
(
float
));
break
;
}
}
...
...
@@ -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
*/
static
void
apply_gain_ctrl
(
float
*
v_out
,
const
float
*
v_ref
,
const
float
*
v_in
)
static
void
apply_gain_ctrl
(
float
*
v_out
,
const
float
*
v_ref
,
const
float
*
v_in
)
{
int
i
;
...
...
@@ -429,8 +427,8 @@ static const float *do_pitchfilter(float memory[303], const float v_in[160],
const
float
gain
[
4
],
const
uint8_t
*
lag
,
const
uint8_t
pfrac
[
4
])
{
int
i
,
j
;
float
*
v_lag
,
*
v_out
;
int
i
,
j
;
float
*
v_lag
,
*
v_out
;
const
float
*
v_len
;
v_out
=
memory
+
143
;
// Output vector starts at memory[143].
...
...
@@ -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
];
for
(
v_len
=
v_in
+
40
;
v_in
<
v_len
;
v_in
++
)
{
if
(
pfrac
[
i
])
{
// If it is a fractional lag...
for
(
j
=
0
,
*
v_out
=
0
.;
j
<
4
;
j
++
)
*
v_out
+=
qcelp_hammsinc_table
[
j
]
*
(
v_lag
[
j
-
4
]
+
v_lag
[
3
-
j
]);
}
else
for
(
j
=
0
,
*
v_out
=
0
.;
j
<
4
;
j
++
)
*
v_out
+=
qcelp_hammsinc_table
[
j
]
*
(
v_lag
[
j
-
4
]
+
v_lag
[
3
-
j
]);
}
else
*
v_out
=
*
v_lag
;
*
v_out
=
*
v_in
+
gain
[
i
]
*
*
v_out
;
...
...
@@ -470,15 +468,13 @@ static const float *do_pitchfilter(float memory[303], const float v_in[160],
*/
static
void
apply_pitch_filters
(
QCELPContext
*
q
,
float
*
cdn_vector
)
{
int
i
;
int
i
;
const
float
*
v_synthesis_filtered
,
*
v_pre_filtered
;
if
(
q
->
bitrate
>=
RATE_HALF
||
q
->
bitrate
==
SILENCE
||
(
q
->
bitrate
==
I_F_Q
&&
(
q
->
prev_bitrate
>=
RATE_HALF
)))
{
if
(
q
->
bitrate
>=
RATE_HALF
)
{
if
(
q
->
bitrate
>=
RATE_HALF
||
q
->
bitrate
==
SILENCE
||
(
q
->
bitrate
==
I_F_Q
&&
(
q
->
prev_bitrate
>=
RATE_HALF
)))
{
if
(
q
->
bitrate
>=
RATE_HALF
)
{
// Compute gain & lag for the whole frame.
for
(
i
=
0
;
i
<
4
;
i
++
)
{
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)
assert
(
q
->
bitrate
==
SILENCE
);
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
);
memset
(
q
->
frame
.
pfrac
,
0
,
sizeof
(
q
->
frame
.
pfrac
));
...
...
@@ -509,18 +505,17 @@ static void apply_pitch_filters(QCELPContext *q, float *cdn_vector)
q
->
pitch_lag
,
q
->
frame
.
pfrac
);
// 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
);
v_pre_filtered
=
do_pitchfilter
(
q
->
pitch_pre_filter_mem
,
v_synthesis_filtered
,
q
->
pitch_gain
,
q
->
pitch_lag
,
q
->
frame
.
pfrac
);
v_pre_filtered
=
do_pitchfilter
(
q
->
pitch_pre_filter_mem
,
v_synthesis_filtered
,
q
->
pitch_gain
,
q
->
pitch_lag
,
q
->
frame
.
pfrac
);
apply_gain_ctrl
(
cdn_vector
,
v_synthesis_filtered
,
v_pre_filtered
);
}
else
{
memcpy
(
q
->
pitch_synthesis_filter_mem
,
cdn_vector
+
17
,
143
*
sizeof
(
float
));
memcpy
(
q
->
pitch_synthesis_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_lag
,
0
,
sizeof
(
q
->
pitch_lag
));
...
...
@@ -543,15 +538,15 @@ static void lspf2lpc(const float *lspf, float *lpc)
{
double
lsp
[
10
];
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
]);
ff_acelp_lspd2lpc
(
lsp
,
lpc
,
5
);
for
(
i
=
0
;
i
<
10
;
i
++
)
{
lpc
[
i
]
*=
bandwidth_expansion_coeff
;
lpc
[
i
]
*=
bandwidth_expansion_coeff
;
bandwidth_expansion_coeff
*=
QCELP_BANDWIDTH_EXPANSION_COEFF
;
}
}
...
...
@@ -573,9 +568,9 @@ static void interpolate_lpc(QCELPContext *q, const float *curr_lspf,
float
interpolated_lspf
[
10
];
float
weight
;
if
(
q
->
bitrate
>=
RATE_QUARTER
)
if
(
q
->
bitrate
>=
RATE_QUARTER
)
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
;
else
weight
=
1
.
0
;
...
...
@@ -584,21 +579,21 @@ static void interpolate_lpc(QCELPContext *q, const float *curr_lspf,
ff_weighted_vector_sumf
(
interpolated_lspf
,
curr_lspf
,
q
->
prev_lspf
,
weight
,
1
.
0
-
weight
,
10
);
lspf2lpc
(
interpolated_lspf
,
lpc
);
}
else
if
(
q
->
bitrate
>=
RATE_QUARTER
||
(
q
->
bitrate
==
I_F_Q
&&
!
subframe_num
))
}
else
if
(
q
->
bitrate
>=
RATE_QUARTER
||
(
q
->
bitrate
==
I_F_Q
&&
!
subframe_num
))
lspf2lpc
(
curr_lspf
,
lpc
);
else
if
(
q
->
bitrate
==
SILENCE
&&
!
subframe_num
)
else
if
(
q
->
bitrate
==
SILENCE
&&
!
subframe_num
)
lspf2lpc
(
q
->
prev_lspf
,
lpc
);
}
static
qcelp_packet_rate
buf_size2bitrate
(
const
int
buf_size
)
{
switch
(
buf_size
)
{
case
35
:
return
RATE_FULL
;
case
17
:
return
RATE_HALF
;
case
8
:
return
RATE_QUARTER
;
case
4
:
return
RATE_OCTAVE
;
case
1
:
return
SILENCE
;
case
35
:
return
RATE_FULL
;
case
17
:
return
RATE_HALF
;
case
8
:
return
RATE_QUARTER
;
case
4
:
return
RATE_OCTAVE
;
case
1
:
return
SILENCE
;
}
return
I_F_Q
;
...
...
@@ -616,8 +611,9 @@ static qcelp_packet_rate buf_size2bitrate(const int buf_size)
*
* TIA/EIA/IS-733 2.4.8.7.1
*/
static
qcelp_packet_rate
determine_bitrate
(
AVCodecContext
*
avctx
,
const
int
buf_size
,
const
uint8_t
**
buf
)
static
qcelp_packet_rate
determine_bitrate
(
AVCodecContext
*
avctx
,
const
int
buf_size
,
const
uint8_t
**
buf
)
{
qcelp_packet_rate
bitrate
;
...
...
@@ -639,7 +635,7 @@ static qcelp_packet_rate determine_bitrate(AVCodecContext *avctx, const int buf_
}
else
if
((
bitrate
=
buf_size2bitrate
(
buf_size
+
1
))
>=
0
)
{
av_log
(
avctx
,
AV_LOG_WARNING
,
"Bitrate byte is missing, guessing the bitrate from packet size.
\n
"
);
}
else
}
else
return
I_F_Q
;
if
(
bitrate
==
SILENCE
)
{
...
...
@@ -652,8 +648,8 @@ static qcelp_packet_rate determine_bitrate(AVCodecContext *avctx, const int buf_
static
void
warn_insufficient_frame_quality
(
AVCodecContext
*
avctx
,
const
char
*
message
)
{
av_log
(
avctx
,
AV_LOG_WARNING
,
"Frame #%d, IFQ: %s
\n
"
,
avctx
->
frame_number
,
message
);
av_log
(
avctx
,
AV_LOG_WARNING
,
"Frame #%d, IFQ: %s
\n
"
,
avctx
->
frame_number
,
message
);
}
static
void
postfilter
(
QCELPContext
*
q
,
float
*
samples
,
float
*
lpc
)
...
...
@@ -675,23 +671,24 @@ static void postfilter(QCELPContext *q, float *samples, float *lpc)
ff_celp_lp_zero_synthesis_filterf
(
zero_out
,
lpc_s
,
q
->
formant_mem
+
10
,
160
,
10
);
memcpy
(
pole_out
,
q
->
postfilter_synth_mem
,
sizeof
(
float
)
*
10
);
memcpy
(
pole_out
,
q
->
postfilter_synth_mem
,
sizeof
(
float
)
*
10
);
ff_celp_lp_synthesis_filterf
(
pole_out
+
10
,
lpc_p
,
zero_out
,
160
,
10
);
memcpy
(
q
->
postfilter_synth_mem
,
pole_out
+
160
,
sizeof
(
float
)
*
10
);
ff_tilt_compensation
(
&
q
->
postfilter_tilt_mem
,
0
.
3
,
pole_out
+
10
,
160
);
ff_adaptive_gain_control
(
samples
,
pole_out
+
10
,
ff_dot_productf
(
q
->
formant_mem
+
10
,
q
->
formant_mem
+
10
,
160
),
160
,
0
.
9375
,
&
q
->
postfilter_agc_mem
);
ff_dot_productf
(
q
->
formant_mem
+
10
,
q
->
formant_mem
+
10
,
160
),
160
,
0
.
9375
,
&
q
->
postfilter_agc_mem
);
}
static
int
qcelp_decode_frame
(
AVCodecContext
*
avctx
,
void
*
data
,
int
*
got_frame_ptr
,
AVPacket
*
avpkt
)
{
const
uint8_t
*
buf
=
avpkt
->
data
;
int
buf_size
=
avpkt
->
size
;
QCELPContext
*
q
=
avctx
->
priv_data
;
int
buf_size
=
avpkt
->
size
;
QCELPContext
*
q
=
avctx
->
priv_data
;
float
*
outbuffer
;
int
i
,
ret
;
float
quantized_lspf
[
10
],
lpc
[
10
];
...
...
@@ -711,23 +708,23 @@ static int qcelp_decode_frame(AVCodecContext *avctx, void *data,
goto
erasure
;
}
if
(
q
->
bitrate
==
RATE_OCTAVE
&&
(
q
->
first16bits
=
AV_RB16
(
buf
))
==
0xFFFF
)
{
if
(
q
->
bitrate
==
RATE_OCTAVE
&&
(
q
->
first16bits
=
AV_RB16
(
buf
))
==
0xFFFF
)
{
warn_insufficient_frame_quality
(
avctx
,
"Bitrate is 1/8 and first 16 bits are on."
);
goto
erasure
;
}
if
(
q
->
bitrate
>
SILENCE
)
{
const
QCELPBitmap
*
bitmaps
=
qcelp_unpacking_bitmaps_per_rate
[
q
->
bitrate
];
const
QCELPBitmap
*
bitmaps_end
=
qcelp_unpacking_bitmaps_per_rate
[
q
->
bitrate
]
+
qcelp_unpacking_bitmaps_lengths
[
q
->
bitrate
];
uint8_t
*
unpacked_data
=
(
uint8_t
*
)
&
q
->
frame
;
const
QCELPBitmap
*
bitmaps_end
=
qcelp_unpacking_bitmaps_per_rate
[
q
->
bitrate
]
+
qcelp_unpacking_bitmaps_lengths
[
q
->
bitrate
];
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
));
for
(;
bitmaps
<
bitmaps_end
;
bitmaps
++
)
for
(;
bitmaps
<
bitmaps_end
;
bitmaps
++
)
unpacked_data
[
bitmaps
->
index
]
|=
get_bits
(
&
q
->
gb
,
bitmaps
->
bitlen
)
<<
bitmaps
->
bitpos
;
// Check for erasures/blanks on rates 1, 1/4 and 1/8.
...
...
@@ -735,8 +732,8 @@ static int qcelp_decode_frame(AVCodecContext *avctx, void *data,
warn_insufficient_frame_quality
(
avctx
,
"Wrong data in reserved frame area."
);
goto
erasure
;
}
if
(
q
->
bitrate
==
RATE_QUARTER
&&
codebook_sanity_check_for_rate_quarter
(
q
->
frame
.
cbgain
))
{
if
(
q
->
bitrate
==
RATE_QUARTER
&&
codebook_sanity_check_for_rate_quarter
(
q
->
frame
.
cbgain
))
{
warn_insufficient_frame_quality
(
avctx
,
"Codebook gain sanity check failed."
);
goto
erasure
;
}
...
...
@@ -759,7 +756,6 @@ static int qcelp_decode_frame(AVCodecContext *avctx, void *data,
goto
erasure
;
}
apply_pitch_filters
(
q
,
outbuffer
);
if
(
q
->
bitrate
==
I_F_Q
)
{
...
...
@@ -770,14 +766,13 @@ erasure:
compute_svector
(
q
,
gain
,
outbuffer
);
decode_lspf
(
q
,
quantized_lspf
);
apply_pitch_filters
(
q
,
outbuffer
);
}
else
}
else
q
->
erasure_count
=
0
;
formant_mem
=
q
->
formant_mem
+
10
;
for
(
i
=
0
;
i
<
4
;
i
++
)
{
interpolate_lpc
(
q
,
quantized_lspf
,
lpc
,
i
);
ff_celp_lp_synthesis_filterf
(
formant_mem
,
lpc
,
outbuffer
+
i
*
40
,
40
,
10
);
ff_celp_lp_synthesis_filterf
(
formant_mem
,
lpc
,
outbuffer
+
i
*
40
,
40
,
10
);
formant_mem
+=
40
;
}
...
...
@@ -787,7 +782,7 @@ erasure:
memcpy
(
q
->
formant_mem
,
q
->
formant_mem
+
160
,
10
*
sizeof
(
float
));
memcpy
(
q
->
prev_lspf
,
quantized_lspf
,
sizeof
(
q
->
prev_lspf
));
q
->
prev_bitrate
=
q
->
bitrate
;
q
->
prev_bitrate
=
q
->
bitrate
;
*
got_frame_ptr
=
1
;
*
(
AVFrame
*
)
data
=
q
->
avframe
;
...
...
@@ -795,14 +790,13 @@ erasure:
return
buf_size
;
}
AVCodec
ff_qcelp_decoder
=
{
.
name
=
"qcelp"
,
.
type
=
AVMEDIA_TYPE_AUDIO
,
.
id
=
CODEC_ID_QCELP
,
.
init
=
qcelp_decode_init
,
.
decode
=
qcelp_decode_frame
,
.
capabilities
=
CODEC_CAP_DR1
,
AVCodec
ff_qcelp_decoder
=
{
.
name
=
"qcelp"
,
.
type
=
AVMEDIA_TYPE_AUDIO
,
.
id
=
CODEC_ID_QCELP
,
.
init
=
qcelp_decode_init
,
.
decode
=
qcelp_decode_frame
,
.
capabilities
=
CODEC_CAP_DR1
,
.
priv_data_size
=
sizeof
(
QCELPContext
),
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"QCELP / PureVoice"
),
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"QCELP / PureVoice"
),
};
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