diff options
author | Wei Jia <wjia@google.com> | 2014-12-18 10:44:17 -0800 |
---|---|---|
committer | Wei Jia <wjia@google.com> | 2014-12-19 11:29:30 -0800 |
commit | d4cdba18ba7d0057ae54ec7efa5871b1a9d8beca (patch) | |
tree | 6a8a44525450cb0a0d13ab0c60ad31c47bed9f1b /media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp | |
parent | e48cf5b8f823c30af93577c1e380d752ac69b871 (diff) | |
download | frameworks_av-d4cdba18ba7d0057ae54ec7efa5871b1a9d8beca.zip frameworks_av-d4cdba18ba7d0057ae54ec7efa5871b1a9d8beca.tar.gz frameworks_av-d4cdba18ba7d0057ae54ec7efa5871b1a9d8beca.tar.bz2 |
NuPlayer: reports paused position in paused state.
Bug: 18733773
Change-Id: I993a4bf108913ab98a0294d7dcf7605349f7029b
Diffstat (limited to 'media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp')
-rw-r--r-- | media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp | 52 |
1 files changed, 48 insertions, 4 deletions
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp index 21b74ee..08c49f2 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp @@ -68,6 +68,7 @@ NuPlayer::Renderer::Renderer( mNotifyCompleteVideo(false), mSyncQueues(false), mPaused(false), + mPausePositionMediaTimeUs(0), mVideoSampleReceived(false), mVideoRenderingStarted(false), mVideoRenderingStartGeneration(0), @@ -166,11 +167,48 @@ void NuPlayer::Renderer::setVideoFrameRate(float fps) { msg->post(); } +// Called on any threads, except renderer's thread. status_t NuPlayer::Renderer::getCurrentPosition(int64_t *mediaUs) { - return getCurrentPosition(mediaUs, ALooper::GetNowUs()); + { + Mutex::Autolock autoLock(mLock); + int64_t currentPositionUs; + if (getCurrentPositionIfPaused_l(¤tPositionUs)) { + *mediaUs = currentPositionUs; + return OK; + } + } + return getCurrentPositionFromAnchor(mediaUs, ALooper::GetNowUs()); +} + +// Called on only renderer's thread. +status_t NuPlayer::Renderer::getCurrentPositionOnLooper(int64_t *mediaUs) { + return getCurrentPositionOnLooper(mediaUs, ALooper::GetNowUs()); } -status_t NuPlayer::Renderer::getCurrentPosition( +// Called on only renderer's thread. +// Since mPaused and mPausePositionMediaTimeUs are changed only on renderer's +// thread, no need to acquire mLock. +status_t NuPlayer::Renderer::getCurrentPositionOnLooper( + int64_t *mediaUs, int64_t nowUs, bool allowPastQueuedVideo) { + int64_t currentPositionUs; + if (getCurrentPositionIfPaused_l(¤tPositionUs)) { + *mediaUs = currentPositionUs; + return OK; + } + return getCurrentPositionFromAnchor(mediaUs, nowUs, allowPastQueuedVideo); +} + +// Called either with mLock acquired or on renderer's thread. +bool NuPlayer::Renderer::getCurrentPositionIfPaused_l(int64_t *mediaUs) { + if (!mPaused) { + return false; + } + *mediaUs = mPausePositionMediaTimeUs; + return true; +} + +// Called on any threads. +status_t NuPlayer::Renderer::getCurrentPositionFromAnchor( int64_t *mediaUs, int64_t nowUs, bool allowPastQueuedVideo) { Mutex::Autolock autoLock(mTimeLock); if (!mHasAudio && !mHasVideo) { @@ -715,7 +753,8 @@ int64_t NuPlayer::Renderer::getPendingAudioPlayoutDurationUs(int64_t nowUs) { int64_t NuPlayer::Renderer::getRealTimeUs(int64_t mediaTimeUs, int64_t nowUs) { int64_t currentPositionUs; - if (getCurrentPosition(¤tPositionUs, nowUs, true /* allowPastQueuedVideo */) != OK) { + if (getCurrentPositionOnLooper( + ¤tPositionUs, nowUs, true /* allowPastQueuedVideo */) != OK) { // If failed to get current position, e.g. due to audio clock is not ready, then just // play out video immediately without delay. return nowUs; @@ -1176,6 +1215,11 @@ void NuPlayer::Renderer::onPause() { ALOGW("Renderer::onPause() called while already paused!"); return; } + int64_t currentPositionUs; + if (getCurrentPositionFromAnchor( + ¤tPositionUs, ALooper::GetNowUs()) == OK) { + mPausePositionMediaTimeUs = currentPositionUs; + } { Mutex::Autolock autoLock(mLock); ++mAudioQueueGeneration; @@ -1303,7 +1347,7 @@ void NuPlayer::Renderer::onAudioOffloadTearDown(AudioOffloadTearDownReason reaso mAudioOffloadTornDown = true; int64_t currentPositionUs; - if (getCurrentPosition(¤tPositionUs) != OK) { + if (getCurrentPositionOnLooper(¤tPositionUs) != OK) { currentPositionUs = 0; } |