summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndroid (Google) Code Review <android-gerrit@google.com>2009-12-08 09:16:08 -0800
committerAndroid (Google) Code Review <android-gerrit@google.com>2009-12-08 09:16:08 -0800
commit35dd25795bb83d41c1022b1aefe890ffc00e9a35 (patch)
treedbb32ea9ed09c0ff2565849feddf8255a0ab65d0
parentedf4e6f02b54481ecd74bbdb51e3f5e3db0f53ff (diff)
parent541962997b4076da11546619f082467ffd9bcd1f (diff)
downloadframeworks_av-35dd25795bb83d41c1022b1aefe890ffc00e9a35.zip
frameworks_av-35dd25795bb83d41c1022b1aefe890ffc00e9a35.tar.gz
frameworks_av-35dd25795bb83d41c1022b1aefe890ffc00e9a35.tar.bz2
Merge change Ib16e5543 into eclair-mr2
* changes: Fix the mp3 audio extractor that would occasionally return an invalid frame directly after a seek.
-rw-r--r--media/libstagefright/MP3Extractor.cpp19
1 files changed, 10 insertions, 9 deletions
diff --git a/media/libstagefright/MP3Extractor.cpp b/media/libstagefright/MP3Extractor.cpp
index 8dd8ea9..9dbefe4 100644
--- a/media/libstagefright/MP3Extractor.cpp
+++ b/media/libstagefright/MP3Extractor.cpp
@@ -33,6 +33,10 @@
namespace android {
+// Everything must match except for
+// protection, bitrate, padding, private bits and mode extension.
+static const uint32_t kMask = 0xfffe0ccf;
+
static bool get_mp3_frame_size(
uint32_t header, size_t *frame_size,
int *out_sampling_rate = NULL, int *out_channels = NULL,
@@ -60,7 +64,7 @@ static bool get_mp3_frame_size(
if (version == 0x01) {
return false;
}
-
+
unsigned layer = (header >> 17) & 3;
if (layer == 0x00) {
@@ -199,13 +203,9 @@ static bool Resync(
}
}
- // Everything must match except for
- // protection, bitrate, padding, private bits and mode extension.
- const uint32_t kMask = 0xfffe0ccf;
-
const size_t kMaxFrameSize = 4096;
uint8_t *buffer = new uint8_t[kMaxFrameSize];
-
+
off_t pos = *inout_pos - kMaxFrameSize;
size_t buffer_offset = kMaxFrameSize;
size_t buffer_length = kMaxFrameSize;
@@ -269,7 +269,7 @@ static bool Resync(
valid = false;
break;
}
-
+
uint32_t test_header = U32_AT(tmp);
LOGV("subsequent header is %08x", test_header);
@@ -489,8 +489,9 @@ status_t MP3Source::read(
}
uint32_t header = U32_AT((const uint8_t *)buffer->data());
-
- if (get_mp3_frame_size(header, &frame_size)) {
+
+ if ((header & kMask) == (mFixedHeader & kMask)
+ && get_mp3_frame_size(header, &frame_size)) {
break;
}