aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTsuda Kageyu <tsuda.kageyu@gmail.com>2017-02-07 22:37:13 +0900
committerTsuda Kageyu <tsuda.kageyu@gmail.com>2017-02-07 22:37:13 +0900
commitbf7ee62dc6369421fa29205d15ea7968e89f9b98 (patch)
treea57cc59951f9461496ce70ffa9546232d7699e1c
parentf76b1e54296a71ec52664ebb411a2ba127ede67d (diff)
parentf7b15fad2036f61ecb919dfd69e3455c4d501ad5 (diff)
Merge branch 'filetype-detection' of https://github.com/TsudaKageyu/taglib into filetype-detection
-rw-r--r--taglib/mpeg/mpegfile.cpp16
-rw-r--r--taglib/tagutils.cpp6
-rw-r--r--taglib/tagutils.h3
3 files changed, 11 insertions, 14 deletions
diff --git a/taglib/mpeg/mpegfile.cpp b/taglib/mpeg/mpegfile.cpp
index 75478ed8..217b03dd 100644
--- a/taglib/mpeg/mpegfile.cpp
+++ b/taglib/mpeg/mpegfile.cpp
@@ -105,23 +105,15 @@ bool MPEG::File::isSupported(IOStream *stream)
// MPEG frame headers are really confusing with irrelevant binary data.
// So we check if a frame header is really valid.
- const long originalPosition = stream->tell();
-
- long bufferOffset = 0;
-
- stream->seek(0);
- const ByteVector data = stream->readBlock(ID3v2::Header::size());
- if(data.startsWith(ID3v2::Header::fileIdentifier()))
- bufferOffset = ID3v2::Header(data).completeTagSize();
-
- stream->seek(bufferOffset);
- const ByteVector buffer = stream->readBlock(bufferSize());
+ long headerOffset;
+ const ByteVector buffer = Utils::readHeader(stream, bufferSize(), true, &headerOffset);
+ const long originalPosition = stream->tell();
AdapterFile file(stream);
for(unsigned int i = 0; i < buffer.size() - 1; ++i) {
if(isFrameSync(buffer, i)) {
- const Header header(&file, bufferOffset + i, true);
+ const Header header(&file, headerOffset + i, true);
if(header.isValid()) {
stream->seek(originalPosition);
return true;
diff --git a/taglib/tagutils.cpp b/taglib/tagutils.cpp
index e27fd8bd..d6d92406 100644
--- a/taglib/tagutils.cpp
+++ b/taglib/tagutils.cpp
@@ -78,7 +78,8 @@ long Utils::findAPE(File *file, long id3v1Location)
return -1;
}
-ByteVector TagLib::Utils::readHeader(IOStream *stream, unsigned int length, bool skipID3v2)
+ByteVector TagLib::Utils::readHeader(IOStream *stream, unsigned int length,
+ bool skipID3v2, long *headerOffset)
{
if(!stream || !stream->isOpen())
return ByteVector();
@@ -97,5 +98,8 @@ ByteVector TagLib::Utils::readHeader(IOStream *stream, unsigned int length, bool
const ByteVector header = stream->readBlock(length);
stream->seek(originalPosition);
+ if(headerOffset)
+ *headerOffset = bufferOffset;
+
return header;
}
diff --git a/taglib/tagutils.h b/taglib/tagutils.h
index 4014c673..4488a32b 100644
--- a/taglib/tagutils.h
+++ b/taglib/tagutils.h
@@ -45,7 +45,8 @@ namespace TagLib {
long findAPE(File *file, long id3v1Location);
- ByteVector readHeader(IOStream *stream, unsigned int length, bool skipID3v2);
+ ByteVector readHeader(IOStream *stream, unsigned int length, bool skipID3v2,
+ long *headerOffset = 0);
}
}