From e427abf1ea252ff305fc33aacdd2e83cf34891b5 Mon Sep 17 00:00:00 2001 From: Wei Jia Date: Mon, 22 Sep 2014 15:21:11 -0700 Subject: NuPlayer will notify SeekComplete only when requested so. Bug: 17596535 Change-Id: I6b744fdcf80f11d521d26c7c8b45f7de70aa0dc3 --- media/libmediaplayerservice/nuplayer/NuPlayer.cpp | 35 ++++++++++++++-------- media/libmediaplayerservice/nuplayer/NuPlayer.h | 7 +++-- .../nuplayer/NuPlayerDriver.cpp | 6 ++-- 3 files changed, 29 insertions(+), 19 deletions(-) (limited to 'media/libmediaplayerservice') diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp index dad480d..d2caf65 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp @@ -64,16 +64,18 @@ private: }; struct NuPlayer::SeekAction : public Action { - SeekAction(int64_t seekTimeUs) - : mSeekTimeUs(seekTimeUs) { + SeekAction(int64_t seekTimeUs, bool needNotify) + : mSeekTimeUs(seekTimeUs), + mNeedNotify(needNotify) { } virtual void execute(NuPlayer *player) { - player->performSeek(mSeekTimeUs); + player->performSeek(mSeekTimeUs, mNeedNotify); } private: int64_t mSeekTimeUs; + bool mNeedNotify; DISALLOW_EVIL_CONSTRUCTORS(SeekAction); }; @@ -323,9 +325,10 @@ void NuPlayer::resetAsync() { (new AMessage(kWhatReset, id()))->post(); } -void NuPlayer::seekToAsync(int64_t seekTimeUs) { +void NuPlayer::seekToAsync(int64_t seekTimeUs, bool needNotify) { sp msg = new AMessage(kWhatSeek, id()); msg->setInt64("seekTimeUs", seekTimeUs); + msg->setInt32("needNotify", needNotify); msg->post(); } @@ -560,7 +563,8 @@ void NuPlayer::onMessageReceived(const sp &msg) { // the extractor may not yet be started and will assert. // If the video decoder is not set (perhaps audio only in this case) // do not perform a seek as it is not needed. - mDeferredActions.push_back(new SeekAction(mCurrentPositionUs)); + mDeferredActions.push_back( + new SeekAction(mCurrentPositionUs, false /* needNotify */)); } // If there is a new surface texture, instantiate decoders @@ -926,7 +930,7 @@ void NuPlayer::onMessageReceived(const sp &msg) { mRenderer->signalDisableOffloadAudio(); mOffloadAudio = false; - performSeek(positionUs); + performSeek(positionUs, false /* needNotify */); instantiateDecoder(true /* audio */, &mAudioDecoder); } break; @@ -955,14 +959,18 @@ void NuPlayer::onMessageReceived(const sp &msg) { case kWhatSeek: { int64_t seekTimeUs; + int32_t needNotify; CHECK(msg->findInt64("seekTimeUs", &seekTimeUs)); + CHECK(msg->findInt32("needNotify", &needNotify)); - ALOGV("kWhatSeek seekTimeUs=%lld us", seekTimeUs); + ALOGV("kWhatSeek seekTimeUs=%lld us, needNotify=%d", + seekTimeUs, needNotify); mDeferredActions.push_back( new SimpleAction(&NuPlayer::performDecoderFlush)); - mDeferredActions.push_back(new SeekAction(seekTimeUs)); + mDeferredActions.push_back( + new SeekAction(seekTimeUs, needNotify)); processDeferredActions(); break; @@ -1774,10 +1782,11 @@ void NuPlayer::processDeferredActions() { } } -void NuPlayer::performSeek(int64_t seekTimeUs) { - ALOGV("performSeek seekTimeUs=%lld us (%.2f secs)", +void NuPlayer::performSeek(int64_t seekTimeUs, bool needNotify) { + ALOGV("performSeek seekTimeUs=%lld us (%.2f secs), needNotify(%d)", seekTimeUs, - seekTimeUs / 1E6); + seekTimeUs / 1E6, + needNotify); if (mSource == NULL) { // This happens when reset occurs right before the loop mode @@ -1794,7 +1803,9 @@ void NuPlayer::performSeek(int64_t seekTimeUs) { sp driver = mDriver.promote(); if (driver != NULL) { driver->notifyPosition(seekTimeUs); - driver->notifySeekComplete(); + if (needNotify) { + driver->notifySeekComplete(); + } } } diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.h b/media/libmediaplayerservice/nuplayer/NuPlayer.h index 7197e5f..18cfe86 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayer.h +++ b/media/libmediaplayerservice/nuplayer/NuPlayer.h @@ -59,8 +59,9 @@ struct NuPlayer : public AHandler { // Will notify the driver through "notifyResetComplete" once finished. void resetAsync(); - // Will notify the driver through "notifySeekComplete" once finished. - void seekToAsync(int64_t seekTimeUs); + // Will notify the driver through "notifySeekComplete" once finished + // and needNotify is true. + void seekToAsync(int64_t seekTimeUs, bool needNotify = false); status_t setVideoScalingMode(int32_t mode); status_t getTrackInfo(Parcel* reply) const; @@ -214,7 +215,7 @@ private: void processDeferredActions(); - void performSeek(int64_t seekTimeUs); + void performSeek(int64_t seekTimeUs, bool needNotify); void performDecoderFlush(); void performDecoderShutdown(bool audio, bool video); void performReset(); diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp index 7ec9876..a9bca49 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp @@ -240,9 +240,7 @@ status_t NuPlayerDriver::start() { mPlayer->start(); if (mStartupSeekTimeUs >= 0) { - if (mStartupSeekTimeUs == 0) { - notifySeekComplete_l(); - } else { + if (mStartupSeekTimeUs > 0) { mPlayer->seekToAsync(mStartupSeekTimeUs); } @@ -369,7 +367,7 @@ status_t NuPlayerDriver::seekTo(int msec) { mAtEOS = false; // seeks can take a while, so we essentially paused notifyListener_l(MEDIA_PAUSED); - mPlayer->seekToAsync(seekTimeUs); + mPlayer->seekToAsync(seekTimeUs, true /* needNotify */); break; } -- cgit v1.1