From cdd1f539e522ffdae20359fb2c9df9c882e48cd6 Mon Sep 17 00:00:00 2001 From: Wei Jia Date: Wed, 30 Jul 2014 13:40:49 -0700 Subject: [PATCH] Revert GenericSource track selection changes This reverts commit bace25b0fbcd5101d2db288b0c70c4a239f0e815. This reverts commit eb1735e343a93830df259ae8882160bb0d79dcb5. This reverts commit 05312bc7478feec11d9ae88e951c0857a7a3f28d. Bug: 16660839 --- .../nuplayer/GenericSource.cpp | 468 +++------------------ .../libmediaplayerservice/nuplayer/GenericSource.h | 36 +- .../libstagefright/mpeg2ts/AnotherPacketSource.cpp | 12 +- media/libstagefright/mpeg2ts/AnotherPacketSource.h | 1 - 4 files changed, 65 insertions(+), 452 deletions(-) diff --git a/media/libmediaplayerservice/nuplayer/GenericSource.cpp b/media/libmediaplayerservice/nuplayer/GenericSource.cpp index 0b09f58493..d75408d468 100644 --- a/media/libmediaplayerservice/nuplayer/GenericSource.cpp +++ b/media/libmediaplayerservice/nuplayer/GenericSource.cpp @@ -41,8 +41,6 @@ NuPlayer::GenericSource::GenericSource( bool uidValid, uid_t uid) : Source(notify), - mFetchSubtitleDataGeneration(0), - mFetchTimedTextDataGeneration(0), mDurationUs(0ll), mAudioIsVorbis(false), mIsWidevine(isWidevine), @@ -61,8 +59,6 @@ NuPlayer::GenericSource::GenericSource( const sp ¬ify, int fd, int64_t offset, int64_t length) : Source(notify), - mFetchSubtitleDataGeneration(0), - mFetchTimedTextDataGeneration(0), mDurationUs(0ll), mAudioIsVorbis(false) { DataSource::RegisterDefaultSniffers(); @@ -184,18 +180,20 @@ void NuPlayer::GenericSource::start() { if (mAudioTrack.mSource != NULL) { CHECK_EQ(mAudioTrack.mSource->start(), (status_t)OK); + mAudioTrack.mPackets = new AnotherPacketSource(mAudioTrack.mSource->getFormat()); - readBuffer(MEDIA_TRACK_TYPE_AUDIO); + readBuffer(true /* audio */); } if (mVideoTrack.mSource != NULL) { CHECK_EQ(mVideoTrack.mSource->start(), (status_t)OK); + mVideoTrack.mPackets = new AnotherPacketSource(mVideoTrack.mSource->getFormat()); - readBuffer(MEDIA_TRACK_TYPE_VIDEO); + readBuffer(false /* audio */); } } @@ -203,158 +201,6 @@ status_t NuPlayer::GenericSource::feedMoreTSData() { return OK; } -void NuPlayer::GenericSource::onMessageReceived(const sp &msg) { - switch (msg->what()) { - case kWhatFetchSubtitleData: - { - fetchTextData(kWhatSendSubtitleData, MEDIA_TRACK_TYPE_SUBTITLE, - mFetchSubtitleDataGeneration, mSubtitleTrack.mPackets, msg); - break; - } - - case kWhatFetchTimedTextData: - { - fetchTextData(kWhatSendTimedTextData, MEDIA_TRACK_TYPE_TIMEDTEXT, - mFetchTimedTextDataGeneration, mTimedTextTrack.mPackets, msg); - break; - } - - case kWhatSendSubtitleData: - { - sendTextData(kWhatSubtitleData, MEDIA_TRACK_TYPE_SUBTITLE, - mFetchSubtitleDataGeneration, mSubtitleTrack.mPackets, msg); - break; - } - - case kWhatSendTimedTextData: - { - sendTextData(kWhatTimedTextData, MEDIA_TRACK_TYPE_TIMEDTEXT, - mFetchTimedTextDataGeneration, mTimedTextTrack.mPackets, msg); - break; - } - - case kWhatChangeAVSource: - { - int32_t trackIndex; - CHECK(msg->findInt32("trackIndex", &trackIndex)); - const sp source = mSources.itemAt(trackIndex); - - Track* track; - const char *mime; - media_track_type trackType, counterpartType; - sp meta = source->getFormat(); - meta->findCString(kKeyMIMEType, &mime); - if (!strncasecmp(mime, "audio/", 6)) { - track = &mAudioTrack; - trackType = MEDIA_TRACK_TYPE_AUDIO; - counterpartType = MEDIA_TRACK_TYPE_VIDEO;; - } else { - CHECK(!strncasecmp(mime, "video/", 6)); - track = &mVideoTrack; - trackType = MEDIA_TRACK_TYPE_VIDEO; - counterpartType = MEDIA_TRACK_TYPE_AUDIO;; - } - - - if (track->mSource != NULL) { - track->mSource->stop(); - } - track->mSource = source; - track->mSource->start(); - track->mIndex = trackIndex; - - status_t avail; - if (!track->mPackets->hasBufferAvailable(&avail)) { - // sync from other source - TRESPASS(); - break; - } - - int64_t timeUs, actualTimeUs; - const bool formatChange = true; - sp latestMeta = track->mPackets->getLatestMeta(); - CHECK(latestMeta != NULL && latestMeta->findInt64("timeUs", &timeUs)); - readBuffer(trackType, timeUs, &actualTimeUs, formatChange); - readBuffer(counterpartType, -1, NULL, formatChange); - ALOGV("timeUs %lld actualTimeUs %lld", timeUs, actualTimeUs); - - break; - } - - default: - Source::onMessageReceived(msg); - break; - } -} - -void NuPlayer::GenericSource::fetchTextData( - uint32_t sendWhat, - media_track_type type, - int32_t curGen, - sp packets, - sp msg) { - int32_t msgGeneration; - CHECK(msg->findInt32("generation", &msgGeneration)); - if (msgGeneration != curGen) { - // stale - return; - } - - int32_t avail; - if (packets->hasBufferAvailable(&avail)) { - return; - } - - int64_t timeUs; - CHECK(msg->findInt64("timeUs", &timeUs)); - - int64_t subTimeUs; - readBuffer(type, timeUs, &subTimeUs); - - int64_t delayUs = subTimeUs - timeUs; - if (msg->what() == kWhatFetchSubtitleData) { - const int64_t oneSecUs = 1000000ll; - delayUs -= oneSecUs; - } - sp msg2 = new AMessage(sendWhat, id()); - msg2->setInt32("generation", msgGeneration); - msg2->post(delayUs < 0 ? 0 : delayUs); -} - -void NuPlayer::GenericSource::sendTextData( - uint32_t what, - media_track_type type, - int32_t curGen, - sp packets, - sp msg) { - int32_t msgGeneration; - CHECK(msg->findInt32("generation", &msgGeneration)); - if (msgGeneration != curGen) { - // stale - return; - } - - int64_t subTimeUs; - if (packets->nextBufferTime(&subTimeUs) != OK) { - return; - } - - int64_t nextSubTimeUs; - readBuffer(type, -1, &nextSubTimeUs); - - sp buffer; - status_t dequeueStatus = packets->dequeueAccessUnit(&buffer); - if (dequeueStatus == OK) { - sp notify = dupNotify(); - notify->setInt32("what", what); - notify->setBuffer("buffer", buffer); - notify->post(); - - const int64_t delayUs = nextSubTimeUs - subTimeUs; - msg->post(delayUs < 0 ? 0 : delayUs); - } -} - sp NuPlayer::GenericSource::getFormatMeta(bool audio) { sp source = audio ? mAudioTrack.mSource : mVideoTrack.mSource; @@ -375,7 +221,7 @@ status_t NuPlayer::GenericSource::dequeueAccessUnit( if (mIsWidevine && !audio) { // try to read a buffer as we may not have been able to the last time - readBuffer(MEDIA_TRACK_TYPE_AUDIO, -1ll); + readBuffer(audio, -1ll); } status_t finalResult; @@ -385,52 +231,7 @@ status_t NuPlayer::GenericSource::dequeueAccessUnit( status_t result = track->mPackets->dequeueAccessUnit(accessUnit); - if (!track->mPackets->hasBufferAvailable(&finalResult)) { - readBuffer(audio? MEDIA_TRACK_TYPE_AUDIO : MEDIA_TRACK_TYPE_VIDEO, -1ll); - } - - if (mSubtitleTrack.mSource == NULL && mTimedTextTrack.mSource == NULL) { - return result; - } - - if (mSubtitleTrack.mSource != NULL) { - CHECK(mSubtitleTrack.mPackets != NULL); - } - if (mTimedTextTrack.mSource != NULL) { - CHECK(mTimedTextTrack.mPackets != NULL); - } - - if (result != OK) { - if (mSubtitleTrack.mSource != NULL) { - mSubtitleTrack.mPackets->clear(); - mFetchSubtitleDataGeneration++; - } - if (mTimedTextTrack.mSource != NULL) { - mTimedTextTrack.mPackets->clear(); - mFetchTimedTextDataGeneration++; - } - return result; - } - - int64_t timeUs; - status_t eosResult; // ignored - CHECK((*accessUnit)->meta()->findInt64("timeUs", &timeUs)); - - if (mSubtitleTrack.mSource != NULL - && !mSubtitleTrack.mPackets->hasBufferAvailable(&eosResult)) { - sp msg = new AMessage(kWhatFetchSubtitleData, id()); - msg->setInt64("timeUs", timeUs); - msg->setInt32("generation", mFetchSubtitleDataGeneration); - msg->post(); - } - - if (mTimedTextTrack.mSource != NULL - && !mTimedTextTrack.mPackets->hasBufferAvailable(&eosResult)) { - sp msg = new AMessage(kWhatFetchTimedTextData, id()); - msg->setInt64("timeUs", timeUs); - msg->setInt32("generation", mFetchTimedTextDataGeneration); - msg->post(); - } + readBuffer(audio, -1ll); return result; } @@ -490,207 +291,25 @@ sp NuPlayer::GenericSource::getTrackInfo(size_t trackIndex) const { return format; } -ssize_t NuPlayer::GenericSource::getSelectedTrack(media_track_type type) const { - const Track *track = NULL; - switch (type) { - case MEDIA_TRACK_TYPE_VIDEO: - track = &mVideoTrack; - break; - case MEDIA_TRACK_TYPE_AUDIO: - track = &mAudioTrack; - break; - case MEDIA_TRACK_TYPE_TIMEDTEXT: - track = &mTimedTextTrack; - break; - case MEDIA_TRACK_TYPE_SUBTITLE: - track = &mSubtitleTrack; - break; - default: - break; - } - - if (track != NULL && track->mSource != NULL) { - return track->mIndex; - } - - return -1; -} - -status_t NuPlayer::GenericSource::selectTrack(size_t trackIndex, bool select) { - ALOGV("%s track: %zu", select ? "select" : "deselect", trackIndex); - if (trackIndex >= mSources.size()) { - return BAD_INDEX; - } - - if (!select) { - Track* track = NULL; - if (mSubtitleTrack.mSource != NULL && trackIndex == mSubtitleTrack.mIndex) { - track = &mSubtitleTrack; - mFetchSubtitleDataGeneration++; - } else if (mTimedTextTrack.mSource != NULL && trackIndex == mTimedTextTrack.mIndex) { - track = &mTimedTextTrack; - mFetchTimedTextDataGeneration++; - } - if (track == NULL) { - return INVALID_OPERATION; - } - track->mSource->stop(); - track->mSource = NULL; - track->mPackets->clear(); - return OK; - } - - const sp source = mSources.itemAt(trackIndex); - sp meta = source->getFormat(); - const char *mime; - CHECK(meta->findCString(kKeyMIMEType, &mime)); - if (!strncasecmp(mime, "text/", 5)) { - bool isSubtitle = strcasecmp(mime, MEDIA_MIMETYPE_TEXT_3GPP); - Track *track = isSubtitle ? &mSubtitleTrack : &mTimedTextTrack; - if (track->mSource != NULL && track->mIndex == trackIndex) { - return OK; - } - track->mIndex = trackIndex; - if (track->mSource != NULL) { - track->mSource->stop(); - } - track->mSource = mSources.itemAt(trackIndex); - track->mSource->start(); - if (track->mPackets == NULL) { - track->mPackets = new AnotherPacketSource(track->mSource->getFormat()); - } else { - track->mPackets->clear(); - track->mPackets->setFormat(track->mSource->getFormat()); - - } - - if (isSubtitle) { - mFetchSubtitleDataGeneration++; - } else { - mFetchTimedTextDataGeneration++; - } - - return OK; - } else if (!strncasecmp(mime, "audio/", 6) || !strncasecmp(mime, "video/", 6)) { - bool audio = !strncasecmp(mime, "audio/", 6); - Track *track = audio ? &mAudioTrack : &mVideoTrack; - if (track->mSource != NULL && track->mIndex == trackIndex) { - return OK; - } - - sp msg = new AMessage(kWhatChangeAVSource, id()); - msg->setInt32("trackIndex", trackIndex); - msg->post(); - return OK; - } - - return INVALID_OPERATION; -} - status_t NuPlayer::GenericSource::seekTo(int64_t seekTimeUs) { if (mVideoTrack.mSource != NULL) { int64_t actualTimeUs; - readBuffer(MEDIA_TRACK_TYPE_VIDEO, seekTimeUs, &actualTimeUs); + readBuffer(false /* audio */, seekTimeUs, &actualTimeUs); seekTimeUs = actualTimeUs; } if (mAudioTrack.mSource != NULL) { - readBuffer(MEDIA_TRACK_TYPE_AUDIO, seekTimeUs); + readBuffer(true /* audio */, seekTimeUs); } return OK; } -sp NuPlayer::GenericSource::mediaBufferToABuffer( - MediaBuffer* mb, - media_track_type trackType, - int64_t *actualTimeUs) { - bool audio = trackType == MEDIA_TRACK_TYPE_AUDIO; - size_t outLength = mb->range_length(); - - if (audio && mAudioIsVorbis) { - outLength += sizeof(int32_t); - } - - sp ab; - if (mIsWidevine && !audio) { - // data is already provided in the buffer - ab = new ABuffer(NULL, mb->range_length()); - ab->meta()->setPointer("mediaBuffer", mb); - mb->add_ref(); - } else { - ab = new ABuffer(outLength); - memcpy(ab->data(), - (const uint8_t *)mb->data() + mb->range_offset(), - mb->range_length()); - } - - if (audio && mAudioIsVorbis) { - int32_t numPageSamples; - if (!mb->meta_data()->findInt32(kKeyValidSamples, &numPageSamples)) { - numPageSamples = -1; - } - - uint8_t* abEnd = ab->data() + mb->range_length(); - memcpy(abEnd, &numPageSamples, sizeof(numPageSamples)); - } - - sp meta = ab->meta(); - - int64_t timeUs; - CHECK(mb->meta_data()->findInt64(kKeyTime, &timeUs)); - meta->setInt64("timeUs", timeUs); - - if (trackType == MEDIA_TRACK_TYPE_TIMEDTEXT) { - const char *mime; - CHECK(mTimedTextTrack.mSource != NULL - && mTimedTextTrack.mSource->getFormat()->findCString(kKeyMIMEType, &mime)); - meta->setString("mime", mime); - } - - int64_t durationUs; - if (mb->meta_data()->findInt64(kKeyDuration, &durationUs)) { - meta->setInt64("durationUs", durationUs); - } - - if (trackType == MEDIA_TRACK_TYPE_SUBTITLE) { - meta->setInt32("trackIndex", mSubtitleTrack.mIndex); - } - - if (actualTimeUs) { - *actualTimeUs = timeUs; - } - - mb->release(); - mb = NULL; - - return ab; -} - void NuPlayer::GenericSource::readBuffer( - media_track_type trackType, int64_t seekTimeUs, int64_t *actualTimeUs, bool formatChange) { - Track *track; - switch (trackType) { - case MEDIA_TRACK_TYPE_VIDEO: - track = &mVideoTrack; - break; - case MEDIA_TRACK_TYPE_AUDIO: - track = &mAudioTrack; - break; - case MEDIA_TRACK_TYPE_SUBTITLE: - track = &mSubtitleTrack; - break; - case MEDIA_TRACK_TYPE_TIMEDTEXT: - track = &mTimedTextTrack; - break; - default: - TRESPASS(); - } - - if (track->mSource == NULL) { - return; - } + bool audio, int64_t seekTimeUs, int64_t *actualTimeUs) { + Track *track = audio ? &mAudioTrack : &mVideoTrack; + CHECK(track->mSource != NULL); if (actualTimeUs) { *actualTimeUs = seekTimeUs; @@ -701,11 +320,11 @@ void NuPlayer::GenericSource::readBuffer( bool seeking = false; if (seekTimeUs >= 0) { - options.setSeekTo(seekTimeUs, MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC); + options.setSeekTo(seekTimeUs); seeking = true; } - if (mIsWidevine && trackType != MEDIA_TRACK_TYPE_AUDIO) { + if (mIsWidevine && !audio) { options.setNonBlocking(); } @@ -716,21 +335,56 @@ void NuPlayer::GenericSource::readBuffer( options.clearSeekTo(); if (err == OK) { - // formatChange && seeking: track whose source is changed during selection - // formatChange && !seeking: track whose source is not changed during selection - // !formatChange: normal seek - if ((seeking || formatChange) - && (trackType == MEDIA_TRACK_TYPE_AUDIO - || trackType == MEDIA_TRACK_TYPE_VIDEO)) { - ATSParser::DiscontinuityType type = formatChange - ? (seeking - ? ATSParser::DISCONTINUITY_FORMATCHANGE - : ATSParser::DISCONTINUITY_NONE) - : ATSParser::DISCONTINUITY_SEEK; - track->mPackets->queueDiscontinuity( type, NULL, true /* discard */); + size_t outLength = mbuf->range_length(); + + if (audio && mAudioIsVorbis) { + outLength += sizeof(int32_t); + } + + sp buffer; + if (mIsWidevine && !audio) { + // data is already provided in the buffer + buffer = new ABuffer(NULL, mbuf->range_length()); + buffer->meta()->setPointer("mediaBuffer", mbuf); + mbuf->add_ref(); + } else { + buffer = new ABuffer(outLength); + memcpy(buffer->data(), + (const uint8_t *)mbuf->data() + mbuf->range_offset(), + mbuf->range_length()); + } + + if (audio && mAudioIsVorbis) { + int32_t numPageSamples; + if (!mbuf->meta_data()->findInt32( + kKeyValidSamples, &numPageSamples)) { + numPageSamples = -1; + } + + memcpy(buffer->data() + mbuf->range_length(), + &numPageSamples, + sizeof(numPageSamples)); + } + + int64_t timeUs; + CHECK(mbuf->meta_data()->findInt64(kKeyTime, &timeUs)); + + buffer->meta()->setInt64("timeUs", timeUs); + + if (actualTimeUs) { + *actualTimeUs = timeUs; + } + + mbuf->release(); + mbuf = NULL; + + if (seeking) { + track->mPackets->queueDiscontinuity( + ATSParser::DISCONTINUITY_SEEK, + NULL, + true /* discard */); } - sp buffer = mediaBufferToABuffer(mbuf, trackType, actualTimeUs); track->mPackets->queueAccessUnit(buffer); break; } else if (err == WOULD_BLOCK) { diff --git a/media/libmediaplayerservice/nuplayer/GenericSource.h b/media/libmediaplayerservice/nuplayer/GenericSource.h index 3c5f55cc76..8e0209d83b 100644 --- a/media/libmediaplayerservice/nuplayer/GenericSource.h +++ b/media/libmediaplayerservice/nuplayer/GenericSource.h @@ -23,15 +23,12 @@ #include "ATSParser.h" -#include - namespace android { struct AnotherPacketSource; struct ARTSPController; struct DataSource; struct MediaSource; -class MediaBuffer; struct NuPlayer::GenericSource : public NuPlayer::Source { GenericSource( @@ -58,8 +55,6 @@ struct NuPlayer::GenericSource : public NuPlayer::Source { virtual status_t getDuration(int64_t *durationUs); virtual size_t getTrackCount() const; virtual sp getTrackInfo(size_t trackIndex) const; - virtual ssize_t getSelectedTrack(media_track_type type) const; - virtual status_t selectTrack(size_t trackIndex, bool select); virtual status_t seekTo(int64_t seekTimeUs); virtual status_t setBuffers(bool audio, Vector &buffers); @@ -67,19 +62,9 @@ struct NuPlayer::GenericSource : public NuPlayer::Source { protected: virtual ~GenericSource(); - virtual void onMessageReceived(const sp &msg); - virtual sp getFormatMeta(bool audio); private: - enum { - kWhatFetchSubtitleData, - kWhatFetchTimedTextData, - kWhatSendSubtitleData, - kWhatSendTimedTextData, - kWhatChangeAVSource, - }; - Vector > mSources; struct Track { @@ -90,11 +75,7 @@ private: Track mAudioTrack; Track mVideoTrack; - Track mSubtitleTrack; - Track mTimedTextTrack; - int32_t mFetchSubtitleDataGeneration; - int32_t mFetchTimedTextDataGeneration; int64_t mDurationUs; bool mAudioIsVorbis; bool mIsWidevine; @@ -103,22 +84,9 @@ private: void initFromDataSource(const sp &dataSource); - void fetchTextData( - uint32_t what, media_track_type type, - int32_t curGen, sp packets, sp msg); - - void sendTextData( - uint32_t what, media_track_type type, - int32_t curGen, sp packets, sp msg); - - sp mediaBufferToABuffer( - MediaBuffer *mbuf, - media_track_type trackType, - int64_t *actualTimeUs = NULL); - void readBuffer( - media_track_type trackType, - int64_t seekTimeUs = -1ll, int64_t *actualTimeUs = NULL, bool formatChange = false); + bool audio, + int64_t seekTimeUs = -1ll, int64_t *actualTimeUs = NULL); DISALLOW_EVIL_CONSTRUCTORS(GenericSource); }; diff --git a/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp b/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp index 72c9daee21..a0319abbf2 100644 --- a/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp +++ b/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp @@ -34,7 +34,6 @@ const int64_t kNearEOSMarkUs = 2000000ll; // 2 secs AnotherPacketSource::AnotherPacketSource(const sp &meta) : mIsAudio(false), - mIsVideo(false), mFormat(NULL), mLastQueuedTimeUs(0), mEOSResult(OK), @@ -46,7 +45,6 @@ void AnotherPacketSource::setFormat(const sp &meta) { CHECK(mFormat == NULL); mIsAudio = false; - mIsVideo = false; if (meta == NULL) { return; @@ -58,10 +56,8 @@ void AnotherPacketSource::setFormat(const sp &meta) { if (!strncasecmp("audio/", mime, 6)) { mIsAudio = true; - } else if (!strncasecmp("video/", mime, 6)) { - mIsVideo = true; } else { - CHECK(!strncasecmp("text/", mime, 5)); + CHECK(!strncasecmp("video/", mime, 6)); } } @@ -179,11 +175,7 @@ bool AnotherPacketSource::wasFormatChange( return (discontinuityType & ATSParser::DISCONTINUITY_AUDIO_FORMAT) != 0; } - if (mIsVideo) { - return (discontinuityType & ATSParser::DISCONTINUITY_VIDEO_FORMAT) != 0; - } - - return false; + return (discontinuityType & ATSParser::DISCONTINUITY_VIDEO_FORMAT) != 0; } void AnotherPacketSource::queueAccessUnit(const sp &buffer) { diff --git a/media/libstagefright/mpeg2ts/AnotherPacketSource.h b/media/libstagefright/mpeg2ts/AnotherPacketSource.h index f38f9dca32..06c49bdcee 100644 --- a/media/libstagefright/mpeg2ts/AnotherPacketSource.h +++ b/media/libstagefright/mpeg2ts/AnotherPacketSource.h @@ -74,7 +74,6 @@ private: Condition mCondition; bool mIsAudio; - bool mIsVideo; sp mFormat; int64_t mLastQueuedTimeUs; List > mBuffers; -- 2.11.0