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