Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 06ec7f3e authored by Wonsik Kim's avatar Wonsik Kim
Browse files

stagefright: TinyCacheSource to read continuously

If the seek operation of underlying MediaDataSource implementation is
expensive and each read is relatively small (e.g. Live MPEG2 TS
stream), current TinyCacheSource implementation requests seek too
frequently.

Bug: 21764375

Change-Id: Ic620bf027bc4ef48822549c83c5c98109986884a
parent ca097142
Loading
Loading
Loading
Loading
+19 −3
Original line number Diff line number Diff line
@@ -109,9 +109,25 @@ ssize_t TinyCacheSource::readAt(off64_t offset, void* data, size_t size) {
    }

    // Check if the cache satisfies the read.
    if (offset >= mCachedOffset && offset + size <= mCachedOffset + mCachedSize) {
    if (mCachedOffset <= offset && offset < mCachedOffset + mCachedSize) {
        if (offset + size <= mCachedOffset + mCachedSize) {
            memcpy(data, &mCache[offset - mCachedOffset], size);
            return size;
        } else {
            // If the cache hits only partially, flush the cache and read the
            // remainder.

            // This value is guaranteed to be greater than 0 because of the
            // enclosing if statement.
            const ssize_t remaining = mCachedOffset + mCachedSize - offset;
            memcpy(data, &mCache[offset - mCachedOffset], remaining);
            const ssize_t readMore = readAt(offset + remaining,
                    (uint8_t*)data + remaining, size - remaining);
            if (readMore < 0) {
                return readMore;
            }
            return remaining + readMore;
        }
    }

    // Fill the cache and copy to the caller.