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 2148fa06d1e80a872c7495804979256e021e566ae0Wei Jia#include <media/BufferingSettings.h> 22a44153c1a57202fb538659eb50706e60454d6273Andreas Huber#include <media/stagefright/foundation/AHandler.h> 2389bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shih#include <media/mediaplayer.h> 24a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 25ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber#include <utils/String8.h> 26ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber 270852843d304006e3ab333081fddda13b07193de8Robert Shih#include "mpeg2ts/ATSParser.h" 280852843d304006e3ab333081fddda13b07193de8Robert Shih 29a44153c1a57202fb538659eb50706e60454d6273Andreas Hubernamespace android { 30a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 31a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstruct ABuffer; 323f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnarstruct AReplyToken; 3314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct AnotherPacketSource; 34ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnarclass DataSource; 3514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct HTTPBase; 361b86fe063badb5f28c467ade39be0f4008688947Andreas Huberstruct IMediaHTTPService; 37a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstruct LiveDataSource; 38a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstruct M3UParser; 3914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct PlaylistFetcher; 40d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhangstruct HLSTime; 415abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhangstruct HTTPDownloader; 42a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 43a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstruct LiveSession : public AHandler { 447314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber enum Flags { 457314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber // Don't log any URLs. 467314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber kFlagIncognito = 1, 477314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber }; 48a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 498ca002eedc747dd854b61cbe364b52c06869273fRobert Shih enum StreamIndex { 508ca002eedc747dd854b61cbe364b52c06869273fRobert Shih kAudioIndex = 0, 518ca002eedc747dd854b61cbe364b52c06869273fRobert Shih kVideoIndex = 1, 528ca002eedc747dd854b61cbe364b52c06869273fRobert Shih kSubtitleIndex = 2, 538ca002eedc747dd854b61cbe364b52c06869273fRobert Shih kMaxStreams = 3, 540852843d304006e3ab333081fddda13b07193de8Robert Shih kMetaDataIndex = 3, 550852843d304006e3ab333081fddda13b07193de8Robert Shih kNumSources = 4, 568ca002eedc747dd854b61cbe364b52c06869273fRobert Shih }; 578ca002eedc747dd854b61cbe364b52c06869273fRobert Shih 5814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber enum StreamType { 598ca002eedc747dd854b61cbe364b52c06869273fRobert Shih STREAMTYPE_AUDIO = 1 << kAudioIndex, 608ca002eedc747dd854b61cbe364b52c06869273fRobert Shih STREAMTYPE_VIDEO = 1 << kVideoIndex, 618ca002eedc747dd854b61cbe364b52c06869273fRobert Shih STREAMTYPE_SUBTITLES = 1 << kSubtitleIndex, 620852843d304006e3ab333081fddda13b07193de8Robert Shih STREAMTYPE_METADATA = 1 << kMetaDataIndex, 6314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber }; 64964adb17885185808398507d2de88665fe193ee2Chong Zhang 65a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang enum SeekMode { 66a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang kSeekModeExactPosition = 0, // used for seeking 67a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang kSeekModeNextSample = 1, // used for seamless switching 68a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang kSeekModeNextSegment = 2, // used for seamless switching 69a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang }; 70a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang 71964adb17885185808398507d2de88665fe193ee2Chong Zhang LiveSession( 72964adb17885185808398507d2de88665fe193ee2Chong Zhang const sp<AMessage> ¬ify, 73964adb17885185808398507d2de88665fe193ee2Chong Zhang uint32_t flags, 74964adb17885185808398507d2de88665fe193ee2Chong Zhang const sp<IMediaHTTPService> &httpService); 75964adb17885185808398507d2de88665fe193ee2Chong Zhang 7648fa06d1e80a872c7495804979256e021e566ae0Wei Jia void setBufferingSettings(const BufferingSettings &buffering); 7748fa06d1e80a872c7495804979256e021e566ae0Wei Jia 780852843d304006e3ab333081fddda13b07193de8Robert Shih int64_t calculateMediaTimeUs(int64_t firstTimeUs, int64_t timeUs, int32_t discontinuitySeq); 7914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber status_t dequeueAccessUnit(StreamType stream, sp<ABuffer> *accessUnit); 8014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 81a83eebb78c3a7d57a769dac965b17a8aad7c7b8fRobert Shih status_t getStreamFormatMeta(StreamType stream, sp<MetaData> *meta); 82a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 835abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang sp<HTTPDownloader> getHTTPDownloader(); 84a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang 8514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void connectAsync( 86ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber const char *url, 87ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber const KeyedVector<String8, String8> *headers = NULL); 88ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber 8914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber status_t disconnect(); 90a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 91a44153c1a57202fb538659eb50706e60454d6273Andreas Huber // Blocks until seek is complete. 92c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia status_t seekTo(int64_t timeUs, MediaPlayerSeekMode mode); 93a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 94b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber status_t getDuration(int64_t *durationUs) const; 95404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhang size_t getTrackCount() const; 96404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhang sp<AMessage> getTrackInfo(size_t trackIndex) const; 97dcb89b3b505522efde173c105a851c412f947178Chong Zhang status_t selectTrack(size_t index, bool select); 9889bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shih ssize_t getSelectedTrack(media_track_type /* type */) const; 99b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 100b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber bool isSeekable() const; 101b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber bool hasDynamicDuration() const; 102a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 1037c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang static const char *getKeyForStream(StreamType type); 10425f82752942b1c78aec8ee303d61afff85cff9d1Chong Zhang static const char *getNameForStream(StreamType type); 1050852843d304006e3ab333081fddda13b07193de8Robert Shih static ATSParser::SourceType getSourceTypeForStream(StreamType type); 1067c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 1070df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber enum { 10814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatStreamsChanged, 10914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatError, 1100df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber kWhatPrepared, 1110df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber kWhatPreparationFailed, 1127c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang kWhatBufferingStart, 1137c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang kWhatBufferingEnd, 1147c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang kWhatBufferingUpdate, 1150852843d304006e3ab333081fddda13b07193de8Robert Shih kWhatMetadataDetected, 1160df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber }; 1170df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber 118a44153c1a57202fb538659eb50706e60454d6273Andreas Huberprotected: 119a44153c1a57202fb538659eb50706e60454d6273Andreas Huber virtual ~LiveSession(); 120a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 121a44153c1a57202fb538659eb50706e60454d6273Andreas Huber virtual void onMessageReceived(const sp<AMessage> &msg); 122a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 123a44153c1a57202fb538659eb50706e60454d6273Andreas Huberprivate: 12414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber friend struct PlaylistFetcher; 125a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 126a44153c1a57202fb538659eb50706e60454d6273Andreas Huber enum { 12714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatConnect = 'conn', 12814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatDisconnect = 'disc', 12914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatSeek = 'seek', 13014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatFetcherNotify = 'notf', 131dcb89b3b505522efde173c105a851c412f947178Chong Zhang kWhatChangeConfiguration = 'chC0', 13214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatChangeConfiguration2 = 'chC2', 13314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatChangeConfiguration3 = 'chC3', 134964adb17885185808398507d2de88665fe193ee2Chong Zhang kWhatPollBuffering = 'poll', 13548fa06d1e80a872c7495804979256e021e566ae0Wei Jia kWhatSetBufferingSettings = 'sBuS', 136a44153c1a57202fb538659eb50706e60454d6273Andreas Huber }; 137a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 1387c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang // Bandwidth Switch Mark Defaults 139765f27c2376e83766d9e1d8f8136025c5437ce49Chong Zhang static const int64_t kUpSwitchMarkUs; 140765f27c2376e83766d9e1d8f8136025c5437ce49Chong Zhang static const int64_t kDownSwitchMarkUs; 141765f27c2376e83766d9e1d8f8136025c5437ce49Chong Zhang static const int64_t kUpSwitchMarginUs; 142d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang static const int64_t kResumeThresholdUs; 1437c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 1447c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang // Buffer Prepare/Ready/Underflow Marks 14548fa06d1e80a872c7495804979256e021e566ae0Wei Jia BufferingSettings mBufferingSettings; 146a93fd2be99d21629bed504b9b7df035fc2f54562Leena Winterrowd 147538b6d22a3578c0201d48f8548289aa254d81484Chong Zhang struct BandwidthEstimator; 148a44153c1a57202fb538659eb50706e60454d6273Andreas Huber struct BandwidthItem { 14914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber size_t mPlaylistIndex; 150a44153c1a57202fb538659eb50706e60454d6273Andreas Huber unsigned long mBandwidth; 1515ef659e010e90175eb5282d9642a02f6105189bfChong Zhang int64_t mLastFailureUs; 152a44153c1a57202fb538659eb50706e60454d6273Andreas Huber }; 153a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 15414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber struct FetcherInfo { 15514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber sp<PlaylistFetcher> mFetcher; 15614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber int64_t mDurationUs; 1571543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih bool mToBeRemoved; 158a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang bool mToBeResumed; 15914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber }; 16014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 1618ca002eedc747dd854b61cbe364b52c06869273fRobert Shih struct StreamItem { 1628ca002eedc747dd854b61cbe364b52c06869273fRobert Shih const char *mType; 163f4a48dfa8570d6a4708a868b8b15d1236f7ca54bRobert Shih AString mUri, mNewUri; 164a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang SeekMode mSeekMode; 165309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih size_t mCurDiscontinuitySeq; 166309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih int64_t mLastDequeuedTimeUs; 167309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih int64_t mLastSampleDurationUs; 168309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih StreamItem() 169a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang : StreamItem("") {} 1700d1ed381fde5dac12dd84fcf3da66dac46699378Chih-Hung Hsieh explicit StreamItem(const char *type) 171309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih : mType(type), 17281636761bead03f13b4ed9320a7f25ce1354f1aeChong Zhang mSeekMode(kSeekModeExactPosition) { 17381636761bead03f13b4ed9320a7f25ce1354f1aeChong Zhang reset(); 17481636761bead03f13b4ed9320a7f25ce1354f1aeChong Zhang } 17581636761bead03f13b4ed9320a7f25ce1354f1aeChong Zhang void reset() { 17681636761bead03f13b4ed9320a7f25ce1354f1aeChong Zhang mCurDiscontinuitySeq = 0; 17781636761bead03f13b4ed9320a7f25ce1354f1aeChong Zhang mLastDequeuedTimeUs = -1ll; 17881636761bead03f13b4ed9320a7f25ce1354f1aeChong Zhang mLastSampleDurationUs = 0ll; 17981636761bead03f13b4ed9320a7f25ce1354f1aeChong Zhang } 1808ca002eedc747dd854b61cbe364b52c06869273fRobert Shih AString uriKey() { 1818ca002eedc747dd854b61cbe364b52c06869273fRobert Shih AString key(mType); 1828ca002eedc747dd854b61cbe364b52c06869273fRobert Shih key.append("URI"); 1838ca002eedc747dd854b61cbe364b52c06869273fRobert Shih return key; 1848ca002eedc747dd854b61cbe364b52c06869273fRobert Shih } 1858ca002eedc747dd854b61cbe364b52c06869273fRobert Shih }; 1868ca002eedc747dd854b61cbe364b52c06869273fRobert Shih StreamItem mStreams[kMaxStreams]; 1878ca002eedc747dd854b61cbe364b52c06869273fRobert Shih 1880df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber sp<AMessage> mNotify; 1897314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber uint32_t mFlags; 1901b86fe063badb5f28c467ade39be0f4008688947Andreas Huber sp<IMediaHTTPService> mHTTPService; 1917314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 1927c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang bool mBuffering; 1930df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber bool mInPreparationPhase; 1947c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int32_t mPollBufferingGeneration; 1957c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int32_t mPrevBufferPercentage; 1960df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber 19714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber KeyedVector<String8, String8> mExtraHeaders; 198a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 199a44153c1a57202fb538659eb50706e60454d6273Andreas Huber AString mMasterURL; 200ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber 201a44153c1a57202fb538659eb50706e60454d6273Andreas Huber Vector<BandwidthItem> mBandwidthItems; 202309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih ssize_t mCurBandwidthIndex; 2037c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang ssize_t mOrigBandwidthIndex; 204a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang int32_t mLastBandwidthBps; 2055ef659e010e90175eb5282d9642a02f6105189bfChong Zhang bool mLastBandwidthStable; 206538b6d22a3578c0201d48f8548289aa254d81484Chong Zhang sp<BandwidthEstimator> mBandwidthEstimator; 20714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 208a44153c1a57202fb538659eb50706e60454d6273Andreas Huber sp<M3UParser> mPlaylist; 209a0d0ba51ad60a68117a0ee78e37ab78715b8a069Chong Zhang int32_t mMaxWidth; 210a0d0ba51ad60a68117a0ee78e37ab78715b8a069Chong Zhang int32_t mMaxHeight; 2117e43a5a2dcfa9bc64ef477472a33c87a84695c09Andreas Huber 212964adb17885185808398507d2de88665fe193ee2Chong Zhang sp<ALooper> mFetcherLooper; 21314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber KeyedVector<AString, FetcherInfo> mFetcherInfos; 21414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber uint32_t mStreamMask; 21514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 2161543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih // Masks used during reconfiguration: 2171543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih // mNewStreamMask: streams in the variant playlist we're switching to; 2181543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih // we don't want to immediately overwrite the original value. 2191543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih uint32_t mNewStreamMask; 2201543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih 2211543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih // mSwapMask: streams that have started to playback content in the new variant playlist; 2221543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih // we use this to track reconfiguration progress. 2231543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih uint32_t mSwapMask; 2241543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih 22514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber KeyedVector<StreamType, sp<AnotherPacketSource> > mPacketSources; 2261543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih // A second set of packet sources that buffer content for the variant we're switching to. 2271543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih KeyedVector<StreamType, sp<AnotherPacketSource> > mPacketSources2; 2281543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih 2291543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih int32_t mSwitchGeneration; 230b44ce2f84691559672cfaf6bb8fd3a9ac43904f2Robert Shih int32_t mSubtitleGeneration; 23114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 23214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber size_t mContinuationCounter; 23314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber sp<AMessage> mContinuation; 2345ce50c1931e1e3d8f113394bbe2c9f99354f4c5fRobert Shih sp<AMessage> mSeekReply; 23514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 23614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber int64_t mLastDequeuedTimeUs; 237dcb89b3b505522efde173c105a851c412f947178Chong Zhang int64_t mRealTimeBaseUs; 23814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 23914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber bool mReconfigurationInProgress; 2401543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih bool mSwitchInProgress; 2417c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int64_t mUpSwitchMark; 2427c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int64_t mDownSwitchMark; 2437c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int64_t mUpSwitchMargin; 2447c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 2453f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar sp<AReplyToken> mDisconnectReplyID; 2463f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar sp<AReplyToken> mSeekReplyID; 24714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 248309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih bool mFirstTimeUsValid; 249309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih int64_t mFirstTimeUs; 250309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih int64_t mLastSeekTimeUs; 2510852843d304006e3ab333081fddda13b07193de8Robert Shih bool mHasMetadata; 2520852843d304006e3ab333081fddda13b07193de8Robert Shih 253309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih KeyedVector<size_t, int64_t> mDiscontinuityAbsStartTimesUs; 254309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih KeyedVector<size_t, int64_t> mDiscontinuityOffsetTimesUs; 255309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih 25614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber sp<PlaylistFetcher> addFetcher(const char *uri); 2577e43a5a2dcfa9bc64ef477472a33c87a84695c09Andreas Huber 258a44153c1a57202fb538659eb50706e60454d6273Andreas Huber void onConnect(const sp<AMessage> &msg); 2595abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang void onMasterPlaylistFetched(const sp<AMessage> &msg); 260a1151185c7eb3b4c483f7067deba1775fd0a2510Lajos Molnar void onSeek(const sp<AMessage> &msg); 26114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 2620852843d304006e3ab333081fddda13b07193de8Robert Shih bool UriIsSameAsIndex( const AString &uri, int32_t index, bool newUri); 2630852843d304006e3ab333081fddda13b07193de8Robert Shih sp<AnotherPacketSource> getPacketSourceForStreamIndex(size_t trackIndex, bool newUri); 2640852843d304006e3ab333081fddda13b07193de8Robert Shih sp<AnotherPacketSource> getMetadataSource( 2650852843d304006e3ab333081fddda13b07193de8Robert Shih sp<AnotherPacketSource> sources[kNumSources], uint32_t streamMask, bool newUri); 2660852843d304006e3ab333081fddda13b07193de8Robert Shih 2677c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang bool resumeFetcher( 2687c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang const AString &uri, uint32_t streamMask, 2697c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int64_t timeUs = -1ll, bool newUri = false); 2707c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 271a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang float getAbortThreshold( 272a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang ssize_t currentBWIndex, ssize_t targetBWIndex) const; 273538b6d22a3578c0201d48f8548289aa254d81484Chong Zhang void addBandwidthMeasurement(size_t numBytes, int64_t delayUs); 274538b6d22a3578c0201d48f8548289aa254d81484Chong Zhang size_t getBandwidthIndex(int32_t bandwidthBps); 2755ef659e010e90175eb5282d9642a02f6105189bfChong Zhang ssize_t getLowestValidBandwidthIndex() const; 276d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang HLSTime latestMediaSegmentStartTime() const; 277a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 2785ef659e010e90175eb5282d9642a02f6105189bfChong Zhang static bool isBandwidthValid(const BandwidthItem &item); 27914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber static int SortByBandwidth(const BandwidthItem *, const BandwidthItem *); 2808ca002eedc747dd854b61cbe364b52c06869273fRobert Shih static StreamType indexToType(int idx); 281f69c996864844e8f669308af8412cede043062a2Robert Shih static ssize_t typeToIndex(int32_t type); 282a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 283dcb89b3b505522efde173c105a851c412f947178Chong Zhang void changeConfiguration( 2847c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int64_t timeUs, ssize_t bwIndex = -1, bool pickTrack = false); 285dcb89b3b505522efde173c105a851c412f947178Chong Zhang void onChangeConfiguration(const sp<AMessage> &msg); 28614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void onChangeConfiguration2(const sp<AMessage> &msg); 28714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void onChangeConfiguration3(const sp<AMessage> &msg); 2887c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 289a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang void swapPacketSource(StreamType stream); 2907c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang void tryToFinishBandwidthSwitch(const AString &oldUri); 2917c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang void cancelBandwidthSwitch(bool resume = false); 2927c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang bool checkSwitchProgress( 2937c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang sp<AMessage> &msg, int64_t delayUs, bool *needResumeUntil); 294a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 2958464d7decb34a3044e92b4085f1bbaafb51410e8Chong Zhang bool switchBandwidthIfNeeded(bool bufferHigh, bool bufferLow); 2965ef659e010e90175eb5282d9642a02f6105189bfChong Zhang bool tryBandwidthFallback(); 2971543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih 298964adb17885185808398507d2de88665fe193ee2Chong Zhang void schedulePollBuffering(); 299964adb17885185808398507d2de88665fe193ee2Chong Zhang void cancelPollBuffering(); 3007c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang void restartPollBuffering(); 301964adb17885185808398507d2de88665fe193ee2Chong Zhang void onPollBuffering(); 3027c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang bool checkBuffering(bool &underflow, bool &ready, bool &down, bool &up); 3037c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang void startBufferingIfNecessary(); 3047c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang void stopBufferingIfNecessary(); 3057c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang void notifyBufferingUpdate(int32_t percentage); 306a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 30714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void finishDisconnect(); 308b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 30914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void postPrepared(status_t err); 3107c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang void postError(status_t err); 3110df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber 312a44153c1a57202fb538659eb50706e60454d6273Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(LiveSession); 313a44153c1a57202fb538659eb50706e60454d6273Andreas Huber}; 314a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 315a44153c1a57202fb538659eb50706e60454d6273Andreas Huber} // namespace android 316a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 317a44153c1a57202fb538659eb50706e60454d6273Andreas Huber#endif // LIVE_SESSION_H_ 318