Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Tim-Philipp Müller
Opus
Commits
1b16fec4
Commit
1b16fec4
authored
Mar 07, 2011
by
Jean-Marc Valin
Browse files
Fixes a few issues with PLC-based mode switching
parent
0c0c5f94
Changes
2
Hide whitespace changes
Inline
Side-by-side
src/opus_decoder.c
View file @
1b16fec4
...
...
@@ -152,7 +152,7 @@ int opus_decode(OpusDecoder *st, const unsigned char *data,
}
if
(
audiosize
>
frame_size
)
{
fprintf
(
stderr
,
"PCM buffer too small
"
);
fprintf
(
stderr
,
"PCM buffer too small
: %d vs %d (mode = %d)
\n
"
,
audiosize
,
frame_size
,
mode
);
return
-
1
;
}
else
{
frame_size
=
audiosize
;
...
...
@@ -302,14 +302,11 @@ int opus_decode(OpusDecoder *st, const unsigned char *data,
if
(
transition
)
{
int
plc_length
,
overlap
;
if
(
mode
==
MODE_CELT_ONLY
)
plc_length
=
IMIN
(
audiosize
,
10
+
st
->
Fs
/
200
);
else
plc_length
=
IMIN
(
audiosize
,
10
+
st
->
Fs
/
400
);
plc_length
=
IMIN
(
audiosize
,
10
+
st
->
Fs
/
400
);
for
(
i
=
0
;
i
<
plc_length
;
i
++
)
pcm
[
i
]
=
pcm_transition
[
i
];
overlap
=
IMIN
(
st
->
Fs
/
1
00
,
IMAX
(
0
,
audiosize
-
plc_length
));
overlap
=
IMIN
(
st
->
Fs
/
4
00
,
IMAX
(
0
,
audiosize
-
plc_length
));
smooth_fade
(
pcm_transition
+
plc_length
,
pcm
+
plc_length
,
pcm
+
plc_length
,
overlap
,
st
->
channels
);
}
#if OPUS_TEST_RANGE_CODER_STATE
...
...
src/opus_encoder.c
View file @
1b16fec4
...
...
@@ -124,8 +124,14 @@ int opus_encode(OpusEncoder *st, const short *pcm, int frame_size,
celt_to_silk
=
(
st
->
mode
!=
MODE_CELT_ONLY
);
if
(
!
celt_to_silk
)
{
st
->
mode
=
st
->
prev_mode
;
to_celt
=
1
;
/* Switch to SILK/hybrid if frame size is 10 ms or more*/
if
(
frame_size
>=
st
->
Fs
/
100
)
{
st
->
mode
=
st
->
prev_mode
;
to_celt
=
1
;
}
else
{
redundancy
=
0
;
}
}
}
...
...
@@ -230,12 +236,12 @@ int opus_encode(OpusEncoder *st, const short *pcm, int frame_size,
celt_encoder_ctl
(
st
->
celt_enc
,
CELT_SET_BITRATE
(
510000
));
if
(
st
->
prev_mode
==
MODE_SILK_ONLY
)
{
unsigned
char
dummy
[
2
];
unsigned
char
dummy
[
10
];
celt_encoder_ctl
(
st
->
celt_enc
,
CELT_RESET_STATE
);
celt_encoder_ctl
(
st
->
celt_enc
,
CELT_SET_START_BAND
(
0
));
celt_encoder_ctl
(
st
->
celt_enc
,
CELT_SET_PREDICTION
(
0
));
/* FIXME: This wastes CPU a bit compared to just prefilling the buffer */
celt_encode
(
st
->
celt_enc
,
&
st
->
delay_buffer
[(
st
->
encoder_buffer
-
st
->
delay_compensation
-
12
0
)
*
st
->
channels
],
12
0
,
dummy
,
10
);
celt_encode
(
st
->
celt_enc
,
&
st
->
delay_buffer
[(
st
->
encoder_buffer
-
st
->
delay_compensation
-
st
->
Fs
/
40
0
)
*
st
->
channels
],
st
->
Fs
/
40
0
,
dummy
,
10
);
}
else
{
celt_encoder_ctl
(
st
->
celt_enc
,
CELT_SET_PREDICTION
(
2
));
}
...
...
Write
Preview
Supports
Markdown
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