From 06ec7f3ef28ee68714d323ca9e2d3cab2165dfe8 Mon Sep 17 00:00:00 2001 From: Wonsik Kim Date: Tue, 9 Jun 2015 13:26:03 +0900 Subject: 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 --- media/libstagefright/CallbackDataSource.cpp | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) (limited to 'media/libstagefright/CallbackDataSource.cpp') diff --git a/media/libstagefright/CallbackDataSource.cpp b/media/libstagefright/CallbackDataSource.cpp index 41f0175..de972ce 100644 --- a/media/libstagefright/CallbackDataSource.cpp +++ b/media/libstagefright/CallbackDataSource.cpp @@ -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) { - memcpy(data, &mCache[offset - mCachedOffset], size); - return size; + 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. -- cgit v1.1