From 04e6446531ccde144c9bf496a716847327ed655e Mon Sep 17 00:00:00 2001 From: Birunthan Mohanathas Date: Fri, 20 Apr 2012 20:07:46 +0300 Subject: [PATCH] NowPlaying.dll: Updated TagLib to 1.7.2 --- .../PluginNowPlaying/taglib/ape/apefooter.cpp | 2 +- .../taglib/ape/apeproperties.cpp | 2 +- .../PluginNowPlaying/taglib/asf/asffile.cpp | 70 ++++++++++++++++--- Plugins/PluginNowPlaying/taglib/asf/asffile.h | 8 +-- .../PluginNowPlaying/taglib/flac/flacfile.cpp | 6 +- .../taglib/mp4/mp4properties.cpp | 23 ++++-- .../taglib/mpeg/id3v1/id3v1tag.cpp | 7 +- .../taglib/mpeg/id3v2/id3v2framefactory.cpp | 5 +- .../taglib/mpeg/id3v2/id3v2header.cpp | 2 +- .../taglib/mpeg/id3v2/id3v2synchdata.cpp | 2 +- .../taglib/ogg/xiphcomment.cpp | 18 +++-- .../taglib/riff/aiff/aifffile.cpp | 5 ++ .../taglib/riff/aiff/aiffproperties.cpp | 2 +- .../PluginNowPlaying/taglib/riff/rifffile.cpp | 22 +++++- .../taglib/riff/wav/wavfile.cpp | 5 ++ .../PluginNowPlaying/taglib/taglib_export.h | 27 +++---- .../taglib/toolkit/tbytevector.cpp | 4 +- .../taglib/toolkit/tbytevector.h | 2 +- .../taglib/toolkit/tstring.cpp | 2 +- .../PluginNowPlaying/taglib/toolkit/tstring.h | 2 +- .../taglib/toolkit/tstringlist.h | 2 +- .../taglib/trueaudio/trueaudioproperties.cpp | 27 ++++--- 22 files changed, 178 insertions(+), 67 deletions(-) diff --git a/Plugins/PluginNowPlaying/taglib/ape/apefooter.cpp b/Plugins/PluginNowPlaying/taglib/ape/apefooter.cpp index 0805e9e0..1eaab254 100644 --- a/Plugins/PluginNowPlaying/taglib/ape/apefooter.cpp +++ b/Plugins/PluginNowPlaying/taglib/ape/apefooter.cpp @@ -24,7 +24,7 @@ * http://www.mozilla.org/MPL/ * ***************************************************************************/ -#include +#include #include #include diff --git a/Plugins/PluginNowPlaying/taglib/ape/apeproperties.cpp b/Plugins/PluginNowPlaying/taglib/ape/apeproperties.cpp index 3154d104..7f9cdb5a 100644 --- a/Plugins/PluginNowPlaying/taglib/ape/apeproperties.cpp +++ b/Plugins/PluginNowPlaying/taglib/ape/apeproperties.cpp @@ -193,7 +193,7 @@ void APE::Properties::analyzeCurrent() uint blocksPerFrame = header.mid(4, 4).toUInt(false); uint finalFrameBlocks = header.mid(8, 4).toUInt(false); uint totalBlocks = totalFrames > 0 ? (totalFrames - 1) * blocksPerFrame + finalFrameBlocks : 0; - d->length = totalBlocks / d->sampleRate; + d->length = d->sampleRate > 0 ? totalBlocks / d->sampleRate : 0; d->bitrate = d->length > 0 ? ((d->streamLength * 8L) / d->length) / 1000 : 0; } diff --git a/Plugins/PluginNowPlaying/taglib/asf/asffile.cpp b/Plugins/PluginNowPlaying/taglib/asf/asffile.cpp index 898c21d9..fbde6fa1 100644 --- a/Plugins/PluginNowPlaying/taglib/asf/asffile.cpp +++ b/Plugins/PluginNowPlaying/taglib/asf/asffile.cpp @@ -327,7 +327,16 @@ void ASF::File::HeaderExtensionObject::parse(ASF::File *file, uint /*size*/) long long dataPos = 0; while(dataPos < dataSize) { ByteVector guid = file->readBlock(16); - long long size = file->readQWORD(); + if(guid.size() != 16) { + file->setValid(false); + break; + } + bool ok; + long long size = file->readQWORD(&ok); + if(!ok) { + file->setValid(false); + break; + } BaseObject *obj; if(guid == metadataGuid) { obj = new MetadataObject(); @@ -397,19 +406,37 @@ void ASF::File::read(bool /*readProperties*/, Properties::ReadStyle /*properties ByteVector guid = readBlock(16); if(guid != headerGuid) { debug("ASF: Not an ASF file."); + setValid(false); return; } d->tag = new ASF::Tag(); d->properties = new ASF::Properties(); - d->size = readQWORD(); - int numObjects = readDWORD(); + bool ok; + d->size = readQWORD(&ok); + if(!ok) { + setValid(false); + return; + } + int numObjects = readDWORD(&ok); + if(!ok) { + setValid(false); + return; + } seek(2, Current); for(int i = 0; i < numObjects; i++) { ByteVector guid = readBlock(16); - long size = (long)readQWORD(); + if(guid.size() != 16) { + setValid(false); + break; + } + long size = (long)readQWORD(&ok); + if(!ok) { + setValid(false); + break; + } BaseObject *obj; if(guid == filePropertiesGuid) { obj = new FilePropertiesObject(); @@ -437,7 +464,12 @@ void ASF::File::read(bool /*readProperties*/, Properties::ReadStyle /*properties bool ASF::File::save() { if(readOnly()) { - debug("ASF: File is read-only."); + debug("ASF::File::save() -- File is read only."); + return false; + } + + if(!isValid()) { + debug("ASF::File::save() -- Trying to save invalid file."); return false; } @@ -499,27 +531,47 @@ bool ASF::File::save() // protected members //////////////////////////////////////////////////////////////////////////////// -int ASF::File::readBYTE() +int ASF::File::readBYTE(bool *ok) { ByteVector v = readBlock(1); + if(v.size() != 1) { + if(ok) *ok = false; + return 0; + } + if(ok) *ok = true; return v[0]; } -int ASF::File::readWORD() +int ASF::File::readWORD(bool *ok) { ByteVector v = readBlock(2); + if(v.size() != 2) { + if(ok) *ok = false; + return 0; + } + if(ok) *ok = true; return v.toUShort(false); } -unsigned int ASF::File::readDWORD() +unsigned int ASF::File::readDWORD(bool *ok) { ByteVector v = readBlock(4); + if(v.size() != 4) { + if(ok) *ok = false; + return 0; + } + if(ok) *ok = true; return v.toUInt(false); } -long long ASF::File::readQWORD() +long long ASF::File::readQWORD(bool *ok) { ByteVector v = readBlock(8); + if(v.size() != 8) { + if(ok) *ok = false; + return 0; + } + if(ok) *ok = true; return v.toLongLong(false); } diff --git a/Plugins/PluginNowPlaying/taglib/asf/asffile.h b/Plugins/PluginNowPlaying/taglib/asf/asffile.h index 9242aa68..45e603dc 100644 --- a/Plugins/PluginNowPlaying/taglib/asf/asffile.h +++ b/Plugins/PluginNowPlaying/taglib/asf/asffile.h @@ -88,10 +88,10 @@ namespace TagLib { private: - int readBYTE(); - int readWORD(); - unsigned int readDWORD(); - long long readQWORD(); + int readBYTE(bool *ok = 0); + int readWORD(bool *ok = 0); + unsigned int readDWORD(bool *ok = 0); + long long readQWORD(bool *ok = 0); static ByteVector renderString(const String &str, bool includeLength = false); String readString(int len); void read(bool readProperties, Properties::ReadStyle propertiesStyle); diff --git a/Plugins/PluginNowPlaying/taglib/flac/flacfile.cpp b/Plugins/PluginNowPlaying/taglib/flac/flacfile.cpp index c8cc1fb8..4e3d2b36 100644 --- a/Plugins/PluginNowPlaying/taglib/flac/flacfile.cpp +++ b/Plugins/PluginNowPlaying/taglib/flac/flacfile.cpp @@ -149,7 +149,7 @@ bool FLAC::File::save() // Create new vorbis comments - Tag::duplicate(&d->tag, xiphComment(true), true); + Tag::duplicate(&d->tag, xiphComment(true), false); d->xiphCommentData = xiphComment()->render(false); @@ -161,10 +161,12 @@ bool FLAC::File::save() MetadataBlock *block = d->blocks[i]; if(block->code() == MetadataBlock::VorbisComment) { // Set the new Vorbis Comment block + delete block; block = new UnknownMetadataBlock(MetadataBlock::VorbisComment, d->xiphCommentData); foundVorbisCommentBlock = true; } if(block->code() == MetadataBlock::Padding) { + delete block; continue; } newBlocks.append(block); @@ -190,7 +192,7 @@ bool FLAC::File::save() // Adjust the padding block(s) long originalLength = d->streamStart - d->flacStart; - int paddingLength = originalLength - data.size() - 4; + int paddingLength = originalLength - data.size() - 4; if (paddingLength < 0) { paddingLength = MinPaddingLength; } diff --git a/Plugins/PluginNowPlaying/taglib/mp4/mp4properties.cpp b/Plugins/PluginNowPlaying/taglib/mp4/mp4properties.cpp index a62bda99..c1f8d47c 100644 --- a/Plugins/PluginNowPlaying/taglib/mp4/mp4properties.cpp +++ b/Plugins/PluginNowPlaying/taglib/mp4/mp4properties.cpp @@ -91,15 +91,24 @@ MP4::Properties::Properties(File *file, MP4::Atoms *atoms, ReadStyle style) file->seek(mdhd->offset); data = file->readBlock(mdhd->length); - if(data[8] == 0) { - unsigned int unit = data.mid(20, 4).toUInt(); - unsigned int length = data.mid(24, 4).toUInt(); - d->length = length / unit; - } - else { + uint version = data[8]; + if(version == 1) { + if (data.size() < 36 + 8) { + debug("MP4: Atom 'trak.mdia.mdhd' is smaller than expected"); + return; + } long long unit = data.mid(28, 8).toLongLong(); long long length = data.mid(36, 8).toLongLong(); - d->length = int(length / unit); + d->length = unit ? int(length / unit) : 0; + } + else { + if (data.size() < 24 + 4) { + debug("MP4: Atom 'trak.mdia.mdhd' is smaller than expected"); + return; + } + unsigned int unit = data.mid(20, 4).toUInt(); + unsigned int length = data.mid(24, 4).toUInt(); + d->length = unit ? length / unit : 0; } MP4::Atom *atom = trak->find("mdia", "minf", "stbl", "stsd"); diff --git a/Plugins/PluginNowPlaying/taglib/mpeg/id3v1/id3v1tag.cpp b/Plugins/PluginNowPlaying/taglib/mpeg/id3v1/id3v1tag.cpp index 1457c81b..4a1d69b2 100644 --- a/Plugins/PluginNowPlaying/taglib/mpeg/id3v1/id3v1tag.cpp +++ b/Plugins/PluginNowPlaying/taglib/mpeg/id3v1/id3v1tag.cpp @@ -51,8 +51,7 @@ public: static const StringHandler *stringHandler; }; -static const StringHandler defaultStringHandler; -const ID3v1::StringHandler *ID3v1::Tag::TagPrivate::stringHandler = &defaultStringHandler; +const ID3v1::StringHandler *ID3v1::Tag::TagPrivate::stringHandler = new StringHandler; //////////////////////////////////////////////////////////////////////////////// // StringHandler implementation @@ -190,9 +189,7 @@ void ID3v1::Tag::setTrack(uint i) void ID3v1::Tag::setStringHandler(const StringHandler *handler) { - if(TagPrivate::stringHandler != &defaultStringHandler) - delete TagPrivate::stringHandler; - + delete TagPrivate::stringHandler; TagPrivate::stringHandler = handler; } diff --git a/Plugins/PluginNowPlaying/taglib/mpeg/id3v2/id3v2framefactory.cpp b/Plugins/PluginNowPlaying/taglib/mpeg/id3v2/id3v2framefactory.cpp index a1067acc..356d60d4 100644 --- a/Plugins/PluginNowPlaying/taglib/mpeg/id3v2/id3v2framefactory.cpp +++ b/Plugins/PluginNowPlaying/taglib/mpeg/id3v2/id3v2framefactory.cpp @@ -73,8 +73,9 @@ FrameFactory *FrameFactory::factory = 0; FrameFactory *FrameFactory::instance() { - static FrameFactory factory; - return &factory; + if(!factory) + factory = new FrameFactory; + return factory; } Frame *FrameFactory::createFrame(const ByteVector &data, bool synchSafeInts) const diff --git a/Plugins/PluginNowPlaying/taglib/mpeg/id3v2/id3v2header.cpp b/Plugins/PluginNowPlaying/taglib/mpeg/id3v2/id3v2header.cpp index 31a5a1ec..ef33af95 100644 --- a/Plugins/PluginNowPlaying/taglib/mpeg/id3v2/id3v2header.cpp +++ b/Plugins/PluginNowPlaying/taglib/mpeg/id3v2/id3v2header.cpp @@ -23,7 +23,7 @@ * http://www.mozilla.org/MPL/ * ***************************************************************************/ -#include +#include #include #include diff --git a/Plugins/PluginNowPlaying/taglib/mpeg/id3v2/id3v2synchdata.cpp b/Plugins/PluginNowPlaying/taglib/mpeg/id3v2/id3v2synchdata.cpp index 12e1f5b2..d4bab679 100644 --- a/Plugins/PluginNowPlaying/taglib/mpeg/id3v2/id3v2synchdata.cpp +++ b/Plugins/PluginNowPlaying/taglib/mpeg/id3v2/id3v2synchdata.cpp @@ -23,7 +23,7 @@ * http://www.mozilla.org/MPL/ * ***************************************************************************/ -#include +#include #include "id3v2synchdata.h" diff --git a/Plugins/PluginNowPlaying/taglib/ogg/xiphcomment.cpp b/Plugins/PluginNowPlaying/taglib/ogg/xiphcomment.cpp index 344d9cfc..b9f408f6 100644 --- a/Plugins/PluginNowPlaying/taglib/ogg/xiphcomment.cpp +++ b/Plugins/PluginNowPlaying/taglib/ogg/xiphcomment.cpp @@ -287,7 +287,7 @@ void Ogg::XiphComment::parse(const ByteVector &data) int pos = 0; - int vendorLength = data.mid(0, 4).toUInt(false); + uint vendorLength = data.mid(0, 4).toUInt(false); pos += 4; d->vendorID = String(data.mid(pos, vendorLength), String::UTF8); @@ -295,21 +295,31 @@ void Ogg::XiphComment::parse(const ByteVector &data) // Next the number of fields in the comment vector. - int commentFields = data.mid(pos, 4).toUInt(false); + uint commentFields = data.mid(pos, 4).toUInt(false); pos += 4; - for(int i = 0; i < commentFields; i++) { + if(commentFields > (data.size() - 8) / 4) { + return; + } + + for(uint i = 0; i < commentFields; i++) { // Each comment field is in the format "KEY=value" in a UTF8 string and has // 4 bytes before the text starts that gives the length. - int commentLength = data.mid(pos, 4).toUInt(false); + uint commentLength = data.mid(pos, 4).toUInt(false); pos += 4; String comment = String(data.mid(pos, commentLength), String::UTF8); pos += commentLength; + if(pos > data.size()) { + break; + } int commentSeparatorPosition = comment.find("="); + if(commentSeparatorPosition == -1) { + break; + } String key = comment.substr(0, commentSeparatorPosition); String value = comment.substr(commentSeparatorPosition + 1); diff --git a/Plugins/PluginNowPlaying/taglib/riff/aiff/aifffile.cpp b/Plugins/PluginNowPlaying/taglib/riff/aiff/aifffile.cpp index 425bfa02..72667f6e 100644 --- a/Plugins/PluginNowPlaying/taglib/riff/aiff/aifffile.cpp +++ b/Plugins/PluginNowPlaying/taglib/riff/aiff/aifffile.cpp @@ -87,6 +87,11 @@ bool RIFF::AIFF::File::save() return false; } + if(!isValid()) { + debug("RIFF::AIFF::File::save() -- Trying to save invalid file."); + return false; + } + setChunkData(d->tagChunkID, d->tag->render()); return true; diff --git a/Plugins/PluginNowPlaying/taglib/riff/aiff/aiffproperties.cpp b/Plugins/PluginNowPlaying/taglib/riff/aiff/aiffproperties.cpp index 77c3d277..afb741b7 100644 --- a/Plugins/PluginNowPlaying/taglib/riff/aiff/aiffproperties.cpp +++ b/Plugins/PluginNowPlaying/taglib/riff/aiff/aiffproperties.cpp @@ -149,5 +149,5 @@ void RIFF::AIFF::Properties::read(const ByteVector &data) double sampleRate = ConvertFromIeeeExtended(reinterpret_cast(data.mid(8, 10).data())); d->sampleRate = sampleRate; d->bitrate = (sampleRate * d->sampleWidth * d->channels) / 1000.0; - d->length = sampleFrames / d->sampleRate; + d->length = d->sampleRate > 0 ? sampleFrames / d->sampleRate : 0; } diff --git a/Plugins/PluginNowPlaying/taglib/riff/rifffile.cpp b/Plugins/PluginNowPlaying/taglib/riff/rifffile.cpp index 8d23bcd6..a3ca0e3e 100644 --- a/Plugins/PluginNowPlaying/taglib/riff/rifffile.cpp +++ b/Plugins/PluginNowPlaying/taglib/riff/rifffile.cpp @@ -194,6 +194,19 @@ void RIFF::File::setChunkData(const ByteVector &name, const ByteVector &data) // private members //////////////////////////////////////////////////////////////////////////////// +static bool isValidChunkID(const ByteVector &name) +{ + if(name.size() != 4) { + return false; + } + for(int i = 0; i < 4; i++) { + if(name[i] < 32 || name[i] > 127) { + return false; + } + } + return true; +} + void RIFF::File::read() { bool bigEndian = (d->endianness == BigEndian); @@ -207,8 +220,15 @@ void RIFF::File::read() ByteVector chunkName = readBlock(4); uint chunkSize = readBlock(4).toUInt(bigEndian); + if(!isValidChunkID(chunkName)) { + debug("RIFF::File::read() -- Chunk '" + chunkName + "' has invalid ID"); + setValid(false); + break; + } + if(tell() + chunkSize > uint(length())) { - // something wrong + debug("RIFF::File::read() -- Chunk '" + chunkName + "' has invalid size (larger than the file size)"); + setValid(false); break; } diff --git a/Plugins/PluginNowPlaying/taglib/riff/wav/wavfile.cpp b/Plugins/PluginNowPlaying/taglib/riff/wav/wavfile.cpp index 9ec3b510..37d8a4d2 100644 --- a/Plugins/PluginNowPlaying/taglib/riff/wav/wavfile.cpp +++ b/Plugins/PluginNowPlaying/taglib/riff/wav/wavfile.cpp @@ -87,6 +87,11 @@ bool RIFF::WAV::File::save() return false; } + if(!isValid()) { + debug("RIFF::WAV::File::save() -- Trying to save invalid file."); + return false; + } + setChunkData(d->tagChunkID, d->tag->render()); return true; diff --git a/Plugins/PluginNowPlaying/taglib/taglib_export.h b/Plugins/PluginNowPlaying/taglib/taglib_export.h index 82122af5..486b39b0 100644 --- a/Plugins/PluginNowPlaying/taglib/taglib_export.h +++ b/Plugins/PluginNowPlaying/taglib/taglib_export.h @@ -15,8 +15,8 @@ * * * 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 * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * + * 02110-1301 USA * * * * Alternatively, this file is available under the Mozilla Public * * License Version 1.1. You may obtain a copy of the License at * @@ -26,18 +26,21 @@ #ifndef TAGLIB_EXPORT_H #define TAGLIB_EXPORT_H +#define TAGLIB_STATIC -/* -#if (defined(_WIN32) || defined(_WIN64)) && (!defined(MAKE_TAGLIB_STATIC)) - #ifdef MAKE_TAGLIB_LIB - #define TAGLIB_EXPORT __declspec(dllexport) - #else - #define TAGLIB_EXPORT __declspec(dllimport) - #endif +#if defined(TAGLIB_STATIC) +#define TAGLIB_EXPORT +#elif (defined(_WIN32) || defined(_WIN64)) +#ifdef MAKE_TAGLIB_LIB +#define TAGLIB_EXPORT __declspec(dllexport) #else -*/ - #define TAGLIB_EXPORT -//#endif +#define TAGLIB_EXPORT __declspec(dllimport) +#endif +#elif defined(__GNUC__) && (__GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ >= 1) +#define TAGLIB_EXPORT __attribute__ ((visibility("default"))) +#else +#define TAGLIB_EXPORT +#endif #ifndef TAGLIB_NO_CONFIG #include "taglib_config.h" diff --git a/Plugins/PluginNowPlaying/taglib/toolkit/tbytevector.cpp b/Plugins/PluginNowPlaying/taglib/toolkit/tbytevector.cpp index 9fb77b12..d8c4253f 100644 --- a/Plugins/PluginNowPlaying/taglib/toolkit/tbytevector.cpp +++ b/Plugins/PluginNowPlaying/taglib/toolkit/tbytevector.cpp @@ -23,7 +23,7 @@ * http://www.mozilla.org/MPL/ * ***************************************************************************/ -#include +#include #include #include @@ -363,7 +363,7 @@ ByteVector ByteVector::mid(uint index, uint length) const ConstIterator endIt; - if(length < 0xffffffff && length + index < size()) + if(length < size() - index) endIt = d->data.begin() + index + length; else endIt = d->data.end(); diff --git a/Plugins/PluginNowPlaying/taglib/toolkit/tbytevector.h b/Plugins/PluginNowPlaying/taglib/toolkit/tbytevector.h index b7fffdde..b52a2149 100644 --- a/Plugins/PluginNowPlaying/taglib/toolkit/tbytevector.h +++ b/Plugins/PluginNowPlaying/taglib/toolkit/tbytevector.h @@ -30,7 +30,7 @@ #include "taglib_export.h" #include -#include +#include namespace TagLib { diff --git a/Plugins/PluginNowPlaying/taglib/toolkit/tstring.cpp b/Plugins/PluginNowPlaying/taglib/toolkit/tstring.cpp index 99a10b10..484991ea 100644 --- a/Plugins/PluginNowPlaying/taglib/toolkit/tstring.cpp +++ b/Plugins/PluginNowPlaying/taglib/toolkit/tstring.cpp @@ -27,7 +27,7 @@ #include "unicode.h" #include "tdebug.h" -#include +#include #include diff --git a/Plugins/PluginNowPlaying/taglib/toolkit/tstring.h b/Plugins/PluginNowPlaying/taglib/toolkit/tstring.h index 693d043f..218a1dea 100644 --- a/Plugins/PluginNowPlaying/taglib/toolkit/tstring.h +++ b/Plugins/PluginNowPlaying/taglib/toolkit/tstring.h @@ -31,7 +31,7 @@ #include "tbytevector.h" #include -#include +#include /*! * \relates TagLib::String diff --git a/Plugins/PluginNowPlaying/taglib/toolkit/tstringlist.h b/Plugins/PluginNowPlaying/taglib/toolkit/tstringlist.h index 3ef131dc..f94b50f5 100644 --- a/Plugins/PluginNowPlaying/taglib/toolkit/tstringlist.h +++ b/Plugins/PluginNowPlaying/taglib/toolkit/tstringlist.h @@ -31,7 +31,7 @@ #include "tbytevectorlist.h" #include "taglib_export.h" -#include +#include namespace TagLib { diff --git a/Plugins/PluginNowPlaying/taglib/trueaudio/trueaudioproperties.cpp b/Plugins/PluginNowPlaying/taglib/trueaudio/trueaudioproperties.cpp index 5b1bf12d..3cab855b 100644 --- a/Plugins/PluginNowPlaying/taglib/trueaudio/trueaudioproperties.cpp +++ b/Plugins/PluginNowPlaying/taglib/trueaudio/trueaudioproperties.cpp @@ -118,19 +118,26 @@ void TrueAudio::Properties::read() int pos = 3; d->version = d->data[pos] - '0'; - pos += 1 + 2; + pos += 1; - d->channels = d->data.mid(pos, 2).toShort(false); - pos += 2; + // According to http://en.true-audio.com/TTA_Lossless_Audio_Codec_-_Format_Description + // TTA2 headers are in development, and have a different format + if(1 == d->version) { + // Skip the audio format + pos += 2; - d->bitsPerSample = d->data.mid(pos, 2).toShort(false); - pos += 2; + d->channels = d->data.mid(pos, 2).toShort(false); + pos += 2; - d->sampleRate = d->data.mid(pos, 4).toUInt(false); - pos += 4; + d->bitsPerSample = d->data.mid(pos, 2).toShort(false); + pos += 2; - unsigned long samples = d->data.mid(pos, 4).toUInt(false); - d->length = samples / d->sampleRate; + d->sampleRate = d->data.mid(pos, 4).toUInt(false); + pos += 4; - d->bitrate = d->length > 0 ? ((d->streamLength * 8L) / d->length) / 1000 : 0; + uint sampleFrames = d->data.mid(pos, 4).toUInt(false); + d->length = d->sampleRate > 0 ? sampleFrames / d->sampleRate : 0; + + d->bitrate = d->length > 0 ? ((d->streamLength * 8L) / d->length) / 1000 : 0; + } }