Commit 571d2ffa authored by Michael Niedermayer's avatar Michael Niedermayer

Merge commit '617a1a98'

* commit '617a1a98':
  mp3enc: Properly write bitrate value in XING header

Conflicts:
	libavformat/mp3enc.c

See: 40176fc3
See: d62bf5d4
See: various others
Merged-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parents 4f698be8 617a1a98
...@@ -116,14 +116,15 @@ static int mp3_write_xing(AVFormatContext *s) ...@@ -116,14 +116,15 @@ static int mp3_write_xing(AVFormatContext *s)
{ {
MP3Context *mp3 = s->priv_data; MP3Context *mp3 = s->priv_data;
AVCodecContext *codec = s->streams[mp3->audio_stream_idx]->codec; AVCodecContext *codec = s->streams[mp3->audio_stream_idx]->codec;
int32_t header;
MPADecodeHeader mpah;
int srate_idx, i, channels;
int bitrate_idx; int bitrate_idx;
int best_bitrate_idx = -1; int best_bitrate_idx = -1;
int best_bitrate_error= INT_MAX; int best_bitrate_error = INT_MAX;
int xing_offset; int xing_offset;
int32_t header, mask; int ver = 0;
MPADecodeHeader c; int bytes_needed, lsf;
int srate_idx, ver = 0, i, channels;
int needed;
const char *vendor = (codec->flags & CODEC_FLAG_BITEXACT) ? "Lavf" : LIBAVFORMAT_IDENT; const char *vendor = (codec->flags & CODEC_FLAG_BITEXACT) ? "Lavf" : LIBAVFORMAT_IDENT;
if (!s->pb->seekable || !mp3->write_xing) if (!s->pb->seekable || !mp3->write_xing)
...@@ -159,25 +160,26 @@ static int mp3_write_xing(AVFormatContext *s) ...@@ -159,25 +160,26 @@ static int mp3_write_xing(AVFormatContext *s)
header |= (srate_idx << 2) << 8; header |= (srate_idx << 2) << 8;
header |= channels << 6; header |= channels << 6;
for (bitrate_idx=1; bitrate_idx<15; bitrate_idx++) { for (bitrate_idx = 1; bitrate_idx < 15; bitrate_idx++) {
int error; int bit_rate = 1000 * avpriv_mpa_bitrate_tab[lsf][3 - 1][bitrate_idx];
avpriv_mpegaudio_decode_header(&c, header | (bitrate_idx << (4+8))); int error = FFABS(bit_rate - codec->bit_rate);
error= FFABS(c.bit_rate - codec->bit_rate);
if(error < best_bitrate_error){ if (error < best_bitrate_error) {
best_bitrate_error= error; best_bitrate_error = error;
best_bitrate_idx = bitrate_idx; best_bitrate_idx = bitrate_idx;
} }
} }
av_assert0(best_bitrate_idx >= 0); av_assert0(best_bitrate_idx >= 0);
for (bitrate_idx= best_bitrate_idx;; bitrate_idx++) { for (bitrate_idx = best_bitrate_idx; ; bitrate_idx++) {
int32_t mask = bitrate_idx << (4 + 8);
if (15 == bitrate_idx) if (15 == bitrate_idx)
return -1; return -1;
mask = bitrate_idx << (4+8);
header |= mask; header |= mask;
avpriv_mpegaudio_decode_header(&c, header);
xing_offset=xing_offtbl[c.lsf == 1][c.nb_channels == 1]; avpriv_mpegaudio_decode_header(&mpah, header);
needed = 4 // header xing_offset=xing_offtbl[mpah.lsf == 1][mpah.nb_channels == 1];
bytes_needed = 4 // header
+ xing_offset + xing_offset
+ 4 // xing tag + 4 // xing tag
+ 4 // frames/size/toc flags + 4 // frames/size/toc flags
...@@ -187,8 +189,9 @@ static int mp3_write_xing(AVFormatContext *s) ...@@ -187,8 +189,9 @@ static int mp3_write_xing(AVFormatContext *s)
+ 24 + 24
; ;
if (needed <= c.frame_size) if (bytes_needed <= mpah.frame_size)
break; break;
header &= ~mask; header &= ~mask;
} }
...@@ -199,7 +202,7 @@ static int mp3_write_xing(AVFormatContext *s) ...@@ -199,7 +202,7 @@ static int mp3_write_xing(AVFormatContext *s)
ffio_wfourcc(s->pb, "Xing"); ffio_wfourcc(s->pb, "Xing");
avio_wb32(s->pb, 0x01 | 0x02 | 0x04); // frames / size / TOC avio_wb32(s->pb, 0x01 | 0x02 | 0x04); // frames / size / TOC
mp3->size = c.frame_size; mp3->size = mpah.frame_size;
mp3->want=1; mp3->want=1;
mp3->seen=0; mp3->seen=0;
mp3->pos=0; mp3->pos=0;
...@@ -217,7 +220,7 @@ static int mp3_write_xing(AVFormatContext *s) ...@@ -217,7 +220,7 @@ static int mp3_write_xing(AVFormatContext *s)
avio_w8(s->pb, 0); avio_w8(s->pb, 0);
avio_wb24(s->pb, FFMAX(codec->delay - 528 - 1, 0)<<12); avio_wb24(s->pb, FFMAX(codec->delay - 528 - 1, 0)<<12);
ffio_fill(s->pb, 0, c.frame_size - needed); ffio_fill(s->pb, 0, mpah.frame_size - bytes_needed);
return 0; return 0;
} }
...@@ -257,7 +260,7 @@ static int mp3_write_audio_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -257,7 +260,7 @@ static int mp3_write_audio_packet(AVFormatContext *s, AVPacket *pkt)
MP3Context *mp3 = s->priv_data; MP3Context *mp3 = s->priv_data;
if (pkt->data && pkt->size >= 4) { if (pkt->data && pkt->size >= 4) {
MPADecodeHeader c; MPADecodeHeader mpah;
int av_unused base; int av_unused base;
uint32_t head = AV_RB32(pkt->data); uint32_t head = AV_RB32(pkt->data);
...@@ -266,16 +269,16 @@ static int mp3_write_audio_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -266,16 +269,16 @@ static int mp3_write_audio_packet(AVFormatContext *s, AVPacket *pkt)
"is invalid, writing it anyway.\n", pkt->size, head); "is invalid, writing it anyway.\n", pkt->size, head);
return ff_raw_write_packet(s, pkt); return ff_raw_write_packet(s, pkt);
} }
avpriv_mpegaudio_decode_header(&c, head); avpriv_mpegaudio_decode_header(&mpah, head);
if (!mp3->initial_bitrate) if (!mp3->initial_bitrate)
mp3->initial_bitrate = c.bit_rate; mp3->initial_bitrate = mpah.bit_rate;
if ((c.bit_rate == 0) || (mp3->initial_bitrate != c.bit_rate)) if ((mpah.bit_rate == 0) || (mp3->initial_bitrate != mpah.bit_rate))
mp3->has_variable_bitrate = 1; mp3->has_variable_bitrate = 1;
#ifdef FILTER_VBR_HEADERS #ifdef FILTER_VBR_HEADERS
/* filter out XING and INFO headers. */ /* filter out XING and INFO headers. */
base = 4 + xing_offtbl[c.lsf == 1][c.nb_channels == 1]; base = 4 + xing_offtbl[mpah.lsf == 1][mpah.nb_channels == 1];
if (base + 4 <= pkt->size) { if (base + 4 <= pkt->size) {
uint32_t v = AV_RB32(pkt->data + base); uint32_t v = AV_RB32(pkt->data + base);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment