From 7426a64d2b16ceec007f1483aabb2dcebf27ee15 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Luk=C3=A1=C5=A1=20Lalinsk=C3=BD?= Date: Sun, 11 Jul 2010 10:26:35 +0000 Subject: [PATCH] Added FLAC::Properties::signature() BUG:160172 git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@1148630 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- NEWS | 3 +++ taglib/flac/flacproperties.cpp | 8 ++++++++ taglib/flac/flacproperties.h | 6 ++++++ taglib/toolkit/tbytevector.cpp | 16 ++++++++++++++++ taglib/toolkit/tbytevector.h | 5 +++++ tests/test_bytevector.cpp | 8 ++++++++ tests/test_flac.cpp | 7 +++++++ 7 files changed, 53 insertions(+) diff --git a/NEWS b/NEWS index 102ecda3..6ded56fa 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,9 @@ TagLib 1.7 * Implemented APE::Tag::isEmpty() to check for all APE tags, not just the basic ones. * Added reading of WAV audio length. (BUG:116033) + * Exposed FLAC MD5 signature of the uncompressed audio stream via + FLAC::Properties::signature(). (BUG:160172) + * Added function ByteVector::toHex() for hex-encoding of byte vectors. TagLib 1.6.3 (Apr 17, 2010) =========================== diff --git a/taglib/flac/flacproperties.cpp b/taglib/flac/flacproperties.cpp index f1370590..ab5026ef 100644 --- a/taglib/flac/flacproperties.cpp +++ b/taglib/flac/flacproperties.cpp @@ -52,6 +52,7 @@ public: int sampleRate; int sampleWidth; int channels; + ByteVector signature; }; //////////////////////////////////////////////////////////////////////////////// @@ -100,6 +101,11 @@ int FLAC::Properties::channels() const return d->channels; } +ByteVector FLAC::Properties::signature() const +{ + return d->signature; +} + //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// @@ -147,4 +153,6 @@ void FLAC::Properties::read() // Real bitrate: d->bitrate = d->length > 0 ? ((d->streamLength * 8UL) / d->length) / 1000 : 0; + + d->signature = d->data.mid(pos, 32); } diff --git a/taglib/flac/flacproperties.h b/taglib/flac/flacproperties.h index 9ac67664..64613a4b 100644 --- a/taglib/flac/flacproperties.h +++ b/taglib/flac/flacproperties.h @@ -77,6 +77,12 @@ namespace TagLib { */ int sampleWidth() const; + /*! + * Returns the MD5 signature of the uncompressed audio stream as read + * from the stream info header header. + */ + ByteVector signature() const; + private: Properties(const Properties &); Properties &operator=(const Properties &); diff --git a/taglib/toolkit/tbytevector.cpp b/taglib/toolkit/tbytevector.cpp index 76679776..3545e8a9 100644 --- a/taglib/toolkit/tbytevector.cpp +++ b/taglib/toolkit/tbytevector.cpp @@ -42,6 +42,8 @@ #define DATA(x) (&(x->data[0])) namespace TagLib { + static const char hexTable[17] = "0123456789abcdef"; + static const uint crcTable[256] = { 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, @@ -653,6 +655,20 @@ ByteVector &ByteVector::operator=(const char *data) return *this; } +ByteVector ByteVector::toHex() const +{ + ByteVector encoded(size() * 2); + + uint j = 0; + for(uint i = 0; i < size(); i++) { + unsigned char c = d->data[i]; + encoded[j++] = hexTable[(c >> 4) & 0x0F]; + encoded[j++] = hexTable[(c ) & 0x0F]; + } + + return encoded; +} + //////////////////////////////////////////////////////////////////////////////// // protected members //////////////////////////////////////////////////////////////////////////////// diff --git a/taglib/toolkit/tbytevector.h b/taglib/toolkit/tbytevector.h index 16d42e64..3c997bf3 100644 --- a/taglib/toolkit/tbytevector.h +++ b/taglib/toolkit/tbytevector.h @@ -385,6 +385,11 @@ namespace TagLib { */ static ByteVector null; + /*! + * Returns a hex-encoded copy of the byte vector. + */ + ByteVector toHex() const; + protected: /* * If this ByteVector is being shared via implicit sharing, do a deep copy diff --git a/tests/test_bytevector.cpp b/tests/test_bytevector.cpp index f92fce01..6b4dae3c 100644 --- a/tests/test_bytevector.cpp +++ b/tests/test_bytevector.cpp @@ -37,6 +37,7 @@ class TestByteVector : public CppUnit::TestFixture CPPUNIT_TEST(testFind2); CPPUNIT_TEST(testRfind1); CPPUNIT_TEST(testRfind2); + CPPUNIT_TEST(testToHex); CPPUNIT_TEST_SUITE_END(); public: @@ -173,6 +174,13 @@ public: CPPUNIT_ASSERT_EQUAL(10, r4.rfind("OggS", 12)); } + void testToHex() + { + ByteVector v("\xf0\xe1\xd2\xc3\xb4\xa5\x96\x87\x78\x69\x5a\x4b\x3c\x2d\x1e\x0f", 16); + + CPPUNIT_ASSERT_EQUAL(ByteVector("f0e1d2c3b4a5968778695a4b3c2d1e0f"), v.toHex()); + } + }; CPPUNIT_TEST_SUITE_REGISTRATION(TestByteVector); diff --git a/tests/test_flac.cpp b/tests/test_flac.cpp index 0901c69f..990299b2 100644 --- a/tests/test_flac.cpp +++ b/tests/test_flac.cpp @@ -13,11 +13,18 @@ using namespace TagLib; class TestFLAC : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TestFLAC); + CPPUNIT_TEST(testSignature); CPPUNIT_TEST(testMultipleCommentBlocks); CPPUNIT_TEST_SUITE_END(); public: + void testSignature() + { + FLAC::File f("data/no-tags.flac"); + CPPUNIT_ASSERT_EQUAL(ByteVector("a1b141f766e9849ac3db1030a20a3c77"), f.audioProperties()->signature().toHex()); + } + void testMultipleCommentBlocks() { ScopedFileCopy copy("multiple-vc", ".flac"); -- 2.40.0