rpms/taglib/devel taglib-1.5-1.6-ogg.patch, 1.1, 1.2 taglib-1.5-1.6-toolkit.patch, 1.1, 1.2 taglib.spec, 1.42, 1.43

Michael Schwendt mschwendt at fedoraproject.org
Fri Sep 4 10:21:32 UTC 2009


Author: mschwendt

Update of /cvs/pkgs/rpms/taglib/devel
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv14859

Modified Files:
	taglib-1.5-1.6-ogg.patch taglib-1.5-1.6-toolkit.patch 
	taglib.spec 
Log Message:
* Fri Sep  4 2009 Michael Schwendt <mschwendt at fedoraproject.org> - 1.5-8
- Merge another bug-fix from 1.6rc1 (this adds 3 symbols) and
  really add tstring bug-fix:
  * Split Ogg packets larger than 64k into multiple pages. (BUG:171957)
  * Fixed a possible crash in the non-const version of String::operator[]
    and in String::operator+=. (BUG:169389)


taglib-1.5-1.6-ogg.patch:
 taglib-1.5/taglib/ogg/oggfile.cpp |   99 ++++++++++++++++++++++++++++++++-
 taglib-1.5/taglib/ogg/oggpage.cpp |  112 +++++++++++++++++++++++++++++++++-----
 taglib-1.5/taglib/ogg/oggpage.h   |    8 ++
 taglib/taglib/ogg/xiphcomment.cpp |   18 ++++--
 4 files changed, 213 insertions(+), 24 deletions(-)

Index: taglib-1.5-1.6-ogg.patch
===================================================================
RCS file: /cvs/pkgs/rpms/taglib/devel/taglib-1.5-1.6-ogg.patch,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -p -r1.1 -r1.2
--- taglib-1.5-1.6-ogg.patch	22 Aug 2009 10:44:20 -0000	1.1
+++ taglib-1.5-1.6-ogg.patch	4 Sep 2009 10:21:31 -0000	1.2
@@ -44,3 +44,287 @@ diff -Nur taglib-1.5/taglib/ogg/xiphcomm
    if(i == 0)
      removeField("TRACKNUMBER");
    else
+diff -Nur taglib-1.5-orig/taglib/ogg/oggfile.cpp taglib-1.5/taglib/ogg/oggfile.cpp
+--- taglib-1.5-orig/taglib/ogg/oggfile.cpp	2008-02-04 16:14:46.000000000 +0100
++++ taglib-1.5/taglib/ogg/oggfile.cpp	2009-09-04 11:46:54.859122796 +0200
+@@ -270,11 +270,28 @@
+   return true;
+ }
+ 
+-void Ogg::File::writePageGroup(const List<int> &pageGroup)
++void Ogg::File::writePageGroup(const List<int> &thePageGroup)
+ {
+-  if(pageGroup.isEmpty())
++  if(thePageGroup.isEmpty())
+     return;
+ 
++
++  // pages in the pageGroup and packets must be equivalent 
++  // (originalSize and size of packets would not work together), 
++  // therefore we sometimes have to add pages to the group
++  List<int> pageGroup(thePageGroup);
++  while (!d->pages[pageGroup.back()]->header()->lastPacketCompleted()) {
++    if (d->currentPage->header()->pageSequenceNumber() == pageGroup.back()) {
++      if (nextPage() == false) {
++        debug("broken ogg file");
++        return;
++      }
++      pageGroup.append(d->currentPage->header()->pageSequenceNumber());
++    } else {
++      pageGroup.append(pageGroup.back() + 1);
++    }
++  }
++
+   ByteVectorList packets;
+ 
+   // If the first page of the group isn't dirty, append its partial content here.
+@@ -313,6 +330,52 @@
+                                       d->streamSerialNumber, pageGroup.front(),
+                                       continued, completed);
+ 
++  List<Page *> renumberedPages;
++
++  // Correct the page numbering of following pages
++
++  if (pages.back()->header()->pageSequenceNumber() != pageGroup.back()) {
++
++    // TODO: change the internal data structure so that we don't need to hold the 
++    // complete file in memory (is unavoidable at the moment)
++
++    // read the complete stream
++    while(!d->currentPage->header()->lastPageOfStream()) {
++      if(nextPage() == false) {
++        debug("broken ogg file");
++        break;
++      }
++    }
++
++    // create a gap for the new pages
++    int numberOfNewPages = pages.back()->header()->pageSequenceNumber() - pageGroup.back();
++    List<Page *>::Iterator pageIter = d->pages.begin();
++    for(int i = 0; i < pageGroup.back(); i++) {
++      if(pageIter != d->pages.end()) {
++        ++pageIter;
++      }
++      else {
++        debug("Ogg::File::writePageGroup() -- Page sequence is broken in original file.");
++        break;
++      }
++    }
++
++    ++pageIter;
++    for(; pageIter != d->pages.end(); ++pageIter) {
++      Ogg::Page *newPage =
++        (*pageIter)->getCopyWithNewPageSequenceNumber(
++            (*pageIter)->header()->pageSequenceNumber() + numberOfNewPages);
++
++      ByteVector data;
++      data.append(newPage->render());
++      insert(data, newPage->fileOffset(), data.size());
++
++      renumberedPages.append(newPage);
++    }
++  }
++
++  // insert the new data
++
+   ByteVector data;
+   for(List<Page *>::ConstIterator it = pages.begin(); it != pages.end(); ++it)
+     data.append((*it)->render());
+@@ -328,9 +391,37 @@
+   // Update the page index to include the pages we just created and to delete the
+   // old pages.
+ 
++  // First step: Pages that contain the comment data
++
+   for(List<Page *>::ConstIterator it = pages.begin(); it != pages.end(); ++it) {
+     const int index = (*it)->header()->pageSequenceNumber();
+-    delete d->pages[index];
+-    d->pages[index] = *it;
++    if(index < static_cast<int>(d->pages.size())) {
++      delete d->pages[index];
++      d->pages[index] = *it;
++    }
++    else if(index == d->pages.size()) {
++      d->pages.append(*it);
++    }
++    else {
++      // oops - there's a hole in the sequence
++      debug("Ogg::File::writePageGroup() -- Page sequence is broken.");
++    }
++  }
++
++  // Second step: the renumbered pages
++
++  for(List<Page *>::ConstIterator it = renumberedPages.begin(); it != renumberedPages.end(); ++it) {
++    const int index = (*it)->header()->pageSequenceNumber();
++    if(index < static_cast<int>(d->pages.size())) {
++      delete d->pages[index];
++      d->pages[index] = *it;
++    }
++    else if(index == d->pages.size()) {
++      d->pages.append(*it);
++    }
++    else {
++      // oops - there's a hole in the sequence
++      debug("Ogg::File::writePageGroup() -- Page sequence is broken.");
++    }
+   }
+ }
+diff -Nur taglib-1.5-orig/taglib/ogg/oggpage.cpp taglib-1.5/taglib/ogg/oggpage.cpp
+--- taglib-1.5-orig/taglib/ogg/oggpage.cpp	2008-02-04 16:14:46.000000000 +0100
++++ taglib-1.5/taglib/ogg/oggpage.cpp	2009-09-04 11:47:00.527115729 +0200
+@@ -116,12 +116,14 @@
+     flags = ContainsPacketFlags(flags | CompletePacket);
+   }
+ 
+-  // Or if the page is (a) the first page and it's complete or (b) the last page
+-  // and it's complete or (c) a page in the middle.
+-
+-  else if((flags & BeginsWithPacket && !d->header.firstPacketContinued()) ||
+-          (flags & EndsWithPacket && d->header.lastPacketCompleted()) ||
+-          (!(flags & BeginsWithPacket) && !(flags & EndsWithPacket)))
++  // Or if there is more than one page and the page is 
++  // (a) the first page and it's complete or 
++  // (b) the last page and it's complete or 
++  // (c) a page in the middle.
++  else if(packetCount() > 1 &&
++          ((flags & BeginsWithPacket && !d->header.firstPacketContinued()) ||
++           (flags & EndsWithPacket && d->header.lastPacketCompleted()) ||
++           (!(flags & BeginsWithPacket) && !(flags & EndsWithPacket))))
+   {
+     flags = ContainsPacketFlags(flags | CompletePacket);
+   }
+@@ -208,20 +210,101 @@
+   for(ByteVectorList::ConstIterator it = packets.begin(); it != packets.end(); ++it)
+     totalSize += (*it).size();
+ 
+-  if(strategy == Repaginate || totalSize + packets.size() > 255 * 256) {
+-    debug("Ogg::Page::paginate() -- Sorry!  Repagination is not yet implemented.");
+-    return l;
+-  }
++  // Handle creation of multiple pages with appropriate pagination.
++  if(strategy == Repaginate || totalSize + packets.size() > 255 * 255) {
+ 
+-  // TODO: Handle creation of multiple pages here with appropriate pagination.
++    // SPLITSIZE must be a multiple of 255 in order to get the lacing values right
++    // create pages of about 8KB each
++#define SPLITSIZE (32*255)
++
++    int pageIndex = 0;
++
++    for(ByteVectorList::ConstIterator it = packets.begin(); it != packets.end(); ++it) {
++      bool continued = false;
++
++      // mark very first packet?
++      if(firstPacketContinued && it==packets.begin()) {
++        continued = true;
++      }
++
++      // append to buf
++      ByteVector packetBuf;
++      packetBuf.append(*it);
++
++      while(packetBuf.size() > SPLITSIZE) {
++        // output a Page
++        ByteVector packetForOnePage;
++        packetForOnePage.resize(SPLITSIZE);
++        std::copy(packetBuf.begin(), packetBuf.begin() + SPLITSIZE, packetForOnePage.begin());
++
++        ByteVectorList packetList;
++        packetList.append(packetForOnePage);
++        Page *p = new Page(packetList, streamSerialNumber, firstPage+pageIndex, continued, false, false);
++        l.append(p);
++
++        pageIndex++;
++        continued = true;
++        packetBuf = packetBuf.mid(SPLITSIZE);
++      }
++
++      ByteVectorList::ConstIterator jt = it;
++      ++jt;
++      bool lastPacketInList = (jt == packets.end());
++
++      // output a page for the rest (we output one packet per page, so this one should be completed)
++      ByteVectorList packetList;
++      packetList.append(packetBuf);
++
++      bool isVeryLastPacket = false;
++      if(containsLastPacket) {
++        // mark the very last output page as last of stream
++        ByteVectorList::ConstIterator jt = it;
++        ++jt;
++        if(jt == packets.end()) {
++          isVeryLastPacket = true;
++        }
++      }
++
++      Page *p = new Page(packetList, streamSerialNumber, firstPage+pageIndex, continued,
++                         lastPacketInList ? lastPacketCompleted : true, 
++                         isVeryLastPacket);
++      pageIndex++;
+ 
+-  Page *p = new Page(packets, streamSerialNumber, firstPage, firstPacketContinued,
+-                     lastPacketCompleted, containsLastPacket);
+-  l.append(p);
++      l.append(p);
++    }
++  }
++  else {
++    Page *p = new Page(packets, streamSerialNumber, firstPage, firstPacketContinued,
++                       lastPacketCompleted, containsLastPacket);
++    l.append(p);
++  }
+ 
+   return l;
+ }
+ 
++Ogg::Page* Ogg::Page::getCopyWithNewPageSequenceNumber(int sequenceNumber)
++{
++  Page *pResultPage = NULL;
++
++  // TODO: a copy constructor would be helpful
++
++  if(d->file == 0) {
++    pResultPage = new Page(
++        d->packets,
++        d->header.streamSerialNumber(),
++        sequenceNumber,
++        d->header.firstPacketContinued(),
++        d->header.lastPacketCompleted(),
++        d->header.lastPageOfStream());
++  }
++  else
++  {
++    pResultPage = new Page(d->file, d->fileOffset);
++    pResultPage->d->header.setPageSequenceNumber(sequenceNumber);
++  }
++  return pResultPage;
++}
++
+ ////////////////////////////////////////////////////////////////////////////////
+ // protected members
+ ////////////////////////////////////////////////////////////////////////////////
+@@ -254,3 +337,4 @@
+   d->packets = packets;
+   d->header.setPacketSizes(packetSizes);
+ }
++
+diff -Nur taglib-1.5-orig/taglib/ogg/oggpage.h taglib-1.5/taglib/ogg/oggpage.h
+--- taglib-1.5-orig/taglib/ogg/oggpage.h	2008-02-04 16:14:46.000000000 +0100
++++ taglib-1.5/taglib/ogg/oggpage.h	2009-09-04 11:47:06.387120297 +0200
+@@ -70,6 +70,14 @@
+        */
+       const PageHeader *header() const;
+ 
++      /*! 
++       * Returns a copy of the page with \a sequenceNumber set as sequence number.
++       * 
++       * \see header()
++       * \see PageHeader::setPageSequenceNumber()
++       */
++      Page* getCopyWithNewPageSequenceNumber(int sequenceNumber);
++
+       /*!
+        * Returns the index of the first packet wholly or partially contained in
+        * this page.

taglib-1.5-1.6-toolkit.patch:
 taglib-1.5/taglib/toolkit/tstring.cpp     |    6 +++++-
 taglib-1.5/taglib/toolkit/tstring.h       |    2 +-
 taglib/taglib/toolkit/tbytevector.cpp     |    4 ++--
 taglib/taglib/toolkit/tbytevector.h       |    2 +-
 taglib/taglib/toolkit/tbytevectorlist.cpp |    2 +-
 5 files changed, 10 insertions(+), 6 deletions(-)

Index: taglib-1.5-1.6-toolkit.patch
===================================================================
RCS file: /cvs/pkgs/rpms/taglib/devel/taglib-1.5-1.6-toolkit.patch,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -p -r1.1 -r1.2
--- taglib-1.5-1.6-toolkit.patch	22 Aug 2009 10:44:21 -0000	1.1
+++ taglib-1.5-1.6-toolkit.patch	4 Sep 2009 10:21:32 -0000	1.2
@@ -40,3 +40,45 @@ diff -Nur taglib-1.5/taglib/toolkit/tbyt
        l.append(v.mid(previousOffset, offset - previousOffset));
      else
        l.append(ByteVector::null);
+diff -Nur taglib-1.5-orig/taglib/toolkit/tstring.cpp taglib-1.5/taglib/toolkit/tstring.cpp
+--- taglib-1.5-orig/taglib/toolkit/tstring.cpp	2008-02-04 16:14:45.000000000 +0100
++++ taglib-1.5/taglib/toolkit/tstring.cpp	2009-09-04 12:07:00.506121756 +0200
+@@ -35,7 +35,7 @@
+ 
+   inline unsigned short byteSwap(unsigned short x)
+   {
+-    return ((x) >> 8) & 0xff | ((x) & 0xff) << 8;
++    return (((x) >> 8) & 0xff) | (((x) & 0xff) << 8);
+   }
+ 
+   inline unsigned short combine(unsigned char c1, unsigned char c2)
+@@ -510,6 +510,8 @@
+ 
+ TagLib::wchar &String::operator[](int i)
+ {
++  detach();
++
+   return d->data[i];
+ }
+ 
+@@ -558,6 +560,8 @@
+ 
+ String &String::operator+=(char c)
+ {
++  detach();
++
+   d->data += uchar(c);
+   return *this;
+ }
+diff -Nur taglib-1.5-orig/taglib/toolkit/tstring.h taglib-1.5/taglib/toolkit/tstring.h
+--- taglib-1.5-orig/taglib/toolkit/tstring.h	2008-02-04 16:14:45.000000000 +0100
++++ taglib-1.5/taglib/toolkit/tstring.h	2009-09-04 12:07:03.465121011 +0200
+@@ -31,7 +31,7 @@
+ #include "tbytevector.h"
+ 
+ #include <string>
+-#include <ostream>
++#include <iostream>
+ 
+ /*!
+  * \relates TagLib::String


Index: taglib.spec
===================================================================
RCS file: /cvs/pkgs/rpms/taglib/devel/taglib.spec,v
retrieving revision 1.42
retrieving revision 1.43
diff -u -p -r1.42 -r1.43
--- taglib.spec	23 Aug 2009 18:44:02 -0000	1.42
+++ taglib.spec	4 Sep 2009 10:21:32 -0000	1.43
@@ -12,7 +12,7 @@
 
 Name:       taglib	
 Version:    1.5
-Release:    7%{?dist}
+Release:    8%{?dist}
 Summary:    Audio Meta-Data Library
 
 Group: 	    System Environment/Libraries
@@ -171,6 +171,13 @@ rm -rf %{buildroot}
 
 
 %changelog
+* Fri Sep  4 2009 Michael Schwendt <mschwendt at fedoraproject.org> - 1.5-8
+- Merge another bug-fix from 1.6rc1 (this adds 3 symbols) and
+  really add tstring bug-fix:
+  * Split Ogg packets larger than 64k into multiple pages. (BUG:171957)
+  * Fixed a possible crash in the non-const version of String::operator[]
+    and in String::operator+=. (BUG:169389)
+
 * Sun Aug 23 2009 Michael Schwendt <mschwendt at fedoraproject.org> - 1.5-7
 - Build API documentation into -doc package.
 




More information about the fedora-extras-commits mailing list