Fixes the Xing tag identification string to be "Info" for MP3 files with
constant bitrate. The previous "Xing" caused some decoders to recognize the
file as VBR.
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
uint32_t seen;
uint32_t pos;
uint64_t bag[VBR_NUM_BAGS];
uint32_t seen;
uint32_t pos;
uint64_t bag[VBR_NUM_BAGS];
+ int initial_bitrate;
+ int has_variable_bitrate;
/* index of the audio stream */
int audio_stream_idx;
/* index of the audio stream */
int audio_stream_idx;
int i;
avio_flush(s->pb);
int i;
avio_flush(s->pb);
+
+ /* replace "Xing" identification string with "Info" for CBR files. */
+ if (!mp3->has_variable_bitrate) {
+ int64_t tag_offset = mp3->frames_offset
+ - 4 // frames/size/toc flags
+ - 4; // xing tag
+ avio_seek(s->pb, tag_offset, SEEK_SET);
+ avio_wb32(s->pb, MKBETAG('I', 'n', 'f', 'o'));
+ }
+
avio_seek(s->pb, mp3->frames_offset, SEEK_SET);
avio_wb32(s->pb, mp3->frames);
avio_wb32(s->pb, mp3->size);
avio_seek(s->pb, mp3->frames_offset, SEEK_SET);
avio_wb32(s->pb, mp3->frames);
avio_wb32(s->pb, mp3->size);
return ff_raw_write_packet(s, pkt);
else {
MP3Context *mp3 = s->priv_data;
return ff_raw_write_packet(s, pkt);
else {
MP3Context *mp3 = s->priv_data;
-#ifdef FILTER_VBR_HEADERS
+#ifdef FILTER_VBR_HEADERS
+#endif
+
+ avpriv_mpegaudio_decode_header(&c, AV_RB32(pkt->data));
- ff_mpegaudio_decode_header(&c, AV_RB32(pkt->data));
+ if (!mp3->initial_bitrate)
+ mp3->initial_bitrate = c.bit_rate;
+ if (!mp3->has_variable_bitrate) {
+ if ((c.bit_rate == 0) || (mp3->initial_bitrate != c.bit_rate))
+ mp3->has_variable_bitrate = 1;
+ }
+#ifdef FILTER_VBR_HEADERS
/* filter out XING and INFO headers. */
base = 4 + xing_offtbl[c.lsf == 1][c.nb_channels == 1];
/* filter out XING and INFO headers. */
base = 4 + xing_offtbl[c.lsf == 1][c.nb_channels == 1];