diff options
author | Eric Laurent <elaurent@google.com> | 2013-09-27 16:29:36 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2013-09-27 16:29:36 +0000 |
commit | f2c8b02786c58b98d41d3f7c30e882cacc34e7ab (patch) | |
tree | 32ef7801b774457edf670fbdde13f423286b646e | |
parent | 0b74d2b49b418d55f642c87c126fc0a4f71f89a4 (diff) | |
parent | 91b0ca1a5bea44dd9b5196910186dd2927821994 (diff) | |
download | frameworks_av-f2c8b02786c58b98d41d3f7c30e882cacc34e7ab.zip frameworks_av-f2c8b02786c58b98d41d3f7c30e882cacc34e7ab.tar.gz frameworks_av-f2c8b02786c58b98d41d3f7c30e882cacc34e7ab.tar.bz2 |
Merge "fix playback position after switching to offload" into klp-dev
-rw-r--r-- | media/libstagefright/AudioPlayer.cpp | 34 | ||||
-rw-r--r-- | media/libstagefright/AwesomePlayer.cpp | 7 |
2 files changed, 28 insertions, 13 deletions
diff --git a/media/libstagefright/AudioPlayer.cpp b/media/libstagefright/AudioPlayer.cpp index e38e261..a8a8786 100644 --- a/media/libstagefright/AudioPlayer.cpp +++ b/media/libstagefright/AudioPlayer.cpp @@ -363,6 +363,7 @@ void AudioPlayer::reset() { mPositionTimeMediaUs = -1; mPositionTimeRealUs = -1; mSeeking = false; + mSeekTimeUs = 0; mReachedEOS = false; mFinalStatus = OK; mStarted = false; @@ -602,15 +603,24 @@ size_t AudioPlayer::fillBuffer(void *data, size_t size) { // need to adjust the mStartPosUs for offload decoding since parser // might not be able to get the exact seek time requested. - if (refreshSeekTime && useOffload()) { - if (postSeekComplete) { - ALOGV("fillBuffer is going to post SEEK_COMPLETE"); - mObserver->postAudioSeekComplete(); - postSeekComplete = false; - } + if (refreshSeekTime) { + if (useOffload()) { + if (postSeekComplete) { + ALOGV("fillBuffer is going to post SEEK_COMPLETE"); + mObserver->postAudioSeekComplete(); + postSeekComplete = false; + } - mStartPosUs = mPositionTimeMediaUs; - ALOGV("adjust seek time to: %.2f", mStartPosUs/ 1E6); + mStartPosUs = mPositionTimeMediaUs; + ALOGV("adjust seek time to: %.2f", mStartPosUs/ 1E6); + } + // clear seek time with mLock locked and once we have valid mPositionTimeMediaUs + // and mPositionTimeRealUs + // before clearing mSeekTimeUs check if a new seek request has been received while + // we were reading from the source with mLock released. + if (!mSeeking) { + mSeekTimeUs = 0; + } } if (!useOffload()) { @@ -741,12 +751,10 @@ int64_t AudioPlayer::getMediaTimeUs() { return mPositionTimeRealUs; } - if (mPositionTimeMediaUs < 0 || mPositionTimeRealUs < 0) { - if (mSeeking) { - return mSeekTimeUs; - } - return 0; + if (mPositionTimeMediaUs < 0 || mPositionTimeRealUs < 0) { + // mSeekTimeUs is either seek time while seeking or 0 if playback did not start. + return mSeekTimeUs; } int64_t realTimeOffset = getRealTimeUsLocked() - mPositionTimeRealUs; diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp index 5fbee7e..9b0c69a 100644 --- a/media/libstagefright/AwesomePlayer.cpp +++ b/media/libstagefright/AwesomePlayer.cpp @@ -927,6 +927,9 @@ status_t AwesomePlayer::play_l() { if ((err != OK) && mOffloadAudio) { ALOGI("play_l() cannot create offload output, fallback to sw decode"); + int64_t curTimeUs; + getPosition(&curTimeUs); + delete mAudioPlayer; mAudioPlayer = NULL; // if the player was started it will take care of stopping the source when destroyed @@ -942,6 +945,10 @@ status_t AwesomePlayer::play_l() { if (err != OK) { mAudioSource.clear(); } else { + mSeekNotificationSent = true; + if (mExtractorFlags & MediaExtractor::CAN_SEEK) { + seekTo_l(curTimeUs); + } createAudioPlayer_l(); err = startAudioPlayer_l(false); } |