X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fmp3enc.c;h=1200d0f2979b7abe784808bafdf12db3bfebb052;hb=7b2dba1c50c92c76f147727be7c27872252e29f6;hp=eab483f850e21fa5d9b1b58c3806ed27fdd29e09;hpb=afc0a24d7d60f855676d8069011624d52361d7ed;p=ffmpeg diff --git a/libavformat/mp3enc.c b/libavformat/mp3enc.c index eab483f850e..1200d0f2979 100644 --- a/libavformat/mp3enc.c +++ b/libavformat/mp3enc.c @@ -156,7 +156,9 @@ static int mp3_write_xing(AVFormatContext *s) { AVCodecContext *codec = s->streams[0]->codec; MP3Context *mp3 = s->priv_data; - int bitrate_idx = 3; + int bitrate_idx; + int best_bitrate_idx; + int best_bitrate_error= INT_MAX; int64_t xing_offset; int32_t mask, header; MPADecodeHeader c; @@ -185,13 +187,21 @@ static int mp3_write_xing(AVFormatContext *s) header |= (srate_idx << 2) << 8; header |= channels << 6; - for (;;) { + for (bitrate_idx=1; bitrate_idx<15; bitrate_idx++) { + int error; + avpriv_mpegaudio_decode_header(&c, header | (bitrate_idx << (4+8))); + error= FFABS(c.bit_rate - codec->bit_rate); + if(error < best_bitrate_error){ + best_bitrate_error= error; + best_bitrate_idx = bitrate_idx; + } + } + + for (bitrate_idx= best_bitrate_idx;; bitrate_idx++) { if (15 == bitrate_idx) return -1; - mask = (bitrate_idx << 4) << 8; - header |= mask; - avpriv_mpegaudio_decode_header(&c, header); + avpriv_mpegaudio_decode_header(&c, header | (bitrate_idx << (4+8))); xing_offset=xing_offtbl[c.lsf == 1][c.nb_channels == 1]; needed = 4 // header + xing_offset @@ -203,9 +213,6 @@ static int mp3_write_xing(AVFormatContext *s) if (needed <= c.frame_size) break; - - header &= ~mask; - ++bitrate_idx; } avio_wb32(s->pb, header);