Check user-specified cutoff frequency in validate_options().

Originally committed as revision 26049 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Justin Ruggles 2010-12-17 23:42:52 +00:00
parent 78646ac206
commit e62ef8f2db
1 changed files with 14 additions and 5 deletions

View File

@ -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);