[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: Re: kdesupport/taglib
From: Michael Seiwert <mseiwert () hbv ! de>
Date: 2009-07-24 13:15:18
Message-ID: 200907241515.18628.mseiwert () hbv ! de
[Download RAW message or body]
Hi,
as there were several taglib bugfixes since the kdesupport package was tagged
for 4.3 are there any plans backporting these fixes to 4.3 ?
Very best regards
Michael
On Friday 24 July 2009 15:08:52 Lukáš Lalinský wrote:
> SVN commit 1001897 by lalinsky:
>
> Partial support for 64-bit atoms
>
> We still can't handle actual 64-bit atoms, but we can handle 32-bit sizes
> stored in 64 bits.
>
> CCBUG:198730
>
>
> M +11 -4 taglib/mp4/mp4atom.cpp
> M +14 -3 taglib/mp4/mp4tag.cpp
> AM tests/data/64bit.mp4
> M +27 -0 tests/test_mp4.cpp
>
>
> --- trunk/kdesupport/taglib/taglib/mp4/mp4atom.cpp #1001896:1001897
> @@ -47,10 +47,17 @@
> length = header.mid(0, 4).toUInt();
>
> if (length == 1) {
> - debug("MP4: 64-bit atoms are not supported");
> - length = 0;
> - file->seek(0, File::End);
> - return;
> + long long longLength = file->readBlock(8).toLongLong();
> + if (longLength >= 8 && longLength <= 0xFFFFFFFF) {
> + // The atom has a 64-bit length, but it's actually a 32-bit value
> + length = (long)longLength;
> + }
> + else {
> + debug("MP4: 64-bit atoms are not supported");
> + length = 0;
> + file->seek(0, File::End);
> + return;
> + }
> }
> if (length < 8) {
> debug("MP4: Invalid atom size");
> --- trunk/kdesupport/taglib/taglib/mp4/mp4tag.cpp #1001896:1001897
> @@ -314,9 +314,20 @@
> {
> for(unsigned int i = 0; i < path.size() - ignore; i++) {
> d->file->seek(path[i]->offset);
> - long size = d->file->readBlock(4).toUInt() + delta;
> - d->file->seek(path[i]->offset);
> - d->file->writeBlock(ByteVector::fromUInt(size));
> + long size = d->file->readBlock(4).toUInt();
> + // 64-bit
> + if (size == 1) {
> + d->file->seek(4, File::Current); // Skip name
> + long long longSize = d->file->readBlock(8).toLongLong();
> + // Seek the offset of the 64-bit size
> + d->file->seek(path[i]->offset + 8);
> + d->file->writeBlock(ByteVector::fromLongLong(longSize + delta));
> + }
> + // 32-bit
> + else {
> + d->file->seek(path[i]->offset);
> + d->file->writeBlock(ByteVector::fromUInt(size + delta));
> + }
> }
> }
>
> ** trunk/kdesupport/taglib/tests/data/64bit.mp4 #property svn:mime-type
> + application/octet-stream
> --- trunk/kdesupport/taglib/tests/test_mp4.cpp #1001896:1001897
> @@ -18,6 +18,7 @@
> CPPUNIT_TEST(testFreeForm);
> CPPUNIT_TEST(testUpdateStco);
> CPPUNIT_TEST(testSaveExisingWhenIlstIsLast);
> + CPPUNIT_TEST(test64BitAtom);
> CPPUNIT_TEST_SUITE_END();
>
> public:
> @@ -118,6 +119,32 @@
> deleteFile(filename);
> }
>
> + void test64BitAtom()
> + {
> + string filename = copyFile("64bit", ".mp4");
> +
> + MP4::File *f = new MP4::File(filename.c_str());
> + CPPUNIT_ASSERT_EQUAL(true, f->tag()->itemListMap()["cpil"].toBool());
> +
> + MP4::Atoms *atoms = new MP4::Atoms(f);
> + MP4::Atom *moov = atoms->atoms[0];
> + CPPUNIT_ASSERT_EQUAL(long(77), moov->length);
> +
> + f->tag()->itemListMap()["pgap"] = 1;
> + f->save();
> +
> + f = new MP4::File(filename.c_str());
> + CPPUNIT_ASSERT_EQUAL(true, f->tag()->itemListMap()["cpil"].toBool());
> + CPPUNIT_ASSERT_EQUAL(true, f->tag()->itemListMap()["pgap"].toBool());
> +
> + atoms = new MP4::Atoms(f);
> + moov = atoms->atoms[0];
> + // original size + 'pgap' size + padding
> + CPPUNIT_ASSERT_EQUAL(long(77 + 25 + 974), moov->length);
> +
> + deleteFile(filename);
> + }
> +
> };
>
> CPPUNIT_TEST_SUITE_REGISTRATION(TestMP4);
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic