summaryrefslogtreecommitdiffstats
path: root/media/libmediaplayerservice/nuplayer/GenericSource.cpp
diff options
context:
space:
mode:
authorAndy Hung <hunga@google.com>2014-09-30 14:40:32 -0700
committerAndy Hung <hunga@google.com>2014-10-01 20:23:34 -0700
commit2abde2c118a94f843a7450818c925d3f0b673cd3 (patch)
tree452cecbb797776883b387704a299936b1dd55729 /media/libmediaplayerservice/nuplayer/GenericSource.cpp
parent955e24d3a8e218d4711cabc6558781e095011132 (diff)
downloadframeworks_av-2abde2c118a94f843a7450818c925d3f0b673cd3.zip
frameworks_av-2abde2c118a94f843a7450818c925d3f0b673cd3.tar.gz
frameworks_av-2abde2c118a94f843a7450818c925d3f0b673cd3.tar.bz2
NuPlayer: Fix flush mode decoder error handling
Explicitly handle each flush mode upon decoder error. Do not clear out affected decoder immediately. Alter logcat messages for better diagnostics. Bug: 17638878 Bug: 17679341 Change-Id: I219796c04d65d7c4dd61c0d4f99f9f580241a68b
Diffstat (limited to 'media/libmediaplayerservice/nuplayer/GenericSource.cpp')
-rw-r--r--media/libmediaplayerservice/nuplayer/GenericSource.cpp31
1 files changed, 31 insertions, 0 deletions
diff --git a/media/libmediaplayerservice/nuplayer/GenericSource.cpp b/media/libmediaplayerservice/nuplayer/GenericSource.cpp
index f84decd..baf211b 100644
--- a/media/libmediaplayerservice/nuplayer/GenericSource.cpp
+++ b/media/libmediaplayerservice/nuplayer/GenericSource.cpp
@@ -73,6 +73,7 @@ void NuPlayer::GenericSource::resetDataSource() {
mDecryptHandle = NULL;
mDrmManagerClient = NULL;
mStarted = false;
+ mStopRead = true;
}
status_t NuPlayer::GenericSource::setDataSource(
@@ -439,6 +440,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);
@@ -459,6 +461,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() {
@@ -675,6 +683,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;
@@ -1082,6 +1104,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);
@@ -1193,6 +1220,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) {