Loading media/libstagefright/httplive/LiveSession.cpp +34 −1 Original line number Diff line number Diff line Loading @@ -63,6 +63,7 @@ LiveSession::LiveSession( mSwapMask(0), mCheckBandwidthGeneration(0), mSwitchGeneration(0), mSubtitleGeneration(0), mLastDequeuedTimeUs(0ll), mRealTimeBaseUs(0ll), mReconfigurationInProgress(false), Loading Loading @@ -289,6 +290,11 @@ status_t LiveSession::dequeueAccessUnit( mLastDequeuedTimeUs = timeUs; mRealTimeBaseUs = ALooper::GetNowUs() - timeUs; } else if (stream == STREAMTYPE_SUBTITLES) { int32_t subtitleGeneration; if ((*accessUnit)->meta()->findInt32("subtitleGeneration", &subtitleGeneration) && subtitleGeneration != mSubtitleGeneration) { return -EAGAIN; }; (*accessUnit)->meta()->setInt32( "trackIndex", mPlaylist->getSelectedIndex()); (*accessUnit)->meta()->setInt64("baseUs", mRealTimeBaseUs); Loading Loading @@ -759,7 +765,7 @@ sp<PlaylistFetcher> LiveSession::addFetcher(const char *uri) { notify->setInt32("switchGeneration", mSwitchGeneration); FetcherInfo info; info.mFetcher = new PlaylistFetcher(notify, this, uri); info.mFetcher = new PlaylistFetcher(notify, this, uri, mSubtitleGeneration); info.mDurationUs = -1ll; info.mIsPrepared = false; info.mToBeRemoved = false; Loading Loading @@ -1065,6 +1071,24 @@ size_t LiveSession::getBandwidthIndex() { return index; } int64_t LiveSession::latestMediaSegmentStartTimeUs() { sp<AMessage> audioMeta = mPacketSources.valueFor(STREAMTYPE_AUDIO)->getLatestDequeuedMeta(); int64_t minSegmentStartTimeUs = -1, videoSegmentStartTimeUs = -1; if (audioMeta != NULL) { audioMeta->findInt64("segmentStartTimeUs", &minSegmentStartTimeUs); } sp<AMessage> videoMeta = mPacketSources.valueFor(STREAMTYPE_VIDEO)->getLatestDequeuedMeta(); if (videoMeta != NULL && videoMeta->findInt64("segmentStartTimeUs", &videoSegmentStartTimeUs)) { if (minSegmentStartTimeUs < 0 || videoSegmentStartTimeUs < minSegmentStartTimeUs) { minSegmentStartTimeUs = videoSegmentStartTimeUs; } } return minSegmentStartTimeUs; } status_t LiveSession::onSeek(const sp<AMessage> &msg) { int64_t timeUs; CHECK(msg->findInt64("timeUs", &timeUs)); Loading Loading @@ -1117,6 +1141,11 @@ sp<AMessage> LiveSession::getTrackInfo(size_t trackIndex) const { } status_t LiveSession::selectTrack(size_t index, bool select) { if (mPlaylist == NULL) { return INVALID_OPERATION; } ++mSubtitleGeneration; status_t err = mPlaylist->selectTrack(index, select); if (err == OK) { sp<AMessage> msg = new AMessage(kWhatChangeConfiguration, id()); Loading Loading @@ -1399,6 +1428,10 @@ void LiveSession::onChangeConfiguration3(const sp<AMessage> &msg) { int32_t discontinuitySeq = -1; sp<AnotherPacketSource> sources[kMaxStreams]; if (i == kSubtitleIndex) { segmentStartTimeUs = latestMediaSegmentStartTimeUs(); } // TRICKY: looping from i as earlier streams are already removed from streamMask for (size_t j = i; j < kMaxStreams; ++j) { const AString &streamUri = switching ? mStreams[j].mNewUri : mStreams[j].mUri; Loading media/libstagefright/httplive/LiveSession.h +2 −0 Original line number Diff line number Diff line Loading @@ -189,6 +189,7 @@ private: int32_t mCheckBandwidthGeneration; int32_t mSwitchGeneration; int32_t mSubtitleGeneration; size_t mContinuationCounter; sp<AMessage> mContinuation; Loading Loading @@ -240,6 +241,7 @@ private: const char *url, uint8_t *curPlaylistHash, bool *unchanged); size_t getBandwidthIndex(); int64_t latestMediaSegmentStartTimeUs(); static int SortByBandwidth(const BandwidthItem *, const BandwidthItem *); static StreamType indexToType(int idx); Loading media/libstagefright/httplive/PlaylistFetcher.cpp +4 −1 Original line number Diff line number Diff line Loading @@ -55,7 +55,8 @@ const int32_t PlaylistFetcher::kNumSkipFrames = 10; PlaylistFetcher::PlaylistFetcher( const sp<AMessage> ¬ify, const sp<LiveSession> &session, const char *uri) const char *uri, int32_t subtitleGeneration) : mNotify(notify), mStartTimeUsNotify(notify->dup()), mSession(session), Loading @@ -73,6 +74,7 @@ PlaylistFetcher::PlaylistFetcher( mPrepared(false), mNextPTSTimeUs(-1ll), mMonitorQueueGeneration(0), mSubtitleGeneration(subtitleGeneration), mRefreshState(INITIAL_MINIMUM_RELOAD_DELAY), mFirstPTSValid(false), mAbsoluteTimeAnchorUs(0ll), Loading Loading @@ -1407,6 +1409,7 @@ status_t PlaylistFetcher::extractAndQueueAccessUnits( buffer->meta()->setInt64("durationUs", durationUs); buffer->meta()->setInt64("segmentStartTimeUs", getSegmentStartTimeUs(mSeqNumber)); buffer->meta()->setInt32("discontinuitySeq", mDiscontinuitySeq); buffer->meta()->setInt32("subtitleGeneration", mSubtitleGeneration); packetSource->queueAccessUnit(buffer); return OK; Loading media/libstagefright/httplive/PlaylistFetcher.h +3 −1 Original line number Diff line number Diff line Loading @@ -49,7 +49,8 @@ struct PlaylistFetcher : public AHandler { PlaylistFetcher( const sp<AMessage> ¬ify, const sp<LiveSession> &session, const char *uri); const char *uri, int32_t subtitleGeneration); sp<DataSource> getDataSource(); Loading Loading @@ -133,6 +134,7 @@ private: int64_t mNextPTSTimeUs; int32_t mMonitorQueueGeneration; const int32_t mSubtitleGeneration; enum RefreshState { INITIAL_MINIMUM_RELOAD_DELAY, Loading Loading
media/libstagefright/httplive/LiveSession.cpp +34 −1 Original line number Diff line number Diff line Loading @@ -63,6 +63,7 @@ LiveSession::LiveSession( mSwapMask(0), mCheckBandwidthGeneration(0), mSwitchGeneration(0), mSubtitleGeneration(0), mLastDequeuedTimeUs(0ll), mRealTimeBaseUs(0ll), mReconfigurationInProgress(false), Loading Loading @@ -289,6 +290,11 @@ status_t LiveSession::dequeueAccessUnit( mLastDequeuedTimeUs = timeUs; mRealTimeBaseUs = ALooper::GetNowUs() - timeUs; } else if (stream == STREAMTYPE_SUBTITLES) { int32_t subtitleGeneration; if ((*accessUnit)->meta()->findInt32("subtitleGeneration", &subtitleGeneration) && subtitleGeneration != mSubtitleGeneration) { return -EAGAIN; }; (*accessUnit)->meta()->setInt32( "trackIndex", mPlaylist->getSelectedIndex()); (*accessUnit)->meta()->setInt64("baseUs", mRealTimeBaseUs); Loading Loading @@ -759,7 +765,7 @@ sp<PlaylistFetcher> LiveSession::addFetcher(const char *uri) { notify->setInt32("switchGeneration", mSwitchGeneration); FetcherInfo info; info.mFetcher = new PlaylistFetcher(notify, this, uri); info.mFetcher = new PlaylistFetcher(notify, this, uri, mSubtitleGeneration); info.mDurationUs = -1ll; info.mIsPrepared = false; info.mToBeRemoved = false; Loading Loading @@ -1065,6 +1071,24 @@ size_t LiveSession::getBandwidthIndex() { return index; } int64_t LiveSession::latestMediaSegmentStartTimeUs() { sp<AMessage> audioMeta = mPacketSources.valueFor(STREAMTYPE_AUDIO)->getLatestDequeuedMeta(); int64_t minSegmentStartTimeUs = -1, videoSegmentStartTimeUs = -1; if (audioMeta != NULL) { audioMeta->findInt64("segmentStartTimeUs", &minSegmentStartTimeUs); } sp<AMessage> videoMeta = mPacketSources.valueFor(STREAMTYPE_VIDEO)->getLatestDequeuedMeta(); if (videoMeta != NULL && videoMeta->findInt64("segmentStartTimeUs", &videoSegmentStartTimeUs)) { if (minSegmentStartTimeUs < 0 || videoSegmentStartTimeUs < minSegmentStartTimeUs) { minSegmentStartTimeUs = videoSegmentStartTimeUs; } } return minSegmentStartTimeUs; } status_t LiveSession::onSeek(const sp<AMessage> &msg) { int64_t timeUs; CHECK(msg->findInt64("timeUs", &timeUs)); Loading Loading @@ -1117,6 +1141,11 @@ sp<AMessage> LiveSession::getTrackInfo(size_t trackIndex) const { } status_t LiveSession::selectTrack(size_t index, bool select) { if (mPlaylist == NULL) { return INVALID_OPERATION; } ++mSubtitleGeneration; status_t err = mPlaylist->selectTrack(index, select); if (err == OK) { sp<AMessage> msg = new AMessage(kWhatChangeConfiguration, id()); Loading Loading @@ -1399,6 +1428,10 @@ void LiveSession::onChangeConfiguration3(const sp<AMessage> &msg) { int32_t discontinuitySeq = -1; sp<AnotherPacketSource> sources[kMaxStreams]; if (i == kSubtitleIndex) { segmentStartTimeUs = latestMediaSegmentStartTimeUs(); } // TRICKY: looping from i as earlier streams are already removed from streamMask for (size_t j = i; j < kMaxStreams; ++j) { const AString &streamUri = switching ? mStreams[j].mNewUri : mStreams[j].mUri; Loading
media/libstagefright/httplive/LiveSession.h +2 −0 Original line number Diff line number Diff line Loading @@ -189,6 +189,7 @@ private: int32_t mCheckBandwidthGeneration; int32_t mSwitchGeneration; int32_t mSubtitleGeneration; size_t mContinuationCounter; sp<AMessage> mContinuation; Loading Loading @@ -240,6 +241,7 @@ private: const char *url, uint8_t *curPlaylistHash, bool *unchanged); size_t getBandwidthIndex(); int64_t latestMediaSegmentStartTimeUs(); static int SortByBandwidth(const BandwidthItem *, const BandwidthItem *); static StreamType indexToType(int idx); Loading
media/libstagefright/httplive/PlaylistFetcher.cpp +4 −1 Original line number Diff line number Diff line Loading @@ -55,7 +55,8 @@ const int32_t PlaylistFetcher::kNumSkipFrames = 10; PlaylistFetcher::PlaylistFetcher( const sp<AMessage> ¬ify, const sp<LiveSession> &session, const char *uri) const char *uri, int32_t subtitleGeneration) : mNotify(notify), mStartTimeUsNotify(notify->dup()), mSession(session), Loading @@ -73,6 +74,7 @@ PlaylistFetcher::PlaylistFetcher( mPrepared(false), mNextPTSTimeUs(-1ll), mMonitorQueueGeneration(0), mSubtitleGeneration(subtitleGeneration), mRefreshState(INITIAL_MINIMUM_RELOAD_DELAY), mFirstPTSValid(false), mAbsoluteTimeAnchorUs(0ll), Loading Loading @@ -1407,6 +1409,7 @@ status_t PlaylistFetcher::extractAndQueueAccessUnits( buffer->meta()->setInt64("durationUs", durationUs); buffer->meta()->setInt64("segmentStartTimeUs", getSegmentStartTimeUs(mSeqNumber)); buffer->meta()->setInt32("discontinuitySeq", mDiscontinuitySeq); buffer->meta()->setInt32("subtitleGeneration", mSubtitleGeneration); packetSource->queueAccessUnit(buffer); return OK; Loading
media/libstagefright/httplive/PlaylistFetcher.h +3 −1 Original line number Diff line number Diff line Loading @@ -49,7 +49,8 @@ struct PlaylistFetcher : public AHandler { PlaylistFetcher( const sp<AMessage> ¬ify, const sp<LiveSession> &session, const char *uri); const char *uri, int32_t subtitleGeneration); sp<DataSource> getDataSource(); Loading Loading @@ -133,6 +134,7 @@ private: int64_t mNextPTSTimeUs; int32_t mMonitorQueueGeneration; const int32_t mSubtitleGeneration; enum RefreshState { INITIAL_MINIMUM_RELOAD_DELAY, Loading