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/XINGSeeker.cpp | |
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/XINGSeeker.cpp')
-rw-r--r-- | media/libstagefright/XINGSeeker.cpp | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/media/libstagefright/XINGSeeker.cpp b/media/libstagefright/XINGSeeker.cpp index 8c99c76..9c91134 100644 --- a/media/libstagefright/XINGSeeker.cpp +++ b/media/libstagefright/XINGSeeker.cpp @@ -14,6 +14,9 @@ * limitations under the License. */ +#define LOG_TAG "XINGSEEKER" +#include <utils/Log.h> + #include "include/XINGSeeker.h" #include "include/avc_utils.h" @@ -24,7 +27,9 @@ namespace android { XINGSeeker::XINGSeeker() : mDurationUs(-1), - mSizeBytes(0) { + mSizeBytes(0), + mEncoderDelay(0), + mEncoderPadding(0) { } bool XINGSeeker::getDuration(int64_t *durationUs) { @@ -76,8 +81,6 @@ sp<XINGSeeker> XINGSeeker::CreateFromSource( seeker->mFirstFramePos = first_frame_pos; - ALOGI("xingseeker first frame pos: %lld", first_frame_pos); - seeker->mSizeBytes = 0; seeker->mTOCValid = false; seeker->mDurationUs = 0; @@ -111,6 +114,8 @@ sp<XINGSeeker> XINGSeeker::CreateFromSource( else offset += 9; } + int xingbase = offset; + if (source->readAt(offset, &buffer, 4) < 4) { // XING header ID return NULL; } @@ -161,10 +166,31 @@ sp<XINGSeeker> XINGSeeker::CreateFromSource( // do something with the quality indicator offset += 4; } + + if (source->readAt(xingbase + 0xaf - 0x24, &buffer, 1) < 1) { // encoding flags + return false; + } + + ALOGV("nogap preceding: %s, nogap continued in next: %s", + (buffer[0] & 0x80) ? "true" : "false", + (buffer[0] & 0x40) ? "true" : "false"); #endif + if (source->readAt(xingbase + 0xb1 - 0x24, &buffer, 3) == 3) { + seeker->mEncoderDelay = (buffer[0] << 4) + (buffer[1] >> 4); + seeker->mEncoderPadding = ((buffer[1] & 0xf) << 8) + buffer[2]; + } + return seeker; } +int32_t XINGSeeker::getEncoderDelay() { + return mEncoderDelay; +} + +int32_t XINGSeeker::getEncoderPadding() { + return mEncoderPadding; +} + } // namespace android |