summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2011-04-04 09:12:56 -0700
committerAndreas Huber <andih@google.com>2011-04-04 11:29:35 -0700
commitbd7b7177f88ae6e83bd7bb8bfd9b7018be923931 (patch)
treeb9a21fec8b27e404eb871682ca7de36c1df2e810 /media
parent94baecca5e14b083c46615a1bcf18ea6cf7cad46 (diff)
downloadframeworks_av-bd7b7177f88ae6e83bd7bb8bfd9b7018be923931.zip
frameworks_av-bd7b7177f88ae6e83bd7bb8bfd9b7018be923931.tar.gz
frameworks_av-bd7b7177f88ae6e83bd7bb8bfd9b7018be923931.tar.bz2
Avoid a race condition while signaling audio EOS/seek complete by acquiring the lock.
Change-Id: Idfea452ff661b264e013fe515bcd2a2762bd959c related-to-bug: 4193552
Diffstat (limited to 'media')
-rw-r--r--media/libmediaplayerservice/StagefrightPlayer.cpp2
-rw-r--r--media/libstagefright/AudioPlayer.cpp23
-rw-r--r--media/libstagefright/AwesomePlayer.cpp2
3 files changed, 22 insertions, 5 deletions
diff --git a/media/libmediaplayerservice/StagefrightPlayer.cpp b/media/libmediaplayerservice/StagefrightPlayer.cpp
index c5cbd23..6429395 100644
--- a/media/libmediaplayerservice/StagefrightPlayer.cpp
+++ b/media/libmediaplayerservice/StagefrightPlayer.cpp
@@ -110,7 +110,7 @@ bool StagefrightPlayer::isPlaying() {
}
status_t StagefrightPlayer::seekTo(int msec) {
- LOGV("seekTo");
+ LOGV("seekTo %.2f secs", msec / 1E3);
status_t err = mPlayer->seekTo((int64_t)msec * 1000);
diff --git a/media/libstagefright/AudioPlayer.cpp b/media/libstagefright/AudioPlayer.cpp
index 162d2e6..07b9522 100644
--- a/media/libstagefright/AudioPlayer.cpp
+++ b/media/libstagefright/AudioPlayer.cpp
@@ -311,6 +311,10 @@ size_t AudioPlayer::fillBuffer(void *data, size_t size) {
return size;
}
+ bool postSeekComplete = false;
+ bool postEOS = false;
+ int64_t postEOSDelayUs = 0;
+
size_t size_done = 0;
size_t size_remaining = size;
while (size_remaining > 0) {
@@ -337,7 +341,7 @@ size_t AudioPlayer::fillBuffer(void *data, size_t size) {
mSeeking = false;
if (mObserver) {
- mObserver->postAudioSeekComplete();
+ postSeekComplete = true;
}
}
}
@@ -389,7 +393,8 @@ size_t AudioPlayer::fillBuffer(void *data, size_t size) {
numFramesPendingPlayout,
timeToCompletionUs, timeToCompletionUs / 1E6);
- mObserver->postAudioEOS(timeToCompletionUs + mLatencyUs);
+ postEOS = true;
+ postEOSDelayUs = timeToCompletionUs + mLatencyUs;
}
mReachedEOS = true;
@@ -433,8 +438,18 @@ size_t AudioPlayer::fillBuffer(void *data, size_t size) {
size_remaining -= copy;
}
- Mutex::Autolock autoLock(mLock);
- mNumFramesPlayed += size_done / mFrameSize;
+ {
+ Mutex::Autolock autoLock(mLock);
+ mNumFramesPlayed += size_done / mFrameSize;
+ }
+
+ if (postEOS) {
+ mObserver->postAudioEOS(postEOSDelayUs);
+ }
+
+ if (postSeekComplete) {
+ mObserver->postAudioSeekComplete();
+ }
return size_done;
}
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp
index f25d498..f31c2ac 100644
--- a/media/libstagefright/AwesomePlayer.cpp
+++ b/media/libstagefright/AwesomePlayer.cpp
@@ -1859,10 +1859,12 @@ uint32_t AwesomePlayer::flags() const {
}
void AwesomePlayer::postAudioEOS(int64_t delayUs) {
+ Mutex::Autolock autoLock(mLock);
postCheckAudioStatusEvent_l(delayUs);
}
void AwesomePlayer::postAudioSeekComplete() {
+ Mutex::Autolock autoLock(mLock);
postCheckAudioStatusEvent_l(0 /* delayUs */);
}