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>
22a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
23ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber#include <utils/String8.h>
24ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber
25a44153c1a57202fb538659eb50706e60454d6273Andreas Hubernamespace android {
26a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
27a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstruct ABuffer;
2814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct AnotherPacketSource;
29a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstruct DataSource;
3014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct HTTPBase;
31a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstruct LiveDataSource;
32a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstruct M3UParser;
3314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct PlaylistFetcher;
34dcb89b3b505522efde173c105a851c412f947178Chong Zhangstruct Parcel;
35a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
36a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstruct LiveSession : public AHandler {
377314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber    enum Flags {
387314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber        // Don't log any URLs.
397314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber        kFlagIncognito = 1,
407314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber    };
410df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    LiveSession(
420df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            const sp<AMessage> &notify,
430df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber            uint32_t flags = 0, bool uidValid = false, uid_t uid = 0);
44a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
456c8495c8f1ccc35db972ee7ac0dbb8baf5843548Robert Shih    enum StreamIndex {
466c8495c8f1ccc35db972ee7ac0dbb8baf5843548Robert Shih        kAudioIndex    = 0,
476c8495c8f1ccc35db972ee7ac0dbb8baf5843548Robert Shih        kVideoIndex    = 1,
486c8495c8f1ccc35db972ee7ac0dbb8baf5843548Robert Shih        kSubtitleIndex = 2,
496c8495c8f1ccc35db972ee7ac0dbb8baf5843548Robert Shih        kMaxStreams    = 3,
506c8495c8f1ccc35db972ee7ac0dbb8baf5843548Robert Shih    };
516c8495c8f1ccc35db972ee7ac0dbb8baf5843548Robert Shih
5214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    enum StreamType {
536c8495c8f1ccc35db972ee7ac0dbb8baf5843548Robert Shih        STREAMTYPE_AUDIO        = 1 << kAudioIndex,
546c8495c8f1ccc35db972ee7ac0dbb8baf5843548Robert Shih        STREAMTYPE_VIDEO        = 1 << kVideoIndex,
556c8495c8f1ccc35db972ee7ac0dbb8baf5843548Robert Shih        STREAMTYPE_SUBTITLES    = 1 << kSubtitleIndex,
5614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    };
5714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    status_t dequeueAccessUnit(StreamType stream, sp<ABuffer> *accessUnit);
5814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
5914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    status_t getStreamFormat(StreamType stream, sp<AMessage> *format);
60a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
6114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void connectAsync(
62ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber            const char *url,
63ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber            const KeyedVector<String8, String8> *headers = NULL);
64ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber
6514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    status_t disconnect();
66a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
67a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    // Blocks until seek is complete.
6814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    status_t seekTo(int64_t timeUs);
69a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
70b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    status_t getDuration(int64_t *durationUs) const;
71dcb89b3b505522efde173c105a851c412f947178Chong Zhang    status_t getTrackInfo(Parcel *reply) const;
72dcb89b3b505522efde173c105a851c412f947178Chong Zhang    status_t selectTrack(size_t index, bool select);
73b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
74b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    bool isSeekable() const;
75b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber    bool hasDynamicDuration() const;
76a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
770df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    enum {
7814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatStreamsChanged,
7914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatError,
800df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        kWhatPrepared,
810df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber        kWhatPreparationFailed,
820df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    };
830df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
84777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    // create a format-change discontinuity
85777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    //
86777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    // swap:
87777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    //   whether is format-change discontinuity should trigger a buffer swap
88777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    sp<ABuffer> createFormatChangeBuffer(bool swap = true);
89a44153c1a57202fb538659eb50706e60454d6273Andreas Huberprotected:
90a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    virtual ~LiveSession();
91a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
92a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    virtual void onMessageReceived(const sp<AMessage> &msg);
93a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
94a44153c1a57202fb538659eb50706e60454d6273Andreas Huberprivate:
9514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    friend struct PlaylistFetcher;
96a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
97a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    enum {
9814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatConnect                    = 'conn',
9914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatDisconnect                 = 'disc',
10014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatSeek                       = 'seek',
10114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatFetcherNotify              = 'notf',
10214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatCheckBandwidth             = 'bndw',
103dcb89b3b505522efde173c105a851c412f947178Chong Zhang        kWhatChangeConfiguration        = 'chC0',
10414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatChangeConfiguration2       = 'chC2',
10514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatChangeConfiguration3       = 'chC3',
10614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatFinishDisconnect2          = 'fin2',
107777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih        kWhatSwapped                    = 'swap',
108a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    };
109a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
110a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    struct BandwidthItem {
11114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        size_t mPlaylistIndex;
112a44153c1a57202fb538659eb50706e60454d6273Andreas Huber        unsigned long mBandwidth;
113a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    };
114a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
11514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    struct FetcherInfo {
11614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        sp<PlaylistFetcher> mFetcher;
11714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        int64_t mDurationUs;
11814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        bool mIsPrepared;
119777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih        bool mToBeRemoved;
12014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    };
12114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
1226c8495c8f1ccc35db972ee7ac0dbb8baf5843548Robert Shih    struct StreamItem {
1236c8495c8f1ccc35db972ee7ac0dbb8baf5843548Robert Shih        const char *mType;
1246c8495c8f1ccc35db972ee7ac0dbb8baf5843548Robert Shih        AString mUri;
1256c8495c8f1ccc35db972ee7ac0dbb8baf5843548Robert Shih        StreamItem() : mType("") {}
1266c8495c8f1ccc35db972ee7ac0dbb8baf5843548Robert Shih        StreamItem(const char *type) : mType(type) {}
1276c8495c8f1ccc35db972ee7ac0dbb8baf5843548Robert Shih        AString uriKey() {
1286c8495c8f1ccc35db972ee7ac0dbb8baf5843548Robert Shih            AString key(mType);
1296c8495c8f1ccc35db972ee7ac0dbb8baf5843548Robert Shih            key.append("URI");
1306c8495c8f1ccc35db972ee7ac0dbb8baf5843548Robert Shih            return key;
1316c8495c8f1ccc35db972ee7ac0dbb8baf5843548Robert Shih        }
1326c8495c8f1ccc35db972ee7ac0dbb8baf5843548Robert Shih    };
1336c8495c8f1ccc35db972ee7ac0dbb8baf5843548Robert Shih    StreamItem mStreams[kMaxStreams];
1346c8495c8f1ccc35db972ee7ac0dbb8baf5843548Robert Shih
1350df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    sp<AMessage> mNotify;
1367314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber    uint32_t mFlags;
1379b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    bool mUIDValid;
1389b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    uid_t mUID;
1397314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber
1400df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber    bool mInPreparationPhase;
1410df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
1421156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber    sp<HTTPBase> mHTTPDataSource;
14314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    KeyedVector<String8, String8> mExtraHeaders;
144a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
145a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    AString mMasterURL;
146ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber
147a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    Vector<BandwidthItem> mBandwidthItems;
148a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    ssize_t mPrevBandwidthIndex;
14914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
150a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    sp<M3UParser> mPlaylist;
1517e43a5a2dcfa9bc64ef477472a33c87a84695c09Andreas Huber
15214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    KeyedVector<AString, FetcherInfo> mFetcherInfos;
15314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    uint32_t mStreamMask;
15414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
155777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    // Masks used during reconfiguration:
156777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    // mNewStreamMask: streams in the variant playlist we're switching to;
157777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    // we don't want to immediately overwrite the original value.
158777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    uint32_t mNewStreamMask;
159777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih
160777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    // mSwapMask: streams that have started to playback content in the new variant playlist;
161777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    // we use this to track reconfiguration progress.
162777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    uint32_t mSwapMask;
163777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih
16414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    KeyedVector<StreamType, sp<AnotherPacketSource> > mPacketSources;
165777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    // A second set of packet sources that buffer content for the variant we're switching to.
166777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    KeyedVector<StreamType, sp<AnotherPacketSource> > mPacketSources2;
167777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih
168777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    // A mutex used to serialize two sets of events:
169777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    // * the swapping of packet sources in dequeueAccessUnit on the player thread, AND
170777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    // * a forced bandwidth switch termination in cancelSwitch on the live looper.
171777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    Mutex mSwapMutex;
17214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
17314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int32_t mCheckBandwidthGeneration;
174777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    int32_t mSwitchGeneration;
17514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
17614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    size_t mContinuationCounter;
17714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    sp<AMessage> mContinuation;
178ceeabe15f4e7bc73efdfcafed917202de9d515cbRobert Shih    sp<AMessage> mSeekReply;
17914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
18014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int64_t mLastDequeuedTimeUs;
181dcb89b3b505522efde173c105a851c412f947178Chong Zhang    int64_t mRealTimeBaseUs;
18214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
18314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    bool mReconfigurationInProgress;
184777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    bool mSwitchInProgress;
18514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    uint32_t mDisconnectReplyID;
186ceeabe15f4e7bc73efdfcafed917202de9d515cbRobert Shih    uint32_t mSeekReplyID;
18714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
18814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    sp<PlaylistFetcher> addFetcher(const char *uri);
1897e43a5a2dcfa9bc64ef477472a33c87a84695c09Andreas Huber
190a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    void onConnect(const sp<AMessage> &msg);
19114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    status_t onSeek(const sp<AMessage> &msg);
19214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void onFinishDisconnect2();
193a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
194822a489e595336be447f47f5c2a051e8fdd1cdffRobert Shih    // If given a non-zero block_size (default 0), it is used to cap the number of
195822a489e595336be447f47f5c2a051e8fdd1cdffRobert Shih    // bytes read in from the DataSource. If given a non-NULL buffer, new content
196822a489e595336be447f47f5c2a051e8fdd1cdffRobert Shih    // is read into the end.
197822a489e595336be447f47f5c2a051e8fdd1cdffRobert Shih    //
198822a489e595336be447f47f5c2a051e8fdd1cdffRobert Shih    // The DataSource we read from is responsible for signaling error or EOF to help us
199822a489e595336be447f47f5c2a051e8fdd1cdffRobert Shih    // break out of the read loop. The DataSource can be returned to the caller, so
200822a489e595336be447f47f5c2a051e8fdd1cdffRobert Shih    // that the caller can reuse it for subsequent fetches (within the initially
201822a489e595336be447f47f5c2a051e8fdd1cdffRobert Shih    // requested range).
202822a489e595336be447f47f5c2a051e8fdd1cdffRobert Shih    //
203822a489e595336be447f47f5c2a051e8fdd1cdffRobert Shih    // For reused HTTP sources, the caller must download a file sequentially without
204822a489e595336be447f47f5c2a051e8fdd1cdffRobert Shih    // any overlaps or gaps to prevent reconnection.
20543ca783effd99bba0e6e2dd6fe177a8888578ef8Robert Shih    ssize_t fetchFile(
2062aa4cc04154d82f6658fb86f394f13bb488b0468Andreas Huber            const char *url, sp<ABuffer> *out,
207822a489e595336be447f47f5c2a051e8fdd1cdffRobert Shih            /* request/open a file starting at range_offset for range_length bytes */
208822a489e595336be447f47f5c2a051e8fdd1cdffRobert Shih            int64_t range_offset = 0, int64_t range_length = -1,
209822a489e595336be447f47f5c2a051e8fdd1cdffRobert Shih            /* download block size */
210822a489e595336be447f47f5c2a051e8fdd1cdffRobert Shih            uint32_t block_size = 0,
211822a489e595336be447f47f5c2a051e8fdd1cdffRobert Shih            /* reuse DataSource if doing partial fetch */
212a1076eb135b74a32e9bdc1aed17aee4374eb41afMartin Storsjo            sp<DataSource> *source = NULL,
213a1076eb135b74a32e9bdc1aed17aee4374eb41afMartin Storsjo            String8 *actualUrl = NULL);
2142aa4cc04154d82f6658fb86f394f13bb488b0468Andreas Huber
21514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    sp<M3UParser> fetchPlaylist(
21614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            const char *url, uint8_t *curPlaylistHash, bool *unchanged);
21714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
218a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    size_t getBandwidthIndex();
219a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
22014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    static int SortByBandwidth(const BandwidthItem *, const BandwidthItem *);
2216c8495c8f1ccc35db972ee7ac0dbb8baf5843548Robert Shih    static StreamType indexToType(int idx);
222a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
223dcb89b3b505522efde173c105a851c412f947178Chong Zhang    void changeConfiguration(
224dcb89b3b505522efde173c105a851c412f947178Chong Zhang            int64_t timeUs, size_t bandwidthIndex, bool pickTrack = false);
225dcb89b3b505522efde173c105a851c412f947178Chong Zhang    void onChangeConfiguration(const sp<AMessage> &msg);
22614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void onChangeConfiguration2(const sp<AMessage> &msg);
22714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void onChangeConfiguration3(const sp<AMessage> &msg);
228777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    void onSwapped(const sp<AMessage> &msg);
229777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    void tryToFinishBandwidthSwitch();
230a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
23114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void scheduleCheckBandwidthEvent();
23214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void cancelCheckBandwidthEvent();
2337e43a5a2dcfa9bc64ef477472a33c87a84695c09Andreas Huber
234777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    // cancelBandwidthSwitch is atomic wrt swapPacketSource; call it to prevent packet sources
235777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    // from being swapped out on stale discontinuities while manipulating
236777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    // mPacketSources/mPacketSources2.
237777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    void cancelBandwidthSwitch();
238777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih
239777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    bool canSwitchBandwidthTo(size_t bandwidthIndex);
24014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void onCheckBandwidth();
241a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
24214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void finishDisconnect();
243b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
24414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void postPrepared(status_t err);
2450df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber
246777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    void swapPacketSource(StreamType stream);
247777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih    bool canSwitchUp();
248777ee5ed736c8f6c3f7d196ea022f7432bfd23e1Robert Shih
249a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(LiveSession);
250a44153c1a57202fb538659eb50706e60454d6273Andreas Huber};
251a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
252a44153c1a57202fb538659eb50706e60454d6273Andreas Huber}  // namespace android
253a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
254a44153c1a57202fb538659eb50706e60454d6273Andreas Huber#endif  // LIVE_SESSION_H_
255