summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorJames Dong <jdong@google.com>2011-01-12 11:54:32 -0800
committerAndroid (Google) Code Review <android-gerrit@google.com>2011-01-12 11:54:32 -0800
commitcb0f6d0b42b264ec6aa2a98fe210d72ed10f73ed (patch)
tree09f677ebc8b51bcb59514df091b8262a70908199 /media
parent27d116085ebbb112ec1fd959763a027ec08f7179 (diff)
parent31d8a03e44b272afacad07a7670aaad764172797 (diff)
downloadframeworks_base-cb0f6d0b42b264ec6aa2a98fe210d72ed10f73ed.zip
frameworks_base-cb0f6d0b42b264ec6aa2a98fe210d72ed10f73ed.tar.gz
frameworks_base-cb0f6d0b42b264ec6aa2a98fe210d72ed10f73ed.tar.bz2
Merge "Speed up MP3Extractor using cached reads" into honeycomb
Diffstat (limited to 'media')
-rw-r--r--media/libstagefright/MP3Extractor.cpp37
1 files changed, 33 insertions, 4 deletions
diff --git a/media/libstagefright/MP3Extractor.cpp b/media/libstagefright/MP3Extractor.cpp
index 0bb3a86..00a4dd5 100644
--- a/media/libstagefright/MP3Extractor.cpp
+++ b/media/libstagefright/MP3Extractor.cpp
@@ -228,22 +228,47 @@ static bool Resync(
off64_t pos = *inout_pos;
bool valid = false;
+
+ const size_t kMaxReadBytes = 1024;
+ const size_t kMaxBytesChecked = 128 * 1024;
+ uint8_t buf[kMaxReadBytes];
+ ssize_t bytesToRead = kMaxReadBytes;
+ ssize_t totalBytesRead = 0;
+ ssize_t remainingBytes = 0;
+ bool reachEOS = false;
+ uint8_t *tmp = buf;
+
do {
- if (pos >= *inout_pos + 128 * 1024) {
+ if (pos >= *inout_pos + kMaxBytesChecked) {
// Don't scan forever.
LOGV("giving up at offset %ld", pos);
break;
}
- uint8_t tmp[4];
- if (source->readAt(pos, tmp, 4) != 4) {
- break;
+ if (remainingBytes < 4) {
+ if (reachEOS) {
+ break;
+ } else {
+ memcpy(buf, tmp, remainingBytes);
+ bytesToRead = kMaxReadBytes - remainingBytes;
+ totalBytesRead = source->readAt(pos, buf + remainingBytes, bytesToRead);
+ if (totalBytesRead <= 0) {
+ break;
+ }
+ reachEOS = (totalBytesRead != bytesToRead);
+ totalBytesRead += remainingBytes;
+ remainingBytes = totalBytesRead;
+ tmp = buf;
+ continue;
+ }
}
uint32_t header = U32_AT(tmp);
if (match_header != 0 && (header & kMask) != (match_header & kMask)) {
++pos;
+ ++tmp;
+ --remainingBytes;
continue;
}
@@ -253,6 +278,8 @@ static bool Resync(
header, &frame_size,
&sample_rate, &num_channels, &bitrate)) {
++pos;
+ ++tmp;
+ --remainingBytes;
continue;
}
@@ -303,6 +330,8 @@ static bool Resync(
}
++pos;
+ ++tmp;
+ --remainingBytes;
} while (!valid);
return valid;