diff options
author | Andreas Huber <andih@google.com> | 2010-12-14 09:49:29 -0800 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2010-12-14 09:51:11 -0800 |
commit | 428d96d5f882d01acb0abb7e1ceb51d4ccc48efa (patch) | |
tree | a1be1118038ea4bcaa3aaa634412f778acbcf755 /media/libstagefright/id3 | |
parent | 985f838934510983d8a887461e98dca60a6e858f (diff) | |
download | frameworks_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')
-rw-r--r-- | media/libstagefright/id3/ID3.cpp | 28 |
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; |