summaryrefslogtreecommitdiffstats
path: root/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
diff options
context:
space:
mode:
authorLajos Molnar <lajos@google.com>2014-10-14 08:00:15 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2014-10-14 08:00:16 +0000
commit1375ac6d029b74ac392db411907b3c0ea57f08a7 (patch)
tree181c2e401c8a614e51e635a7d8f095033eb3d565 /media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
parent2edda09a2ad1d112c52acd37d323f63f0a492d67 (diff)
parenta73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57 (diff)
downloadframeworks_av-1375ac6d029b74ac392db411907b3c0ea57f08a7.zip
frameworks_av-1375ac6d029b74ac392db411907b3c0ea57f08a7.tar.gz
frameworks_av-1375ac6d029b74ac392db411907b3c0ea57f08a7.tar.bz2
Merge "NuPlayer: query current position from NuPlayerRenderer." into lmp-dev
Diffstat (limited to 'media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp')
-rw-r--r--media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp94
1 files changed, 21 insertions, 73 deletions
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
index 63c4fce..ab46074 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
@@ -26,6 +26,7 @@
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/ALooper.h>
+#include <media/stagefright/foundation/AUtils.h>
#include <media/stagefright/MetaData.h>
#include <media/stagefright/Utils.h>
@@ -38,10 +39,7 @@ NuPlayerDriver::NuPlayerDriver()
mSetSurfaceInProgress(false),
mDurationUs(-1),
mPositionUs(-1),
- mNotifyTimeRealUs(-1),
- mPauseStartedTimeUs(-1),
- mNumFramesTotal(0),
- mNumFramesDropped(0),
+ mSeekInProgress(false),
mLooper(new ALooper),
mPlayerFlags(0),
mAtEOS(false),
@@ -276,14 +274,6 @@ status_t NuPlayerDriver::start() {
mPositionUs = -1;
} else {
mPlayer->resume();
- if (mNotifyTimeRealUs != -1) {
- // Pause time must be set if here by setPauseStartedTimeIfNeeded().
- //CHECK(mPauseStartedTimeUs != -1);
-
- // if no seek occurs, adjust our notify time so that getCurrentPosition()
- // is continuous if read immediately after calling start().
- mNotifyTimeRealUs += ALooper::GetNowUs() - mPauseStartedTimeUs;
- }
}
break;
}
@@ -293,7 +283,6 @@ status_t NuPlayerDriver::start() {
}
mState = STATE_RUNNING;
- mPauseStartedTimeUs = -1;
return OK;
}
@@ -322,7 +311,6 @@ status_t NuPlayerDriver::stop() {
default:
return INVALID_OPERATION;
}
- setPauseStartedTimeIfNeeded();
return OK;
}
@@ -336,7 +324,6 @@ status_t NuPlayerDriver::pause() {
return OK;
case STATE_RUNNING:
- setPauseStartedTimeIfNeeded();
mState = STATE_PAUSED;
notifyListener_l(MEDIA_PAUSED);
mPlayer->pause();
@@ -374,6 +361,7 @@ status_t NuPlayerDriver::seekTo(int msec) {
case STATE_PAUSED:
{
mAtEOS = false;
+ mSeekInProgress = true;
// seeks can take a while, so we essentially paused
notifyListener_l(MEDIA_PAUSED);
mPlayer->seekToAsync(seekTimeUs, true /* needNotify */);
@@ -385,44 +373,23 @@ status_t NuPlayerDriver::seekTo(int msec) {
}
mPositionUs = seekTimeUs;
- mNotifyTimeRealUs = -1;
return OK;
}
status_t NuPlayerDriver::getCurrentPosition(int *msec) {
- Mutex::Autolock autoLock(mLock);
+ int64_t tempUs = 0;
+ status_t ret = mPlayer->getCurrentPosition(&tempUs);
- if (mPositionUs < 0) {
- // mPositionUs is the media time.
- // It is negative under these cases
- // (1) == -1 after reset, or very first playback, no stream notification yet.
- // (2) == -1 start after end of stream, no stream notification yet.
- // (3) == large negative # after ~292,471 years of continuous playback.
-
- //CHECK_EQ(mPositionUs, -1);
- *msec = 0;
- } else if (mNotifyTimeRealUs == -1) {
- // A seek has occurred just occurred, no stream notification yet.
- // mPositionUs (>= 0) is the new media position.
- *msec = mPositionUs / 1000;
+ Mutex::Autolock autoLock(mLock);
+ // We need to check mSeekInProgress here because mPlayer->seekToAsync is an async call, which
+ // means getCurrentPosition can be called before seek is completed. Iow, renderer may return a
+ // position value that's different the seek to position.
+ if (ret != OK || mSeekInProgress) {
+ tempUs = (mPositionUs <= 0) ? 0 : mPositionUs;
} else {
- // mPosition must be valid (i.e. >= 0) by the first check above.
- // We're either playing or have pause time set: mPauseStartedTimeUs is >= 0
- //LOG_ALWAYS_FATAL_IF(
- // !isPlaying() && mPauseStartedTimeUs < 0,
- // "Player in non-playing mState(%d) and mPauseStartedTimeUs(%lld) < 0",
- // mState, (long long)mPauseStartedTimeUs);
- ALOG_ASSERT(mNotifyTimeRealUs >= 0);
- int64_t nowUs =
- (isPlaying() ? ALooper::GetNowUs() : mPauseStartedTimeUs);
- *msec = (mPositionUs + nowUs - mNotifyTimeRealUs + 500ll) / 1000;
- // It is possible for *msec to be negative if the media position is > 596 hours.
- // but we turn on this checking in NDEBUG == 0 mode.
- ALOG_ASSERT(*msec >= 0);
- ALOGV("getCurrentPosition nowUs(%lld)", (long long)nowUs);
+ mPositionUs = tempUs;
}
- ALOGV("getCurrentPosition returning(%d) mPositionUs(%lld) mNotifyRealTimeUs(%lld)",
- *msec, (long long)mPositionUs, (long long)mNotifyTimeRealUs);
+ *msec = (int)divRound(tempUs, (int64_t)(1000));
return OK;
}
@@ -605,17 +572,10 @@ void NuPlayerDriver::notifyDuration(int64_t durationUs) {
mDurationUs = durationUs;
}
-void NuPlayerDriver::notifyPosition(int64_t positionUs) {
- Mutex::Autolock autoLock(mLock);
- if (isPlaying()) {
- mPositionUs = positionUs;
- mNotifyTimeRealUs = ALooper::GetNowUs();
- }
-}
-
void NuPlayerDriver::notifySeekComplete() {
ALOGV("notifySeekComplete(%p)", this);
Mutex::Autolock autoLock(mLock);
+ mSeekInProgress = false;
notifySeekComplete_l();
}
@@ -636,26 +596,21 @@ void NuPlayerDriver::notifySeekComplete_l() {
notifyListener_l(wasSeeking ? MEDIA_SEEK_COMPLETE : MEDIA_PREPARED);
}
-void NuPlayerDriver::notifyFrameStats(
- int64_t numFramesTotal, int64_t numFramesDropped) {
- Mutex::Autolock autoLock(mLock);
- mNumFramesTotal = numFramesTotal;
- mNumFramesDropped = numFramesDropped;
-}
-
status_t NuPlayerDriver::dump(
int fd, const Vector<String16> & /* args */) const {
- Mutex::Autolock autoLock(mLock);
+ int64_t numFramesTotal;
+ int64_t numFramesDropped;
+ mPlayer->getStats(&numFramesTotal, &numFramesDropped);
FILE *out = fdopen(dup(fd), "w");
fprintf(out, " NuPlayer\n");
fprintf(out, " numFramesTotal(%" PRId64 "), numFramesDropped(%" PRId64 "), "
"percentageDropped(%.2f)\n",
- mNumFramesTotal,
- mNumFramesDropped,
- mNumFramesTotal == 0
- ? 0.0 : (double)mNumFramesDropped / mNumFramesTotal);
+ numFramesTotal,
+ numFramesDropped,
+ numFramesTotal == 0
+ ? 0.0 : (double)numFramesDropped / numFramesTotal);
fclose(out);
out = NULL;
@@ -690,7 +645,6 @@ void NuPlayerDriver::notifyListener_l(
case MEDIA_ERROR:
{
mAtEOS = true;
- setPauseStartedTimeIfNeeded();
break;
}
@@ -758,10 +712,4 @@ void NuPlayerDriver::notifyFlagsChanged(uint32_t flags) {
mPlayerFlags = flags;
}
-void NuPlayerDriver::setPauseStartedTimeIfNeeded() {
- if (mPauseStartedTimeUs == -1) {
- mPauseStartedTimeUs = ALooper::GetNowUs();
- }
-}
-
} // namespace android