From 97203503b094cb0e34b08686eafe4620f262d4ba Mon Sep 17 00:00:00 2001 From: Urs Fleisch Date: Sat, 18 Mar 2023 08:08:37 +0100 Subject: [PATCH] Do not miss frames when an extended header is present (#1081) --- taglib/mpeg/id3v2/id3v2tag.cpp | 1 - tests/data/extended-header.mp3 | Bin 0 -> 159 bytes tests/test_mpeg.cpp | 24 ++++++++++++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 tests/data/extended-header.mp3 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 0000000000000000000000000000000000000000..48bfc0cf0e7eb08f1dc140a87a59121d6d920b45 GIT binary patch literal 159 zcmeZtF=kh!Iej9f)0uN;6Z6Ljqh4fgDaCcCAQG%_+_-4srBx0&+nX ihUF_bXB1_orUUhdD!3FSCTFCE1UY*HrI>-(z!(5e{T`

#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);