summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarco Nelissen <marcone@google.com>2013-09-27 12:13:52 -0700
committerMarco Nelissen <marcone@google.com>2013-09-27 12:38:22 -0700
commit42c5ae81036d4002da3fe1e3b1016131ba737e74 (patch)
tree3dab209f962470f558ee4e64238831bd23b71aa6
parent6914de6dd1d74fcf74e3247c89f9293fbf7bafe5 (diff)
downloadframeworks_av-42c5ae81036d4002da3fe1e3b1016131ba737e74.zip
frameworks_av-42c5ae81036d4002da3fe1e3b1016131ba737e74.tar.gz
frameworks_av-42c5ae81036d4002da3fe1e3b1016131ba737e74.tar.bz2
Prevent onPrepared callback from being called twice
b/10891995 Change-Id: If6845c832d114629282f0b03f904a37c3325208e
-rw-r--r--media/libstagefright/AwesomePlayer.cpp36
-rw-r--r--media/libstagefright/include/AwesomePlayer.h2
2 files changed, 21 insertions, 17 deletions
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp
index 5fbee7e..bcf9cd3 100644
--- a/media/libstagefright/AwesomePlayer.cpp
+++ b/media/libstagefright/AwesomePlayer.cpp
@@ -259,6 +259,7 @@ void AwesomePlayer::cancelPlayerEvents(bool keepNotifications) {
mQueue.cancelEvent(mBufferingEvent->eventID());
mBufferingEventPending = false;
+ mAudioTearDown = false;
}
}
@@ -2301,6 +2302,7 @@ void AwesomePlayer::abortPrepare(status_t err) {
modifyFlags((PREPARING|PREPARE_CANCELLED|PREPARING_CONNECTED), CLEAR);
mAsyncPrepareEvent = NULL;
mPreparedCondition.broadcast();
+ mAudioTearDown = false;
}
// static
@@ -2374,6 +2376,20 @@ void AwesomePlayer::finishAsyncPrepare_l() {
modifyFlags(PREPARED, SET);
mAsyncPrepareEvent = NULL;
mPreparedCondition.broadcast();
+
+ if (mAudioTearDown) {
+ if (mPrepareResult == OK) {
+ if (mExtractorFlags & MediaExtractor::CAN_SEEK) {
+ seekTo_l(mAudioTearDownPosition);
+ }
+
+ if (mAudioTearDownWasPlaying) {
+ modifyFlags(CACHE_UNDERRUN, CLEAR);
+ play_l();
+ }
+ }
+ mAudioTearDown = false;
+ }
}
uint32_t AwesomePlayer::flags() const {
@@ -2791,7 +2807,7 @@ void AwesomePlayer::onAudioTearDownEvent() {
ALOGV("onAudioTearDownEvent");
// stream info is cleared by reset_l() so copy what we need
- const bool wasPlaying = (mFlags & PLAYING);
+ mAudioTearDownWasPlaying = (mFlags & PLAYING);
KeyedVector<String8, String8> uriHeaders(mUriHeaders);
sp<DataSource> fileSource(mFileSource);
@@ -2800,8 +2816,7 @@ void AwesomePlayer::onAudioTearDownEvent() {
mStatsLock.unlock();
// get current position so we can start recreated stream from here
- int64_t position = 0;
- getPosition(&position);
+ getPosition(&mAudioTearDownPosition);
// Reset and recreate
reset_l();
@@ -2825,21 +2840,8 @@ void AwesomePlayer::onAudioTearDownEvent() {
mAudioTearDown = true;
mIsAsyncPrepare = true;
- // Call parepare for the host decoding
+ // Call prepare for the host decoding
beginPrepareAsync_l();
-
- if (mPrepareResult == OK) {
- if (mExtractorFlags & MediaExtractor::CAN_SEEK) {
- seekTo_l(position);
- }
-
- if (wasPlaying) {
- modifyFlags(CACHE_UNDERRUN, CLEAR);
- play_l();
- }
- }
-
- mAudioTearDown = false;
}
} // namespace android
diff --git a/media/libstagefright/include/AwesomePlayer.h b/media/libstagefright/include/AwesomePlayer.h
index b001cf4..271df8e 100644
--- a/media/libstagefright/include/AwesomePlayer.h
+++ b/media/libstagefright/include/AwesomePlayer.h
@@ -342,6 +342,8 @@ private:
bool mOffloadAudio;
bool mAudioTearDown;
+ bool mAudioTearDownWasPlaying;
+ int64_t mAudioTearDownPosition;
status_t setVideoScalingMode(int32_t mode);
status_t setVideoScalingMode_l(int32_t mode);