From kde-commits Sun Jul 25 11:06:36 2010 From: =?utf-8?q?Luk=C3=A1=C5=A1=20Lalinsk=C3=BD?= Date: Sun, 25 Jul 2010 11:06:36 +0000 To: kde-commits Subject: kdesupport/taglib Message-Id: <20100725110636.B7229AC7E2 () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=128005598632215 SVN commit 1154376 by lalinsky: Read-only support for FLAC picture blocks CCBUG:218696 M +1 -0 bindings/c/CMakeLists.txt M +2 -0 taglib/CMakeLists.txt M +1 -1 taglib/flac/CMakeLists.txt M +3 -2 taglib/flac/Makefile.am M +42 -1 taglib/flac/flacfile.cpp M +20 -0 taglib/flac/flacfile.h A taglib/flac/flacpicture.cpp [License: LGPL (v2.1) (wrong address)] A taglib/flac/flacpicture.h [License: LGPL (v2.1) (wrong address)] AM tests/data/silence-44-s.flac M +21 -0 tests/test_flac.cpp --- trunk/kdesupport/taglib/bindings/c/CMakeLists.txt #1154375:1154376 @@ -9,6 +9,7 @@ ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/mpc ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/mp4 ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/mpeg/id3v2 + ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/mpeg/id3v2/frames ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/wavpack ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/ogg/speex ${CMAKE_CURRENT_SOURCE_DIR}/../../taglib/trueaudio --- trunk/kdesupport/taglib/taglib/CMakeLists.txt #1154375:1154376 @@ -12,6 +12,7 @@ ${CMAKE_CURRENT_SOURCE_DIR}/ogg/vorbis ${CMAKE_CURRENT_SOURCE_DIR}/ogg/speex ${CMAKE_CURRENT_SOURCE_DIR}/mpeg/id3v2 + ${CMAKE_CURRENT_SOURCE_DIR}/mpeg/id3v2/frames ${CMAKE_CURRENT_SOURCE_DIR}/mpeg/id3v1 ${CMAKE_CURRENT_SOURCE_DIR}/ape ${CMAKE_CURRENT_SOURCE_DIR}/wavpack @@ -92,6 +93,7 @@ SET(flacs_SRCS flac/flacfile.cpp +flac/flacpicture.cpp flac/flacproperties.cpp ) --- trunk/kdesupport/taglib/taglib/flac/CMakeLists.txt #1154375:1154376 @@ -1 +1 @@ -INSTALL( FILES flacfile.h flacproperties.h DESTINATION ${INCLUDE_INSTALL_DIR}/taglib ) +INSTALL( FILES flacfile.h flacpicture.h flacproperties.h DESTINATION ${INCLUDE_INSTALL_DIR}/taglib ) --- trunk/kdesupport/taglib/taglib/flac/Makefile.am #1154375:1154376 @@ -4,12 +4,13 @@ -I$(top_srcdir)/taglib/toolkit \ -I$(top_srcdir)/taglib/ogg \ -I$(top_srcdir)/taglib/mpeg/id3v2 \ + -I$(top_srcdir)/taglib/mpeg/id3v2/frames \ -I$(top_srcdir)/taglib/mpeg/id3v1 \ $(all_includes) noinst_LTLIBRARIES = libflac.la -libflac_la_SOURCES = flacfile.cpp flacproperties.cpp +libflac_la_SOURCES = flacfile.cpp flacpicture.cpp flacproperties.cpp -taglib_include_HEADERS = flacfile.h flacproperties.h +taglib_include_HEADERS = flacfile.h flacpicture.h flacproperties.h taglib_includedir = $(includedir)/taglib --- trunk/kdesupport/taglib/taglib/flac/flacfile.cpp #1154375:1154376 @@ -34,6 +34,7 @@ #include #include +#include "flacpicture.h" #include "flacfile.h" using namespace TagLib; @@ -41,7 +42,15 @@ namespace { enum { XiphIndex = 0, ID3v2Index = 1, ID3v1Index = 2 }; - enum { StreamInfo = 0, Padding, Application, SeekTable, VorbisComment, CueSheet }; + enum { + StreamInfo = 0, + Padding, + Application, + SeekTable, + VorbisComment, + CueSheet, + PictureBlock + }; enum { MinPaddingLength = 4096 }; } @@ -64,6 +73,9 @@ ~FilePrivate() { + for(uint i = 0; i < pictureList.size(); i++) { + delete pictureList[i]; + } delete properties; } @@ -78,6 +90,7 @@ Properties *properties; ByteVector streamInfoData; ByteVector xiphCommentData; + List pictureList; long flacStart; long streamStart; @@ -423,6 +436,16 @@ debug("FLAC::File::scan() -- multiple Vorbis Comment blocks found, using the first one"); } } + else if(blockType == PictureBlock) { + ByteVector pictureData = readBlock(length); + FLAC::Picture *picture = new FLAC::Picture(); + if(picture->parse(pictureData)) { + addPicture(picture); + } + else { + debug("FLAC::File::scan() -- invalid picture found"); + } + } nextBlockOffset += length + 4; @@ -502,3 +525,21 @@ return 0; } + +List FLAC::File::pictureList() +{ + return d->pictureList; +} + +void FLAC::File::addPicture(Picture *picture) +{ + d->pictureList.append(picture); +} + +void FLAC::File::removePictures() +{ + for(uint i = 0; i < d->pictureList.size(); i++) + delete d->pictureList[i]; + d->pictureList.clear(); +} + --- trunk/kdesupport/taglib/taglib/flac/flacfile.h #1154375:1154376 @@ -28,7 +28,9 @@ #include "taglib_export.h" #include "tfile.h" +#include "tlist.h" +#include "flacpicture.h" #include "flacproperties.h" namespace TagLib { @@ -182,6 +184,24 @@ */ long streamLength(); // BIC: remove + /*! + * Returns a list of pictures attached to the FLAC file. + */ + List pictureList(); + + /*! + * Remove all attached images. + */ + void removePictures(); + + /*! + * Add a new picture to the file. The file takes ownership of the + * picture and will handle freeing its memory. + * + * \note The file will be saved only after calling save(). + */ + void addPicture(Picture *picture); + private: File(const File &); File &operator=(const File &); --- trunk/kdesupport/taglib/tests/test_flac.cpp #1154375:1154376 @@ -15,6 +15,7 @@ CPPUNIT_TEST_SUITE(TestFLAC); CPPUNIT_TEST(testSignature); CPPUNIT_TEST(testMultipleCommentBlocks); + CPPUNIT_TEST(testPicture); CPPUNIT_TEST_SUITE_END(); public: @@ -41,6 +42,26 @@ delete f; } + void testPicture() + { + ScopedFileCopy copy("silence-44-s", ".flac"); + string newname = copy.fileName(); + + FLAC::File *f = new FLAC::File(newname.c_str()); + List lst = f->pictureList(); + CPPUNIT_ASSERT_EQUAL(TagLib::uint(1), lst.size()); + + FLAC::Picture *pic = lst.front(); + CPPUNIT_ASSERT_EQUAL(3, int(pic->type())); + CPPUNIT_ASSERT_EQUAL(1, pic->width()); + CPPUNIT_ASSERT_EQUAL(1, pic->height()); + CPPUNIT_ASSERT_EQUAL(24, pic->colorDepth()); + CPPUNIT_ASSERT_EQUAL(0, pic->numColors()); + CPPUNIT_ASSERT_EQUAL(String("image/png"), pic->mimeType()); + CPPUNIT_ASSERT_EQUAL(String("A pixel."), pic->description()); + CPPUNIT_ASSERT_EQUAL(TagLib::uint(150), pic->data().size()); + } + }; CPPUNIT_TEST_SUITE_REGISTRATION(TestFLAC);