diff options
Diffstat (limited to 'media/libstagefright/httplive')
-rw-r--r-- | media/libstagefright/httplive/LiveSession.cpp | 5 | ||||
-rw-r--r-- | media/libstagefright/httplive/LiveSession.h | 25 | ||||
-rw-r--r-- | media/libstagefright/httplive/PlaylistFetcher.cpp | 20 | ||||
-rw-r--r-- | media/libstagefright/httplive/PlaylistFetcher.h | 3 |
4 files changed, 37 insertions, 16 deletions
diff --git a/media/libstagefright/httplive/LiveSession.cpp b/media/libstagefright/httplive/LiveSession.cpp index 1557401..1b0b1c5 100644 --- a/media/libstagefright/httplive/LiveSession.cpp +++ b/media/libstagefright/httplive/LiveSession.cpp @@ -54,7 +54,7 @@ const int64_t LiveSession::kReadyMarkUs = 5000000ll; const int64_t LiveSession::kPrepareMarkUs = 1500000ll; const int64_t LiveSession::kUnderflowMarkUs = 1000000ll; -struct LiveSession::BandwidthEstimator : public RefBase { +struct LiveSession::BandwidthEstimator : public LiveSession::BandwidthBaseEstimator { BandwidthEstimator(); void addBandwidthMeasurement(size_t numBytes, int64_t delayUs); @@ -1064,6 +1064,7 @@ void LiveSession::onMasterPlaylistFetched(const sp<AMessage> &msg) { itemsWithVideo.push(item); } } +#if 0 // remove the audio-only variants if we have at least one with video if (!itemsWithVideo.empty() && itemsWithVideo.size() < mBandwidthItems.size()) { @@ -1072,7 +1073,7 @@ void LiveSession::onMasterPlaylistFetched(const sp<AMessage> &msg) { mBandwidthItems.push(itemsWithVideo[i]); } } - +#endif CHECK_GT(mBandwidthItems.size(), 0u); initialBandwidth = mBandwidthItems[0].mBandwidth; diff --git a/media/libstagefright/httplive/LiveSession.h b/media/libstagefright/httplive/LiveSession.h index 90d56d0..0d504e4 100644 --- a/media/libstagefright/httplive/LiveSession.h +++ b/media/libstagefright/httplive/LiveSession.h @@ -73,7 +73,7 @@ struct LiveSession : public AHandler { const sp<IMediaHTTPService> &httpService); int64_t calculateMediaTimeUs(int64_t firstTimeUs, int64_t timeUs, int32_t discontinuitySeq); - status_t dequeueAccessUnit(StreamType stream, sp<ABuffer> *accessUnit); + virtual status_t dequeueAccessUnit(StreamType stream, sp<ABuffer> *accessUnit); status_t getStreamFormat(StreamType stream, sp<AMessage> *format); @@ -117,7 +117,6 @@ protected: virtual void onMessageReceived(const sp<AMessage> &msg); -private: friend struct PlaylistFetcher; enum { @@ -142,6 +141,14 @@ private: static const int64_t kPrepareMarkUs; static const int64_t kUnderflowMarkUs; + struct BandwidthBaseEstimator : public RefBase { + virtual void addBandwidthMeasurement(size_t numBytes, int64_t delayUs) = 0; + virtual bool estimateBandwidth( + int32_t *bandwidth, + bool *isStable = NULL, + int32_t *shortTermBps = NULL) = 0; + }; + struct BandwidthEstimator; struct BandwidthItem { size_t mPlaylistIndex; @@ -201,7 +208,7 @@ private: ssize_t mOrigBandwidthIndex; int32_t mLastBandwidthBps; bool mLastBandwidthStable; - sp<BandwidthEstimator> mBandwidthEstimator; + sp<BandwidthBaseEstimator> mBandwidthEstimator; sp<M3UParser> mPlaylist; int32_t mMaxWidth; @@ -251,10 +258,10 @@ private: KeyedVector<size_t, int64_t> mDiscontinuityAbsStartTimesUs; KeyedVector<size_t, int64_t> mDiscontinuityOffsetTimesUs; - sp<PlaylistFetcher> addFetcher(const char *uri); + virtual sp<PlaylistFetcher> addFetcher(const char *uri); void onConnect(const sp<AMessage> &msg); - void onMasterPlaylistFetched(const sp<AMessage> &msg); + virtual void onMasterPlaylistFetched(const sp<AMessage> &msg); void onSeek(const sp<AMessage> &msg); bool UriIsSameAsIndex( const AString &uri, int32_t index, bool newUri); @@ -269,7 +276,7 @@ private: float getAbortThreshold( ssize_t currentBWIndex, ssize_t targetBWIndex) const; void addBandwidthMeasurement(size_t numBytes, int64_t delayUs); - size_t getBandwidthIndex(int32_t bandwidthBps); + virtual size_t getBandwidthIndex(int32_t bandwidthBps); ssize_t getLowestValidBandwidthIndex() const; HLSTime latestMediaSegmentStartTime() const; @@ -284,7 +291,7 @@ private: void onChangeConfiguration2(const sp<AMessage> &msg); void onChangeConfiguration3(const sp<AMessage> &msg); - void swapPacketSource(StreamType stream); + virtual void swapPacketSource(StreamType stream); void tryToFinishBandwidthSwitch(const AString &oldUri); void cancelBandwidthSwitch(bool resume = false); bool checkSwitchProgress( @@ -296,7 +303,7 @@ private: void schedulePollBuffering(); void cancelPollBuffering(); void restartPollBuffering(); - void onPollBuffering(); + virtual void onPollBuffering(); bool checkBuffering(bool &underflow, bool &ready, bool &down, bool &up); void startBufferingIfNecessary(); void stopBufferingIfNecessary(); @@ -304,7 +311,7 @@ private: void finishDisconnect(); - void postPrepared(status_t err); + virtual void postPrepared(status_t err); void postError(status_t err); DISALLOW_EVIL_CONSTRUCTORS(LiveSession); diff --git a/media/libstagefright/httplive/PlaylistFetcher.cpp b/media/libstagefright/httplive/PlaylistFetcher.cpp index 72d832e..b030e90 100644 --- a/media/libstagefright/httplive/PlaylistFetcher.cpp +++ b/media/libstagefright/httplive/PlaylistFetcher.cpp @@ -975,7 +975,9 @@ bool PlaylistFetcher::initDownloadState( if (mSegmentStartTimeUs < 0) { if (!mPlaylist->isComplete() && !mPlaylist->isEvent()) { // If this is a live session, start 3 segments from the end on connect - mSeqNumber = lastSeqNumberInPlaylist - 3; + if (!getSeqNumberInLiveStreaming()) { + mSeqNumber = lastSeqNumberInPlaylist - 3; + } if (mSeqNumber < firstSeqNumberInPlaylist) { mSeqNumber = firstSeqNumberInPlaylist; } @@ -1418,6 +1420,10 @@ void PlaylistFetcher::onDownloadNext() { } } + if (checkSwitchBandwidth()) { + return; + } + ++mSeqNumber; // if adapting, pause after found the next starting point @@ -1628,7 +1634,8 @@ status_t PlaylistFetcher::extractAndQueueAccessUnitsFromTs(const sp<ABuffer> &bu if (mSegmentFirstPTS < 0ll) { // get the smallest first PTS from all streams present in this parser - for (size_t i = mPacketSources.size(); i-- > 0;) { + for (size_t i = mPacketSources.size(); i > 0;) { + i--; const LiveSession::StreamType stream = mPacketSources.keyAt(i); if (stream == LiveSession::STREAMTYPE_SUBTITLES) { ALOGE("MPEG2 Transport streams do not contain subtitles."); @@ -1683,7 +1690,8 @@ status_t PlaylistFetcher::extractAndQueueAccessUnitsFromTs(const sp<ABuffer> &bu } status_t err = OK; - for (size_t i = mPacketSources.size(); i-- > 0;) { + for (size_t i = mPacketSources.size(); i > 0;) { + i--; sp<AnotherPacketSource> packetSource = mPacketSources.valueAt(i); const LiveSession::StreamType stream = mPacketSources.keyAt(i); @@ -1807,7 +1815,8 @@ status_t PlaylistFetcher::extractAndQueueAccessUnitsFromTs(const sp<ABuffer> &bu } if (err != OK) { - for (size_t i = mPacketSources.size(); i-- > 0;) { + for (size_t i = mPacketSources.size(); i > 0;) { + i--; sp<AnotherPacketSource> packetSource = mPacketSources.valueAt(i); packetSource->clear(); } @@ -1902,6 +1911,9 @@ status_t PlaylistFetcher::extractAndQueueAccessUnits( while (!it.done()) { size_t length; const uint8_t *data = it.getData(&length); + if (!data) { + return ERROR_MALFORMED; + } static const char *kMatchName = "com.apple.streaming.transportStreamTimestamp"; diff --git a/media/libstagefright/httplive/PlaylistFetcher.h b/media/libstagefright/httplive/PlaylistFetcher.h index c8ca457..6b60b65 100644 --- a/media/libstagefright/httplive/PlaylistFetcher.h +++ b/media/libstagefright/httplive/PlaylistFetcher.h @@ -89,7 +89,6 @@ protected: virtual ~PlaylistFetcher(); virtual void onMessageReceived(const sp<AMessage> &msg); -private: enum { kMaxNumRetries = 5, }; @@ -249,6 +248,8 @@ private: void updateDuration(); void updateTargetDuration(); + virtual bool checkSwitchBandwidth() { return false; } + virtual bool getSeqNumberInLiveStreaming() { return false; } DISALLOW_EVIL_CONSTRUCTORS(PlaylistFetcher); }; |