From e62ef8f2dbf1ac0a197310f2be69c93b89f838c2 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Fri, 17 Dec 2010 23:42:52 +0000 Subject: [PATCH] Check user-specified cutoff frequency in validate_options(). Originally committed as revision 26049 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/ac3enc.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/libavcodec/ac3enc.c b/libavcodec/ac3enc.c index 274e76be9d..b69ed8b26f 100644 --- a/libavcodec/ac3enc.c +++ b/libavcodec/ac3enc.c @@ -111,6 +111,7 @@ typedef struct AC3EncodeContext { int channel_mode; ///< channel mode (acmod) const uint8_t *channel_map; ///< channel map used to reorder channels + int cutoff; ///< user-specified cutoff frequency, in Hz int bandwidth_code[AC3_MAX_CHANNELS]; ///< bandwidth code (0 to 60) (chbwcod) int nb_coefs[AC3_MAX_CHANNELS]; @@ -1691,6 +1692,15 @@ static av_cold int validate_options(AVCodecContext *avctx, AC3EncodeContext *s) s->bit_rate = avctx->bit_rate; s->frame_size_code = i << 1; + /* validate cutoff */ + if (avctx->cutoff < 0) { + av_log(avctx, AV_LOG_ERROR, "invalid cutoff frequency\n"); + return AVERROR(EINVAL); + } + s->cutoff = avctx->cutoff; + if (s->cutoff > (s->sample_rate >> 1)) + s->cutoff = s->sample_rate >> 1; + return 0; } @@ -1700,15 +1710,14 @@ static av_cold int validate_options(AVCodecContext *avctx, AC3EncodeContext *s) * The user can optionally supply a cutoff frequency. Otherwise an appropriate * default value will be used. */ -static av_cold void set_bandwidth(AC3EncodeContext *s, int cutoff) +static av_cold void set_bandwidth(AC3EncodeContext *s) { int ch, bw_code; - if (cutoff) { + if (s->cutoff) { /* calculate bandwidth based on user-specified cutoff frequency */ int fbw_coeffs; - cutoff = av_clip(cutoff, 1, s->sample_rate >> 1); - fbw_coeffs = cutoff * 2 * AC3_MAX_COEFS / s->sample_rate; + fbw_coeffs = s->cutoff * 2 * AC3_MAX_COEFS / s->sample_rate; bw_code = av_clip((fbw_coeffs - 73) / 3, 0, 60); } else { /* use default bandwidth setting */ @@ -1818,7 +1827,7 @@ static av_cold int ac3_encode_init(AVCodecContext *avctx) s->samples_written = 0; s->frame_size = s->frame_size_min; - set_bandwidth(s, avctx->cutoff); + set_bandwidth(s); exponent_init(s);