diff --git a/taglib/mpeg/id3v2/id3v2tag.cpp b/taglib/mpeg/id3v2/id3v2tag.cpp index f80a1b1a..f1930d0e 100644 --- a/taglib/mpeg/id3v2/id3v2tag.cpp +++ b/taglib/mpeg/id3v2/id3v2tag.cpp @@ -784,7 +784,6 @@ void ID3v2::Tag::parse(const ByteVector &origData) d->extendedHeader->setData(data); if(d->extendedHeader->size() <= data.size()) { frameDataPosition += d->extendedHeader->size(); - frameDataLength -= d->extendedHeader->size(); } } diff --git a/tests/data/extended-header.mp3 b/tests/data/extended-header.mp3 new file mode 100644 index 00000000..48bfc0cf Binary files /dev/null and b/tests/data/extended-header.mp3 differ diff --git a/tests/test_mpeg.cpp b/tests/test_mpeg.cpp index 7abc80db..b668d122 100644 --- a/tests/test_mpeg.cpp +++ b/tests/test_mpeg.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #include "utils.h" @@ -66,6 +67,7 @@ class TestMPEG : public CppUnit::TestFixture CPPUNIT_TEST(testEmptyID3v1); CPPUNIT_TEST(testEmptyAPE); CPPUNIT_TEST(testIgnoreGarbage); + CPPUNIT_TEST(testExtendedHeader); CPPUNIT_TEST_SUITE_END(); public: @@ -535,6 +537,28 @@ public: } } + void testExtendedHeader() + { + const ScopedFileCopy copy("extended-header", ".mp3"); + { + MPEG::File f(copy.fileName().c_str()); + CPPUNIT_ASSERT(f.isValid()); + CPPUNIT_ASSERT(f.hasID3v2Tag()); + ID3v2::Tag *tag = f.ID3v2Tag(); + ID3v2::ExtendedHeader *ext = tag->extendedHeader(); + CPPUNIT_ASSERT(ext); + CPPUNIT_ASSERT_EQUAL(12U, ext->size()); + CPPUNIT_ASSERT_EQUAL(String("Druids"), tag->title()); + CPPUNIT_ASSERT_EQUAL(String("Excelsis"), tag->artist()); + CPPUNIT_ASSERT_EQUAL(String("Vo Chrieger U Drache"), tag->album()); + CPPUNIT_ASSERT_EQUAL(2013U, tag->year()); + CPPUNIT_ASSERT_EQUAL(String("Folk/Power Metal"), tag->genre()); + CPPUNIT_ASSERT_EQUAL(3U, tag->track()); + CPPUNIT_ASSERT_EQUAL(String("2013"), + f.properties().value("ORIGINALDATE").front()); + } + } + }; CPPUNIT_TEST_SUITE_REGISTRATION(TestMPEG);