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
21a44153c1a57202fb538659eb50706e60454d6273Andreas Huber#include <media/stagefright/foundation/AHandler.h>
2289bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shih#include <media/mediaplayer.h>
23a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
24ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber#include <utils/String8.h>
25ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber
260852843d304006e3ab333081fddda13b07193de8Robert Shih#include "mpeg2ts/ATSParser.h"
270852843d304006e3ab333081fddda13b07193de8Robert Shih
28a44153c1a57202fb538659eb50706e60454d6273Andreas Hubernamespace android {
29a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
30a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstruct ABuffer;
313f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnarstruct AReplyToken;
3214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct AnotherPacketSource;
33ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnarclass DataSource;
3414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct HTTPBase;
351b86fe063badb5f28c467ade39be0f4008688947Andreas Huberstruct IMediaHTTPService;
36a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstruct LiveDataSource;
37a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstruct M3UParser;
3814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct PlaylistFetcher;
39d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhangstruct HLSTime;
405abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhangstruct HTTPDownloader;
41a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
42a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstruct LiveSession : public AHandler {
437314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber    enum Flags {
447314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber        // Don't log any URLs.
457314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber        kFlagIncognito = 1,
467314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber    };
47a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
488ca002eedc747dd854b61cbe364b52c06869273fRobert Shih    enum StreamIndex {
498ca002eedc747dd854b61cbe364b52c06869273fRobert Shih        kAudioIndex    = 0,
508ca002eedc747dd854b61cbe364b52c06869273fRobert Shih        kVideoIndex    = 1,
518ca002eedc747dd854b61cbe364b52c06869273fRobert Shih        kSubtitleIndex = 2,
528ca002eedc747dd854b61cbe364b52c06869273fRobert Shih        kMaxStreams    = 3,
530852843d304006e3ab333081fddda13b07193de8Robert Shih        kMetaDataIndex = 3,
540852843d304006e3ab333081fddda13b07193de8Robert Shih        kNumSources    = 4,
558ca002eedc747dd854b61cbe364b52c06869273fRobert Shih    };
568ca002eedc747dd854b61cbe364b52c06869273fRobert Shih
5714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    enum StreamType {
588ca002eedc747dd854b61cbe364b52c06869273fRobert Shih        STREAMTYPE_AUDIO        = 1 << kAudioIndex,
598ca002eedc747dd854b61cbe364b52c06869273fRobert Shih        STREAMTYPE_VIDEO        = 1 << kVideoIndex,
608ca002eedc747dd854b61cbe364b52c06869273fRobert Shih        STREAMTYPE_SUBTITLES    = 1 << kSubtitleIndex,
610852843d304006e3ab333081fddda13b07193de8Robert Shih        STREAMTYPE_METADATA     = 1 << kMetaDataIndex,
6214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    };
63964adb17885185808398507d2de88665fe193ee2Chong Zhang
64a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang    enum SeekMode {
65a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang        kSeekModeExactPosition = 0, // used for seeking
66a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang        kSeekModeNextSample    = 1, // used for seamless switching
67a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang        kSeekModeNextSegment   = 2, // used for seamless switching
68a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang    };
69a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang
70964adb17885185808398507d2de88665fe193ee2Chong Zhang    LiveSession(
71964adb17885185808398507d2de88665fe193ee2Chong Zhang            const sp<AMessage> &notify,
72964adb17885185808398507d2de88665fe193ee2Chong Zhang            uint32_t flags,
73964adb17885185808398507d2de88665fe193ee2Chong Zhang            const sp<IMediaHTTPService> &httpService);
74964adb17885185808398507d2de88665fe193ee2Chong Zhang
750852843d304006e3ab333081fddda13b07193de8Robert Shih    int64_t calculateMediaTimeUs(int64_t firstTimeUs, int64_t timeUs, int32_t discontinuitySeq);
7614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    status_t dequeueAccessUnit(StreamType stream, sp<ABuffer> *accessUnit);
7714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
7814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    status_t getStreamFormat(StreamType stream, sp<AMessage> *format);
79a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
805abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang    sp<HTTPDownloader> getHTTPDownloader();
81a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang
8214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void connectAsync(
83ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber            const char *url,
84ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber            const KeyedVector<String8, String8> *headers = NULL);
85ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber
8614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    status_t disconnect();
87a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
88a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    // Blocks until seek is complete.
8914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    status_t seekTo(int64_t timeUs);
90a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
91b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    status_t getDuration(int64_t *durationUs) const;
92404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhang    size_t getTrackCount() const;
93404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhang    sp<AMessage> getTrackInfo(size_t trackIndex) const;
94dcb89b3b505522efde173c105a851c412f947178Chong Zhang    status_t selectTrack(size_t index, bool select);
9589bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shih    ssize_t getSelectedTrack(media_track_type /* type */) const;
96b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
97b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    bool isSeekable() const;
98b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    bool hasDynamicDuration() const;
99a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
1007c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    static const char *getKeyForStream(StreamType type);
10125f82752942b1c78aec8ee303d61afff85cff9d1Chong Zhang    static const char *getNameForStream(StreamType type);
1020852843d304006e3ab333081fddda13b07193de8Robert Shih    static ATSParser::SourceType getSourceTypeForStream(StreamType type);
1037c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang
1040df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    enum {
10514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatStreamsChanged,
10614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatError,
1070df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        kWhatPrepared,
1080df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        kWhatPreparationFailed,
1097c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        kWhatBufferingStart,
1107c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        kWhatBufferingEnd,
1117c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang        kWhatBufferingUpdate,
1120852843d304006e3ab333081fddda13b07193de8Robert Shih        kWhatMetadataDetected,
1130df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    };
1140df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
115a44153c1a57202fb538659eb50706e60454d6273Andreas Huberprotected:
116a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    virtual ~LiveSession();
117a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
118a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    virtual void onMessageReceived(const sp<AMessage> &msg);
119a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
120a44153c1a57202fb538659eb50706e60454d6273Andreas Huberprivate:
12114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    friend struct PlaylistFetcher;
122a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
123a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    enum {
12414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatConnect                    = 'conn',
12514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatDisconnect                 = 'disc',
12614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatSeek                       = 'seek',
12714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatFetcherNotify              = 'notf',
128dcb89b3b505522efde173c105a851c412f947178Chong Zhang        kWhatChangeConfiguration        = 'chC0',
12914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatChangeConfiguration2       = 'chC2',
13014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatChangeConfiguration3       = 'chC3',
131964adb17885185808398507d2de88665fe193ee2Chong Zhang        kWhatPollBuffering              = 'poll',
132a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    };
133a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
1347c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    // Bandwidth Switch Mark Defaults
135765f27c2376e83766d9e1d8f8136025c5437ce49Chong Zhang    static const int64_t kUpSwitchMarkUs;
136765f27c2376e83766d9e1d8f8136025c5437ce49Chong Zhang    static const int64_t kDownSwitchMarkUs;
137765f27c2376e83766d9e1d8f8136025c5437ce49Chong Zhang    static const int64_t kUpSwitchMarginUs;
138d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang    static const int64_t kResumeThresholdUs;
1397c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang
1407c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    // Buffer Prepare/Ready/Underflow Marks
141765f27c2376e83766d9e1d8f8136025c5437ce49Chong Zhang    static const int64_t kReadyMarkUs;
142765f27c2376e83766d9e1d8f8136025c5437ce49Chong Zhang    static const int64_t kPrepareMarkUs;
143765f27c2376e83766d9e1d8f8136025c5437ce49Chong Zhang    static const int64_t kUnderflowMarkUs;
144a93fd2be99d21629bed504b9b7df035fc2f54562Leena Winterrowd
145538b6d22a3578c0201d48f8548289aa254d81484Chong Zhang    struct BandwidthEstimator;
146a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    struct BandwidthItem {
14714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        size_t mPlaylistIndex;
148a44153c1a57202fb538659eb50706e60454d6273Andreas Huber        unsigned long mBandwidth;
1495ef659e010e90175eb5282d9642a02f6105189bfChong Zhang        int64_t mLastFailureUs;
150a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    };
151a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
15214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    struct FetcherInfo {
15314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        sp<PlaylistFetcher> mFetcher;
15414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        int64_t mDurationUs;
1551543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih        bool mToBeRemoved;
156a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang        bool mToBeResumed;
15714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    };
15814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
1598ca002eedc747dd854b61cbe364b52c06869273fRobert Shih    struct StreamItem {
1608ca002eedc747dd854b61cbe364b52c06869273fRobert Shih        const char *mType;
161f4a48dfa8570d6a4708a868b8b15d1236f7ca54bRobert Shih        AString mUri, mNewUri;
162a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang        SeekMode mSeekMode;
163309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih        size_t mCurDiscontinuitySeq;
164309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih        int64_t mLastDequeuedTimeUs;
165309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih        int64_t mLastSampleDurationUs;
166309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih        StreamItem()
167a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang            : StreamItem("") {}
168309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih        StreamItem(const char *type)
169309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih            : mType(type),
17081636761bead03f13b4ed9320a7f25ce1354f1aeChong Zhang              mSeekMode(kSeekModeExactPosition) {
17181636761bead03f13b4ed9320a7f25ce1354f1aeChong Zhang                  reset();
17281636761bead03f13b4ed9320a7f25ce1354f1aeChong Zhang              }
17381636761bead03f13b4ed9320a7f25ce1354f1aeChong Zhang        void reset() {
17481636761bead03f13b4ed9320a7f25ce1354f1aeChong Zhang            mCurDiscontinuitySeq = 0;
17581636761bead03f13b4ed9320a7f25ce1354f1aeChong Zhang            mLastDequeuedTimeUs = -1ll;
17681636761bead03f13b4ed9320a7f25ce1354f1aeChong Zhang            mLastSampleDurationUs = 0ll;
17781636761bead03f13b4ed9320a7f25ce1354f1aeChong Zhang        }
1788ca002eedc747dd854b61cbe364b52c06869273fRobert Shih        AString uriKey() {
1798ca002eedc747dd854b61cbe364b52c06869273fRobert Shih            AString key(mType);
1808ca002eedc747dd854b61cbe364b52c06869273fRobert Shih            key.append("URI");
1818ca002eedc747dd854b61cbe364b52c06869273fRobert Shih            return key;
1828ca002eedc747dd854b61cbe364b52c06869273fRobert Shih        }
1838ca002eedc747dd854b61cbe364b52c06869273fRobert Shih    };
1848ca002eedc747dd854b61cbe364b52c06869273fRobert Shih    StreamItem mStreams[kMaxStreams];
1858ca002eedc747dd854b61cbe364b52c06869273fRobert Shih
1860df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    sp<AMessage> mNotify;
1877314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber    uint32_t mFlags;
1881b86fe063badb5f28c467ade39be0f4008688947Andreas Huber    sp<IMediaHTTPService> mHTTPService;
1897314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber
1907c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    bool mBuffering;
1910df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    bool mInPreparationPhase;
1927c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    int32_t mPollBufferingGeneration;
1937c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    int32_t mPrevBufferPercentage;
1940df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
19514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    KeyedVector<String8, String8> mExtraHeaders;
196a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
197a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    AString mMasterURL;
198ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber
199a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    Vector<BandwidthItem> mBandwidthItems;
200309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    ssize_t mCurBandwidthIndex;
2017c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    ssize_t mOrigBandwidthIndex;
202a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang    int32_t mLastBandwidthBps;
2035ef659e010e90175eb5282d9642a02f6105189bfChong Zhang    bool mLastBandwidthStable;
204538b6d22a3578c0201d48f8548289aa254d81484Chong Zhang    sp<BandwidthEstimator> mBandwidthEstimator;
20514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
206a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    sp<M3UParser> mPlaylist;
207a0d0ba51ad60a68117a0ee78e37ab78715b8a069Chong Zhang    int32_t mMaxWidth;
208a0d0ba51ad60a68117a0ee78e37ab78715b8a069Chong Zhang    int32_t mMaxHeight;
2097e43a5a2dcfa9bc64ef477472a33c87a84695c09Andreas Huber
210964adb17885185808398507d2de88665fe193ee2Chong Zhang    sp<ALooper> mFetcherLooper;
21114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    KeyedVector<AString, FetcherInfo> mFetcherInfos;
21214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    uint32_t mStreamMask;
21314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
2141543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih    // Masks used during reconfiguration:
2151543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih    // mNewStreamMask: streams in the variant playlist we're switching to;
2161543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih    // we don't want to immediately overwrite the original value.
2171543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih    uint32_t mNewStreamMask;
2181543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih
2191543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih    // mSwapMask: streams that have started to playback content in the new variant playlist;
2201543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih    // we use this to track reconfiguration progress.
2211543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih    uint32_t mSwapMask;
2221543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih
22314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    KeyedVector<StreamType, sp<AnotherPacketSource> > mPacketSources;
2241543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih    // A second set of packet sources that buffer content for the variant we're switching to.
2251543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih    KeyedVector<StreamType, sp<AnotherPacketSource> > mPacketSources2;
2261543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih
2271543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih    int32_t mSwitchGeneration;
228b44ce2f84691559672cfaf6bb8fd3a9ac43904f2Robert Shih    int32_t mSubtitleGeneration;
22914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
23014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    size_t mContinuationCounter;
23114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    sp<AMessage> mContinuation;
2325ce50c1931e1e3d8f113394bbe2c9f99354f4c5fRobert Shih    sp<AMessage> mSeekReply;
23314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
23414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int64_t mLastDequeuedTimeUs;
235dcb89b3b505522efde173c105a851c412f947178Chong Zhang    int64_t mRealTimeBaseUs;
23614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
23714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    bool mReconfigurationInProgress;
2381543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih    bool mSwitchInProgress;
2397c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    int64_t mUpSwitchMark;
2407c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    int64_t mDownSwitchMark;
2417c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    int64_t mUpSwitchMargin;
2427c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang
2433f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    sp<AReplyToken> mDisconnectReplyID;
2443f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    sp<AReplyToken> mSeekReplyID;
24514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
246309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    bool mFirstTimeUsValid;
247309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    int64_t mFirstTimeUs;
248309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    int64_t mLastSeekTimeUs;
2490852843d304006e3ab333081fddda13b07193de8Robert Shih    bool mHasMetadata;
2500852843d304006e3ab333081fddda13b07193de8Robert Shih
251309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    KeyedVector<size_t, int64_t> mDiscontinuityAbsStartTimesUs;
252309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih    KeyedVector<size_t, int64_t> mDiscontinuityOffsetTimesUs;
253309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih
25414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    sp<PlaylistFetcher> addFetcher(const char *uri);
2557e43a5a2dcfa9bc64ef477472a33c87a84695c09Andreas Huber
256a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    void onConnect(const sp<AMessage> &msg);
2575abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang    void onMasterPlaylistFetched(const sp<AMessage> &msg);
258a1151185c7eb3b4c483f7067deba1775fd0a2510Lajos Molnar    void onSeek(const sp<AMessage> &msg);
25914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
2600852843d304006e3ab333081fddda13b07193de8Robert Shih    bool UriIsSameAsIndex( const AString &uri, int32_t index, bool newUri);
2610852843d304006e3ab333081fddda13b07193de8Robert Shih    sp<AnotherPacketSource> getPacketSourceForStreamIndex(size_t trackIndex, bool newUri);
2620852843d304006e3ab333081fddda13b07193de8Robert Shih    sp<AnotherPacketSource> getMetadataSource(
2630852843d304006e3ab333081fddda13b07193de8Robert Shih            sp<AnotherPacketSource> sources[kNumSources], uint32_t streamMask, bool newUri);
2640852843d304006e3ab333081fddda13b07193de8Robert Shih
2657c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    bool resumeFetcher(
2667c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            const AString &uri, uint32_t streamMask,
2677c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            int64_t timeUs = -1ll, bool newUri = false);
2687c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang
269a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang    float getAbortThreshold(
270a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang            ssize_t currentBWIndex, ssize_t targetBWIndex) const;
271538b6d22a3578c0201d48f8548289aa254d81484Chong Zhang    void addBandwidthMeasurement(size_t numBytes, int64_t delayUs);
272538b6d22a3578c0201d48f8548289aa254d81484Chong Zhang    size_t getBandwidthIndex(int32_t bandwidthBps);
2735ef659e010e90175eb5282d9642a02f6105189bfChong Zhang    ssize_t getLowestValidBandwidthIndex() const;
274d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang    HLSTime latestMediaSegmentStartTime() const;
275a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
2765ef659e010e90175eb5282d9642a02f6105189bfChong Zhang    static bool isBandwidthValid(const BandwidthItem &item);
27714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    static int SortByBandwidth(const BandwidthItem *, const BandwidthItem *);
2788ca002eedc747dd854b61cbe364b52c06869273fRobert Shih    static StreamType indexToType(int idx);
279f69c996864844e8f669308af8412cede043062a2Robert Shih    static ssize_t typeToIndex(int32_t type);
280a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
281dcb89b3b505522efde173c105a851c412f947178Chong Zhang    void changeConfiguration(
2827c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            int64_t timeUs, ssize_t bwIndex = -1, bool pickTrack = false);
283dcb89b3b505522efde173c105a851c412f947178Chong Zhang    void onChangeConfiguration(const sp<AMessage> &msg);
28414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void onChangeConfiguration2(const sp<AMessage> &msg);
28514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void onChangeConfiguration3(const sp<AMessage> &msg);
2867c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang
287a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang    void swapPacketSource(StreamType stream);
2887c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    void tryToFinishBandwidthSwitch(const AString &oldUri);
2897c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    void cancelBandwidthSwitch(bool resume = false);
2907c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    bool checkSwitchProgress(
2917c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang            sp<AMessage> &msg, int64_t delayUs, bool *needResumeUntil);
292a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
2938464d7decb34a3044e92b4085f1bbaafb51410e8Chong Zhang    bool switchBandwidthIfNeeded(bool bufferHigh, bool bufferLow);
2945ef659e010e90175eb5282d9642a02f6105189bfChong Zhang    bool tryBandwidthFallback();
2951543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih
296964adb17885185808398507d2de88665fe193ee2Chong Zhang    void schedulePollBuffering();
297964adb17885185808398507d2de88665fe193ee2Chong Zhang    void cancelPollBuffering();
2987c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    void restartPollBuffering();
299964adb17885185808398507d2de88665fe193ee2Chong Zhang    void onPollBuffering();
3007c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    bool checkBuffering(bool &underflow, bool &ready, bool &down, bool &up);
3017c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    void startBufferingIfNecessary();
3027c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    void stopBufferingIfNecessary();
3037c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    void notifyBufferingUpdate(int32_t percentage);
304a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
30514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void finishDisconnect();
306b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
30714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void postPrepared(status_t err);
3087c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang    void postError(status_t err);
3090df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
310a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(LiveSession);
311a44153c1a57202fb538659eb50706e60454d6273Andreas Huber};
312a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
313a44153c1a57202fb538659eb50706e60454d6273Andreas Huber}  // namespace android
314a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
315a44153c1a57202fb538659eb50706e60454d6273Andreas Huber#endif  // LIVE_SESSION_H_
316