summaryrefslogtreecommitdiffstats
path: root/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
diff options
context:
space:
mode:
authorWei Jia <wjia@google.com>2014-08-06 11:24:07 -0700
committerWei Jia <wjia@google.com>2014-08-19 11:32:24 -0700
commit88703c34fb4a9db1ff51495879f9775474c8ce89 (patch)
tree8bf246b25fc40824005a4ee87d3e78fb3bda487b /media/libmediaplayerservice/nuplayer/NuPlayer.cpp
parent426c719a5f3b4d88480eb35a7b0b373f672ea3cb (diff)
downloadframeworks_av-88703c34fb4a9db1ff51495879f9775474c8ce89.zip
frameworks_av-88703c34fb4a9db1ff51495879f9775474c8ce89.tar.gz
frameworks_av-88703c34fb4a9db1ff51495879f9775474c8ce89.tar.bz2
NuPlayer: use generation to detect stale requests from old decoders.
Bug: 14955925 Bug: 16303659 Bug: 16467066 Bug: 13133027 Change-Id: I3e66b25b2302c0eb795361629b03bf2e96ed34e4
Diffstat (limited to 'media/libmediaplayerservice/nuplayer/NuPlayer.cpp')
-rw-r--r--media/libmediaplayerservice/nuplayer/NuPlayer.cpp33
1 files changed, 29 insertions, 4 deletions
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
index 5e7ecfa..0cba7f7 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
@@ -148,6 +148,8 @@ NuPlayer::NuPlayer()
mVideoIsAVC(false),
mOffloadAudio(false),
mCurrentOffloadInfo(AUDIO_INFO_INITIALIZER),
+ mAudioDecoderGeneration(0),
+ mVideoDecoderGeneration(0),
mAudioEOS(false),
mVideoEOS(false),
mScanSourcesPending(false),
@@ -691,6 +693,25 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
{
bool audio = msg->what() == kWhatAudioNotify;
+ int32_t currentDecoderGeneration =
+ (audio? mAudioDecoderGeneration : mVideoDecoderGeneration);
+ int32_t requesterGeneration = currentDecoderGeneration - 1;
+ CHECK(msg->findInt32("generation", &requesterGeneration));
+
+ if (requesterGeneration != currentDecoderGeneration) {
+ ALOGV("got message from old %s decoder, generation(%d:%d)",
+ audio ? "audio" : "video", requesterGeneration,
+ currentDecoderGeneration);
+ sp<AMessage> reply;
+ if (!(msg->findMessage("reply", &reply))) {
+ return;
+ }
+
+ reply->setInt32("err", INFO_DISCONTINUITY);
+ reply->post();
+ return;
+ }
+
int32_t what;
CHECK(msg->findInt32("what", &what));
@@ -1150,17 +1171,21 @@ status_t NuPlayer::instantiateDecoder(bool audio, sp<Decoder> *decoder) {
}
}
- sp<AMessage> notify =
- new AMessage(audio ? kWhatAudioNotify : kWhatVideoNotify,
- id());
-
if (audio) {
+ sp<AMessage> notify = new AMessage(kWhatAudioNotify, id());
+ ++mAudioDecoderGeneration;
+ notify->setInt32("generation", mAudioDecoderGeneration);
+
if (mOffloadAudio) {
*decoder = new DecoderPassThrough(notify);
} else {
*decoder = new Decoder(notify);
}
} else {
+ sp<AMessage> notify = new AMessage(kWhatVideoNotify, id());
+ ++mVideoDecoderGeneration;
+ notify->setInt32("generation", mVideoDecoderGeneration);
+
*decoder = new Decoder(notify, mNativeWindow);
}
(*decoder)->init();