GenericSource: fix sending time for text data
Test: text data was sent at correct time when playback rate is not 1.0
Bug: 65204641
Change-Id: I72ea818f52ca35f3a13bb0d62a5f20bb7f5db087
diff --git a/media/libmediaplayerservice/nuplayer/GenericSource.cpp b/media/libmediaplayerservice/nuplayer/GenericSource.cpp
index e0d253d..45a5f27 100644
--- a/media/libmediaplayerservice/nuplayer/GenericSource.cpp
+++ b/media/libmediaplayerservice/nuplayer/GenericSource.cpp
@@ -31,6 +31,7 @@
#include <media/stagefright/DataSource.h>
#include <media/stagefright/FileSource.h>
#include <media/stagefright/MediaBuffer.h>
+#include <media/stagefright/MediaClock.h>
#include <media/stagefright/MediaDefs.h>
#include <media/stagefright/MediaExtractor.h>
#include <media/stagefright/MediaSource.h>
@@ -51,7 +52,8 @@
NuPlayer::GenericSource::GenericSource(
const sp<AMessage> ¬ify,
bool uidValid,
- uid_t uid)
+ uid_t uid,
+ const sp<MediaClock> &mediaClock)
: Source(notify),
mAudioTimeUs(0),
mAudioLastDequeueTimeUs(0),
@@ -65,10 +67,12 @@
mIsStreaming(false),
mUIDValid(uidValid),
mUID(uid),
+ mMediaClock(mediaClock),
mFd(-1),
mBitrate(-1ll),
mPendingReadBufferTypes(0) {
ALOGV("GenericSource");
+ CHECK(mediaClock != NULL);
mBufferingMonitor = new BufferingMonitor(notify);
resetDataSource();
@@ -729,17 +733,20 @@
int64_t timeUs;
CHECK(msg->findInt64("timeUs", &timeUs));
- int64_t subTimeUs;
+ int64_t subTimeUs = 0;
readBuffer(type, timeUs, MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC /* mode */, &subTimeUs);
- int64_t delayUs = subTimeUs - timeUs;
+ status_t eosResult;
+ if (!packets->hasBufferAvailable(&eosResult)) {
+ return;
+ }
+
if (msg->what() == kWhatFetchSubtitleData) {
- const int64_t oneSecUs = 1000000ll;
- delayUs -= oneSecUs;
+ subTimeUs -= 1000000ll; // send subtile data one second earlier
}
sp<AMessage> msg2 = new AMessage(sendWhat, this);
msg2->setInt32("generation", msgGeneration);
- msg2->post(delayUs < 0 ? 0 : delayUs);
+ mMediaClock->addTimer(msg2, subTimeUs);
}
void NuPlayer::GenericSource::sendTextData(
@@ -771,8 +778,10 @@
notify->setBuffer("buffer", buffer);
notify->post();
- const int64_t delayUs = nextSubTimeUs - subTimeUs;
- msg->post(delayUs < 0 ? 0 : delayUs);
+ if (msg->what() == kWhatSendSubtitleData) {
+ nextSubTimeUs -= 1000000ll; // send subtile data one second earlier
+ }
+ mMediaClock->addTimer(msg, nextSubTimeUs);
}
}
diff --git a/media/libmediaplayerservice/nuplayer/GenericSource.h b/media/libmediaplayerservice/nuplayer/GenericSource.h
index 4064133..381bcac 100644
--- a/media/libmediaplayerservice/nuplayer/GenericSource.h
+++ b/media/libmediaplayerservice/nuplayer/GenericSource.h
@@ -35,12 +35,14 @@
struct IMediaHTTPService;
struct MediaSource;
class MediaBuffer;
+struct MediaClock;
struct NuCachedSource2;
struct NuPlayer::GenericSource : public NuPlayer::Source,
public MediaBufferObserver // Modular DRM
{
- GenericSource(const sp<AMessage> ¬ify, bool uidValid, uid_t uid);
+ GenericSource(const sp<AMessage> ¬ify, bool uidValid, uid_t uid,
+ const sp<MediaClock> &mediaClock);
status_t setDataSource(
const sp<IMediaHTTPService> &httpService,
@@ -227,6 +229,7 @@
bool mIsStreaming;
bool mUIDValid;
uid_t mUID;
+ const sp<MediaClock> mMediaClock;
sp<IMediaHTTPService> mHTTPService;
AString mUri;
KeyedVector<String8, String8> mUriHeaders;
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
index 274f613..cabf830 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp
@@ -281,7 +281,7 @@
ALOGV("setDataSourceAsync GenericSource %s", url);
sp<GenericSource> genericSource =
- new GenericSource(notify, mUIDValid, mUID);
+ new GenericSource(notify, mUIDValid, mUID, mMediaClock);
status_t err = genericSource->setDataSource(httpService, url, headers);
@@ -304,7 +304,7 @@
sp<AMessage> notify = new AMessage(kWhatSourceNotify, this);
sp<GenericSource> source =
- new GenericSource(notify, mUIDValid, mUID);
+ new GenericSource(notify, mUIDValid, mUID, mMediaClock);
ALOGV("setDataSourceAsync fd %d/%lld/%lld source: %p",
fd, (long long)offset, (long long)length, source.get());
@@ -325,7 +325,7 @@
sp<AMessage> msg = new AMessage(kWhatSetDataSource, this);
sp<AMessage> notify = new AMessage(kWhatSourceNotify, this);
- sp<GenericSource> source = new GenericSource(notify, mUIDValid, mUID);
+ sp<GenericSource> source = new GenericSource(notify, mUIDValid, mUID, mMediaClock);
status_t err = source->setDataSource(dataSource);
if (err != OK) {