PlaylistFetcher.h revision ee4e1b1a63758941460ae79a064249d3a5189443
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;
30ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnarclass 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,
477c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        kWhatTargetDurationUpdate,
4814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatPrepared,
4914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatPreparationFailed,
50777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih        kWhatStartedAt,
517c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        kWhatStopReached,
520852843d304006e3ab333081fddda13b07193de8Robert Shih        kWhatMetadataDetected,
5314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    };
5414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
5514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    PlaylistFetcher(
5614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            const sp<AMessage> &notify,
5714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            const sp<LiveSession> &session,
58b44ce2f84691559672cfaf6bb8fd3a9ac43904f2Robert Shih            const char *uri,
5925f82752942b1c78aec8ee303d61afff85cff9d1Chong Zhang            int32_t id,
60b44ce2f84691559672cfaf6bb8fd3a9ac43904f2Robert Shih            int32_t subtitleGeneration);
6114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
6225f82752942b1c78aec8ee303d61afff85cff9d1Chong Zhang    int32_t getFetcherID() const;
6325f82752942b1c78aec8ee303d61afff85cff9d1Chong Zhang
6414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    sp<DataSource> getDataSource();
6514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
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
77a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang    void pauseAsync(float thresholdRatio);
7814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
79309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    void stopAsync(bool clear = true);
8014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
81777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    void resumeUntilAsync(const sp<AMessage> &params);
82777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih
8373d2847af14cdd5fdf8bd1ac80fb7ddf9ae7d9a7Robert Shih    uint32_t getStreamTypeMask() const {
8473d2847af14cdd5fdf8bd1ac80fb7ddf9ae7d9a7Robert Shih        return mStreamTypeMask;
8573d2847af14cdd5fdf8bd1ac80fb7ddf9ae7d9a7Robert Shih    }
8673d2847af14cdd5fdf8bd1ac80fb7ddf9ae7d9a7Robert Shih
8714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberprotected:
8814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    virtual ~PlaylistFetcher();
8914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    virtual void onMessageReceived(const sp<AMessage> &msg);
9014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
9114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberprivate:
9214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    enum {
9314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kMaxNumRetries         = 5,
9414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    };
9514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
9614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    enum {
9714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatStart          = 'strt',
9814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatPause          = 'paus',
9914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatStop           = 'stop',
10014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatMonitorQueue   = 'moni',
101777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih        kWhatResumeUntil    = 'rsme',
102777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih        kWhatDownloadNext   = 'dlnx',
10314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    };
10414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
105a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang    struct DownloadState;
106a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang
1076708a45ba1b5eacf583d5e80b2075b68940fe0abLajos Molnar    static const int64_t kMaxMonitorDelayUs;
108777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    static const int32_t kNumSkipFrames;
10914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
11043ca783effd99bba0e6e2dd6fe177a8888578ef8Robert Shih    static bool bufferStartsWithTsSyncByte(const sp<ABuffer>& buffer);
1117d8e3ccfbf326b5e190b416590e956c2fc3021f7Lajos Molnar    static bool bufferStartsWithWebVTTMagicSequence(const sp<ABuffer>& buffer);
11243ca783effd99bba0e6e2dd6fe177a8888578ef8Robert Shih
113777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    // notifications to mSession
11414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    sp<AMessage> mNotify;
115777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    sp<AMessage> mStartTimeUsNotify;
116777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih
117a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang    sp<HTTPBase> mHTTPDataSource;
11814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    sp<LiveSession> mSession;
11914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    AString mURI;
12014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
12125f82752942b1c78aec8ee303d61afff85cff9d1Chong Zhang    int32_t mFetcherID;
12225f82752942b1c78aec8ee303d61afff85cff9d1Chong Zhang
12314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    uint32_t mStreamTypeMask;
12414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int64_t mStartTimeUs;
125f78f62bd6b0a99747db53828d281a50b9270a646Robert Shih
126f78f62bd6b0a99747db53828d281a50b9270a646Robert Shih    // Start time relative to the beginning of the first segment in the initial
127f78f62bd6b0a99747db53828d281a50b9270a646Robert Shih    // playlist. It's value is initialized to a non-negative value only when we are
128f78f62bd6b0a99747db53828d281a50b9270a646Robert Shih    // adapting or switching tracks.
129309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    int64_t mSegmentStartTimeUs;
130f78f62bd6b0a99747db53828d281a50b9270a646Robert Shih
1314604458dfe57b0e91a464aefafea50ae7b9876c1Chong Zhang    int32_t mDiscontinuitySeq;
132309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    bool mStartTimeUsRelative;
133777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    sp<AMessage> mStopParams; // message containing the latest timestamps we should fetch.
13414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
13514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    KeyedVector<LiveSession::StreamType, sp<AnotherPacketSource> >
13614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        mPacketSources;
13714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
13814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    KeyedVector<AString, sp<ABuffer> > mAESKeyForURI;
13914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
14014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int64_t mLastPlaylistFetchTimeUs;
14114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    sp<M3UParser> mPlaylist;
14214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int32_t mSeqNumber;
14314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int32_t mNumRetries;
14414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    bool mStartup;
145c4547ba77f78632172db3647a09659d9863d3b5cChong Zhang    bool mIDRFound;
146a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang    int32_t mSeekMode;
147c4547ba77f78632172db3647a09659d9863d3b5cChong Zhang    bool mTimeChangeSignaled;
14814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int64_t mNextPTSTimeUs;
14914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
15014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int32_t mMonitorQueueGeneration;
151b44ce2f84691559672cfaf6bb8fd3a9ac43904f2Robert Shih    const int32_t mSubtitleGeneration;
15214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
153c4547ba77f78632172db3647a09659d9863d3b5cChong Zhang    int32_t mLastDiscontinuitySeq;
154c4547ba77f78632172db3647a09659d9863d3b5cChong Zhang
15514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    enum RefreshState {
15614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        INITIAL_MINIMUM_RELOAD_DELAY,
15714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        FIRST_UNCHANGED_RELOAD_ATTEMPT,
15814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        SECOND_UNCHANGED_RELOAD_ATTEMPT,
15914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        THIRD_UNCHANGED_RELOAD_ATTEMPT
16014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    };
16114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    RefreshState mRefreshState;
16214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
16314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    uint8_t mPlaylistHash[16];
16414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
16514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    sp<ATSParser> mTSParser;
16614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
16714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    bool mFirstPTSValid;
168309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    int64_t mFirstTimeUs;
169a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang    int64_t mSegmentFirstPTS;
170309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    sp<AnotherPacketSource> mVideoBuffer;
17114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
1722cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    // Stores the initialization vector to decrypt the next block of cipher text, which can
1732cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    // either be derived from the sequence number, read from the manifest, or copied from
1742cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    // the last block of cipher text (cipher-block chaining).
1752cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    unsigned char mAESInitVec[16];
1762cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih
177a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang    Mutex mThresholdLock;
178a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang    float mThresholdRatio;
179a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang
180a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang    sp<DownloadState> mDownloadState;
181a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang
1820852843d304006e3ab333081fddda13b07193de8Robert Shih    bool mHasMetadata;
1830852843d304006e3ab333081fddda13b07193de8Robert Shih
1842cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    // Set first to true if decrypting the first segment of a playlist segment. When
1852cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    // first is true, reset the initialization vector based on the available
1862cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    // information in the manifest; otherwise, use the initialization vector as
1872cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    // updated by the last call to AES_cbc_encrypt.
1882cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    //
1892cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    // For the input to decrypt correctly, decryptBuffer must be called on
1902cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    // consecutive byte ranges on block boundaries, e.g. 0..15, 16..47, 48..63,
1912cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    // and so on.
19214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    status_t decryptBuffer(
1932cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih            size_t playlistIndex, const sp<ABuffer> &buffer,
1942cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih            bool first = true);
1952cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    status_t checkDecryptPadding(const sp<ABuffer> &buffer);
19614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
1976708a45ba1b5eacf583d5e80b2075b68940fe0abLajos Molnar    void postMonitorQueue(int64_t delayUs = 0, int64_t minDelayUs = 0);
19814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void cancelMonitorQueue();
199a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang    void setStoppingThreshold(float thresholdRatio);
2007c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    bool shouldPauseDownload();
20114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
2026708a45ba1b5eacf583d5e80b2075b68940fe0abLajos Molnar    int64_t delayUsToRefreshPlaylist() const;
2036708a45ba1b5eacf583d5e80b2075b68940fe0abLajos Molnar    status_t refreshPlaylist();
20414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
20514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    // Returns the media time in us of the segment specified by seqNumber.
20614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    // This is computed by summing the durations of all segments before it.
20714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int64_t getSegmentStartTimeUs(int32_t seqNumber) const;
2087c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    // Returns the duration time in us of the segment specified.
2097c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    int64_t getSegmentDurationUs(int32_t seqNumber) const;
21014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
21114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    status_t onStart(const sp<AMessage> &msg);
21214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void onPause();
213ceeabe15f4e7bc73efdfcafed917202de9d515cbRobert Shih    void onStop(const sp<AMessage> &msg);
21414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void onMonitorQueue();
21514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void onDownloadNext();
216a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang    bool initDownloadState(
217a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang            AString &uri,
218a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang            sp<AMessage> &itemMeta,
219a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang            int32_t &firstSeqNumberInPlaylist,
220a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang            int32_t &lastSeqNumberInPlaylist);
22114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
222777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    // Resume a fetcher to continue until the stopping point stored in msg.
223777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    status_t onResumeUntil(const sp<AMessage> &msg);
224777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih
225309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    const sp<ABuffer> &setAccessUnitProperties(
226309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih            const sp<ABuffer> &accessUnit,
227309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih            const sp<AnotherPacketSource> &source,
228309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih            bool discard = false);
2290852843d304006e3ab333081fddda13b07193de8Robert Shih    bool isStartTimeReached(int64_t timeUs);
23043ca783effd99bba0e6e2dd6fe177a8888578ef8Robert Shih    status_t extractAndQueueAccessUnitsFromTs(const sp<ABuffer> &buffer);
23143ca783effd99bba0e6e2dd6fe177a8888578ef8Robert Shih
232dcb89b3b505522efde173c105a851c412f947178Chong Zhang    status_t extractAndQueueAccessUnits(
233dcb89b3b505522efde173c105a851c412f947178Chong Zhang            const sp<ABuffer> &buffer, const sp<AMessage> &itemMeta);
23414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
2357c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    void notifyStopReached();
23614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void notifyError(status_t err);
23714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
23814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void queueDiscontinuity(
23914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            ATSParser::DiscontinuityType type, const sp<AMessage> &extra);
24014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
241a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang    int32_t getSeqNumberWithAnchorTime(
242a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang            int64_t anchorTimeUs, int64_t targetDurationUs) const;
243309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    int32_t getSeqNumberForDiscontinuity(size_t discontinuitySeq) const;
24414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int32_t getSeqNumberForTime(int64_t timeUs) const;
24514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
24614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void updateDuration();
2477c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    void updateTargetDuration();
24814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
24914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(PlaylistFetcher);
25014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber};
25114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
25214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber}  // namespace android
25314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
25414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber#endif  // PLAYLIST_FETCHER_H_
25514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
256