LiveSession.h revision 5bc087c573c70c84c6a39946457590b42d392a33
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 23a44153c1a57202fb538659eb50706e60454d6273Andreas Hubernamespace android { 24a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 25a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstruct ABuffer; 26a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstruct DataSource; 27a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstruct LiveDataSource; 28a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstruct M3UParser; 29a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstruct NuHTTPDataSource; 30a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 31a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstruct LiveSession : public AHandler { 32a44153c1a57202fb538659eb50706e60454d6273Andreas Huber LiveSession(); 33a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 34a44153c1a57202fb538659eb50706e60454d6273Andreas Huber sp<DataSource> getDataSource(); 35a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 36a44153c1a57202fb538659eb50706e60454d6273Andreas Huber void connect(const char *url); 37a44153c1a57202fb538659eb50706e60454d6273Andreas Huber void disconnect(); 38a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 39a44153c1a57202fb538659eb50706e60454d6273Andreas Huber // Blocks until seek is complete. 40a44153c1a57202fb538659eb50706e60454d6273Andreas Huber void seekTo(int64_t timeUs); 41a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 42a44153c1a57202fb538659eb50706e60454d6273Andreas Huber status_t getDuration(int64_t *durationUs); 43a44153c1a57202fb538659eb50706e60454d6273Andreas Huber bool isSeekable(); 44a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 45a44153c1a57202fb538659eb50706e60454d6273Andreas Huberprotected: 46a44153c1a57202fb538659eb50706e60454d6273Andreas Huber virtual ~LiveSession(); 47a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 48a44153c1a57202fb538659eb50706e60454d6273Andreas Huber virtual void onMessageReceived(const sp<AMessage> &msg); 49a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 50a44153c1a57202fb538659eb50706e60454d6273Andreas Huberprivate: 51a44153c1a57202fb538659eb50706e60454d6273Andreas Huber enum { 52a44153c1a57202fb538659eb50706e60454d6273Andreas Huber kMaxNumQueuedFragments = 2, 535bc087c573c70c84c6a39946457590b42d392a33Andreas Huber kMaxNumRetries = 5, 54a44153c1a57202fb538659eb50706e60454d6273Andreas Huber }; 55a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 56a44153c1a57202fb538659eb50706e60454d6273Andreas Huber static const int64_t kMaxPlaylistAgeUs; 57a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 58a44153c1a57202fb538659eb50706e60454d6273Andreas Huber enum { 59a44153c1a57202fb538659eb50706e60454d6273Andreas Huber kWhatConnect = 'conn', 60a44153c1a57202fb538659eb50706e60454d6273Andreas Huber kWhatDisconnect = 'disc', 61a44153c1a57202fb538659eb50706e60454d6273Andreas Huber kWhatMonitorQueue = 'moni', 62a44153c1a57202fb538659eb50706e60454d6273Andreas Huber kWhatSeek = 'seek', 63a44153c1a57202fb538659eb50706e60454d6273Andreas Huber }; 64a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 65a44153c1a57202fb538659eb50706e60454d6273Andreas Huber struct BandwidthItem { 66a44153c1a57202fb538659eb50706e60454d6273Andreas Huber AString mURI; 67a44153c1a57202fb538659eb50706e60454d6273Andreas Huber unsigned long mBandwidth; 68a44153c1a57202fb538659eb50706e60454d6273Andreas Huber }; 69a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 70a44153c1a57202fb538659eb50706e60454d6273Andreas Huber sp<LiveDataSource> mDataSource; 71a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 72a44153c1a57202fb538659eb50706e60454d6273Andreas Huber sp<NuHTTPDataSource> mHTTPDataSource; 73a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 74a44153c1a57202fb538659eb50706e60454d6273Andreas Huber AString mMasterURL; 75a44153c1a57202fb538659eb50706e60454d6273Andreas Huber Vector<BandwidthItem> mBandwidthItems; 76a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 77a44153c1a57202fb538659eb50706e60454d6273Andreas Huber KeyedVector<AString, sp<ABuffer> > mAESKeyForURI; 78a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 79a44153c1a57202fb538659eb50706e60454d6273Andreas Huber ssize_t mPrevBandwidthIndex; 80a44153c1a57202fb538659eb50706e60454d6273Andreas Huber int64_t mLastPlaylistFetchTimeUs; 81a44153c1a57202fb538659eb50706e60454d6273Andreas Huber sp<M3UParser> mPlaylist; 82a44153c1a57202fb538659eb50706e60454d6273Andreas Huber int32_t mSeqNumber; 83a44153c1a57202fb538659eb50706e60454d6273Andreas Huber int64_t mSeekTimeUs; 84a44153c1a57202fb538659eb50706e60454d6273Andreas Huber int32_t mNumRetries; 85a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 86a44153c1a57202fb538659eb50706e60454d6273Andreas Huber Mutex mLock; 87a44153c1a57202fb538659eb50706e60454d6273Andreas Huber Condition mCondition; 88a44153c1a57202fb538659eb50706e60454d6273Andreas Huber int64_t mDurationUs; 89a44153c1a57202fb538659eb50706e60454d6273Andreas Huber bool mSeekDone; 90a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 91a44153c1a57202fb538659eb50706e60454d6273Andreas Huber int32_t mMonitorQueueGeneration; 92a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 93a44153c1a57202fb538659eb50706e60454d6273Andreas Huber void onConnect(const sp<AMessage> &msg); 94a44153c1a57202fb538659eb50706e60454d6273Andreas Huber void onDisconnect(); 95a44153c1a57202fb538659eb50706e60454d6273Andreas Huber void onDownloadNext(); 96a44153c1a57202fb538659eb50706e60454d6273Andreas Huber void onMonitorQueue(); 97a44153c1a57202fb538659eb50706e60454d6273Andreas Huber void onSeek(const sp<AMessage> &msg); 98a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 99a44153c1a57202fb538659eb50706e60454d6273Andreas Huber status_t fetchFile(const char *url, sp<ABuffer> *out); 100a44153c1a57202fb538659eb50706e60454d6273Andreas Huber sp<M3UParser> fetchPlaylist(const char *url); 101a44153c1a57202fb538659eb50706e60454d6273Andreas Huber size_t getBandwidthIndex(); 102a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 103a44153c1a57202fb538659eb50706e60454d6273Andreas Huber status_t decryptBuffer( 104a44153c1a57202fb538659eb50706e60454d6273Andreas Huber size_t playlistIndex, const sp<ABuffer> &buffer); 105a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 106a44153c1a57202fb538659eb50706e60454d6273Andreas Huber void postMonitorQueue(int64_t delayUs = 0); 107a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 108a44153c1a57202fb538659eb50706e60454d6273Andreas Huber static int SortByBandwidth(const BandwidthItem *, const BandwidthItem *); 109a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 110a44153c1a57202fb538659eb50706e60454d6273Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(LiveSession); 111a44153c1a57202fb538659eb50706e60454d6273Andreas Huber}; 112a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 113a44153c1a57202fb538659eb50706e60454d6273Andreas Huber} // namespace android 114a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 115a44153c1a57202fb538659eb50706e60454d6273Andreas Huber#endif // LIVE_SESSION_H_ 116