Loading media/libmediaplayerservice/nuplayer/GenericSource.cpp +41 −3 Original line number Diff line number Diff line Loading @@ -677,6 +677,12 @@ void NuPlayer::GenericSource::onMessageReceived(const sp<AMessage> &msg) { break; } case kWhatSeek: { onSeek(msg); break; } case kWhatReadBuffer: { onReadBuffer(msg); Loading Loading @@ -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; Loading Loading @@ -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); } Loading media/libmediaplayerservice/nuplayer/GenericSource.h +4 −0 Original line number Diff line number Diff line Loading @@ -112,6 +112,7 @@ private: kWhatSendTimedTextData, kWhatChangeAVSource, kWhatPollBuffering, kWhatSeek, kWhatReadBuffer, kWhatStart, kWhatResume, Loading Loading @@ -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 Loading
media/libmediaplayerservice/nuplayer/GenericSource.cpp +41 −3 Original line number Diff line number Diff line Loading @@ -677,6 +677,12 @@ void NuPlayer::GenericSource::onMessageReceived(const sp<AMessage> &msg) { break; } case kWhatSeek: { onSeek(msg); break; } case kWhatReadBuffer: { onReadBuffer(msg); Loading Loading @@ -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; Loading Loading @@ -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); } Loading
media/libmediaplayerservice/nuplayer/GenericSource.h +4 −0 Original line number Diff line number Diff line Loading @@ -112,6 +112,7 @@ private: kWhatSendTimedTextData, kWhatChangeAVSource, kWhatPollBuffering, kWhatSeek, kWhatReadBuffer, kWhatStart, kWhatResume, Loading Loading @@ -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