summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorWei Jia <wjia@google.com>2015-01-27 11:42:42 -0800
committerWei Jia <wjia@google.com>2015-01-27 15:13:32 -0800
commit231406d597cca1c9c009f870fbb62e46b8475186 (patch)
treedb58d4edd4e0407ce8076bf3f6c9819e8f882649 /media
parent64c496c8d51c71605cd34a510da2ecd8180656ec (diff)
downloadframeworks_av-231406d597cca1c9c009f870fbb62e46b8475186.zip
frameworks_av-231406d597cca1c9c009f870fbb62e46b8475186.tar.gz
frameworks_av-231406d597cca1c9c009f870fbb62e46b8475186.tar.bz2
NuPlayerRenderer: return current real time as render time for video frame when paused.
This allows video to display immediately during seeking in paused state. Also fix some racing condition. Bug: 19153026 Change-Id: I0d7a8981ca3c121f5dbc430c2c6d8b7522edc24a
Diffstat (limited to 'media')
-rw-r--r--media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp31
-rw-r--r--media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h2
2 files changed, 18 insertions, 15 deletions
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
index 80b8493..04e52b8 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp
@@ -424,7 +424,8 @@ void NuPlayer::Renderer::onMessageReceived(const sp<AMessage> &msg) {
onDrainVideoQueue();
- postDrainVideoQueue();
+ Mutex::Autolock autoLock(mLock);
+ postDrainVideoQueue_l();
break;
}
@@ -437,7 +438,8 @@ void NuPlayer::Renderer::onMessageReceived(const sp<AMessage> &msg) {
}
mDrainVideoQueuePending = false;
- postDrainVideoQueue();
+ Mutex::Autolock autoLock(mLock);
+ postDrainVideoQueue_l();
break;
}
@@ -766,7 +768,7 @@ int64_t NuPlayer::Renderer::getPendingAudioPlayoutDurationUs(int64_t nowUs) {
int64_t NuPlayer::Renderer::getRealTimeUs(int64_t mediaTimeUs, int64_t nowUs) {
int64_t currentPositionUs;
- if (getCurrentPositionOnLooper(
+ if (mPaused || getCurrentPositionOnLooper(
&currentPositionUs, nowUs, true /* allowPastQueuedVideo */) != OK) {
// If failed to get current position, e.g. due to audio clock is not ready, then just
// play out video immediately without delay.
@@ -787,7 +789,7 @@ void NuPlayer::Renderer::onNewAudioMediaTime(int64_t mediaTimeUs) {
mediaTimeUs, nowUs + getPendingAudioPlayoutDurationUs(nowUs), mNumFramesWritten);
}
-void NuPlayer::Renderer::postDrainVideoQueue() {
+void NuPlayer::Renderer::postDrainVideoQueue_l() {
if (mDrainVideoQueuePending
|| mSyncQueues
|| (mPaused && mVideoSampleReceived)) {
@@ -823,6 +825,7 @@ void NuPlayer::Renderer::postDrainVideoQueue() {
if (mAnchorTimeMediaUs < 0) {
setAnchorTime(mediaTimeUs, nowUs);
+ mPausePositionMediaTimeUs = mediaTimeUs;
mAnchorMaxMediaUs = mediaTimeUs;
realTimeUs = nowUs;
} else {
@@ -986,16 +989,15 @@ void NuPlayer::Renderer::onQueueBuffer(const sp<AMessage> &msg) {
entry.mFinalResult = OK;
entry.mBufferOrdinal = ++mTotalBuffersQueued;
+ Mutex::Autolock autoLock(mLock);
if (audio) {
- Mutex::Autolock autoLock(mLock);
mAudioQueue.push_back(entry);
postDrainAudioQueue_l();
} else {
mVideoQueue.push_back(entry);
- postDrainVideoQueue();
+ postDrainVideoQueue_l();
}
- Mutex::Autolock autoLock(mLock);
if (!mSyncQueues || mAudioQueue.empty() || mVideoQueue.empty()) {
return;
}
@@ -1044,7 +1046,7 @@ void NuPlayer::Renderer::syncQueuesDone_l() {
}
if (!mVideoQueue.empty()) {
- postDrainVideoQueue();
+ postDrainVideoQueue_l();
}
}
@@ -1063,8 +1065,8 @@ void NuPlayer::Renderer::onQueueEOS(const sp<AMessage> &msg) {
entry.mOffset = 0;
entry.mFinalResult = finalResult;
+ Mutex::Autolock autoLock(mLock);
if (audio) {
- Mutex::Autolock autoLock(mLock);
if (mAudioQueue.empty() && mSyncQueues) {
syncQueuesDone_l();
}
@@ -1072,11 +1074,10 @@ void NuPlayer::Renderer::onQueueEOS(const sp<AMessage> &msg) {
postDrainAudioQueue_l();
} else {
if (mVideoQueue.empty() && mSyncQueues) {
- Mutex::Autolock autoLock(mLock);
syncQueuesDone_l();
}
mVideoQueue.push_back(entry);
- postDrainVideoQueue();
+ postDrainVideoQueue_l();
}
}
@@ -1229,18 +1230,20 @@ void NuPlayer::Renderer::onPause() {
return;
}
int64_t currentPositionUs;
+ int64_t pausePositionMediaTimeUs;
if (getCurrentPositionFromAnchor(
&currentPositionUs, ALooper::GetNowUs()) == OK) {
- mPausePositionMediaTimeUs = currentPositionUs;
+ pausePositionMediaTimeUs = currentPositionUs;
} else {
// Set paused position to -1 (unavailabe) if we don't have anchor time
// This could happen if client does a seekTo() immediately followed by
// pause(). Renderer will be flushed with anchor time cleared. We don't
// want to leave stale value in mPausePositionMediaTimeUs.
- mPausePositionMediaTimeUs = -1;
+ pausePositionMediaTimeUs = -1;
}
{
Mutex::Autolock autoLock(mLock);
+ mPausePositionMediaTimeUs = pausePositionMediaTimeUs;
++mAudioQueueGeneration;
++mVideoQueueGeneration;
prepareForMediaRenderingStart();
@@ -1284,7 +1287,7 @@ void NuPlayer::Renderer::onResume() {
}
if (!mVideoQueue.empty()) {
- postDrainVideoQueue();
+ postDrainVideoQueue_l();
}
}
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h
index 23907c8..98fc44d 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.h
@@ -212,7 +212,7 @@ private:
int64_t getRealTimeUs(int64_t mediaTimeUs, int64_t nowUs);
void onDrainVideoQueue();
- void postDrainVideoQueue();
+ void postDrainVideoQueue_l();
void prepareForMediaRenderingStart();
void notifyIfMediaRenderingStarted();