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 {
37174609765fb9c8cbd6aeb61f489746c3570bfee2Leena Winterrowd    static const int64_t kMinBufferedDurationUs;
38a93fd2be99d21629bed504b9b7df035fc2f54562Leena Winterrowd    static const int32_t kDownloadBlockSize;
39174609765fb9c8cbd6aeb61f489746c3570bfee2Leena Winterrowd
4014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    enum {
4114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatStarted,
4214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatPaused,
4314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatStopped,
4414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatError,
4514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatDurationUpdate,
4614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatTemporarilyDoneFetching,
4714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatPrepared,
4814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatPreparationFailed,
49777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih        kWhatStartedAt,
5014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    };
5114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
5214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    PlaylistFetcher(
5314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            const sp<AMessage> &notify,
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
7014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void pauseAsync();
7114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
72309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    void stopAsync(bool clear = true);
7314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
74777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    void resumeUntilAsync(const sp<AMessage> &params);
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
119309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    ssize_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;
133309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    bool mAdaptive;
1346708a45ba1b5eacf583d5e80b2075b68940fe0abLajos Molnar    bool mPrepared;
13514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int64_t mNextPTSTimeUs;
13614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
13714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int32_t mMonitorQueueGeneration;
138b44ce2f84691559672cfaf6bb8fd3a9ac43904f2Robert Shih    const int32_t mSubtitleGeneration;
13914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
14014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    enum RefreshState {
14114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        INITIAL_MINIMUM_RELOAD_DELAY,
14214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        FIRST_UNCHANGED_RELOAD_ATTEMPT,
14314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        SECOND_UNCHANGED_RELOAD_ATTEMPT,
14414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        THIRD_UNCHANGED_RELOAD_ATTEMPT
14514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    };
14614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    RefreshState mRefreshState;
14714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
14814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    uint8_t mPlaylistHash[16];
14914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
15014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    sp<ATSParser> mTSParser;
15114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
15214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    bool mFirstPTSValid;
15314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    uint64_t mFirstPTS;
154309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    int64_t mFirstTimeUs;
15514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int64_t mAbsoluteTimeAnchorUs;
156309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    sp<AnotherPacketSource> mVideoBuffer;
15714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
1582cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    // Stores the initialization vector to decrypt the next block of cipher text, which can
1592cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    // either be derived from the sequence number, read from the manifest, or copied from
1602cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    // the last block of cipher text (cipher-block chaining).
1612cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    unsigned char mAESInitVec[16];
1622cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih
1632cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    // Set first to true if decrypting the first segment of a playlist segment. When
1642cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    // first is true, reset the initialization vector based on the available
1652cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    // information in the manifest; otherwise, use the initialization vector as
1662cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    // updated by the last call to AES_cbc_encrypt.
1672cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    //
1682cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    // For the input to decrypt correctly, decryptBuffer must be called on
1692cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    // consecutive byte ranges on block boundaries, e.g. 0..15, 16..47, 48..63,
1702cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    // and so on.
17114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    status_t decryptBuffer(
1722cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih            size_t playlistIndex, const sp<ABuffer> &buffer,
1732cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih            bool first = true);
1742cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    status_t checkDecryptPadding(const sp<ABuffer> &buffer);
17514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
1766708a45ba1b5eacf583d5e80b2075b68940fe0abLajos Molnar    void postMonitorQueue(int64_t delayUs = 0, int64_t minDelayUs = 0);
17714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void cancelMonitorQueue();
17814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
1796708a45ba1b5eacf583d5e80b2075b68940fe0abLajos Molnar    int64_t delayUsToRefreshPlaylist() const;
1806708a45ba1b5eacf583d5e80b2075b68940fe0abLajos Molnar    status_t refreshPlaylist();
18114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
18214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    // Returns the media time in us of the segment specified by seqNumber.
18314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    // This is computed by summing the durations of all segments before it.
18414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int64_t getSegmentStartTimeUs(int32_t seqNumber) const;
18514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
18614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    status_t onStart(const sp<AMessage> &msg);
18714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void onPause();
188ceeabe15f4e7bc73efdfcafed917202de9d515cbRobert Shih    void onStop(const sp<AMessage> &msg);
18914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void onMonitorQueue();
19014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void onDownloadNext();
19114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
192777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    // Resume a fetcher to continue until the stopping point stored in msg.
193777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    status_t onResumeUntil(const sp<AMessage> &msg);
194777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih
195309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    const sp<ABuffer> &setAccessUnitProperties(
196309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih            const sp<ABuffer> &accessUnit,
197309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih            const sp<AnotherPacketSource> &source,
198309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih            bool discard = false);
19943ca783effd99bba0e6e2dd6fe177a8888578ef8Robert Shih    status_t extractAndQueueAccessUnitsFromTs(const sp<ABuffer> &buffer);
20043ca783effd99bba0e6e2dd6fe177a8888578ef8Robert Shih
201dcb89b3b505522efde173c105a851c412f947178Chong Zhang    status_t extractAndQueueAccessUnits(
202dcb89b3b505522efde173c105a851c412f947178Chong Zhang            const sp<ABuffer> &buffer, const sp<AMessage> &itemMeta);
20314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
20414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void notifyError(status_t err);
20514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
20614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void queueDiscontinuity(
20714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            ATSParser::DiscontinuityType type, const sp<AMessage> &extra);
20814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
209309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    int32_t getSeqNumberWithAnchorTime(int64_t anchorTimeUs) const;
210309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    int32_t getSeqNumberForDiscontinuity(size_t discontinuitySeq) const;
21114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int32_t getSeqNumberForTime(int64_t timeUs) const;
21214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
21314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void updateDuration();
21414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
215777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    // Before resuming a fetcher in onResume, check the remaining duration is longer than that
216777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    // returned by resumeThreshold.
217777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    int64_t resumeThreshold(const sp<AMessage> &msg);
218777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih
21914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(PlaylistFetcher);
22014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber};
22114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
22214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber}  // namespace android
22314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
22414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber#endif  // PLAYLIST_FETCHER_H_
22514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
226