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