diff --git a/libavformat/mp3dec.c b/libavformat/mp3dec.c index 2b8aa37dad..5300ab161e 100644 --- a/libavformat/mp3dec.c +++ b/libavformat/mp3dec.c @@ -116,7 +116,7 @@ static int mp3_parse_vbr_tags(AVFormatContext *s, AVStream *st, int64_t base) avio_skip(s->pb, 4); v = avio_rb32(s->pb); - if(v == MKBETAG('L', 'A', 'M', 'E')) { + if(v == MKBETAG('L', 'A', 'M', 'E') || v == MKBETAG('L', 'a', 'v', 'f')) { avio_skip(s->pb, 21-4); v= avio_rb24(s->pb); mp3->start_pad = v>>12; diff --git a/libavformat/mp3enc.c b/libavformat/mp3enc.c index 8a9f788faa..cc99e77a51 100644 --- a/libavformat/mp3enc.c +++ b/libavformat/mp3enc.c @@ -123,6 +123,7 @@ static int mp3_write_xing(AVFormatContext *s) MPADecodeHeader c; int srate_idx, ver = 0, i, channels; int needed; + const char *vendor = (codec->flags & CODEC_FLAG_BITEXACT) ? "Lavf" : LIBAVFORMAT_IDENT; if (!s->pb->seekable) return 0; @@ -177,7 +178,9 @@ static int mp3_write_xing(AVFormatContext *s) + 4 // frames/size/toc flags + 4 // frames + 4 // size - + VBR_TOC_SIZE; // toc + + VBR_TOC_SIZE // toc + + 24 + ; if (needed <= c.frame_size) break; @@ -202,6 +205,12 @@ static int mp3_write_xing(AVFormatContext *s) for (i = 0; i < VBR_TOC_SIZE; ++i) avio_w8(s->pb, (uint8_t)(255 * i / VBR_TOC_SIZE)); + for (i = 0; i < strlen(vendor); ++i) + avio_w8(s->pb, vendor[i]); + for (; i < 21; ++i) + avio_w8(s->pb, 0); + avio_wb24(s->pb, FFMAX(codec->delay - 528 - 1, 0)<<12); + ffio_fill(s->pb, 0, c.frame_size - needed); avio_flush(s->pb); diff --git a/tests/ref/lavf-fate/mp3 b/tests/ref/lavf-fate/mp3 index 48a5476f8a..91e2b48c03 100644 --- a/tests/ref/lavf-fate/mp3 +++ b/tests/ref/lavf-fate/mp3 @@ -1,3 +1,3 @@ -67cbcc79f018afb68f7d81625bfa234c *./tests/data/lavf-fate/lavf.mp3 +40a4e41ae74ec8dacdf02402831a6a58 *./tests/data/lavf-fate/lavf.mp3 97230 ./tests/data/lavf-fate/lavf.mp3 ./tests/data/lavf-fate/lavf.mp3 CRC=0x6c9850fe