From a4867540534568e3fbd06e142c62834b2bde8834 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Tue, 22 Jun 2010 08:57:34 -0700 Subject: [PATCH] Make the prefetcher read packets from the network after a keep-alive timeout expires regardless of whether its currently actively fetching data or not. Change-Id: I7d022ac494e1cecdd7f656806b7ed45979c02840 --- media/libstagefright/NuCachedSource2.cpp | 18 +++++++++++++++--- media/libstagefright/include/NuCachedSource2.h | 11 ++++++++--- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/media/libstagefright/NuCachedSource2.cpp b/media/libstagefright/NuCachedSource2.cpp index f29e7fb180050..c02b7f3c4e7f9 100644 --- a/media/libstagefright/NuCachedSource2.cpp +++ b/media/libstagefright/NuCachedSource2.cpp @@ -178,7 +178,8 @@ NuCachedSource2::NuCachedSource2(const sp &source) mCacheOffset(0), mFinalStatus(OK), mLastAccessPos(0), - mFetching(true) { + mFetching(true), + mLastFetchTimeUs(-1) { mLooper->registerHandler(mReflector); mLooper->start(); @@ -259,10 +260,21 @@ void NuCachedSource2::onFetch() { mFetching = false; } - if (mFetching) { + bool keepAlive = + !mFetching + && mFinalStatus == OK + && ALooper::GetNowUs() >= mLastFetchTimeUs + kKeepAliveIntervalUs; + + if (mFetching || keepAlive) { + if (keepAlive) { + LOG(INFO) << "Keep alive"; + } + fetchInternal(); - if (mCache->totalSize() >= kHighWaterThreshold) { + mLastFetchTimeUs = ALooper::GetNowUs(); + + if (mFetching && mCache->totalSize() >= kHighWaterThreshold) { LOG(INFO) << "Cache full, done prefetching for now"; mFetching = false; } diff --git a/media/libstagefright/include/NuCachedSource2.h b/media/libstagefright/include/NuCachedSource2.h index c30f02999b1c4..f73e837a2b2f2 100644 --- a/media/libstagefright/include/NuCachedSource2.h +++ b/media/libstagefright/include/NuCachedSource2.h @@ -49,9 +49,13 @@ private: friend struct AHandlerReflector; enum { - kPageSize = 16384, - kHighWaterThreshold = 3 * 1024 * 1024, - kLowWaterThreshold = 512 * 1024, + kPageSize = 16384, + kHighWaterThreshold = 3 * 1024 * 1024, + kLowWaterThreshold = 512 * 1024, + + // Read data after a 15 sec timeout whether we're actively + // fetching or not. + kKeepAliveIntervalUs = 15000000, }; enum { @@ -73,6 +77,7 @@ private: off_t mLastAccessPos; sp mAsyncResult; bool mFetching; + int64_t mLastFetchTimeUs; void onMessageReceived(const sp &msg); void onFetch();