static const Latin1StringHandler defaultStringHandler;
const ID3v2::Latin1StringHandler *ID3v2::Tag::TagPrivate::stringHandler = &defaultStringHandler;
+namespace
+{
+ const uint DefaultPaddingSize = 1024;
+}
+
////////////////////////////////////////////////////////////////////////////////
// StringHandler implementation
////////////////////////////////////////////////////////////////////////////////
// Compute the amount of padding, and append that to tagData.
- uint paddingSize = 0;
- uint originalSize = d->header.tagSize();
+ uint paddingSize = DefaultPaddingSize;
- if(tagData.size() < originalSize)
- paddingSize = originalSize - tagData.size();
- else
- paddingSize = 1024;
+ if(d->file && tagData.size() < d->header.tagSize()) {
+ paddingSize = d->header.tagSize() - tagData.size();
+
+ // Padding won't increase beyond 1% of the file size.
+
+ const uint threshold = d->file->length() / 100; // should be ulonglong in taglib2.
+ if(paddingSize > d->paddingSize && paddingSize > threshold)
+ paddingSize = DefaultPaddingSize;
+ }
- tagData.append(ByteVector(paddingSize, char(0)));
+ tagData.append(ByteVector(paddingSize, '\0'));
// Set the version and data size.
d->header.setMajorVersion(version);
CPPUNIT_TEST(testRenderChapterFrame);
CPPUNIT_TEST(testParseTableOfContentsFrame);
CPPUNIT_TEST(testRenderTableOfContentsFrame);
+ CPPUNIT_TEST(testShrinkPadding);
CPPUNIT_TEST_SUITE_END();
public:
f.render());
}
+ void testShrinkPadding()
+ {
+ ScopedFileCopy copy("xing", ".mp3");
+ string newname = copy.fileName();
+
+ {
+ MPEG::File f(newname.c_str());
+ ID3v2::Tag *tag = f.ID3v2Tag(true);
+
+ ID3v2::TextIdentificationFrame *frame1 = new ID3v2::TextIdentificationFrame("TIT2");
+ frame1->setText("Title");
+ tag->addFrame(frame1);
+
+ ID3v2::AttachedPictureFrame *frame2 = new ID3v2::AttachedPictureFrame();
+ frame2->setPicture(ByteVector(100 * 1024, '\xff'));
+ tag->addFrame(frame2);
+
+ f.save();
+ CPPUNIT_ASSERT(f.length() > 100 * 1024);
+ }
+
+ {
+ MPEG::File f(newname.c_str());
+ CPPUNIT_ASSERT_EQUAL(true, f.hasID3v2Tag());
+
+ ID3v2::Tag *tag = f.ID3v2Tag();
+ tag->removeFrames("APIC");
+
+ f.save();
+ CPPUNIT_ASSERT(f.length() < 10 * 1024);
+ }
+ }
+
};
CPPUNIT_TEST_SUITE_REGISTRATION(TestID3v2);