summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/NuCachedSource2.cpp
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2010-10-12 11:34:37 -0700
committerAndreas Huber <andih@google.com>2010-10-12 14:32:10 -0700
commitbff07d0b22a5ee2d9f044f6cb5e4be1532017ab0 (patch)
tree3377ef036c87095609a0969dbf0b5c93450b8903 /media/libstagefright/NuCachedSource2.cpp
parent2bc940b4f961e588459c83862b2c6bea314a4027 (diff)
downloadframeworks_av-bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0.zip
frameworks_av-bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0.tar.gz
frameworks_av-bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0.tar.bz2
HTTP Live content that are tagged as complete are now seekable.
Change-Id: I9d0d2f009f883e5baf3e9de8c5c0aa05760e4bde related-to-bug: 2368598
Diffstat (limited to 'media/libstagefright/NuCachedSource2.cpp')
-rw-r--r--media/libstagefright/NuCachedSource2.cpp48
1 files changed, 45 insertions, 3 deletions
diff --git a/media/libstagefright/NuCachedSource2.cpp b/media/libstagefright/NuCachedSource2.cpp
index 3a0fc41..b67002d 100644
--- a/media/libstagefright/NuCachedSource2.cpp
+++ b/media/libstagefright/NuCachedSource2.cpp
@@ -179,7 +179,8 @@ NuCachedSource2::NuCachedSource2(const sp<DataSource> &source)
mFinalStatus(OK),
mLastAccessPos(0),
mFetching(true),
- mLastFetchTimeUs(-1) {
+ mLastFetchTimeUs(-1),
+ mSuspended(false) {
mLooper->setName("NuCachedSource2");
mLooper->registerHandler(mReflector);
mLooper->start();
@@ -205,7 +206,7 @@ status_t NuCachedSource2::getSize(off_t *size) {
}
uint32_t NuCachedSource2::flags() {
- return mSource->flags();
+ return (mSource->flags() & ~kWantsPrefetching) | kIsCachingDataSource;
}
void NuCachedSource2::onMessageReceived(const sp<AMessage> &msg) {
@@ -222,6 +223,12 @@ void NuCachedSource2::onMessageReceived(const sp<AMessage> &msg) {
break;
}
+ case kWhatSuspend:
+ {
+ onSuspend();
+ break;
+ }
+
default:
TRESPASS();
}
@@ -263,6 +270,7 @@ void NuCachedSource2::onFetch() {
bool keepAlive =
!mFetching
+ && !mSuspended
&& mFinalStatus == OK
&& ALooper::GetNowUs() >= mLastFetchTimeUs + kKeepAliveIntervalUs;
@@ -279,7 +287,7 @@ void NuCachedSource2::onFetch() {
LOGI("Cache full, done prefetching for now");
mFetching = false;
}
- } else {
+ } else if (!mSuspended) {
Mutex::Autolock autoLock(mLock);
restartPrefetcherIfNecessary_l();
}
@@ -468,5 +476,39 @@ status_t NuCachedSource2::seekInternal_l(off_t offset) {
return OK;
}
+void NuCachedSource2::clearCacheAndResume() {
+ LOGV("clearCacheAndResume");
+
+ Mutex::Autolock autoLock(mLock);
+
+ CHECK(mSuspended);
+
+ mCacheOffset = 0;
+ mFinalStatus = OK;
+ mLastAccessPos = 0;
+ mLastFetchTimeUs = -1;
+
+ size_t totalSize = mCache->totalSize();
+ CHECK_EQ(mCache->releaseFromStart(totalSize), totalSize);
+
+ mFetching = true;
+ mSuspended = false;
+}
+
+void NuCachedSource2::suspend() {
+ (new AMessage(kWhatSuspend, mReflector->id()))->post();
+
+ while (!mSuspended) {
+ usleep(10000);
+ }
+}
+
+void NuCachedSource2::onSuspend() {
+ Mutex::Autolock autoLock(mLock);
+
+ mFetching = false;
+ mSuspended = true;
+}
+
} // namespace android