MediaPlayer: add notifyAt at native side
Test: media time is correct when playback rate is not 1.0
Bug: 65204641
Change-Id: Ie9f67e3cb37267cfd364c9a9b9f674232b68ef27
diff --git a/media/libmedia/IMediaPlayer.cpp b/media/libmedia/IMediaPlayer.cpp
index cda3b3a..903e503 100644
--- a/media/libmedia/IMediaPlayer.cpp
+++ b/media/libmedia/IMediaPlayer.cpp
@@ -58,6 +58,7 @@
GET_CURRENT_POSITION,
GET_DURATION,
RESET,
+ NOTIFY_AT,
SET_AUDIO_STREAM_TYPE,
SET_LOOPING,
SET_VOLUME,
@@ -328,6 +329,15 @@
return reply.readInt32();
}
+ status_t notifyAt(int64_t mediaTimeUs)
+ {
+ Parcel data, reply;
+ data.writeInterfaceToken(IMediaPlayer::getInterfaceDescriptor());
+ data.writeInt64(mediaTimeUs);
+ remote()->transact(NOTIFY_AT, data, &reply);
+ return reply.readInt32();
+ }
+
status_t setAudioStreamType(audio_stream_type_t stream)
{
Parcel data, reply;
@@ -746,6 +756,11 @@
reply->writeInt32(reset());
return NO_ERROR;
} break;
+ case NOTIFY_AT: {
+ CHECK_INTERFACE(IMediaPlayer, data, reply);
+ reply->writeInt32(notifyAt(data.readInt64()));
+ return NO_ERROR;
+ } break;
case SET_AUDIO_STREAM_TYPE: {
CHECK_INTERFACE(IMediaPlayer, data, reply);
reply->writeInt32(setAudioStreamType((audio_stream_type_t) data.readInt32()));
diff --git a/media/libmedia/include/media/IMediaPlayer.h b/media/libmedia/include/media/IMediaPlayer.h
index e657716..e181338 100644
--- a/media/libmedia/include/media/IMediaPlayer.h
+++ b/media/libmedia/include/media/IMediaPlayer.h
@@ -79,6 +79,7 @@
MediaPlayerSeekMode mode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC) = 0;
virtual status_t getCurrentPosition(int* msec) = 0;
virtual status_t getDuration(int* msec) = 0;
+ virtual status_t notifyAt(int64_t mediaTimeUs) = 0;
virtual status_t reset() = 0;
virtual status_t setAudioStreamType(audio_stream_type_t type) = 0;
virtual status_t setLooping(int loop) = 0;
diff --git a/media/libmedia/include/media/mediaplayer.h b/media/libmedia/include/media/mediaplayer.h
index cb0a99f..25741d3 100644
--- a/media/libmedia/include/media/mediaplayer.h
+++ b/media/libmedia/include/media/mediaplayer.h
@@ -50,6 +50,7 @@
MEDIA_PAUSED = 7,
MEDIA_STOPPED = 8,
MEDIA_SKIPPED = 9,
+ MEDIA_NOTIFY_TIME = 98,
MEDIA_TIMED_TEXT = 99,
MEDIA_ERROR = 100,
MEDIA_INFO = 200,
@@ -245,6 +246,7 @@
status_t seekTo(
int msec,
MediaPlayerSeekMode mode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC);
+ status_t notifyAt(int64_t mediaTimeUs);
status_t getCurrentPosition(int *msec);
status_t getDuration(int *msec);
status_t reset();
diff --git a/media/libmedia/mediaplayer.cpp b/media/libmedia/mediaplayer.cpp
index 49101d1..00084c1 100644
--- a/media/libmedia/mediaplayer.cpp
+++ b/media/libmedia/mediaplayer.cpp
@@ -610,6 +610,15 @@
return result;
}
+status_t MediaPlayer::notifyAt(int64_t mediaTimeUs)
+{
+ Mutex::Autolock _l(mLock);
+ if (mPlayer != 0) {
+ return mPlayer->notifyAt(mediaTimeUs);
+ }
+ return INVALID_OPERATION;
+}
+
status_t MediaPlayer::reset_l()
{
mLoop = false;
@@ -950,6 +959,9 @@
mVideoWidth = ext1;
mVideoHeight = ext2;
break;
+ case MEDIA_NOTIFY_TIME:
+ ALOGV("Received notify time message");
+ break;
case MEDIA_TIMED_TEXT:
ALOGV("Received timed text message");
break;