1a44153c1a57202fb538659eb50706e60454d6273Andreas Huber/*
2a44153c1a57202fb538659eb50706e60454d6273Andreas Huber * Copyright (C) 2010 The Android Open Source Project
3a44153c1a57202fb538659eb50706e60454d6273Andreas Huber *
4a44153c1a57202fb538659eb50706e60454d6273Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5a44153c1a57202fb538659eb50706e60454d6273Andreas Huber * you may not use this file except in compliance with the License.
6a44153c1a57202fb538659eb50706e60454d6273Andreas Huber * You may obtain a copy of the License at
7a44153c1a57202fb538659eb50706e60454d6273Andreas Huber *
8a44153c1a57202fb538659eb50706e60454d6273Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9a44153c1a57202fb538659eb50706e60454d6273Andreas Huber *
10a44153c1a57202fb538659eb50706e60454d6273Andreas Huber * Unless required by applicable law or agreed to in writing, software
11a44153c1a57202fb538659eb50706e60454d6273Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12a44153c1a57202fb538659eb50706e60454d6273Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a44153c1a57202fb538659eb50706e60454d6273Andreas Huber * See the License for the specific language governing permissions and
14a44153c1a57202fb538659eb50706e60454d6273Andreas Huber * limitations under the License.
15a44153c1a57202fb538659eb50706e60454d6273Andreas Huber */
16a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
17a44153c1a57202fb538659eb50706e60454d6273Andreas Huber#ifndef LIVE_SESSION_H_
18a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
19a44153c1a57202fb538659eb50706e60454d6273Andreas Huber#define LIVE_SESSION_H_
20a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
2148fa06d1e80a872c7495804979256e021e566ae0Wei Jia#include <media/BufferingSettings.h>
22a44153c1a57202fb538659eb50706e60454d6273Andreas Huber#include <media/stagefright/foundation/AHandler.h>
2389bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shih#include <media/mediaplayer.h>
24a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
25ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber#include <utils/String8.h>
26ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber
270852843d304006e3ab333081fddda13b07193de8Robert Shih#include "mpeg2ts/ATSParser.h"
280852843d304006e3ab333081fddda13b07193de8Robert Shih
29a44153c1a57202fb538659eb50706e60454d6273Andreas Hubernamespace android {
30a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
31a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstruct ABuffer;
323f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnarstruct AReplyToken;
3314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct AnotherPacketSource;
34ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnarclass DataSource;
3514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct HTTPBase;
361b86fe063badb5f28c467ade39be0f4008688947Andreas Huberstruct IMediaHTTPService;
37a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstruct LiveDataSource;
38a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstruct M3UParser;
3914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct PlaylistFetcher;
40d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhangstruct HLSTime;
415abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhangstruct HTTPDownloader;
42a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
43a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstruct LiveSession : public AHandler {
447314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber    enum Flags {
457314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber        // Don't log any URLs.
467314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber        kFlagIncognito = 1,
477314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber    };
48a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
498ca002eedc747dd854b61cbe364b52c06869273fRobert Shih    enum StreamIndex {
508ca002eedc747dd854b61cbe364b52c06869273fRobert Shih        kAudioIndex    = 0,
518ca002eedc747dd854b61cbe364b52c06869273fRobert Shih        kVideoIndex    = 1,
528ca002eedc747dd854b61cbe364b52c06869273fRobert Shih        kSubtitleIndex = 2,
538ca002eedc747dd854b61cbe364b52c06869273fRobert Shih        kMaxStreams    = 3,
540852843d304006e3ab333081fddda13b07193de8Robert Shih        kMetaDataIndex = 3,
550852843d304006e3ab333081fddda13b07193de8Robert Shih        kNumSources    = 4,
568ca002eedc747dd854b61cbe364b52c06869273fRobert Shih    };
578ca002eedc747dd854b61cbe364b52c06869273fRobert Shih
5814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    enum StreamType {
598ca002eedc747dd854b61cbe364b52c06869273fRobert Shih        STREAMTYPE_AUDIO        = 1 << kAudioIndex,
608ca002eedc747dd854b61cbe364b52c06869273fRobert Shih        STREAMTYPE_VIDEO        = 1 << kVideoIndex,
618ca002eedc747dd854b61cbe364b52c06869273fRobert Shih        STREAMTYPE_SUBTITLES    = 1 << kSubtitleIndex,
620852843d304006e3ab333081fddda13b07193de8Robert Shih        STREAMTYPE_METADATA     = 1 << kMetaDataIndex,
6314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    };
64964adb17885185808398507d2de88665fe193ee2Chong Zhang
65a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang    enum SeekMode {
66a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang        kSeekModeExactPosition = 0, // used for seeking
67a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang        kSeekModeNextSample    = 1, // used for seamless switching
68a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang        kSeekModeNextSegment   = 2, // used for seamless switching
69a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang    };
70a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang
71964adb17885185808398507d2de88665fe193ee2Chong Zhang    LiveSession(
72964adb17885185808398507d2de88665fe193ee2Chong Zhang            const sp<AMessage> &notify,
73964adb17885185808398507d2de88665fe193ee2Chong Zhang            uint32_t flags,
74964adb17885185808398507d2de88665fe193ee2Chong Zhang            const sp<IMediaHTTPService> &httpService);
75964adb17885185808398507d2de88665fe193ee2Chong Zhang
7648fa06d1e80a872c7495804979256e021e566ae0Wei Jia    void setBufferingSettings(const BufferingSettings &buffering);
7748fa06d1e80a872c7495804979256e021e566ae0Wei Jia
780852843d304006e3ab333081fddda13b07193de8Robert Shih    int64_t calculateMediaTimeUs(int64_t firstTimeUs, int64_t timeUs, int32_t discontinuitySeq);
7914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    status_t dequeueAccessUnit(StreamType stream, sp<ABuffer> *accessUnit);
8014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
81a83eebb78c3a7d57a769dac965b17a8aad7c7b8fRobert Shih    status_t getStreamFormatMeta(StreamType stream, sp<MetaData> *meta);
82a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
835abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang    sp<HTTPDownloader> getHTTPDownloader();
84a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang
8514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void connectAsync(
86ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber            const char *url,
87ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber            const KeyedVector<String8, String8> *headers = NULL);
88ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber
8914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    status_t disconnect();
90a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
91a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    // Blocks until seek is complete.
92c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia    status_t seekTo(int64_t timeUs, MediaPlayerSeekMode mode);
93a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
94b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    status_t getDuration(int64_t *durationUs) const;
95404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhang    size_t getTrackCount() const;
96404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhang    sp<AMessage> getTrackInfo(size_t trackIndex) const;
97dcb89b3b505522efde173c105a851c412f947178Chong Zhang    status_t selectTrack(size_t index, bool select);
9889bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shih    ssize_t getSelectedTrack(media_track_type /* type */) const;
99b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
100b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    bool isSeekable() const;
101b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    bool hasDynamicDuration() const;
102a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
1037c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    static const char *getKeyForStream(StreamType type);
10425f82752942b1c78aec8ee303d61afff85cff9d1Chong Zhang    static const char *getNameForStream(StreamType type);
1050852843d304006e3ab333081fddda13b07193de8Robert Shih    static ATSParser::SourceType getSourceTypeForStream(StreamType type);
1067c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang
1070df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    enum {
10814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatStreamsChanged,
10914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatError,
1100df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        kWhatPrepared,
1110df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        kWhatPreparationFailed,
1127c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        kWhatBufferingStart,
1137c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        kWhatBufferingEnd,
1147c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        kWhatBufferingUpdate,
1150852843d304006e3ab333081fddda13b07193de8Robert Shih        kWhatMetadataDetected,
1160df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    };
1170df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
118a44153c1a57202fb538659eb50706e60454d6273Andreas Huberprotected:
119a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    virtual ~LiveSession();
120a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
121a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    virtual void onMessageReceived(const sp<AMessage> &msg);
122a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
123a44153c1a57202fb538659eb50706e60454d6273Andreas Huberprivate:
12414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    friend struct PlaylistFetcher;
125a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
126a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    enum {
12714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatConnect                    = 'conn',
12814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatDisconnect                 = 'disc',
12914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatSeek                       = 'seek',
13014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatFetcherNotify              = 'notf',
131dcb89b3b505522efde173c105a851c412f947178Chong Zhang        kWhatChangeConfiguration        = 'chC0',
13214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatChangeConfiguration2       = 'chC2',
13314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatChangeConfiguration3       = 'chC3',
134964adb17885185808398507d2de88665fe193ee2Chong Zhang        kWhatPollBuffering              = 'poll',
13548fa06d1e80a872c7495804979256e021e566ae0Wei Jia        kWhatSetBufferingSettings       = 'sBuS',
136a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    };
137a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
1387c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    // Bandwidth Switch Mark Defaults
139765f27c2376e83766d9e1d8f8136025c5437ce49Chong Zhang    static const int64_t kUpSwitchMarkUs;
140765f27c2376e83766d9e1d8f8136025c5437ce49Chong Zhang    static const int64_t kDownSwitchMarkUs;
141765f27c2376e83766d9e1d8f8136025c5437ce49Chong Zhang    static const int64_t kUpSwitchMarginUs;
142d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang    static const int64_t kResumeThresholdUs;
1437c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang
1447c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    // Buffer Prepare/Ready/Underflow Marks
14548fa06d1e80a872c7495804979256e021e566ae0Wei Jia    BufferingSettings mBufferingSettings;
146a93fd2be99d21629bed504b9b7df035fc2f54562Leena Winterrowd
147538b6d22a3578c0201d48f8548289aa254d81484Chong Zhang    struct BandwidthEstimator;
148a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    struct BandwidthItem {
14914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        size_t mPlaylistIndex;
150a44153c1a57202fb538659eb50706e60454d6273Andreas Huber        unsigned long mBandwidth;
1515ef659e010e90175eb5282d9642a02f6105189bfChong Zhang        int64_t mLastFailureUs;
152a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    };
153a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
15414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    struct FetcherInfo {
15514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        sp<PlaylistFetcher> mFetcher;
15614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        int64_t mDurationUs;
1571543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih        bool mToBeRemoved;
158a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang        bool mToBeResumed;
15914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    };
16014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
1618ca002eedc747dd854b61cbe364b52c06869273fRobert Shih    struct StreamItem {
1628ca002eedc747dd854b61cbe364b52c06869273fRobert Shih        const char *mType;
163f4a48dfa8570d6a4708a868b8b15d1236f7ca54bRobert Shih        AString mUri, mNewUri;
164a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang        SeekMode mSeekMode;
165309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih        size_t mCurDiscontinuitySeq;
166309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih        int64_t mLastDequeuedTimeUs;
167309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih        int64_t mLastSampleDurationUs;
168309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih        StreamItem()
169a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang            : StreamItem("") {}
1700d1ed381fde5dac12dd84fcf3da66dac46699378Chih-Hung Hsieh        explicit StreamItem(const char *type)
171309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih            : mType(type),
17281636761bead03f13b4ed9320a7f25ce1354f1aeChong Zhang              mSeekMode(kSeekModeExactPosition) {
17381636761bead03f13b4ed9320a7f25ce1354f1aeChong Zhang                  reset();
17481636761bead03f13b4ed9320a7f25ce1354f1aeChong Zhang              }
17581636761bead03f13b4ed9320a7f25ce1354f1aeChong Zhang        void reset() {
17681636761bead03f13b4ed9320a7f25ce1354f1aeChong Zhang            mCurDiscontinuitySeq = 0;
17781636761bead03f13b4ed9320a7f25ce1354f1aeChong Zhang            mLastDequeuedTimeUs = -1ll;
17881636761bead03f13b4ed9320a7f25ce1354f1aeChong Zhang            mLastSampleDurationUs = 0ll;
17981636761bead03f13b4ed9320a7f25ce1354f1aeChong Zhang        }
1808ca002eedc747dd854b61cbe364b52c06869273fRobert Shih        AString uriKey() {
1818ca002eedc747dd854b61cbe364b52c06869273fRobert Shih            AString key(mType);
1828ca002eedc747dd854b61cbe364b52c06869273fRobert Shih            key.append("URI");
1838ca002eedc747dd854b61cbe364b52c06869273fRobert Shih            return key;
1848ca002eedc747dd854b61cbe364b52c06869273fRobert Shih        }
1858ca002eedc747dd854b61cbe364b52c06869273fRobert Shih    };
1868ca002eedc747dd854b61cbe364b52c06869273fRobert Shih    StreamItem mStreams[kMaxStreams];
1878ca002eedc747dd854b61cbe364b52c06869273fRobert Shih
1880df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    sp<AMessage> mNotify;
1897314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber    uint32_t mFlags;
1901b86fe063badb5f28c467ade39be0f4008688947Andreas Huber    sp<IMediaHTTPService> mHTTPService;
1917314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber
1927c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    bool mBuffering;
1930df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    bool mInPreparationPhase;
1947c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    int32_t mPollBufferingGeneration;
1957c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    int32_t mPrevBufferPercentage;
1960df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
19714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    KeyedVector<String8, String8> mExtraHeaders;
198a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
199a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    AString mMasterURL;
200ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber
201a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    Vector<BandwidthItem> mBandwidthItems;
202309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    ssize_t mCurBandwidthIndex;
2037c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    ssize_t mOrigBandwidthIndex;
204a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang    int32_t mLastBandwidthBps;
2055ef659e010e90175eb5282d9642a02f6105189bfChong Zhang    bool mLastBandwidthStable;
206538b6d22a3578c0201d48f8548289aa254d81484Chong Zhang    sp<BandwidthEstimator> mBandwidthEstimator;
20714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
208a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    sp<M3UParser> mPlaylist;
209a0d0ba51ad60a68117a0ee78e37ab78715b8a069Chong Zhang    int32_t mMaxWidth;
210a0d0ba51ad60a68117a0ee78e37ab78715b8a069Chong Zhang    int32_t mMaxHeight;
2117e43a5a2dcfa9bc64ef477472a33c87a84695c09Andreas Huber
212964adb17885185808398507d2de88665fe193ee2Chong Zhang    sp<ALooper> mFetcherLooper;
21314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    KeyedVector<AString, FetcherInfo> mFetcherInfos;
21414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    uint32_t mStreamMask;
21514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
2161543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih    // Masks used during reconfiguration:
2171543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih    // mNewStreamMask: streams in the variant playlist we're switching to;
2181543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih    // we don't want to immediately overwrite the original value.
2191543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih    uint32_t mNewStreamMask;
2201543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih
2211543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih    // mSwapMask: streams that have started to playback content in the new variant playlist;
2221543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih    // we use this to track reconfiguration progress.
2231543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih    uint32_t mSwapMask;
2241543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih
22514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    KeyedVector<StreamType, sp<AnotherPacketSource> > mPacketSources;
2261543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih    // A second set of packet sources that buffer content for the variant we're switching to.
2271543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih    KeyedVector<StreamType, sp<AnotherPacketSource> > mPacketSources2;
2281543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih
2291543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih    int32_t mSwitchGeneration;
230b44ce2f84691559672cfaf6bb8fd3a9ac43904f2Robert Shih    int32_t mSubtitleGeneration;
23114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
23214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    size_t mContinuationCounter;
23314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    sp<AMessage> mContinuation;
2345ce50c1931e1e3d8f113394bbe2c9f99354f4c5fRobert Shih    sp<AMessage> mSeekReply;
23514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
23614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int64_t mLastDequeuedTimeUs;
237dcb89b3b505522efde173c105a851c412f947178Chong Zhang    int64_t mRealTimeBaseUs;
23814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
23914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    bool mReconfigurationInProgress;
2401543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih    bool mSwitchInProgress;
2417c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    int64_t mUpSwitchMark;
2427c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    int64_t mDownSwitchMark;
2437c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    int64_t mUpSwitchMargin;
2447c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang
2453f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    sp<AReplyToken> mDisconnectReplyID;
2463f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    sp<AReplyToken> mSeekReplyID;
24714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
248309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    bool mFirstTimeUsValid;
249309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    int64_t mFirstTimeUs;
250309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    int64_t mLastSeekTimeUs;
2510852843d304006e3ab333081fddda13b07193de8Robert Shih    bool mHasMetadata;
2520852843d304006e3ab333081fddda13b07193de8Robert Shih
253309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    KeyedVector<size_t, int64_t> mDiscontinuityAbsStartTimesUs;
254309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    KeyedVector<size_t, int64_t> mDiscontinuityOffsetTimesUs;
255309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih
25614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    sp<PlaylistFetcher> addFetcher(const char *uri);
2577e43a5a2dcfa9bc64ef477472a33c87a84695c09Andreas Huber
258a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    void onConnect(const sp<AMessage> &msg);
2595abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang    void onMasterPlaylistFetched(const sp<AMessage> &msg);
260a1151185c7eb3b4c483f7067deba1775fd0a2510Lajos Molnar    void onSeek(const sp<AMessage> &msg);
26114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
2620852843d304006e3ab333081fddda13b07193de8Robert Shih    bool UriIsSameAsIndex( const AString &uri, int32_t index, bool newUri);
2630852843d304006e3ab333081fddda13b07193de8Robert Shih    sp<AnotherPacketSource> getPacketSourceForStreamIndex(size_t trackIndex, bool newUri);
2640852843d304006e3ab333081fddda13b07193de8Robert Shih    sp<AnotherPacketSource> getMetadataSource(
2650852843d304006e3ab333081fddda13b07193de8Robert Shih            sp<AnotherPacketSource> sources[kNumSources], uint32_t streamMask, bool newUri);
2660852843d304006e3ab333081fddda13b07193de8Robert Shih
2677c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    bool resumeFetcher(
2687c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            const AString &uri, uint32_t streamMask,
2697c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            int64_t timeUs = -1ll, bool newUri = false);
2707c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang
271a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang    float getAbortThreshold(
272a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang            ssize_t currentBWIndex, ssize_t targetBWIndex) const;
273538b6d22a3578c0201d48f8548289aa254d81484Chong Zhang    void addBandwidthMeasurement(size_t numBytes, int64_t delayUs);
274538b6d22a3578c0201d48f8548289aa254d81484Chong Zhang    size_t getBandwidthIndex(int32_t bandwidthBps);
2755ef659e010e90175eb5282d9642a02f6105189bfChong Zhang    ssize_t getLowestValidBandwidthIndex() const;
276d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang    HLSTime latestMediaSegmentStartTime() const;
277a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
2785ef659e010e90175eb5282d9642a02f6105189bfChong Zhang    static bool isBandwidthValid(const BandwidthItem &item);
27914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    static int SortByBandwidth(const BandwidthItem *, const BandwidthItem *);
2808ca002eedc747dd854b61cbe364b52c06869273fRobert Shih    static StreamType indexToType(int idx);
281f69c996864844e8f669308af8412cede043062a2Robert Shih    static ssize_t typeToIndex(int32_t type);
282a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
283dcb89b3b505522efde173c105a851c412f947178Chong Zhang    void changeConfiguration(
2847c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            int64_t timeUs, ssize_t bwIndex = -1, bool pickTrack = false);
285dcb89b3b505522efde173c105a851c412f947178Chong Zhang    void onChangeConfiguration(const sp<AMessage> &msg);
28614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void onChangeConfiguration2(const sp<AMessage> &msg);
28714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void onChangeConfiguration3(const sp<AMessage> &msg);
2887c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang
289a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang    void swapPacketSource(StreamType stream);
2907c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    void tryToFinishBandwidthSwitch(const AString &oldUri);
2917c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    void cancelBandwidthSwitch(bool resume = false);
2927c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    bool checkSwitchProgress(
2937c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            sp<AMessage> &msg, int64_t delayUs, bool *needResumeUntil);
294a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
2958464d7decb34a3044e92b4085f1bbaafb51410e8Chong Zhang    bool switchBandwidthIfNeeded(bool bufferHigh, bool bufferLow);
2965ef659e010e90175eb5282d9642a02f6105189bfChong Zhang    bool tryBandwidthFallback();
2971543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih
298964adb17885185808398507d2de88665fe193ee2Chong Zhang    void schedulePollBuffering();
299964adb17885185808398507d2de88665fe193ee2Chong Zhang    void cancelPollBuffering();
3007c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    void restartPollBuffering();
301964adb17885185808398507d2de88665fe193ee2Chong Zhang    void onPollBuffering();
3027c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    bool checkBuffering(bool &underflow, bool &ready, bool &down, bool &up);
3037c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    void startBufferingIfNecessary();
3047c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    void stopBufferingIfNecessary();
3057c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    void notifyBufferingUpdate(int32_t percentage);
306a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
30714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void finishDisconnect();
308b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
30914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void postPrepared(status_t err);
3107c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    void postError(status_t err);
3110df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
312a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(LiveSession);
313a44153c1a57202fb538659eb50706e60454d6273Andreas Huber};
314a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
315a44153c1a57202fb538659eb50706e60454d6273Andreas Huber}  // namespace android
316a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
317a44153c1a57202fb538659eb50706e60454d6273Andreas Huber#endif  // LIVE_SESSION_H_
318