diff --git a/taglib/mpeg/id3v2/frames/chapterframe.cpp b/taglib/mpeg/id3v2/frames/chapterframe.cpp index ab0e3e75..c6523883 100644 --- a/taglib/mpeg/id3v2/frames/chapterframe.cpp +++ b/taglib/mpeg/id3v2/frames/chapterframe.cpp @@ -71,7 +71,12 @@ ChapterFrame::ChapterFrame(const ByteVector &elementID, ID3v2::Frame("CHAP") { d = new ChapterFramePrivate; - d->elementID = elementID; + + // setElementID has a workaround for a previously silly API where you had to + // specifically include the null byte. + + setElementID(elementID); + d->startTime = startTime; d->endTime = endTime; d->startOffset = startOffset; @@ -115,8 +120,9 @@ TagLib::uint ChapterFrame::endOffset() const void ChapterFrame::setElementID(const ByteVector &eID) { d->elementID = eID; - if(eID.at(eID.size() - 1) != char(0)) - d->elementID.append(char(0)); + + if(d->elementID.endsWith(char(0))) + d->elementID = d->elementID.mid(0, d->elementID.size() - 1); } void ChapterFrame::setStartTime(const TagLib::uint &sT) @@ -256,6 +262,7 @@ ByteVector ChapterFrame::renderFields() const ByteVector data; data.append(d->elementID); + data.append('\0'); data.append(ByteVector::fromUInt(d->startTime, true)); data.append(ByteVector::fromUInt(d->endTime, true)); data.append(ByteVector::fromUInt(d->startOffset, true)); diff --git a/tests/test_id3v2.cpp b/tests/test_id3v2.cpp index 43eed5c4..f62001d4 100644 --- a/tests/test_id3v2.cpp +++ b/tests/test_id3v2.cpp @@ -965,7 +965,21 @@ public: ID3v2::ChapterFrame f3(ByteVector("C\x00", 2), 3, 5, 2, 3, frames); CPPUNIT_ASSERT_EQUAL(expected, f3.render()); - } + + frames.clear(); + eF = new ID3v2::TextIdentificationFrame("TIT2"); + eF->setText("CH1"); + frames.append(eF); + + ID3v2::ChapterFrame f4("C", 3, 5, 2, 3, frames); + CPPUNIT_ASSERT_EQUAL(expected, f4.render()); + + ID3v2::ChapterFrame f5("C", 3, 5, 2, 3); + eF = new ID3v2::TextIdentificationFrame("TIT2"); + eF->setText("CH1"); + f5.addEmbeddedFrame(eF); + CPPUNIT_ASSERT_EQUAL(expected, f5.render()); +} void testParseTableOfContentsFrame() {