diff options
Diffstat (limited to 'media/libmediaplayerservice')
6 files changed, 67 insertions, 6 deletions
diff --git a/media/libmediaplayerservice/nuplayer/HTTPLiveSource.cpp b/media/libmediaplayerservice/nuplayer/HTTPLiveSource.cpp index b3314be..d07ea1b 100644 --- a/media/libmediaplayerservice/nuplayer/HTTPLiveSource.cpp +++ b/media/libmediaplayerservice/nuplayer/HTTPLiveSource.cpp @@ -96,10 +96,12 @@ bool NuPlayer::HTTPLiveSource::feedMoreTSData() { } else { if (buffer[0] == 0x00) { // XXX legacy + sp<AMessage> extra; mTSParser->signalDiscontinuity( buffer[1] == 0x00 ? ATSParser::DISCONTINUITY_SEEK - : ATSParser::DISCONTINUITY_FORMATCHANGE); + : ATSParser::DISCONTINUITY_FORMATCHANGE, + extra); } else { mTSParser->feedTSPacket(buffer, sizeof(buffer)); } diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp index 474c056..d439f6e 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp @@ -191,6 +191,8 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) { mAudioEOS = false; mVideoEOS = false; + mSkipRenderingAudioUntilMediaTimeUs = -1; + mSkipRenderingVideoUntilMediaTimeUs = -1; mSource->start(); @@ -592,6 +594,31 @@ status_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) { LOGV("%s discontinuity (formatChange=%d)", audio ? "audio" : "video", formatChange); + if (audio) { + mSkipRenderingAudioUntilMediaTimeUs = -1; + } else { + mSkipRenderingVideoUntilMediaTimeUs = -1; + } + + sp<AMessage> extra; + if (accessUnit->meta()->findMessage("extra", &extra) + && extra != NULL) { + int64_t resumeAtMediaTimeUs; + if (extra->findInt64( + "resume-at-mediatimeUs", &resumeAtMediaTimeUs)) { + LOGI("suppressing rendering of %s until %lld us", + audio ? "audio" : "video", resumeAtMediaTimeUs); + + if (audio) { + mSkipRenderingAudioUntilMediaTimeUs = + resumeAtMediaTimeUs; + } else { + mSkipRenderingVideoUntilMediaTimeUs = + resumeAtMediaTimeUs; + } + } + } + flushDecoder(audio, formatChange); } @@ -627,6 +654,27 @@ void NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) { sp<ABuffer> buffer = static_cast<ABuffer *>(obj.get()); + int64_t &skipUntilMediaTimeUs = + audio + ? mSkipRenderingAudioUntilMediaTimeUs + : mSkipRenderingVideoUntilMediaTimeUs; + + if (skipUntilMediaTimeUs >= 0) { + int64_t mediaTimeUs; + CHECK(buffer->meta()->findInt64("timeUs", &mediaTimeUs)); + + if (mediaTimeUs < skipUntilMediaTimeUs) { + LOGV("dropping %s buffer at time %lld as requested.", + audio ? "audio" : "video", + mediaTimeUs); + + reply->post(); + return; + } + + skipUntilMediaTimeUs = -1; + } + mRenderer->queueBuffer(audio, buffer, reply); } diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.h b/media/libmediaplayerservice/nuplayer/NuPlayer.h index e7c6a42..fb5b001 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayer.h +++ b/media/libmediaplayerservice/nuplayer/NuPlayer.h @@ -112,6 +112,9 @@ private: bool mResetInProgress; bool mResetPostponed; + int64_t mSkipRenderingAudioUntilMediaTimeUs; + int64_t mSkipRenderingVideoUntilMediaTimeUs; + status_t instantiateDecoder(bool audio, sp<Decoder> *decoder); status_t feedDecoderInputData(bool audio, const sp<AMessage> &msg); diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerStreamListener.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerStreamListener.cpp index a23beb7..885ebe4 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerStreamListener.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayerStreamListener.cpp @@ -92,9 +92,12 @@ void NuPlayer::NuPlayerStreamListener::issueCommand( } } -ssize_t NuPlayer::NuPlayerStreamListener::read(void *data, size_t size) { +ssize_t NuPlayer::NuPlayerStreamListener::read( + void *data, size_t size, sp<AMessage> *extra) { CHECK_GT(size, 0u); + extra->clear(); + Mutex::Autolock autoLock(mLock); if (mEOS) { @@ -122,6 +125,8 @@ ssize_t NuPlayer::NuPlayerStreamListener::read(void *data, size_t size) { case DISCONTINUITY: { + *extra = entry->mExtra; + mQueue.erase(mQueue.begin()); entry = NULL; diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerStreamListener.h b/media/libmediaplayerservice/nuplayer/NuPlayerStreamListener.h index f88e945..df0935d 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerStreamListener.h +++ b/media/libmediaplayerservice/nuplayer/NuPlayerStreamListener.h @@ -37,7 +37,7 @@ struct NuPlayer::NuPlayerStreamListener : public BnStreamListener { Command cmd, bool synchronous, const sp<AMessage> &extra); void start(); - ssize_t read(void *data, size_t size); + ssize_t read(void *data, size_t size, sp<AMessage> *extra); private: enum { diff --git a/media/libmediaplayerservice/nuplayer/StreamingSource.cpp b/media/libmediaplayerservice/nuplayer/StreamingSource.cpp index b85ac9f..2016282 100644 --- a/media/libmediaplayerservice/nuplayer/StreamingSource.cpp +++ b/media/libmediaplayerservice/nuplayer/StreamingSource.cpp @@ -54,7 +54,8 @@ bool NuPlayer::StreamingSource::feedMoreTSData() { for (int32_t i = 0; i < 10; ++i) { char buffer[188]; - ssize_t n = mStreamListener->read(buffer, sizeof(buffer)); + sp<AMessage> extra; + ssize_t n = mStreamListener->read(buffer, sizeof(buffer), &extra); if (n == 0) { LOGI("input data EOS reached."); @@ -62,7 +63,8 @@ bool NuPlayer::StreamingSource::feedMoreTSData() { mEOS = true; break; } else if (n == INFO_DISCONTINUITY) { - mTSParser->signalDiscontinuity(ATSParser::DISCONTINUITY_SEEK); + mTSParser->signalDiscontinuity( + ATSParser::DISCONTINUITY_SEEK, extra); } else if (n < 0) { CHECK_EQ(n, -EWOULDBLOCK); break; @@ -72,7 +74,8 @@ bool NuPlayer::StreamingSource::feedMoreTSData() { mTSParser->signalDiscontinuity( buffer[1] == 0x00 ? ATSParser::DISCONTINUITY_SEEK - : ATSParser::DISCONTINUITY_FORMATCHANGE); + : ATSParser::DISCONTINUITY_FORMATCHANGE, + extra); } else { mTSParser->feedTSPacket(buffer, sizeof(buffer)); } |