114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber/* 214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber * Copyright (C) 2012 The Android Open Source Project 314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber * 414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber * you may not use this file except in compliance with the License. 614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber * You may obtain a copy of the License at 714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber * 814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber * 1014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber * Unless required by applicable law or agreed to in writing, software 1114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 1214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber * See the License for the specific language governing permissions and 1414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber * limitations under the License. 1514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber */ 1614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 1714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber#ifndef PLAYLIST_FETCHER_H_ 1814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 1914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber#define PLAYLIST_FETCHER_H_ 2014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 2114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber#include <media/stagefright/foundation/AHandler.h> 2214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 2314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber#include "mpeg2ts/ATSParser.h" 2414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber#include "LiveSession.h" 2514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 2614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Hubernamespace android { 2714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 2814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct ABuffer; 2914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct AnotherPacketSource; 3014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct DataSource; 3114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct HTTPBase; 3214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct LiveDataSource; 3314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct M3UParser; 3414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct String8; 3514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 3614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct PlaylistFetcher : public AHandler { 3714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber enum { 3814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatStarted, 3914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatPaused, 4014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatStopped, 4114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatError, 4214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatDurationUpdate, 4314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatTemporarilyDoneFetching, 4414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatPrepared, 4514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatPreparationFailed, 4614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber }; 4714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 4814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber PlaylistFetcher( 4914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber const sp<AMessage> ¬ify, 5014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber const sp<LiveSession> &session, 5114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber const char *uri); 5214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 5314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber sp<DataSource> getDataSource(); 5414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 5514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void startAsync( 5614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber const sp<AnotherPacketSource> &audioSource, 5714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber const sp<AnotherPacketSource> &videoSource, 5814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber const sp<AnotherPacketSource> &subtitleSource, 5914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber int64_t startTimeUs = -1ll); 6014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 6114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void pauseAsync(); 6214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 6314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void stopAsync(); 6414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 6514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberprotected: 6614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber virtual ~PlaylistFetcher(); 6714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber virtual void onMessageReceived(const sp<AMessage> &msg); 6814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 6914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberprivate: 7014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber enum { 7114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kMaxNumRetries = 5, 7214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber }; 7314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 7414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber enum { 7514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatStart = 'strt', 7614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatPause = 'paus', 7714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatStop = 'stop', 7814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatMonitorQueue = 'moni', 7914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber }; 8014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 8114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber static const int64_t kMinBufferedDurationUs; 8214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 8314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber sp<AMessage> mNotify; 8414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber sp<LiveSession> mSession; 8514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber AString mURI; 8614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 8714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber uint32_t mStreamTypeMask; 8814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber int64_t mStartTimeUs; 8914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 9014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber KeyedVector<LiveSession::StreamType, sp<AnotherPacketSource> > 9114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mPacketSources; 9214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 9314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber KeyedVector<AString, sp<ABuffer> > mAESKeyForURI; 9414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 9514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber int64_t mLastPlaylistFetchTimeUs; 9614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber sp<M3UParser> mPlaylist; 9714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber int32_t mSeqNumber; 9814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber int32_t mNumRetries; 9914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber bool mStartup; 10014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber int64_t mNextPTSTimeUs; 10114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 10214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber int32_t mMonitorQueueGeneration; 10314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 10414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber enum RefreshState { 10514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber INITIAL_MINIMUM_RELOAD_DELAY, 10614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber FIRST_UNCHANGED_RELOAD_ATTEMPT, 10714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber SECOND_UNCHANGED_RELOAD_ATTEMPT, 10814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber THIRD_UNCHANGED_RELOAD_ATTEMPT 10914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber }; 11014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber RefreshState mRefreshState; 11114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 11214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber uint8_t mPlaylistHash[16]; 11314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 11414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber sp<ATSParser> mTSParser; 11514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 11614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber bool mFirstPTSValid; 11714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber uint64_t mFirstPTS; 11814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber int64_t mAbsoluteTimeAnchorUs; 11914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 12014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber status_t decryptBuffer( 12114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber size_t playlistIndex, const sp<ABuffer> &buffer); 12214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 12314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void postMonitorQueue(int64_t delayUs = 0); 12414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void cancelMonitorQueue(); 12514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 12614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber bool timeToRefreshPlaylist(int64_t nowUs) const; 12714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 12814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber // Returns the media time in us of the segment specified by seqNumber. 12914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber // This is computed by summing the durations of all segments before it. 13014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber int64_t getSegmentStartTimeUs(int32_t seqNumber) const; 13114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 13214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber status_t onStart(const sp<AMessage> &msg); 13314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void onPause(); 13414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void onStop(); 13514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void onMonitorQueue(); 13614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void onDownloadNext(); 13714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 138dcb89b3b505522efde173c105a851c412f947178Chong Zhang status_t extractAndQueueAccessUnits( 139dcb89b3b505522efde173c105a851c412f947178Chong Zhang const sp<ABuffer> &buffer, const sp<AMessage> &itemMeta); 14014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 14114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void notifyError(status_t err); 14214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 14314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void queueDiscontinuity( 14414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber ATSParser::DiscontinuityType type, const sp<AMessage> &extra); 14514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 14614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber int32_t getSeqNumberForTime(int64_t timeUs) const; 14714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 14814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void updateDuration(); 14914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 15014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(PlaylistFetcher); 15114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber}; 15214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 15314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber} // namespace android 15414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 15514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber#endif // PLAYLIST_FETCHER_H_ 15614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 157