Finer-grained locking in AwesomePlayer, position and duration are now protected by a separate mutex that's only held for brief moments of time.
Change-Id: I989baf5a0ea8923985c560c2ec274abda0780242
related-to-bug: 2546577
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp
index 05e23d1..842176e 100644
--- a/media/libstagefright/AwesomePlayer.cpp
+++ b/media/libstagefright/AwesomePlayer.cpp
@@ -423,21 +423,23 @@
}
mBufferingEventPending = false;
- if (mDurationUs >= 0) {
+ int64_t durationUs;
+ {
+ Mutex::Autolock autoLock(mMiscStateLock);
+ durationUs = mDurationUs;
+ }
+
+ if (durationUs >= 0) {
int64_t cachedDurationUs = mPrefetcher->getCachedDurationUs();
LOGV("cache holds %.2f secs worth of data.", cachedDurationUs / 1E6);
- int64_t positionUs = 0;
- if (mVideoSource != NULL) {
- positionUs = mVideoTimeUs;
- } else if (mAudioPlayer != NULL) {
- positionUs = mAudioPlayer->getMediaTimeUs();
- }
+ int64_t positionUs;
+ getPosition(&positionUs);
cachedDurationUs += positionUs;
- double percentage = (double)cachedDurationUs / mDurationUs;
+ double percentage = (double)cachedDurationUs / durationUs;
notifyListener_l(MEDIA_BUFFERING_UPDATE, percentage * 100.0);
postBufferingEvent_l();
@@ -653,7 +655,7 @@
}
status_t AwesomePlayer::getDuration(int64_t *durationUs) {
- Mutex::Autolock autoLock(mLock);
+ Mutex::Autolock autoLock(mMiscStateLock);
if (mDurationUs < 0) {
return UNKNOWN_ERROR;
@@ -665,12 +667,8 @@
}
status_t AwesomePlayer::getPosition(int64_t *positionUs) {
- Mutex::Autolock autoLock(mLock);
- return getPosition_l(positionUs);
-}
-
-status_t AwesomePlayer::getPosition_l(int64_t *positionUs) {
if (mVideoSource != NULL) {
+ Mutex::Autolock autoLock(mMiscStateLock);
*positionUs = mVideoTimeUs;
} else if (mAudioPlayer != NULL) {
*positionUs = mAudioPlayer->getMediaTimeUs();
@@ -748,6 +746,7 @@
if (mAudioSource != NULL) {
int64_t durationUs;
if (mAudioTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) {
+ Mutex::Autolock autoLock(mMiscStateLock);
if (mDurationUs < 0 || durationUs > mDurationUs) {
mDurationUs = durationUs;
}
@@ -778,6 +777,7 @@
if (mVideoSource != NULL) {
int64_t durationUs;
if (mVideoTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) {
+ Mutex::Autolock autoLock(mMiscStateLock);
if (mDurationUs < 0 || durationUs > mDurationUs) {
mDurationUs = durationUs;
}
@@ -857,7 +857,10 @@
int64_t timeUs;
CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &timeUs));
- mVideoTimeUs = timeUs;
+ {
+ Mutex::Autolock autoLock(mMiscStateLock);
+ mVideoTimeUs = timeUs;
+ }
if (mSeeking) {
if (mAudioPlayer != NULL) {
@@ -1174,7 +1177,7 @@
prefetcher.clear();
if (result == OK) {
- LOGV("prefetcher is done preparing");
+ LOGI("prefetcher is done preparing");
} else {
Mutex::Autolock autoLock(mLock);
@@ -1231,7 +1234,7 @@
state->mFileSource = mFileSource;
state->mFlags = mFlags & (PLAYING | LOOPING | AT_EOS);
- getPosition_l(&state->mPositionUs);
+ getPosition(&state->mPositionUs);
if (mLastVideoBuffer) {
size_t size = mLastVideoBuffer->range_length();
diff --git a/media/libstagefright/include/AwesomePlayer.h b/media/libstagefright/include/AwesomePlayer.h
index 610f913..c985dff 100644
--- a/media/libstagefright/include/AwesomePlayer.h
+++ b/media/libstagefright/include/AwesomePlayer.h
@@ -98,6 +98,7 @@
};
mutable Mutex mLock;
+ Mutex mMiscStateLock;
OMXClient mClient;
TimedEventQueue mQueue;
@@ -155,7 +156,6 @@
void postBufferingEvent_l();
void postStreamDoneEvent_l(status_t status);
void postCheckAudioStatusEvent_l();
- status_t getPosition_l(int64_t *positionUs);
status_t play_l();
MediaBuffer *mLastVideoBuffer;