Loading media/libmediaplayerservice/nuplayer/GenericSource.cpp +9 −0 Original line number Diff line number Diff line Loading @@ -464,6 +464,15 @@ void NuPlayer::GenericSource::resume() { mStarted = true; } void NuPlayer::GenericSource::disconnect() { if (mDataSource != NULL) { // disconnect data source if (mDataSource->flags() & DataSource::kIsCachingDataSource) { static_cast<NuCachedSource2 *>(mDataSource.get())->disconnect(); } } } void NuPlayer::GenericSource::setDrmPlaybackStatusIfNeeded(int playbackStatus, int64_t position) { if (mDecryptHandle != NULL) { mDrmManagerClient->setPlaybackStatus(mDecryptHandle, playbackStatus, position); Loading media/libmediaplayerservice/nuplayer/GenericSource.h +2 −0 Original line number Diff line number Diff line Loading @@ -55,6 +55,8 @@ struct NuPlayer::GenericSource : public NuPlayer::Source { virtual void pause(); virtual void resume(); virtual void disconnect(); virtual status_t feedMoreTSData(); virtual status_t dequeueAccessUnit(bool audio, sp<ABuffer> *accessUnit); Loading media/libmediaplayerservice/nuplayer/NuPlayer.cpp +10 −0 Original line number Diff line number Diff line Loading @@ -310,6 +310,16 @@ void NuPlayer::resume() { } void NuPlayer::resetAsync() { if (mSource != NULL) { // During a reset, the data source might be unresponsive already, we need to // disconnect explicitly so that reads exit promptly. // We can't queue the disconnect request to the looper, as it might be // queued behind a stuck read and never gets processed. // Doing a disconnect outside the looper to allows the pending reads to exit // (either successfully or with error). mSource->disconnect(); } (new AMessage(kWhatReset, id()))->post(); } Loading media/libmediaplayerservice/nuplayer/NuPlayerSource.h +3 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,9 @@ struct NuPlayer::Source : public AHandler { virtual void pause() {} virtual void resume() {} // Explicitly disconnect the underling data source virtual void disconnect() {} // Returns OK iff more data was available, // an error or ERROR_END_OF_STREAM if not. virtual status_t feedMoreTSData() = 0; Loading media/libstagefright/NuCachedSource2.cpp +26 −8 Original line number Diff line number Diff line Loading @@ -191,6 +191,7 @@ NuCachedSource2::NuCachedSource2( mFinalStatus(OK), mLastAccessPos(0), mFetching(true), mDisconnecting(false), mLastFetchTimeUs(-1), mNumRetriesLeft(kMaxNumRetries), mHighwaterThresholdBytes(kDefaultHighWaterThreshold), Loading Loading @@ -244,6 +245,23 @@ status_t NuCachedSource2::getEstimatedBandwidthKbps(int32_t *kbps) { return ERROR_UNSUPPORTED; } void NuCachedSource2::disconnect() { if (mSource->flags() & kIsHTTPBasedSource) { ALOGV("disconnecting HTTPBasedSource"); { Mutex::Autolock autoLock(mLock); // set mDisconnecting to true, if a fetch returns after // this, the source will be marked as EOS. mDisconnecting = true; } // explicitly disconnect from the source, to allow any // pending reads to return more promptly static_cast<HTTPBase *>(mSource.get())->disconnect(); } } status_t NuCachedSource2::setCacheStatCollectFreq(int32_t freqMs) { if (mSource->flags() & kIsHTTPBasedSource) { HTTPBase *source = static_cast<HTTPBase *>(mSource.get()); Loading Loading @@ -327,7 +345,14 @@ void NuCachedSource2::fetchInternal() { Mutex::Autolock autoLock(mLock); if (n < 0) { if (n == 0 || mDisconnecting) { ALOGI("ERROR_END_OF_STREAM"); mNumRetriesLeft = 0; mFinalStatus = ERROR_END_OF_STREAM; mCache->releasePage(page); } else if (n < 0) { mFinalStatus = n; if (n == ERROR_UNSUPPORTED || n == -EPIPE) { // These are errors that are not likely to go away even if we Loading @@ -336,13 +361,6 @@ void NuCachedSource2::fetchInternal() { } ALOGE("source returned error %zd, %d retries left", n, mNumRetriesLeft); mCache->releasePage(page); } else if (n == 0) { ALOGI("ERROR_END_OF_STREAM"); mNumRetriesLeft = 0; mFinalStatus = ERROR_END_OF_STREAM; mCache->releasePage(page); } else { if (mFinalStatus != OK) { Loading Loading
media/libmediaplayerservice/nuplayer/GenericSource.cpp +9 −0 Original line number Diff line number Diff line Loading @@ -464,6 +464,15 @@ void NuPlayer::GenericSource::resume() { mStarted = true; } void NuPlayer::GenericSource::disconnect() { if (mDataSource != NULL) { // disconnect data source if (mDataSource->flags() & DataSource::kIsCachingDataSource) { static_cast<NuCachedSource2 *>(mDataSource.get())->disconnect(); } } } void NuPlayer::GenericSource::setDrmPlaybackStatusIfNeeded(int playbackStatus, int64_t position) { if (mDecryptHandle != NULL) { mDrmManagerClient->setPlaybackStatus(mDecryptHandle, playbackStatus, position); Loading
media/libmediaplayerservice/nuplayer/GenericSource.h +2 −0 Original line number Diff line number Diff line Loading @@ -55,6 +55,8 @@ struct NuPlayer::GenericSource : public NuPlayer::Source { virtual void pause(); virtual void resume(); virtual void disconnect(); virtual status_t feedMoreTSData(); virtual status_t dequeueAccessUnit(bool audio, sp<ABuffer> *accessUnit); Loading
media/libmediaplayerservice/nuplayer/NuPlayer.cpp +10 −0 Original line number Diff line number Diff line Loading @@ -310,6 +310,16 @@ void NuPlayer::resume() { } void NuPlayer::resetAsync() { if (mSource != NULL) { // During a reset, the data source might be unresponsive already, we need to // disconnect explicitly so that reads exit promptly. // We can't queue the disconnect request to the looper, as it might be // queued behind a stuck read and never gets processed. // Doing a disconnect outside the looper to allows the pending reads to exit // (either successfully or with error). mSource->disconnect(); } (new AMessage(kWhatReset, id()))->post(); } Loading
media/libmediaplayerservice/nuplayer/NuPlayerSource.h +3 −0 Original line number Diff line number Diff line Loading @@ -67,6 +67,9 @@ struct NuPlayer::Source : public AHandler { virtual void pause() {} virtual void resume() {} // Explicitly disconnect the underling data source virtual void disconnect() {} // Returns OK iff more data was available, // an error or ERROR_END_OF_STREAM if not. virtual status_t feedMoreTSData() = 0; Loading
media/libstagefright/NuCachedSource2.cpp +26 −8 Original line number Diff line number Diff line Loading @@ -191,6 +191,7 @@ NuCachedSource2::NuCachedSource2( mFinalStatus(OK), mLastAccessPos(0), mFetching(true), mDisconnecting(false), mLastFetchTimeUs(-1), mNumRetriesLeft(kMaxNumRetries), mHighwaterThresholdBytes(kDefaultHighWaterThreshold), Loading Loading @@ -244,6 +245,23 @@ status_t NuCachedSource2::getEstimatedBandwidthKbps(int32_t *kbps) { return ERROR_UNSUPPORTED; } void NuCachedSource2::disconnect() { if (mSource->flags() & kIsHTTPBasedSource) { ALOGV("disconnecting HTTPBasedSource"); { Mutex::Autolock autoLock(mLock); // set mDisconnecting to true, if a fetch returns after // this, the source will be marked as EOS. mDisconnecting = true; } // explicitly disconnect from the source, to allow any // pending reads to return more promptly static_cast<HTTPBase *>(mSource.get())->disconnect(); } } status_t NuCachedSource2::setCacheStatCollectFreq(int32_t freqMs) { if (mSource->flags() & kIsHTTPBasedSource) { HTTPBase *source = static_cast<HTTPBase *>(mSource.get()); Loading Loading @@ -327,7 +345,14 @@ void NuCachedSource2::fetchInternal() { Mutex::Autolock autoLock(mLock); if (n < 0) { if (n == 0 || mDisconnecting) { ALOGI("ERROR_END_OF_STREAM"); mNumRetriesLeft = 0; mFinalStatus = ERROR_END_OF_STREAM; mCache->releasePage(page); } else if (n < 0) { mFinalStatus = n; if (n == ERROR_UNSUPPORTED || n == -EPIPE) { // These are errors that are not likely to go away even if we Loading @@ -336,13 +361,6 @@ void NuCachedSource2::fetchInternal() { } ALOGE("source returned error %zd, %d retries left", n, mNumRetriesLeft); mCache->releasePage(page); } else if (n == 0) { ALOGI("ERROR_END_OF_STREAM"); mNumRetriesLeft = 0; mFinalStatus = ERROR_END_OF_STREAM; mCache->releasePage(page); } else { if (mFinalStatus != OK) { Loading