Merge "Make sure the prefetcher is actively fetching data if we pause playback due to cache underrun."
This commit is contained in:
committed by
Android (Google) Code Review
commit
dcdb6d001d
@@ -564,6 +564,12 @@ bool AwesomePlayer::getCachedDuration_l(int64_t *durationUs, bool *eos) {
|
||||
return false;
|
||||
}
|
||||
|
||||
void AwesomePlayer::ensureCacheIsFetching_l() {
|
||||
if (mCachedSource != NULL) {
|
||||
mCachedSource->resumeFetchingIfNecessary();
|
||||
}
|
||||
}
|
||||
|
||||
void AwesomePlayer::onBufferingUpdate() {
|
||||
Mutex::Autolock autoLock(mLock);
|
||||
if (!mBufferingEventPending) {
|
||||
@@ -606,6 +612,7 @@ void AwesomePlayer::onBufferingUpdate() {
|
||||
kLowWaterMarkBytes);
|
||||
mFlags |= CACHE_UNDERRUN;
|
||||
pause_l();
|
||||
ensureCacheIsFetching_l();
|
||||
notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START);
|
||||
} else if (eos || cachedDataRemaining > kHighWaterMarkBytes) {
|
||||
if (mFlags & CACHE_UNDERRUN) {
|
||||
@@ -627,12 +634,16 @@ void AwesomePlayer::onBufferingUpdate() {
|
||||
int64_t cachedDurationUs;
|
||||
bool eos;
|
||||
if (getCachedDuration_l(&cachedDurationUs, &eos)) {
|
||||
LOGV("cachedDurationUs = %.2f secs, eos=%d",
|
||||
cachedDurationUs / 1E6, eos);
|
||||
|
||||
if ((mFlags & PLAYING) && !eos
|
||||
&& (cachedDurationUs < kLowWaterMarkUs)) {
|
||||
LOGI("cache is running low (%.2f secs) , pausing.",
|
||||
cachedDurationUs / 1E6);
|
||||
mFlags |= CACHE_UNDERRUN;
|
||||
pause_l();
|
||||
ensureCacheIsFetching_l();
|
||||
notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START);
|
||||
} else if (eos || cachedDurationUs > kHighWaterMarkUs) {
|
||||
if (mFlags & CACHE_UNDERRUN) {
|
||||
|
||||
@@ -325,15 +325,17 @@ void NuCachedSource2::onRead(const sp<AMessage> &msg) {
|
||||
mCondition.signal();
|
||||
}
|
||||
|
||||
void NuCachedSource2::restartPrefetcherIfNecessary_l() {
|
||||
void NuCachedSource2::restartPrefetcherIfNecessary_l(
|
||||
bool ignoreLowWaterThreshold) {
|
||||
static const size_t kGrayArea = 256 * 1024;
|
||||
|
||||
if (mFetching || mFinalStatus != OK) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (mCacheOffset + mCache->totalSize() - mLastAccessPos
|
||||
>= kLowWaterThreshold) {
|
||||
if (!ignoreLowWaterThreshold
|
||||
&& mCacheOffset + mCache->totalSize() - mLastAccessPos
|
||||
>= kLowWaterThreshold) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -510,6 +512,12 @@ void NuCachedSource2::onSuspend() {
|
||||
mSuspended = true;
|
||||
}
|
||||
|
||||
void NuCachedSource2::resumeFetchingIfNecessary() {
|
||||
Mutex::Autolock autoLock(mLock);
|
||||
|
||||
restartPrefetcherIfNecessary_l(true /* ignore low water threshold */);
|
||||
}
|
||||
|
||||
DecryptHandle* NuCachedSource2::DrmInitialization(DrmManagerClient* client) {
|
||||
return mSource->DrmInitialization(client);
|
||||
}
|
||||
|
||||
@@ -274,6 +274,7 @@ private:
|
||||
bool getBitrate(int64_t *bitrate);
|
||||
|
||||
void finishSeekIfNecessary(int64_t videoTimeUs);
|
||||
void ensureCacheIsFetching_l();
|
||||
|
||||
AwesomePlayer(const AwesomePlayer &);
|
||||
AwesomePlayer &operator=(const AwesomePlayer &);
|
||||
|
||||
@@ -47,6 +47,8 @@ struct NuCachedSource2 : public DataSource {
|
||||
void suspend();
|
||||
void clearCacheAndResume();
|
||||
|
||||
void resumeFetchingIfNecessary();
|
||||
|
||||
protected:
|
||||
virtual ~NuCachedSource2();
|
||||
|
||||
@@ -96,7 +98,7 @@ private:
|
||||
status_t seekInternal_l(off_t offset);
|
||||
|
||||
size_t approxDataRemaining_l(bool *eos);
|
||||
void restartPrefetcherIfNecessary_l();
|
||||
void restartPrefetcherIfNecessary_l(bool ignoreLowWaterThreshold = false);
|
||||
|
||||
DISALLOW_EVIL_CONSTRUCTORS(NuCachedSource2);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user