summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/XINGSeeker.cpp
diff options
context:
space:
mode:
authorMarco Nelissen <marcone@google.com>2012-03-19 13:49:43 -0700
committerMarco Nelissen <marcone@google.com>2012-03-20 08:46:11 -0700
commitb636abde14f2612ea236257846b9ab15d87d4623 (patch)
tree2aa58e136a7d4cf3f00ebdbcdffc49f0ddef35ca /media/libstagefright/XINGSeeker.cpp
parent9e50385f34676d8fcb3b473ec4c9f5c388a4c887 (diff)
downloadframeworks_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.cpp32
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