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> ¬ify, 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