summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Laurent <elaurent@google.com>2013-09-27 16:29:36 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2013-09-27 16:29:36 +0000
commitf2c8b02786c58b98d41d3f7c30e882cacc34e7ab (patch)
tree32ef7801b774457edf670fbdde13f423286b646e
parent0b74d2b49b418d55f642c87c126fc0a4f71f89a4 (diff)
parent91b0ca1a5bea44dd9b5196910186dd2927821994 (diff)
downloadframeworks_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.cpp34
-rw-r--r--media/libstagefright/AwesomePlayer.cpp7
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);
}