Loading media/libmediaplayerservice/nuplayer/NuPlayer.cpp +23 −12 Original line number Diff line number Diff line Loading @@ -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); }; Loading Loading @@ -324,9 +326,10 @@ void NuPlayer::resetAsync() { (new AMessage(kWhatReset, id()))->post(); } void NuPlayer::seekToAsync(int64_t seekTimeUs) { void NuPlayer::seekToAsync(int64_t seekTimeUs, bool needNotify) { sp<AMessage> msg = new AMessage(kWhatSeek, id()); msg->setInt64("seekTimeUs", seekTimeUs); msg->setInt32("needNotify", needNotify); msg->post(); } Loading Loading @@ -561,7 +564,8 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &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 Loading Loading @@ -940,7 +944,7 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) { mRenderer->signalDisableOffloadAudio(); mOffloadAudio = false; performSeek(positionUs); performSeek(positionUs, false /* needNotify */); instantiateDecoder(true /* audio */, &mAudioDecoder); } break; Loading Loading @@ -969,14 +973,18 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &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; Loading Loading @@ -1802,10 +1810,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 Loading @@ -1822,9 +1831,11 @@ void NuPlayer::performSeek(int64_t seekTimeUs) { sp<NuPlayerDriver> driver = mDriver.promote(); if (driver != NULL) { driver->notifyPosition(seekTimeUs); if (needNotify) { driver->notifySeekComplete(); } } } // everything's flushed, continue playback. } Loading media/libmediaplayerservice/nuplayer/NuPlayer.h +4 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -215,7 +216,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(); Loading media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp +2 −4 Original line number Diff line number Diff line Loading @@ -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); } Loading Loading @@ -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; } Loading Loading
media/libmediaplayerservice/nuplayer/NuPlayer.cpp +23 −12 Original line number Diff line number Diff line Loading @@ -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); }; Loading Loading @@ -324,9 +326,10 @@ void NuPlayer::resetAsync() { (new AMessage(kWhatReset, id()))->post(); } void NuPlayer::seekToAsync(int64_t seekTimeUs) { void NuPlayer::seekToAsync(int64_t seekTimeUs, bool needNotify) { sp<AMessage> msg = new AMessage(kWhatSeek, id()); msg->setInt64("seekTimeUs", seekTimeUs); msg->setInt32("needNotify", needNotify); msg->post(); } Loading Loading @@ -561,7 +564,8 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &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 Loading Loading @@ -940,7 +944,7 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) { mRenderer->signalDisableOffloadAudio(); mOffloadAudio = false; performSeek(positionUs); performSeek(positionUs, false /* needNotify */); instantiateDecoder(true /* audio */, &mAudioDecoder); } break; Loading Loading @@ -969,14 +973,18 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &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; Loading Loading @@ -1802,10 +1810,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 Loading @@ -1822,9 +1831,11 @@ void NuPlayer::performSeek(int64_t seekTimeUs) { sp<NuPlayerDriver> driver = mDriver.promote(); if (driver != NULL) { driver->notifyPosition(seekTimeUs); if (needNotify) { driver->notifySeekComplete(); } } } // everything's flushed, continue playback. } Loading
media/libmediaplayerservice/nuplayer/NuPlayer.h +4 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -215,7 +216,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(); Loading
media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp +2 −4 Original line number Diff line number Diff line Loading @@ -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); } Loading Loading @@ -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; } Loading