Merge "GenericSource: perform seekTo on own looper"

gugelfrei
TreeHugger Robot 7 years ago committed by Android (Google) Code Review
commit e0ce8445a1

@ -677,6 +677,12 @@ void NuPlayer::GenericSource::onMessageReceived(const sp<AMessage> &msg) {
break;
}
case kWhatSeek:
{
onSeek(msg);
break;
}
case kWhatReadBuffer:
{
onReadBuffer(msg);
@ -1097,8 +1103,39 @@ status_t NuPlayer::GenericSource::selectTrack(size_t trackIndex, bool select, in
}
status_t NuPlayer::GenericSource::seekTo(int64_t seekTimeUs, MediaPlayerSeekMode mode) {
Mutex::Autolock _l(mLock);
ALOGV("seekTo: %lld, %d", (long long)seekTimeUs, mode);
sp<AMessage> msg = new AMessage(kWhatSeek, this);
msg->setInt64("seekTimeUs", seekTimeUs);
msg->setInt32("mode", mode);
// Need to call readBuffer on |mLooper| to ensure the calls to
// IMediaSource::read* are serialized. Note that IMediaSource::read*
// is called without |mLock| acquired and MediaSource is not thread safe.
sp<AMessage> response;
status_t err = msg->postAndAwaitResponse(&response);
if (err == OK && response != NULL) {
CHECK(response->findInt32("err", &err));
}
return err;
}
void NuPlayer::GenericSource::onSeek(const sp<AMessage>& msg) {
int64_t seekTimeUs;
int32_t mode;
CHECK(msg->findInt64("seekTimeUs", &seekTimeUs));
CHECK(msg->findInt32("mode", &mode));
sp<AMessage> response = new AMessage;
status_t err = doSeek(seekTimeUs, (MediaPlayerSeekMode)mode);
response->setInt32("err", err);
sp<AReplyToken> replyID;
CHECK(msg->senderAwaitsResponse(&replyID));
response->postReply(replyID);
}
status_t NuPlayer::GenericSource::doSeek(int64_t seekTimeUs, MediaPlayerSeekMode mode) {
if (mVideoTrack.mSource != NULL) {
++mVideoDataGeneration;
@ -1321,13 +1358,14 @@ void NuPlayer::GenericSource::readBuffer(
Vector<MediaBuffer *> mediaBuffers;
status_t err = NO_ERROR;
sp<IMediaSource> source = track->mSource;
mLock.unlock();
if (couldReadMultiple) {
err = track->mSource->readMultiple(
err = source->readMultiple(
&mediaBuffers, maxBuffers - numBuffers, &options);
} else {
MediaBuffer *mbuf = NULL;
err = track->mSource->read(&mbuf, &options);
err = source->read(&mbuf, &options);
if (err == OK && mbuf != NULL) {
mediaBuffers.push_back(mbuf);
}

@ -112,6 +112,7 @@ private:
kWhatSendTimedTextData,
kWhatChangeAVSource,
kWhatPollBuffering,
kWhatSeek,
kWhatReadBuffer,
kWhatStart,
kWhatResume,
@ -183,6 +184,9 @@ private:
void finishPrepareAsync();
status_t startSources();
void onSeek(const sp<AMessage>& msg);
status_t doSeek(int64_t seekTimeUs, MediaPlayerSeekMode mode);
void onPrepareAsync();
void fetchTextData(

Loading…
Cancel
Save