PlaylistFetcher.h revision b44ce2f84691559672cfaf6bb8fd3a9ac43904f2
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,
46777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih        kWhatStartedAt,
4714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    };
4814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
4914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    PlaylistFetcher(
5014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            const sp<AMessage> &notify,
5114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            const sp<LiveSession> &session,
52b44ce2f84691559672cfaf6bb8fd3a9ac43904f2Robert Shih            const char *uri,
53b44ce2f84691559672cfaf6bb8fd3a9ac43904f2Robert Shih            int32_t subtitleGeneration);
5414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
5514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    sp<DataSource> getDataSource();
5614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
5714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void startAsync(
5814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            const sp<AnotherPacketSource> &audioSource,
5914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            const sp<AnotherPacketSource> &videoSource,
6014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            const sp<AnotherPacketSource> &subtitleSource,
61309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih            int64_t startTimeUs = -1ll,         // starting timestamps
62309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih            int64_t segmentStartTimeUs = -1ll, // starting position within playlist
63309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih            // startTimeUs!=segmentStartTimeUs only when playlist is live
64309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih            int32_t startDiscontinuitySeq = 0,
65309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih            bool adaptive = false);
6614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
6714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void pauseAsync();
6814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
69309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    void stopAsync(bool clear = true);
7014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
71777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    void resumeUntilAsync(const sp<AMessage> &params);
72777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih
7373d2847af14cdd5fdf8bd1ac80fb7ddf9ae7d9a7Robert Shih    uint32_t getStreamTypeMask() const {
7473d2847af14cdd5fdf8bd1ac80fb7ddf9ae7d9a7Robert Shih        return mStreamTypeMask;
7573d2847af14cdd5fdf8bd1ac80fb7ddf9ae7d9a7Robert Shih    }
7673d2847af14cdd5fdf8bd1ac80fb7ddf9ae7d9a7Robert Shih
7714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberprotected:
7814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    virtual ~PlaylistFetcher();
7914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    virtual void onMessageReceived(const sp<AMessage> &msg);
8014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
8114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberprivate:
8214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    enum {
8314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kMaxNumRetries         = 5,
8414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    };
8514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
8614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    enum {
8714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatStart          = 'strt',
8814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatPause          = 'paus',
8914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatStop           = 'stop',
9014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatMonitorQueue   = 'moni',
91777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih        kWhatResumeUntil    = 'rsme',
92777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih        kWhatDownloadNext   = 'dlnx',
9314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    };
9414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
9514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    static const int64_t kMinBufferedDurationUs;
966708a45ba1b5eacf583d5e80b2075b68940fe0abLajos Molnar    static const int64_t kMaxMonitorDelayUs;
9743ca783effd99bba0e6e2dd6fe177a8888578ef8Robert Shih    static const int32_t kDownloadBlockSize;
98777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    static const int32_t kNumSkipFrames;
9914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
10043ca783effd99bba0e6e2dd6fe177a8888578ef8Robert Shih    static bool bufferStartsWithTsSyncByte(const sp<ABuffer>& buffer);
1017d8e3ccfbf326b5e190b416590e956c2fc3021f7Lajos Molnar    static bool bufferStartsWithWebVTTMagicSequence(const sp<ABuffer>& buffer);
10243ca783effd99bba0e6e2dd6fe177a8888578ef8Robert Shih
103777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    // notifications to mSession
10414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    sp<AMessage> mNotify;
105777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    sp<AMessage> mStartTimeUsNotify;
106777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih
10714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    sp<LiveSession> mSession;
10814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    AString mURI;
10914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
11014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    uint32_t mStreamTypeMask;
11114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int64_t mStartTimeUs;
112f78f62bd6b0a99747db53828d281a50b9270a646Robert Shih
113f78f62bd6b0a99747db53828d281a50b9270a646Robert Shih    // Start time relative to the beginning of the first segment in the initial
114f78f62bd6b0a99747db53828d281a50b9270a646Robert Shih    // playlist. It's value is initialized to a non-negative value only when we are
115f78f62bd6b0a99747db53828d281a50b9270a646Robert Shih    // adapting or switching tracks.
116309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    int64_t mSegmentStartTimeUs;
117f78f62bd6b0a99747db53828d281a50b9270a646Robert Shih
118309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    ssize_t mDiscontinuitySeq;
119309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    bool mStartTimeUsRelative;
120777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    sp<AMessage> mStopParams; // message containing the latest timestamps we should fetch.
12114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
12214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    KeyedVector<LiveSession::StreamType, sp<AnotherPacketSource> >
12314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        mPacketSources;
12414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
12514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    KeyedVector<AString, sp<ABuffer> > mAESKeyForURI;
12614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
12714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int64_t mLastPlaylistFetchTimeUs;
12814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    sp<M3UParser> mPlaylist;
12914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int32_t mSeqNumber;
13014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int32_t mNumRetries;
13114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    bool mStartup;
132309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    bool mAdaptive;
1336708a45ba1b5eacf583d5e80b2075b68940fe0abLajos Molnar    bool mPrepared;
13414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int64_t mNextPTSTimeUs;
13514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
13614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int32_t mMonitorQueueGeneration;
137b44ce2f84691559672cfaf6bb8fd3a9ac43904f2Robert Shih    const int32_t mSubtitleGeneration;
13814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
13914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    enum RefreshState {
14014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        INITIAL_MINIMUM_RELOAD_DELAY,
14114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        FIRST_UNCHANGED_RELOAD_ATTEMPT,
14214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        SECOND_UNCHANGED_RELOAD_ATTEMPT,
14314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        THIRD_UNCHANGED_RELOAD_ATTEMPT
14414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    };
14514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    RefreshState mRefreshState;
14614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
14714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    uint8_t mPlaylistHash[16];
14814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
14914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    sp<ATSParser> mTSParser;
15014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
15114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    bool mFirstPTSValid;
15214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    uint64_t mFirstPTS;
153309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    int64_t mFirstTimeUs;
15414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int64_t mAbsoluteTimeAnchorUs;
155309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    sp<AnotherPacketSource> mVideoBuffer;
15614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
1572cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    // Stores the initialization vector to decrypt the next block of cipher text, which can
1582cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    // either be derived from the sequence number, read from the manifest, or copied from
1592cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    // the last block of cipher text (cipher-block chaining).
1602cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    unsigned char mAESInitVec[16];
1612cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih
1622cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    // Set first to true if decrypting the first segment of a playlist segment. When
1632cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    // first is true, reset the initialization vector based on the available
1642cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    // information in the manifest; otherwise, use the initialization vector as
1652cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    // updated by the last call to AES_cbc_encrypt.
1662cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    //
1672cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    // For the input to decrypt correctly, decryptBuffer must be called on
1682cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    // consecutive byte ranges on block boundaries, e.g. 0..15, 16..47, 48..63,
1692cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    // and so on.
17014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    status_t decryptBuffer(
1712cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih            size_t playlistIndex, const sp<ABuffer> &buffer,
1722cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih            bool first = true);
1732cd94583868b775a548233a4f7cd1d988fc6344fRobert Shih    status_t checkDecryptPadding(const sp<ABuffer> &buffer);
17414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
1756708a45ba1b5eacf583d5e80b2075b68940fe0abLajos Molnar    void postMonitorQueue(int64_t delayUs = 0, int64_t minDelayUs = 0);
17614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void cancelMonitorQueue();
17714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
1786708a45ba1b5eacf583d5e80b2075b68940fe0abLajos Molnar    int64_t delayUsToRefreshPlaylist() const;
1796708a45ba1b5eacf583d5e80b2075b68940fe0abLajos Molnar    status_t refreshPlaylist();
18014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
18114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    // Returns the media time in us of the segment specified by seqNumber.
18214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    // This is computed by summing the durations of all segments before it.
18314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int64_t getSegmentStartTimeUs(int32_t seqNumber) const;
18414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
18514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    status_t onStart(const sp<AMessage> &msg);
18614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void onPause();
187ceeabe15f4e7bc73efdfcafed917202de9d515cbRobert Shih    void onStop(const sp<AMessage> &msg);
18814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void onMonitorQueue();
18914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void onDownloadNext();
19014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
191777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    // Resume a fetcher to continue until the stopping point stored in msg.
192777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    status_t onResumeUntil(const sp<AMessage> &msg);
193777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih
194309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    const sp<ABuffer> &setAccessUnitProperties(
195309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih            const sp<ABuffer> &accessUnit,
196309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih            const sp<AnotherPacketSource> &source,
197309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih            bool discard = false);
19843ca783effd99bba0e6e2dd6fe177a8888578ef8Robert Shih    status_t extractAndQueueAccessUnitsFromTs(const sp<ABuffer> &buffer);
19943ca783effd99bba0e6e2dd6fe177a8888578ef8Robert Shih
200dcb89b3b505522efde173c105a851c412f947178Chong Zhang    status_t extractAndQueueAccessUnits(
201dcb89b3b505522efde173c105a851c412f947178Chong Zhang            const sp<ABuffer> &buffer, const sp<AMessage> &itemMeta);
20214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
20314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void notifyError(status_t err);
20414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
20514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void queueDiscontinuity(
20614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            ATSParser::DiscontinuityType type, const sp<AMessage> &extra);
20714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
208309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    int32_t getSeqNumberWithAnchorTime(int64_t anchorTimeUs) const;
209309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    int32_t getSeqNumberForDiscontinuity(size_t discontinuitySeq) const;
21014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int32_t getSeqNumberForTime(int64_t timeUs) const;
21114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
21214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void updateDuration();
21314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
214777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    // Before resuming a fetcher in onResume, check the remaining duration is longer than that
215777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    // returned by resumeThreshold.
216777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    int64_t resumeThreshold(const sp<AMessage> &msg);
217777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih
21814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(PlaylistFetcher);
21914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber};
22014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
22114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber}  // namespace android
22214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
22314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber#endif  // PLAYLIST_FETCHER_H_
22414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
225