Fix parsing of ID3v2.2 frames (#1228)

This commit is contained in:
Urs Fleisch
2024-05-14 13:27:17 +02:00
parent ebf4c5bbb1
commit 3d4428726e
3 changed files with 64 additions and 3 deletions

View File

@ -843,8 +843,10 @@ void ID3v2::Tag::parse(const ByteVector &origData)
break;
}
Frame *frame = d->factory->createFrame(data.mid(frameDataPosition),
&d->header);
const ByteVector origData = data.mid(frameDataPosition);
const Header *tagHeader = &d->header;
unsigned int headerVersion = tagHeader->majorVersion();
Frame *frame = d->factory->createFrame(origData, tagHeader);
if(!frame)
return;
@ -856,7 +858,15 @@ void ID3v2::Tag::parse(const ByteVector &origData)
return;
}
frameDataPosition += frame->size() + frame->headerSize();
if(frame->header()->version() == headerVersion) {
frameDataPosition += frame->size() + frame->headerSize();
} else {
// The frame was converted to another version, e.g. from 2.2 to 2.4.
// We must advance the frame data position according to the original
// frame, not the converted frame because its header size might differ.
Frame::Header origHeader(origData, headerVersion);
frameDataPosition += origHeader.frameSize() + origHeader.size();
}
addFrame(frame);
}