diff options
author | Andy Hung <hunga@google.com> | 2014-10-02 14:26:01 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-10-02 14:26:02 +0000 |
commit | d8b03abf1d003e2940a19f0071ea2892689dd10e (patch) | |
tree | 0da3ff7e88649ef12a8121d483befd555c7ac3f3 /media/libmediaplayerservice/nuplayer/GenericSource.cpp | |
parent | f916667a017a5a6763afc4808344778570312d5a (diff) | |
parent | 2abde2c118a94f843a7450818c925d3f0b673cd3 (diff) | |
download | frameworks_av-d8b03abf1d003e2940a19f0071ea2892689dd10e.zip frameworks_av-d8b03abf1d003e2940a19f0071ea2892689dd10e.tar.gz frameworks_av-d8b03abf1d003e2940a19f0071ea2892689dd10e.tar.bz2 |
Merge "NuPlayer: Fix flush mode decoder error handling" into lmp-dev
Diffstat (limited to 'media/libmediaplayerservice/nuplayer/GenericSource.cpp')
-rw-r--r-- | media/libmediaplayerservice/nuplayer/GenericSource.cpp | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/media/libmediaplayerservice/nuplayer/GenericSource.cpp b/media/libmediaplayerservice/nuplayer/GenericSource.cpp index 016a764..6859a1a 100644 --- a/media/libmediaplayerservice/nuplayer/GenericSource.cpp +++ b/media/libmediaplayerservice/nuplayer/GenericSource.cpp @@ -75,6 +75,7 @@ void NuPlayer::GenericSource::resetDataSource() { mDecryptHandle = NULL; mDrmManagerClient = NULL; mStarted = false; + mStopRead = true; } status_t NuPlayer::GenericSource::setDataSource( @@ -455,6 +456,7 @@ status_t NuPlayer::GenericSource::prefillCacheIfNecessary() { void NuPlayer::GenericSource::start() { ALOGI("start"); + mStopRead = false; if (mAudioTrack.mSource != NULL) { CHECK_EQ(mAudioTrack.mSource->start(), (status_t)OK); @@ -475,6 +477,12 @@ void NuPlayer::GenericSource::stop() { // nothing to do, just account for DRM playback status setDrmPlaybackStatusIfNeeded(Playback::STOP, 0); mStarted = false; + if (mIsWidevine) { + // For a widevine source we need to prevent any further reads. + sp<AMessage> msg = new AMessage(kWhatStopWidevine, id()); + sp<AMessage> response; + (void) msg->postAndAwaitResponse(&response); + } } void NuPlayer::GenericSource::pause() { @@ -693,6 +701,20 @@ void NuPlayer::GenericSource::onMessageReceived(const sp<AMessage> &msg) { break; } + case kWhatStopWidevine: + { + // mStopRead is only used for Widevine to prevent the video source + // from being read while the associated video decoder is shutting down. + mStopRead = true; + if (mVideoTrack.mSource != NULL) { + mVideoTrack.mPackets->clear(); + } + sp<AMessage> response = new AMessage; + uint32_t replyID; + CHECK(msg->senderAwaitsResponse(&replyID)); + response->postReply(replyID); + break; + } default: Source::onMessageReceived(msg); break; @@ -1100,6 +1122,11 @@ void NuPlayer::GenericSource::onSeek(sp<AMessage> msg) { } status_t NuPlayer::GenericSource::doSeek(int64_t seekTimeUs) { + // If the Widevine source is stopped, do not attempt to read any + // more buffers. + if (mStopRead) { + return INVALID_OPERATION; + } if (mVideoTrack.mSource != NULL) { int64_t actualTimeUs; readBuffer(MEDIA_TRACK_TYPE_VIDEO, seekTimeUs, &actualTimeUs); @@ -1211,6 +1238,10 @@ void NuPlayer::GenericSource::onReadBuffer(sp<AMessage> msg) { void NuPlayer::GenericSource::readBuffer( media_track_type trackType, int64_t seekTimeUs, int64_t *actualTimeUs, bool formatChange) { + // Do not read data if Widevine source is stopped + if (mStopRead) { + return; + } Track *track; size_t maxBuffers = 1; switch (trackType) { |