diff --git a/taglib/CMakeLists.txt b/taglib/CMakeLists.txt index 04ce64e2..c637091d 100644 --- a/taglib/CMakeLists.txt +++ b/taglib/CMakeLists.txt @@ -95,6 +95,9 @@ SET(flacs_SRCS flac/flacfile.cpp flac/flacpicture.cpp flac/flacproperties.cpp +flac/flacmetadatablock.cpp +flac/flacmetadatablocks.cpp +flac/flacunknownmetadatablock.cpp ) SET(oggflacs_SRCS diff --git a/taglib/flac/flacfile.cpp b/taglib/flac/flacfile.cpp index 799e2fe4..cb402d5f 100644 --- a/taglib/flac/flacfile.cpp +++ b/taglib/flac/flacfile.cpp @@ -36,6 +36,7 @@ #include "flacpicture.h" #include "flacfile.h" +#include "flacmetadatablock.h" using namespace TagLib; diff --git a/taglib/flac/flacmetadatablock.cpp b/taglib/flac/flacmetadatablock.cpp new file mode 100644 index 00000000..60f396f1 --- /dev/null +++ b/taglib/flac/flacmetadatablock.cpp @@ -0,0 +1,51 @@ +/************************************************************************** + copyright : (C) 2010 by Lukáš Lalinský + email : lalinsky@gmail.com + **************************************************************************/ + +/*************************************************************************** + * This library is free software; you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License version * + * 2.1 as published by the Free Software Foundation. * + * * + * This library is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * + * USA * + * * + * Alternatively, this file is available under the Mozilla Public * + * License Version 1.1. You may obtain a copy of the License at * + * http://www.mozilla.org/MPL/ * + ***************************************************************************/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include "flacmetadatablock.h" + +using namespace TagLib; + +class FLAC::MetadataBlock::MetadataBlockPrivate +{ +public: + MetadataBlockPrivate() {} + +}; + +FLAC::MetadataBlock::MetadataBlock() +{ + d = 0; +} + +FLAC::MetadataBlock::~MetadataBlock() +{ +} + diff --git a/taglib/flac/flacmetadatablock.h b/taglib/flac/flacmetadatablock.h new file mode 100644 index 00000000..35286338 --- /dev/null +++ b/taglib/flac/flacmetadatablock.h @@ -0,0 +1,75 @@ +/************************************************************************** + copyright : (C) 2010 by Lukáš Lalinský + email : lalinsky@gmail.com + **************************************************************************/ + +/*************************************************************************** + * This library is free software; you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License version * + * 2.1 as published by the Free Software Foundation. * + * * + * This library is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * + * USA * + * * + * Alternatively, this file is available under the Mozilla Public * + * License Version 1.1. You may obtain a copy of the License at * + * http://www.mozilla.org/MPL/ * + ***************************************************************************/ + +#ifndef TAGLIB_FLACMETADATABLOCK_H +#define TAGLIB_FLACMETADATABLOCK_H + +#include "tlist.h" +#include "tbytevector.h" +#include "taglib_export.h" + +namespace TagLib { + + namespace FLAC { + + class TAGLIB_EXPORT MetadataBlock + { + public: + MetadataBlock(); + virtual ~MetadataBlock(); + + enum BlockType { + StreamInfo = 0, + Padding, + Application, + SeekTable, + VorbisComment, + CueSheet, + Picture + }; + + /*! + * Returns the FLAC metadata block type. + */ + virtual int code() const = 0; + + /*! + * Render the content of the block. + */ + virtual ByteVector render() const = 0; + + private: + MetadataBlock(const MetadataBlock &item); + MetadataBlock &operator=(const MetadataBlock &item); + + class MetadataBlockPrivate; + MetadataBlockPrivate *d; + }; + + } + +} + +#endif diff --git a/taglib/flac/flacmetadatablocks.cpp b/taglib/flac/flacmetadatablocks.cpp new file mode 100644 index 00000000..e5bd638e --- /dev/null +++ b/taglib/flac/flacmetadatablocks.cpp @@ -0,0 +1,111 @@ +/************************************************************************** + copyright : (C) 2010 by Lukáš Lalinský + email : lalinsky@gmail.com + **************************************************************************/ + +/*************************************************************************** + * This library is free software; you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License version * + * 2.1 as published by the Free Software Foundation. * + * * + * This library is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * + * USA * + * * + * Alternatively, this file is available under the Mozilla Public * + * License Version 1.1. You may obtain a copy of the License at * + * http://www.mozilla.org/MPL/ * + ***************************************************************************/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include "flacfile.h" +#include "flacunknownmetadatablock.h" +#include "flacmetadatablock.h" +#include "flacmetadatablocks.h" + +using namespace TagLib; + +class FLAC::MetadataBlocks::MetadataBlocksPrivate +{ +public: + MetadataBlocksPrivate() {} + + List blocks; +}; + +FLAC::MetadataBlocks::MetadataBlocks() +{ + d = new MetadataBlocksPrivate(); +} + +FLAC::MetadataBlocks::~MetadataBlocks() +{ + delete d; +} + +const List &FLAC::MetadataBlocks::metadataBlockList() const +{ + return d->blocks; +} + +bool FLAC::MetadataBlocks::read(FLAC::File *file) +{ + bool isLastBlock = false; + while(!isLastBlock) { + ByteVector header = file->readBlock(4); + if(header.size() != 4) { + debug("FLAC::MetadataBlocks::read -- Unable to read 4 bytes long header"); + return false; + } + char blockType = header[0] & 0x7f; + isLastBlock = (header[0] & 0x80) != 0; + uint length = header.mid(1, 3).toUInt(); + ByteVector data = file->readBlock(length); + if(data.size() != length) { + debug("FLAC::MetadataBlocks::read -- Unable to read " + String::number(length) + " bytes long block body"); + return false; + } + if(blockType != FLAC::MetadataBlock::Padding) { + FLAC::MetadataBlock *block = new FLAC::UnknownMetadataBlock(blockType, data); + d->blocks.append(block); + } + } + return true; +} + +ByteVector FLAC::MetadataBlocks::render(int originalLength) const +{ + ByteVector result; + for(uint i = 0; i < d->blocks.size(); i++) { + FLAC::MetadataBlock *block = d->blocks[i]; + if(block->code() == FLAC::MetadataBlock::Padding) + continue; + ByteVector data = block->render(); + ByteVector header = ByteVector::fromUInt(data.size()); + header[0] = block->code(); + result.append(header); + result.append(data); + } + int paddingLength = originalLength - result.size() - 4; + // We have to resize the file, add some padding + if (paddingLength < 0) { + paddingLength = 4096; + } + ByteVector padding = ByteVector::fromUInt(paddingLength); + padding.resize(paddingLength + 4); + padding[0] = FLAC::MetadataBlock::Padding | 0x80; + result.append(padding); + return result; +} + diff --git a/taglib/flac/flacmetadatablocks.h b/taglib/flac/flacmetadatablocks.h new file mode 100644 index 00000000..e029c289 --- /dev/null +++ b/taglib/flac/flacmetadatablocks.h @@ -0,0 +1,69 @@ +/************************************************************************** + copyright : (C) 2010 by Lukáš Lalinský + email : lalinsky@gmail.com + **************************************************************************/ + +/*************************************************************************** + * This library is free software; you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License version * + * 2.1 as published by the Free Software Foundation. * + * * + * This library is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * + * USA * + * * + * Alternatively, this file is available under the Mozilla Public * + * License Version 1.1. You may obtain a copy of the License at * + * http://www.mozilla.org/MPL/ * + ***************************************************************************/ + +#ifndef TAGLIB_FLACMETADATABLOCKS_H +#define TAGLIB_FLACMETADATABLOCKS_H + +#include "tlist.h" +#include "tbytevector.h" +#include "taglib_export.h" + +namespace TagLib { + + namespace FLAC { + + class File; + + class TAGLIB_EXPORT MetadataBlocks + { + public: + MetadataBlocks(); + virtual ~MetadataBlocks(); + + /*! + * Read the blocks from a file. + */ + bool read(File *file); + + /*! + * Render the blocks into a byte vector. + */ + ByteVector render(int originalLength) const; + + const List &metadataBlockList() const; + + private: + MetadataBlocks(const MetadataBlocks &item); + MetadataBlocks &operator=(const MetadataBlocks &item); + + class MetadataBlocksPrivate; + MetadataBlocksPrivate *d; + }; + + } + +} + +#endif diff --git a/taglib/flac/flacpicture.cpp b/taglib/flac/flacpicture.cpp index e7f6958c..40e69b12 100644 --- a/taglib/flac/flacpicture.cpp +++ b/taglib/flac/flacpicture.cpp @@ -70,6 +70,11 @@ FLAC::Picture::~Picture() delete d; } +int FLAC::Picture::code() const +{ + return FLAC::MetadataBlock::Picture; +} + bool FLAC::Picture::parse(const ByteVector &data) { if(data.size() < 32) { @@ -115,6 +120,25 @@ bool FLAC::Picture::parse(const ByteVector &data) return true; } +ByteVector FLAC::Picture::render() const +{ + ByteVector result; + result.append(ByteVector::fromUInt(d->type)); + ByteVector mimeTypeData = d->mimeType.data(String::UTF8); + result.append(ByteVector::fromUInt(mimeTypeData.size())); + result.append(mimeTypeData); + ByteVector descriptionData = d->description.data(String::UTF8); + result.append(ByteVector::fromUInt(descriptionData.size())); + result.append(descriptionData); + result.append(ByteVector::fromUInt(d->width)); + result.append(ByteVector::fromUInt(d->height)); + result.append(ByteVector::fromUInt(d->colorDepth)); + result.append(ByteVector::fromUInt(d->numColors)); + result.append(ByteVector::fromUInt(d->data.size())); + result.append(d->data); + return result; +} + FLAC::Picture::Type FLAC::Picture::type() const { return d->type; diff --git a/taglib/flac/flacpicture.h b/taglib/flac/flacpicture.h index a05f0666..447bcaf8 100644 --- a/taglib/flac/flacpicture.h +++ b/taglib/flac/flacpicture.h @@ -30,12 +30,13 @@ #include "tbytevector.h" #include "taglib_export.h" #include "attachedpictureframe.h" +#include "flacmetadatablock.h" namespace TagLib { namespace FLAC { - class TAGLIB_EXPORT Picture + class TAGLIB_EXPORT Picture : public MetadataBlock { public: typedef ID3v2::AttachedPictureFrame::Type Type; @@ -128,6 +129,16 @@ namespace TagLib { */ void setData(const ByteVector &data); + /*! + * Returns the FLAC metadata block type. + */ + int code() const; + + /*! + * Render the content of the block. + */ + ByteVector render() const; + bool parse(const ByteVector &rawData); private: diff --git a/taglib/flac/flacunknownmetadatablock.cpp b/taglib/flac/flacunknownmetadatablock.cpp new file mode 100644 index 00000000..e7d33d03 --- /dev/null +++ b/taglib/flac/flacunknownmetadatablock.cpp @@ -0,0 +1,83 @@ +/************************************************************************** + copyright : (C) 2010 by Lukáš Lalinský + email : lalinsky@gmail.com + **************************************************************************/ + +/*************************************************************************** + * This library is free software; you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License version * + * 2.1 as published by the Free Software Foundation. * + * * + * This library is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * + * USA * + * * + * Alternatively, this file is available under the Mozilla Public * + * License Version 1.1. You may obtain a copy of the License at * + * http://www.mozilla.org/MPL/ * + ***************************************************************************/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include "flacunknownmetadatablock.h" + +using namespace TagLib; + +class FLAC::UnknownMetadataBlock::UnknownMetadataBlockPrivate +{ +public: + UnknownMetadataBlockPrivate() : code(0) {} + + int code; + ByteVector data; +}; + +FLAC::UnknownMetadataBlock::UnknownMetadataBlock(int code, const ByteVector &data) +{ + d = new UnknownMetadataBlockPrivate; + d->code = code; + //debug(String(data.toHex())); + d->data = data; +} + +FLAC::UnknownMetadataBlock::~UnknownMetadataBlock() +{ + delete d; +} + +int FLAC::UnknownMetadataBlock::code() const +{ + return d->code; +} + +void FLAC::UnknownMetadataBlock::setCode(int code) +{ + d->code = code; +} + +ByteVector FLAC::UnknownMetadataBlock::data() const +{ + return d->data; +} + +void FLAC::UnknownMetadataBlock::setData(const ByteVector &data) +{ + d->data = data; +} + +ByteVector FLAC::UnknownMetadataBlock::render() const +{ + return d->data; +} + diff --git a/taglib/flac/flacunknownmetadatablock.h b/taglib/flac/flacunknownmetadatablock.h new file mode 100644 index 00000000..85e11fe4 --- /dev/null +++ b/taglib/flac/flacunknownmetadatablock.h @@ -0,0 +1,81 @@ +/************************************************************************** + copyright : (C) 2010 by Lukáš Lalinský + email : lalinsky@gmail.com + **************************************************************************/ + +/*************************************************************************** + * This library is free software; you can redistribute it and/or modify * + * it under the terms of the GNU Lesser General Public License version * + * 2.1 as published by the Free Software Foundation. * + * * + * This library is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; if not, write to the Free Software * + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * + * USA * + * * + * Alternatively, this file is available under the Mozilla Public * + * License Version 1.1. You may obtain a copy of the License at * + * http://www.mozilla.org/MPL/ * + ***************************************************************************/ + +#ifndef TAGLIB_FLACUNKNOWNMETADATABLOCK_H +#define TAGLIB_FLACUNKNOWNMETADATABLOCK_H + +#include "tlist.h" +#include "tbytevector.h" +#include "taglib_export.h" +#include "flacmetadatablock.h" + +namespace TagLib { + + namespace FLAC { + + class TAGLIB_EXPORT UnknownMetadataBlock : public MetadataBlock + { + public: + UnknownMetadataBlock(int blockType, const ByteVector &data); + ~UnknownMetadataBlock(); + + /*! + * Returns the FLAC metadata block type. + */ + int code() const; + + /*! + * Sets the FLAC metadata block type. + */ + void setCode(int code); + + /*! + * Returns the FLAC metadata block type. + */ + ByteVector data() const; + + /*! + * Sets the FLAC metadata block type. + */ + void setData(const ByteVector &data); + + /*! + * Render the content of the block. + */ + ByteVector render() const; + + private: + UnknownMetadataBlock(const MetadataBlock &item); + UnknownMetadataBlock &operator=(const MetadataBlock &item); + + class UnknownMetadataBlockPrivate; + UnknownMetadataBlockPrivate *d; + }; + + } + +} + +#endif diff --git a/taglib/toolkit/tbytevector.h b/taglib/toolkit/tbytevector.h index 8ec8c82c..7ae6aa25 100644 --- a/taglib/toolkit/tbytevector.h +++ b/taglib/toolkit/tbytevector.h @@ -386,8 +386,8 @@ namespace TagLib { static ByteVector null; /*! - * Returns a hex-encoded copy of the byte vector. - */ + * Returns a hex-encoded copy of the byte vector. + */ ByteVector toHex() const; protected: diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index a93e4c55..f06f2a4d 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -40,6 +40,9 @@ SET(test_runner_SRCS test_ogg.cpp test_oggflac.cpp test_flac.cpp + test_flacpicture.cpp + test_flacmetadatablocks.cpp + test_flacunknownmetadatablock.cpp test_ape.cpp test_apetag.cpp test_wav.cpp diff --git a/tests/test_flacmetadatablocks.cpp b/tests/test_flacmetadatablocks.cpp new file mode 100644 index 00000000..59954cad --- /dev/null +++ b/tests/test_flacmetadatablocks.cpp @@ -0,0 +1,41 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "utils.h" + +using namespace std; +using namespace TagLib; + +class TestFLACMetadataBlocks : public CppUnit::TestFixture +{ + CPPUNIT_TEST_SUITE(TestFLACMetadataBlocks); + CPPUNIT_TEST(testRead); + CPPUNIT_TEST_SUITE_END(); + +public: + + void testRead() + { + FLAC::File f("data/silence-44-s.flac"); + FLAC::MetadataBlocks b; + f.seek(4); + b.read(&f); + List blocks = b.metadataBlockList(); + CPPUNIT_ASSERT_EQUAL(TagLib::uint(5), blocks.size()); + CPPUNIT_ASSERT_EQUAL(0 + FLAC::MetadataBlock::StreamInfo, blocks[0]->code()); + CPPUNIT_ASSERT_EQUAL(0 + FLAC::MetadataBlock::SeekTable, blocks[1]->code()); + CPPUNIT_ASSERT_EQUAL(0 + FLAC::MetadataBlock::VorbisComment, blocks[2]->code()); + CPPUNIT_ASSERT_EQUAL(0 + FLAC::MetadataBlock::CueSheet, blocks[3]->code()); + CPPUNIT_ASSERT_EQUAL(0 + FLAC::MetadataBlock::Picture, blocks[4]->code()); + } + +}; + +CPPUNIT_TEST_SUITE_REGISTRATION(TestFLACMetadataBlocks); + diff --git a/tests/test_flacpicture.cpp b/tests/test_flacpicture.cpp new file mode 100644 index 00000000..180455cf --- /dev/null +++ b/tests/test_flacpicture.cpp @@ -0,0 +1,49 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "utils.h" + +using namespace std; +using namespace TagLib; + +class TestFLACPicture : public CppUnit::TestFixture +{ + CPPUNIT_TEST_SUITE(TestFLACPicture); + CPPUNIT_TEST(testParse); + CPPUNIT_TEST(testPassThrough); + CPPUNIT_TEST_SUITE_END(); + +public: + + void testParse() + { + char data[] = { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x09, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x00, 0x00, 0x00, 0x08, 0x41, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6C, 0x2E, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0x02, 0x00, 0x00, 0x00, 0x90, 0x77, 0x53, 0xDE, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x0B, 0x13, 0x01, 0x00, 0x9A, 0x9C, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4D, 0x45, 0x07, 0xD6, 0x0B, 0x1C, 0x0A, 0x36, 0x06, 0x08, 0x44, 0x3D, 0x32, 0x00, 0x00, 0x00, 0x1D, 0x74, 0x45, 0x58, 0x74, 0x43, 0x6F, 0x6D, 0x6D, 0x65, 0x6E, 0x74, 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x49, 0x4D, 0x50, 0xEF, 0x64, 0x25, 0x6E, 0x00, 0x00, 0x00, 0x0C, 0x49, 0x44, 0x41, 0x54, 0x08, 0xD7, 0x63, 0xF8, 0xFF, 0xFF, 0x3F, 0x00, 0x05, 0xFE, 0x02, 0xFE, 0xDC, 0xCC, 0x59, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 }; + FLAC::Picture pic(ByteVector(data, 199)); + + 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()); + } + + void testPassThrough() + { + char data[] = { 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x09, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, 0x00, 0x00, 0x00, 0x08, 0x41, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6C, 0x2E, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0x02, 0x00, 0x00, 0x00, 0x90, 0x77, 0x53, 0xDE, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x0B, 0x13, 0x01, 0x00, 0x9A, 0x9C, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74, 0x49, 0x4D, 0x45, 0x07, 0xD6, 0x0B, 0x1C, 0x0A, 0x36, 0x06, 0x08, 0x44, 0x3D, 0x32, 0x00, 0x00, 0x00, 0x1D, 0x74, 0x45, 0x58, 0x74, 0x43, 0x6F, 0x6D, 0x6D, 0x65, 0x6E, 0x74, 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x49, 0x4D, 0x50, 0xEF, 0x64, 0x25, 0x6E, 0x00, 0x00, 0x00, 0x0C, 0x49, 0x44, 0x41, 0x54, 0x08, 0xD7, 0x63, 0xF8, 0xFF, 0xFF, 0x3F, 0x00, 0x05, 0xFE, 0x02, 0xFE, 0xDC, 0xCC, 0x59, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 }; + FLAC::Picture pic(ByteVector(data, 199)); + CPPUNIT_ASSERT_EQUAL(ByteVector(data, 199), pic.render()); + } + +}; + +CPPUNIT_TEST_SUITE_REGISTRATION(TestFLACPicture); + diff --git a/tests/test_flacunknownmetadatablock.cpp b/tests/test_flacunknownmetadatablock.cpp new file mode 100644 index 00000000..2a99a1ee --- /dev/null +++ b/tests/test_flacunknownmetadatablock.cpp @@ -0,0 +1,38 @@ +#include +#include +#include +#include +#include +#include +#include +#include "utils.h" + +using namespace std; +using namespace TagLib; + +class TestFLACUnknownMetadataBlock : public CppUnit::TestFixture +{ + CPPUNIT_TEST_SUITE(TestFLACUnknownMetadataBlock); + CPPUNIT_TEST(testAccessors); + CPPUNIT_TEST_SUITE_END(); + +public: + + void testAccessors() + { + ByteVector data("abc\x01", 4); + FLAC::UnknownMetadataBlock block(42, data); + CPPUNIT_ASSERT_EQUAL(42, block.code()); + CPPUNIT_ASSERT_EQUAL(data, block.data()); + CPPUNIT_ASSERT_EQUAL(data, block.render()); + ByteVector data2("xxx", 3); + block.setCode(13); + block.setData(data2); + CPPUNIT_ASSERT_EQUAL(13, block.code()); + CPPUNIT_ASSERT_EQUAL(data2, block.data()); + CPPUNIT_ASSERT_EQUAL(data2, block.render()); + } + +}; + +CPPUNIT_TEST_SUITE_REGISTRATION(TestFLACUnknownMetadataBlock);