Remove large multistream stack buffers.
This avoids allocating any buffers on the stack that depend on the total channel count. Such buffers could easily exceed the size of the NONTHREADSAFE_PSEUDOSTACK. It also checks the frame_size argument in both the encoder and decoder to avoid allocating large stack buffers for opus_encode() calls that would fail anyway or opus_decode() calls that would never use all that space anyway.
This commit is contained in:
parent
84dd1cf9b7
commit
a40689e6ef
4 changed files with 230 additions and 80 deletions
|
@ -228,6 +228,8 @@ static int opus_decode_frame(OpusDecoder *st, const unsigned char *data,
|
|||
RESTORE_STACK;
|
||||
return OPUS_BUFFER_TOO_SMALL;
|
||||
}
|
||||
/* Limit frame_size to avoid excessive stack allocations. */
|
||||
frame_size = IMIN(frame_size, st->Fs/25*3);
|
||||
/* Payloads of 1 (2 including ToC) or 0 trigger the PLC/DTX */
|
||||
if (len<=1)
|
||||
{
|
||||
|
@ -856,6 +858,17 @@ int opus_decoder_ctl(OpusDecoder *st, int request, ...)
|
|||
st->frame_size = st->Fs/400;
|
||||
}
|
||||
break;
|
||||
case OPUS_GET_SAMPLE_RATE_REQUEST:
|
||||
{
|
||||
opus_int32 *value = va_arg(ap, opus_int32*);
|
||||
if (value==NULL)
|
||||
{
|
||||
ret = OPUS_BAD_ARG;
|
||||
break;
|
||||
}
|
||||
*value = st->Fs;
|
||||
}
|
||||
break;
|
||||
case OPUS_GET_PITCH_REQUEST:
|
||||
{
|
||||
opus_int32 *value = va_arg(ap, opus_int32*);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue