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:
authorGregory Maxwell <greg@xiph.org>2013-06-30 07:06:07 +0400
committerGregory Maxwell <greg@xiph.org>2013-06-30 07:06:07 +0400
commitdd7b0dac3ba85cda7e314eaa867b4f0d716c9ac4 (patch)
tree91fe0be58c357fc082d9323f3d99c387dc9fec1d /src
parent90a39039a46040faa944b4690c16452a088016e2 (diff)
Fixes some return without va_end in the api, adds tests.
Also makes the CTL bad argument handling more consistent to avoid mistakes like that in the future. Also updates the variable duration docs.
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);
}
-
-