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
011c9112
Commit
011c9112
authored
Dec 14, 2018
by
Carl Eugen Hoyos
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
lavc/g729dec: Cosmetics, fix indentation after last commit.
parent
641d5215
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
286 additions
and
283 deletions
+286
-283
g729dec.c
libavcodec/g729dec.c
+286
-283
No files found.
libavcodec/g729dec.c
View file @
011c9112
...
...
@@ -272,8 +272,7 @@ static void g729d_get_new_exc(
ff_celp_convolve_circ
(
fc_new
,
fc_cur
,
phase_filter
[
dstate
],
subframe_size
);
for
(
i
=
0
;
i
<
subframe_size
;
i
++
)
{
for
(
i
=
0
;
i
<
subframe_size
;
i
++
)
{
out
[
i
]
=
in
[
i
];
out
[
i
]
-=
(
gain_code
*
fc_cur
[
i
]
+
0x2000
)
>>
14
;
out
[
i
]
+=
(
gain_code
*
fc_new
[
i
]
+
0x2000
)
>>
14
;
...
...
@@ -289,10 +288,10 @@ static void g729d_get_new_exc(
*/
static
int
g729d_onset_decision
(
int
past_onset
,
const
int16_t
*
past_gain_code
)
{
if
((
past_gain_code
[
0
]
>>
1
)
>
past_gain_code
[
1
])
if
((
past_gain_code
[
0
]
>>
1
)
>
past_gain_code
[
1
])
return
2
;
else
return
FFMAX
(
past_onset
-
1
,
0
);
return
FFMAX
(
past_onset
-
1
,
0
);
}
/**
...
...
@@ -307,24 +306,25 @@ static int16_t g729d_voice_decision(int onset, int prev_voice_decision, const in
{
int
i
,
low_gain_pitch_cnt
,
voice_decision
;
if
(
past_gain_pitch
[
0
]
>=
14745
)
// 0.9
if
(
past_gain_pitch
[
0
]
>=
14745
)
{
// 0.9
voice_decision
=
DECISION_VOICE
;
else
if
(
past_gain_pitch
[
0
]
<=
9830
)
// 0.6
}
else
if
(
past_gain_pitch
[
0
]
<=
9830
)
{
// 0.6
voice_decision
=
DECISION_NOISE
;
else
}
else
{
voice_decision
=
DECISION_INTERMEDIATE
;
}
for
(
i
=
0
,
low_gain_pitch_cnt
=
0
;
i
<
6
;
i
++
)
if
(
past_gain_pitch
[
i
]
<
9830
)
for
(
i
=
0
,
low_gain_pitch_cnt
=
0
;
i
<
6
;
i
++
)
if
(
past_gain_pitch
[
i
]
<
9830
)
low_gain_pitch_cnt
++
;
if
(
low_gain_pitch_cnt
>
2
&&
!
onset
)
if
(
low_gain_pitch_cnt
>
2
&&
!
onset
)
voice_decision
=
DECISION_NOISE
;
if
(
!
onset
&&
voice_decision
>
prev_voice_decision
+
1
)
if
(
!
onset
&&
voice_decision
>
prev_voice_decision
+
1
)
voice_decision
--
;
if
(
onset
&&
voice_decision
<
DECISION_VOICE
)
if
(
onset
&&
voice_decision
<
DECISION_VOICE
)
voice_decision
++
;
return
voice_decision
;
...
...
@@ -361,30 +361,30 @@ static av_cold int decoder_init(AVCodecContext * avctx)
return
AVERROR
(
ENOMEM
);
for
(
c
=
0
;
c
<
avctx
->
channels
;
c
++
)
{
ctx
->
gain_coeff
=
16384
;
// 1.0 in (1.14)
ctx
->
gain_coeff
=
16384
;
// 1.0 in (1.14)
for
(
k
=
0
;
k
<
MA_NP
+
1
;
k
++
)
{
ctx
->
past_quantizer_outputs
[
k
]
=
ctx
->
past_quantizer_output_buf
[
k
];
for
(
i
=
1
;
i
<
11
;
i
++
)
ctx
->
past_quantizer_outputs
[
k
][
i
-
1
]
=
(
18717
*
i
)
>>
3
;
}
for
(
k
=
0
;
k
<
MA_NP
+
1
;
k
++
)
{
ctx
->
past_quantizer_outputs
[
k
]
=
ctx
->
past_quantizer_output_buf
[
k
];
for
(
i
=
1
;
i
<
11
;
i
++
)
ctx
->
past_quantizer_outputs
[
k
][
i
-
1
]
=
(
18717
*
i
)
>>
3
;
}
ctx
->
lsp
[
0
]
=
ctx
->
lsp_buf
[
0
];
ctx
->
lsp
[
1
]
=
ctx
->
lsp_buf
[
1
];
memcpy
(
ctx
->
lsp
[
0
],
lsp_init
,
10
*
sizeof
(
int16_t
));
ctx
->
lsp
[
0
]
=
ctx
->
lsp_buf
[
0
];
ctx
->
lsp
[
1
]
=
ctx
->
lsp_buf
[
1
];
memcpy
(
ctx
->
lsp
[
0
],
lsp_init
,
10
*
sizeof
(
int16_t
));
ctx
->
exc
=
&
ctx
->
exc_base
[
PITCH_DELAY_MAX
+
INTERPOL_LEN
];
ctx
->
exc
=
&
ctx
->
exc_base
[
PITCH_DELAY_MAX
+
INTERPOL_LEN
];
ctx
->
pitch_delay_int_prev
=
PITCH_DELAY_MIN
;
ctx
->
pitch_delay_int_prev
=
PITCH_DELAY_MIN
;
/* random seed initialization */
ctx
->
rand_value
=
21845
;
/* random seed initialization */
ctx
->
rand_value
=
21845
;
/* quantized prediction error */
for
(
i
=
0
;
i
<
4
;
i
++
)
ctx
->
quant_energy
[
i
]
=
-
14336
;
// -14 in (5.10)
/* quantized prediction error */
for
(
i
=
0
;
i
<
4
;
i
++
)
ctx
->
quant_energy
[
i
]
=
-
14336
;
// -14 in (5.10)
ctx
++
;
ctx
++
;
}
ff_audiodsp_init
(
&
s
->
adsp
);
...
...
@@ -441,286 +441,289 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr,
}
for
(
c
=
0
;
c
<
avctx
->
channels
;
c
++
)
{
int
frame_erasure
=
0
;
///< frame erasure detected during decoding
int
bad_pitch
=
0
;
///< parity check failed
int
is_periodic
=
0
;
///< whether one of the subframes is declared as periodic or not
out_frame
=
(
int16_t
*
)
frame
->
data
[
c
];
for
(
i
=
0
;
i
<
buf_size
;
i
++
)
frame_erasure
|=
buf
[
i
];
frame_erasure
=
!
frame_erasure
;
init_get_bits
(
&
gb
,
buf
,
8
*
buf_size
);
ma_predictor
=
get_bits
(
&
gb
,
1
);
quantizer_1st
=
get_bits
(
&
gb
,
VQ_1ST_BITS
);
quantizer_2nd_lo
=
get_bits
(
&
gb
,
VQ_2ND_BITS
);
quantizer_2nd_hi
=
get_bits
(
&
gb
,
VQ_2ND_BITS
);
if
(
frame_erasure
)
lsf_restore_from_previous
(
ctx
->
lsfq
,
ctx
->
past_quantizer_outputs
,
ctx
->
ma_predictor_prev
);
else
{
lsf_decode
(
ctx
->
lsfq
,
ctx
->
past_quantizer_outputs
,
ma_predictor
,
quantizer_1st
,
quantizer_2nd_lo
,
quantizer_2nd_hi
);
ctx
->
ma_predictor_prev
=
ma_predictor
;
}
int
frame_erasure
=
0
;
///< frame erasure detected during decoding
int
bad_pitch
=
0
;
///< parity check failed
int
is_periodic
=
0
;
///< whether one of the subframes is declared as periodic or not
out_frame
=
(
int16_t
*
)
frame
->
data
[
c
];
tmp
=
ctx
->
past_quantizer_outputs
[
MA_NP
];
memmove
(
ctx
->
past_quantizer_outputs
+
1
,
ctx
->
past_quantizer_outputs
,
MA_NP
*
sizeof
(
int16_t
*
));
ctx
->
past_quantizer_outputs
[
0
]
=
tmp
;
ff_acelp_lsf2lsp
(
ctx
->
lsp
[
1
],
ctx
->
lsfq
,
10
);
ff_acelp_lp_decode
(
&
lp
[
0
][
0
],
&
lp
[
1
][
0
],
ctx
->
lsp
[
1
],
ctx
->
lsp
[
0
],
10
);
FFSWAP
(
int16_t
*
,
ctx
->
lsp
[
1
],
ctx
->
lsp
[
0
]);
for
(
i
=
0
;
i
<
2
;
i
++
)
{
int
gain_corr_factor
;
uint8_t
ac_index
;
///< adaptive codebook index
uint8_t
pulses_signs
;
///< fixed-codebook vector pulse signs
int
fc_indexes
;
///< fixed-codebook indexes
uint8_t
gc_1st_index
;
///< gain codebook (first stage) index
uint8_t
gc_2nd_index
;
///< gain codebook (second stage) index
ac_index
=
get_bits
(
&
gb
,
format
->
ac_index_bits
[
i
]);
if
(
!
i
&&
format
->
parity_bit
)
bad_pitch
=
av_parity
(
ac_index
>>
2
)
==
get_bits1
(
&
gb
);
fc_indexes
=
get_bits
(
&
gb
,
format
->
fc_indexes_bits
);
pulses_signs
=
get_bits
(
&
gb
,
format
->
fc_signs_bits
);
gc_1st_index
=
get_bits
(
&
gb
,
format
->
gc_1st_index_bits
);
gc_2nd_index
=
get_bits
(
&
gb
,
format
->
gc_2nd_index_bits
);
if
(
frame_erasure
)
pitch_delay_3x
=
3
*
ctx
->
pitch_delay_int_prev
;
else
if
(
!
i
)
{
if
(
bad_pitch
)
pitch_delay_3x
=
3
*
ctx
->
pitch_delay_int_prev
;
else
pitch_delay_3x
=
ff_acelp_decode_8bit_to_1st_delay3
(
ac_index
);
}
else
{
int
pitch_delay_min
=
av_clip
(
ctx
->
pitch_delay_int_prev
-
5
,
PITCH_DELAY_MIN
,
PITCH_DELAY_MAX
-
9
);
for
(
i
=
0
;
i
<
buf_size
;
i
++
)
frame_erasure
|=
buf
[
i
];
frame_erasure
=
!
frame_erasure
;
if
(
packet_type
==
FORMAT_G729D_6K4
)
pitch_delay_3x
=
ff_acelp_decode_4bit_to_2nd_delay3
(
ac_index
,
pitch_delay_min
);
else
pitch_delay_3x
=
ff_acelp_decode_5_6_bit_to_2nd_delay3
(
ac_index
,
pitch_delay_min
);
}
init_get_bits
(
&
gb
,
buf
,
8
*
buf_size
);
/* Round pitch delay to nearest (used everywhere except ff_acelp_interpolate). */
pitch_delay_int
[
i
]
=
(
pitch_delay_3x
+
1
)
/
3
;
if
(
pitch_delay_int
[
i
]
>
PITCH_DELAY_MAX
)
{
av_log
(
avctx
,
AV_LOG_WARNING
,
"pitch_delay_int %d is too large
\n
"
,
pitch_delay_int
[
i
]);
pitch_delay_int
[
i
]
=
PITCH_DELAY_MAX
;
}
ma_predictor
=
get_bits
(
&
gb
,
1
);
quantizer_1st
=
get_bits
(
&
gb
,
VQ_1ST_BITS
);
quantizer_2nd_lo
=
get_bits
(
&
gb
,
VQ_2ND_BITS
);
quantizer_2nd_hi
=
get_bits
(
&
gb
,
VQ_2ND_BITS
);
if
(
frame_erasure
)
{
ctx
->
rand_value
=
g729_prng
(
ctx
->
rand_value
);
fc_indexes
=
av_mod_uintp2
(
ctx
->
rand_value
,
format
->
fc_indexes_bits
);
ctx
->
rand_value
=
g729_prng
(
ctx
->
rand_value
);
pulses_signs
=
ctx
->
rand_value
;
lsf_restore_from_previous
(
ctx
->
lsfq
,
ctx
->
past_quantizer_outputs
,
ctx
->
ma_predictor_prev
);
}
else
{
lsf_decode
(
ctx
->
lsfq
,
ctx
->
past_quantizer_outputs
,
ma_predictor
,
quantizer_1st
,
quantizer_2nd_lo
,
quantizer_2nd_hi
);
ctx
->
ma_predictor_prev
=
ma_predictor
;
}
tmp
=
ctx
->
past_quantizer_outputs
[
MA_NP
];
memmove
(
ctx
->
past_quantizer_outputs
+
1
,
ctx
->
past_quantizer_outputs
,
MA_NP
*
sizeof
(
int16_t
*
));
ctx
->
past_quantizer_outputs
[
0
]
=
tmp
;
ff_acelp_lsf2lsp
(
ctx
->
lsp
[
1
],
ctx
->
lsfq
,
10
);
ff_acelp_lp_decode
(
&
lp
[
0
][
0
],
&
lp
[
1
][
0
],
ctx
->
lsp
[
1
],
ctx
->
lsp
[
0
],
10
);
FFSWAP
(
int16_t
*
,
ctx
->
lsp
[
1
],
ctx
->
lsp
[
0
]);
for
(
i
=
0
;
i
<
2
;
i
++
)
{
int
gain_corr_factor
;
uint8_t
ac_index
;
///< adaptive codebook index
uint8_t
pulses_signs
;
///< fixed-codebook vector pulse signs
int
fc_indexes
;
///< fixed-codebook indexes
uint8_t
gc_1st_index
;
///< gain codebook (first stage) index
uint8_t
gc_2nd_index
;
///< gain codebook (second stage) index
ac_index
=
get_bits
(
&
gb
,
format
->
ac_index_bits
[
i
]);
if
(
!
i
&&
format
->
parity_bit
)
bad_pitch
=
av_parity
(
ac_index
>>
2
)
==
get_bits1
(
&
gb
);
fc_indexes
=
get_bits
(
&
gb
,
format
->
fc_indexes_bits
);
pulses_signs
=
get_bits
(
&
gb
,
format
->
fc_signs_bits
);
gc_1st_index
=
get_bits
(
&
gb
,
format
->
gc_1st_index_bits
);
gc_2nd_index
=
get_bits
(
&
gb
,
format
->
gc_2nd_index_bits
);
if
(
frame_erasure
)
{
pitch_delay_3x
=
3
*
ctx
->
pitch_delay_int_prev
;
}
else
if
(
!
i
)
{
if
(
bad_pitch
)
{
pitch_delay_3x
=
3
*
ctx
->
pitch_delay_int_prev
;
}
else
{
pitch_delay_3x
=
ff_acelp_decode_8bit_to_1st_delay3
(
ac_index
);
}
}
else
{
int
pitch_delay_min
=
av_clip
(
ctx
->
pitch_delay_int_prev
-
5
,
PITCH_DELAY_MIN
,
PITCH_DELAY_MAX
-
9
);
if
(
packet_type
==
FORMAT_G729D_6K4
)
{
pitch_delay_3x
=
ff_acelp_decode_4bit_to_2nd_delay3
(
ac_index
,
pitch_delay_min
);
}
else
{
pitch_delay_3x
=
ff_acelp_decode_5_6_bit_to_2nd_delay3
(
ac_index
,
pitch_delay_min
);
}
}
memset
(
fc
,
0
,
sizeof
(
int16_t
)
*
SUBFRAME_SIZE
);
switch
(
packet_type
)
{
case
FORMAT_G729_8K
:
ff_acelp_fc_pulse_per_track
(
fc
,
ff_fc_4pulses_8bits_tracks_13
,
ff_fc_4pulses_8bits_track_4
,
fc_indexes
,
pulses_signs
,
3
,
3
);
break
;
case
FORMAT_G729D_6K4
:
ff_acelp_fc_pulse_per_track
(
fc
,
ff_fc_2pulses_9bits_track1_gray
,
ff_fc_2pulses_9bits_track2_gray
,
fc_indexes
,
pulses_signs
,
1
,
4
);
break
;
}
/*
This filter enhances harmonic components of the fixed-codebook vector to
improve the quality of the reconstructed speech.
/* Round pitch delay to nearest (used everywhere except ff_acelp_interpolate). */
pitch_delay_int
[
i
]
=
(
pitch_delay_3x
+
1
)
/
3
;
if
(
pitch_delay_int
[
i
]
>
PITCH_DELAY_MAX
)
{
av_log
(
avctx
,
AV_LOG_WARNING
,
"pitch_delay_int %d is too large
\n
"
,
pitch_delay_int
[
i
]);
pitch_delay_int
[
i
]
=
PITCH_DELAY_MAX
;
}
/ fc_v[i], i < pitch_delay
fc_v[i] = <
\ fc_v[i] + gain_pitch * fc_v[i-pitch_delay], i >= pitch_delay
*/
ff_acelp_weighted_vector_sum
(
fc
+
pitch_delay_int
[
i
],
fc
+
pitch_delay_int
[
i
],
fc
,
1
<<
14
,
av_clip
(
ctx
->
past_gain_pitch
[
0
],
SHARP_MIN
,
SHARP_MAX
),
0
,
14
,
SUBFRAME_SIZE
-
pitch_delay_int
[
i
]);
if
(
frame_erasure
)
{
ctx
->
rand_value
=
g729_prng
(
ctx
->
rand_value
);
fc_indexes
=
av_mod_uintp2
(
ctx
->
rand_value
,
format
->
fc_indexes_bits
);
memmove
(
ctx
->
past_gain_pitch
+
1
,
ctx
->
past_gain_pitch
,
5
*
sizeof
(
int16_t
));
ctx
->
past_gain_code
[
1
]
=
ctx
->
past_gain_code
[
0
];
ctx
->
rand_value
=
g729_prng
(
ctx
->
rand_value
);
pulses_signs
=
ctx
->
rand_value
;
}
if
(
frame_erasure
)
{
ctx
->
past_gain_pitch
[
0
]
=
(
29491
*
ctx
->
past_gain_pitch
[
0
])
>>
15
;
// 0.90 (0.15)
ctx
->
past_gain_code
[
0
]
=
(
2007
*
ctx
->
past_gain_code
[
0
]
)
>>
11
;
// 0.98 (0.11)
gain_corr_factor
=
0
;
}
else
{
if
(
packet_type
==
FORMAT_G729D_6K4
)
{
ctx
->
past_gain_pitch
[
0
]
=
cb_gain_1st_6k4
[
gc_1st_index
][
0
]
+
cb_gain_2nd_6k4
[
gc_2nd_index
][
0
];
gain_corr_factor
=
cb_gain_1st_6k4
[
gc_1st_index
][
1
]
+
cb_gain_2nd_6k4
[
gc_2nd_index
][
1
];
/* Without check below overflow can occur in ff_acelp_update_past_gain.
It is not issue for G.729, because gain_corr_factor in it's case is always
greater than 1024, while in G.729D it can be even zero. */
gain_corr_factor
=
FFMAX
(
gain_corr_factor
,
1024
);
#ifndef G729_BITEXACT
gain_corr_factor
>>=
1
;
#endif
}
else
{
ctx
->
past_gain_pitch
[
0
]
=
cb_gain_1st_8k
[
gc_1st_index
][
0
]
+
cb_gain_2nd_8k
[
gc_2nd_index
][
0
];
gain_corr_factor
=
cb_gain_1st_8k
[
gc_1st_index
][
1
]
+
cb_gain_2nd_8k
[
gc_2nd_index
][
1
];
memset
(
fc
,
0
,
sizeof
(
int16_t
)
*
SUBFRAME_SIZE
);
switch
(
packet_type
)
{
case
FORMAT_G729_8K
:
ff_acelp_fc_pulse_per_track
(
fc
,
ff_fc_4pulses_8bits_tracks_13
,
ff_fc_4pulses_8bits_track_4
,
fc_indexes
,
pulses_signs
,
3
,
3
);
break
;
case
FORMAT_G729D_6K4
:
ff_acelp_fc_pulse_per_track
(
fc
,
ff_fc_2pulses_9bits_track1_gray
,
ff_fc_2pulses_9bits_track2_gray
,
fc_indexes
,
pulses_signs
,
1
,
4
);
break
;
}
/* Decode the fixed-codebook gain. */
ctx
->
past_gain_code
[
0
]
=
ff_acelp_decode_gain_code
(
&
s
->
adsp
,
gain_corr_factor
,
fc
,
MR_ENERGY
,
ctx
->
quant_energy
,
ma_prediction_coeff
,
SUBFRAME_SIZE
,
4
);
#ifdef G729_BITEXACT
/*
This correction required to get bit-exact result with
reference code, because gain_corr_factor in G.729D is
two times larger than in original G.729.
This filter enhances harmonic components of the fixed-codebook vector to
improve the quality of the reconstructed speech.
If bit-exact result is not issue then gain_corr_factor
can be simpler divided by 2 before call to g729_get_gain_code
instead of using correction below.
/ fc_v[i], i < pitch_delay
fc_v[i] = <
\ fc_v[i] + gain_pitch * fc_v[i-pitch_delay], i >= pitch_delay
*/
if
(
packet_type
==
FORMAT_G729D_6K4
)
{
gain_corr_factor
>>=
1
;
ctx
->
past_gain_code
[
0
]
>>=
1
;
ff_acelp_weighted_vector_sum
(
fc
+
pitch_delay_int
[
i
],
fc
+
pitch_delay_int
[
i
],
fc
,
1
<<
14
,
av_clip
(
ctx
->
past_gain_pitch
[
0
],
SHARP_MIN
,
SHARP_MAX
),
0
,
14
,
SUBFRAME_SIZE
-
pitch_delay_int
[
i
]);
memmove
(
ctx
->
past_gain_pitch
+
1
,
ctx
->
past_gain_pitch
,
5
*
sizeof
(
int16_t
));
ctx
->
past_gain_code
[
1
]
=
ctx
->
past_gain_code
[
0
];
if
(
frame_erasure
)
{
ctx
->
past_gain_pitch
[
0
]
=
(
29491
*
ctx
->
past_gain_pitch
[
0
])
>>
15
;
// 0.90 (0.15)
ctx
->
past_gain_code
[
0
]
=
(
2007
*
ctx
->
past_gain_code
[
0
]
)
>>
11
;
// 0.98 (0.11)
gain_corr_factor
=
0
;
}
else
{
if
(
packet_type
==
FORMAT_G729D_6K4
)
{
ctx
->
past_gain_pitch
[
0
]
=
cb_gain_1st_6k4
[
gc_1st_index
][
0
]
+
cb_gain_2nd_6k4
[
gc_2nd_index
][
0
];
gain_corr_factor
=
cb_gain_1st_6k4
[
gc_1st_index
][
1
]
+
cb_gain_2nd_6k4
[
gc_2nd_index
][
1
];
/* Without check below overflow can occur in ff_acelp_update_past_gain.
It is not issue for G.729, because gain_corr_factor in it's case is always
greater than 1024, while in G.729D it can be even zero. */
gain_corr_factor
=
FFMAX
(
gain_corr_factor
,
1024
);
#ifndef G729_BITEXACT
gain_corr_factor
>>=
1
;
#endif
}
else
{
ctx
->
past_gain_pitch
[
0
]
=
cb_gain_1st_8k
[
gc_1st_index
][
0
]
+
cb_gain_2nd_8k
[
gc_2nd_index
][
0
];
gain_corr_factor
=
cb_gain_1st_8k
[
gc_1st_index
][
1
]
+
cb_gain_2nd_8k
[
gc_2nd_index
][
1
];
}
/* Decode the fixed-codebook gain. */
ctx
->
past_gain_code
[
0
]
=
ff_acelp_decode_gain_code
(
&
s
->
adsp
,
gain_corr_factor
,
fc
,
MR_ENERGY
,
ctx
->
quant_energy
,
ma_prediction_coeff
,
SUBFRAME_SIZE
,
4
);
#ifdef G729_BITEXACT
/*
This correction required to get bit-exact result with
reference code, because gain_corr_factor in G.729D is
two times larger than in original G.729.
If bit-exact result is not issue then gain_corr_factor
can be simpler divided by 2 before call to g729_get_gain_code
instead of using correction below.
*/
if
(
packet_type
==
FORMAT_G729D_6K4
)
{
gain_corr_factor
>>=
1
;
ctx
->
past_gain_code
[
0
]
>>=
1
;
}
#endif
}
#endif
}
ff_acelp_update_past_gain
(
ctx
->
quant_energy
,
gain_corr_factor
,
2
,
frame_erasure
);
/* Routine requires rounding to lowest. */
ff_acelp_interpolate
(
ctx
->
exc
+
i
*
SUBFRAME_SIZE
,
ctx
->
exc
+
i
*
SUBFRAME_SIZE
-
pitch_delay_3x
/
3
,
ff_acelp_interp_filter
,
6
,
(
pitch_delay_3x
%
3
)
<<
1
,
10
,
SUBFRAME_SIZE
);
ff_acelp_weighted_vector_sum
(
ctx
->
exc
+
i
*
SUBFRAME_SIZE
,
ctx
->
exc
+
i
*
SUBFRAME_SIZE
,
fc
,
(
!
ctx
->
was_periodic
&&
frame_erasure
)
?
0
:
ctx
->
past_gain_pitch
[
0
],
(
ctx
->
was_periodic
&&
frame_erasure
)
?
0
:
ctx
->
past_gain_code
[
0
],
1
<<
13
,
14
,
SUBFRAME_SIZE
);
memcpy
(
synth
,
ctx
->
syn_filter_data
,
10
*
sizeof
(
int16_t
));
if
(
ff_celp_lp_synthesis_filter
(
synth
+
10
,
&
lp
[
i
][
1
],
ctx
->
exc
+
i
*
SUBFRAME_SIZE
,
SUBFRAME_SIZE
,
10
,
1
,
0
,
0x800
))
/* Overflow occurred, downscale excitation signal... */
for
(
j
=
0
;
j
<
2
*
SUBFRAME_SIZE
+
PITCH_DELAY_MAX
+
INTERPOL_LEN
;
j
++
)
ctx
->
exc_base
[
j
]
>>=
2
;
/* ... and make synthesis again. */
if
(
packet_type
==
FORMAT_G729D_6K4
)
{
int16_t
exc_new
[
SUBFRAME_SIZE
];
ctx
->
onset
=
g729d_onset_decision
(
ctx
->
onset
,
ctx
->
past_gain_code
);
ctx
->
voice_decision
=
g729d_voice_decision
(
ctx
->
onset
,
ctx
->
voice_decision
,
ctx
->
past_gain_pitch
);
g729d_get_new_exc
(
exc_new
,
ctx
->
exc
+
i
*
SUBFRAME_SIZE
,
fc
,
ctx
->
voice_decision
,
ctx
->
past_gain_code
[
0
],
SUBFRAME_SIZE
);
ff_celp_lp_synthesis_filter
(
synth
+
10
,
&
lp
[
i
][
1
],
exc_new
,
SUBFRAME_SIZE
,
10
,
0
,
0
,
0x800
);
}
else
{
ff_celp_lp_synthesis_filter
(
synth
+
10
,
&
lp
[
i
][
1
],
ctx
->
exc
+
i
*
SUBFRAME_SIZE
,
SUBFRAME_SIZE
,
10
,
0
,
0
,
0x800
);
}
/* Save data (without postfilter) for use in next subframe. */
memcpy
(
ctx
->
syn_filter_data
,
synth
+
SUBFRAME_SIZE
,
10
*
sizeof
(
int16_t
));
/* Calculate gain of unfiltered signal for use in AGC. */
gain_before
=
0
;
for
(
j
=
0
;
j
<
SUBFRAME_SIZE
;
j
++
)
gain_before
+=
FFABS
(
synth
[
j
+
10
]);
/* Call postfilter and also update voicing decision for use in next frame. */
ff_g729_postfilter
(
&
s
->
adsp
,
&
ctx
->
ht_prev_data
,
&
is_periodic
,
&
lp
[
i
][
0
],
pitch_delay_int
[
0
],
ctx
->
residual
,
ctx
->
res_filter_data
,
ctx
->
pos_filter_data
,
synth
+
10
,
SUBFRAME_SIZE
);
ff_acelp_update_past_gain
(
ctx
->
quant_energy
,
gain_corr_factor
,
2
,
frame_erasure
);
/* Routine requires rounding to lowest. */
ff_acelp_interpolate
(
ctx
->
exc
+
i
*
SUBFRAME_SIZE
,
ctx
->
exc
+
i
*
SUBFRAME_SIZE
-
pitch_delay_3x
/
3
,
ff_acelp_interp_filter
,
6
,
(
pitch_delay_3x
%
3
)
<<
1
,
10
,
SUBFRAME_SIZE
);
/* Calculate gain of filtered signal for use in AGC. */
gain_after
=
0
;
for
(
j
=
0
;
j
<
SUBFRAME_SIZE
;
j
++
)
gain_after
+=
FFABS
(
synth
[
j
+
10
]);
ff_acelp_weighted_vector_sum
(
ctx
->
exc
+
i
*
SUBFRAME_SIZE
,
ctx
->
exc
+
i
*
SUBFRAME_SIZE
,
fc
,
(
!
ctx
->
was_periodic
&&
frame_erasure
)
?
0
:
ctx
->
past_gain_pitch
[
0
],
(
ctx
->
was_periodic
&&
frame_erasure
)
?
0
:
ctx
->
past_gain_code
[
0
],
1
<<
13
,
14
,
SUBFRAME_SIZE
);
ctx
->
gain_coeff
=
ff_g729_adaptive_gain_control
(
gain_before
,
gain_after
,
memcpy
(
synth
,
ctx
->
syn_filter_data
,
10
*
sizeof
(
int16_t
));
if
(
ff_celp_lp_synthesis_filter
(
synth
+
10
,
&
lp
[
i
][
1
],
ctx
->
exc
+
i
*
SUBFRAME_SIZE
,
SUBFRAME_SIZE
,
ctx
->
gain_coeff
);
10
,
1
,
0
,
0x800
))
/* Overflow occurred, downscale excitation signal... */
for
(
j
=
0
;
j
<
2
*
SUBFRAME_SIZE
+
PITCH_DELAY_MAX
+
INTERPOL_LEN
;
j
++
)
ctx
->
exc_base
[
j
]
>>=
2
;
/* ... and make synthesis again. */
if
(
packet_type
==
FORMAT_G729D_6K4
)
{
int16_t
exc_new
[
SUBFRAME_SIZE
];
ctx
->
onset
=
g729d_onset_decision
(
ctx
->
onset
,
ctx
->
past_gain_code
);
ctx
->
voice_decision
=
g729d_voice_decision
(
ctx
->
onset
,
ctx
->
voice_decision
,
ctx
->
past_gain_pitch
);
g729d_get_new_exc
(
exc_new
,
ctx
->
exc
+
i
*
SUBFRAME_SIZE
,
fc
,
ctx
->
voice_decision
,
ctx
->
past_gain_code
[
0
],
SUBFRAME_SIZE
);
ff_celp_lp_synthesis_filter
(
synth
+
10
,
&
lp
[
i
][
1
],
exc_new
,
SUBFRAME_SIZE
,
10
,
0
,
0
,
0x800
);
}
else
{
ff_celp_lp_synthesis_filter
(
synth
+
10
,
&
lp
[
i
][
1
],
ctx
->
exc
+
i
*
SUBFRAME_SIZE
,
SUBFRAME_SIZE
,
10
,
0
,
0
,
0x800
);
}
/* Save data (without postfilter) for use in next subframe. */
memcpy
(
ctx
->
syn_filter_data
,
synth
+
SUBFRAME_SIZE
,
10
*
sizeof
(
int16_t
));
/* Calculate gain of unfiltered signal for use in AGC. */
gain_before
=
0
;
for
(
j
=
0
;
j
<
SUBFRAME_SIZE
;
j
++
)
gain_before
+=
FFABS
(
synth
[
j
+
10
]);
/* Call postfilter and also update voicing decision for use in next frame. */
ff_g729_postfilter
(
&
s
->
adsp
,
&
ctx
->
ht_prev_data
,
&
is_periodic
,
&
lp
[
i
][
0
],
pitch_delay_int
[
0
],
ctx
->
residual
,
ctx
->
res_filter_data
,
ctx
->
pos_filter_data
,
synth
+
10
,
SUBFRAME_SIZE
);
if
(
frame_erasure
)
ctx
->
pitch_delay_int_prev
=
FFMIN
(
ctx
->
pitch_delay_int_prev
+
1
,
PITCH_DELAY_MAX
)
;
else
ctx
->
pitch_delay_int_prev
=
pitch_delay_int
[
i
]
;
/* Calculate gain of filtered signal for use in AGC. */
gain_after
=
0
;
for
(
j
=
0
;
j
<
SUBFRAME_SIZE
;
j
++
)
gain_after
+=
FFABS
(
synth
[
j
+
10
])
;
memcpy
(
synth
+
8
,
ctx
->
hpf_z
,
2
*
sizeof
(
int16_t
));
ff_acelp_high_pass_filter
(
out_frame
+
i
*
SUBFRAME_SIZE
,
ctx
->
hpf_f
,
synth
+
10
,
SUBFRAME_SIZE
);
memcpy
(
ctx
->
hpf_z
,
synth
+
8
+
SUBFRAME_SIZE
,
2
*
sizeof
(
int16_t
));
}
ctx
->
gain_coeff
=
ff_g729_adaptive_gain_control
(
gain_before
,
gain_after
,
synth
+
10
,
SUBFRAME_SIZE
,
ctx
->
gain_coeff
);
if
(
frame_erasure
)
{
ctx
->
pitch_delay_int_prev
=
FFMIN
(
ctx
->
pitch_delay_int_prev
+
1
,
PITCH_DELAY_MAX
);
}
else
{
ctx
->
pitch_delay_int_prev
=
pitch_delay_int
[
i
];
}
memcpy
(
synth
+
8
,
ctx
->
hpf_z
,
2
*
sizeof
(
int16_t
));
ff_acelp_high_pass_filter
(
out_frame
+
i
*
SUBFRAME_SIZE
,
ctx
->
hpf_f
,
synth
+
10
,
SUBFRAME_SIZE
);
memcpy
(
ctx
->
hpf_z
,
synth
+
8
+
SUBFRAME_SIZE
,
2
*
sizeof
(
int16_t
));
}
ctx
->
was_periodic
=
is_periodic
;
ctx
->
was_periodic
=
is_periodic
;
/* Save signal for use in next frame. */
memmove
(
ctx
->
exc_base
,
ctx
->
exc_base
+
2
*
SUBFRAME_SIZE
,
(
PITCH_DELAY_MAX
+
INTERPOL_LEN
)
*
sizeof
(
int16_t
));
/* Save signal for use in next frame. */
memmove
(
ctx
->
exc_base
,
ctx
->
exc_base
+
2
*
SUBFRAME_SIZE
,
(
PITCH_DELAY_MAX
+
INTERPOL_LEN
)
*
sizeof
(
int16_t
));
buf
+=
packet_type
==
FORMAT_G729_8K
?
G729_8K_BLOCK_SIZE
:
G729D_6K4_BLOCK_SIZE
;
ctx
++
;
buf
+=
packet_type
==
FORMAT_G729_8K
?
G729_8K_BLOCK_SIZE
:
G729D_6K4_BLOCK_SIZE
;
ctx
++
;
}
*
got_frame_ptr
=
1
;
...
...
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