MediaPlayer2: use long type for media time.
Test: MediaPlayer2 plays
Bug: 63934228
Change-Id: I85cca6c24c116b2f53079cd081a1f5172af3a099
diff --git a/media/libmediaplayer2/include/mediaplayer2/MediaPlayer2AudioOutput.h b/media/libmediaplayer2/include/mediaplayer2/MediaPlayer2AudioOutput.h
index ad4937a..5d5b8e4 100644
--- a/media/libmediaplayer2/include/mediaplayer2/MediaPlayer2AudioOutput.h
+++ b/media/libmediaplayer2/include/mediaplayer2/MediaPlayer2AudioOutput.h
@@ -87,7 +87,6 @@
static bool isOnEmulator();
static int getMinBufferCount();
- void setNextOutput(const sp<MediaPlayer2AudioOutput>& nextOutput);
virtual bool needsTrailingPadding() {
return true;
// TODO: return correct value.
diff --git a/media/libmediaplayer2/include/mediaplayer2/MediaPlayer2Interface.h b/media/libmediaplayer2/include/mediaplayer2/MediaPlayer2Interface.h
index 96aea7f..02bf891 100644
--- a/media/libmediaplayer2/include/mediaplayer2/MediaPlayer2Interface.h
+++ b/media/libmediaplayer2/include/mediaplayer2/MediaPlayer2Interface.h
@@ -200,9 +200,9 @@
return OK;
}
virtual status_t seekTo(
- int msec, MediaPlayer2SeekMode mode = MediaPlayer2SeekMode::SEEK_PREVIOUS_SYNC) = 0;
- virtual status_t getCurrentPosition(int *msec) = 0;
- virtual status_t getDuration(int *msec) = 0;
+ int64_t msec, MediaPlayer2SeekMode mode = MediaPlayer2SeekMode::SEEK_PREVIOUS_SYNC) = 0;
+ virtual status_t getCurrentPosition(int64_t *msec) = 0;
+ virtual status_t getDuration(int64_t *msec) = 0;
virtual status_t reset() = 0;
virtual status_t notifyAt(int64_t /* mediaTimeUs */) {
return INVALID_OPERATION;
diff --git a/media/libmediaplayer2/include/mediaplayer2/mediaplayer2.h b/media/libmediaplayer2/include/mediaplayer2/mediaplayer2.h
index 11e4f42..3433cb1 100644
--- a/media/libmediaplayer2/include/mediaplayer2/mediaplayer2.h
+++ b/media/libmediaplayer2/include/mediaplayer2/mediaplayer2.h
@@ -77,11 +77,11 @@
status_t getVideoWidth(int *w);
status_t getVideoHeight(int *h);
status_t seekTo(
- int msec,
+ int64_t msec,
MediaPlayer2SeekMode mode = MediaPlayer2SeekMode::SEEK_PREVIOUS_SYNC);
status_t notifyAt(int64_t mediaTimeUs);
- status_t getCurrentPosition(int *msec);
- status_t getDuration(int *msec);
+ status_t getCurrentPosition(int64_t *msec);
+ status_t getDuration(int64_t *msec);
status_t reset();
status_t setAudioStreamType(audio_stream_type_t type);
status_t getAudioStreamType(audio_stream_type_t *type);
@@ -99,7 +99,6 @@
status_t attachAuxEffect(int effectId);
status_t setParameter(int key, const Parcel& request);
status_t getParameter(int key, Parcel* reply);
- status_t setNextMediaPlayer(const sp<MediaPlayer2>& player);
// Modular DRM
status_t prepareDrm(const uint8_t uuid[16], const Vector<uint8_t>& drmSessionId);
@@ -131,9 +130,9 @@
status_t setAudioAttributes_l(const Parcel &request);
void clear_l();
- status_t seekTo_l(int msec, MediaPlayer2SeekMode mode);
+ status_t seekTo_l(int64_t msec, MediaPlayer2SeekMode mode);
status_t prepareAsync_l();
- status_t getDuration_l(int *msec);
+ status_t getDuration_l(int64_t *msec);
status_t reset_l();
status_t checkStateForKeySet_l(int key);
@@ -147,9 +146,9 @@
Mutex mNotifyLock;
sp<MediaPlayer2Listener> mListener;
media_player2_states mCurrentState;
- int mCurrentPosition;
+ int64_t mCurrentPosition;
MediaPlayer2SeekMode mCurrentSeekMode;
- int mSeekPosition;
+ int64_t mSeekPosition;
MediaPlayer2SeekMode mSeekMode;
audio_stream_type_t mStreamType;
Parcel* mAudioAttributesParcel;
diff --git a/media/libmediaplayer2/mediaplayer2.cpp b/media/libmediaplayer2/mediaplayer2.cpp
index b401ee8..c465caa 100644
--- a/media/libmediaplayer2/mediaplayer2.cpp
+++ b/media/libmediaplayer2/mediaplayer2.cpp
@@ -936,27 +936,27 @@
return NO_ERROR;
}
-status_t MediaPlayer2::getCurrentPosition(int *msec) {
+status_t MediaPlayer2::getCurrentPosition(int64_t *msec) {
ALOGV("getCurrentPosition");
Mutex::Autolock _l(mLock);
if (mPlayer == 0) {
return INVALID_OPERATION;
}
if (mCurrentPosition >= 0) {
- ALOGV("Using cached seek position: %d", mCurrentPosition);
+ ALOGV("Using cached seek position: %lld", (long long)mCurrentPosition);
*msec = mCurrentPosition;
return NO_ERROR;
}
status_t ret = mPlayer->getCurrentPosition(msec);
if (ret == NO_ERROR) {
- ALOGV("getCurrentPosition = %d", *msec);
+ ALOGV("getCurrentPosition = %lld", (long long)*msec);
} else {
ALOGE("getCurrentPosition returned %d", ret);
}
return ret;
}
-status_t MediaPlayer2::getDuration(int *msec) {
+status_t MediaPlayer2::getDuration(int64_t *msec) {
Mutex::Autolock _l(mLock);
ALOGV("getDuration_l");
bool isValidState = (mCurrentState & (MEDIA_PLAYER2_PREPARED | MEDIA_PLAYER2_STARTED |
@@ -966,11 +966,11 @@
mPlayer.get(), mCurrentState);
return INVALID_OPERATION;
}
- int durationMs;
+ int64_t durationMs;
status_t ret = mPlayer->getDuration(&durationMs);
if (ret == NO_ERROR) {
- ALOGV("getDuration = %d", durationMs);
+ ALOGV("getDuration = %lld", (long long)durationMs);
} else {
ALOGE("getDuration returned %d", ret);
// Do not enter error state just because no duration was available.
@@ -983,50 +983,47 @@
return OK;
}
-status_t MediaPlayer2::seekTo_l(int msec, MediaPlayer2SeekMode mode) {
- ALOGV("seekTo (%d, %d)", msec, mode);
- if ((mPlayer != 0) && ( mCurrentState & ( MEDIA_PLAYER2_STARTED | MEDIA_PLAYER2_PREPARED |
- MEDIA_PLAYER2_PAUSED | MEDIA_PLAYER2_PLAYBACK_COMPLETE) ) ) {
- if (msec < 0) {
- ALOGW("Attempt to seek to invalid position: %d", msec);
- msec = 0;
- }
-
- int durationMs;
- status_t err = mPlayer->getDuration(&durationMs);
-
- if (err != OK) {
- ALOGW("Stream has no duration and is therefore not seekable.");
- return err;
- }
-
- if (msec > durationMs) {
- ALOGW("Attempt to seek to past end of file: request = %d, "
- "durationMs = %d",
- msec,
- durationMs);
-
- msec = durationMs;
- }
-
- // cache duration
- mCurrentPosition = msec;
- mCurrentSeekMode = mode;
- if (mSeekPosition < 0) {
- mSeekPosition = msec;
- mSeekMode = mode;
- return mPlayer->seekTo(msec, mode);
- } else {
- ALOGV("Seek in progress - queue up seekTo[%d, %d]", msec, mode);
- return NO_ERROR;
- }
+status_t MediaPlayer2::seekTo_l(int64_t msec, MediaPlayer2SeekMode mode) {
+ ALOGV("seekTo (%lld, %d)", (long long)msec, mode);
+ if ((mPlayer == 0) || !(mCurrentState & (MEDIA_PLAYER2_STARTED | MEDIA_PLAYER2_PREPARED |
+ MEDIA_PLAYER2_PAUSED | MEDIA_PLAYER2_PLAYBACK_COMPLETE))) {
+ ALOGE("Attempt to perform seekTo in wrong state: mPlayer=%p, mCurrentState=%u",
+ mPlayer.get(), mCurrentState);
+ return INVALID_OPERATION;
}
- ALOGE("Attempt to perform seekTo in wrong state: mPlayer=%p, mCurrentState=%u", mPlayer.get(),
- mCurrentState);
- return INVALID_OPERATION;
+ if (msec < 0) {
+ ALOGW("Attempt to seek to invalid position: %lld", (long long)msec);
+ msec = 0;
+ }
+
+ int64_t durationMs;
+ status_t err = mPlayer->getDuration(&durationMs);
+
+ if (err != OK) {
+ ALOGW("Stream has no duration and is therefore not seekable.");
+ return err;
+ }
+
+ if (msec > durationMs) {
+ ALOGW("Attempt to seek to past end of file: request = %lld, durationMs = %lld",
+ (long long)msec, (long long)durationMs);
+
+ msec = durationMs;
+ }
+
+ // cache duration
+ mCurrentPosition = msec;
+ mCurrentSeekMode = mode;
+ if (mSeekPosition < 0) {
+ mSeekPosition = msec;
+ mSeekMode = mode;
+ return mPlayer->seekTo(msec, mode);
+ }
+ ALOGV("Seek in progress - queue up seekTo[%lld, %d]", (long long)msec, mode);
+ return NO_ERROR;
}
-status_t MediaPlayer2::seekTo(int msec, MediaPlayer2SeekMode mode) {
+status_t MediaPlayer2::seekTo(int64_t msec, MediaPlayer2SeekMode mode) {
mLockThreadId = getThreadId();
Mutex::Autolock _l(mLock);
status_t result = seekTo_l(msec, mode);
@@ -1228,6 +1225,16 @@
status_t MediaPlayer2::getParameter(int key, Parcel *reply) {
ALOGV("MediaPlayer2::getParameter(%d)", key);
Mutex::Autolock _l(mLock);
+ if (key == MEDIA2_KEY_PARAMETER_AUDIO_ATTRIBUTES) {
+ if (reply == NULL) {
+ return BAD_VALUE;
+ }
+ if (mAudioAttributesParcel != NULL) {
+ reply->appendFrom(mAudioAttributesParcel, 0, mAudioAttributesParcel->dataSize());
+ }
+ return OK;
+ }
+
if (mPlayer == NULL) {
ALOGV("getParameter: no active player");
return INVALID_OPERATION;
@@ -1339,7 +1346,8 @@
case MEDIA2_SEEK_COMPLETE:
ALOGV("Received seek complete");
if (mSeekPosition != mCurrentPosition || (mSeekMode != mCurrentSeekMode)) {
- ALOGV("Executing queued seekTo(%d, %d)", mCurrentPosition, mCurrentSeekMode);
+ ALOGV("Executing queued seekTo(%lld, %d)",
+ (long long)mCurrentPosition, mCurrentSeekMode);
mSeekPosition = -1;
mSeekMode = MediaPlayer2SeekMode::SEEK_PREVIOUS_SYNC;
seekTo_l(mCurrentPosition, mCurrentSeekMode);
@@ -1387,10 +1395,6 @@
}
}
-status_t MediaPlayer2::setNextMediaPlayer(const sp<MediaPlayer2>& /* next */) {
- return INVALID_OPERATION;
-}
-
// Modular DRM
status_t MediaPlayer2::prepareDrm(const uint8_t uuid[16], const Vector<uint8_t>& drmSessionId) {
// TODO change to ALOGV
diff --git a/media/libmediaplayer2/nuplayer2/NuPlayer2.cpp b/media/libmediaplayer2/nuplayer2/NuPlayer2.cpp
index 38d107d..5971a8b 100644
--- a/media/libmediaplayer2/nuplayer2/NuPlayer2.cpp
+++ b/media/libmediaplayer2/nuplayer2/NuPlayer2.cpp
@@ -2765,10 +2765,10 @@
break;
}
- int posMs;
+ int64_t posMs;
int64_t timeUs, posUs;
driver->getCurrentPosition(&posMs);
- posUs = (int64_t) posMs * 1000ll;
+ posUs = posMs * 1000ll;
CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
if (posUs < timeUs) {
diff --git a/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.cpp b/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.cpp
index ca08e79..03d17a5 100644
--- a/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.cpp
+++ b/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.cpp
@@ -354,7 +354,7 @@
// down for audio offload mode. If that happens, the NuPlayerRenderer will no longer know the
// current position. So similar to seekTo, update |mPositionUs| to the pause position by calling
// getCurrentPosition here.
- int unused;
+ int64_t unused;
getCurrentPosition(&unused);
Mutex::Autolock autoLock(mLock);
@@ -384,7 +384,7 @@
status_t err = mPlayer->setPlaybackSettings(rate);
if (err == OK) {
// try to update position
- int unused;
+ int64_t unused;
getCurrentPosition(&unused);
Mutex::Autolock autoLock(mLock);
if (rate.mSpeed == 0.f && mState == STATE_RUNNING) {
@@ -411,8 +411,8 @@
return mPlayer->getSyncSettings(sync, videoFps);
}
-status_t NuPlayer2Driver::seekTo(int msec, MediaPlayer2SeekMode mode) {
- ALOGD("seekTo(%p) (%d ms, %d) at state %d", this, msec, mode, mState);
+status_t NuPlayer2Driver::seekTo(int64_t msec, MediaPlayer2SeekMode mode) {
+ ALOGD("seekTo(%p) (%lld ms, %d) at state %d", this, (long long)msec, mode, mState);
Mutex::Autolock autoLock(mLock);
int64_t seekTimeUs = msec * 1000ll;
@@ -437,13 +437,13 @@
return OK;
}
-status_t NuPlayer2Driver::getCurrentPosition(int *msec) {
+status_t NuPlayer2Driver::getCurrentPosition(int64_t *msec) {
int64_t tempUs = 0;
{
Mutex::Autolock autoLock(mLock);
if (mSeekInProgress || (mState == STATE_PAUSED && !mAtEOS)) {
tempUs = (mPositionUs <= 0) ? 0 : mPositionUs;
- *msec = (int)divRound(tempUs, (int64_t)(1000));
+ *msec = divRound(tempUs, (int64_t)(1000));
return OK;
}
}
@@ -459,11 +459,11 @@
} else {
mPositionUs = tempUs;
}
- *msec = (int)divRound(tempUs, (int64_t)(1000));
+ *msec = divRound(tempUs, (int64_t)(1000));
return OK;
}
-status_t NuPlayer2Driver::getDuration(int *msec) {
+status_t NuPlayer2Driver::getDuration(int64_t *msec) {
Mutex::Autolock autoLock(mLock);
if (mDurationUs < 0) {
@@ -529,7 +529,7 @@
// always provide duration and playing time, even if they have 0/unknown values.
// getDuration() uses mLock for mutex -- careful where we use it.
- int duration_ms = -1;
+ int64_t duration_ms = -1;
getDuration(&duration_ms);
mAnalyticsItem->setInt64(kPlayerDuration, duration_ms);
@@ -661,7 +661,7 @@
case MEDIA_PLAYER2_INVOKE_ID_SELECT_TRACK:
{
int trackIndex = request.readInt32();
- int msec = 0;
+ int64_t msec = 0;
// getCurrentPosition should always return OK
getCurrentPosition(&msec);
return mPlayer->selectTrack(trackIndex, true /* select */, msec * 1000ll);
diff --git a/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.h b/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.h
index 502a2cc..4da2566 100644
--- a/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.h
+++ b/media/libmediaplayer2/nuplayer2/NuPlayer2Driver.h
@@ -50,9 +50,9 @@
virtual status_t setSyncSettings(const AVSyncSettings &sync, float videoFpsHint);
virtual status_t getSyncSettings(AVSyncSettings *sync, float *videoFps);
virtual status_t seekTo(
- int msec, MediaPlayer2SeekMode mode = MediaPlayer2SeekMode::SEEK_PREVIOUS_SYNC);
- virtual status_t getCurrentPosition(int *msec);
- virtual status_t getDuration(int *msec);
+ int64_t msec, MediaPlayer2SeekMode mode = MediaPlayer2SeekMode::SEEK_PREVIOUS_SYNC);
+ virtual status_t getCurrentPosition(int64_t *msec);
+ virtual status_t getDuration(int64_t *msec);
virtual status_t reset();
virtual status_t notifyAt(int64_t mediaTimeUs) override;
virtual status_t setLooping(int loop);