aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRechi <Rechi@users.noreply.github.com>2017-01-26 08:44:25 +0100
committerRechi <Rechi@users.noreply.github.com>2017-01-26 08:44:25 +0100
commita76c914e26bc926cb34827732962ca1837085e4c (patch)
tree3e7cc04209ebf226302130dd01f530ac9160ba19
parenta02f481efc91cde504c72de3559aad21df1cd4c3 (diff)
[depends] patch taglib: Efficient lookup for an ID3v2 tag in MPEG files with garbage.
-rw-r--r--tools/depends/target/taglib/ID3v2Lookup.patch72
-rw-r--r--tools/depends/target/taglib/Makefile3
2 files changed, 74 insertions, 1 deletions
diff --git a/tools/depends/target/taglib/ID3v2Lookup.patch b/tools/depends/target/taglib/ID3v2Lookup.patch
new file mode 100644
index 0000000000..b31cf6a089
--- /dev/null
+++ b/tools/depends/target/taglib/ID3v2Lookup.patch
@@ -0,0 +1,72 @@
+From d2e0e5522308ce4c905c205c7bf5972ea71cd6e5 Mon Sep 17 00:00:00 2001
+From: Tsuda Kageyu <tsuda.kageyu@gmail.com>
+Date: Fri, 20 Jan 2017 21:14:38 +0900
+Subject: [PATCH] Efficient lookup for an ID3v2 tag in MPEG files with garbage.
+
+This looks for an ID3v2 tag until reaching the first valid MPEG frame in O(n) time.
+---
+ taglib/mpeg/mpegfile.cpp | 45 +++++++++++++++++++++++++++++----------------
+ 1 file changed, 29 insertions(+), 16 deletions(-)
+
+diff --git a/taglib/mpeg/mpegfile.cpp b/taglib/mpeg/mpegfile.cpp
+index af7253f..c634eeb 100644
+--- a/taglib/mpeg/mpegfile.cpp
++++ b/taglib/mpeg/mpegfile.cpp
+@@ -488,28 +488,41 @@ long MPEG::File::findID3v2()
+ const ByteVector headerID = ID3v2::Header::fileIdentifier();
+
+ seek(0);
++ if(readBlock(headerID.size()) == headerID)
++ return 0;
+
+- const ByteVector data = readBlock(headerID.size());
+- if(data.size() < headerID.size())
++ Header firstHeader(this, 0, true);
++ if(firstHeader.isValid())
+ return -1;
+
+- if(data == headerID)
+- return 0;
++ // Look for an ID3v2 tag until reaching the first valid MPEG frame.
+
+- if(firstSyncByte(data[0]) && secondSynchByte(data[1]))
+- return -1;
++ char frameSyncBytes[2] = {};
++ char tagHeaderBytes[4] = {};
++ long position = 0;
+
+- // Look for the entire file, if neither an MEPG frame or ID3v2 tag was found
+- // at the beginning of the file.
+- // We don't care about the inefficiency of the code, since this is a seldom case.
++ while(true) {
++ seek(position);
++ const ByteVector buffer = readBlock(bufferSize());
++ if(buffer.isEmpty())
++ return -1;
+
+- const long tagOffset = find(headerID);
+- if(tagOffset < 0)
+- return -1;
++ for(unsigned int i = 0; i < buffer.size(); ++i) {
++ frameSyncBytes[0] = frameSyncBytes[1];
++ frameSyncBytes[1] = buffer[i];
++ if(firstSyncByte(frameSyncBytes[0]) && secondSynchByte(frameSyncBytes[1])) {
++ Header header(this, position + i - 1, true);
++ if(header.isValid())
++ return -1;
++ }
+
+- const long frameOffset = firstFrameOffset();
+- if(frameOffset < tagOffset)
+- return -1;
++ tagHeaderBytes[0] = tagHeaderBytes[1];
++ tagHeaderBytes[1] = tagHeaderBytes[2];
++ tagHeaderBytes[2] = buffer[i];
++ if(headerID == tagHeaderBytes)
++ return position + i - 2;
++ }
+
+- return tagOffset;
++ position += bufferSize();
++ }
+ }
diff --git a/tools/depends/target/taglib/Makefile b/tools/depends/target/taglib/Makefile
index bc619c045b..069de1a65c 100644
--- a/tools/depends/target/taglib/Makefile
+++ b/tools/depends/target/taglib/Makefile
@@ -1,5 +1,5 @@
include ../../Makefile.include
-DEPS= ../../Makefile.include Makefile
+DEPS= ../../Makefile.include Makefile ID3v2Lookup.patch
LIBNAME=taglib
VERSION=1.11
@@ -16,6 +16,7 @@ $(PLATFORM): $(TARBALLS_LOCATION)/$(ARCHIVE) $(DEPS)
rm -rf $(PLATFORM); mkdir -p $(PLATFORM)
cd $(PLATFORM); $(ARCHIVE_TOOL) $(ARCHIVE_TOOL_FLAGS) $(TARBALLS_LOCATION)/$(ARCHIVE)
cd $(PLATFORM); rm -rf build; mkdir -p build
+ cd $(PLATFORM); patch -p1 -i ../ID3v2Lookup.patch
cd $(PLATFORM)/build; $(CMAKE) -DCMAKE_LIBRARY_PATH=$(TOOLCHAIN)/lib/$(HOST) -DBUILD_SHARED_LIBS=OFF ..
$(LIBDYLIB): $(PLATFORM)