diff options
author | James Dong <jdong@google.com> | 2011-01-12 11:54:32 -0800 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-01-12 11:54:32 -0800 |
commit | 67988a9ba5a081d14dbd8a663516e1d484d829df (patch) | |
tree | 87174f60c8ae8886df65970ab81aa92445ef3f34 /media | |
parent | 4dafe5b814c923538a0f275b62220ec9cc94a9b5 (diff) | |
parent | 7cc497733b7602b99b783decfa8c002bc27e25aa (diff) | |
download | frameworks_av-67988a9ba5a081d14dbd8a663516e1d484d829df.zip frameworks_av-67988a9ba5a081d14dbd8a663516e1d484d829df.tar.gz frameworks_av-67988a9ba5a081d14dbd8a663516e1d484d829df.tar.bz2 |
Merge "Speed up MP3Extractor using cached reads" into honeycomb
Diffstat (limited to 'media')
-rw-r--r-- | media/libstagefright/MP3Extractor.cpp | 37 |
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; |