diff options
author | Justin Ruggles <justin.ruggles@gmail.com> | 2012-02-22 21:26:09 -0500 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2012-02-29 14:36:00 -0500 |
commit | 6aeea1dfb2f21de959701ee7dfaab59b4634e570 (patch) | |
tree | e813420cb9bc6723180aaf7f8e30d2b73fc1c621 | |
parent | 78e9852a2e3b198ecd69ffa0deab3fa22a8e5378 (diff) | |
download | ffmpeg-6aeea1dfb2f21de959701ee7dfaab59b4634e570.tar.gz |
ac3enc: choose the closest bit rate to the one requested instead of failing
-rw-r--r-- | libavcodec/ac3enc.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/libavcodec/ac3enc.c b/libavcodec/ac3enc.c index c577c87dda..669be23a05 100644 --- a/libavcodec/ac3enc.c +++ b/libavcodec/ac3enc.c @@ -2189,15 +2189,20 @@ static av_cold int validate_options(AC3EncodeContext *s) wpf--; s->frame_size_min = 2 * wpf; } else { + int best_br = 0, best_code = 0, best_diff = INT_MAX; for (i = 0; i < 19; i++) { - if ((ff_ac3_bitrate_tab[i] >> s->bit_alloc.sr_shift)*1000 == avctx->bit_rate) + int br = (ff_ac3_bitrate_tab[i] >> s->bit_alloc.sr_shift) * 1000; + int diff = abs(br - avctx->bit_rate); + if (diff < best_diff) { + best_br = br; + best_code = i; + best_diff = diff; + } + if (!best_diff) break; } - if (i == 19) { - av_log(avctx, AV_LOG_ERROR, "invalid bit rate\n"); - return AVERROR(EINVAL); - } - s->frame_size_code = i << 1; + avctx->bit_rate = best_br; + s->frame_size_code = best_code << 1; s->frame_size_min = 2 * ff_ac3_frame_size_tab[s->frame_size_code][s->bit_alloc.sr_code]; s->num_blks_code = 0x3; s->num_blocks = 6; |