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> 223a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania#include <openssl/aes.h> 2314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 2414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber#include "mpeg2ts/ATSParser.h" 2514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber#include "LiveSession.h" 2614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 2714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Hubernamespace android { 2814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 2914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct ABuffer; 3014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct AnotherPacketSource; 31ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnarclass DataSource; 3214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct HTTPBase; 3314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct LiveDataSource; 3414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct M3UParser; 3586a58cabe322b746ab0eb17f0cade34ed68ba60eBernhard Rosenkränzerclass String8; 3614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 3714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct PlaylistFetcher : public AHandler { 38174609765fb9c8cbd6aeb61f489746c3570bfee2Leena Winterrowd static const int64_t kMinBufferedDurationUs; 39a93fd2be99d21629bed504b9b7df035fc2f54562Leena Winterrowd static const int32_t kDownloadBlockSize; 40964adb17885185808398507d2de88665fe193ee2Chong Zhang static const int64_t kFetcherResumeThreshold; 41174609765fb9c8cbd6aeb61f489746c3570bfee2Leena Winterrowd 4214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber enum { 4314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatStarted, 4414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatPaused, 4514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatStopped, 4614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatError, 4714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatDurationUpdate, 487c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang kWhatTargetDurationUpdate, 4914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatPrepared, 5014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatPreparationFailed, 51777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih kWhatStartedAt, 527c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang kWhatStopReached, 535abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang kWhatPlaylistFetched, 540852843d304006e3ab333081fddda13b07193de8Robert Shih kWhatMetadataDetected, 5514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber }; 5614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 5714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber PlaylistFetcher( 5814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber const sp<AMessage> ¬ify, 5914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber const sp<LiveSession> &session, 60b44ce2f84691559672cfaf6bb8fd3a9ac43904f2Robert Shih const char *uri, 6125f82752942b1c78aec8ee303d61afff85cff9d1Chong Zhang int32_t id, 62b44ce2f84691559672cfaf6bb8fd3a9ac43904f2Robert Shih int32_t subtitleGeneration); 6314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 6425f82752942b1c78aec8ee303d61afff85cff9d1Chong Zhang int32_t getFetcherID() const; 6525f82752942b1c78aec8ee303d61afff85cff9d1Chong Zhang 6614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void startAsync( 6714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber const sp<AnotherPacketSource> &audioSource, 6814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber const sp<AnotherPacketSource> &videoSource, 6914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber const sp<AnotherPacketSource> &subtitleSource, 700852843d304006e3ab333081fddda13b07193de8Robert Shih const sp<AnotherPacketSource> &metadataSource, 71309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih int64_t startTimeUs = -1ll, // starting timestamps 72309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih int64_t segmentStartTimeUs = -1ll, // starting position within playlist 73309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih // startTimeUs!=segmentStartTimeUs only when playlist is live 747c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int32_t startDiscontinuitySeq = -1, 75a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang LiveSession::SeekMode seekMode = LiveSession::kSeekModeExactPosition); 7614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 775abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang void pauseAsync(float thresholdRatio, bool disconnect); 7814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 79309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih void stopAsync(bool clear = true); 8014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 81777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih void resumeUntilAsync(const sp<AMessage> ¶ms); 82777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih 835abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang void fetchPlaylistAsync(); 845abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang 8573d2847af14cdd5fdf8bd1ac80fb7ddf9ae7d9a7Robert Shih uint32_t getStreamTypeMask() const { 8673d2847af14cdd5fdf8bd1ac80fb7ddf9ae7d9a7Robert Shih return mStreamTypeMask; 8773d2847af14cdd5fdf8bd1ac80fb7ddf9ae7d9a7Robert Shih } 8873d2847af14cdd5fdf8bd1ac80fb7ddf9ae7d9a7Robert Shih 8914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberprotected: 9014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber virtual ~PlaylistFetcher(); 9114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber virtual void onMessageReceived(const sp<AMessage> &msg); 9214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 9314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberprivate: 9414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber enum { 9514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kMaxNumRetries = 5, 9614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber }; 9714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 9814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber enum { 9914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatStart = 'strt', 10014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatPause = 'paus', 10114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatStop = 'stop', 10214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatMonitorQueue = 'moni', 103777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih kWhatResumeUntil = 'rsme', 104777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih kWhatDownloadNext = 'dlnx', 1055abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang kWhatFetchPlaylist = 'flst' 10614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber }; 10714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 108a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang struct DownloadState; 109a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang 1106708a45ba1b5eacf583d5e80b2075b68940fe0abLajos Molnar static const int64_t kMaxMonitorDelayUs; 111777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih static const int32_t kNumSkipFrames; 11214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 11343ca783effd99bba0e6e2dd6fe177a8888578ef8Robert Shih static bool bufferStartsWithTsSyncByte(const sp<ABuffer>& buffer); 1147d8e3ccfbf326b5e190b416590e956c2fc3021f7Lajos Molnar static bool bufferStartsWithWebVTTMagicSequence(const sp<ABuffer>& buffer); 11543ca783effd99bba0e6e2dd6fe177a8888578ef8Robert Shih 116777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih // notifications to mSession 11714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber sp<AMessage> mNotify; 118777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih sp<AMessage> mStartTimeUsNotify; 119777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih 1205abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang sp<HTTPDownloader> mHTTPDownloader; 12114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber sp<LiveSession> mSession; 12214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber AString mURI; 12314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 12425f82752942b1c78aec8ee303d61afff85cff9d1Chong Zhang int32_t mFetcherID; 12525f82752942b1c78aec8ee303d61afff85cff9d1Chong Zhang 12614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber uint32_t mStreamTypeMask; 12714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber int64_t mStartTimeUs; 128f78f62bd6b0a99747db53828d281a50b9270a646Robert Shih 129f78f62bd6b0a99747db53828d281a50b9270a646Robert Shih // Start time relative to the beginning of the first segment in the initial 130f78f62bd6b0a99747db53828d281a50b9270a646Robert Shih // playlist. It's value is initialized to a non-negative value only when we are 131f78f62bd6b0a99747db53828d281a50b9270a646Robert Shih // adapting or switching tracks. 132309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih int64_t mSegmentStartTimeUs; 133f78f62bd6b0a99747db53828d281a50b9270a646Robert Shih 1344604458dfe57b0e91a464aefafea50ae7b9876c1Chong Zhang int32_t mDiscontinuitySeq; 135309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih bool mStartTimeUsRelative; 136777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih sp<AMessage> mStopParams; // message containing the latest timestamps we should fetch. 13714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 13814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber KeyedVector<LiveSession::StreamType, sp<AnotherPacketSource> > 13914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mPacketSources; 14014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 14114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber KeyedVector<AString, sp<ABuffer> > mAESKeyForURI; 14214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 14314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber int64_t mLastPlaylistFetchTimeUs; 144978449984366946a2e5c9f7cf350746f4306caf8Chong Zhang int64_t mPlaylistTimeUs; 14514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber sp<M3UParser> mPlaylist; 14614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber int32_t mSeqNumber; 14714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber int32_t mNumRetries; 14814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber bool mStartup; 149c4547ba77f78632172db3647a09659d9863d3b5cChong Zhang bool mIDRFound; 150a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang int32_t mSeekMode; 151c4547ba77f78632172db3647a09659d9863d3b5cChong Zhang bool mTimeChangeSignaled; 15214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber int64_t mNextPTSTimeUs; 15314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 15414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber int32_t mMonitorQueueGeneration; 155b44ce2f84691559672cfaf6bb8fd3a9ac43904f2Robert Shih const int32_t mSubtitleGeneration; 15614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 157c4547ba77f78632172db3647a09659d9863d3b5cChong Zhang int32_t mLastDiscontinuitySeq; 158c4547ba77f78632172db3647a09659d9863d3b5cChong Zhang 15914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber enum RefreshState { 16014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber INITIAL_MINIMUM_RELOAD_DELAY, 16114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber FIRST_UNCHANGED_RELOAD_ATTEMPT, 16214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber SECOND_UNCHANGED_RELOAD_ATTEMPT, 16314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber THIRD_UNCHANGED_RELOAD_ATTEMPT 16414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber }; 16514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber RefreshState mRefreshState; 16614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 16714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber uint8_t mPlaylistHash[16]; 16814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 16914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber sp<ATSParser> mTSParser; 17014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 17114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber bool mFirstPTSValid; 172309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih int64_t mFirstTimeUs; 173a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang int64_t mSegmentFirstPTS; 174309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih sp<AnotherPacketSource> mVideoBuffer; 17514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 1762cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih // Stores the initialization vector to decrypt the next block of cipher text, which can 1772cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih // either be derived from the sequence number, read from the manifest, or copied from 1782cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih // the last block of cipher text (cipher-block chaining). 1793a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania unsigned char mAESInitVec[AES_BLOCK_SIZE]; 1803a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania unsigned char mKeyData[AES_BLOCK_SIZE]; 1813a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania bool mSampleAesKeyItemChanged; 1823a37f3e948b600405e0c70b8a241778fda44168eHassan Shojania sp<AMessage> mSampleAesKeyItem; 1832cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih 184a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang Mutex mThresholdLock; 185a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang float mThresholdRatio; 186a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang 187a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang sp<DownloadState> mDownloadState; 188a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang 1890852843d304006e3ab333081fddda13b07193de8Robert Shih bool mHasMetadata; 1900852843d304006e3ab333081fddda13b07193de8Robert Shih 1912cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih // Set first to true if decrypting the first segment of a playlist segment. When 1922cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih // first is true, reset the initialization vector based on the available 1932cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih // information in the manifest; otherwise, use the initialization vector as 1942cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih // updated by the last call to AES_cbc_encrypt. 1952cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih // 1962cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih // For the input to decrypt correctly, decryptBuffer must be called on 1972cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih // consecutive byte ranges on block boundaries, e.g. 0..15, 16..47, 48..63, 1982cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih // and so on. 19914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber status_t decryptBuffer( 2002cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih size_t playlistIndex, const sp<ABuffer> &buffer, 2012cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih bool first = true); 2022cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih status_t checkDecryptPadding(const sp<ABuffer> &buffer); 20314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 2046708a45ba1b5eacf583d5e80b2075b68940fe0abLajos Molnar void postMonitorQueue(int64_t delayUs = 0, int64_t minDelayUs = 0); 20514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void cancelMonitorQueue(); 2065abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang void setStoppingThreshold(float thresholdRatio, bool disconnect); 2075abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang void resetStoppingThreshold(bool disconnect); 2085abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang float getStoppingThreshold(); 2097c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang bool shouldPauseDownload(); 21014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 2116708a45ba1b5eacf583d5e80b2075b68940fe0abLajos Molnar int64_t delayUsToRefreshPlaylist() const; 2126708a45ba1b5eacf583d5e80b2075b68940fe0abLajos Molnar status_t refreshPlaylist(); 21314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 21414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber // Returns the media time in us of the segment specified by seqNumber. 21514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber // This is computed by summing the durations of all segments before it. 21614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber int64_t getSegmentStartTimeUs(int32_t seqNumber) const; 2177c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang // Returns the duration time in us of the segment specified. 2187c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int64_t getSegmentDurationUs(int32_t seqNumber) const; 21914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 22014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber status_t onStart(const sp<AMessage> &msg); 22114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void onPause(); 222ceeabe15f4e7bc73efdfcafed917202de9d515cbRobert Shih void onStop(const sp<AMessage> &msg); 22314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void onMonitorQueue(); 22414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void onDownloadNext(); 22572433b083ccfa3ab55374305b1c2960982ac3e09Oscar Rydhé void initSeqNumberForLiveStream( 22672433b083ccfa3ab55374305b1c2960982ac3e09Oscar Rydhé int32_t &firstSeqNumberInPlaylist, 22772433b083ccfa3ab55374305b1c2960982ac3e09Oscar Rydhé int32_t &lastSeqNumberInPlaylist); 228a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang bool initDownloadState( 229a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang AString &uri, 230a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang sp<AMessage> &itemMeta, 231a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang int32_t &firstSeqNumberInPlaylist, 232a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang int32_t &lastSeqNumberInPlaylist); 23314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 234777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih // Resume a fetcher to continue until the stopping point stored in msg. 235777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih status_t onResumeUntil(const sp<AMessage> &msg); 236777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih 237309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih const sp<ABuffer> &setAccessUnitProperties( 238309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih const sp<ABuffer> &accessUnit, 239309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih const sp<AnotherPacketSource> &source, 240309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih bool discard = false); 2410852843d304006e3ab333081fddda13b07193de8Robert Shih bool isStartTimeReached(int64_t timeUs); 24243ca783effd99bba0e6e2dd6fe177a8888578ef8Robert Shih status_t extractAndQueueAccessUnitsFromTs(const sp<ABuffer> &buffer); 24343ca783effd99bba0e6e2dd6fe177a8888578ef8Robert Shih 244dcb89b3b505522efde173c105a851c412f947178Chong Zhang status_t extractAndQueueAccessUnits( 245dcb89b3b505522efde173c105a851c412f947178Chong Zhang const sp<ABuffer> &buffer, const sp<AMessage> &itemMeta); 24614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 2477c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang void notifyStopReached(); 24814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void notifyError(status_t err); 24914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 25014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void queueDiscontinuity( 25114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber ATSParser::DiscontinuityType type, const sp<AMessage> &extra); 25214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 253978449984366946a2e5c9f7cf350746f4306caf8Chong Zhang bool adjustSeqNumberWithAnchorTime(int64_t anchorTimeUs); 254309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih int32_t getSeqNumberForDiscontinuity(size_t discontinuitySeq) const; 25514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber int32_t getSeqNumberForTime(int64_t timeUs) const; 25614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 25714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void updateDuration(); 2587c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang void updateTargetDuration(); 25914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 26014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(PlaylistFetcher); 26114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber}; 26214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 26314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber} // namespace android 26414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 26514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber#endif // PLAYLIST_FETCHER_H_ 26614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 267