summaryrefslogtreecommitdiff
path: root/libavcodec
diff options
context:
space:
mode:
authorJustin Ruggles <justin.ruggles@gmail.com>2012-02-22 21:26:09 -0500
committerJustin Ruggles <justin.ruggles@gmail.com>2012-02-29 14:36:00 -0500
commit6aeea1dfb2f21de959701ee7dfaab59b4634e570 (patch)
treee813420cb9bc6723180aaf7f8e30d2b73fc1c621 /libavcodec
parent78e9852a2e3b198ecd69ffa0deab3fa22a8e5378 (diff)
downloadffmpeg-6aeea1dfb2f21de959701ee7dfaab59b4634e570.tar.gz
ac3enc: choose the closest bit rate to the one requested instead of failing
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/ac3enc.c17
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;