[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