Merge "Make the prefetcher read packets from the network after a keep-alive timeout expires regardless of whether its currently actively fetching data or not." into gingerbread
diff --git a/media/libstagefright/NuCachedSource2.cpp b/media/libstagefright/NuCachedSource2.cpp
index f29e7fb..c02b7f3 100644
--- a/media/libstagefright/NuCachedSource2.cpp
+++ b/media/libstagefright/NuCachedSource2.cpp
@@ -178,7 +178,8 @@
       mCacheOffset(0),
       mFinalStatus(OK),
       mLastAccessPos(0),
-      mFetching(true) {
+      mFetching(true),
+      mLastFetchTimeUs(-1) {
     mLooper->registerHandler(mReflector);
     mLooper->start();
 
@@ -259,10 +260,21 @@
         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 c30f029..f73e837 100644
--- a/media/libstagefright/include/NuCachedSource2.h
+++ b/media/libstagefright/include/NuCachedSource2.h
@@ -49,9 +49,13 @@
     friend struct AHandlerReflector<NuCachedSource2>;
 
     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 @@
     off_t mLastAccessPos;
     sp<AMessage> mAsyncResult;
     bool mFetching;
+    int64_t mLastFetchTimeUs;
 
     void onMessageReceived(const sp<AMessage> &msg);
     void onFetch();