Loading media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp +42 −17 Original line number Original line Diff line number Diff line Loading @@ -36,8 +36,8 @@ NuPlayerDriver::NuPlayerDriver() mAsyncResult(UNKNOWN_ERROR), mAsyncResult(UNKNOWN_ERROR), mDurationUs(-1), mDurationUs(-1), mPositionUs(-1), mPositionUs(-1), mNotifyTimeRealUs(0), mNotifyTimeRealUs(-1), mPauseStartedTimeUs(0), mPauseStartedTimeUs(-1), mNumFramesTotal(0), mNumFramesTotal(0), mNumFramesDropped(0), mNumFramesDropped(0), mLooper(new ALooper), mLooper(new ALooper), Loading Loading @@ -240,7 +240,14 @@ status_t NuPlayerDriver::start() { } } case STATE_RUNNING: case STATE_RUNNING: { if (mAtEOS) { mPlayer->seekToAsync(0); mAtEOS = false; mPositionUs = -1; } break; break; } case STATE_PAUSED: case STATE_PAUSED: case STATE_STOPPED_AND_PREPARED: case STATE_STOPPED_AND_PREPARED: Loading @@ -255,6 +262,7 @@ status_t NuPlayerDriver::start() { } } mState = STATE_RUNNING; mState = STATE_RUNNING; mPauseStartedTimeUs = -1; return OK; return OK; } } Loading @@ -268,7 +276,7 @@ status_t NuPlayerDriver::stop() { // fall through // fall through case STATE_PAUSED: case STATE_PAUSED: notifyListener(MEDIA_STOPPED); notifyListener_l(MEDIA_STOPPED); // fall through // fall through case STATE_PREPARED: case STATE_PREPARED: Loading @@ -281,7 +289,7 @@ status_t NuPlayerDriver::stop() { default: default: return INVALID_OPERATION; return INVALID_OPERATION; } } mPauseStartedTimeUs = ALooper::GetNowUs(); setPauseStartedTimeIfNeeded(); return OK; return OK; } } Loading @@ -295,7 +303,7 @@ status_t NuPlayerDriver::pause() { return OK; return OK; case STATE_RUNNING: case STATE_RUNNING: notifyListener(MEDIA_PAUSED); notifyListener_l(MEDIA_PAUSED); mPlayer->pause(); mPlayer->pause(); break; break; Loading @@ -303,7 +311,7 @@ status_t NuPlayerDriver::pause() { return INVALID_OPERATION; return INVALID_OPERATION; } } mPauseStartedTimeUs = ALooper::GetNowUs(); setPauseStartedTimeIfNeeded(); mState = STATE_PAUSED; mState = STATE_PAUSED; return OK; return OK; Loading Loading @@ -334,7 +342,7 @@ status_t NuPlayerDriver::seekTo(int msec) { { { mAtEOS = false; mAtEOS = false; // seeks can take a while, so we essentially paused // seeks can take a while, so we essentially paused notifyListener(MEDIA_PAUSED); notifyListener_l(MEDIA_PAUSED); mPlayer->seekToAsync(seekTimeUs); mPlayer->seekToAsync(seekTimeUs); break; break; } } Loading @@ -343,6 +351,8 @@ status_t NuPlayerDriver::seekTo(int msec) { return INVALID_OPERATION; return INVALID_OPERATION; } } mPositionUs = seekTimeUs; mNotifyTimeRealUs = -1; return OK; return OK; } } Loading @@ -351,10 +361,11 @@ status_t NuPlayerDriver::getCurrentPosition(int *msec) { if (mPositionUs < 0) { if (mPositionUs < 0) { *msec = 0; *msec = 0; } else if (mNotifyTimeRealUs == -1) { *msec = mPositionUs / 1000; } else { } else { int64_t nowUs = int64_t nowUs = (mState != STATE_RUNNING ? (isPlaying() ? ALooper::GetNowUs() : mPauseStartedTimeUs); mPauseStartedTimeUs : ALooper::GetNowUs()); *msec = (mPositionUs + nowUs - mNotifyTimeRealUs + 500ll) / 1000; *msec = (mPositionUs + nowUs - mNotifyTimeRealUs + 500ll) / 1000; } } Loading Loading @@ -388,7 +399,7 @@ status_t NuPlayerDriver::reset() { { { CHECK(mIsAsyncPrepare); CHECK(mIsAsyncPrepare); notifyListener(MEDIA_PREPARED); notifyListener_l(MEDIA_PREPARED); break; break; } } Loading @@ -397,7 +408,7 @@ status_t NuPlayerDriver::reset() { } } if (mState != STATE_STOPPED) { if (mState != STATE_STOPPED) { notifyListener(MEDIA_STOPPED); notifyListener_l(MEDIA_STOPPED); } } mState = STATE_RESET_IN_PROGRESS; mState = STATE_RESET_IN_PROGRESS; Loading Loading @@ -552,10 +563,7 @@ void NuPlayerDriver::notifySeekComplete_l() { // no need to notify listener // no need to notify listener return; return; } } // note: notifyListener called with lock released notifyListener_l(wasSeeking ? MEDIA_SEEK_COMPLETE : MEDIA_PREPARED); mLock.unlock(); notifyListener(wasSeeking ? MEDIA_SEEK_COMPLETE : MEDIA_PREPARED); mLock.lock(); } } void NuPlayerDriver::notifyFrameStats( void NuPlayerDriver::notifyFrameStats( Loading Loading @@ -587,11 +595,19 @@ status_t NuPlayerDriver::dump( void NuPlayerDriver::notifyListener( void NuPlayerDriver::notifyListener( int msg, int ext1, int ext2, const Parcel *in) { int msg, int ext1, int ext2, const Parcel *in) { Mutex::Autolock autoLock(mLock); notifyListener_l(msg, ext1, ext2, in); } void NuPlayerDriver::notifyListener_l( int msg, int ext1, int ext2, const Parcel *in) { switch (msg) { switch (msg) { case MEDIA_PLAYBACK_COMPLETE: case MEDIA_PLAYBACK_COMPLETE: { { if (mLooping) { if (mLooping) { mLock.unlock(); mPlayer->seekToAsync(0); mPlayer->seekToAsync(0); mLock.lock(); break; break; } } // fall through // fall through Loading @@ -600,6 +616,7 @@ void NuPlayerDriver::notifyListener( case MEDIA_ERROR: case MEDIA_ERROR: { { mAtEOS = true; mAtEOS = true; setPauseStartedTimeIfNeeded(); break; break; } } Loading @@ -607,7 +624,9 @@ void NuPlayerDriver::notifyListener( break; break; } } mLock.unlock(); sendEvent(msg, ext1, ext2, in); sendEvent(msg, ext1, ext2, in); mLock.lock(); } } void NuPlayerDriver::notifySetDataSourceCompleted(status_t err) { void NuPlayerDriver::notifySetDataSourceCompleted(status_t err) { Loading Loading @@ -637,12 +656,12 @@ void NuPlayerDriver::notifyPrepareCompleted(status_t err) { if (err == OK) { if (err == OK) { if (mIsAsyncPrepare) { if (mIsAsyncPrepare) { notifyListener(MEDIA_PREPARED); notifyListener_l(MEDIA_PREPARED); } } mState = STATE_PREPARED; mState = STATE_PREPARED; } else { } else { if (mIsAsyncPrepare) { if (mIsAsyncPrepare) { notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); } } mState = STATE_UNPREPARED; mState = STATE_UNPREPARED; } } Loading @@ -656,4 +675,10 @@ void NuPlayerDriver::notifyFlagsChanged(uint32_t flags) { mPlayerFlags = flags; mPlayerFlags = flags; } } void NuPlayerDriver::setPauseStartedTimeIfNeeded() { if (mPauseStartedTimeUs == -1) { mPauseStartedTimeUs = ALooper::GetNowUs(); } } } // namespace android } // namespace android media/libmediaplayerservice/nuplayer/NuPlayerDriver.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -120,6 +120,8 @@ private: int64_t mStartupSeekTimeUs; int64_t mStartupSeekTimeUs; status_t prepare_l(); status_t prepare_l(); void notifyListener_l(int msg, int ext1 = 0, int ext2 = 0, const Parcel *in = NULL); void setPauseStartedTimeIfNeeded(); DISALLOW_EVIL_CONSTRUCTORS(NuPlayerDriver); DISALLOW_EVIL_CONSTRUCTORS(NuPlayerDriver); }; }; Loading Loading
media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp +42 −17 Original line number Original line Diff line number Diff line Loading @@ -36,8 +36,8 @@ NuPlayerDriver::NuPlayerDriver() mAsyncResult(UNKNOWN_ERROR), mAsyncResult(UNKNOWN_ERROR), mDurationUs(-1), mDurationUs(-1), mPositionUs(-1), mPositionUs(-1), mNotifyTimeRealUs(0), mNotifyTimeRealUs(-1), mPauseStartedTimeUs(0), mPauseStartedTimeUs(-1), mNumFramesTotal(0), mNumFramesTotal(0), mNumFramesDropped(0), mNumFramesDropped(0), mLooper(new ALooper), mLooper(new ALooper), Loading Loading @@ -240,7 +240,14 @@ status_t NuPlayerDriver::start() { } } case STATE_RUNNING: case STATE_RUNNING: { if (mAtEOS) { mPlayer->seekToAsync(0); mAtEOS = false; mPositionUs = -1; } break; break; } case STATE_PAUSED: case STATE_PAUSED: case STATE_STOPPED_AND_PREPARED: case STATE_STOPPED_AND_PREPARED: Loading @@ -255,6 +262,7 @@ status_t NuPlayerDriver::start() { } } mState = STATE_RUNNING; mState = STATE_RUNNING; mPauseStartedTimeUs = -1; return OK; return OK; } } Loading @@ -268,7 +276,7 @@ status_t NuPlayerDriver::stop() { // fall through // fall through case STATE_PAUSED: case STATE_PAUSED: notifyListener(MEDIA_STOPPED); notifyListener_l(MEDIA_STOPPED); // fall through // fall through case STATE_PREPARED: case STATE_PREPARED: Loading @@ -281,7 +289,7 @@ status_t NuPlayerDriver::stop() { default: default: return INVALID_OPERATION; return INVALID_OPERATION; } } mPauseStartedTimeUs = ALooper::GetNowUs(); setPauseStartedTimeIfNeeded(); return OK; return OK; } } Loading @@ -295,7 +303,7 @@ status_t NuPlayerDriver::pause() { return OK; return OK; case STATE_RUNNING: case STATE_RUNNING: notifyListener(MEDIA_PAUSED); notifyListener_l(MEDIA_PAUSED); mPlayer->pause(); mPlayer->pause(); break; break; Loading @@ -303,7 +311,7 @@ status_t NuPlayerDriver::pause() { return INVALID_OPERATION; return INVALID_OPERATION; } } mPauseStartedTimeUs = ALooper::GetNowUs(); setPauseStartedTimeIfNeeded(); mState = STATE_PAUSED; mState = STATE_PAUSED; return OK; return OK; Loading Loading @@ -334,7 +342,7 @@ status_t NuPlayerDriver::seekTo(int msec) { { { mAtEOS = false; mAtEOS = false; // seeks can take a while, so we essentially paused // seeks can take a while, so we essentially paused notifyListener(MEDIA_PAUSED); notifyListener_l(MEDIA_PAUSED); mPlayer->seekToAsync(seekTimeUs); mPlayer->seekToAsync(seekTimeUs); break; break; } } Loading @@ -343,6 +351,8 @@ status_t NuPlayerDriver::seekTo(int msec) { return INVALID_OPERATION; return INVALID_OPERATION; } } mPositionUs = seekTimeUs; mNotifyTimeRealUs = -1; return OK; return OK; } } Loading @@ -351,10 +361,11 @@ status_t NuPlayerDriver::getCurrentPosition(int *msec) { if (mPositionUs < 0) { if (mPositionUs < 0) { *msec = 0; *msec = 0; } else if (mNotifyTimeRealUs == -1) { *msec = mPositionUs / 1000; } else { } else { int64_t nowUs = int64_t nowUs = (mState != STATE_RUNNING ? (isPlaying() ? ALooper::GetNowUs() : mPauseStartedTimeUs); mPauseStartedTimeUs : ALooper::GetNowUs()); *msec = (mPositionUs + nowUs - mNotifyTimeRealUs + 500ll) / 1000; *msec = (mPositionUs + nowUs - mNotifyTimeRealUs + 500ll) / 1000; } } Loading Loading @@ -388,7 +399,7 @@ status_t NuPlayerDriver::reset() { { { CHECK(mIsAsyncPrepare); CHECK(mIsAsyncPrepare); notifyListener(MEDIA_PREPARED); notifyListener_l(MEDIA_PREPARED); break; break; } } Loading @@ -397,7 +408,7 @@ status_t NuPlayerDriver::reset() { } } if (mState != STATE_STOPPED) { if (mState != STATE_STOPPED) { notifyListener(MEDIA_STOPPED); notifyListener_l(MEDIA_STOPPED); } } mState = STATE_RESET_IN_PROGRESS; mState = STATE_RESET_IN_PROGRESS; Loading Loading @@ -552,10 +563,7 @@ void NuPlayerDriver::notifySeekComplete_l() { // no need to notify listener // no need to notify listener return; return; } } // note: notifyListener called with lock released notifyListener_l(wasSeeking ? MEDIA_SEEK_COMPLETE : MEDIA_PREPARED); mLock.unlock(); notifyListener(wasSeeking ? MEDIA_SEEK_COMPLETE : MEDIA_PREPARED); mLock.lock(); } } void NuPlayerDriver::notifyFrameStats( void NuPlayerDriver::notifyFrameStats( Loading Loading @@ -587,11 +595,19 @@ status_t NuPlayerDriver::dump( void NuPlayerDriver::notifyListener( void NuPlayerDriver::notifyListener( int msg, int ext1, int ext2, const Parcel *in) { int msg, int ext1, int ext2, const Parcel *in) { Mutex::Autolock autoLock(mLock); notifyListener_l(msg, ext1, ext2, in); } void NuPlayerDriver::notifyListener_l( int msg, int ext1, int ext2, const Parcel *in) { switch (msg) { switch (msg) { case MEDIA_PLAYBACK_COMPLETE: case MEDIA_PLAYBACK_COMPLETE: { { if (mLooping) { if (mLooping) { mLock.unlock(); mPlayer->seekToAsync(0); mPlayer->seekToAsync(0); mLock.lock(); break; break; } } // fall through // fall through Loading @@ -600,6 +616,7 @@ void NuPlayerDriver::notifyListener( case MEDIA_ERROR: case MEDIA_ERROR: { { mAtEOS = true; mAtEOS = true; setPauseStartedTimeIfNeeded(); break; break; } } Loading @@ -607,7 +624,9 @@ void NuPlayerDriver::notifyListener( break; break; } } mLock.unlock(); sendEvent(msg, ext1, ext2, in); sendEvent(msg, ext1, ext2, in); mLock.lock(); } } void NuPlayerDriver::notifySetDataSourceCompleted(status_t err) { void NuPlayerDriver::notifySetDataSourceCompleted(status_t err) { Loading Loading @@ -637,12 +656,12 @@ void NuPlayerDriver::notifyPrepareCompleted(status_t err) { if (err == OK) { if (err == OK) { if (mIsAsyncPrepare) { if (mIsAsyncPrepare) { notifyListener(MEDIA_PREPARED); notifyListener_l(MEDIA_PREPARED); } } mState = STATE_PREPARED; mState = STATE_PREPARED; } else { } else { if (mIsAsyncPrepare) { if (mIsAsyncPrepare) { notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); } } mState = STATE_UNPREPARED; mState = STATE_UNPREPARED; } } Loading @@ -656,4 +675,10 @@ void NuPlayerDriver::notifyFlagsChanged(uint32_t flags) { mPlayerFlags = flags; mPlayerFlags = flags; } } void NuPlayerDriver::setPauseStartedTimeIfNeeded() { if (mPauseStartedTimeUs == -1) { mPauseStartedTimeUs = ALooper::GetNowUs(); } } } // namespace android } // namespace android
media/libmediaplayerservice/nuplayer/NuPlayerDriver.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -120,6 +120,8 @@ private: int64_t mStartupSeekTimeUs; int64_t mStartupSeekTimeUs; status_t prepare_l(); status_t prepare_l(); void notifyListener_l(int msg, int ext1 = 0, int ext2 = 0, const Parcel *in = NULL); void setPauseStartedTimeIfNeeded(); DISALLOW_EVIL_CONSTRUCTORS(NuPlayerDriver); DISALLOW_EVIL_CONSTRUCTORS(NuPlayerDriver); }; }; Loading