LiveSession.h revision 5ce50c1931e1e3d8f113394bbe2c9f99354f4c5f
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (C) 2010 The Android Open Source Project
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License");
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * you may not use this file except in compliance with the License.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * You may obtain a copy of the License at
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      http://www.apache.org/licenses/LICENSE-2.0
9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) *
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Unless required by applicable law or agreed to in writing, software
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * distributed under the License is distributed on an "AS IS" BASIS,
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See the License for the specific language governing permissions and
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * limitations under the License.
15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef LIVE_SESSION_H_
18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LIVE_SESSION_H_
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <media/stagefright/foundation/AHandler.h>
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utils/String8.h>
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace android {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ABuffer;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct AnotherPacketSource;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct DataSource;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct HTTPBase;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct IMediaHTTPService;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct LiveDataSource;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct M3UParser;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct PlaylistFetcher;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct Parcel;
36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)struct LiveSession : public AHandler {
38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    enum Flags {
39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        // Don't log any URLs.
40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        kFlagIncognito = 1,
41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    };
42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    LiveSession(
43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            const sp<AMessage> &notify,
44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            uint32_t flags,
45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            const sp<IMediaHTTPService> &httpService);
46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    enum StreamIndex {
48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        kAudioIndex    = 0,
49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        kVideoIndex    = 1,
50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        kSubtitleIndex = 2,
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        kMaxStreams    = 3,
52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    };
53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    enum StreamType {
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        STREAMTYPE_AUDIO        = 1 << kAudioIndex,
56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        STREAMTYPE_VIDEO        = 1 << kVideoIndex,
57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        STREAMTYPE_SUBTITLES    = 1 << kSubtitleIndex,
58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    };
59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    status_t dequeueAccessUnit(StreamType stream, sp<ABuffer> *accessUnit);
60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    status_t getStreamFormat(StreamType stream, sp<AMessage> *format);
62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    void connectAsync(
64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            const char *url,
65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            const KeyedVector<String8, String8> *headers = NULL);
66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t disconnect();
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // Blocks until seek is complete.
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    status_t seekTo(int64_t timeUs);
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t getDuration(int64_t *durationUs) const;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t getTrackInfo(Parcel *reply) const;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    status_t selectTrack(size_t index, bool select);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    bool isSeekable() const;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool hasDynamicDuration() const;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    enum {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kWhatStreamsChanged,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kWhatError,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kWhatPrepared,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kWhatPreparationFailed,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // create a format-change discontinuity
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // swap:
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   whether is format-change discontinuity should trigger a buffer swap
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sp<ABuffer> createFormatChangeBuffer(bool swap = true);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)protected:
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~LiveSession();
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    virtual void onMessageReceived(const sp<AMessage> &msg);
9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)private:
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    friend struct PlaylistFetcher;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    enum {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kWhatConnect                    = 'conn',
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kWhatDisconnect                 = 'disc',
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        kWhatSeek                       = 'seek',
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kWhatFetcherNotify              = 'notf',
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kWhatCheckBandwidth             = 'bndw',
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kWhatChangeConfiguration        = 'chC0',
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kWhatChangeConfiguration2       = 'chC2',
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kWhatChangeConfiguration3       = 'chC3',
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kWhatFinishDisconnect2          = 'fin2',
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        kWhatSwapped                    = 'swap',
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    struct BandwidthItem {
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        size_t mPlaylistIndex;
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        unsigned long mBandwidth;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    struct FetcherInfo {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sp<PlaylistFetcher> mFetcher;
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        int64_t mDurationUs;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bool mIsPrepared;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        bool mToBeRemoved;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    struct StreamItem {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const char *mType;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AString mUri;
127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        StreamItem() : mType("") {}
128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        StreamItem(const char *type) : mType(type) {}
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AString uriKey() {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            AString key(mType);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            key.append("URI");
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return key;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    StreamItem mStreams[kMaxStreams];
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sp<AMessage> mNotify;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32_t mFlags;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sp<IMediaHTTPService> mHTTPService;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool mInPreparationPhase;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    sp<HTTPBase> mHTTPDataSource;
14446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    KeyedVector<String8, String8> mExtraHeaders;
14546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
14646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    AString mMasterURL;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Vector<BandwidthItem> mBandwidthItems;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ssize_t mPrevBandwidthIndex;
150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    sp<M3UParser> mPlaylist;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    KeyedVector<AString, FetcherInfo> mFetcherInfos;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32_t mStreamMask;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Masks used during reconfiguration:
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // mNewStreamMask: streams in the variant playlist we're switching to;
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // we don't want to immediately overwrite the original value.
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    uint32_t mNewStreamMask;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // mSwapMask: streams that have started to playback content in the new variant playlist;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // we use this to track reconfiguration progress.
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32_t mSwapMask;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    KeyedVector<StreamType, sp<AnotherPacketSource> > mPacketSources;
16646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // A second set of packet sources that buffer content for the variant we're switching to.
16746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    KeyedVector<StreamType, sp<AnotherPacketSource> > mPacketSources2;
16846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // A mutex used to serialize two sets of events:
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // * the swapping of packet sources in dequeueAccessUnit on the player thread, AND
171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // * a forced bandwidth switch termination in cancelSwitch on the live looper.
172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    Mutex mSwapMutex;
173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    int32_t mCheckBandwidthGeneration;
1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    int32_t mSwitchGeneration;
176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    size_t mContinuationCounter;
178a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    sp<AMessage> mContinuation;
179a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    sp<AMessage> mSeekReply;
180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
181a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    int64_t mLastDequeuedTimeUs;
182a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    int64_t mRealTimeBaseUs;
183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    bool mReconfigurationInProgress;
185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    bool mSwitchInProgress;
186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    uint32_t mDisconnectReplyID;
187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    uint32_t mSeekReplyID;
188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    sp<PlaylistFetcher> addFetcher(const char *uri);
190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    void onConnect(const sp<AMessage> &msg);
192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    status_t onSeek(const sp<AMessage> &msg);
193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    void onFinishDisconnect2();
194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // If given a non-zero block_size (default 0), it is used to cap the number of
196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // bytes read in from the DataSource. If given a non-NULL buffer, new content
197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // is read into the end.
198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    //
199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // The DataSource we read from is responsible for signaling error or EOF to help us
200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // break out of the read loop. The DataSource can be returned to the caller, so
201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // that the caller can reuse it for subsequent fetches (within the initially
202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // requested range).
20323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    //
20423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)    // For reused HTTP sources, the caller must download a file sequentially without
205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // any overlaps or gaps to prevent reconnection.
206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    status_t fetchFile(
207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            const char *url, sp<ABuffer> *out,
208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            /* request/open a file starting at range_offset for range_length bytes */
209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            int64_t range_offset = 0, int64_t range_length = -1,
210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            /* download block size */
211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            uint32_t block_size = 0,
212a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            /* reuse DataSource if doing partial fetch */
213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            sp<DataSource> *source = NULL,
214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            String8 *actualUrl = NULL);
215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    sp<M3UParser> fetchPlaylist(
217a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            const char *url, uint8_t *curPlaylistHash, bool *unchanged);
218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    size_t getBandwidthIndex();
220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    static int SortByBandwidth(const BandwidthItem *, const BandwidthItem *);
222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    static StreamType indexToType(int idx);
223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    void changeConfiguration(
22523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)            int64_t timeUs, size_t bandwidthIndex, bool pickTrack = false);
226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    void onChangeConfiguration(const sp<AMessage> &msg);
227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    void onChangeConfiguration2(const sp<AMessage> &msg);
228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    void onChangeConfiguration3(const sp<AMessage> &msg);
229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    void onSwapped(const sp<AMessage> &msg);
230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    void tryToFinishBandwidthSwitch();
231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    void scheduleCheckBandwidthEvent();
233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    void cancelCheckBandwidthEvent();
23423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // cancelBandwidthSwitch is atomic wrt swapPacketSource; call it to prevent packet sources
236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // from being swapped out on stale discontinuities while manipulating
237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // mPacketSources/mPacketSources2.
238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    void cancelBandwidthSwitch();
239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    bool canSwitchBandwidthTo(size_t bandwidthIndex);
241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    void onCheckBandwidth();
242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    void finishDisconnect();
244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    void postPrepared(status_t err);
246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    void swapPacketSource(StreamType stream);
248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    bool canSwitchUp();
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
250    DISALLOW_EVIL_CONSTRUCTORS(LiveSession);
251};
252
253}  // namespace android
254
255#endif  // LIVE_SESSION_H_
256