summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/id3/ID3.cpp
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2010-12-14 09:49:29 -0800
committerAndreas Huber <andih@google.com>2010-12-14 09:51:11 -0800
commit428d96d5f882d01acb0abb7e1ceb51d4ccc48efa (patch)
treea1be1118038ea4bcaa3aaa634412f778acbcf755 /media/libstagefright/id3/ID3.cpp
parent985f838934510983d8a887461e98dca60a6e858f (diff)
downloadframeworks_av-428d96d5f882d01acb0abb7e1ceb51d4ccc48efa.zip
frameworks_av-428d96d5f882d01acb0abb7e1ceb51d4ccc48efa.tar.gz
frameworks_av-428d96d5f882d01acb0abb7e1ceb51d4ccc48efa.tar.bz2
Support malformed ID3 V2.4 tags written by early versions of iTunes.
Change-Id: I90c2a9bbf216e2ae9a37accdaa2214233f5e54ea related-to-bug: 3275576
Diffstat (limited to 'media/libstagefright/id3/ID3.cpp')
-rw-r--r--media/libstagefright/id3/ID3.cpp28
1 files changed, 24 insertions, 4 deletions
diff --git a/media/libstagefright/id3/ID3.cpp b/media/libstagefright/id3/ID3.cpp
index e9131a6..45e018d 100644
--- a/media/libstagefright/id3/ID3.cpp
+++ b/media/libstagefright/id3/ID3.cpp
@@ -149,7 +149,25 @@ struct id3_header {
}
if (header.version_major == 4) {
- if (!removeUnsynchronizationV2_4()) {
+ void *copy = malloc(size);
+ memcpy(copy, mData, size);
+
+ bool success = removeUnsynchronizationV2_4(false /* iTunesHack */);
+ if (!success) {
+ memcpy(mData, copy, size);
+ mSize = size;
+
+ success = removeUnsynchronizationV2_4(true /* iTunesHack */);
+
+ if (success) {
+ LOGV("Had to apply the iTunes hack to parse this ID3 tag");
+ }
+ }
+
+ free(copy);
+ copy = NULL;
+
+ if (!success) {
free(mData);
mData = NULL;
@@ -261,7 +279,7 @@ static void WriteSyncsafeInteger(uint8_t *dst, size_t x) {
}
}
-bool ID3::removeUnsynchronizationV2_4() {
+bool ID3::removeUnsynchronizationV2_4(bool iTunesHack) {
size_t oldSize = mSize;
size_t offset = 0;
@@ -271,7 +289,9 @@ bool ID3::removeUnsynchronizationV2_4() {
}
size_t dataSize;
- if (!ParseSyncsafeInteger(&mData[offset + 4], &dataSize)) {
+ if (iTunesHack) {
+ dataSize = U32_AT(&mData[offset + 4]);
+ } else if (!ParseSyncsafeInteger(&mData[offset + 4], &dataSize)) {
return false;
}
@@ -308,7 +328,7 @@ bool ID3::removeUnsynchronizationV2_4() {
flags &= ~2;
}
- if (flags != prevFlags) {
+ if (flags != prevFlags || iTunesHack) {
WriteSyncsafeInteger(&mData[offset + 4], dataSize);
mData[offset + 8] = flags >> 8;
mData[offset + 9] = flags & 0xff;