diff options
author | Andreas Huber <andih@google.com> | 2010-12-14 10:11:11 -0800 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2010-12-14 10:11:11 -0800 |
commit | 93b47835ef496da664f98949ba3bb6c4583559a6 (patch) | |
tree | 074df0c4b6a5db44700dbe5d6ddc02a90b1e54ff /media | |
parent | feafefb1ed8d86100161f521fc7a44b819bd9529 (diff) | |
parent | 428d96d5f882d01acb0abb7e1ceb51d4ccc48efa (diff) | |
download | frameworks_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.cpp | 28 | ||||
-rw-r--r-- | media/libstagefright/include/ID3.h | 2 |
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); |