summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2010-12-14 10:11:11 -0800
committerAndroid (Google) Code Review <android-gerrit@google.com>2010-12-14 10:11:11 -0800
commit93b47835ef496da664f98949ba3bb6c4583559a6 (patch)
tree074df0c4b6a5db44700dbe5d6ddc02a90b1e54ff /media
parentfeafefb1ed8d86100161f521fc7a44b819bd9529 (diff)
parent428d96d5f882d01acb0abb7e1ceb51d4ccc48efa (diff)
downloadframeworks_av-93b47835ef496da664f98949ba3bb6c4583559a6.zip
frameworks_av-93b47835ef496da664f98949ba3bb6c4583559a6.tar.gz
frameworks_av-93b47835ef496da664f98949ba3bb6c4583559a6.tar.bz2
Merge "Support malformed ID3 V2.4 tags written by early versions of iTunes."
Diffstat (limited to 'media')
-rw-r--r--media/libstagefright/id3/ID3.cpp28
-rw-r--r--media/libstagefright/include/ID3.h2
2 files changed, 25 insertions, 5 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;
diff --git a/media/libstagefright/include/ID3.h b/media/libstagefright/include/ID3.h
index 7ddbb41..98c82a4 100644
--- a/media/libstagefright/include/ID3.h
+++ b/media/libstagefright/include/ID3.h
@@ -80,7 +80,7 @@ private:
bool parseV1(const sp<DataSource> &source);
bool parseV2(const sp<DataSource> &source);
void removeUnsynchronization();
- bool removeUnsynchronizationV2_4();
+ bool removeUnsynchronizationV2_4(bool iTunesHack);
static bool ParseSyncsafeInteger(const uint8_t encoded[4], size_t *x);