/* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef PLAYLIST_FETCHER_H_ #define PLAYLIST_FETCHER_H_ #include #include "mpeg2ts/ATSParser.h" #include "LiveSession.h" namespace android { struct ABuffer; struct AnotherPacketSource; struct DataSource; struct HTTPBase; struct LiveDataSource; struct M3UParser; struct String8; struct PlaylistFetcher : public AHandler { enum { kWhatStarted, kWhatPaused, kWhatStopped, kWhatError, kWhatDurationUpdate, kWhatTemporarilyDoneFetching, kWhatPrepared, kWhatPreparationFailed, }; PlaylistFetcher( const sp ¬ify, const sp &session, const char *uri); sp getDataSource(); void startAsync( const sp &audioSource, const sp &videoSource, const sp &subtitleSource, int64_t startTimeUs = -1ll); void pauseAsync(); void stopAsync(); protected: virtual ~PlaylistFetcher(); virtual void onMessageReceived(const sp &msg); private: enum { kMaxNumRetries = 5, }; enum { kWhatStart = 'strt', kWhatPause = 'paus', kWhatStop = 'stop', kWhatMonitorQueue = 'moni', }; static const int64_t kMinBufferedDurationUs; sp mNotify; sp mSession; AString mURI; uint32_t mStreamTypeMask; int64_t mStartTimeUs; KeyedVector > mPacketSources; KeyedVector > mAESKeyForURI; int64_t mLastPlaylistFetchTimeUs; sp mPlaylist; int32_t mSeqNumber; int32_t mNumRetries; bool mStartup; int64_t mNextPTSTimeUs; int32_t mMonitorQueueGeneration; enum RefreshState { INITIAL_MINIMUM_RELOAD_DELAY, FIRST_UNCHANGED_RELOAD_ATTEMPT, SECOND_UNCHANGED_RELOAD_ATTEMPT, THIRD_UNCHANGED_RELOAD_ATTEMPT }; RefreshState mRefreshState; uint8_t mPlaylistHash[16]; sp mTSParser; bool mFirstPTSValid; uint64_t mFirstPTS; int64_t mAbsoluteTimeAnchorUs; status_t decryptBuffer( size_t playlistIndex, const sp &buffer); void postMonitorQueue(int64_t delayUs = 0); void cancelMonitorQueue(); bool timeToRefreshPlaylist(int64_t nowUs) const; // Returns the media time in us of the segment specified by seqNumber. // This is computed by summing the durations of all segments before it. int64_t getSegmentStartTimeUs(int32_t seqNumber) const; status_t onStart(const sp &msg); void onPause(); void onStop(); void onMonitorQueue(); void onDownloadNext(); status_t extractAndQueueAccessUnits( const sp &buffer, const sp &itemMeta); void notifyError(status_t err); void queueDiscontinuity( ATSParser::DiscontinuityType type, const sp &extra); int32_t getSeqNumberForTime(int64_t timeUs) const; void updateDuration(); DISALLOW_EVIL_CONSTRUCTORS(PlaylistFetcher); }; } // namespace android #endif // PLAYLIST_FETCHER_H_