Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.xiph.org/xiph/opus.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/opus_decoder.c30
-rw-r--r--src/opus_demo.c2
-rw-r--r--src/opus_encoder.c80
-rw-r--r--src/opus_multistream_decoder.c5
-rw-r--r--src/opus_multistream_encoder.c6
5 files changed, 63 insertions, 60 deletions
diff --git a/src/opus_decoder.c b/src/opus_decoder.c
index 6bc70919..13a910f4 100644
--- a/src/opus_decoder.c
+++ b/src/opus_decoder.c
@@ -937,12 +937,14 @@ int opus_decoder_ctl(OpusDecoder *st, int request, ...)
case OPUS_GET_BANDWIDTH_REQUEST:
{
opus_int32 *value = va_arg(ap, opus_int32*);
+ if (!value) goto bad_arg;
*value = st->bandwidth;
}
break;
case OPUS_GET_FINAL_RANGE_REQUEST:
{
opus_uint32 *value = va_arg(ap, opus_uint32*);
+ if (!value) goto bad_arg;
*value = st->rangeFinal;
}
break;
@@ -961,22 +963,14 @@ int opus_decoder_ctl(OpusDecoder *st, int request, ...)
case OPUS_GET_SAMPLE_RATE_REQUEST:
{
opus_int32 *value = va_arg(ap, opus_int32*);
- if (value==NULL)
- {
- ret = OPUS_BAD_ARG;
- break;
- }
+ if (!value) goto bad_arg;
*value = st->Fs;
}
break;
case OPUS_GET_PITCH_REQUEST:
{
opus_int32 *value = va_arg(ap, opus_int32*);
- if (value==NULL)
- {
- ret = OPUS_BAD_ARG;
- break;
- }
+ if (!value) goto bad_arg;
if (st->prev_mode == MODE_CELT_ONLY)
celt_decoder_ctl(celt_dec, OPUS_GET_PITCH(value));
else
@@ -986,28 +980,21 @@ int opus_decoder_ctl(OpusDecoder *st, int request, ...)
case OPUS_GET_GAIN_REQUEST:
{
opus_int32 *value = va_arg(ap, opus_int32*);
- if (value==NULL)
- {
- ret = OPUS_BAD_ARG;
- break;
- }
+ if (!value) goto bad_arg;
*value = st->decode_gain;
}
break;
case OPUS_SET_GAIN_REQUEST:
{
opus_int32 value = va_arg(ap, opus_int32);
- if (value<-32768 || value>32767)
- {
- ret = OPUS_BAD_ARG;
- break;
- }
+ if (value<-32768 || value>32767) goto bad_arg;
st->decode_gain = value;
}
break;
case OPUS_GET_LAST_PACKET_DURATION_REQUEST:
{
opus_uint32 *value = va_arg(ap, opus_uint32*);
+ if (!value) goto bad_arg;
*value = st->last_packet_duration;
}
break;
@@ -1019,6 +1006,9 @@ int opus_decoder_ctl(OpusDecoder *st, int request, ...)
va_end(ap);
return ret;
+bad_arg:
+ va_end(ap);
+ return OPUS_BAD_ARG;
}
void opus_decoder_destroy(OpusDecoder *st)
diff --git a/src/opus_demo.c b/src/opus_demo.c
index 3709c3af..9771ed8b 100644
--- a/src/opus_demo.c
+++ b/src/opus_demo.c
@@ -272,7 +272,7 @@ int main(int argc, char *argv[])
int curr_mode=0;
int curr_mode_count=0;
int mode_switch_time = 48000;
- int nb_encoded;
+ int nb_encoded=0;
int remaining=0;
int variable_duration=OPUS_FRAMESIZE_ARG;
int delayed_decision=0;
diff --git a/src/opus_encoder.c b/src/opus_encoder.c
index cce7f279..c361d0b1 100644
--- a/src/opus_encoder.c
+++ b/src/opus_encoder.c
@@ -1966,6 +1966,7 @@ int opus_encoder_ctl(OpusEncoder *st, int request, ...)
case OPUS_GET_APPLICATION_REQUEST:
{
opus_int32 *value = va_arg(ap, opus_int32*);
+ if (!value) goto bad_arg;
*value = st->application;
}
break;
@@ -1987,28 +1988,28 @@ int opus_encoder_ctl(OpusEncoder *st, int request, ...)
case OPUS_GET_BITRATE_REQUEST:
{
opus_int32 *value = va_arg(ap, opus_int32*);
+ if (!value) goto bad_arg;
*value = user_bitrate_to_bitrate(st, st->prev_framesize, 1276);
}
break;
case OPUS_SET_FORCE_CHANNELS_REQUEST:
{
opus_int32 value = va_arg(ap, opus_int32);
- if((value<1 || value>st->channels) && value != OPUS_AUTO)
- return OPUS_BAD_ARG;
+ if((value<1 || value>st->channels) && value != OPUS_AUTO) goto bad_arg;
st->force_channels = value;
}
break;
case OPUS_GET_FORCE_CHANNELS_REQUEST:
{
opus_int32 *value = va_arg(ap, opus_int32*);
+ if (!value) goto bad_arg;
*value = st->force_channels;
}
break;
case OPUS_SET_MAX_BANDWIDTH_REQUEST:
{
opus_int32 value = va_arg(ap, opus_int32);
- if (value < OPUS_BANDWIDTH_NARROWBAND || value > OPUS_BANDWIDTH_FULLBAND)
- return OPUS_BAD_ARG;
+ if (value < OPUS_BANDWIDTH_NARROWBAND || value > OPUS_BANDWIDTH_FULLBAND) goto bad_arg;
st->max_bandwidth = value;
if (st->max_bandwidth == OPUS_BANDWIDTH_NARROWBAND) {
st->silk_mode.maxInternalSampleRate = 8000;
@@ -2022,14 +2023,14 @@ int opus_encoder_ctl(OpusEncoder *st, int request, ...)
case OPUS_GET_MAX_BANDWIDTH_REQUEST:
{
opus_int32 *value = va_arg(ap, opus_int32*);
+ if (!value) goto bad_arg;
*value = st->max_bandwidth;
}
break;
case OPUS_SET_BANDWIDTH_REQUEST:
{
opus_int32 value = va_arg(ap, opus_int32);
- if ((value < OPUS_BANDWIDTH_NARROWBAND || value > OPUS_BANDWIDTH_FULLBAND) && value != OPUS_AUTO)
- return OPUS_BAD_ARG;
+ if ((value < OPUS_BANDWIDTH_NARROWBAND || value > OPUS_BANDWIDTH_FULLBAND) && value != OPUS_AUTO) goto bad_arg;
st->user_bandwidth = value;
if (st->user_bandwidth == OPUS_BANDWIDTH_NARROWBAND) {
st->silk_mode.maxInternalSampleRate = 8000;
@@ -2043,28 +2044,28 @@ int opus_encoder_ctl(OpusEncoder *st, int request, ...)
case OPUS_GET_BANDWIDTH_REQUEST:
{
opus_int32 *value = va_arg(ap, opus_int32*);
+ if (!value) goto bad_arg;
*value = st->bandwidth;
}
break;
case OPUS_SET_DTX_REQUEST:
{
opus_int32 value = va_arg(ap, opus_int32);
- if(value<0 || value>1)
- return OPUS_BAD_ARG;
+ if(value<0 || value>1) goto bad_arg;
st->silk_mode.useDTX = value;
}
break;
case OPUS_GET_DTX_REQUEST:
{
opus_int32 *value = va_arg(ap, opus_int32*);
+ if (!value) goto bad_arg;
*value = st->silk_mode.useDTX;
}
break;
case OPUS_SET_COMPLEXITY_REQUEST:
{
opus_int32 value = va_arg(ap, opus_int32);
- if(value<0 || value>10)
- return OPUS_BAD_ARG;
+ if(value<0 || value>10) goto bad_arg;
st->silk_mode.complexity = value;
celt_encoder_ctl(celt_enc, OPUS_SET_COMPLEXITY(value));
}
@@ -2072,28 +2073,28 @@ int opus_encoder_ctl(OpusEncoder *st, int request, ...)
case OPUS_GET_COMPLEXITY_REQUEST:
{
opus_int32 *value = va_arg(ap, opus_int32*);
+ if (!value) goto bad_arg;
*value = st->silk_mode.complexity;
}
break;
case OPUS_SET_INBAND_FEC_REQUEST:
{
opus_int32 value = va_arg(ap, opus_int32);
- if(value<0 || value>1)
- return OPUS_BAD_ARG;
+ if(value<0 || value>1) goto bad_arg;
st->silk_mode.useInBandFEC = value;
}
break;
case OPUS_GET_INBAND_FEC_REQUEST:
{
opus_int32 *value = va_arg(ap, opus_int32*);
+ if (!value) goto bad_arg;
*value = st->silk_mode.useInBandFEC;
}
break;
case OPUS_SET_PACKET_LOSS_PERC_REQUEST:
{
opus_int32 value = va_arg(ap, opus_int32);
- if (value < 0 || value > 100)
- return OPUS_BAD_ARG;
+ if (value < 0 || value > 100) goto bad_arg;
st->silk_mode.packetLossPercentage = value;
celt_encoder_ctl(celt_enc, OPUS_SET_PACKET_LOSS_PERC(value));
}
@@ -2101,14 +2102,14 @@ int opus_encoder_ctl(OpusEncoder *st, int request, ...)
case OPUS_GET_PACKET_LOSS_PERC_REQUEST:
{
opus_int32 *value = va_arg(ap, opus_int32*);
+ if (!value) goto bad_arg;
*value = st->silk_mode.packetLossPercentage;
}
break;
case OPUS_SET_VBR_REQUEST:
{
opus_int32 value = va_arg(ap, opus_int32);
- if(value<0 || value>1)
- return OPUS_BAD_ARG;
+ if(value<0 || value>1) goto bad_arg;
st->use_vbr = value;
st->silk_mode.useCBR = 1-value;
}
@@ -2116,54 +2117,56 @@ int opus_encoder_ctl(OpusEncoder *st, int request, ...)
case OPUS_GET_VBR_REQUEST:
{
opus_int32 *value = va_arg(ap, opus_int32*);
+ if (!value) goto bad_arg;
*value = st->use_vbr;
}
break;
case OPUS_SET_VOICE_RATIO_REQUEST:
{
opus_int32 value = va_arg(ap, opus_int32);
- if (value>100 || value<-1)
- goto bad_arg;
+ if (value<-1 || value>100) goto bad_arg;
st->voice_ratio = value;
}
break;
case OPUS_GET_VOICE_RATIO_REQUEST:
{
opus_int32 *value = va_arg(ap, opus_int32*);
+ if (!value) goto bad_arg;
*value = st->voice_ratio;
}
break;
case OPUS_SET_VBR_CONSTRAINT_REQUEST:
{
opus_int32 value = va_arg(ap, opus_int32);
- if(value<0 || value>1)
- return OPUS_BAD_ARG;
+ if(value<0 || value>1) goto bad_arg;
st->vbr_constraint = value;
}
break;
case OPUS_GET_VBR_CONSTRAINT_REQUEST:
{
opus_int32 *value = va_arg(ap, opus_int32*);
+ if (!value) goto bad_arg;
*value = st->vbr_constraint;
}
break;
case OPUS_SET_SIGNAL_REQUEST:
{
opus_int32 value = va_arg(ap, opus_int32);
- if(value!=OPUS_AUTO && value!=OPUS_SIGNAL_VOICE && value!=OPUS_SIGNAL_MUSIC)
- return OPUS_BAD_ARG;
+ if(value!=OPUS_AUTO && value!=OPUS_SIGNAL_VOICE && value!=OPUS_SIGNAL_MUSIC) goto bad_arg;
st->signal_type = value;
}
break;
case OPUS_GET_SIGNAL_REQUEST:
{
opus_int32 *value = va_arg(ap, opus_int32*);
+ if (!value) goto bad_arg;
*value = st->signal_type;
}
break;
case OPUS_GET_LOOKAHEAD_REQUEST:
{
opus_int32 *value = va_arg(ap, opus_int32*);
+ if (!value) goto bad_arg;
*value = st->Fs/400;
if (st->application != OPUS_APPLICATION_RESTRICTED_LOWDELAY)
*value += st->delay_compensation;
@@ -2172,37 +2175,40 @@ int opus_encoder_ctl(OpusEncoder *st, int request, ...)
case OPUS_GET_SAMPLE_RATE_REQUEST:
{
opus_int32 *value = va_arg(ap, opus_int32*);
- if (value==NULL)
- {
- ret = OPUS_BAD_ARG;
- break;
- }
+ if (!value) goto bad_arg;
*value = st->Fs;
}
break;
case OPUS_GET_FINAL_RANGE_REQUEST:
{
opus_uint32 *value = va_arg(ap, opus_uint32*);
+ if (!value) goto bad_arg;
*value = st->rangeFinal;
}
break;
case OPUS_SET_LSB_DEPTH_REQUEST:
{
opus_int32 value = va_arg(ap, opus_int32);
- if (value<8 || value>24)
- goto bad_arg;
+ if (value<8 || value>24) goto bad_arg;
st->lsb_depth=value;
}
break;
case OPUS_GET_LSB_DEPTH_REQUEST:
{
opus_int32 *value = va_arg(ap, opus_int32*);
+ if (!value) goto bad_arg;
*value = st->lsb_depth;
}
break;
case OPUS_SET_EXPERT_FRAME_DURATION_REQUEST:
{
opus_int32 value = va_arg(ap, opus_int32);
+ if (value != OPUS_FRAMESIZE_ARG && value != OPUS_FRAMESIZE_2_5_MS &&
+ value != OPUS_FRAMESIZE_5_MS && value != OPUS_FRAMESIZE_10_MS &&
+ value != OPUS_FRAMESIZE_20_MS && value != OPUS_FRAMESIZE_40_MS &&
+ value != OPUS_FRAMESIZE_60_MS && value != OPUS_FRAMESIZE_VARIABLE) {
+ goto bad_arg;
+ }
st->variable_duration = value;
celt_encoder_ctl(celt_enc, OPUS_SET_EXPERT_FRAME_DURATION(value));
}
@@ -2210,6 +2216,7 @@ int opus_encoder_ctl(OpusEncoder *st, int request, ...)
case OPUS_GET_EXPERT_FRAME_DURATION_REQUEST:
{
opus_int32 *value = va_arg(ap, opus_int32*);
+ if (!value) goto bad_arg;
*value = st->variable_duration;
}
break;
@@ -2237,8 +2244,7 @@ int opus_encoder_ctl(OpusEncoder *st, int request, ...)
case OPUS_SET_FORCE_MODE_REQUEST:
{
opus_int32 value = va_arg(ap, opus_int32);
- if ((value < MODE_SILK_ONLY || value > MODE_CELT_ONLY) && value != OPUS_AUTO)
- goto bad_arg;
+ if ((value < MODE_SILK_ONLY || value > MODE_CELT_ONLY) && value != OPUS_AUTO) goto bad_arg;
st->user_forced_mode = value;
}
break;
@@ -2246,29 +2252,29 @@ int opus_encoder_ctl(OpusEncoder *st, int request, ...)
{
opus_int32 value = va_arg(ap, opus_int32);
st->lfe = value;
- celt_encoder_ctl(celt_enc, OPUS_SET_LFE(value));
+ ret = celt_encoder_ctl(celt_enc, OPUS_SET_LFE(value));
}
break;
case OPUS_SET_ENERGY_SAVE_REQUEST:
{
opus_val16 *value = va_arg(ap, opus_val16*);
- celt_encoder_ctl(celt_enc, OPUS_SET_ENERGY_SAVE(value));
+ if (!value) goto bad_arg;
+ ret = celt_encoder_ctl(celt_enc, OPUS_SET_ENERGY_SAVE(value));
}
break;
case OPUS_SET_ENERGY_MASK_REQUEST:
{
opus_val16 *value = va_arg(ap, opus_val16*);
st->energy_masking = (value!=NULL);
- celt_encoder_ctl(celt_enc, OPUS_SET_ENERGY_MASK(value));
+ ret = celt_encoder_ctl(celt_enc, OPUS_SET_ENERGY_MASK(value));
}
break;
case CELT_GET_MODE_REQUEST:
{
const CELTMode ** value = va_arg(ap, const CELTMode**);
- if (value==0)
- goto bad_arg;
- celt_encoder_ctl(celt_enc, CELT_GET_MODE(value));
+ if (!value) goto bad_arg;
+ ret = celt_encoder_ctl(celt_enc, CELT_GET_MODE(value));
}
break;
default:
diff --git a/src/opus_multistream_decoder.c b/src/opus_multistream_decoder.c
index 495fb07e..51fe5edc 100644
--- a/src/opus_multistream_decoder.c
+++ b/src/opus_multistream_decoder.c
@@ -400,6 +400,7 @@ int opus_multistream_decoder_ctl(OpusMSDecoder *st, int request, ...)
int s;
opus_uint32 *value = va_arg(ap, opus_uint32*);
opus_uint32 tmp;
+ if (!value) goto bad_arg;
*value = 0;
for (s=0;s<st->layout.nb_streams;s++)
{
@@ -442,6 +443,7 @@ int opus_multistream_decoder_ctl(OpusMSDecoder *st, int request, ...)
if (stream_id<0 || stream_id >= st->layout.nb_streams)
ret = OPUS_BAD_ARG;
value = va_arg(ap, OpusDecoder**);
+ if (!value) goto bad_arg;
for (s=0;s<stream_id;s++)
{
if (s < st->layout.nb_coupled_streams)
@@ -479,6 +481,9 @@ int opus_multistream_decoder_ctl(OpusMSDecoder *st, int request, ...)
va_end(ap);
return ret;
+bad_arg:
+ va_end(ap);
+ return OPUS_BAD_ARG;
}
diff --git a/src/opus_multistream_encoder.c b/src/opus_multistream_encoder.c
index d9380ec3..30ece348 100644
--- a/src/opus_multistream_encoder.c
+++ b/src/opus_multistream_encoder.c
@@ -861,6 +861,7 @@ int opus_multistream_encoder_ctl(OpusMSEncoder *st, int request, ...)
{
int s;
opus_int32 *value = va_arg(ap, opus_int32*);
+ if (!value) goto bad_arg;
*value = 0;
for (s=0;s<st->layout.nb_streams;s++)
{
@@ -903,6 +904,7 @@ int opus_multistream_encoder_ctl(OpusMSEncoder *st, int request, ...)
int s;
opus_uint32 *value = va_arg(ap, opus_uint32*);
opus_uint32 tmp;
+ if (!value) goto bad_arg;
*value=0;
for (s=0;s<st->layout.nb_streams;s++)
{
@@ -958,6 +960,7 @@ int opus_multistream_encoder_ctl(OpusMSEncoder *st, int request, ...)
if (stream_id<0 || stream_id >= st->layout.nb_streams)
ret = OPUS_BAD_ARG;
value = va_arg(ap, OpusEncoder**);
+ if (!value) goto bad_arg;
for (s=0;s<stream_id;s++)
{
if (s < st->layout.nb_coupled_streams)
@@ -977,6 +980,7 @@ int opus_multistream_encoder_ctl(OpusMSEncoder *st, int request, ...)
case OPUS_GET_EXPERT_FRAME_DURATION_REQUEST:
{
opus_int32 *value = va_arg(ap, opus_int32*);
+ if (!value) goto bad_arg;
*value = st->variable_duration;
}
break;
@@ -996,5 +1000,3 @@ void opus_multistream_encoder_destroy(OpusMSEncoder *st)
{
opus_free(st);
}
-
-