Split setting of bandwidth into a separate function.

Originally committed as revision 25984 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Justin Ruggles 2010-12-14 14:52:40 +00:00
parent e35c984a5d
commit 282255bbd2
1 changed files with 34 additions and 20 deletions

View File

@ -1294,13 +1294,45 @@ static av_cold int validate_options(AVCodecContext *avctx, AC3EncodeContext *s)
}
/**
* Set bandwidth for all channels.
* 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)
{
int ch, bw_code;
if (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;
bw_code = av_clip((fbw_coeffs - 73) / 3, 0, 60);
} else {
/* use default bandwidth setting */
/* XXX: should compute the bandwidth according to the frame
size, so that we avoid annoying high frequency artifacts */
bw_code = 50;
}
/* set number of coefficients for each channel */
for (ch = 0; ch < s->fbw_channels; ch++) {
s->bandwidth_code[ch] = bw_code;
s->nb_coefs[ch] = bw_code * 3 + 73;
}
if (s->lfe_on)
s->nb_coefs[s->lfe_channel] = 7; /* LFE channel always has 7 coefs */
}
/**
* Initialize the encoder.
*/
static av_cold int ac3_encode_init(AVCodecContext *avctx)
{
AC3EncodeContext *s = avctx->priv_data;
int ch, bw_code, ret;
int ret;
avctx->frame_size = AC3_FRAME_SIZE;
@ -1318,25 +1350,7 @@ static av_cold int ac3_encode_init(AVCodecContext *avctx)
s->samples_written = 0;
s->frame_size = s->frame_size_min;
/* set bandwidth */
if (avctx->cutoff) {
/* calculate bandwidth based on user-specified cutoff frequency */
int cutoff = av_clip(avctx->cutoff, 1, s->sample_rate >> 1);
int fbw_coeffs = cutoff * 2 * AC3_MAX_COEFS / s->sample_rate;
bw_code = av_clip((fbw_coeffs - 73) / 3, 0, 60);
} else {
/* use default bandwidth setting */
/* XXX: should compute the bandwidth according to the frame
size, so that we avoid annoying high frequency artifacts */
bw_code = 50;
}
for (ch = 0; ch < s->fbw_channels; ch++) {
/* bandwidth for each channel */
s->bandwidth_code[ch] = bw_code;
s->nb_coefs[ch] = bw_code * 3 + 73;
}
if (s->lfe_on)
s->nb_coefs[s->lfe_channel] = 7; /* LFE channel always has 7 coefs */
set_bandwidth(s, avctx->cutoff);
/* initial snr offset */
s->coarse_snr_offset = 40;