SVN commit 1148630 by lalinsky: Added FLAC::Properties::signature() BUG:160172 M +3 -0 NEWS M +8 -0 taglib/flac/flacproperties.cpp M +6 -0 taglib/flac/flacproperties.h M +16 -0 taglib/toolkit/tbytevector.cpp M +5 -0 taglib/toolkit/tbytevector.h M +8 -0 tests/test_bytevector.cpp M +7 -0 tests/test_flac.cpp --- trunk/kdesupport/taglib/NEWS #1148629:1148630 @@ -5,6 +5,9 @@ * 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) =========================== --- trunk/kdesupport/taglib/taglib/flac/flacproperties.cpp #1148629:1148630 @@ -52,6 +52,7 @@ int sampleRate; int sampleWidth; int channels; + ByteVector signature; }; //////////////////////////////////////////////////////////////////////////////// @@ -100,6 +101,11 @@ return d->channels; } +ByteVector FLAC::Properties::signature() const +{ + return d->signature; +} + //////////////////////////////////////////////////////////////////////////////// // private members //////////////////////////////////////////////////////////////////////////////// @@ -147,4 +153,6 @@ // Real bitrate: d->bitrate = d->length > 0 ? ((d->streamLength * 8UL) / d->length) / 1000 : 0; + + d->signature = d->data.mid(pos, 32); } --- trunk/kdesupport/taglib/taglib/flac/flacproperties.h #1148629:1148630 @@ -77,6 +77,12 @@ */ 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 &); --- trunk/kdesupport/taglib/taglib/toolkit/tbytevector.cpp #1148629:1148630 @@ -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 @@ 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 //////////////////////////////////////////////////////////////////////////////// --- trunk/kdesupport/taglib/taglib/toolkit/tbytevector.h #1148629:1148630 @@ -385,6 +385,11 @@ */ 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 --- trunk/kdesupport/taglib/tests/test_bytevector.cpp #1148629:1148630 @@ -37,6 +37,7 @@ CPPUNIT_TEST(testFind2); CPPUNIT_TEST(testRfind1); CPPUNIT_TEST(testRfind2); + CPPUNIT_TEST(testToHex); CPPUNIT_TEST_SUITE_END(); public: @@ -173,6 +174,13 @@ 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); --- trunk/kdesupport/taglib/tests/test_flac.cpp #1148629:1148630 @@ -13,11 +13,18 @@ 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");