Merge "Speed up MP3Extractor using cached reads" into honeycomb

This commit is contained in:
James Dong
2011-01-12 11:54:32 -08:00
committed by Android (Google) Code Review

View File

@@ -228,22 +228,47 @@ static bool Resync(
off64_t pos = *inout_pos; off64_t pos = *inout_pos;
bool valid = false; 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 { do {
if (pos >= *inout_pos + 128 * 1024) { if (pos >= *inout_pos + kMaxBytesChecked) {
// Don't scan forever. // Don't scan forever.
LOGV("giving up at offset %ld", pos); LOGV("giving up at offset %ld", pos);
break; break;
} }
uint8_t tmp[4]; if (remainingBytes < 4) {
if (source->readAt(pos, tmp, 4) != 4) { if (reachEOS) {
break; 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); uint32_t header = U32_AT(tmp);
if (match_header != 0 && (header & kMask) != (match_header & kMask)) { if (match_header != 0 && (header & kMask) != (match_header & kMask)) {
++pos; ++pos;
++tmp;
--remainingBytes;
continue; continue;
} }
@@ -253,6 +278,8 @@ static bool Resync(
header, &frame_size, header, &frame_size,
&sample_rate, &num_channels, &bitrate)) { &sample_rate, &num_channels, &bitrate)) {
++pos; ++pos;
++tmp;
--remainingBytes;
continue; continue;
} }
@@ -303,6 +330,8 @@ static bool Resync(
} }
++pos; ++pos;
++tmp;
--remainingBytes;
} while (!valid); } while (!valid);
return valid; return valid;