diff options
author | Marco Nelissen <marcone@google.com> | 2012-03-19 13:49:43 -0700 |
---|---|---|
committer | Marco Nelissen <marcone@google.com> | 2012-03-20 08:46:11 -0700 |
commit | b636abde14f2612ea236257846b9ab15d87d4623 (patch) | |
tree | 2aa58e136a7d4cf3f00ebdbcdffc49f0ddef35ca /media/libstagefright/id3 | |
parent | 9e50385f34676d8fcb3b473ec4c9f5c388a4c887 (diff) | |
download | frameworks_av-b636abde14f2612ea236257846b9ab15d87d4623.zip frameworks_av-b636abde14f2612ea236257846b9ab15d87d4623.tar.gz frameworks_av-b636abde14f2612ea236257846b9ab15d87d4623.tar.bz2 |
Parse mp3 encoder padding/delay
Get the mp3 encoder padding and delay from a XING frame or iTunSMPB tag.
Change-Id: Icde598c8857d7e7c187a718f478ee9799d6a1b8a
Diffstat (limited to 'media/libstagefright/id3')
-rw-r--r-- | media/libstagefright/id3/ID3.cpp | 47 |
1 files changed, 36 insertions, 11 deletions
diff --git a/media/libstagefright/id3/ID3.cpp b/media/libstagefright/id3/ID3.cpp index 2e92926..ca14054 100644 --- a/media/libstagefright/id3/ID3.cpp +++ b/media/libstagefright/id3/ID3.cpp @@ -463,40 +463,65 @@ static void convertISO8859ToString8( tmp = NULL; } -void ID3::Iterator::getString(String8 *id) const { +// the 2nd argument is used to get the data following the \0 in a comment field +void ID3::Iterator::getString(String8 *id, String8 *comment) const { + getstring(id, false); + if (comment != NULL) { + getstring(comment, true); + } +} + +// comment fields (COM/COMM) contain an initial short descriptor, followed by \0, +// followed by more data. The data following the \0 can be retrieved by setting +// "otherdata" to true. +void ID3::Iterator::getstring(String8 *id, bool otherdata) const { id->setTo(""); - if (mFrameData == NULL) { + const uint8_t *frameData = mFrameData; + if (frameData == NULL) { return; } + uint8_t encoding = *frameData; + if (mParent.mVersion == ID3_V1 || mParent.mVersion == ID3_V1_1) { if (mOffset == 126 || mOffset == 127) { // Special treatment for the track number and genre. char tmp[16]; - sprintf(tmp, "%d", (int)*mFrameData); + sprintf(tmp, "%d", (int)*frameData); id->setTo(tmp); return; } - convertISO8859ToString8(mFrameData, mFrameSize, id); + convertISO8859ToString8(frameData, mFrameSize, id); return; } size_t n = mFrameSize - getHeaderLength() - 1; + if (otherdata) { + // skip past the encoding, language, and the 0 separator + frameData += 4; + int32_t i = n - 4; + while(--i >= 0 && *++frameData != 0) ; + int skipped = (frameData - mFrameData); + if (skipped >= n) { + return; + } + n -= skipped; + } - if (*mFrameData == 0x00) { + if (encoding == 0x00) { // ISO 8859-1 - convertISO8859ToString8(mFrameData + 1, n, id); - } else if (*mFrameData == 0x03) { + convertISO8859ToString8(frameData + 1, n, id); + } else if (encoding == 0x03) { // UTF-8 - id->setTo((const char *)(mFrameData + 1), n); - } else if (*mFrameData == 0x02) { + id->setTo((const char *)(frameData + 1), n); + } else if (encoding == 0x02) { // UTF-16 BE, no byte order mark. // API wants number of characters, not number of bytes... int len = n / 2; - const char16_t *framedata = (const char16_t *) (mFrameData + 1); + const char16_t *framedata = (const char16_t *) (frameData + 1); char16_t *framedatacopy = NULL; #if BYTE_ORDER == LITTLE_ENDIAN framedatacopy = new char16_t[len]; @@ -513,7 +538,7 @@ void ID3::Iterator::getString(String8 *id) const { // UCS-2 // API wants number of characters, not number of bytes... int len = n / 2; - const char16_t *framedata = (const char16_t *) (mFrameData + 1); + const char16_t *framedata = (const char16_t *) (frameData + 1); char16_t *framedatacopy = NULL; if (*framedata == 0xfffe) { // endianness marker doesn't match host endianness, convert |