PlaylistFetcher.h revision 4604458dfe57b0e91a464aefafea50ae7b9876c1
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; 3486a58cabe322b746ab0eb17f0cade34ed68ba60eBernhard Rosenkränzerclass String8; 3514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 3614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct PlaylistFetcher : public AHandler { 37174609765fb9c8cbd6aeb61f489746c3570bfee2Leena Winterrowd static const int64_t kMinBufferedDurationUs; 38a93fd2be99d21629bed504b9b7df035fc2f54562Leena Winterrowd static const int32_t kDownloadBlockSize; 39964adb17885185808398507d2de88665fe193ee2Chong Zhang static const int64_t kFetcherResumeThreshold; 40174609765fb9c8cbd6aeb61f489746c3570bfee2Leena Winterrowd 4114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber enum { 4214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatStarted, 4314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatPaused, 4414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatStopped, 4514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatError, 4614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatDurationUpdate, 4714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatPrepared, 4814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatPreparationFailed, 49777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih kWhatStartedAt, 5014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber }; 5114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 5214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber PlaylistFetcher( 5314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber const sp<AMessage> ¬ify, 5414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber const sp<LiveSession> &session, 55b44ce2f84691559672cfaf6bb8fd3a9ac43904f2Robert Shih const char *uri, 56b44ce2f84691559672cfaf6bb8fd3a9ac43904f2Robert Shih int32_t subtitleGeneration); 5714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 5814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber sp<DataSource> getDataSource(); 5914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 6014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void startAsync( 6114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber const sp<AnotherPacketSource> &audioSource, 6214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber const sp<AnotherPacketSource> &videoSource, 6314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber const sp<AnotherPacketSource> &subtitleSource, 64309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih int64_t startTimeUs = -1ll, // starting timestamps 65309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih int64_t segmentStartTimeUs = -1ll, // starting position within playlist 66309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih // startTimeUs!=segmentStartTimeUs only when playlist is live 67309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih int32_t startDiscontinuitySeq = 0, 68309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih bool adaptive = false); 6914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 70c4547ba77f78632172db3647a09659d9863d3b5cChong Zhang void pauseAsync(bool immediate = false); 7114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 72309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih void stopAsync(bool clear = true); 7314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 74777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih void resumeUntilAsync(const sp<AMessage> ¶ms); 75777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih 7673d2847af14cdd5fdf8bd1ac80fb7ddf9ae7d9a7Robert Shih uint32_t getStreamTypeMask() const { 7773d2847af14cdd5fdf8bd1ac80fb7ddf9ae7d9a7Robert Shih return mStreamTypeMask; 7873d2847af14cdd5fdf8bd1ac80fb7ddf9ae7d9a7Robert Shih } 7973d2847af14cdd5fdf8bd1ac80fb7ddf9ae7d9a7Robert Shih 8014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberprotected: 8114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber virtual ~PlaylistFetcher(); 8214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber virtual void onMessageReceived(const sp<AMessage> &msg); 8314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 8414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberprivate: 8514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber enum { 8614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kMaxNumRetries = 5, 8714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber }; 8814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 8914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber enum { 9014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatStart = 'strt', 9114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatPause = 'paus', 9214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatStop = 'stop', 9314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatMonitorQueue = 'moni', 94777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih kWhatResumeUntil = 'rsme', 95777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih kWhatDownloadNext = 'dlnx', 9614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber }; 9714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 986708a45ba1b5eacf583d5e80b2075b68940fe0abLajos Molnar static const int64_t kMaxMonitorDelayUs; 99777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih static const int32_t kNumSkipFrames; 10014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 10143ca783effd99bba0e6e2dd6fe177a8888578ef8Robert Shih static bool bufferStartsWithTsSyncByte(const sp<ABuffer>& buffer); 1027d8e3ccfbf326b5e190b416590e956c2fc3021f7Lajos Molnar static bool bufferStartsWithWebVTTMagicSequence(const sp<ABuffer>& buffer); 10343ca783effd99bba0e6e2dd6fe177a8888578ef8Robert Shih 104777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih // notifications to mSession 10514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber sp<AMessage> mNotify; 106777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih sp<AMessage> mStartTimeUsNotify; 107777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih 10814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber sp<LiveSession> mSession; 10914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber AString mURI; 11014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 11114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber uint32_t mStreamTypeMask; 11214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber int64_t mStartTimeUs; 113f78f62bd6b0a99747db53828d281a50b9270a646Robert Shih 114f78f62bd6b0a99747db53828d281a50b9270a646Robert Shih // Start time relative to the beginning of the first segment in the initial 115f78f62bd6b0a99747db53828d281a50b9270a646Robert Shih // playlist. It's value is initialized to a non-negative value only when we are 116f78f62bd6b0a99747db53828d281a50b9270a646Robert Shih // adapting or switching tracks. 117309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih int64_t mSegmentStartTimeUs; 118f78f62bd6b0a99747db53828d281a50b9270a646Robert Shih 1194604458dfe57b0e91a464aefafea50ae7b9876c1Chong Zhang int32_t mDiscontinuitySeq; 120309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih bool mStartTimeUsRelative; 121777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih sp<AMessage> mStopParams; // message containing the latest timestamps we should fetch. 12214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 12314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber KeyedVector<LiveSession::StreamType, sp<AnotherPacketSource> > 12414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mPacketSources; 12514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 12614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber KeyedVector<AString, sp<ABuffer> > mAESKeyForURI; 12714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 12814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber int64_t mLastPlaylistFetchTimeUs; 12914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber sp<M3UParser> mPlaylist; 13014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber int32_t mSeqNumber; 13114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber int32_t mNumRetries; 13214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber bool mStartup; 133c4547ba77f78632172db3647a09659d9863d3b5cChong Zhang bool mIDRFound; 134309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih bool mAdaptive; 1356708a45ba1b5eacf583d5e80b2075b68940fe0abLajos Molnar bool mPrepared; 136c4547ba77f78632172db3647a09659d9863d3b5cChong Zhang bool mTimeChangeSignaled; 13714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber int64_t mNextPTSTimeUs; 13814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 13914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber int32_t mMonitorQueueGeneration; 140b44ce2f84691559672cfaf6bb8fd3a9ac43904f2Robert Shih const int32_t mSubtitleGeneration; 14114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 142c4547ba77f78632172db3647a09659d9863d3b5cChong Zhang int32_t mLastDiscontinuitySeq; 143c4547ba77f78632172db3647a09659d9863d3b5cChong Zhang 144c4547ba77f78632172db3647a09659d9863d3b5cChong Zhang Mutex mStoppingLock; 145c4547ba77f78632172db3647a09659d9863d3b5cChong Zhang bool mStopping; 146c4547ba77f78632172db3647a09659d9863d3b5cChong Zhang 14714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber enum RefreshState { 14814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber INITIAL_MINIMUM_RELOAD_DELAY, 14914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber FIRST_UNCHANGED_RELOAD_ATTEMPT, 15014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber SECOND_UNCHANGED_RELOAD_ATTEMPT, 15114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber THIRD_UNCHANGED_RELOAD_ATTEMPT 15214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber }; 15314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber RefreshState mRefreshState; 15414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 15514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber uint8_t mPlaylistHash[16]; 15614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 15714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber sp<ATSParser> mTSParser; 15814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 15914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber bool mFirstPTSValid; 16014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber uint64_t mFirstPTS; 161309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih int64_t mFirstTimeUs; 162309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih sp<AnotherPacketSource> mVideoBuffer; 16314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 1642cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih // Stores the initialization vector to decrypt the next block of cipher text, which can 1652cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih // either be derived from the sequence number, read from the manifest, or copied from 1662cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih // the last block of cipher text (cipher-block chaining). 1672cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih unsigned char mAESInitVec[16]; 1682cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih 1692cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih // Set first to true if decrypting the first segment of a playlist segment. When 1702cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih // first is true, reset the initialization vector based on the available 1712cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih // information in the manifest; otherwise, use the initialization vector as 1722cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih // updated by the last call to AES_cbc_encrypt. 1732cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih // 1742cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih // For the input to decrypt correctly, decryptBuffer must be called on 1752cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih // consecutive byte ranges on block boundaries, e.g. 0..15, 16..47, 48..63, 1762cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih // and so on. 17714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber status_t decryptBuffer( 1782cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih size_t playlistIndex, const sp<ABuffer> &buffer, 1792cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih bool first = true); 1802cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih status_t checkDecryptPadding(const sp<ABuffer> &buffer); 18114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 1826708a45ba1b5eacf583d5e80b2075b68940fe0abLajos Molnar void postMonitorQueue(int64_t delayUs = 0, int64_t minDelayUs = 0); 18314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void cancelMonitorQueue(); 184c4547ba77f78632172db3647a09659d9863d3b5cChong Zhang void setStopping(bool stopping); 18514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 1866708a45ba1b5eacf583d5e80b2075b68940fe0abLajos Molnar int64_t delayUsToRefreshPlaylist() const; 1876708a45ba1b5eacf583d5e80b2075b68940fe0abLajos Molnar status_t refreshPlaylist(); 18814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 18914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber // Returns the media time in us of the segment specified by seqNumber. 19014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber // This is computed by summing the durations of all segments before it. 19114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber int64_t getSegmentStartTimeUs(int32_t seqNumber) const; 19214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 19314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber status_t onStart(const sp<AMessage> &msg); 19414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void onPause(); 195ceeabe15f4e7bc73efdfcafed917202de9d515cbRobert Shih void onStop(const sp<AMessage> &msg); 19614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void onMonitorQueue(); 19714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void onDownloadNext(); 19814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 199777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih // Resume a fetcher to continue until the stopping point stored in msg. 200777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih status_t onResumeUntil(const sp<AMessage> &msg); 201777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih 202309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih const sp<ABuffer> &setAccessUnitProperties( 203309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih const sp<ABuffer> &accessUnit, 204309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih const sp<AnotherPacketSource> &source, 205309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih bool discard = false); 20643ca783effd99bba0e6e2dd6fe177a8888578ef8Robert Shih status_t extractAndQueueAccessUnitsFromTs(const sp<ABuffer> &buffer); 20743ca783effd99bba0e6e2dd6fe177a8888578ef8Robert Shih 208dcb89b3b505522efde173c105a851c412f947178Chong Zhang status_t extractAndQueueAccessUnits( 209dcb89b3b505522efde173c105a851c412f947178Chong Zhang const sp<ABuffer> &buffer, const sp<AMessage> &itemMeta); 21014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 21114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void notifyError(status_t err); 21214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 21314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void queueDiscontinuity( 21414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber ATSParser::DiscontinuityType type, const sp<AMessage> &extra); 21514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 216309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih int32_t getSeqNumberWithAnchorTime(int64_t anchorTimeUs) const; 217309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih int32_t getSeqNumberForDiscontinuity(size_t discontinuitySeq) const; 21814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber int32_t getSeqNumberForTime(int64_t timeUs) const; 21914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 22014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void updateDuration(); 22114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 22214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(PlaylistFetcher); 22314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber}; 22414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 22514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber} // namespace android 22614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 22714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber#endif // PLAYLIST_FETCHER_H_ 22814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 229